├── src
├── vite-env.d.ts
├── lib
│ └── utils.ts
├── main.tsx
├── index.css
├── components
│ └── ui
│ │ ├── button.tsx
│ │ ├── card.tsx
│ │ └── dialog.tsx
└── App.tsx
├── bun.lockb
├── public
└── party.png
├── 3d-files
├── back.f3d
├── back.stl
├── cover.f3d
├── cover.stl
├── front.f3d
├── front.stl
├── back.step
├── cover.step
└── front.step
├── images
└── inklink.jpg
├── postcss.config.js
├── tsconfig.json
├── .gitignore
├── Dockerfile
├── index.html
├── shared
├── Actions.d.ts
├── PxBrush.ts
├── Utilities.ts
└── StampMaker.ts
├── components.json
├── nginx.Dockerfile
├── tsconfig.node.json
├── docker-compose.yml
├── eslint.config.js
├── vite.config.ts
├── tsconfig.app.json
├── LICENSE
├── package.json
├── tailwind.config.js
├── circuitpython
├── waveshare7in5bv3.py
├── bmpread.py
└── draw.py
├── nginx.conf
├── README.md
└── server
└── index.ts
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/bun.lockb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nicell/InkLink/HEAD/bun.lockb
--------------------------------------------------------------------------------
/public/party.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nicell/InkLink/HEAD/public/party.png
--------------------------------------------------------------------------------
/3d-files/back.f3d:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nicell/InkLink/HEAD/3d-files/back.f3d
--------------------------------------------------------------------------------
/3d-files/back.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nicell/InkLink/HEAD/3d-files/back.stl
--------------------------------------------------------------------------------
/3d-files/cover.f3d:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nicell/InkLink/HEAD/3d-files/cover.f3d
--------------------------------------------------------------------------------
/3d-files/cover.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nicell/InkLink/HEAD/3d-files/cover.stl
--------------------------------------------------------------------------------
/3d-files/front.f3d:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nicell/InkLink/HEAD/3d-files/front.f3d
--------------------------------------------------------------------------------
/3d-files/front.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nicell/InkLink/HEAD/3d-files/front.stl
--------------------------------------------------------------------------------
/images/inklink.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Nicell/InkLink/HEAD/images/inklink.jpg
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/src/lib/utils.ts:
--------------------------------------------------------------------------------
1 | import { clsx, type ClassValue } from "clsx"
2 | import { twMerge } from "tailwind-merge"
3 |
4 | export function cn(...inputs: ClassValue[]) {
5 | return twMerge(clsx(inputs))
6 | }
7 |
--------------------------------------------------------------------------------
/src/main.tsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react'
2 | import { createRoot } from 'react-dom/client'
3 | import './index.css'
4 | import App from './App.tsx'
5 |
6 | createRoot(document.getElementById('root')!).render(
7 |
8 |
9 | ,
10 | )
11 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | { "path": "./tsconfig.app.json" },
5 | { "path": "./tsconfig.node.json" }
6 | ],
7 | "compilerOptions": {
8 | "baseUrl": ".",
9 | "paths": {
10 | "@/*": ["./src/*"]
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 | drawings
27 | .env
28 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM oven/bun:1-slim AS builder
2 | WORKDIR /app
3 | COPY package.json bun.lockb ./
4 | RUN bun install --production
5 | COPY ./shared ./shared
6 | COPY ./server ./server
7 | RUN bun build --compile --minify --sourcemap --bytecode server/index.ts --outfile ./app
8 |
9 | FROM gcr.io/distroless/cc-debian12
10 | WORKDIR /app
11 | COPY --from=builder /app/app /app/app
12 | ENTRYPOINT [ "./app" ]
13 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | %VITE_WEB_TITLE%
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/shared/Actions.d.ts:
--------------------------------------------------------------------------------
1 | interface InitAction {
2 | type: "init";
3 | image: string;
4 | }
5 |
6 | export interface DrawAction {
7 | type: "draw";
8 | points: { x: number; y: number }[];
9 | color: string;
10 | brushSize: number;
11 | }
12 |
13 | export interface FillAction {
14 | type: "fill";
15 | x: number;
16 | y: number;
17 | color: string;
18 | }
19 |
20 | interface ClearAction {
21 | type: "clear";
22 | }
23 |
24 | export type CanvasAction = InitAction | DrawAction | FillAction | ClearAction;
25 |
--------------------------------------------------------------------------------
/components.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://ui.shadcn.com/schema.json",
3 | "style": "new-york",
4 | "rsc": false,
5 | "tsx": true,
6 | "tailwind": {
7 | "config": "tailwind.config.js",
8 | "css": "src/index.css",
9 | "baseColor": "slate",
10 | "cssVariables": true,
11 | "prefix": ""
12 | },
13 | "aliases": {
14 | "components": "@/components",
15 | "utils": "@/lib/utils",
16 | "ui": "@/components/ui",
17 | "lib": "@/lib",
18 | "hooks": "@/hooks"
19 | },
20 | "iconLibrary": "lucide"
21 | }
--------------------------------------------------------------------------------
/nginx.Dockerfile:
--------------------------------------------------------------------------------
1 | FROM oven/bun:1-slim AS builder
2 | WORKDIR /app
3 | ARG VITE_WEB_TITLE
4 | ENV VITE_WEB_TITLE=$VITE_WEB_TITLE
5 | COPY package.json bun.lockb ./
6 | RUN bun install
7 | COPY ./postcss.config.js ./postcss.config.js
8 | COPY ./tailwind.config.js ./tailwind.config.js
9 | COPY ./vite.config.ts ./vite.config.ts
10 | COPY ./index.html ./index.html
11 | COPY ./shared ./shared
12 | COPY ./src ./src
13 | COPY ./public ./public
14 | RUN bun run build:ci
15 |
16 | FROM nginx:alpine
17 | COPY --from=builder /app/dist /usr/share/nginx/html
18 | COPY nginx.conf /etc/nginx/conf.d/default.conf
19 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4 | "target": "ES2022",
5 | "lib": ["ES2023"],
6 | "module": "ESNext",
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "isolatedModules": true,
13 | "moduleDetection": "force",
14 | "noEmit": true,
15 |
16 | /* Linting */
17 | "strict": true,
18 | "noUnusedLocals": true,
19 | "noUnusedParameters": true,
20 | "noFallthroughCasesInSwitch": true,
21 | "noUncheckedSideEffectImports": true
22 | },
23 | "include": ["vite.config.ts"]
24 | }
25 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | services:
2 | nginx:
3 | build:
4 | context: .
5 | dockerfile: nginx.Dockerfile
6 | args:
7 | - VITE_WEB_TITLE=${VITE_WEB_TITLE:-InkLink}
8 | expose:
9 | - 80
10 | depends_on:
11 | - app
12 | healthcheck:
13 | test: ["CMD", "curl", "-f", "http://localhost:80/", "&&", "curl", "-f", "http://localhost:80/health"]
14 | interval: 30s
15 | timeout: 10s
16 | retries: 3
17 | start_period: 2s
18 |
19 | app:
20 | build: .
21 | expose:
22 | - 3001
23 | environment:
24 | - NODE_ENV=production
25 | - CLEAR_CRON=${CLEAR_CRON}
26 | volumes:
27 | - drawings:/app/drawings
28 | restart: unless-stopped
29 |
30 | volumes:
31 | drawings:
32 |
--------------------------------------------------------------------------------
/eslint.config.js:
--------------------------------------------------------------------------------
1 | import js from '@eslint/js'
2 | import globals from 'globals'
3 | import reactHooks from 'eslint-plugin-react-hooks'
4 | import reactRefresh from 'eslint-plugin-react-refresh'
5 | import tseslint from 'typescript-eslint'
6 |
7 | export default tseslint.config(
8 | { ignores: ['dist'] },
9 | {
10 | extends: [js.configs.recommended, ...tseslint.configs.recommended],
11 | files: ['**/*.{ts,tsx}'],
12 | languageOptions: {
13 | ecmaVersion: 2020,
14 | globals: globals.browser,
15 | },
16 | plugins: {
17 | 'react-hooks': reactHooks,
18 | 'react-refresh': reactRefresh,
19 | },
20 | rules: {
21 | ...reactHooks.configs.recommended.rules,
22 | 'react-refresh/only-export-components': [
23 | 'warn',
24 | { allowConstantExport: true },
25 | ],
26 | },
27 | },
28 | )
29 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import path from "path";
2 | import { defineConfig } from "vite";
3 | import react from "@vitejs/plugin-react";
4 |
5 | // https://vite.dev/config/
6 | export default defineConfig({
7 | plugins: [
8 | react({
9 | babel: {
10 | plugins: [["babel-plugin-react-compiler"]],
11 | },
12 | }),
13 | ],
14 | resolve: {
15 | alias: {
16 | "@": path.resolve(__dirname, "./src"),
17 | },
18 | },
19 | build: {
20 | rollupOptions: {
21 | external: ["@napi-rs/canvas"],
22 | },
23 | },
24 | optimizeDeps: {
25 | exclude: ["@napi-rs/canvas"],
26 | },
27 | server: {
28 | proxy: {
29 | "/ws": {
30 | target: "ws://localhost:3001",
31 | ws: true,
32 | rewriteWsOrigin: true,
33 | },
34 | "/drawing.bmp": {
35 | target: "http://localhost:3001",
36 | },
37 | },
38 | },
39 | });
40 |
--------------------------------------------------------------------------------
/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4 | "target": "ES2020",
5 | "useDefineForClassFields": true,
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "module": "ESNext",
8 | "skipLibCheck": true,
9 |
10 | /* Bundler mode */
11 | "moduleResolution": "bundler",
12 | "allowImportingTsExtensions": true,
13 | "isolatedModules": true,
14 | "moduleDetection": "force",
15 | "noEmit": true,
16 | "jsx": "react-jsx",
17 |
18 | /* Linting */
19 | "strict": true,
20 | "noUnusedLocals": true,
21 | "noUnusedParameters": true,
22 | "noFallthroughCasesInSwitch": true,
23 | "noUncheckedSideEffectImports": true,
24 |
25 | "baseUrl": ".",
26 | "paths": {
27 | "@/*": [
28 | "./src/*"
29 | ]
30 | }
31 | },
32 | "include": ["src", "shared/PxBrush.ts", "shared/StampMaker.ts"]
33 | }
34 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025, Nick Winans
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "inklink",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "bunx vite",
8 | "build": "tsc -b && bun run build:ci",
9 | "build:ci": "bunx --bun vite build",
10 | "lint": "eslint .",
11 | "preview": "bunx --bun vite preview",
12 | "server": "bun run server/index.ts",
13 | "dev:all": "concurrently \"bun run dev\" \"bun run server\""
14 | },
15 | "dependencies": {
16 | "@napi-rs/canvas": "^0.1.65",
17 | "@radix-ui/react-dialog": "^1.1.4",
18 | "@radix-ui/react-slot": "^1.1.1",
19 | "babel-plugin-react-compiler": "^19.0.0-beta-e552027-20250112",
20 | "class-variance-authority": "^0.7.1",
21 | "clsx": "^2.1.1",
22 | "cron": "^3.5.0",
23 | "lucide-react": "^0.471.1",
24 | "react": "^19.0.0",
25 | "react-dom": "^19.0.0",
26 | "tailwind-merge": "^2.6.0",
27 | "tailwindcss-animate": "^1.0.7"
28 | },
29 | "devDependencies": {
30 | "@eslint/js": "^9.18.0",
31 | "@types/node": "^22.10.7",
32 | "@types/react": "^19.0.7",
33 | "@types/react-dom": "^19.0.3",
34 | "@vitejs/plugin-react": "^4.3.4",
35 | "autoprefixer": "^10.4.20",
36 | "bun-types": "^1.1.43",
37 | "concurrently": "^9.1.2",
38 | "eslint": "^9.18.0",
39 | "eslint-plugin-react-hooks": "^5.1.0",
40 | "eslint-plugin-react-refresh": "^0.4.18",
41 | "globals": "^15.14.0",
42 | "postcss": "^8.5.1",
43 | "tailwindcss": "^3.4.17",
44 | "typescript": "~5.7.3",
45 | "typescript-eslint": "^8.20.0",
46 | "vite": "^6.0.9"
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | darkMode: ["class"],
4 | content: ["./index.html", "./src/**/*.{ts,tsx,js,jsx}"],
5 | theme: {
6 | extend: {
7 | borderRadius: {
8 | lg: 'var(--radius)',
9 | md: 'calc(var(--radius) - 2px)',
10 | sm: 'calc(var(--radius) - 4px)'
11 | },
12 | colors: {
13 | background: 'hsl(var(--background))',
14 | foreground: 'hsl(var(--foreground))',
15 | card: {
16 | DEFAULT: 'hsl(var(--card))',
17 | foreground: 'hsl(var(--card-foreground))'
18 | },
19 | popover: {
20 | DEFAULT: 'hsl(var(--popover))',
21 | foreground: 'hsl(var(--popover-foreground))'
22 | },
23 | primary: {
24 | DEFAULT: 'hsl(var(--primary))',
25 | foreground: 'hsl(var(--primary-foreground))'
26 | },
27 | secondary: {
28 | DEFAULT: 'hsl(var(--secondary))',
29 | foreground: 'hsl(var(--secondary-foreground))'
30 | },
31 | muted: {
32 | DEFAULT: 'hsl(var(--muted))',
33 | foreground: 'hsl(var(--muted-foreground))'
34 | },
35 | accent: {
36 | DEFAULT: 'hsl(var(--accent))',
37 | foreground: 'hsl(var(--accent-foreground))'
38 | },
39 | destructive: {
40 | DEFAULT: 'hsl(var(--destructive))',
41 | foreground: 'hsl(var(--destructive-foreground))'
42 | },
43 | border: 'hsl(var(--border))',
44 | input: 'hsl(var(--input))',
45 | ring: 'hsl(var(--ring))',
46 | chart: {
47 | '1': 'hsl(var(--chart-1))',
48 | '2': 'hsl(var(--chart-2))',
49 | '3': 'hsl(var(--chart-3))',
50 | '4': 'hsl(var(--chart-4))',
51 | '5': 'hsl(var(--chart-5))'
52 | }
53 | }
54 | }
55 | },
56 | plugins: [require("tailwindcss-animate")],
57 | };
58 |
59 |
--------------------------------------------------------------------------------
/circuitpython/waveshare7in5bv3.py:
--------------------------------------------------------------------------------
1 | import microcontroller
2 | import busio
3 | from epaperdisplay import EPaperDisplay
4 | from fourwire import FourWire
5 |
6 | EPD_WIDTH = 800
7 | EPD_HEIGHT = 480
8 |
9 | CS_PIN = microcontroller.pin.GPIO15
10 | DC_PIN = microcontroller.pin.GPIO27
11 | RST_PIN = microcontroller.pin.GPIO26
12 | BUSY_PIN = microcontroller.pin.GPIO25
13 |
14 | SPI_SCK_PIN = microcontroller.pin.GPIO13
15 | SPI_MOSI_PIN = microcontroller.pin.GPIO14
16 |
17 | SPI_BAUD_RATE = 4_000_000
18 |
19 | _START_SEQUENCE = (
20 | b"\x01\x04\x07\x07\x3f\x3f" # power setting, VGH=20V, VGL=-20V, VDH=15V, VDL=-15V
21 | b"\x04\x80\xff" # power on (500ms delay)
22 | b"\x00\x01\x0f" # panel setting, tri-color, OTP LUT (default)
23 | b"\x61\x04\x03\x20\x01\xe0" # resolution setting, source 800, gate 480
24 | b"\x15\x01\x00" # dual spi off (default)
25 | b"\x50\x02\x11\x07" # vcom and data interval setting
26 | b"\x60\x01\x22" # tcon setting (default)
27 | b"\x65\x04\x00\x00\x00\x00" # gate/source start setting (default)
28 | )
29 |
30 | _STOP_SEQUENCE = (
31 | b"\x02\x00" # power off
32 | b"\x07\x01\xa5" # deep sleep
33 | )
34 |
35 | class Waveshare7in5Bv3(EPaperDisplay):
36 | def __init__(self, **kwargs):
37 | spi = busio.SPI(SPI_SCK_PIN, MOSI=SPI_MOSI_PIN)
38 | bus = FourWire(spi, command=DC_PIN, chip_select=CS_PIN, reset=RST_PIN, baudrate=SPI_BAUD_RATE)
39 | super().__init__(
40 | bus,
41 | _START_SEQUENCE,
42 | _STOP_SEQUENCE,
43 | **kwargs,
44 | busy_pin=BUSY_PIN,
45 | busy_state=False,
46 | width=EPD_WIDTH,
47 | height=EPD_HEIGHT,
48 | ram_width=EPD_WIDTH,
49 | ram_height=EPD_HEIGHT,
50 | write_black_ram_command=0x10,
51 | write_color_ram_command=0x13,
52 | refresh_display_command=0x12,
53 | highlight_color=0xff0000
54 | )
55 |
56 |
57 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 | @layer base {
5 | :root {
6 | --background: 0 0% 100%;
7 | --foreground: 222.2 84% 4.9%;
8 | --card: 0 0% 100%;
9 | --card-foreground: 222.2 84% 4.9%;
10 | --popover: 0 0% 100%;
11 | --popover-foreground: 222.2 84% 4.9%;
12 | --primary: 222.2 47.4% 11.2%;
13 | --primary-foreground: 210 40% 98%;
14 | --secondary: 210 40% 96.1%;
15 | --secondary-foreground: 222.2 47.4% 11.2%;
16 | --muted: 210 40% 96.1%;
17 | --muted-foreground: 215.4 16.3% 46.9%;
18 | --accent: 210 40% 96.1%;
19 | --accent-foreground: 222.2 47.4% 11.2%;
20 | --destructive: 0 84.2% 60.2%;
21 | --destructive-foreground: 210 40% 98%;
22 | --border: 214.3 31.8% 91.4%;
23 | --input: 214.3 31.8% 91.4%;
24 | --ring: 222.2 84% 4.9%;
25 | --chart-1: 12 76% 61%;
26 | --chart-2: 173 58% 39%;
27 | --chart-3: 197 37% 24%;
28 | --chart-4: 43 74% 66%;
29 | --chart-5: 27 87% 67%;
30 | --radius: 0.5rem
31 | }
32 | .dark {
33 | --background: 222.2 84% 4.9%;
34 | --foreground: 210 40% 98%;
35 | --card: 222.2 84% 4.9%;
36 | --card-foreground: 210 40% 98%;
37 | --popover: 222.2 84% 4.9%;
38 | --popover-foreground: 210 40% 98%;
39 | --primary: 210 40% 98%;
40 | --primary-foreground: 222.2 47.4% 11.2%;
41 | --secondary: 217.2 32.6% 17.5%;
42 | --secondary-foreground: 210 40% 98%;
43 | --muted: 217.2 32.6% 17.5%;
44 | --muted-foreground: 215 20.2% 65.1%;
45 | --accent: 217.2 32.6% 17.5%;
46 | --accent-foreground: 210 40% 98%;
47 | --destructive: 0 62.8% 30.6%;
48 | --destructive-foreground: 210 40% 98%;
49 | --border: 217.2 32.6% 17.5%;
50 | --input: 217.2 32.6% 17.5%;
51 | --ring: 212.7 26.8% 83.9%;
52 | --chart-1: 220 70% 50%;
53 | --chart-2: 160 60% 45%;
54 | --chart-3: 30 80% 55%;
55 | --chart-4: 280 65% 60%;
56 | --chart-5: 340 75% 55%
57 | }
58 | }
59 | @layer base {
60 | * {
61 | @apply border-border;
62 | }
63 | body {
64 | @apply bg-background text-foreground;
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/src/components/ui/button.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import { Slot } from "@radix-ui/react-slot"
3 | import { cva, type VariantProps } from "class-variance-authority"
4 |
5 | import { cn } from "@/lib/utils"
6 |
7 | const buttonVariants = cva(
8 | "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
9 | {
10 | variants: {
11 | variant: {
12 | default:
13 | "bg-primary text-primary-foreground shadow hover:bg-primary/90",
14 | destructive:
15 | "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
16 | outline:
17 | "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
18 | secondary:
19 | "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
20 | ghost: "hover:bg-accent hover:text-accent-foreground",
21 | link: "text-primary underline-offset-4 hover:underline",
22 | },
23 | size: {
24 | default: "h-9 px-4 py-2",
25 | sm: "h-8 rounded-md px-3 text-xs",
26 | lg: "h-10 rounded-md px-8",
27 | icon: "h-9 w-9",
28 | },
29 | },
30 | defaultVariants: {
31 | variant: "default",
32 | size: "default",
33 | },
34 | }
35 | )
36 |
37 | export interface ButtonProps
38 | extends React.ButtonHTMLAttributes,
39 | VariantProps {
40 | asChild?: boolean
41 | }
42 |
43 | const Button = React.forwardRef(
44 | ({ className, variant, size, asChild = false, ...props }, ref) => {
45 | const Comp = asChild ? Slot : "button"
46 | return (
47 |
52 | )
53 | }
54 | )
55 | Button.displayName = "Button"
56 |
57 | export { Button, buttonVariants }
58 |
--------------------------------------------------------------------------------
/src/components/ui/card.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 |
3 | import { cn } from "@/lib/utils"
4 |
5 | const Card = React.forwardRef<
6 | HTMLDivElement,
7 | React.HTMLAttributes
8 | >(({ className, ...props }, ref) => (
9 |
17 | ))
18 | Card.displayName = "Card"
19 |
20 | const CardHeader = React.forwardRef<
21 | HTMLDivElement,
22 | React.HTMLAttributes
23 | >(({ className, ...props }, ref) => (
24 |
29 | ))
30 | CardHeader.displayName = "CardHeader"
31 |
32 | const CardTitle = React.forwardRef<
33 | HTMLDivElement,
34 | React.HTMLAttributes
35 | >(({ className, ...props }, ref) => (
36 |
41 | ))
42 | CardTitle.displayName = "CardTitle"
43 |
44 | const CardDescription = React.forwardRef<
45 | HTMLDivElement,
46 | React.HTMLAttributes
47 | >(({ className, ...props }, ref) => (
48 |
53 | ))
54 | CardDescription.displayName = "CardDescription"
55 |
56 | const CardContent = React.forwardRef<
57 | HTMLDivElement,
58 | React.HTMLAttributes
59 | >(({ className, ...props }, ref) => (
60 |
61 | ))
62 | CardContent.displayName = "CardContent"
63 |
64 | const CardFooter = React.forwardRef<
65 | HTMLDivElement,
66 | React.HTMLAttributes
67 | >(({ className, ...props }, ref) => (
68 |
73 | ))
74 | CardFooter.displayName = "CardFooter"
75 |
76 | export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
77 |
--------------------------------------------------------------------------------
/circuitpython/bmpread.py:
--------------------------------------------------------------------------------
1 | def read_bmp(chunk_iterator, bitmap, palette):
2 | """Read an entire BMP file into the provided bitmap and palette"""
3 | # Get first chunk for headers and palette
4 | chunk = next(chunk_iterator)
5 | buffer = bytearray(chunk)
6 | while len(buffer) < 70: # Need 54 for header + 16 for palette
7 | buffer.extend(next(chunk_iterator))
8 |
9 | # Read palette (starts at offset 54)
10 | for i in range(4):
11 | offset = 54 + (i * 4)
12 | b = buffer[offset]
13 | g = buffer[offset + 1]
14 | r = buffer[offset + 2]
15 | palette[i] = (r << 16) | (g << 8) | b
16 |
17 | changed = False
18 | x = 0
19 | y = 0
20 |
21 | # Process remaining buffer bytes
22 | for pos in range(70, len(buffer)):
23 | byte = buffer[pos]
24 | if not changed and ( # Only check if we haven't found changes yet
25 | bitmap[x, y] != ((byte >> 6) & 0x03) or
26 | bitmap[x + 1, y] != ((byte >> 4) & 0x03) or
27 | bitmap[x + 2, y] != ((byte >> 2) & 0x03) or
28 | bitmap[x + 3, y] != (byte & 0x03)):
29 | changed = True
30 | bitmap[x, y] = (byte >> 6) & 0x03
31 | bitmap[x + 1, y] = (byte >> 4) & 0x03
32 | bitmap[x + 2, y] = (byte >> 2) & 0x03
33 | bitmap[x + 3, y] = byte & 0x03
34 |
35 | x += 4
36 | if x >= 800:
37 | x = 0
38 | y += 1
39 |
40 | # Process remaining chunks
41 | while y < 480:
42 | chunk = next(chunk_iterator)
43 | for byte in chunk:
44 | if not changed and ( # Only check if we haven't found changes yet
45 | bitmap[x, y] != ((byte >> 6) & 0x03) or
46 | bitmap[x + 1, y] != ((byte >> 4) & 0x03) or
47 | bitmap[x + 2, y] != ((byte >> 2) & 0x03) or
48 | bitmap[x + 3, y] != (byte & 0x03)):
49 | changed = True
50 | bitmap[x, y] = (byte >> 6) & 0x03
51 | bitmap[x + 1, y] = (byte >> 4) & 0x03
52 | bitmap[x + 2, y] = (byte >> 2) & 0x03
53 | bitmap[x + 3, y] = byte & 0x03
54 |
55 | x += 4
56 | if x >= 800:
57 | x = 0
58 | y += 1
59 | if y >= 480:
60 | break
61 |
62 | return changed
--------------------------------------------------------------------------------
/circuitpython/draw.py:
--------------------------------------------------------------------------------
1 | import time
2 | import displayio
3 | import waveshare7in5bv3
4 | import adafruit_connection_manager
5 | import wifi
6 | import adafruit_requests
7 | import bmpread
8 | import microcontroller
9 |
10 | host = "your-domain.com"
11 |
12 | displayio.release_displays()
13 | display = waveshare7in5bv3.Waveshare7in5Bv3()
14 |
15 | pool = None
16 | ssl_context = None
17 | requests = None
18 | errors = 0
19 |
20 | # Create the bitmap that matches display exactly
21 | bitmap = displayio.Bitmap(800, 480, 4)
22 | palette = displayio.Palette(4)
23 |
24 | # Create a group and add the bitmap with its palette - do this once
25 | group = displayio.Group()
26 | tile_grid = displayio.TileGrid(bitmap, pixel_shader=palette)
27 | group.append(tile_grid)
28 | display.root_group = group
29 |
30 | while True:
31 | if errors > 20:
32 | print("Too many errors, restarting")
33 | microcontroller.reset()
34 |
35 | # Set up network
36 | try:
37 | pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio)
38 | ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio)
39 | requests = adafruit_requests.Session(pool, ssl_context)
40 | except Exception as e:
41 | print(f"Error setting up network: {e}")
42 | errors += 1
43 | time.sleep(10)
44 | continue
45 |
46 | response = None
47 | try:
48 | response = requests.get(f"https://{host}/drawing.bmp")
49 | print(response.status_code)
50 | except Exception as e:
51 | print(f"Error getting image: {e}")
52 | errors += 1
53 | time.sleep(10)
54 | continue
55 |
56 | changed = False
57 | if response and response.status_code == 200:
58 | try:
59 | content = response.iter_content(chunk_size=1024)
60 | print("about to read bmp")
61 | changed = bmpread.read_bmp(content, bitmap, palette) # This updates the existing bitmap
62 | print("finished reading bmp")
63 | except Exception as e:
64 | print(f"Error loading image: {e}")
65 | errors += 1
66 | time.sleep(10)
67 | continue
68 | finally:
69 | response.close()
70 |
71 | if changed:
72 | print("about to refresh")
73 | display.refresh()
74 | print("refreshed")
75 | else:
76 | print("no changes")
77 |
78 | time.sleep(180)
--------------------------------------------------------------------------------
/shared/PxBrush.ts:
--------------------------------------------------------------------------------
1 | // Copyright 2015 - 2025 Krasimir Tsonev, Nick Winans
2 | // SPDX-License-Identifier: MIT
3 |
4 | // This is a modified version of the PxBrush class from the original project https://github.com/kozo002/px-brush
5 |
6 | import StampMaker from './StampMaker'
7 |
8 | export default class PxBrush {
9 | canvas: HTMLCanvasElement
10 | context: CanvasRenderingContext2D
11 | stampMaker: StampMaker
12 |
13 | constructor (canvas: HTMLCanvasElement) {
14 | this.canvas = canvas
15 | this.context = canvas.getContext('2d')!
16 | this.stampMaker = new StampMaker()
17 | this.configPixelRatio()
18 | }
19 |
20 | get dpr () {
21 | return window.devicePixelRatio || 1
22 | }
23 |
24 | configPixelRatio () {
25 | this.context.imageSmoothingEnabled = false
26 | }
27 |
28 | distanceBetween (point1: { x: number; y: number }, point2: { x: number; y: number }) {
29 | return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2))
30 | }
31 |
32 | angleBetween (point1: { x: number; y: number }, point2: { x: number; y: number }) {
33 | return Math.atan2(point2.x - point1.x, point2.y - point1.y)
34 | }
35 |
36 | draw ({ from, to, size, color }: { from: { x: number; y: number }; to: { x: number; y: number }; size: number; color: string }) {
37 | this.context.globalCompositeOperation = 'source-over'
38 | this.brush({ from, to, size, color })
39 | }
40 |
41 | erase ({ from, to, size }: { from: { x: number; y: number }; to: { x: number; y: number }; size: number }) {
42 | this.context.globalCompositeOperation = 'destination-out'
43 | this.brush({ from, to, size, color: '#000000' })
44 | }
45 |
46 | brush ({ from, to, size, color }: { from: { x: number; y: number }; to: { x: number; y: number }; size: number; color: string }) {
47 | const halfSize = (size - (size % 2)) / 2
48 | const stamp = this.stampMaker.make({ size, color })!
49 | if (from.x === to.x && from.y === to.y) {
50 | const x = from.x - halfSize
51 | const y = from.y - halfSize
52 | this.context.drawImage(stamp, Math.round(x), Math.round(y), size, size)
53 | return
54 | }
55 | const dist = this.distanceBetween(from, to)
56 | const angle = this.angleBetween(from, to)
57 | for (let i = 0; i < dist; i += 1) {
58 | const x = from.x + (Math.sin(angle) * i) - halfSize
59 | const y = from.y + (Math.cos(angle) * i) - halfSize
60 | this.context.drawImage(stamp, Math.round(x), Math.round(y), size, size)
61 | }
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/shared/Utilities.ts:
--------------------------------------------------------------------------------
1 | import PxBrush from "./PxBrush";
2 |
3 | const hexToRgb = (hex: string) => {
4 | const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
5 | return result
6 | ? {
7 | r: parseInt(result[1], 16),
8 | g: parseInt(result[2], 16),
9 | b: parseInt(result[3], 16),
10 | }
11 | : null;
12 | };
13 |
14 | export const colors = {
15 | black: "#000000",
16 | white: "#ffffff",
17 | red: "#ff0000",
18 | }
19 | export const brushSizes = {
20 | "brush-small": 2,
21 | "brush-medium": 5,
22 | "brush-large": 10,
23 | }
24 |
25 | export function fill(
26 | context: CanvasRenderingContext2D,
27 | width: number,
28 | height: number,
29 | x: number,
30 | y: number,
31 | color: string
32 | ) {
33 | const imageData = context.getImageData(0, 0, width, height);
34 | const pixels = imageData.data;
35 |
36 | const startX = x;
37 | const startY = y;
38 | const startPos = (startY * width + startX) * 4;
39 | const startR = pixels[startPos];
40 | const startG = pixels[startPos + 1];
41 | const startB = pixels[startPos + 2];
42 |
43 | const fillColorRGB = hexToRgb(color);
44 | if (!fillColorRGB) return;
45 |
46 | if (
47 | startR === fillColorRGB.r &&
48 | startG === fillColorRGB.g &&
49 | startB === fillColorRGB.b
50 | )
51 | return;
52 |
53 | const queue = [[startX, startY]];
54 | const visited = new Set();
55 |
56 | const matchesStartColor = (x: number, y: number) => {
57 | const pos = (y * width + x) * 4;
58 | return (
59 | pixels[pos] === startR &&
60 | pixels[pos + 1] === startG &&
61 | pixels[pos + 2] === startB
62 | );
63 | };
64 |
65 | const setPixel = (x: number, y: number) => {
66 | const pos = (y * width + x) * 4;
67 | pixels[pos] = fillColorRGB.r;
68 | pixels[pos + 1] = fillColorRGB.g;
69 | pixels[pos + 2] = fillColorRGB.b;
70 | pixels[pos + 3] = 255;
71 | };
72 |
73 | while (queue.length > 0) {
74 | const [x, y] = queue.shift()!;
75 | const key = `${x},${y}`;
76 |
77 | if (visited.has(key)) continue;
78 | if (x < 0 || x >= width || y < 0 || y >= height) continue;
79 | if (!matchesStartColor(x, y)) continue;
80 |
81 | setPixel(x, y);
82 | visited.add(key);
83 |
84 | if (x > 0) queue.push([x - 1, y]);
85 | if (x < width - 1) queue.push([x + 1, y]);
86 | if (y > 0) queue.push([x, y - 1]);
87 | if (y < height - 1) queue.push([x, y + 1]);
88 |
89 | if (queue.length > 10000) break;
90 | }
91 |
92 | context.putImageData(imageData, 0, 0);
93 | }
94 |
95 | export function draw(
96 | brush: PxBrush,
97 | points: { x: number; y: number }[],
98 | color: string,
99 | brushSize: number
100 | ) {
101 | if (points.length < 1) return;
102 |
103 | if (points.length === 1) {
104 | brush.draw({
105 | from: points[0],
106 | to: points[0],
107 | color: color,
108 | size: brushSize,
109 | });
110 | } else {
111 | for (let i = 1; i < points.length; i++) {
112 | brush.draw({
113 | from: points[i - 1],
114 | to: points[i],
115 | color: color,
116 | size: brushSize,
117 | });
118 | }
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/nginx.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 80;
3 |
4 | server_name localhost;
5 |
6 | # Enhanced security headers
7 | add_header X-Frame-Options "SAMEORIGIN" always;
8 | add_header X-XSS-Protection "1; mode=block" always;
9 | add_header X-Content-Type-Options "nosniff" always;
10 | add_header Referrer-Policy "strict-origin-when-cross-origin" always;
11 |
12 | # Root directory for static files
13 | root /usr/share/nginx/html;
14 | index index.html;
15 |
16 | # Static file serving with optimized caching
17 | location / {
18 | try_files $uri $uri/ /index.html;
19 |
20 | # Disable caching for HTML to always check for updates
21 | location ~* \.html$ {
22 | expires -1;
23 | add_header Cache-Control "no-store, no-cache, must-revalidate";
24 | }
25 |
26 | # Cache bust other static assets with query strings or file hashes
27 | location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
28 | expires 1y;
29 | add_header Cache-Control "public, immutable";
30 | }
31 |
32 | # Optimize static file serving
33 | tcp_nodelay on;
34 | tcp_nopush on;
35 | sendfile on;
36 |
37 | # Gzip compression for static files
38 | gzip on;
39 | gzip_types text/plain text/css application/javascript application/json image/svg+xml;
40 | gzip_min_length 1000;
41 | }
42 |
43 | # WebSocket proxy with optimized settings
44 | location /ws {
45 | proxy_pass http://app:3001;
46 | proxy_http_version 1.1;
47 | proxy_set_header Upgrade $http_upgrade;
48 | proxy_set_header Connection "upgrade";
49 | proxy_set_header Host $host;
50 | proxy_set_header X-Real-IP $remote_addr;
51 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
52 | proxy_set_header X-Forwarded-Proto $scheme;
53 |
54 | # WebSocket timeouts
55 | proxy_read_timeout 300s;
56 | proxy_connect_timeout 75s;
57 | proxy_send_timeout 300s;
58 |
59 | # WebSocket specific optimizations
60 | proxy_buffering off;
61 | proxy_cache off;
62 | }
63 |
64 | # Drawing endpoint proxy with optimized settings
65 | location /drawing.bmp {
66 | proxy_pass http://app:3001;
67 | proxy_set_header Host $host;
68 | proxy_set_header X-Real-IP $remote_addr;
69 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
70 | proxy_set_header X-Forwarded-Proto $scheme;
71 |
72 | # Since this is real-time generated content
73 | proxy_buffering off;
74 | proxy_cache off;
75 | expires -1;
76 | add_header Cache-Control "no-store, no-cache, must-revalidate";
77 | }
78 |
79 | # Health check endpoint proxy
80 | location /health {
81 | proxy_pass http://app:3001;
82 | proxy_set_header Host $host;
83 | proxy_set_header X-Real-IP $remote_addr;
84 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
85 | proxy_set_header X-Forwarded-Proto $scheme;
86 |
87 | # Optimize for health checks
88 | proxy_buffering off;
89 | proxy_cache off;
90 | expires -1;
91 | add_header Cache-Control "no-store, no-cache, must-revalidate";
92 | }
93 |
94 | # Deny access to . files
95 | location ~ /\. {
96 | deny all;
97 | access_log off;
98 | log_not_found off;
99 | }
100 | }
--------------------------------------------------------------------------------
/src/components/ui/dialog.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react"
2 | import * as DialogPrimitive from "@radix-ui/react-dialog"
3 | import { X } from "lucide-react"
4 |
5 | import { cn } from "@/lib/utils"
6 |
7 | const Dialog = DialogPrimitive.Root
8 |
9 | const DialogTrigger = DialogPrimitive.Trigger
10 |
11 | const DialogPortal = DialogPrimitive.Portal
12 |
13 | const DialogClose = DialogPrimitive.Close
14 |
15 | const DialogOverlay = React.forwardRef<
16 | React.ElementRef,
17 | React.ComponentPropsWithoutRef
18 | >(({ className, ...props }, ref) => (
19 |
27 | ))
28 | DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
29 |
30 | const DialogContent = React.forwardRef<
31 | React.ElementRef,
32 | React.ComponentPropsWithoutRef
33 | >(({ className, children, ...props }, ref) => (
34 |
35 |
36 |
44 | {children}
45 |
46 |
47 | Close
48 |
49 |
50 |
51 | ))
52 | DialogContent.displayName = DialogPrimitive.Content.displayName
53 |
54 | const DialogHeader = ({
55 | className,
56 | ...props
57 | }: React.HTMLAttributes) => (
58 |
65 | )
66 | DialogHeader.displayName = "DialogHeader"
67 |
68 | const DialogFooter = ({
69 | className,
70 | ...props
71 | }: React.HTMLAttributes) => (
72 |
79 | )
80 | DialogFooter.displayName = "DialogFooter"
81 |
82 | const DialogTitle = React.forwardRef<
83 | React.ElementRef,
84 | React.ComponentPropsWithoutRef
85 | >(({ className, ...props }, ref) => (
86 |
94 | ))
95 | DialogTitle.displayName = DialogPrimitive.Title.displayName
96 |
97 | const DialogDescription = React.forwardRef<
98 | React.ElementRef,
99 | React.ComponentPropsWithoutRef
100 | >(({ className, ...props }, ref) => (
101 |
106 | ))
107 | DialogDescription.displayName = DialogPrimitive.Description.displayName
108 |
109 | export {
110 | Dialog,
111 | DialogPortal,
112 | DialogOverlay,
113 | DialogTrigger,
114 | DialogClose,
115 | DialogContent,
116 | DialogHeader,
117 | DialogFooter,
118 | DialogTitle,
119 | DialogDescription,
120 | }
121 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # InkLink
2 | ### *Real-time Collaborative E-Paper Canvas*
3 |
4 | A collaborative drawing system with a web interface that syncs to an e-paper display.
5 |
6 | ### Key Features
7 | - Real-time collaborative drawing interface
8 | - Web-based access from any device
9 | - E-paper display sync every 3 minutes
10 | - Multi-user support via WebSocket
11 | - Tri-color display support (black, white, and red)
12 |
13 | 
14 |
15 | ### Try out the web demo [here](https://inklink.winans.io)
16 |
17 | ### Read [my blog post](https://nick.winans.io/blog/ink-link/) to get an overview of the project
18 |
19 | This project uses a 7.5" tri-color e-paper display to display the drawing from the web interface. The website is real-time and supports multiple concurrent users with websockets. The e-paper display will update every three minutes.
20 |
21 | ## Hardware Setup
22 | Total cost: ~$45-$85
23 |
24 | ### Required Components
25 | - Waveshare 7.5 B V3 E-Paper Display (~$30-$50)
26 | - [Waveshare](https://www.waveshare.com/7.5inch-e-paper-b.htm)
27 | - [Amazon](https://www.amazon.com/7-5inch-Three-Color-Paper-Like-Displaying-Electricity/dp/B09JSFTGV6)
28 | - [Aliexpress](https://www.aliexpress.us/item/3256806387212613.html) ([Alternate](https://www.aliexpress.us/item/3256806989536255.html))
29 | - [Good Display](https://www.good-display.com/product/394.html) ([Store](https://buyepaper.com/products/red-tri-color-e-paper-display-partial-update-gdey075z08))
30 | - Waveshare ESP32 E-Paper Driver Board (~$10-$20)
31 | - [Waveshare](https://www.waveshare.com/e-paper-esp32-driver-board.htm)
32 | - [Amazon](https://www.amazon.com/Waveshare-Universal-Driver-Board-ESP32/dp/B07M5CNP3B)
33 | - [Aliexpress](https://www.aliexpress.us/item/3256807183975806.html)
34 | - 3D printed case front, back, and cover (~$2-$10)
35 | - [3D files available here](https://github.com/Nicell/InkLink/tree/main/3d-files)
36 | - A micro USB to USB-C adapter (~$5)
37 | - [Amazon](https://www.amazon.com/Togconn-Adapter-Convert-Connector-Support/dp/B0CDP9JWVY)
38 | - A USB-C cable and a power supply
39 |
40 | ### Assembly Instructions
41 | 1. Print the three case components
42 | 2. Place the display in the front
43 | 3. Put the back plate on, feed the ribbon cable through the hole
44 | 4. Glue the back plate to the front
45 | 5. Place the ESP32 on the back plate and hot glue it in place
46 | - Placement is right above the hole with the headers touching the back plate
47 | - Test placement with the cover on top before gluing
48 | 6. Put the micro USB to USB-C adapter into the microcontroller
49 | 7. Place the cover over the microcontroller
50 | 8. Glue the cover to the back plate
51 |
52 | ## Software Setup
53 |
54 | ### E-Paper Display Setup
55 | 1. Install CircuitPython on the ESP32 board:
56 | - I used the [DOIT ESP32](https://circuitpython.org/board/doit_esp32_devkit_v1/) firmware
57 | - Follow the [CircuitPython ESP32 Quick Start Guide](https://learn.adafruit.com/circuitpython-with-esp32-quick-start/installing-circuitpython) to get your device on your network and the code editor running
58 |
59 | 2. Install required CircuitPython libraries:
60 | - Download the [Adafruit CircuitPython Library Bundle](https://circuitpython.org/libraries) for your version of CircuitPython
61 | - Install the following libraries to your lib folder with the web file manager:
62 | - adafruit_connection_manager
63 | - adafruit_requests
64 |
65 | 3. Copy the [CircuitPython files](https://github.com/Nicell/InkLink/tree/main/circuitpython) to your device through the web file manager or code editor:
66 | - `waveshare7in5bv3.py`
67 | - `draw.py` - Make sure to set the host variable to your server's domain
68 | - `bmpread.py`
69 |
70 | 4. Once you're ready to test, edit `code.py` to run `draw.py`
71 | ```python
72 | import draw
73 | ```
74 |
75 | ### Server Setup
76 |
77 | 1. Clone the repository:
78 | ```bash
79 | git clone
80 | cd inklink
81 | ```
82 |
83 | 2. Deploy using Docker Compose:
84 | ```bash
85 | docker compose up -d
86 | ```
87 |
88 | 3. (Optional) Set variables:
89 | - `VITE_WEB_TITLE` - The title of the web interface (build time variable)
90 | - `CLEAR_CRON` - The cron schedule for clearing the drawing (e.g. `0 6 * * 1` for every Monday at 6am)
91 |
92 | 4. Update the hostname in `draw.py` to your server's domain
93 |
94 | ## License
95 |
96 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
97 |
--------------------------------------------------------------------------------
/shared/StampMaker.ts:
--------------------------------------------------------------------------------
1 | // Copyright 2015 - 2025 Krasimir Tsonev, Nick Winans
2 | // SPDX-License-Identifier: MIT
3 |
4 | // This is a modified version of the StampMaker class from the original project https://github.com/kozo002/px-brush
5 |
6 | let createCanvas: any;
7 | if (typeof window === "undefined") {
8 | import("@napi-rs/canvas").then((module) => {
9 | createCanvas = module.createCanvas;
10 | });
11 | }
12 |
13 | const HexPattern = /^#?[0-9A-Fa-f]{1,2}[0-9A-Fa-f]{1,2}[0-9A-Fa-f]{1,2}$/;
14 | const RGBPattern =
15 | /^rgb\((\s+)?[0-9]{1,3},(\s+)?[0-9]{1,3},(\s+)?[0-9]{1,3}(\s+)?\)$/;
16 |
17 | export default class StampMaker {
18 | canvases: Record> = {};
19 | constructor() {
20 | this.canvases = {};
21 | }
22 |
23 | parseColor(color: string) {
24 | const isHex = HexPattern.test(color);
25 | const isRGB = RGBPattern.test(color);
26 | if (!isHex && !isRGB) {
27 | throw new Error(
28 | "Color is not correct format. #123123 or rgb(123, 123, 123) format required."
29 | );
30 | }
31 | if (isHex) {
32 | let c = color[0] === "#" ? color.slice(1) : color;
33 | c =
34 | c.length === 3
35 | ? c
36 | .split("")
37 | .reduce((acc: string[], it: string) => [...acc, it, it], [])
38 | .join("")
39 | : c;
40 | const r = parseInt(c.slice(0, 2), 16);
41 | const g = parseInt(c.slice(2, 4), 16);
42 | const b = parseInt(c.slice(4, 6), 16);
43 | return { r, g, b };
44 | }
45 | if (isRGB) {
46 | let [r, g, b] = color
47 | .replace(/rgb|\s+|\(|\)/g, "")
48 | .split(",")
49 | .map((it) => parseInt(it));
50 | r = r > 255 ? 255 : r;
51 | g = g > 255 ? 255 : g;
52 | b = b > 255 ? 255 : b;
53 | return { r, g, b };
54 | }
55 | }
56 |
57 | make({ size, color }: { size: number; color: string }) {
58 | try {
59 | const _color = this.parseColor(color)!;
60 | const _strColor = JSON.stringify(_color);
61 | this.canvases[_strColor] = this.canvases[_strColor] || {};
62 |
63 | if (this.canvases[_strColor][size] != null) {
64 | return this.canvases[_strColor][size];
65 | }
66 |
67 | let canvas: HTMLCanvasElement;
68 | size = size + (size % 2);
69 | if (typeof window !== "undefined") {
70 | canvas = document.createElement("canvas");
71 | canvas.width = size;
72 | canvas.height = size;
73 | } else {
74 | canvas = createCanvas(size, size) as unknown as HTMLCanvasElement;
75 | }
76 |
77 | const context = canvas.getContext("2d")!;
78 | const imageData = context.createImageData(size, size);
79 | for (let i = 0; i < imageData.data.length; i += 4) {
80 | imageData.data[i] = 255;
81 | imageData.data[i + 1] = 255;
82 | imageData.data[i + 2] = 255;
83 | imageData.data[i + 3] = 0;
84 | }
85 | this.plotCircle(
86 | size * 2,
87 | size * 4 * (size / 2),
88 | size / 2,
89 | imageData,
90 | size,
91 | _color
92 | );
93 | this.fillCircle(imageData, _color);
94 | context.putImageData(imageData, 0, 0);
95 | this.canvases[_strColor][size] = canvas;
96 | return canvas;
97 | } catch (err) {
98 | console.error(err);
99 | }
100 | }
101 |
102 | plotCircle(
103 | xm: number,
104 | ym: number,
105 | r: number,
106 | imageData: ImageData,
107 | size: number,
108 | color: { r: number; g: number; b: number }
109 | ) {
110 | let x = -r;
111 | let y = 0;
112 | let err = 2 - 2 * r; /* bottom left to top right */
113 |
114 | do {
115 | /* I. Quadrant +x +y */
116 | const i = xm - (x + 1) * 4 + (ym + (y - 1) * (size * 4));
117 | imageData.data[i + 0] = color.r;
118 | imageData.data[i + 1] = color.g;
119 | imageData.data[i + 2] = color.b;
120 | imageData.data[i + 3] = 255;
121 | /* II. Quadrant -x +y */
122 | const ii = xm - y * (size * 4) + (ym - (x + 1) * 4);
123 | imageData.data[ii + 0] = color.r;
124 | imageData.data[ii + 1] = color.g;
125 | imageData.data[ii + 2] = color.b;
126 | imageData.data[ii + 3] = 255;
127 | /* III. Quadrant -x -y */
128 | const iii = xm + x * 4 + (ym - y * (size * 4));
129 | imageData.data[iii + 0] = color.r;
130 | imageData.data[iii + 1] = color.g;
131 | imageData.data[iii + 2] = color.b;
132 | imageData.data[iii + 3] = 255;
133 | /* IV. Quadrant +x -y */
134 | const iv = xm + (y - 1) * (size * 4) + (ym + x * 4);
135 | imageData.data[iv + 0] = color.r;
136 | imageData.data[iv + 1] = color.g;
137 | imageData.data[iv + 2] = color.b;
138 | imageData.data[iv + 3] = 255;
139 | r = err;
140 | if (r <= y) {
141 | err += ++y * 2 + 1; /* y step */
142 | }
143 | if (r > x || err > y) {
144 | err += ++x * 2 + 1; /* x step */
145 | }
146 | } while (x < 0);
147 | }
148 |
149 | fillCircle(imageData: ImageData, color: { r: number; g: number; b: number }) {
150 | const cols = imageData.width * 4;
151 | for (let row = 1; row < imageData.height - 1; row += 1) {
152 | let isHitColor = false;
153 | let isHitClear = false;
154 | let isEnded = false;
155 | for (let col = 0; col < cols; col += 4) {
156 | const index = cols * row + col;
157 | const alpha = imageData.data[index + 3];
158 | const isColor = alpha === 255;
159 | const isClear = alpha === 0;
160 | if (isColor && !isHitColor) {
161 | isHitColor = true;
162 | } else if (isClear && isHitColor) {
163 | isHitClear = true;
164 | } else if (isColor && isHitColor && isHitClear) {
165 | isEnded = true;
166 | }
167 | if (isHitColor && isHitClear && !isEnded) {
168 | imageData.data[index] = color.r;
169 | imageData.data[index + 1] = color.g;
170 | imageData.data[index + 2] = color.b;
171 | imageData.data[index + 3] = 255;
172 | }
173 | }
174 | }
175 | }
176 | }
177 |
--------------------------------------------------------------------------------
/server/index.ts:
--------------------------------------------------------------------------------
1 | import { createCanvas, Canvas, SKRSContext2D } from "@napi-rs/canvas";
2 | import PxBrush from "../shared/PxBrush";
3 | import { CronJob } from "cron";
4 | import { CanvasAction } from "../shared/Actions";
5 | import { brushSizes, colors, draw, fill } from "../shared/Utilities";
6 |
7 | // Server-side canvas
8 | let canvas: Canvas;
9 | let ctx: SKRSContext2D;
10 | let saveTimeout: NodeJS.Timeout | null = null;
11 | let lastSave = Date.now();
12 | let brush: PxBrush;
13 |
14 | const CANVAS_WIDTH = 800;
15 | const CANVAS_HEIGHT = 480;
16 | const SAVE_THROTTLE = 5000;
17 | const SAVE_PATH = "./drawings/current.bmp";
18 |
19 | const initialize = async () => {
20 | // Initialize canvas and ensure drawings directory exists
21 | try {
22 | canvas = createCanvas(CANVAS_WIDTH, CANVAS_HEIGHT);
23 | ctx = canvas.getContext("2d");
24 | brush = new PxBrush(canvas as unknown as HTMLCanvasElement);
25 |
26 | // Set initial white background
27 | ctx.fillStyle = "#ffffff";
28 | ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
29 |
30 | // Load existing drawing if it exists
31 | try {
32 | console.log("Attempting to load:", SAVE_PATH);
33 | const file = Bun.file(SAVE_PATH);
34 | const exists = await file.exists();
35 |
36 | if (exists) {
37 | console.log("File exists, loading...");
38 | const buffer = await file.arrayBuffer();
39 | console.log("Buffer loaded, size:", buffer.byteLength);
40 |
41 | // Skip BMP headers (14 + 40 bytes) and color palette (16 bytes)
42 | const pixelData = Buffer.from(buffer.slice(70));
43 | const stride = Math.ceil(CANVAS_WIDTH / 4);
44 |
45 | // Create RGBA buffer
46 | const imageData = ctx.createImageData(CANVAS_WIDTH, CANVAS_HEIGHT);
47 |
48 | // Color palette (matches the one used in save)
49 | const palette = [
50 | { r: 255, g: 255, b: 255, a: 255 }, // White
51 | { r: 0, g: 0, b: 0, a: 255 }, // Black
52 | { r: 255, g: 0, b: 0, a: 255 }, // Red
53 | { r: 0, g: 0, b: 0, a: 0 }, // Unused
54 | ];
55 |
56 | // Convert 2-bit indexed color back to RGBA
57 | for (let y = 0; y < CANVAS_HEIGHT; y++) {
58 | for (let x = 0; x < CANVAS_WIDTH; x++) {
59 | const byteIndex = Math.floor(x / 4) + y * stride;
60 | const bitPosition = (3 - (x % 4)) * 2;
61 | const colorIndex = (pixelData[byteIndex] >> bitPosition) & 0b11;
62 |
63 | const i = (y * CANVAS_WIDTH + x) * 4;
64 | const color = palette[colorIndex];
65 |
66 | imageData.data[i] = color.r; // R
67 | imageData.data[i + 1] = color.g; // G
68 | imageData.data[i + 2] = color.b; // B
69 | imageData.data[i + 3] = color.a; // A
70 | }
71 | }
72 |
73 | ctx.putImageData(imageData, 0, 0);
74 | console.log("Drawing complete");
75 | } else {
76 | console.log("No existing drawing file found");
77 | }
78 | } catch (e) {
79 | console.error("Error loading existing drawing:", e);
80 | console.log("Starting with blank canvas");
81 | }
82 |
83 | if (process.env.CLEAR_CRON) {
84 | new CronJob(
85 | process.env.CLEAR_CRON,
86 | () => {
87 | console.log("Clearing drawing...");
88 | handleClear();
89 | },
90 | null,
91 | true
92 | );
93 | }
94 | } catch (e) {
95 | console.error("Failed to initialize:", e);
96 | }
97 | };
98 |
99 | initialize();
100 |
101 | const createBmpBuffer = (imageData: ImageData) => {
102 | // Create color palette (4 colors: white, black, red, unused)
103 | const palette = Buffer.alloc(16); // 4 colors * 4 bytes (BGRA)
104 | // White
105 | palette.writeUInt32LE(0xffffffff, 0);
106 | // Black
107 | palette.writeUInt32LE(0xff000000, 4);
108 | // Red
109 | palette.writeUInt32LE(0xffff0000, 8);
110 | // Unused (transparent)
111 | palette.writeUInt32LE(0xffffff00, 12);
112 |
113 | // Convert RGBA pixels to 2-bit indexed color
114 | const stride = Math.ceil(CANVAS_WIDTH / 4); // 4 pixels per byte
115 | const pixelData = Buffer.alloc(stride * CANVAS_HEIGHT);
116 |
117 | for (let y = 0; y < CANVAS_HEIGHT; y++) {
118 | for (let x = 0; x < CANVAS_WIDTH; x++) {
119 | const i = (y * CANVAS_WIDTH + x) * 4;
120 | const r = imageData.data[i];
121 | const g = imageData.data[i + 1];
122 | const b = imageData.data[i + 2];
123 |
124 | // Determine closest color (0=white, 1=black, 2=red, 3=unused)
125 | let colorIndex;
126 | // Find closest color by checking which has smallest difference
127 | const whiteDistance =
128 | Math.abs(r - 255) + Math.abs(g - 255) + Math.abs(b - 255);
129 | const redDistance = Math.abs(r - 255) + Math.abs(g - 0) + Math.abs(b - 0);
130 | const blackDistance = Math.abs(r - 0) + Math.abs(g - 0) + Math.abs(b - 0);
131 |
132 | if (whiteDistance <= redDistance && whiteDistance <= blackDistance) {
133 | colorIndex = 0; // White is closest
134 | } else if (redDistance <= blackDistance) {
135 | colorIndex = 2; // Red is closest
136 | } else {
137 | colorIndex = 1; // Black is closest
138 | }
139 |
140 | // Calculate position in output buffer
141 | const byteIndex = Math.floor(x / 4) + y * stride;
142 | const bitPosition = (3 - (x % 4)) * 2;
143 |
144 | // Set 2 bits for this pixel
145 | pixelData[byteIndex] |= colorIndex << bitPosition;
146 | }
147 | }
148 |
149 | // Create BMP headers
150 | const bmpHeader = Buffer.alloc(14);
151 | bmpHeader.write("BM", 0);
152 | bmpHeader.writeUInt32LE(14 + 40 + 16 + pixelData.length, 2); // Total size
153 | bmpHeader.writeUInt32LE(14 + 40 + 16, 10); // Offset to pixel data
154 |
155 | const dibHeader = Buffer.alloc(40);
156 | dibHeader.writeUInt32LE(40, 0); // DIB header size
157 | dibHeader.writeInt32LE(CANVAS_WIDTH, 4);
158 | dibHeader.writeInt32LE(-CANVAS_HEIGHT, 8); // Negative for top-down
159 | dibHeader.writeUInt16LE(1, 12); // Color planes
160 | dibHeader.writeUInt16LE(2, 14); // Bits per pixel (2 bits = 4 colors)
161 | dibHeader.writeUInt32LE(0, 16); // No compression
162 | dibHeader.writeUInt32LE(pixelData.length, 20);
163 | dibHeader.writeUInt32LE(0, 24); // X pixels per meter
164 | dibHeader.writeUInt32LE(0, 28); // Y pixels per meter
165 | dibHeader.writeUInt32LE(4, 32); // Number of colors in palette
166 | dibHeader.writeUInt32LE(0, 36); // Important colors
167 |
168 | return Buffer.concat([bmpHeader, dibHeader, palette, pixelData]);
169 | };
170 |
171 | const saveDrawing = async () => {
172 | try {
173 | const imageData = ctx.getImageData(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
174 | const bmpBuffer = createBmpBuffer(imageData);
175 | await Bun.write(SAVE_PATH, bmpBuffer);
176 | } catch (e) {
177 | console.error("Failed to save drawing:", e);
178 | }
179 | };
180 |
181 | const throttledSave = () => {
182 | const now = Date.now();
183 |
184 | if (saveTimeout) {
185 | clearTimeout(saveTimeout);
186 | saveTimeout = null;
187 | }
188 |
189 | if (now - lastSave >= SAVE_THROTTLE) {
190 | saveDrawing();
191 | lastSave = now;
192 | } else {
193 | saveTimeout = setTimeout(() => {
194 | saveDrawing();
195 | lastSave = Date.now();
196 | }, SAVE_THROTTLE) as unknown as NodeJS.Timeout;
197 | }
198 | };
199 |
200 | const handleClear = () => {
201 | ctx.fillStyle = "#ffffff";
202 | ctx.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
203 | throttledSave();
204 | };
205 |
206 | // Create a function to broadcast the current state
207 | const broadcastState = () => {
208 | const pngBuffer = canvas.toBuffer("image/png");
209 | server.publish(
210 | "drawing",
211 | JSON.stringify({
212 | type: "init",
213 | image: pngBuffer.toString("base64"),
214 | })
215 | );
216 | };
217 |
218 | // Set up periodic broadcast
219 | setInterval(broadcastState, 5000);
220 |
221 | const server = Bun.serve({
222 | port: 3001,
223 | fetch(req) {
224 | const url = new URL(req.url);
225 |
226 | if (url.pathname === "/ws") {
227 | const upgraded = server.upgrade(req);
228 | if (!upgraded) {
229 | return new Response("Upgrade failed", { status: 400 });
230 | }
231 | return;
232 | } else if (url.pathname === "/drawing.bmp") {
233 | const imageData = ctx.getImageData(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
234 | const bmpBuffer = createBmpBuffer(imageData);
235 |
236 | return new Response(bmpBuffer, {
237 | headers: {
238 | "Content-Type": "image/bmp",
239 | "Content-Disposition": "attachment; filename=drawing.bmp",
240 | },
241 | });
242 | } else if (url.pathname === "/health") {
243 | return new Response("OK");
244 | }
245 |
246 | return new Response("Bun WebSocket Server");
247 | },
248 | websocket: {
249 | open(ws) {
250 | ws.subscribe("drawing");
251 |
252 | // Send initial state to new client
253 | const pngBuffer = canvas.toBuffer("image/png");
254 | ws.send(
255 | JSON.stringify({
256 | type: "init",
257 | image: pngBuffer.toString("base64"),
258 | })
259 | );
260 | },
261 | message(ws, message) {
262 | const data = JSON.parse(message.toString()) as CanvasAction;
263 |
264 | // Update server-side canvas
265 | switch (data.type) {
266 | case "draw":
267 | if (
268 | !Object.values(colors).includes(data.color) ||
269 | !Object.values(brushSizes).includes(data.brushSize)
270 | )
271 | return;
272 | draw(brush, data.points, data.color, data.brushSize);
273 | throttledSave();
274 | break;
275 | case "fill":
276 | if (!Object.values(colors).includes(data.color)) return;
277 | fill(
278 | ctx as unknown as CanvasRenderingContext2D,
279 | CANVAS_WIDTH,
280 | CANVAS_HEIGHT,
281 | data.x,
282 | data.y,
283 | data.color
284 | );
285 | throttledSave();
286 | break;
287 | case "clear":
288 | handleClear();
289 | break;
290 | }
291 |
292 | // Broadcast to all clients
293 | ws.publish("drawing", message);
294 | },
295 | close(ws) {
296 | ws.unsubscribe("drawing");
297 | },
298 | },
299 | });
300 |
301 | console.log(`WebSocket server listening on port ${server.port}`);
302 |
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef, useState } from "react";
2 | import { Card } from "@/components/ui/card";
3 | import { Button } from "@/components/ui/button";
4 | import { PaintBucket } from "lucide-react";
5 | import {
6 | Dialog,
7 | DialogContent,
8 | DialogDescription,
9 | DialogFooter,
10 | DialogHeader,
11 | DialogTitle,
12 | } from "@/components/ui/dialog";
13 | import PxBrush from "../shared/PxBrush";
14 | import { CanvasAction } from "../shared/Actions";
15 | import { fill, draw, colors, brushSizes } from "../shared/Utilities";
16 |
17 | const DrawingApp = () => {
18 | const [tool, setTool] = useState("brush-medium");
19 | const [color, setColor] = useState(colors.black);
20 | const [showClearConfirm, setShowClearConfirm] = useState(false);
21 | const [isDisconnected, setIsDisconnected] = useState(false);
22 | const canvasRef = useRef(null);
23 | const isDrawingRef = useRef(false);
24 | const wsRef = useRef(null);
25 | const currentLineRef = useRef<{ x: number; y: number }[]>([]);
26 | const brushRef = useRef(null);
27 | const disconnectTimeoutRef = useRef(undefined);
28 | const reconnectTimeoutRef = useRef(undefined);
29 | const reconnectAttemptsRef = useRef(0);
30 | const MAX_RECONNECT_ATTEMPTS = 5;
31 | const INITIAL_RECONNECT_DELAY = 1000;
32 |
33 | const connectWebSocket = () => {
34 | if (wsRef.current && wsRef.current.readyState !== WebSocket.CLOSED) {
35 | return wsRef.current;
36 | }
37 |
38 | if (disconnectTimeoutRef.current) {
39 | clearTimeout(disconnectTimeoutRef.current);
40 | }
41 |
42 | disconnectTimeoutRef.current = setTimeout(() => {
43 | setIsDisconnected(true);
44 | }, 500);
45 |
46 | console.log("Connecting to WebSocket server...");
47 |
48 | const ws = new WebSocket(
49 | `${window.location.protocol === "https:" ? "wss:" : "ws:"}//${window.location.host
50 | }/ws`
51 | );
52 |
53 | ws.onopen = () => {
54 | console.log("Connected to WebSocket server");
55 | clearTimeout(disconnectTimeoutRef.current);
56 | reconnectAttemptsRef.current = 0;
57 | setIsDisconnected(false);
58 | clearTimeout(reconnectTimeoutRef.current);
59 | };
60 |
61 | ws.onclose = () => {
62 | console.log("WebSocket connection closed");
63 | if (wsRef.current !== ws) return;
64 | wsRef.current = null;
65 | setIsDisconnected(true);
66 |
67 | // Only attempt reconnection if we haven't exceeded max attempts
68 | if (reconnectAttemptsRef.current < MAX_RECONNECT_ATTEMPTS) {
69 | const delay = INITIAL_RECONNECT_DELAY * Math.pow(2, reconnectAttemptsRef.current);
70 | console.log(`Attempting to reconnect in ${delay}ms...`);
71 |
72 | reconnectTimeoutRef.current = setTimeout(() => {
73 | reconnectAttemptsRef.current++;
74 | connectWebSocket();
75 | }, delay);
76 | }
77 | };
78 |
79 | ws.onerror = (error) => {
80 | console.error("WebSocket error:", error);
81 | };
82 |
83 | wsRef.current = ws;
84 | return ws;
85 | };
86 |
87 | useEffect(() => {
88 | const canvas = canvasRef.current!;
89 | brushRef.current = new PxBrush(canvas);
90 |
91 | // Initialize canvas with white background
92 | clearCanvas();
93 |
94 | // Create WebSocket connection
95 | const ws = connectWebSocket();
96 |
97 | return () => {
98 | // Clear any pending reconnection attempts
99 | clearTimeout(reconnectTimeoutRef.current);
100 | ws.close();
101 | wsRef.current = null;
102 | };
103 | }, []);
104 |
105 | const clearCanvas = () => {
106 | const canvas = canvasRef.current!;
107 | const context = canvas.getContext("2d")!;
108 | context.fillStyle = colors.white;
109 | context.fillRect(0, 0, canvas.width, canvas.height);
110 | };
111 |
112 | const handleClear = () => {
113 | setShowClearConfirm(true);
114 | };
115 |
116 | const confirmClear = () => {
117 | clearCanvas();
118 | sendUpdate({
119 | type: "clear",
120 | });
121 | setShowClearConfirm(false);
122 | };
123 |
124 | const sendUpdate = (updateData: CanvasAction) => {
125 | if (wsRef.current) {
126 | wsRef.current.send(JSON.stringify(updateData));
127 | }
128 | };
129 |
130 | const getCoordinates = (e: React.MouseEvent | React.TouchEvent) => {
131 | let offsetX = 0,
132 | offsetY = 0;
133 | const target = e.target as HTMLCanvasElement;
134 | if (e.nativeEvent instanceof MouseEvent) {
135 | // Mouse event
136 | const rect = target.getBoundingClientRect();
137 | offsetX = e.nativeEvent.clientX - rect.left;
138 | offsetY = e.nativeEvent.clientY - rect.top;
139 | } else {
140 | // Touch event
141 | const rect = target.getBoundingClientRect();
142 | offsetX = e.nativeEvent.touches[0].clientX - rect.left;
143 | offsetY = e.nativeEvent.touches[0].clientY - rect.top;
144 | }
145 |
146 | // Scale coordinates
147 | offsetX /= target.clientWidth / 800;
148 | offsetY /= target.clientHeight / 480;
149 | return {
150 | x: Math.round(offsetX),
151 | y: Math.round(offsetY),
152 | };
153 | };
154 |
155 | const startDrawing = (e: React.MouseEvent | React.TouchEvent) => {
156 | if (!(e.nativeEvent instanceof MouseEvent)) {
157 | if (e.nativeEvent.touches && e.nativeEvent.touches.length > 1) return;
158 | }
159 | isDrawingRef.current = true;
160 | const { x, y } = getCoordinates(e);
161 | currentLineRef.current = [{ x, y }];
162 | };
163 |
164 | const drawing = (e: React.MouseEvent | React.TouchEvent) => {
165 | if (!isDrawingRef.current) return;
166 | if (tool === "fill") return;
167 | if (!(e.nativeEvent instanceof MouseEvent)) {
168 | if (e.nativeEvent.touches && e.nativeEvent.touches.length > 1) return;
169 | }
170 |
171 | try {
172 | e.preventDefault();
173 | } catch {
174 | // prevent default doesn't work on touch events
175 | }
176 |
177 | const { x, y } = getCoordinates(e);
178 |
179 | brushRef.current?.draw({
180 | from: currentLineRef.current[currentLineRef.current.length - 1],
181 | to: { x, y },
182 | color: color,
183 | size: brushSizes[tool],
184 | });
185 |
186 | currentLineRef.current = [...currentLineRef.current, { x, y }];
187 | };
188 |
189 | const endDrawing = () => {
190 | if (!isDrawingRef.current) return;
191 | if (tool === "fill") return;
192 | isDrawingRef.current = false;
193 |
194 | if (currentLineRef.current.length > 0) {
195 | if (currentLineRef.current.length === 1) {
196 | // Draw a single point
197 | brushRef.current?.draw({
198 | from: currentLineRef.current[0],
199 | to: currentLineRef.current[0],
200 | color: color,
201 | size: brushSizes[tool],
202 | });
203 | }
204 | sendUpdate({
205 | type: "draw",
206 | points: currentLineRef.current,
207 | color: color,
208 | brushSize: brushSizes[tool],
209 | });
210 | }
211 |
212 | currentLineRef.current = [];
213 | };
214 |
215 | const handleFill = (e: React.MouseEvent | React.TouchEvent) => {
216 | if (tool !== "fill") return;
217 |
218 | const { x, y } = getCoordinates(e);
219 |
220 | floodFill(x, y, color);
221 |
222 | sendUpdate({
223 | type: "fill",
224 | x,
225 | y,
226 | color: color,
227 | });
228 | };
229 |
230 | const floodFill = (startX: number, startY: number, fillColor: string) => {
231 | const canvas = canvasRef.current!;
232 | const context = canvas.getContext("2d")!;
233 | fill(context, canvas.width, canvas.height, startX, startY, fillColor);
234 | };
235 |
236 | const drawLine = (
237 | points: { x: number; y: number }[],
238 | color: string,
239 | brushSize: number
240 | ) => {
241 | draw(brushRef.current!, points, color, brushSize);
242 | };
243 |
244 | // eslint-disable-next-line react-hooks/exhaustive-deps
245 | const handleDrawingUpdate = (
246 | data: CanvasAction,
247 | context: CanvasRenderingContext2D
248 | ) => {
249 | switch (data.type) {
250 | case "init": {
251 | // Load the initial canvas state
252 | const img = new Image();
253 | img.onload = () => {
254 | context.drawImage(img, 0, 0);
255 | // Redraw current line if one is in progress
256 | if (currentLineRef.current.length > 0 && tool !== "fill") {
257 | drawLine(currentLineRef.current, color, brushSizes[tool]);
258 | }
259 | };
260 | img.src = `data:image/png;base64,${data.image}`;
261 | break;
262 | }
263 | case "draw": {
264 | drawLine(data.points, data.color, data.brushSize);
265 | break;
266 | }
267 | case "fill":
268 | floodFill(data.x, data.y, data.color);
269 | break;
270 | case "clear":
271 | clearCanvas();
272 | break;
273 | }
274 | };
275 |
276 | useEffect(() => {
277 | if (wsRef.current) {
278 | wsRef.current.onmessage = (event) => {
279 | const data = JSON.parse(event.data);
280 | const canvas = canvasRef.current!;
281 | const context = canvas.getContext("2d")!;
282 | handleDrawingUpdate(data, context);
283 | };
284 | }
285 | }, [handleDrawingUpdate]);
286 |
287 | return (
288 |
289 |
290 |
291 | 🎉 {import.meta.env.VITE_WEB_TITLE}
292 |
293 |
294 |
295 | {Object.entries(brushSizes).map(([toolType, toolSize]) => {
296 | return (
297 |
313 | );
314 | })}
315 |
324 |
325 |
326 |
327 | {Object.entries(colors).map(([name, colorValue]) => (
328 |
340 |
341 |
344 |
345 |
346 |
347 |
387 |
388 |
410 |
411 |
433 |
434 | );
435 | };
436 |
437 | export default DrawingApp;
438 |
--------------------------------------------------------------------------------
/3d-files/back.step:
--------------------------------------------------------------------------------
1 | ISO-10303-21;
2 | HEADER;
3 | /* Generated by software containing ST-Developer
4 | * from STEP Tools, Inc. (www.steptools.com)
5 | */
6 |
7 | FILE_DESCRIPTION(
8 | /* description */ ('',
9 | 'CAx-IF Rec.Pracs.---Representation and Presentation of Product Manufa
10 | cturing Information (PMI)---4.0---2014-10-13'),
11 | /* implementation_level */ '2;1');
12 |
13 | FILE_NAME(
14 | /* name */ 'back.step',
15 | /* time_stamp */ '2025-01-26T21:29:15-08:00',
16 | /* author */ (''),
17 | /* organization */ (''),
18 | /* preprocessor_version */ 'ST-DEVELOPER v20',
19 | /* originating_system */ 'Autodesk Translation Framework v13.20.0.188',
20 |
21 | /* authorisation */ '');
22 |
23 | FILE_SCHEMA (('AP242_MANAGED_MODEL_BASED_3D_ENGINEERING_MIM_LF { 1 0 10303 442 1 1 4 }'));
24 | ENDSEC;
25 |
26 | DATA;
27 | #10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#459);
28 | #11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#466,#12);
29 | #12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#458);
30 | #13=STYLED_ITEM('',(#475),#14);
31 | #14=MANIFOLD_SOLID_BREP('Body1',#271);
32 | #15=FACE_BOUND('',#48,.T.);
33 | #16=FACE_BOUND('',#58,.T.);
34 | #17=CIRCLE('',#287,0.5);
35 | #18=CIRCLE('',#288,0.5);
36 | #19=CIRCLE('',#291,0.5);
37 | #20=CIRCLE('',#292,0.5);
38 | #21=CIRCLE('',#294,3.);
39 | #22=CIRCLE('',#295,3.);
40 | #23=CIRCLE('',#297,3.);
41 | #24=CIRCLE('',#300,3.);
42 | #25=CYLINDRICAL_SURFACE('',#286,0.5);
43 | #26=CYLINDRICAL_SURFACE('',#290,0.5);
44 | #27=CYLINDRICAL_SURFACE('',#296,3.);
45 | #28=CYLINDRICAL_SURFACE('',#299,3.);
46 | #29=FACE_OUTER_BOUND('',#43,.T.);
47 | #30=FACE_OUTER_BOUND('',#44,.T.);
48 | #31=FACE_OUTER_BOUND('',#45,.T.);
49 | #32=FACE_OUTER_BOUND('',#46,.T.);
50 | #33=FACE_OUTER_BOUND('',#47,.T.);
51 | #34=FACE_OUTER_BOUND('',#49,.T.);
52 | #35=FACE_OUTER_BOUND('',#50,.T.);
53 | #36=FACE_OUTER_BOUND('',#51,.T.);
54 | #37=FACE_OUTER_BOUND('',#52,.T.);
55 | #38=FACE_OUTER_BOUND('',#53,.T.);
56 | #39=FACE_OUTER_BOUND('',#54,.T.);
57 | #40=FACE_OUTER_BOUND('',#55,.T.);
58 | #41=FACE_OUTER_BOUND('',#56,.T.);
59 | #42=FACE_OUTER_BOUND('',#57,.T.);
60 | #43=EDGE_LOOP('',(#175,#176,#177,#178));
61 | #44=EDGE_LOOP('',(#179,#180,#181,#182));
62 | #45=EDGE_LOOP('',(#183,#184,#185,#186));
63 | #46=EDGE_LOOP('',(#187,#188,#189,#190));
64 | #47=EDGE_LOOP('',(#191,#192,#193,#194,#195,#196));
65 | #48=EDGE_LOOP('',(#197,#198,#199,#200));
66 | #49=EDGE_LOOP('',(#201,#202,#203,#204));
67 | #50=EDGE_LOOP('',(#205,#206,#207,#208));
68 | #51=EDGE_LOOP('',(#209,#210,#211,#212));
69 | #52=EDGE_LOOP('',(#213,#214,#215,#216));
70 | #53=EDGE_LOOP('',(#217,#218,#219,#220,#221,#222));
71 | #54=EDGE_LOOP('',(#223,#224,#225,#226));
72 | #55=EDGE_LOOP('',(#227,#228,#229,#230,#231,#232));
73 | #56=EDGE_LOOP('',(#233,#234,#235,#236));
74 | #57=EDGE_LOOP('',(#237,#238,#239,#240,#241,#242));
75 | #58=EDGE_LOOP('',(#243,#244,#245,#246));
76 | #59=LINE('',#385,#87);
77 | #60=LINE('',#387,#88);
78 | #61=LINE('',#389,#89);
79 | #62=LINE('',#390,#90);
80 | #63=LINE('',#396,#91);
81 | #64=LINE('',#399,#92);
82 | #65=LINE('',#402,#93);
83 | #66=LINE('',#404,#94);
84 | #67=LINE('',#405,#95);
85 | #68=LINE('',#410,#96);
86 | #69=LINE('',#417,#97);
87 | #70=LINE('',#420,#98);
88 | #71=LINE('',#421,#99);
89 | #72=LINE('',#423,#100);
90 | #73=LINE('',#425,#101);
91 | #74=LINE('',#426,#102);
92 | #75=LINE('',#431,#103);
93 | #76=LINE('',#432,#104);
94 | #77=LINE('',#434,#105);
95 | #78=LINE('',#439,#106);
96 | #79=LINE('',#440,#107);
97 | #80=LINE('',#442,#108);
98 | #81=LINE('',#445,#109);
99 | #82=LINE('',#446,#110);
100 | #83=LINE('',#449,#111);
101 | #84=LINE('',#450,#112);
102 | #85=LINE('',#452,#113);
103 | #86=LINE('',#454,#114);
104 | #87=VECTOR('',#311,10.);
105 | #88=VECTOR('',#312,10.);
106 | #89=VECTOR('',#313,10.);
107 | #90=VECTOR('',#314,10.);
108 | #91=VECTOR('',#319,10.);
109 | #92=VECTOR('',#322,10.);
110 | #93=VECTOR('',#325,10.);
111 | #94=VECTOR('',#326,10.);
112 | #95=VECTOR('',#327,10.);
113 | #96=VECTOR('',#332,10.);
114 | #97=VECTOR('',#339,10.);
115 | #98=VECTOR('',#342,10.);
116 | #99=VECTOR('',#343,10.);
117 | #100=VECTOR('',#344,10.);
118 | #101=VECTOR('',#345,10.);
119 | #102=VECTOR('',#346,10.);
120 | #103=VECTOR('',#351,10.);
121 | #104=VECTOR('',#352,10.);
122 | #105=VECTOR('',#355,10.);
123 | #106=VECTOR('',#360,10.);
124 | #107=VECTOR('',#361,10.);
125 | #108=VECTOR('',#364,10.);
126 | #109=VECTOR('',#367,10.);
127 | #110=VECTOR('',#368,10.);
128 | #111=VECTOR('',#371,10.);
129 | #112=VECTOR('',#372,10.);
130 | #113=VECTOR('',#375,10.);
131 | #114=VECTOR('',#378,10.);
132 | #115=VERTEX_POINT('',#383);
133 | #116=VERTEX_POINT('',#384);
134 | #117=VERTEX_POINT('',#386);
135 | #118=VERTEX_POINT('',#388);
136 | #119=VERTEX_POINT('',#392);
137 | #120=VERTEX_POINT('',#393);
138 | #121=VERTEX_POINT('',#395);
139 | #122=VERTEX_POINT('',#397);
140 | #123=VERTEX_POINT('',#401);
141 | #124=VERTEX_POINT('',#403);
142 | #125=VERTEX_POINT('',#407);
143 | #126=VERTEX_POINT('',#409);
144 | #127=VERTEX_POINT('',#413);
145 | #128=VERTEX_POINT('',#414);
146 | #129=VERTEX_POINT('',#416);
147 | #130=VERTEX_POINT('',#418);
148 | #131=VERTEX_POINT('',#422);
149 | #132=VERTEX_POINT('',#424);
150 | #133=VERTEX_POINT('',#428);
151 | #134=VERTEX_POINT('',#429);
152 | #135=VERTEX_POINT('',#436);
153 | #136=VERTEX_POINT('',#437);
154 | #137=VERTEX_POINT('',#444);
155 | #138=VERTEX_POINT('',#448);
156 | #139=EDGE_CURVE('',#115,#116,#59,.T.);
157 | #140=EDGE_CURVE('',#117,#116,#60,.T.);
158 | #141=EDGE_CURVE('',#118,#117,#61,.T.);
159 | #142=EDGE_CURVE('',#115,#118,#62,.T.);
160 | #143=EDGE_CURVE('',#119,#120,#17,.F.);
161 | #144=EDGE_CURVE('',#120,#121,#63,.T.);
162 | #145=EDGE_CURVE('',#121,#122,#18,.F.);
163 | #146=EDGE_CURVE('',#122,#119,#64,.T.);
164 | #147=EDGE_CURVE('',#123,#120,#65,.T.);
165 | #148=EDGE_CURVE('',#124,#123,#66,.T.);
166 | #149=EDGE_CURVE('',#124,#121,#67,.T.);
167 | #150=EDGE_CURVE('',#123,#125,#19,.F.);
168 | #151=EDGE_CURVE('',#125,#126,#68,.T.);
169 | #152=EDGE_CURVE('',#126,#124,#20,.F.);
170 | #153=EDGE_CURVE('',#127,#128,#21,.T.);
171 | #154=EDGE_CURVE('',#127,#129,#69,.T.);
172 | #155=EDGE_CURVE('',#130,#129,#22,.T.);
173 | #156=EDGE_CURVE('',#130,#117,#70,.T.);
174 | #157=EDGE_CURVE('',#116,#128,#71,.T.);
175 | #158=EDGE_CURVE('',#126,#131,#72,.T.);
176 | #159=EDGE_CURVE('',#132,#125,#73,.T.);
177 | #160=EDGE_CURVE('',#131,#132,#74,.T.);
178 | #161=EDGE_CURVE('',#133,#134,#23,.T.);
179 | #162=EDGE_CURVE('',#134,#127,#75,.T.);
180 | #163=EDGE_CURVE('',#128,#133,#76,.T.);
181 | #164=EDGE_CURVE('',#133,#115,#77,.T.);
182 | #165=EDGE_CURVE('',#135,#136,#24,.T.);
183 | #166=EDGE_CURVE('',#136,#130,#78,.T.);
184 | #167=EDGE_CURVE('',#129,#135,#79,.T.);
185 | #168=EDGE_CURVE('',#118,#136,#80,.T.);
186 | #169=EDGE_CURVE('',#137,#119,#81,.T.);
187 | #170=EDGE_CURVE('',#132,#137,#82,.T.);
188 | #171=EDGE_CURVE('',#138,#137,#83,.T.);
189 | #172=EDGE_CURVE('',#131,#138,#84,.T.);
190 | #173=EDGE_CURVE('',#122,#138,#85,.T.);
191 | #174=EDGE_CURVE('',#135,#134,#86,.T.);
192 | #175=ORIENTED_EDGE('',*,*,#139,.T.);
193 | #176=ORIENTED_EDGE('',*,*,#140,.F.);
194 | #177=ORIENTED_EDGE('',*,*,#141,.F.);
195 | #178=ORIENTED_EDGE('',*,*,#142,.F.);
196 | #179=ORIENTED_EDGE('',*,*,#143,.T.);
197 | #180=ORIENTED_EDGE('',*,*,#144,.T.);
198 | #181=ORIENTED_EDGE('',*,*,#145,.T.);
199 | #182=ORIENTED_EDGE('',*,*,#146,.T.);
200 | #183=ORIENTED_EDGE('',*,*,#144,.F.);
201 | #184=ORIENTED_EDGE('',*,*,#147,.F.);
202 | #185=ORIENTED_EDGE('',*,*,#148,.F.);
203 | #186=ORIENTED_EDGE('',*,*,#149,.T.);
204 | #187=ORIENTED_EDGE('',*,*,#150,.T.);
205 | #188=ORIENTED_EDGE('',*,*,#151,.T.);
206 | #189=ORIENTED_EDGE('',*,*,#152,.T.);
207 | #190=ORIENTED_EDGE('',*,*,#148,.T.);
208 | #191=ORIENTED_EDGE('',*,*,#153,.F.);
209 | #192=ORIENTED_EDGE('',*,*,#154,.T.);
210 | #193=ORIENTED_EDGE('',*,*,#155,.F.);
211 | #194=ORIENTED_EDGE('',*,*,#156,.T.);
212 | #195=ORIENTED_EDGE('',*,*,#140,.T.);
213 | #196=ORIENTED_EDGE('',*,*,#157,.T.);
214 | #197=ORIENTED_EDGE('',*,*,#158,.F.);
215 | #198=ORIENTED_EDGE('',*,*,#151,.F.);
216 | #199=ORIENTED_EDGE('',*,*,#159,.F.);
217 | #200=ORIENTED_EDGE('',*,*,#160,.F.);
218 | #201=ORIENTED_EDGE('',*,*,#161,.T.);
219 | #202=ORIENTED_EDGE('',*,*,#162,.T.);
220 | #203=ORIENTED_EDGE('',*,*,#153,.T.);
221 | #204=ORIENTED_EDGE('',*,*,#163,.T.);
222 | #205=ORIENTED_EDGE('',*,*,#163,.F.);
223 | #206=ORIENTED_EDGE('',*,*,#157,.F.);
224 | #207=ORIENTED_EDGE('',*,*,#139,.F.);
225 | #208=ORIENTED_EDGE('',*,*,#164,.F.);
226 | #209=ORIENTED_EDGE('',*,*,#165,.T.);
227 | #210=ORIENTED_EDGE('',*,*,#166,.T.);
228 | #211=ORIENTED_EDGE('',*,*,#155,.T.);
229 | #212=ORIENTED_EDGE('',*,*,#167,.T.);
230 | #213=ORIENTED_EDGE('',*,*,#166,.F.);
231 | #214=ORIENTED_EDGE('',*,*,#168,.F.);
232 | #215=ORIENTED_EDGE('',*,*,#141,.T.);
233 | #216=ORIENTED_EDGE('',*,*,#156,.F.);
234 | #217=ORIENTED_EDGE('',*,*,#159,.T.);
235 | #218=ORIENTED_EDGE('',*,*,#150,.F.);
236 | #219=ORIENTED_EDGE('',*,*,#147,.T.);
237 | #220=ORIENTED_EDGE('',*,*,#143,.F.);
238 | #221=ORIENTED_EDGE('',*,*,#169,.F.);
239 | #222=ORIENTED_EDGE('',*,*,#170,.F.);
240 | #223=ORIENTED_EDGE('',*,*,#160,.T.);
241 | #224=ORIENTED_EDGE('',*,*,#170,.T.);
242 | #225=ORIENTED_EDGE('',*,*,#171,.F.);
243 | #226=ORIENTED_EDGE('',*,*,#172,.F.);
244 | #227=ORIENTED_EDGE('',*,*,#158,.T.);
245 | #228=ORIENTED_EDGE('',*,*,#172,.T.);
246 | #229=ORIENTED_EDGE('',*,*,#173,.F.);
247 | #230=ORIENTED_EDGE('',*,*,#145,.F.);
248 | #231=ORIENTED_EDGE('',*,*,#149,.F.);
249 | #232=ORIENTED_EDGE('',*,*,#152,.F.);
250 | #233=ORIENTED_EDGE('',*,*,#162,.F.);
251 | #234=ORIENTED_EDGE('',*,*,#174,.F.);
252 | #235=ORIENTED_EDGE('',*,*,#167,.F.);
253 | #236=ORIENTED_EDGE('',*,*,#154,.F.);
254 | #237=ORIENTED_EDGE('',*,*,#161,.F.);
255 | #238=ORIENTED_EDGE('',*,*,#164,.T.);
256 | #239=ORIENTED_EDGE('',*,*,#142,.T.);
257 | #240=ORIENTED_EDGE('',*,*,#168,.T.);
258 | #241=ORIENTED_EDGE('',*,*,#165,.F.);
259 | #242=ORIENTED_EDGE('',*,*,#174,.T.);
260 | #243=ORIENTED_EDGE('',*,*,#173,.T.);
261 | #244=ORIENTED_EDGE('',*,*,#171,.T.);
262 | #245=ORIENTED_EDGE('',*,*,#169,.T.);
263 | #246=ORIENTED_EDGE('',*,*,#146,.F.);
264 | #247=PLANE('',#285);
265 | #248=PLANE('',#289);
266 | #249=PLANE('',#293);
267 | #250=PLANE('',#298);
268 | #251=PLANE('',#301);
269 | #252=PLANE('',#302);
270 | #253=PLANE('',#303);
271 | #254=PLANE('',#304);
272 | #255=PLANE('',#305);
273 | #256=PLANE('',#306);
274 | #257=ADVANCED_FACE('',(#29),#247,.T.);
275 | #258=ADVANCED_FACE('',(#30),#25,.T.);
276 | #259=ADVANCED_FACE('',(#31),#248,.T.);
277 | #260=ADVANCED_FACE('',(#32),#26,.T.);
278 | #261=ADVANCED_FACE('',(#33,#15),#249,.F.);
279 | #262=ADVANCED_FACE('',(#34),#27,.T.);
280 | #263=ADVANCED_FACE('',(#35),#250,.T.);
281 | #264=ADVANCED_FACE('',(#36),#28,.T.);
282 | #265=ADVANCED_FACE('',(#37),#251,.T.);
283 | #266=ADVANCED_FACE('',(#38),#252,.T.);
284 | #267=ADVANCED_FACE('',(#39),#253,.T.);
285 | #268=ADVANCED_FACE('',(#40),#254,.T.);
286 | #269=ADVANCED_FACE('',(#41),#255,.T.);
287 | #270=ADVANCED_FACE('',(#42,#16),#256,.T.);
288 | #271=CLOSED_SHELL('',(#257,#258,#259,#260,#261,#262,#263,#264,#265,#266,
289 | #267,#268,#269,#270));
290 | #272=DERIVED_UNIT_ELEMENT(#274,1.);
291 | #273=DERIVED_UNIT_ELEMENT(#461,-3.);
292 | #274=(
293 | MASS_UNIT()
294 | NAMED_UNIT(*)
295 | SI_UNIT(.KILO.,.GRAM.)
296 | );
297 | #275=DERIVED_UNIT((#272,#273));
298 | #276=MEASURE_REPRESENTATION_ITEM('density measure',
299 | POSITIVE_RATIO_MEASURE(7850.),#275);
300 | #277=PROPERTY_DEFINITION_REPRESENTATION(#282,#279);
301 | #278=PROPERTY_DEFINITION_REPRESENTATION(#283,#280);
302 | #279=REPRESENTATION('material name',(#281),#458);
303 | #280=REPRESENTATION('density',(#276),#458);
304 | #281=DESCRIPTIVE_REPRESENTATION_ITEM('Steel','Steel');
305 | #282=PROPERTY_DEFINITION('material property','material name',#468);
306 | #283=PROPERTY_DEFINITION('material property','density of part',#468);
307 | #284=AXIS2_PLACEMENT_3D('',#381,#307,#308);
308 | #285=AXIS2_PLACEMENT_3D('',#382,#309,#310);
309 | #286=AXIS2_PLACEMENT_3D('',#391,#315,#316);
310 | #287=AXIS2_PLACEMENT_3D('',#394,#317,#318);
311 | #288=AXIS2_PLACEMENT_3D('',#398,#320,#321);
312 | #289=AXIS2_PLACEMENT_3D('',#400,#323,#324);
313 | #290=AXIS2_PLACEMENT_3D('',#406,#328,#329);
314 | #291=AXIS2_PLACEMENT_3D('',#408,#330,#331);
315 | #292=AXIS2_PLACEMENT_3D('',#411,#333,#334);
316 | #293=AXIS2_PLACEMENT_3D('',#412,#335,#336);
317 | #294=AXIS2_PLACEMENT_3D('',#415,#337,#338);
318 | #295=AXIS2_PLACEMENT_3D('',#419,#340,#341);
319 | #296=AXIS2_PLACEMENT_3D('',#427,#347,#348);
320 | #297=AXIS2_PLACEMENT_3D('',#430,#349,#350);
321 | #298=AXIS2_PLACEMENT_3D('',#433,#353,#354);
322 | #299=AXIS2_PLACEMENT_3D('',#435,#356,#357);
323 | #300=AXIS2_PLACEMENT_3D('',#438,#358,#359);
324 | #301=AXIS2_PLACEMENT_3D('',#441,#362,#363);
325 | #302=AXIS2_PLACEMENT_3D('',#443,#365,#366);
326 | #303=AXIS2_PLACEMENT_3D('',#447,#369,#370);
327 | #304=AXIS2_PLACEMENT_3D('',#451,#373,#374);
328 | #305=AXIS2_PLACEMENT_3D('',#453,#376,#377);
329 | #306=AXIS2_PLACEMENT_3D('',#455,#379,#380);
330 | #307=DIRECTION('axis',(0.,0.,1.));
331 | #308=DIRECTION('refdir',(1.,0.,0.));
332 | #309=DIRECTION('center_axis',(0.,-0.90630778703665,0.422618261740699));
333 | #310=DIRECTION('ref_axis',(0.,0.422618261740699,0.90630778703665));
334 | #311=DIRECTION('',(2.93250328007241E-17,-0.422618261740699,-0.90630778703665));
335 | #312=DIRECTION('',(-1.,0.,0.));
336 | #313=DIRECTION('',(0.,-0.422618261740699,-0.90630778703665));
337 | #314=DIRECTION('',(1.,5.01795717344704E-17,0.));
338 | #315=DIRECTION('center_axis',(1.,0.,0.));
339 | #316=DIRECTION('ref_axis',(0.,-0.707106781186546,0.707106781186549));
340 | #317=DIRECTION('center_axis',(-1.,0.,0.));
341 | #318=DIRECTION('ref_axis',(0.,-0.707106781186546,0.707106781186549));
342 | #319=DIRECTION('',(1.,0.,0.));
343 | #320=DIRECTION('center_axis',(1.,0.,0.));
344 | #321=DIRECTION('ref_axis',(0.,-0.707106781186546,0.707106781186549));
345 | #322=DIRECTION('',(-1.,0.,0.));
346 | #323=DIRECTION('center_axis',(0.,-1.,0.));
347 | #324=DIRECTION('ref_axis',(1.,0.,0.));
348 | #325=DIRECTION('',(0.,0.,1.));
349 | #326=DIRECTION('',(-1.,0.,0.));
350 | #327=DIRECTION('',(0.,0.,1.));
351 | #328=DIRECTION('center_axis',(1.,0.,0.));
352 | #329=DIRECTION('ref_axis',(0.,-0.707106781186546,-0.707106781186549));
353 | #330=DIRECTION('center_axis',(-1.,0.,0.));
354 | #331=DIRECTION('ref_axis',(0.,-0.707106781186546,-0.707106781186549));
355 | #332=DIRECTION('',(1.,0.,0.));
356 | #333=DIRECTION('center_axis',(1.,0.,0.));
357 | #334=DIRECTION('ref_axis',(0.,-0.707106781186546,-0.707106781186549));
358 | #335=DIRECTION('center_axis',(0.,0.,1.));
359 | #336=DIRECTION('ref_axis',(1.,0.,0.));
360 | #337=DIRECTION('center_axis',(0.,0.,1.));
361 | #338=DIRECTION('ref_axis',(-0.707106781186548,0.707106781186548,0.));
362 | #339=DIRECTION('',(1.,0.,0.));
363 | #340=DIRECTION('center_axis',(0.,0.,1.));
364 | #341=DIRECTION('ref_axis',(0.707106781186543,0.707106781186552,0.));
365 | #342=DIRECTION('',(0.,-1.,0.));
366 | #343=DIRECTION('',(-6.93889390390723E-17,1.,0.));
367 | #344=DIRECTION('',(0.,-1.,0.));
368 | #345=DIRECTION('',(0.,1.,0.));
369 | #346=DIRECTION('',(-1.,0.,0.));
370 | #347=DIRECTION('center_axis',(0.,0.,1.));
371 | #348=DIRECTION('ref_axis',(-0.707106781186548,0.707106781186548,0.));
372 | #349=DIRECTION('center_axis',(0.,0.,-1.));
373 | #350=DIRECTION('ref_axis',(-0.707106781186548,0.707106781186548,0.));
374 | #351=DIRECTION('',(0.,0.,-1.));
375 | #352=DIRECTION('',(0.,0.,1.));
376 | #353=DIRECTION('center_axis',(-1.,-6.93889390390723E-17,0.));
377 | #354=DIRECTION('ref_axis',(6.93889390390723E-17,-1.,0.));
378 | #355=DIRECTION('',(6.93889390390723E-17,-1.,0.));
379 | #356=DIRECTION('center_axis',(0.,0.,1.));
380 | #357=DIRECTION('ref_axis',(0.707106781186543,0.707106781186552,0.));
381 | #358=DIRECTION('center_axis',(0.,0.,-1.));
382 | #359=DIRECTION('ref_axis',(0.707106781186543,0.707106781186552,0.));
383 | #360=DIRECTION('',(0.,0.,-1.));
384 | #361=DIRECTION('',(0.,0.,1.));
385 | #362=DIRECTION('center_axis',(1.,2.77555756156289E-16,0.));
386 | #363=DIRECTION('ref_axis',(-2.77555756156289E-16,1.,0.));
387 | #364=DIRECTION('',(-2.77555756156289E-16,1.,0.));
388 | #365=DIRECTION('center_axis',(1.,0.,0.));
389 | #366=DIRECTION('ref_axis',(0.,1.,0.));
390 | #367=DIRECTION('',(0.,1.,0.));
391 | #368=DIRECTION('',(0.,0.,1.));
392 | #369=DIRECTION('center_axis',(0.,1.,0.));
393 | #370=DIRECTION('ref_axis',(-1.,0.,0.));
394 | #371=DIRECTION('',(-1.,0.,0.));
395 | #372=DIRECTION('',(0.,0.,1.));
396 | #373=DIRECTION('center_axis',(-1.,0.,0.));
397 | #374=DIRECTION('ref_axis',(0.,-1.,0.));
398 | #375=DIRECTION('',(0.,-1.,0.));
399 | #376=DIRECTION('center_axis',(0.,1.,0.));
400 | #377=DIRECTION('ref_axis',(-1.,0.,0.));
401 | #378=DIRECTION('',(-1.,0.,0.));
402 | #379=DIRECTION('center_axis',(0.,0.,1.));
403 | #380=DIRECTION('ref_axis',(1.,0.,0.));
404 | #381=CARTESIAN_POINT('',(0.,0.,0.));
405 | #382=CARTESIAN_POINT('Origin',(248.306319586527,-37.4325162682027,2.77555756156289E-16));
406 | #383=CARTESIAN_POINT('',(71.3063195865273,-36.7330547809702,1.5));
407 | #384=CARTESIAN_POINT('',(71.3063195865273,-37.4325162682027,0.));
408 | #385=CARTESIAN_POINT('',(71.3063195865273,-37.2576508963946,0.374999999999999));
409 | #386=CARTESIAN_POINT('',(248.306319586527,-37.4325162682027,0.));
410 | #387=CARTESIAN_POINT('',(248.306319586527,-37.4325162682027,0.));
411 | #388=CARTESIAN_POINT('',(248.306319586527,-36.7330547809702,1.5));
412 | #389=CARTESIAN_POINT('',(248.306319586527,-36.7330547809702,1.5));
413 | #390=CARTESIAN_POINT('',(248.306319586527,-36.7330547809702,1.5));
414 | #391=CARTESIAN_POINT('Origin',(154.806319586527,-24.8328779786154,1.));
415 | #392=CARTESIAN_POINT('',(149.806319586527,-24.8328779786154,1.5));
416 | #393=CARTESIAN_POINT('',(149.806319586527,-25.3328779786154,1.));
417 | #394=CARTESIAN_POINT('Origin',(149.806319586527,-24.8328779786154,1.));
418 | #395=CARTESIAN_POINT('',(169.806319586527,-25.3328779786154,1.));
419 | #396=CARTESIAN_POINT('',(154.806319586527,-25.3328779786154,1.));
420 | #397=CARTESIAN_POINT('',(169.806319586527,-24.8328779786154,1.5));
421 | #398=CARTESIAN_POINT('Origin',(169.806319586527,-24.8328779786154,1.));
422 | #399=CARTESIAN_POINT('',(154.806319586527,-24.8328779786154,1.5));
423 | #400=CARTESIAN_POINT('Origin',(149.806319586527,-25.3328779786154,0.));
424 | #401=CARTESIAN_POINT('',(149.806319586527,-25.3328779786154,0.5));
425 | #402=CARTESIAN_POINT('',(149.806319586527,-25.3328779786154,0.));
426 | #403=CARTESIAN_POINT('',(169.806319586527,-25.3328779786154,0.5));
427 | #404=CARTESIAN_POINT('',(154.806319586527,-25.3328779786154,0.5));
428 | #405=CARTESIAN_POINT('',(169.806319586527,-25.3328779786154,0.));
429 | #406=CARTESIAN_POINT('Origin',(154.806319586527,-24.8328779786154,0.5));
430 | #407=CARTESIAN_POINT('',(149.806319586527,-24.8328779786154,0.));
431 | #408=CARTESIAN_POINT('Origin',(149.806319586527,-24.8328779786154,0.5));
432 | #409=CARTESIAN_POINT('',(169.806319586527,-24.8328779786154,0.));
433 | #410=CARTESIAN_POINT('',(154.806319586527,-24.8328779786154,0.));
434 | #411=CARTESIAN_POINT('Origin',(169.806319586527,-24.8328779786154,0.5));
435 | #412=CARTESIAN_POINT('Origin',(159.806319586527,27.2669452190298,0.));
436 | #413=CARTESIAN_POINT('',(74.3063195865273,91.2669452190299,0.));
437 | #414=CARTESIAN_POINT('',(71.3063195865273,88.2669452190299,0.));
438 | #415=CARTESIAN_POINT('Origin',(74.3063195865273,88.2669452190299,0.));
439 | #416=CARTESIAN_POINT('',(245.306319586527,91.2669452190299,0.));
440 | #417=CARTESIAN_POINT('',(71.3063195865273,91.2669452190299,0.));
441 | #418=CARTESIAN_POINT('',(248.306319586527,88.2669452190299,0.));
442 | #419=CARTESIAN_POINT('Origin',(245.306319586527,88.2669452190299,0.));
443 | #420=CARTESIAN_POINT('',(248.306319586527,-36.7330547809702,0.));
444 | #421=CARTESIAN_POINT('',(71.3063195865273,-36.7330547809702,0.));
445 | #422=CARTESIAN_POINT('',(169.806319586527,-33.3330547809702,0.));
446 | #423=CARTESIAN_POINT('',(169.806319586527,-33.3330547809702,0.));
447 | #424=CARTESIAN_POINT('',(149.806319586527,-33.3330547809702,0.));
448 | #425=CARTESIAN_POINT('',(149.806319586527,-23.3330547809702,0.));
449 | #426=CARTESIAN_POINT('',(244.906319586527,-33.3330547809702,0.));
450 | #427=CARTESIAN_POINT('Origin',(74.3063195865273,88.2669452190299,0.));
451 | #428=CARTESIAN_POINT('',(71.3063195865273,88.2669452190299,1.5));
452 | #429=CARTESIAN_POINT('',(74.3063195865273,91.2669452190299,1.5));
453 | #430=CARTESIAN_POINT('Origin',(74.3063195865273,88.2669452190299,1.5));
454 | #431=CARTESIAN_POINT('',(74.3063195865273,91.2669452190299,0.));
455 | #432=CARTESIAN_POINT('',(71.3063195865273,88.2669452190299,0.));
456 | #433=CARTESIAN_POINT('Origin',(71.3063195865273,91.2669452190299,0.));
457 | #434=CARTESIAN_POINT('',(71.3063195865273,-36.7330547809702,1.5));
458 | #435=CARTESIAN_POINT('Origin',(245.306319586527,88.2669452190299,0.));
459 | #436=CARTESIAN_POINT('',(245.306319586527,91.2669452190299,1.5));
460 | #437=CARTESIAN_POINT('',(248.306319586527,88.2669452190299,1.5));
461 | #438=CARTESIAN_POINT('Origin',(245.306319586527,88.2669452190299,1.5));
462 | #439=CARTESIAN_POINT('',(248.306319586527,88.2669452190299,0.));
463 | #440=CARTESIAN_POINT('',(245.306319586527,91.2669452190299,0.));
464 | #441=CARTESIAN_POINT('Origin',(248.306319586527,-36.7330547809702,0.));
465 | #442=CARTESIAN_POINT('',(248.306319586527,91.2669452190299,1.5));
466 | #443=CARTESIAN_POINT('Origin',(149.806319586527,-33.3330547809702,0.));
467 | #444=CARTESIAN_POINT('',(149.806319586527,-33.3330547809702,1.5));
468 | #445=CARTESIAN_POINT('',(149.806319586527,-23.3330547809702,1.5));
469 | #446=CARTESIAN_POINT('',(149.806319586527,-33.3330547809702,0.));
470 | #447=CARTESIAN_POINT('Origin',(169.806319586527,-33.3330547809702,0.));
471 | #448=CARTESIAN_POINT('',(169.806319586527,-33.3330547809702,1.5));
472 | #449=CARTESIAN_POINT('',(244.906319586527,-33.3330547809702,1.5));
473 | #450=CARTESIAN_POINT('',(169.806319586527,-33.3330547809702,0.));
474 | #451=CARTESIAN_POINT('Origin',(169.806319586527,-25.3328779786154,0.));
475 | #452=CARTESIAN_POINT('',(169.806319586527,-33.3330547809702,1.5));
476 | #453=CARTESIAN_POINT('Origin',(248.306319586527,91.2669452190299,0.));
477 | #454=CARTESIAN_POINT('',(71.3063195865273,91.2669452190299,1.5));
478 | #455=CARTESIAN_POINT('Origin',(159.806319586527,27.2669452190298,1.5));
479 | #456=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#460,
480 | 'DISTANCE_ACCURACY_VALUE',
481 | 'Maximum model space distance between geometric entities at asserted c
482 | onnectivities');
483 | #457=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#460,
484 | 'DISTANCE_ACCURACY_VALUE',
485 | 'Maximum model space distance between geometric entities at asserted c
486 | onnectivities');
487 | #458=(
488 | GEOMETRIC_REPRESENTATION_CONTEXT(3)
489 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#456))
490 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#460,#462,#463))
491 | REPRESENTATION_CONTEXT('','3D')
492 | );
493 | #459=(
494 | GEOMETRIC_REPRESENTATION_CONTEXT(3)
495 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#457))
496 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#460,#462,#463))
497 | REPRESENTATION_CONTEXT('','3D')
498 | );
499 | #460=(
500 | LENGTH_UNIT()
501 | NAMED_UNIT(*)
502 | SI_UNIT(.MILLI.,.METRE.)
503 | );
504 | #461=(
505 | LENGTH_UNIT()
506 | NAMED_UNIT(*)
507 | SI_UNIT($,.METRE.)
508 | );
509 | #462=(
510 | NAMED_UNIT(*)
511 | PLANE_ANGLE_UNIT()
512 | SI_UNIT($,.RADIAN.)
513 | );
514 | #463=(
515 | NAMED_UNIT(*)
516 | SI_UNIT($,.STERADIAN.)
517 | SOLID_ANGLE_UNIT()
518 | );
519 | #464=SHAPE_DEFINITION_REPRESENTATION(#465,#466);
520 | #465=PRODUCT_DEFINITION_SHAPE('',$,#468);
521 | #466=SHAPE_REPRESENTATION('',(#284),#458);
522 | #467=PRODUCT_DEFINITION_CONTEXT('part definition',#472,'design');
523 | #468=PRODUCT_DEFINITION('back','back v2',#469,#467);
524 | #469=PRODUCT_DEFINITION_FORMATION('',$,#474);
525 | #470=PRODUCT_RELATED_PRODUCT_CATEGORY('back v2','back v2',(#474));
526 | #471=APPLICATION_PROTOCOL_DEFINITION('international standard',
527 | 'ap242_managed_model_based_3d_engineering',2011,#472);
528 | #472=APPLICATION_CONTEXT('Managed model based 3d engineering');
529 | #473=PRODUCT_CONTEXT('part definition',#472,'mechanical');
530 | #474=PRODUCT('back','back v2',$,(#473));
531 | #475=PRESENTATION_STYLE_ASSIGNMENT((#476));
532 | #476=SURFACE_STYLE_USAGE(.BOTH.,#477);
533 | #477=SURFACE_SIDE_STYLE('',(#478));
534 | #478=SURFACE_STYLE_FILL_AREA(#479);
535 | #479=FILL_AREA_STYLE('Steel - Satin',(#480));
536 | #480=FILL_AREA_STYLE_COLOUR('Steel - Satin',#481);
537 | #481=COLOUR_RGB('Steel - Satin',0.627450980392157,0.627450980392157,0.627450980392157);
538 | ENDSEC;
539 | END-ISO-10303-21;
540 |
--------------------------------------------------------------------------------
/3d-files/cover.step:
--------------------------------------------------------------------------------
1 | ISO-10303-21;
2 | HEADER;
3 | /* Generated by software containing ST-Developer
4 | * from STEP Tools, Inc. (www.steptools.com)
5 | */
6 |
7 | FILE_DESCRIPTION(
8 | /* description */ ('',
9 | 'CAx-IF Rec.Pracs.---Representation and Presentation of Product Manufa
10 | cturing Information (PMI)---4.0---2014-10-13'),
11 | /* implementation_level */ '2;1');
12 |
13 | FILE_NAME(
14 | /* name */ 'cover.step',
15 | /* time_stamp */ '2025-01-26T21:31:06-08:00',
16 | /* author */ (''),
17 | /* organization */ (''),
18 | /* preprocessor_version */ 'ST-DEVELOPER v20',
19 | /* originating_system */ 'Autodesk Translation Framework v13.20.0.188',
20 |
21 | /* authorisation */ '');
22 |
23 | FILE_SCHEMA (('AP242_MANAGED_MODEL_BASED_3D_ENGINEERING_MIM_LF { 1 0 10303 442 1 1 4 }'));
24 | ENDSEC;
25 |
26 | DATA;
27 | #10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#607);
28 | #11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#614,#12);
29 | #12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#606);
30 | #13=STYLED_ITEM('',(#623),#14);
31 | #14=MANIFOLD_SOLID_BREP('Body1',#355);
32 | #15=B_SPLINE_CURVE_WITH_KNOTS('',3,(#549,#550,#551,#552),.UNSPECIFIED.,
33 | .F.,.F.,(4,4),(-0.424264377342616,0.),.UNSPECIFIED.);
34 | #16=B_SPLINE_CURVE_WITH_KNOTS('',3,(#558,#559,#560,#561),.UNSPECIFIED.,
35 | .F.,.F.,(4,4),(-0.317795963309201,0.),.UNSPECIFIED.);
36 | #17=CONICAL_SURFACE('',#382,4.49999999999994,0.785398163397449);
37 | #18=CONICAL_SURFACE('',#384,4.49999999999999,0.785398163397448);
38 | #19=CONICAL_SURFACE('',#387,4.50000000000001,0.785398163397449);
39 | #20=CONICAL_SURFACE('',#390,4.5,0.785398163397448);
40 | #21=FACE_BOUND('',#61,.T.);
41 | #22=FACE_BOUND('',#73,.T.);
42 | #23=FACE_BOUND('',#77,.T.);
43 | #24=PLANE('',#372);
44 | #25=PLANE('',#373);
45 | #26=PLANE('',#377);
46 | #27=PLANE('',#386);
47 | #28=PLANE('',#389);
48 | #29=PLANE('',#392);
49 | #30=PLANE('',#393);
50 | #31=PLANE('',#394);
51 | #32=PLANE('',#395);
52 | #33=PLANE('',#396);
53 | #34=PLANE('',#397);
54 | #35=PLANE('',#398);
55 | #36=PLANE('',#399);
56 | #37=FACE_OUTER_BOUND('',#56,.T.);
57 | #38=FACE_OUTER_BOUND('',#57,.T.);
58 | #39=FACE_OUTER_BOUND('',#58,.T.);
59 | #40=FACE_OUTER_BOUND('',#59,.T.);
60 | #41=FACE_OUTER_BOUND('',#60,.T.);
61 | #42=FACE_OUTER_BOUND('',#62,.T.);
62 | #43=FACE_OUTER_BOUND('',#63,.T.);
63 | #44=FACE_OUTER_BOUND('',#64,.T.);
64 | #45=FACE_OUTER_BOUND('',#65,.T.);
65 | #46=FACE_OUTER_BOUND('',#66,.T.);
66 | #47=FACE_OUTER_BOUND('',#67,.T.);
67 | #48=FACE_OUTER_BOUND('',#68,.T.);
68 | #49=FACE_OUTER_BOUND('',#69,.T.);
69 | #50=FACE_OUTER_BOUND('',#70,.T.);
70 | #51=FACE_OUTER_BOUND('',#71,.T.);
71 | #52=FACE_OUTER_BOUND('',#72,.T.);
72 | #53=FACE_OUTER_BOUND('',#74,.T.);
73 | #54=FACE_OUTER_BOUND('',#75,.T.);
74 | #55=FACE_OUTER_BOUND('',#76,.T.);
75 | #56=EDGE_LOOP('',(#238,#239,#240,#241));
76 | #57=EDGE_LOOP('',(#242,#243,#244,#245));
77 | #58=EDGE_LOOP('',(#246,#247,#248,#249,#250,#251));
78 | #59=EDGE_LOOP('',(#252,#253,#254,#255));
79 | #60=EDGE_LOOP('',(#256,#257,#258,#259));
80 | #61=EDGE_LOOP('',(#260,#261,#262,#263,#264,#265));
81 | #62=EDGE_LOOP('',(#266,#267,#268,#269));
82 | #63=EDGE_LOOP('',(#270,#271,#272,#273));
83 | #64=EDGE_LOOP('',(#274,#275,#276,#277));
84 | #65=EDGE_LOOP('',(#278,#279,#280,#281));
85 | #66=EDGE_LOOP('',(#282,#283,#284,#285));
86 | #67=EDGE_LOOP('',(#286,#287,#288,#289));
87 | #68=EDGE_LOOP('',(#290,#291,#292,#293));
88 | #69=EDGE_LOOP('',(#294,#295,#296,#297));
89 | #70=EDGE_LOOP('',(#298,#299,#300,#301));
90 | #71=EDGE_LOOP('',(#302,#303,#304,#305));
91 | #72=EDGE_LOOP('',(#306,#307,#308,#309));
92 | #73=EDGE_LOOP('',(#310,#311,#312,#313,#314,#315));
93 | #74=EDGE_LOOP('',(#316,#317,#318,#319));
94 | #75=EDGE_LOOP('',(#320,#321,#322,#323));
95 | #76=EDGE_LOOP('',(#324,#325,#326,#327,#328,#329));
96 | #77=EDGE_LOOP('',(#330,#331,#332,#333));
97 | #78=ELLIPSE('',#371,3.10582854123025,3.);
98 | #79=ELLIPSE('',#376,3.10582854123025,3.);
99 | #80=LINE('',#504,#114);
100 | #81=LINE('',#507,#115);
101 | #82=LINE('',#510,#116);
102 | #83=LINE('',#512,#117);
103 | #84=LINE('',#513,#118);
104 | #85=LINE('',#516,#119);
105 | #86=LINE('',#520,#120);
106 | #87=LINE('',#521,#121);
107 | #88=LINE('',#524,#122);
108 | #89=LINE('',#527,#123);
109 | #90=LINE('',#530,#124);
110 | #91=LINE('',#531,#125);
111 | #92=LINE('',#536,#126);
112 | #93=LINE('',#542,#127);
113 | #94=LINE('',#548,#128);
114 | #95=LINE('',#557,#129);
115 | #96=LINE('',#564,#130);
116 | #97=LINE('',#565,#131);
117 | #98=LINE('',#570,#132);
118 | #99=LINE('',#571,#133);
119 | #100=LINE('',#577,#134);
120 | #101=LINE('',#579,#135);
121 | #102=LINE('',#581,#136);
122 | #103=LINE('',#582,#137);
123 | #104=LINE('',#585,#138);
124 | #105=LINE('',#587,#139);
125 | #106=LINE('',#588,#140);
126 | #107=LINE('',#591,#141);
127 | #108=LINE('',#593,#142);
128 | #109=LINE('',#594,#143);
129 | #110=LINE('',#596,#144);
130 | #111=LINE('',#598,#145);
131 | #112=LINE('',#600,#146);
132 | #113=LINE('',#602,#147);
133 | #114=VECTOR('',#406,10.);
134 | #115=VECTOR('',#409,10.);
135 | #116=VECTOR('',#412,10.);
136 | #117=VECTOR('',#413,10.);
137 | #118=VECTOR('',#414,10.);
138 | #119=VECTOR('',#417,10.);
139 | #120=VECTOR('',#420,10.);
140 | #121=VECTOR('',#421,10.);
141 | #122=VECTOR('',#424,10.);
142 | #123=VECTOR('',#427,10.);
143 | #124=VECTOR('',#430,10.);
144 | #125=VECTOR('',#431,10.);
145 | #126=VECTOR('',#434,10.);
146 | #127=VECTOR('',#439,10.);
147 | #128=VECTOR('',#446,10.);
148 | #129=VECTOR('',#451,10.);
149 | #130=VECTOR('',#454,10.);
150 | #131=VECTOR('',#455,10.);
151 | #132=VECTOR('',#462,10.);
152 | #133=VECTOR('',#463,10.);
153 | #134=VECTOR('',#470,10.);
154 | #135=VECTOR('',#471,10.);
155 | #136=VECTOR('',#472,10.);
156 | #137=VECTOR('',#473,10.);
157 | #138=VECTOR('',#476,10.);
158 | #139=VECTOR('',#477,10.);
159 | #140=VECTOR('',#478,10.);
160 | #141=VECTOR('',#481,10.);
161 | #142=VECTOR('',#482,10.);
162 | #143=VECTOR('',#483,10.);
163 | #144=VECTOR('',#486,10.);
164 | #145=VECTOR('',#489,10.);
165 | #146=VECTOR('',#492,10.);
166 | #147=VECTOR('',#495,10.);
167 | #148=CIRCLE('',#370,3.00000224222027);
168 | #149=CIRCLE('',#374,3.00000224222027);
169 | #150=CIRCLE('',#378,5.99999999999999);
170 | #151=CIRCLE('',#379,6.00000000000001);
171 | #152=CIRCLE('',#380,5.99999999999994);
172 | #153=CIRCLE('',#381,6.);
173 | #154=CIRCLE('',#383,2.99999999999994);
174 | #155=CIRCLE('',#385,2.99999999999999);
175 | #156=CIRCLE('',#388,3.00000000000001);
176 | #157=CIRCLE('',#391,3.);
177 | #158=VERTEX_POINT('',#500);
178 | #159=VERTEX_POINT('',#501);
179 | #160=VERTEX_POINT('',#503);
180 | #161=VERTEX_POINT('',#505);
181 | #162=VERTEX_POINT('',#509);
182 | #163=VERTEX_POINT('',#511);
183 | #164=VERTEX_POINT('',#515);
184 | #165=VERTEX_POINT('',#517);
185 | #166=VERTEX_POINT('',#519);
186 | #167=VERTEX_POINT('',#523);
187 | #168=VERTEX_POINT('',#525);
188 | #169=VERTEX_POINT('',#529);
189 | #170=VERTEX_POINT('',#532);
190 | #171=VERTEX_POINT('',#533);
191 | #172=VERTEX_POINT('',#535);
192 | #173=VERTEX_POINT('',#537);
193 | #174=VERTEX_POINT('',#539);
194 | #175=VERTEX_POINT('',#541);
195 | #176=VERTEX_POINT('',#545);
196 | #177=VERTEX_POINT('',#546);
197 | #178=VERTEX_POINT('',#554);
198 | #179=VERTEX_POINT('',#555);
199 | #180=VERTEX_POINT('',#563);
200 | #181=VERTEX_POINT('',#569);
201 | #182=VERTEX_POINT('',#575);
202 | #183=VERTEX_POINT('',#576);
203 | #184=VERTEX_POINT('',#578);
204 | #185=VERTEX_POINT('',#580);
205 | #186=VERTEX_POINT('',#584);
206 | #187=VERTEX_POINT('',#586);
207 | #188=VERTEX_POINT('',#590);
208 | #189=VERTEX_POINT('',#592);
209 | #190=EDGE_CURVE('',#158,#159,#148,.T.);
210 | #191=EDGE_CURVE('',#159,#160,#80,.T.);
211 | #192=EDGE_CURVE('',#160,#161,#78,.T.);
212 | #193=EDGE_CURVE('',#161,#158,#81,.T.);
213 | #194=EDGE_CURVE('',#159,#162,#82,.T.);
214 | #195=EDGE_CURVE('',#162,#163,#83,.T.);
215 | #196=EDGE_CURVE('',#163,#160,#84,.T.);
216 | #197=EDGE_CURVE('',#164,#158,#85,.T.);
217 | #198=EDGE_CURVE('',#165,#164,#149,.T.);
218 | #199=EDGE_CURVE('',#165,#166,#86,.T.);
219 | #200=EDGE_CURVE('',#166,#162,#87,.T.);
220 | #201=EDGE_CURVE('',#164,#167,#88,.T.);
221 | #202=EDGE_CURVE('',#167,#168,#79,.T.);
222 | #203=EDGE_CURVE('',#168,#165,#89,.T.);
223 | #204=EDGE_CURVE('',#169,#168,#90,.T.);
224 | #205=EDGE_CURVE('',#169,#166,#91,.T.);
225 | #206=EDGE_CURVE('',#170,#171,#150,.T.);
226 | #207=EDGE_CURVE('',#172,#170,#92,.T.);
227 | #208=EDGE_CURVE('',#173,#172,#151,.T.);
228 | #209=EDGE_CURVE('',#174,#173,#152,.T.);
229 | #210=EDGE_CURVE('',#175,#174,#93,.T.);
230 | #211=EDGE_CURVE('',#171,#175,#153,.T.);
231 | #212=EDGE_CURVE('',#176,#177,#154,.T.);
232 | #213=EDGE_CURVE('',#176,#174,#94,.T.);
233 | #214=EDGE_CURVE('',#173,#177,#15,.T.);
234 | #215=EDGE_CURVE('',#178,#179,#155,.T.);
235 | #216=EDGE_CURVE('',#178,#170,#95,.T.);
236 | #217=EDGE_CURVE('',#179,#171,#16,.T.);
237 | #218=EDGE_CURVE('',#180,#172,#96,.T.);
238 | #219=EDGE_CURVE('',#180,#178,#97,.T.);
239 | #220=EDGE_CURVE('',#177,#180,#156,.T.);
240 | #221=EDGE_CURVE('',#181,#175,#98,.T.);
241 | #222=EDGE_CURVE('',#181,#176,#99,.T.);
242 | #223=EDGE_CURVE('',#179,#181,#157,.T.);
243 | #224=EDGE_CURVE('',#182,#183,#100,.T.);
244 | #225=EDGE_CURVE('',#183,#184,#101,.F.);
245 | #226=EDGE_CURVE('',#184,#185,#102,.F.);
246 | #227=EDGE_CURVE('',#182,#185,#103,.T.);
247 | #228=EDGE_CURVE('',#186,#183,#104,.F.);
248 | #229=EDGE_CURVE('',#186,#187,#105,.F.);
249 | #230=EDGE_CURVE('',#187,#184,#106,.F.);
250 | #231=EDGE_CURVE('',#188,#186,#107,.F.);
251 | #232=EDGE_CURVE('',#189,#188,#108,.T.);
252 | #233=EDGE_CURVE('',#189,#187,#109,.F.);
253 | #234=EDGE_CURVE('',#185,#189,#110,.T.);
254 | #235=EDGE_CURVE('',#188,#182,#111,.T.);
255 | #236=EDGE_CURVE('',#169,#163,#112,.T.);
256 | #237=EDGE_CURVE('',#167,#161,#113,.T.);
257 | #238=ORIENTED_EDGE('',*,*,#190,.T.);
258 | #239=ORIENTED_EDGE('',*,*,#191,.T.);
259 | #240=ORIENTED_EDGE('',*,*,#192,.T.);
260 | #241=ORIENTED_EDGE('',*,*,#193,.T.);
261 | #242=ORIENTED_EDGE('',*,*,#191,.F.);
262 | #243=ORIENTED_EDGE('',*,*,#194,.T.);
263 | #244=ORIENTED_EDGE('',*,*,#195,.T.);
264 | #245=ORIENTED_EDGE('',*,*,#196,.T.);
265 | #246=ORIENTED_EDGE('',*,*,#190,.F.);
266 | #247=ORIENTED_EDGE('',*,*,#197,.F.);
267 | #248=ORIENTED_EDGE('',*,*,#198,.F.);
268 | #249=ORIENTED_EDGE('',*,*,#199,.T.);
269 | #250=ORIENTED_EDGE('',*,*,#200,.T.);
270 | #251=ORIENTED_EDGE('',*,*,#194,.F.);
271 | #252=ORIENTED_EDGE('',*,*,#198,.T.);
272 | #253=ORIENTED_EDGE('',*,*,#201,.T.);
273 | #254=ORIENTED_EDGE('',*,*,#202,.T.);
274 | #255=ORIENTED_EDGE('',*,*,#203,.T.);
275 | #256=ORIENTED_EDGE('',*,*,#203,.F.);
276 | #257=ORIENTED_EDGE('',*,*,#204,.F.);
277 | #258=ORIENTED_EDGE('',*,*,#205,.T.);
278 | #259=ORIENTED_EDGE('',*,*,#199,.F.);
279 | #260=ORIENTED_EDGE('',*,*,#206,.F.);
280 | #261=ORIENTED_EDGE('',*,*,#207,.F.);
281 | #262=ORIENTED_EDGE('',*,*,#208,.F.);
282 | #263=ORIENTED_EDGE('',*,*,#209,.F.);
283 | #264=ORIENTED_EDGE('',*,*,#210,.F.);
284 | #265=ORIENTED_EDGE('',*,*,#211,.F.);
285 | #266=ORIENTED_EDGE('',*,*,#212,.F.);
286 | #267=ORIENTED_EDGE('',*,*,#213,.T.);
287 | #268=ORIENTED_EDGE('',*,*,#209,.T.);
288 | #269=ORIENTED_EDGE('',*,*,#214,.T.);
289 | #270=ORIENTED_EDGE('',*,*,#215,.F.);
290 | #271=ORIENTED_EDGE('',*,*,#216,.T.);
291 | #272=ORIENTED_EDGE('',*,*,#206,.T.);
292 | #273=ORIENTED_EDGE('',*,*,#217,.F.);
293 | #274=ORIENTED_EDGE('',*,*,#218,.T.);
294 | #275=ORIENTED_EDGE('',*,*,#207,.T.);
295 | #276=ORIENTED_EDGE('',*,*,#216,.F.);
296 | #277=ORIENTED_EDGE('',*,*,#219,.F.);
297 | #278=ORIENTED_EDGE('',*,*,#208,.T.);
298 | #279=ORIENTED_EDGE('',*,*,#218,.F.);
299 | #280=ORIENTED_EDGE('',*,*,#220,.F.);
300 | #281=ORIENTED_EDGE('',*,*,#214,.F.);
301 | #282=ORIENTED_EDGE('',*,*,#221,.T.);
302 | #283=ORIENTED_EDGE('',*,*,#210,.T.);
303 | #284=ORIENTED_EDGE('',*,*,#213,.F.);
304 | #285=ORIENTED_EDGE('',*,*,#222,.F.);
305 | #286=ORIENTED_EDGE('',*,*,#211,.T.);
306 | #287=ORIENTED_EDGE('',*,*,#221,.F.);
307 | #288=ORIENTED_EDGE('',*,*,#223,.F.);
308 | #289=ORIENTED_EDGE('',*,*,#217,.T.);
309 | #290=ORIENTED_EDGE('',*,*,#224,.T.);
310 | #291=ORIENTED_EDGE('',*,*,#225,.T.);
311 | #292=ORIENTED_EDGE('',*,*,#226,.T.);
312 | #293=ORIENTED_EDGE('',*,*,#227,.F.);
313 | #294=ORIENTED_EDGE('',*,*,#228,.F.);
314 | #295=ORIENTED_EDGE('',*,*,#229,.T.);
315 | #296=ORIENTED_EDGE('',*,*,#230,.T.);
316 | #297=ORIENTED_EDGE('',*,*,#225,.F.);
317 | #298=ORIENTED_EDGE('',*,*,#231,.F.);
318 | #299=ORIENTED_EDGE('',*,*,#232,.F.);
319 | #300=ORIENTED_EDGE('',*,*,#233,.T.);
320 | #301=ORIENTED_EDGE('',*,*,#229,.F.);
321 | #302=ORIENTED_EDGE('',*,*,#234,.F.);
322 | #303=ORIENTED_EDGE('',*,*,#226,.F.);
323 | #304=ORIENTED_EDGE('',*,*,#230,.F.);
324 | #305=ORIENTED_EDGE('',*,*,#233,.F.);
325 | #306=ORIENTED_EDGE('',*,*,#235,.F.);
326 | #307=ORIENTED_EDGE('',*,*,#231,.T.);
327 | #308=ORIENTED_EDGE('',*,*,#228,.T.);
328 | #309=ORIENTED_EDGE('',*,*,#224,.F.);
329 | #310=ORIENTED_EDGE('',*,*,#223,.T.);
330 | #311=ORIENTED_EDGE('',*,*,#222,.T.);
331 | #312=ORIENTED_EDGE('',*,*,#212,.T.);
332 | #313=ORIENTED_EDGE('',*,*,#220,.T.);
333 | #314=ORIENTED_EDGE('',*,*,#219,.T.);
334 | #315=ORIENTED_EDGE('',*,*,#215,.T.);
335 | #316=ORIENTED_EDGE('',*,*,#205,.F.);
336 | #317=ORIENTED_EDGE('',*,*,#236,.T.);
337 | #318=ORIENTED_EDGE('',*,*,#195,.F.);
338 | #319=ORIENTED_EDGE('',*,*,#200,.F.);
339 | #320=ORIENTED_EDGE('',*,*,#193,.F.);
340 | #321=ORIENTED_EDGE('',*,*,#237,.F.);
341 | #322=ORIENTED_EDGE('',*,*,#201,.F.);
342 | #323=ORIENTED_EDGE('',*,*,#197,.T.);
343 | #324=ORIENTED_EDGE('',*,*,#192,.F.);
344 | #325=ORIENTED_EDGE('',*,*,#196,.F.);
345 | #326=ORIENTED_EDGE('',*,*,#236,.F.);
346 | #327=ORIENTED_EDGE('',*,*,#204,.T.);
347 | #328=ORIENTED_EDGE('',*,*,#202,.F.);
348 | #329=ORIENTED_EDGE('',*,*,#237,.T.);
349 | #330=ORIENTED_EDGE('',*,*,#232,.T.);
350 | #331=ORIENTED_EDGE('',*,*,#235,.T.);
351 | #332=ORIENTED_EDGE('',*,*,#227,.T.);
352 | #333=ORIENTED_EDGE('',*,*,#234,.T.);
353 | #334=CYLINDRICAL_SURFACE('',#369,3.);
354 | #335=CYLINDRICAL_SURFACE('',#375,3.);
355 | #336=ADVANCED_FACE('',(#37),#334,.T.);
356 | #337=ADVANCED_FACE('',(#38),#24,.T.);
357 | #338=ADVANCED_FACE('',(#39),#25,.T.);
358 | #339=ADVANCED_FACE('',(#40),#335,.T.);
359 | #340=ADVANCED_FACE('',(#41,#21),#26,.F.);
360 | #341=ADVANCED_FACE('',(#42),#17,.F.);
361 | #342=ADVANCED_FACE('',(#43),#18,.F.);
362 | #343=ADVANCED_FACE('',(#44),#27,.T.);
363 | #344=ADVANCED_FACE('',(#45),#19,.F.);
364 | #345=ADVANCED_FACE('',(#46),#28,.T.);
365 | #346=ADVANCED_FACE('',(#47),#20,.F.);
366 | #347=ADVANCED_FACE('',(#48),#29,.F.);
367 | #348=ADVANCED_FACE('',(#49),#30,.F.);
368 | #349=ADVANCED_FACE('',(#50),#31,.F.);
369 | #350=ADVANCED_FACE('',(#51),#32,.F.);
370 | #351=ADVANCED_FACE('',(#52,#22),#33,.T.);
371 | #352=ADVANCED_FACE('',(#53),#34,.T.);
372 | #353=ADVANCED_FACE('',(#54),#35,.T.);
373 | #354=ADVANCED_FACE('',(#55,#23),#36,.T.);
374 | #355=CLOSED_SHELL('',(#336,#337,#338,#339,#340,#341,#342,#343,#344,#345,
375 | #346,#347,#348,#349,#350,#351,#352,#353,#354));
376 | #356=DERIVED_UNIT_ELEMENT(#358,1.);
377 | #357=DERIVED_UNIT_ELEMENT(#609,-3.);
378 | #358=(
379 | MASS_UNIT()
380 | NAMED_UNIT(*)
381 | SI_UNIT(.KILO.,.GRAM.)
382 | );
383 | #359=DERIVED_UNIT((#356,#357));
384 | #360=MEASURE_REPRESENTATION_ITEM('density measure',
385 | POSITIVE_RATIO_MEASURE(7850.),#359);
386 | #361=PROPERTY_DEFINITION_REPRESENTATION(#366,#363);
387 | #362=PROPERTY_DEFINITION_REPRESENTATION(#367,#364);
388 | #363=REPRESENTATION('material name',(#365),#606);
389 | #364=REPRESENTATION('density',(#360),#606);
390 | #365=DESCRIPTIVE_REPRESENTATION_ITEM('Steel','Steel');
391 | #366=PROPERTY_DEFINITION('material property','material name',#616);
392 | #367=PROPERTY_DEFINITION('material property','density of part',#616);
393 | #368=AXIS2_PLACEMENT_3D('',#498,#400,#401);
394 | #369=AXIS2_PLACEMENT_3D('',#499,#402,#403);
395 | #370=AXIS2_PLACEMENT_3D('',#502,#404,#405);
396 | #371=AXIS2_PLACEMENT_3D('',#506,#407,#408);
397 | #372=AXIS2_PLACEMENT_3D('',#508,#410,#411);
398 | #373=AXIS2_PLACEMENT_3D('',#514,#415,#416);
399 | #374=AXIS2_PLACEMENT_3D('',#518,#418,#419);
400 | #375=AXIS2_PLACEMENT_3D('',#522,#422,#423);
401 | #376=AXIS2_PLACEMENT_3D('',#526,#425,#426);
402 | #377=AXIS2_PLACEMENT_3D('',#528,#428,#429);
403 | #378=AXIS2_PLACEMENT_3D('',#534,#432,#433);
404 | #379=AXIS2_PLACEMENT_3D('',#538,#435,#436);
405 | #380=AXIS2_PLACEMENT_3D('',#540,#437,#438);
406 | #381=AXIS2_PLACEMENT_3D('',#543,#440,#441);
407 | #382=AXIS2_PLACEMENT_3D('',#544,#442,#443);
408 | #383=AXIS2_PLACEMENT_3D('',#547,#444,#445);
409 | #384=AXIS2_PLACEMENT_3D('',#553,#447,#448);
410 | #385=AXIS2_PLACEMENT_3D('',#556,#449,#450);
411 | #386=AXIS2_PLACEMENT_3D('',#562,#452,#453);
412 | #387=AXIS2_PLACEMENT_3D('',#566,#456,#457);
413 | #388=AXIS2_PLACEMENT_3D('',#567,#458,#459);
414 | #389=AXIS2_PLACEMENT_3D('',#568,#460,#461);
415 | #390=AXIS2_PLACEMENT_3D('',#572,#464,#465);
416 | #391=AXIS2_PLACEMENT_3D('',#573,#466,#467);
417 | #392=AXIS2_PLACEMENT_3D('',#574,#468,#469);
418 | #393=AXIS2_PLACEMENT_3D('',#583,#474,#475);
419 | #394=AXIS2_PLACEMENT_3D('',#589,#479,#480);
420 | #395=AXIS2_PLACEMENT_3D('',#595,#484,#485);
421 | #396=AXIS2_PLACEMENT_3D('',#597,#487,#488);
422 | #397=AXIS2_PLACEMENT_3D('',#599,#490,#491);
423 | #398=AXIS2_PLACEMENT_3D('',#601,#493,#494);
424 | #399=AXIS2_PLACEMENT_3D('',#603,#496,#497);
425 | #400=DIRECTION('axis',(0.,0.,1.));
426 | #401=DIRECTION('refdir',(1.,0.,0.));
427 | #402=DIRECTION('center_axis',(1.,0.,-3.70074341541719E-16));
428 | #403=DIRECTION('ref_axis',(0.,0.707106781186548,0.707106781186548));
429 | #404=DIRECTION('center_axis',(-0.999999252593803,0.,-0.00122262497754552));
430 | #405=DIRECTION('ref_axis',(-0.00122262497754552,9.25185162364656E-17,0.999999252593803));
431 | #406=DIRECTION('',(-1.,0.,3.70074341541719E-16));
432 | #407=DIRECTION('center_axis',(0.965925826289068,0.,-0.258819045102521));
433 | #408=DIRECTION('ref_axis',(0.258819045102521,8.93660910355169E-17,0.965925826289068));
434 | #409=DIRECTION('',(1.,0.,-3.70074341541719E-16));
435 | #410=DIRECTION('center_axis',(0.,1.,0.));
436 | #411=DIRECTION('ref_axis',(0.,0.,1.));
437 | #412=DIRECTION('',(0.00122262497754552,0.,-0.999999252593803));
438 | #413=DIRECTION('',(-1.,0.,0.));
439 | #414=DIRECTION('',(0.258819045102521,0.,0.965925826289068));
440 | #415=DIRECTION('center_axis',(0.999999252593803,0.,0.00122262497754552));
441 | #416=DIRECTION('ref_axis',(0.00122262497754552,0.,-0.999999252593803));
442 | #417=DIRECTION('',(0.,1.,0.));
443 | #418=DIRECTION('center_axis',(-0.999999252593803,0.,-0.00122262497754552));
444 | #419=DIRECTION('ref_axis',(-0.00122262497754552,1.01770367860112E-15,0.999999252593803));
445 | #420=DIRECTION('',(0.00122262497754552,0.,-0.999999252593803));
446 | #421=DIRECTION('',(0.,1.,0.));
447 | #422=DIRECTION('center_axis',(1.,0.,-3.70074341541719E-16));
448 | #423=DIRECTION('ref_axis',(0.,-0.707106781186547,0.707106781186548));
449 | #424=DIRECTION('',(-1.,0.,3.70074341541719E-16));
450 | #425=DIRECTION('center_axis',(0.965925826289068,0.,-0.258819045102521));
451 | #426=DIRECTION('ref_axis',(0.258819045102521,9.83027001390686E-16,0.965925826289068));
452 | #427=DIRECTION('',(1.,0.,-3.70074341541719E-16));
453 | #428=DIRECTION('center_axis',(0.,1.,0.));
454 | #429=DIRECTION('ref_axis',(1.,0.,0.));
455 | #430=DIRECTION('',(0.258819045102521,0.,0.965925826289068));
456 | #431=DIRECTION('',(1.,0.,0.));
457 | #432=DIRECTION('center_axis',(0.,-1.,0.));
458 | #433=DIRECTION('ref_axis',(0.967160365442356,0.,-0.254166928449412));
459 | #434=DIRECTION('',(0.254166928449411,0.,0.967160365442356));
460 | #435=DIRECTION('center_axis',(0.,-1.,0.));
461 | #436=DIRECTION('ref_axis',(-0.258819040291215,0.,-0.965925827578254));
462 | #437=DIRECTION('center_axis',(0.,-1.,0.));
463 | #438=DIRECTION('ref_axis',(-0.965925826289065,0.,0.258819045102533));
464 | #439=DIRECTION('',(-0.258819045102521,0.,-0.965925826289068));
465 | #440=DIRECTION('center_axis',(0.,-1.,0.));
466 | #441=DIRECTION('ref_axis',(0.258819052300176,0.,0.965925824360462));
467 | #442=DIRECTION('center_axis',(0.,-1.,0.));
468 | #443=DIRECTION('ref_axis',(-0.965925826289065,0.,0.258819045102533));
469 | #444=DIRECTION('center_axis',(0.,-1.,0.));
470 | #445=DIRECTION('ref_axis',(-0.965925826289065,0.,0.258819045102533));
471 | #446=DIRECTION('',(-0.683012701892217,-0.707106781186547,0.183012701892229));
472 | #447=DIRECTION('center_axis',(0.,-1.,0.));
473 | #448=DIRECTION('ref_axis',(0.967160365442356,0.,-0.254166928449412));
474 | #449=DIRECTION('center_axis',(0.,-1.,0.));
475 | #450=DIRECTION('ref_axis',(0.967160365442356,0.,-0.254166928449412));
476 | #451=DIRECTION('',(0.683885652899149,-0.707106781186548,-0.179723158659935));
477 | #452=DIRECTION('center_axis',(-0.68388565289915,-0.707106781186548,0.179723158659935));
478 | #453=DIRECTION('ref_axis',(0.254166928449411,0.,0.967160365442356));
479 | #454=DIRECTION('',(0.683885652899149,-0.707106781186548,-0.179723158659935));
480 | #455=DIRECTION('',(0.254166928449411,0.,0.967160365442356));
481 | #456=DIRECTION('center_axis',(0.,-1.,0.));
482 | #457=DIRECTION('ref_axis',(-0.258819040291215,0.,-0.965925827578254));
483 | #458=DIRECTION('center_axis',(0.,-1.,0.));
484 | #459=DIRECTION('ref_axis',(-0.258819040291215,0.,-0.965925827578254));
485 | #460=DIRECTION('center_axis',(0.683012701892219,-0.707106781186548,-0.183012701892219));
486 | #461=DIRECTION('ref_axis',(-0.258819045102521,0.,-0.965925826289068));
487 | #462=DIRECTION('',(-0.683012701892219,-0.707106781186548,0.183012701892219));
488 | #463=DIRECTION('',(-0.258819045102521,0.,-0.965925826289068));
489 | #464=DIRECTION('center_axis',(0.,-1.,0.));
490 | #465=DIRECTION('ref_axis',(0.258819052300176,0.,0.965925824360462));
491 | #466=DIRECTION('center_axis',(0.,-1.,0.));
492 | #467=DIRECTION('ref_axis',(0.258819052300176,0.,0.965925824360462));
493 | #468=DIRECTION('center_axis',(0.,0.,-1.));
494 | #469=DIRECTION('ref_axis',(-1.,0.,0.));
495 | #470=DIRECTION('',(1.,0.,0.));
496 | #471=DIRECTION('',(0.,-1.,0.));
497 | #472=DIRECTION('',(1.,0.,0.));
498 | #473=DIRECTION('',(0.,1.,0.));
499 | #474=DIRECTION('center_axis',(0.999999252593803,0.,0.00122262497754552));
500 | #475=DIRECTION('ref_axis',(0.00122262497754552,0.,-0.999999252593803));
501 | #476=DIRECTION('',(-0.00122262497754552,0.,0.999999252593803));
502 | #477=DIRECTION('',(0.,-1.,0.));
503 | #478=DIRECTION('',(-0.00122262497754552,0.,0.999999252593803));
504 | #479=DIRECTION('center_axis',(3.70074341541719E-16,0.,1.));
505 | #480=DIRECTION('ref_axis',(1.,0.,-3.70074341541719E-16));
506 | #481=DIRECTION('',(-1.,0.,3.70074341541719E-16));
507 | #482=DIRECTION('',(0.,-1.,0.));
508 | #483=DIRECTION('',(-1.,0.,3.70074341541719E-16));
509 | #484=DIRECTION('center_axis',(0.,1.,0.));
510 | #485=DIRECTION('ref_axis',(0.,0.,1.));
511 | #486=DIRECTION('',(0.258819045102521,0.,0.965925826289068));
512 | #487=DIRECTION('center_axis',(0.,1.,0.));
513 | #488=DIRECTION('ref_axis',(1.,0.,0.));
514 | #489=DIRECTION('',(-0.258819045102521,0.,-0.965925826289068));
515 | #490=DIRECTION('center_axis',(0.,0.,-1.));
516 | #491=DIRECTION('ref_axis',(-1.,0.,0.));
517 | #492=DIRECTION('',(0.,1.,0.));
518 | #493=DIRECTION('center_axis',(3.70074341541719E-16,0.,1.));
519 | #494=DIRECTION('ref_axis',(1.,0.,-3.70074341541719E-16));
520 | #495=DIRECTION('',(0.,1.,0.));
521 | #496=DIRECTION('center_axis',(-0.965925826289068,0.,0.258819045102521));
522 | #497=DIRECTION('ref_axis',(0.258819045102521,0.,0.965925826289068));
523 | #498=CARTESIAN_POINT('',(0.,0.,0.));
524 | #499=CARTESIAN_POINT('Origin',(15.7204762653988,75.5,45.2962913144534));
525 | #500=CARTESIAN_POINT('',(36.940952255126,75.5,48.2962913144534));
526 | #501=CARTESIAN_POINT('',(36.9446201328001,78.5,45.2962913144534));
527 | #502=CARTESIAN_POINT('Origin',(36.9446201328001,75.5,45.2962913144534));
528 | #503=CARTESIAN_POINT('',(12.1371046778327,78.5,45.2962913144534));
529 | #504=CARTESIAN_POINT('',(15.7204762653988,78.5,45.2962913144534));
530 | #505=CARTESIAN_POINT('',(12.940952255126,75.5,48.2962913144534));
531 | #506=CARTESIAN_POINT('Origin',(12.1371046778327,75.5,45.2962913144534));
532 | #507=CARTESIAN_POINT('',(15.7204762653988,75.5,48.2962913144534));
533 | #508=CARTESIAN_POINT('Origin',(18.5000002756715,78.5,24.1481456572267));
534 | #509=CARTESIAN_POINT('',(37.000000551343,78.5,0.));
535 | #510=CARTESIAN_POINT('',(36.940952255126,78.5,48.2962913144534));
536 | #511=CARTESIAN_POINT('',(0.,78.5,0.));
537 | #512=CARTESIAN_POINT('',(24.,78.5,0.));
538 | #513=CARTESIAN_POINT('',(0.,78.5,0.));
539 | #514=CARTESIAN_POINT('Origin',(36.940952255126,0.,48.2962913144534));
540 | #515=CARTESIAN_POINT('',(36.940952255126,3.,48.2962913144534));
541 | #516=CARTESIAN_POINT('',(36.940952255126,0.,48.2962913144534));
542 | #517=CARTESIAN_POINT('',(36.9446201328001,0.,45.2962913144534));
543 | #518=CARTESIAN_POINT('Origin',(36.9446201328001,3.,45.2962913144534));
544 | #519=CARTESIAN_POINT('',(37.000000551343,0.,0.));
545 | #520=CARTESIAN_POINT('',(36.940952255126,0.,48.2962913144534));
546 | #521=CARTESIAN_POINT('',(37.000000551343,0.,0.));
547 | #522=CARTESIAN_POINT('Origin',(15.7204762653988,3.,45.2962913144534));
548 | #523=CARTESIAN_POINT('',(12.940952255126,3.,48.2962913144534));
549 | #524=CARTESIAN_POINT('',(15.7204762653988,3.,48.2962913144534));
550 | #525=CARTESIAN_POINT('',(12.1371046778327,0.,45.2962913144534));
551 | #526=CARTESIAN_POINT('Origin',(12.1371046778327,3.,45.2962913144534));
552 | #527=CARTESIAN_POINT('',(15.7204762653988,0.,45.2962913144534));
553 | #528=CARTESIAN_POINT('Origin',(18.5000002756715,0.,24.1481456572267));
554 | #529=CARTESIAN_POINT('',(0.,0.,0.));
555 | #530=CARTESIAN_POINT('',(0.,0.,0.));
556 | #531=CARTESIAN_POINT('',(24.,0.,0.));
557 | #532=CARTESIAN_POINT('',(25.7996542212931,0.,26.8927863583888));
558 | #533=CARTESIAN_POINT('',(21.5687921288757,0.,34.2081679899143));
559 | #534=CARTESIAN_POINT('Origin',(19.9966920286389,0.,28.4177879290853));
560 | #535=CARTESIAN_POINT('',(24.4652623998751,0.,21.8151356604038));
561 | #536=CARTESIAN_POINT('',(25.2265283437766,0.,24.7119179168299));
562 | #537=CARTESIAN_POINT('',(17.1163776521033,0.,17.5427133675572));
563 | #538=CARTESIAN_POINT('Origin',(18.662300207221,0.,23.3401372311002));
564 | #539=CARTESIAN_POINT('',(12.8807263328861,0.,24.8893052817838));
565 | #540=CARTESIAN_POINT('Origin',(18.6762812906205,0.,23.3363910111686));
566 | #541=CARTESIAN_POINT('',(14.239526310021,0.,29.9604158337745));
567 | #542=CARTESIAN_POINT('',(12.9762913691938,0.,25.2459588527112));
568 | #543=CARTESIAN_POINT('Origin',(20.0350812677554,0.,28.4075015631594));
569 | #544=CARTESIAN_POINT('Origin',(18.6762812906205,1.5,23.3363910111686));
570 | #545=CARTESIAN_POINT('',(15.7785038117533,3.,24.1128481464762));
571 | #546=CARTESIAN_POINT('',(17.8928358873799,3.,20.4404950703343));
572 | #547=CARTESIAN_POINT('Origin',(18.6762812906205,3.,23.3363910111686));
573 | #548=CARTESIAN_POINT('',(15.7785038117533,3.,24.1128481464762));
574 | #549=CARTESIAN_POINT('Ctrl Pts',(17.116377636838,9.6034291630076E-14,17.5427133716279));
575 | #550=CARTESIAN_POINT('Ctrl Pts',(17.3751969595455,1.0000003637253,18.508640253199));
576 | #551=CARTESIAN_POINT('Ctrl Pts',(17.6340162822532,2.00000072745169,19.4745671347697));
577 | #552=CARTESIAN_POINT('Ctrl Pts',(17.8928358873778,3.00000000000001,20.4404950703348));
578 | #553=CARTESIAN_POINT('Origin',(19.9966920286389,1.5,28.4177879290853));
579 | #554=CARTESIAN_POINT('',(22.898173124966,3.,27.655287143737));
580 | #555=CARTESIAN_POINT('',(20.7923267709209,3.,31.3103586467816));
581 | #556=CARTESIAN_POINT('Origin',(19.9966920286389,3.,28.4177879290853));
582 | #557=CARTESIAN_POINT('',(22.898173124966,3.,27.655287143737));
583 | #558=CARTESIAN_POINT('Ctrl Pts',(20.7923267709184,3.00000000000001,31.3103586467822));
584 | #559=CARTESIAN_POINT('Ctrl Pts',(21.0269458582059,2.09352136927479,32.1859689748659));
585 | #560=CARTESIAN_POINT('Ctrl Pts',(21.3749229149598,0.749050214853733,33.4846369918321));
586 | #561=CARTESIAN_POINT('Ctrl Pts',(21.5687924449788,1.83186799063151E-14,
587 | 34.2081679063358));
588 | #562=CARTESIAN_POINT('Origin',(23.7757877956131,1.5,25.093168309504));
589 | #563=CARTESIAN_POINT('',(21.563781303548,3.,22.577636445752));
590 | #564=CARTESIAN_POINT('',(21.563781303548,3.,22.577636445752));
591 | #565=CARTESIAN_POINT('',(22.3250472474495,3.,25.4744187021781));
592 | #566=CARTESIAN_POINT('Origin',(18.662300207221,1.5,23.3401372311002));
593 | #567=CARTESIAN_POINT('Origin',(18.662300207221,3.,23.3401372311002));
594 | #568=CARTESIAN_POINT('Origin',(14.4251801086274,1.5,24.8577302850574));
595 | #569=CARTESIAN_POINT('',(17.1373037888882,3.,29.1839586984669));
596 | #570=CARTESIAN_POINT('',(17.1373037888882,3.,29.1839586984669));
597 | #571=CARTESIAN_POINT('',(15.874068848061,3.,24.4695017174037));
598 | #572=CARTESIAN_POINT('Origin',(20.0350812677554,1.5,28.4075015631594));
599 | #573=CARTESIAN_POINT('Origin',(20.0350812677554,3.,28.4075015631594));
600 | #574=CARTESIAN_POINT('Origin',(37.000000551343,0.,3.));
601 | #575=CARTESIAN_POINT('',(0.803847577293368,3.,3.));
602 | #576=CARTESIAN_POINT('',(33.9963304314487,3.,3.));
603 | #577=CARTESIAN_POINT('',(27.7500004135072,3.,3.));
604 | #578=CARTESIAN_POINT('',(33.9963304314487,75.5,3.));
605 | #579=CARTESIAN_POINT('',(33.9963304314487,0.,3.));
606 | #580=CARTESIAN_POINT('',(0.803847577293368,75.5,3.));
607 | #581=CARTESIAN_POINT('',(27.7500004135072,75.5,3.));
608 | #582=CARTESIAN_POINT('',(0.803847577293368,0.,3.));
609 | #583=CARTESIAN_POINT('Origin',(33.9409544973446,0.,48.2926234395208));
610 | #584=CARTESIAN_POINT('',(33.9446178905798,3.,45.2962913144534));
611 | #585=CARTESIAN_POINT('',(33.9557027664557,3.,36.2298418351986));
612 | #586=CARTESIAN_POINT('',(33.9446178905798,75.5,45.2962913144534));
613 | #587=CARTESIAN_POINT('',(33.9446178905798,0.,45.2962913144534));
614 | #588=CARTESIAN_POINT('',(33.9557027664557,75.5,36.2298418351986));
615 | #589=CARTESIAN_POINT('Origin',(12.940952255126,0.,45.2962913144534));
616 | #590=CARTESIAN_POINT('',(12.1371046778327,3.,45.2962913144534));
617 | #591=CARTESIAN_POINT('',(15.7204762653988,3.,45.2962913144534));
618 | #592=CARTESIAN_POINT('',(12.1371046778327,75.5,45.2962913144534));
619 | #593=CARTESIAN_POINT('',(12.1371046778327,0.,45.2962913144534));
620 | #594=CARTESIAN_POINT('',(15.7204762653988,75.5,45.2962913144534));
621 | #595=CARTESIAN_POINT('Origin',(18.5000002756715,75.5,24.1481456572267));
622 | #596=CARTESIAN_POINT('',(3.63815072388355,75.5,13.5777633471269));
623 | #597=CARTESIAN_POINT('Origin',(18.5000002756715,3.,24.1481456572267));
624 | #598=CARTESIAN_POINT('',(3.63815072388355,3.,13.5777633471269));
625 | #599=CARTESIAN_POINT('Origin',(37.000000551343,0.,0.));
626 | #600=CARTESIAN_POINT('',(0.,0.,0.));
627 | #601=CARTESIAN_POINT('Origin',(12.940952255126,0.,48.2962913144534));
628 | #602=CARTESIAN_POINT('',(12.940952255126,0.,48.2962913144534));
629 | #603=CARTESIAN_POINT('Origin',(0.,0.,0.));
630 | #604=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#608,
631 | 'DISTANCE_ACCURACY_VALUE',
632 | 'Maximum model space distance between geometric entities at asserted c
633 | onnectivities');
634 | #605=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#608,
635 | 'DISTANCE_ACCURACY_VALUE',
636 | 'Maximum model space distance between geometric entities at asserted c
637 | onnectivities');
638 | #606=(
639 | GEOMETRIC_REPRESENTATION_CONTEXT(3)
640 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#604))
641 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#608,#610,#611))
642 | REPRESENTATION_CONTEXT('','3D')
643 | );
644 | #607=(
645 | GEOMETRIC_REPRESENTATION_CONTEXT(3)
646 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#605))
647 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#608,#610,#611))
648 | REPRESENTATION_CONTEXT('','3D')
649 | );
650 | #608=(
651 | LENGTH_UNIT()
652 | NAMED_UNIT(*)
653 | SI_UNIT(.MILLI.,.METRE.)
654 | );
655 | #609=(
656 | LENGTH_UNIT()
657 | NAMED_UNIT(*)
658 | SI_UNIT($,.METRE.)
659 | );
660 | #610=(
661 | NAMED_UNIT(*)
662 | PLANE_ANGLE_UNIT()
663 | SI_UNIT($,.RADIAN.)
664 | );
665 | #611=(
666 | NAMED_UNIT(*)
667 | SI_UNIT($,.STERADIAN.)
668 | SOLID_ANGLE_UNIT()
669 | );
670 | #612=SHAPE_DEFINITION_REPRESENTATION(#613,#614);
671 | #613=PRODUCT_DEFINITION_SHAPE('',$,#616);
672 | #614=SHAPE_REPRESENTATION('',(#368),#606);
673 | #615=PRODUCT_DEFINITION_CONTEXT('part definition',#620,'design');
674 | #616=PRODUCT_DEFINITION('cover','cover v3',#617,#615);
675 | #617=PRODUCT_DEFINITION_FORMATION('',$,#622);
676 | #618=PRODUCT_RELATED_PRODUCT_CATEGORY('cover v3','cover v3',(#622));
677 | #619=APPLICATION_PROTOCOL_DEFINITION('international standard',
678 | 'ap242_managed_model_based_3d_engineering',2011,#620);
679 | #620=APPLICATION_CONTEXT('Managed model based 3d engineering');
680 | #621=PRODUCT_CONTEXT('part definition',#620,'mechanical');
681 | #622=PRODUCT('cover','cover v3',$,(#621));
682 | #623=PRESENTATION_STYLE_ASSIGNMENT((#624));
683 | #624=SURFACE_STYLE_USAGE(.BOTH.,#625);
684 | #625=SURFACE_SIDE_STYLE('',(#626));
685 | #626=SURFACE_STYLE_FILL_AREA(#627);
686 | #627=FILL_AREA_STYLE('Steel - Satin',(#628));
687 | #628=FILL_AREA_STYLE_COLOUR('Steel - Satin',#629);
688 | #629=COLOUR_RGB('Steel - Satin',0.627450980392157,0.627450980392157,0.627450980392157);
689 | ENDSEC;
690 | END-ISO-10303-21;
691 |
--------------------------------------------------------------------------------
/3d-files/front.step:
--------------------------------------------------------------------------------
1 | ISO-10303-21;
2 | HEADER;
3 | /* Generated by software containing ST-Developer
4 | * from STEP Tools, Inc. (www.steptools.com)
5 | */
6 |
7 | FILE_DESCRIPTION(
8 | /* description */ ('',
9 | 'CAx-IF Rec.Pracs.---Representation and Presentation of Product Manufa
10 | cturing Information (PMI)---4.0---2014-10-13'),
11 | /* implementation_level */ '2;1');
12 |
13 | FILE_NAME(
14 | /* name */ 'front.step',
15 | /* time_stamp */ '2025-01-26T21:29:07-08:00',
16 | /* author */ (''),
17 | /* organization */ (''),
18 | /* preprocessor_version */ 'ST-DEVELOPER v20',
19 | /* originating_system */ 'Autodesk Translation Framework v13.20.0.188',
20 |
21 | /* authorisation */ '');
22 |
23 | FILE_SCHEMA (('AP242_MANAGED_MODEL_BASED_3D_ENGINEERING_MIM_LF { 1 0 10303 442 1 1 4 }'));
24 | ENDSEC;
25 |
26 | DATA;
27 | #10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#886);
28 | #11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#893,#12);
29 | #12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#885);
30 | #13=STYLED_ITEM('',(#902),#14);
31 | #14=MANIFOLD_SOLID_BREP('Body1',#482);
32 | #15=FACE_BOUND('',#81,.T.);
33 | #16=FACE_BOUND('',#100,.T.);
34 | #17=FACE_BOUND('',#102,.T.);
35 | #18=FACE_BOUND('',#103,.T.);
36 | #19=FACE_BOUND('',#104,.T.);
37 | #20=FACE_BOUND('',#105,.T.);
38 | #21=(
39 | BOUNDED_CURVE()
40 | B_SPLINE_CURVE(5,(#712,#713,#714,#715,#716,#717,#718,#719,#720,#721,#722,
41 | #723,#724,#725,#726,#727,#728,#729,#730,#731,#732,#733,#734,#735,#736),
42 | .UNSPECIFIED.,.T.,.F.)
43 | B_SPLINE_CURVE_WITH_KNOTS((6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6),(-1.,
44 | -0.95,-0.9,-0.85,-0.8,-0.75,-0.7,-0.65,-0.6,-0.55,-0.5,-0.45,-0.4,-0.35,
45 | -0.3,-0.25,-0.2,-0.15,-0.1,-0.05,0.),.UNSPECIFIED.)
46 | CURVE()
47 | GEOMETRIC_REPRESENTATION_ITEM()
48 | RATIONAL_B_SPLINE_CURVE((1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,
49 | 1.,1.,1.,1.,1.,1.,1.,1.,1.))
50 | REPRESENTATION_ITEM('')
51 | );
52 | #22=(
53 | BOUNDED_CURVE()
54 | B_SPLINE_CURVE(5,(#739,#740,#741,#742,#743,#744,#745,#746,#747,#748,#749,
55 | #750,#751,#752,#753,#754,#755,#756,#757,#758,#759,#760,#761,#762,#763),
56 | .UNSPECIFIED.,.T.,.F.)
57 | B_SPLINE_CURVE_WITH_KNOTS((6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6),(-1.,
58 | -0.95,-0.9,-0.85,-0.8,-0.75,-0.7,-0.65,-0.6,-0.55,-0.5,-0.45,-0.4,-0.35,
59 | -0.3,-0.25,-0.2,-0.15,-0.1,-0.05,0.),.UNSPECIFIED.)
60 | CURVE()
61 | GEOMETRIC_REPRESENTATION_ITEM()
62 | RATIONAL_B_SPLINE_CURVE((1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,
63 | 1.,1.,1.,1.,1.,1.,1.,1.,1.))
64 | REPRESENTATION_ITEM('')
65 | );
66 | #23=(
67 | BOUNDED_SURFACE()
68 | B_SPLINE_SURFACE(5,1,((#661,#662),(#663,#664),(#665,#666),(#667,#668),(#669,
69 | #670),(#671,#672),(#673,#674),(#675,#676),(#677,#678),(#679,#680),(#681,
70 | #682),(#683,#684),(#685,#686),(#687,#688),(#689,#690),(#691,#692),(#693,
71 | #694),(#695,#696),(#697,#698),(#699,#700),(#701,#702),(#703,#704),(#705,
72 | #706),(#707,#708),(#709,#710)),.UNSPECIFIED.,.T.,.F.,.F.)
73 | B_SPLINE_SURFACE_WITH_KNOTS((6,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6),
74 | (2,2),(-1.,-0.95,-0.9,-0.85,-0.8,-0.75,-0.7,-0.65,-0.6,-0.55,-0.5,-0.45,
75 | -0.4,-0.35,-0.3,-0.25,-0.2,-0.15,-0.1,-0.05,0.),(0.,0.05),.UNSPECIFIED.)
76 | GEOMETRIC_REPRESENTATION_ITEM()
77 | RATIONAL_B_SPLINE_SURFACE(((1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,
78 | 1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,
79 | 1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,1.),(1.,
80 | 1.),(1.,1.)))
81 | REPRESENTATION_ITEM('')
82 | SURFACE()
83 | );
84 | #24=PLANE('',#499);
85 | #25=PLANE('',#500);
86 | #26=PLANE('',#504);
87 | #27=PLANE('',#508);
88 | #28=PLANE('',#510);
89 | #29=PLANE('',#513);
90 | #30=PLANE('',#514);
91 | #31=PLANE('',#515);
92 | #32=PLANE('',#516);
93 | #33=PLANE('',#517);
94 | #34=PLANE('',#518);
95 | #35=PLANE('',#519);
96 | #36=PLANE('',#520);
97 | #37=PLANE('',#521);
98 | #38=PLANE('',#522);
99 | #39=PLANE('',#523);
100 | #40=PLANE('',#524);
101 | #41=PLANE('',#525);
102 | #42=PLANE('',#526);
103 | #43=PLANE('',#527);
104 | #44=PLANE('',#528);
105 | #45=PLANE('',#529);
106 | #46=FACE_OUTER_BOUND('',#73,.T.);
107 | #47=FACE_OUTER_BOUND('',#74,.T.);
108 | #48=FACE_OUTER_BOUND('',#75,.T.);
109 | #49=FACE_OUTER_BOUND('',#76,.T.);
110 | #50=FACE_OUTER_BOUND('',#77,.T.);
111 | #51=FACE_OUTER_BOUND('',#78,.T.);
112 | #52=FACE_OUTER_BOUND('',#79,.T.);
113 | #53=FACE_OUTER_BOUND('',#80,.T.);
114 | #54=FACE_OUTER_BOUND('',#82,.T.);
115 | #55=FACE_OUTER_BOUND('',#83,.T.);
116 | #56=FACE_OUTER_BOUND('',#84,.T.);
117 | #57=FACE_OUTER_BOUND('',#85,.T.);
118 | #58=FACE_OUTER_BOUND('',#86,.T.);
119 | #59=FACE_OUTER_BOUND('',#87,.T.);
120 | #60=FACE_OUTER_BOUND('',#88,.T.);
121 | #61=FACE_OUTER_BOUND('',#89,.T.);
122 | #62=FACE_OUTER_BOUND('',#90,.T.);
123 | #63=FACE_OUTER_BOUND('',#91,.T.);
124 | #64=FACE_OUTER_BOUND('',#92,.T.);
125 | #65=FACE_OUTER_BOUND('',#93,.T.);
126 | #66=FACE_OUTER_BOUND('',#94,.T.);
127 | #67=FACE_OUTER_BOUND('',#95,.T.);
128 | #68=FACE_OUTER_BOUND('',#96,.T.);
129 | #69=FACE_OUTER_BOUND('',#97,.T.);
130 | #70=FACE_OUTER_BOUND('',#98,.T.);
131 | #71=FACE_OUTER_BOUND('',#99,.T.);
132 | #72=FACE_OUTER_BOUND('',#101,.T.);
133 | #73=EDGE_LOOP('',(#325,#326,#327,#328));
134 | #74=EDGE_LOOP('',(#329));
135 | #75=EDGE_LOOP('',(#330,#331,#332,#333));
136 | #76=EDGE_LOOP('',(#334));
137 | #77=EDGE_LOOP('',(#335,#336,#337,#338));
138 | #78=EDGE_LOOP('',(#339));
139 | #79=EDGE_LOOP('',(#340,#341,#342,#343));
140 | #80=EDGE_LOOP('',(#344,#345,#346,#347,#348,#349));
141 | #81=EDGE_LOOP('',(#350,#351,#352,#353,#354,#355,#356,#357));
142 | #82=EDGE_LOOP('',(#358,#359,#360,#361));
143 | #83=EDGE_LOOP('',(#362,#363,#364,#365));
144 | #84=EDGE_LOOP('',(#366,#367,#368,#369));
145 | #85=EDGE_LOOP('',(#370,#371,#372,#373));
146 | #86=EDGE_LOOP('',(#374,#375,#376,#377));
147 | #87=EDGE_LOOP('',(#378,#379,#380,#381));
148 | #88=EDGE_LOOP('',(#382,#383,#384,#385));
149 | #89=EDGE_LOOP('',(#386,#387,#388,#389));
150 | #90=EDGE_LOOP('',(#390,#391,#392,#393));
151 | #91=EDGE_LOOP('',(#394,#395,#396,#397));
152 | #92=EDGE_LOOP('',(#398,#399,#400,#401));
153 | #93=EDGE_LOOP('',(#402,#403,#404,#405));
154 | #94=EDGE_LOOP('',(#406,#407,#408,#409));
155 | #95=EDGE_LOOP('',(#410,#411,#412,#413));
156 | #96=EDGE_LOOP('',(#414,#415,#416,#417));
157 | #97=EDGE_LOOP('',(#418,#419,#420,#421));
158 | #98=EDGE_LOOP('',(#422,#423,#424,#425));
159 | #99=EDGE_LOOP('',(#426,#427,#428,#429,#430,#431,#432,#433));
160 | #100=EDGE_LOOP('',(#434,#435,#436,#437));
161 | #101=EDGE_LOOP('',(#438,#439,#440,#441,#442,#443));
162 | #102=EDGE_LOOP('',(#444));
163 | #103=EDGE_LOOP('',(#445));
164 | #104=EDGE_LOOP('',(#446));
165 | #105=EDGE_LOOP('',(#447,#448,#449,#450));
166 | #106=LINE('',#658,#159);
167 | #107=LINE('',#738,#160);
168 | #108=LINE('',#769,#161);
169 | #109=LINE('',#777,#162);
170 | #110=LINE('',#780,#163);
171 | #111=LINE('',#783,#164);
172 | #112=LINE('',#787,#165);
173 | #113=LINE('',#789,#166);
174 | #114=LINE('',#790,#167);
175 | #115=LINE('',#793,#168);
176 | #116=LINE('',#795,#169);
177 | #117=LINE('',#797,#170);
178 | #118=LINE('',#799,#171);
179 | #119=LINE('',#801,#172);
180 | #120=LINE('',#803,#173);
181 | #121=LINE('',#805,#174);
182 | #122=LINE('',#806,#175);
183 | #123=LINE('',#809,#176);
184 | #124=LINE('',#810,#177);
185 | #125=LINE('',#814,#178);
186 | #126=LINE('',#817,#179);
187 | #127=LINE('',#819,#180);
188 | #128=LINE('',#820,#181);
189 | #129=LINE('',#824,#182);
190 | #130=LINE('',#825,#183);
191 | #131=LINE('',#826,#184);
192 | #132=LINE('',#829,#185);
193 | #133=LINE('',#830,#186);
194 | #134=LINE('',#833,#187);
195 | #135=LINE('',#834,#188);
196 | #136=LINE('',#837,#189);
197 | #137=LINE('',#838,#190);
198 | #138=LINE('',#841,#191);
199 | #139=LINE('',#842,#192);
200 | #140=LINE('',#845,#193);
201 | #141=LINE('',#846,#194);
202 | #142=LINE('',#849,#195);
203 | #143=LINE('',#850,#196);
204 | #144=LINE('',#852,#197);
205 | #145=LINE('',#856,#198);
206 | #146=LINE('',#858,#199);
207 | #147=LINE('',#860,#200);
208 | #148=LINE('',#861,#201);
209 | #149=LINE('',#864,#202);
210 | #150=LINE('',#866,#203);
211 | #151=LINE('',#867,#204);
212 | #152=LINE('',#870,#205);
213 | #153=LINE('',#872,#206);
214 | #154=LINE('',#873,#207);
215 | #155=LINE('',#875,#208);
216 | #156=LINE('',#876,#209);
217 | #157=LINE('',#878,#210);
218 | #158=LINE('',#880,#211);
219 | #159=VECTOR('',#536,1.49999999999999);
220 | #160=VECTOR('',#541,10.);
221 | #161=VECTOR('',#548,1.5);
222 | #162=VECTOR('',#557,10.);
223 | #163=VECTOR('',#560,10.);
224 | #164=VECTOR('',#563,10.);
225 | #165=VECTOR('',#566,10.);
226 | #166=VECTOR('',#567,10.);
227 | #167=VECTOR('',#568,10.);
228 | #168=VECTOR('',#569,10.);
229 | #169=VECTOR('',#570,10.);
230 | #170=VECTOR('',#571,10.);
231 | #171=VECTOR('',#572,10.);
232 | #172=VECTOR('',#573,10.);
233 | #173=VECTOR('',#574,10.);
234 | #174=VECTOR('',#575,10.);
235 | #175=VECTOR('',#576,10.);
236 | #176=VECTOR('',#579,10.);
237 | #177=VECTOR('',#580,10.);
238 | #178=VECTOR('',#585,10.);
239 | #179=VECTOR('',#588,10.);
240 | #180=VECTOR('',#589,10.);
241 | #181=VECTOR('',#590,10.);
242 | #182=VECTOR('',#593,10.);
243 | #183=VECTOR('',#594,10.);
244 | #184=VECTOR('',#595,10.);
245 | #185=VECTOR('',#598,10.);
246 | #186=VECTOR('',#599,10.);
247 | #187=VECTOR('',#602,10.);
248 | #188=VECTOR('',#603,10.);
249 | #189=VECTOR('',#606,10.);
250 | #190=VECTOR('',#607,10.);
251 | #191=VECTOR('',#610,10.);
252 | #192=VECTOR('',#611,10.);
253 | #193=VECTOR('',#614,10.);
254 | #194=VECTOR('',#615,10.);
255 | #195=VECTOR('',#618,10.);
256 | #196=VECTOR('',#619,10.);
257 | #197=VECTOR('',#622,10.);
258 | #198=VECTOR('',#625,10.);
259 | #199=VECTOR('',#626,10.);
260 | #200=VECTOR('',#627,10.);
261 | #201=VECTOR('',#628,10.);
262 | #202=VECTOR('',#631,10.);
263 | #203=VECTOR('',#632,10.);
264 | #204=VECTOR('',#633,10.);
265 | #205=VECTOR('',#636,10.);
266 | #206=VECTOR('',#637,10.);
267 | #207=VECTOR('',#638,10.);
268 | #208=VECTOR('',#641,10.);
269 | #209=VECTOR('',#642,10.);
270 | #210=VECTOR('',#645,10.);
271 | #211=VECTOR('',#648,10.);
272 | #212=CIRCLE('',#497,1.49999999999999);
273 | #213=CIRCLE('',#498,1.49999999999999);
274 | #214=CIRCLE('',#502,1.5);
275 | #215=CIRCLE('',#503,1.5);
276 | #216=CIRCLE('',#506,3.);
277 | #217=CIRCLE('',#507,3.);
278 | #218=CIRCLE('',#509,3.);
279 | #219=CIRCLE('',#512,3.);
280 | #220=VERTEX_POINT('',#655);
281 | #221=VERTEX_POINT('',#657);
282 | #222=VERTEX_POINT('',#711);
283 | #223=VERTEX_POINT('',#737);
284 | #224=VERTEX_POINT('',#766);
285 | #225=VERTEX_POINT('',#768);
286 | #226=VERTEX_POINT('',#773);
287 | #227=VERTEX_POINT('',#774);
288 | #228=VERTEX_POINT('',#776);
289 | #229=VERTEX_POINT('',#778);
290 | #230=VERTEX_POINT('',#782);
291 | #231=VERTEX_POINT('',#784);
292 | #232=VERTEX_POINT('',#786);
293 | #233=VERTEX_POINT('',#788);
294 | #234=VERTEX_POINT('',#791);
295 | #235=VERTEX_POINT('',#792);
296 | #236=VERTEX_POINT('',#794);
297 | #237=VERTEX_POINT('',#796);
298 | #238=VERTEX_POINT('',#798);
299 | #239=VERTEX_POINT('',#800);
300 | #240=VERTEX_POINT('',#802);
301 | #241=VERTEX_POINT('',#804);
302 | #242=VERTEX_POINT('',#808);
303 | #243=VERTEX_POINT('',#812);
304 | #244=VERTEX_POINT('',#816);
305 | #245=VERTEX_POINT('',#818);
306 | #246=VERTEX_POINT('',#822);
307 | #247=VERTEX_POINT('',#823);
308 | #248=VERTEX_POINT('',#828);
309 | #249=VERTEX_POINT('',#832);
310 | #250=VERTEX_POINT('',#836);
311 | #251=VERTEX_POINT('',#840);
312 | #252=VERTEX_POINT('',#844);
313 | #253=VERTEX_POINT('',#848);
314 | #254=VERTEX_POINT('',#854);
315 | #255=VERTEX_POINT('',#855);
316 | #256=VERTEX_POINT('',#857);
317 | #257=VERTEX_POINT('',#859);
318 | #258=VERTEX_POINT('',#863);
319 | #259=VERTEX_POINT('',#865);
320 | #260=VERTEX_POINT('',#869);
321 | #261=VERTEX_POINT('',#871);
322 | #262=EDGE_CURVE('',#220,#220,#212,.T.);
323 | #263=EDGE_CURVE('',#220,#221,#106,.T.);
324 | #264=EDGE_CURVE('',#221,#221,#213,.T.);
325 | #265=EDGE_CURVE('',#222,#222,#21,.T.);
326 | #266=EDGE_CURVE('',#222,#223,#107,.T.);
327 | #267=EDGE_CURVE('',#223,#223,#22,.T.);
328 | #268=EDGE_CURVE('',#224,#224,#214,.T.);
329 | #269=EDGE_CURVE('',#224,#225,#108,.T.);
330 | #270=EDGE_CURVE('',#225,#225,#215,.T.);
331 | #271=EDGE_CURVE('',#226,#227,#216,.T.);
332 | #272=EDGE_CURVE('',#227,#228,#109,.T.);
333 | #273=EDGE_CURVE('',#228,#229,#217,.T.);
334 | #274=EDGE_CURVE('',#229,#226,#110,.T.);
335 | #275=EDGE_CURVE('',#226,#230,#111,.T.);
336 | #276=EDGE_CURVE('',#231,#230,#218,.T.);
337 | #277=EDGE_CURVE('',#231,#232,#112,.T.);
338 | #278=EDGE_CURVE('',#232,#233,#113,.T.);
339 | #279=EDGE_CURVE('',#233,#227,#114,.T.);
340 | #280=EDGE_CURVE('',#234,#235,#115,.T.);
341 | #281=EDGE_CURVE('',#235,#236,#116,.T.);
342 | #282=EDGE_CURVE('',#236,#237,#117,.T.);
343 | #283=EDGE_CURVE('',#237,#238,#118,.T.);
344 | #284=EDGE_CURVE('',#238,#239,#119,.T.);
345 | #285=EDGE_CURVE('',#239,#240,#120,.T.);
346 | #286=EDGE_CURVE('',#240,#241,#121,.T.);
347 | #287=EDGE_CURVE('',#241,#234,#122,.T.);
348 | #288=EDGE_CURVE('',#242,#229,#123,.T.);
349 | #289=EDGE_CURVE('',#230,#242,#124,.T.);
350 | #290=EDGE_CURVE('',#242,#243,#219,.T.);
351 | #291=EDGE_CURVE('',#243,#231,#125,.T.);
352 | #292=EDGE_CURVE('',#244,#233,#126,.T.);
353 | #293=EDGE_CURVE('',#232,#245,#127,.T.);
354 | #294=EDGE_CURVE('',#245,#244,#128,.T.);
355 | #295=EDGE_CURVE('',#246,#247,#129,.T.);
356 | #296=EDGE_CURVE('',#246,#234,#130,.T.);
357 | #297=EDGE_CURVE('',#247,#241,#131,.T.);
358 | #298=EDGE_CURVE('',#247,#248,#132,.T.);
359 | #299=EDGE_CURVE('',#248,#240,#133,.T.);
360 | #300=EDGE_CURVE('',#248,#249,#134,.T.);
361 | #301=EDGE_CURVE('',#249,#239,#135,.T.);
362 | #302=EDGE_CURVE('',#249,#250,#136,.T.);
363 | #303=EDGE_CURVE('',#250,#238,#137,.T.);
364 | #304=EDGE_CURVE('',#250,#251,#138,.T.);
365 | #305=EDGE_CURVE('',#251,#237,#139,.T.);
366 | #306=EDGE_CURVE('',#251,#252,#140,.T.);
367 | #307=EDGE_CURVE('',#252,#236,#141,.T.);
368 | #308=EDGE_CURVE('',#252,#253,#142,.T.);
369 | #309=EDGE_CURVE('',#253,#235,#143,.T.);
370 | #310=EDGE_CURVE('',#253,#246,#144,.T.);
371 | #311=EDGE_CURVE('',#254,#255,#145,.T.);
372 | #312=EDGE_CURVE('',#254,#256,#146,.T.);
373 | #313=EDGE_CURVE('',#257,#256,#147,.T.);
374 | #314=EDGE_CURVE('',#255,#257,#148,.T.);
375 | #315=EDGE_CURVE('',#255,#258,#149,.T.);
376 | #316=EDGE_CURVE('',#259,#257,#150,.T.);
377 | #317=EDGE_CURVE('',#258,#259,#151,.T.);
378 | #318=EDGE_CURVE('',#258,#260,#152,.T.);
379 | #319=EDGE_CURVE('',#261,#259,#153,.T.);
380 | #320=EDGE_CURVE('',#260,#261,#154,.T.);
381 | #321=EDGE_CURVE('',#260,#254,#155,.T.);
382 | #322=EDGE_CURVE('',#256,#261,#156,.T.);
383 | #323=EDGE_CURVE('',#228,#244,#157,.T.);
384 | #324=EDGE_CURVE('',#243,#245,#158,.T.);
385 | #325=ORIENTED_EDGE('',*,*,#262,.F.);
386 | #326=ORIENTED_EDGE('',*,*,#263,.T.);
387 | #327=ORIENTED_EDGE('',*,*,#264,.T.);
388 | #328=ORIENTED_EDGE('',*,*,#263,.F.);
389 | #329=ORIENTED_EDGE('',*,*,#264,.F.);
390 | #330=ORIENTED_EDGE('',*,*,#265,.F.);
391 | #331=ORIENTED_EDGE('',*,*,#266,.T.);
392 | #332=ORIENTED_EDGE('',*,*,#267,.T.);
393 | #333=ORIENTED_EDGE('',*,*,#266,.F.);
394 | #334=ORIENTED_EDGE('',*,*,#267,.F.);
395 | #335=ORIENTED_EDGE('',*,*,#268,.F.);
396 | #336=ORIENTED_EDGE('',*,*,#269,.T.);
397 | #337=ORIENTED_EDGE('',*,*,#270,.T.);
398 | #338=ORIENTED_EDGE('',*,*,#269,.F.);
399 | #339=ORIENTED_EDGE('',*,*,#270,.F.);
400 | #340=ORIENTED_EDGE('',*,*,#271,.T.);
401 | #341=ORIENTED_EDGE('',*,*,#272,.T.);
402 | #342=ORIENTED_EDGE('',*,*,#273,.T.);
403 | #343=ORIENTED_EDGE('',*,*,#274,.T.);
404 | #344=ORIENTED_EDGE('',*,*,#271,.F.);
405 | #345=ORIENTED_EDGE('',*,*,#275,.T.);
406 | #346=ORIENTED_EDGE('',*,*,#276,.F.);
407 | #347=ORIENTED_EDGE('',*,*,#277,.T.);
408 | #348=ORIENTED_EDGE('',*,*,#278,.T.);
409 | #349=ORIENTED_EDGE('',*,*,#279,.T.);
410 | #350=ORIENTED_EDGE('',*,*,#280,.T.);
411 | #351=ORIENTED_EDGE('',*,*,#281,.T.);
412 | #352=ORIENTED_EDGE('',*,*,#282,.T.);
413 | #353=ORIENTED_EDGE('',*,*,#283,.T.);
414 | #354=ORIENTED_EDGE('',*,*,#284,.T.);
415 | #355=ORIENTED_EDGE('',*,*,#285,.T.);
416 | #356=ORIENTED_EDGE('',*,*,#286,.T.);
417 | #357=ORIENTED_EDGE('',*,*,#287,.T.);
418 | #358=ORIENTED_EDGE('',*,*,#274,.F.);
419 | #359=ORIENTED_EDGE('',*,*,#288,.F.);
420 | #360=ORIENTED_EDGE('',*,*,#289,.F.);
421 | #361=ORIENTED_EDGE('',*,*,#275,.F.);
422 | #362=ORIENTED_EDGE('',*,*,#276,.T.);
423 | #363=ORIENTED_EDGE('',*,*,#289,.T.);
424 | #364=ORIENTED_EDGE('',*,*,#290,.T.);
425 | #365=ORIENTED_EDGE('',*,*,#291,.T.);
426 | #366=ORIENTED_EDGE('',*,*,#292,.T.);
427 | #367=ORIENTED_EDGE('',*,*,#278,.F.);
428 | #368=ORIENTED_EDGE('',*,*,#293,.T.);
429 | #369=ORIENTED_EDGE('',*,*,#294,.T.);
430 | #370=ORIENTED_EDGE('',*,*,#295,.F.);
431 | #371=ORIENTED_EDGE('',*,*,#296,.T.);
432 | #372=ORIENTED_EDGE('',*,*,#287,.F.);
433 | #373=ORIENTED_EDGE('',*,*,#297,.F.);
434 | #374=ORIENTED_EDGE('',*,*,#298,.F.);
435 | #375=ORIENTED_EDGE('',*,*,#297,.T.);
436 | #376=ORIENTED_EDGE('',*,*,#286,.F.);
437 | #377=ORIENTED_EDGE('',*,*,#299,.F.);
438 | #378=ORIENTED_EDGE('',*,*,#300,.F.);
439 | #379=ORIENTED_EDGE('',*,*,#299,.T.);
440 | #380=ORIENTED_EDGE('',*,*,#285,.F.);
441 | #381=ORIENTED_EDGE('',*,*,#301,.F.);
442 | #382=ORIENTED_EDGE('',*,*,#302,.F.);
443 | #383=ORIENTED_EDGE('',*,*,#301,.T.);
444 | #384=ORIENTED_EDGE('',*,*,#284,.F.);
445 | #385=ORIENTED_EDGE('',*,*,#303,.F.);
446 | #386=ORIENTED_EDGE('',*,*,#304,.F.);
447 | #387=ORIENTED_EDGE('',*,*,#303,.T.);
448 | #388=ORIENTED_EDGE('',*,*,#283,.F.);
449 | #389=ORIENTED_EDGE('',*,*,#305,.F.);
450 | #390=ORIENTED_EDGE('',*,*,#306,.F.);
451 | #391=ORIENTED_EDGE('',*,*,#305,.T.);
452 | #392=ORIENTED_EDGE('',*,*,#282,.F.);
453 | #393=ORIENTED_EDGE('',*,*,#307,.F.);
454 | #394=ORIENTED_EDGE('',*,*,#308,.F.);
455 | #395=ORIENTED_EDGE('',*,*,#307,.T.);
456 | #396=ORIENTED_EDGE('',*,*,#281,.F.);
457 | #397=ORIENTED_EDGE('',*,*,#309,.F.);
458 | #398=ORIENTED_EDGE('',*,*,#310,.F.);
459 | #399=ORIENTED_EDGE('',*,*,#309,.T.);
460 | #400=ORIENTED_EDGE('',*,*,#280,.F.);
461 | #401=ORIENTED_EDGE('',*,*,#296,.F.);
462 | #402=ORIENTED_EDGE('',*,*,#311,.F.);
463 | #403=ORIENTED_EDGE('',*,*,#312,.T.);
464 | #404=ORIENTED_EDGE('',*,*,#313,.F.);
465 | #405=ORIENTED_EDGE('',*,*,#314,.F.);
466 | #406=ORIENTED_EDGE('',*,*,#315,.F.);
467 | #407=ORIENTED_EDGE('',*,*,#314,.T.);
468 | #408=ORIENTED_EDGE('',*,*,#316,.F.);
469 | #409=ORIENTED_EDGE('',*,*,#317,.F.);
470 | #410=ORIENTED_EDGE('',*,*,#318,.F.);
471 | #411=ORIENTED_EDGE('',*,*,#317,.T.);
472 | #412=ORIENTED_EDGE('',*,*,#319,.F.);
473 | #413=ORIENTED_EDGE('',*,*,#320,.F.);
474 | #414=ORIENTED_EDGE('',*,*,#321,.F.);
475 | #415=ORIENTED_EDGE('',*,*,#320,.T.);
476 | #416=ORIENTED_EDGE('',*,*,#322,.F.);
477 | #417=ORIENTED_EDGE('',*,*,#312,.F.);
478 | #418=ORIENTED_EDGE('',*,*,#272,.F.);
479 | #419=ORIENTED_EDGE('',*,*,#279,.F.);
480 | #420=ORIENTED_EDGE('',*,*,#292,.F.);
481 | #421=ORIENTED_EDGE('',*,*,#323,.F.);
482 | #422=ORIENTED_EDGE('',*,*,#291,.F.);
483 | #423=ORIENTED_EDGE('',*,*,#324,.T.);
484 | #424=ORIENTED_EDGE('',*,*,#293,.F.);
485 | #425=ORIENTED_EDGE('',*,*,#277,.F.);
486 | #426=ORIENTED_EDGE('',*,*,#295,.T.);
487 | #427=ORIENTED_EDGE('',*,*,#298,.T.);
488 | #428=ORIENTED_EDGE('',*,*,#300,.T.);
489 | #429=ORIENTED_EDGE('',*,*,#302,.T.);
490 | #430=ORIENTED_EDGE('',*,*,#304,.T.);
491 | #431=ORIENTED_EDGE('',*,*,#306,.T.);
492 | #432=ORIENTED_EDGE('',*,*,#308,.T.);
493 | #433=ORIENTED_EDGE('',*,*,#310,.T.);
494 | #434=ORIENTED_EDGE('',*,*,#321,.T.);
495 | #435=ORIENTED_EDGE('',*,*,#311,.T.);
496 | #436=ORIENTED_EDGE('',*,*,#315,.T.);
497 | #437=ORIENTED_EDGE('',*,*,#318,.T.);
498 | #438=ORIENTED_EDGE('',*,*,#273,.F.);
499 | #439=ORIENTED_EDGE('',*,*,#323,.T.);
500 | #440=ORIENTED_EDGE('',*,*,#294,.F.);
501 | #441=ORIENTED_EDGE('',*,*,#324,.F.);
502 | #442=ORIENTED_EDGE('',*,*,#290,.F.);
503 | #443=ORIENTED_EDGE('',*,*,#288,.T.);
504 | #444=ORIENTED_EDGE('',*,*,#262,.T.);
505 | #445=ORIENTED_EDGE('',*,*,#265,.T.);
506 | #446=ORIENTED_EDGE('',*,*,#268,.T.);
507 | #447=ORIENTED_EDGE('',*,*,#322,.T.);
508 | #448=ORIENTED_EDGE('',*,*,#319,.T.);
509 | #449=ORIENTED_EDGE('',*,*,#316,.T.);
510 | #450=ORIENTED_EDGE('',*,*,#313,.T.);
511 | #451=CYLINDRICAL_SURFACE('',#496,1.49999999999999);
512 | #452=CYLINDRICAL_SURFACE('',#501,1.5);
513 | #453=CYLINDRICAL_SURFACE('',#505,3.);
514 | #454=CYLINDRICAL_SURFACE('',#511,3.);
515 | #455=ADVANCED_FACE('',(#46),#451,.F.);
516 | #456=ADVANCED_FACE('',(#47),#24,.T.);
517 | #457=ADVANCED_FACE('',(#48),#23,.F.);
518 | #458=ADVANCED_FACE('',(#49),#25,.T.);
519 | #459=ADVANCED_FACE('',(#50),#452,.F.);
520 | #460=ADVANCED_FACE('',(#51),#26,.T.);
521 | #461=ADVANCED_FACE('',(#52),#453,.T.);
522 | #462=ADVANCED_FACE('',(#53,#15),#27,.T.);
523 | #463=ADVANCED_FACE('',(#54),#28,.T.);
524 | #464=ADVANCED_FACE('',(#55),#454,.T.);
525 | #465=ADVANCED_FACE('',(#56),#29,.T.);
526 | #466=ADVANCED_FACE('',(#57),#30,.T.);
527 | #467=ADVANCED_FACE('',(#58),#31,.T.);
528 | #468=ADVANCED_FACE('',(#59),#32,.T.);
529 | #469=ADVANCED_FACE('',(#60),#33,.T.);
530 | #470=ADVANCED_FACE('',(#61),#34,.T.);
531 | #471=ADVANCED_FACE('',(#62),#35,.T.);
532 | #472=ADVANCED_FACE('',(#63),#36,.T.);
533 | #473=ADVANCED_FACE('',(#64),#37,.T.);
534 | #474=ADVANCED_FACE('',(#65),#38,.T.);
535 | #475=ADVANCED_FACE('',(#66),#39,.T.);
536 | #476=ADVANCED_FACE('',(#67),#40,.T.);
537 | #477=ADVANCED_FACE('',(#68),#41,.T.);
538 | #478=ADVANCED_FACE('',(#69),#42,.T.);
539 | #479=ADVANCED_FACE('',(#70),#43,.T.);
540 | #480=ADVANCED_FACE('',(#71,#16),#44,.T.);
541 | #481=ADVANCED_FACE('',(#72,#17,#18,#19,#20),#45,.T.);
542 | #482=CLOSED_SHELL('',(#455,#456,#457,#458,#459,#460,#461,#462,#463,#464,
543 | #465,#466,#467,#468,#469,#470,#471,#472,#473,#474,#475,#476,#477,#478,#479,
544 | #480,#481));
545 | #483=DERIVED_UNIT_ELEMENT(#485,1.);
546 | #484=DERIVED_UNIT_ELEMENT(#888,-3.);
547 | #485=(
548 | MASS_UNIT()
549 | NAMED_UNIT(*)
550 | SI_UNIT(.KILO.,.GRAM.)
551 | );
552 | #486=DERIVED_UNIT((#483,#484));
553 | #487=MEASURE_REPRESENTATION_ITEM('density measure',
554 | POSITIVE_RATIO_MEASURE(7850.),#486);
555 | #488=PROPERTY_DEFINITION_REPRESENTATION(#493,#490);
556 | #489=PROPERTY_DEFINITION_REPRESENTATION(#494,#491);
557 | #490=REPRESENTATION('material name',(#492),#885);
558 | #491=REPRESENTATION('density',(#487),#885);
559 | #492=DESCRIPTIVE_REPRESENTATION_ITEM('Steel','Steel');
560 | #493=PROPERTY_DEFINITION('material property','material name',#895);
561 | #494=PROPERTY_DEFINITION('material property','density of part',#895);
562 | #495=AXIS2_PLACEMENT_3D('',#653,#530,#531);
563 | #496=AXIS2_PLACEMENT_3D('',#654,#532,#533);
564 | #497=AXIS2_PLACEMENT_3D('',#656,#534,#535);
565 | #498=AXIS2_PLACEMENT_3D('',#659,#537,#538);
566 | #499=AXIS2_PLACEMENT_3D('',#660,#539,#540);
567 | #500=AXIS2_PLACEMENT_3D('',#764,#542,#543);
568 | #501=AXIS2_PLACEMENT_3D('',#765,#544,#545);
569 | #502=AXIS2_PLACEMENT_3D('',#767,#546,#547);
570 | #503=AXIS2_PLACEMENT_3D('',#770,#549,#550);
571 | #504=AXIS2_PLACEMENT_3D('',#771,#551,#552);
572 | #505=AXIS2_PLACEMENT_3D('',#772,#553,#554);
573 | #506=AXIS2_PLACEMENT_3D('',#775,#555,#556);
574 | #507=AXIS2_PLACEMENT_3D('',#779,#558,#559);
575 | #508=AXIS2_PLACEMENT_3D('',#781,#561,#562);
576 | #509=AXIS2_PLACEMENT_3D('',#785,#564,#565);
577 | #510=AXIS2_PLACEMENT_3D('',#807,#577,#578);
578 | #511=AXIS2_PLACEMENT_3D('',#811,#581,#582);
579 | #512=AXIS2_PLACEMENT_3D('',#813,#583,#584);
580 | #513=AXIS2_PLACEMENT_3D('',#815,#586,#587);
581 | #514=AXIS2_PLACEMENT_3D('',#821,#591,#592);
582 | #515=AXIS2_PLACEMENT_3D('',#827,#596,#597);
583 | #516=AXIS2_PLACEMENT_3D('',#831,#600,#601);
584 | #517=AXIS2_PLACEMENT_3D('',#835,#604,#605);
585 | #518=AXIS2_PLACEMENT_3D('',#839,#608,#609);
586 | #519=AXIS2_PLACEMENT_3D('',#843,#612,#613);
587 | #520=AXIS2_PLACEMENT_3D('',#847,#616,#617);
588 | #521=AXIS2_PLACEMENT_3D('',#851,#620,#621);
589 | #522=AXIS2_PLACEMENT_3D('',#853,#623,#624);
590 | #523=AXIS2_PLACEMENT_3D('',#862,#629,#630);
591 | #524=AXIS2_PLACEMENT_3D('',#868,#634,#635);
592 | #525=AXIS2_PLACEMENT_3D('',#874,#639,#640);
593 | #526=AXIS2_PLACEMENT_3D('',#877,#643,#644);
594 | #527=AXIS2_PLACEMENT_3D('',#879,#646,#647);
595 | #528=AXIS2_PLACEMENT_3D('',#881,#649,#650);
596 | #529=AXIS2_PLACEMENT_3D('',#882,#651,#652);
597 | #530=DIRECTION('axis',(0.,0.,1.));
598 | #531=DIRECTION('refdir',(1.,0.,0.));
599 | #532=DIRECTION('center_axis',(0.,0.,1.));
600 | #533=DIRECTION('ref_axis',(1.,0.,0.));
601 | #534=DIRECTION('center_axis',(0.,0.,1.));
602 | #535=DIRECTION('ref_axis',(1.,0.,0.));
603 | #536=DIRECTION('',(0.,0.,1.));
604 | #537=DIRECTION('center_axis',(0.,0.,1.));
605 | #538=DIRECTION('ref_axis',(1.,0.,0.));
606 | #539=DIRECTION('center_axis',(0.,0.,-1.));
607 | #540=DIRECTION('ref_axis',(1.,0.,0.));
608 | #541=DIRECTION('',(0.,0.,1.));
609 | #542=DIRECTION('center_axis',(0.,0.,-1.));
610 | #543=DIRECTION('ref_axis',(1.,0.,0.));
611 | #544=DIRECTION('center_axis',(0.,0.,1.));
612 | #545=DIRECTION('ref_axis',(1.,0.,0.));
613 | #546=DIRECTION('center_axis',(0.,0.,1.));
614 | #547=DIRECTION('ref_axis',(1.,0.,0.));
615 | #548=DIRECTION('',(0.,0.,1.));
616 | #549=DIRECTION('center_axis',(0.,0.,1.));
617 | #550=DIRECTION('ref_axis',(1.,0.,0.));
618 | #551=DIRECTION('center_axis',(0.,0.,-1.));
619 | #552=DIRECTION('ref_axis',(1.,0.,0.));
620 | #553=DIRECTION('center_axis',(0.,0.,1.));
621 | #554=DIRECTION('ref_axis',(0.707106781186543,0.707106781186552,0.));
622 | #555=DIRECTION('center_axis',(0.,0.,-1.));
623 | #556=DIRECTION('ref_axis',(0.707106781186543,0.707106781186552,0.));
624 | #557=DIRECTION('',(0.,0.,-1.));
625 | #558=DIRECTION('center_axis',(0.,0.,1.));
626 | #559=DIRECTION('ref_axis',(0.707106781186543,0.707106781186552,0.));
627 | #560=DIRECTION('',(0.,0.,1.));
628 | #561=DIRECTION('center_axis',(0.,0.,1.));
629 | #562=DIRECTION('ref_axis',(1.,0.,0.));
630 | #563=DIRECTION('',(-1.,0.,0.));
631 | #564=DIRECTION('center_axis',(0.,0.,-1.));
632 | #565=DIRECTION('ref_axis',(-0.707106781186548,0.707106781186548,0.));
633 | #566=DIRECTION('',(6.93889390390723E-17,-1.,0.));
634 | #567=DIRECTION('',(1.,6.84266887288232E-17,0.));
635 | #568=DIRECTION('',(-2.77555756156289E-16,1.,0.));
636 | #569=DIRECTION('',(0.,1.,0.));
637 | #570=DIRECTION('',(-1.,-2.59701292309978E-17,0.));
638 | #571=DIRECTION('',(-7.93016446160826E-17,1.,0.));
639 | #572=DIRECTION('',(1.,0.,0.));
640 | #573=DIRECTION('',(0.,-1.,0.));
641 | #574=DIRECTION('',(-1.,-2.59701292309978E-17,0.));
642 | #575=DIRECTION('',(0.,-1.,0.));
643 | #576=DIRECTION('',(-1.,0.,0.));
644 | #577=DIRECTION('center_axis',(0.,1.,0.));
645 | #578=DIRECTION('ref_axis',(1.,0.,0.));
646 | #579=DIRECTION('',(1.,0.,0.));
647 | #580=DIRECTION('',(0.,0.,-1.));
648 | #581=DIRECTION('center_axis',(0.,0.,1.));
649 | #582=DIRECTION('ref_axis',(-0.707106781186548,0.707106781186548,0.));
650 | #583=DIRECTION('center_axis',(0.,0.,1.));
651 | #584=DIRECTION('ref_axis',(-0.707106781186548,0.707106781186548,0.));
652 | #585=DIRECTION('',(0.,0.,1.));
653 | #586=DIRECTION('center_axis',(6.60951058506135E-17,-0.965925826289068,0.25881904510252));
654 | #587=DIRECTION('ref_axis',(1.79872840741355E-17,-0.25881904510252,-0.965925826289068));
655 | #588=DIRECTION('',(-7.18367157710787E-17,0.25881904510252,0.965925826289068));
656 | #589=DIRECTION('',(1.79872840741355E-17,-0.25881904510252,-0.965925826289068));
657 | #590=DIRECTION('',(1.,6.84266887288232E-17,0.));
658 | #591=DIRECTION('center_axis',(0.,1.,0.));
659 | #592=DIRECTION('ref_axis',(-1.,0.,0.));
660 | #593=DIRECTION('',(1.,0.,0.));
661 | #594=DIRECTION('',(0.,0.,1.));
662 | #595=DIRECTION('',(0.,0.,1.));
663 | #596=DIRECTION('center_axis',(-1.,0.,0.));
664 | #597=DIRECTION('ref_axis',(0.,-1.,0.));
665 | #598=DIRECTION('',(0.,1.,0.));
666 | #599=DIRECTION('',(0.,0.,1.));
667 | #600=DIRECTION('center_axis',(-2.59701292309978E-17,1.,0.));
668 | #601=DIRECTION('ref_axis',(-1.,-2.59701292309978E-17,0.));
669 | #602=DIRECTION('',(1.,2.59701292309978E-17,0.));
670 | #603=DIRECTION('',(0.,0.,1.));
671 | #604=DIRECTION('center_axis',(-1.,0.,0.));
672 | #605=DIRECTION('ref_axis',(0.,-1.,0.));
673 | #606=DIRECTION('',(0.,1.,0.));
674 | #607=DIRECTION('',(0.,0.,1.));
675 | #608=DIRECTION('center_axis',(0.,-1.,0.));
676 | #609=DIRECTION('ref_axis',(1.,0.,0.));
677 | #610=DIRECTION('',(-1.,0.,0.));
678 | #611=DIRECTION('',(0.,0.,1.));
679 | #612=DIRECTION('center_axis',(1.,7.93016446160826E-17,0.));
680 | #613=DIRECTION('ref_axis',(-7.93016446160826E-17,1.,0.));
681 | #614=DIRECTION('',(7.93016446160826E-17,-1.,0.));
682 | #615=DIRECTION('',(0.,0.,1.));
683 | #616=DIRECTION('center_axis',(-2.59701292309978E-17,1.,0.));
684 | #617=DIRECTION('ref_axis',(-1.,-2.59701292309978E-17,0.));
685 | #618=DIRECTION('',(1.,2.59701292309978E-17,0.));
686 | #619=DIRECTION('',(0.,0.,1.));
687 | #620=DIRECTION('center_axis',(1.,0.,0.));
688 | #621=DIRECTION('ref_axis',(0.,1.,0.));
689 | #622=DIRECTION('',(0.,-1.,0.));
690 | #623=DIRECTION('center_axis',(1.,0.,0.));
691 | #624=DIRECTION('ref_axis',(0.,-1.,0.));
692 | #625=DIRECTION('',(0.,1.,0.));
693 | #626=DIRECTION('',(0.,0.,-1.));
694 | #627=DIRECTION('',(0.,-1.,0.));
695 | #628=DIRECTION('',(0.,0.,-1.));
696 | #629=DIRECTION('center_axis',(0.,-1.,0.));
697 | #630=DIRECTION('ref_axis',(-1.,0.,0.));
698 | #631=DIRECTION('',(1.,0.,0.));
699 | #632=DIRECTION('',(-1.,0.,0.));
700 | #633=DIRECTION('',(0.,0.,-1.));
701 | #634=DIRECTION('center_axis',(-1.,0.,0.));
702 | #635=DIRECTION('ref_axis',(0.,1.,0.));
703 | #636=DIRECTION('',(0.,-1.,0.));
704 | #637=DIRECTION('',(0.,1.,0.));
705 | #638=DIRECTION('',(0.,0.,-1.));
706 | #639=DIRECTION('center_axis',(0.,1.,0.));
707 | #640=DIRECTION('ref_axis',(1.,0.,0.));
708 | #641=DIRECTION('',(-1.,0.,0.));
709 | #642=DIRECTION('',(1.,0.,0.));
710 | #643=DIRECTION('center_axis',(1.,2.77555756156289E-16,0.));
711 | #644=DIRECTION('ref_axis',(2.77555756156289E-16,-1.,0.));
712 | #645=DIRECTION('',(2.77555756156289E-16,-1.,0.));
713 | #646=DIRECTION('center_axis',(-1.,-6.93889390390723E-17,0.));
714 | #647=DIRECTION('ref_axis',(-6.93889390390723E-17,1.,0.));
715 | #648=DIRECTION('',(6.94975289280223E-17,-1.,0.));
716 | #649=DIRECTION('center_axis',(0.,0.,1.));
717 | #650=DIRECTION('ref_axis',(1.,0.,0.));
718 | #651=DIRECTION('center_axis',(0.,0.,-1.));
719 | #652=DIRECTION('ref_axis',(-1.,0.,0.));
720 | #653=CARTESIAN_POINT('',(0.,0.,0.));
721 | #654=CARTESIAN_POINT('Origin',(171.906319586527,-22.9917537365552,-1.5));
722 | #655=CARTESIAN_POINT('',(170.406319586527,-22.9917537365552,-1.5));
723 | #656=CARTESIAN_POINT('Origin',(171.906319586527,-22.9917537365552,-1.5));
724 | #657=CARTESIAN_POINT('',(170.406319586527,-22.9917537365552,-1.));
725 | #658=CARTESIAN_POINT('',(170.406319586527,-22.9917537365552,-1.5));
726 | #659=CARTESIAN_POINT('Origin',(171.906319586527,-22.9917537365552,-1.));
727 | #660=CARTESIAN_POINT('Origin',(171.906319586527,-22.9917537365552,-1.));
728 | #661=CARTESIAN_POINT('Ctrl Pts',(168.306319586527,-26.3081282287784,-1.5));
729 | #662=CARTESIAN_POINT('Ctrl Pts',(168.306319586527,-26.3081282287784,-1.));
730 | #663=CARTESIAN_POINT('Ctrl Pts',(168.293115750986,-26.2176807156358,-1.5));
731 | #664=CARTESIAN_POINT('Ctrl Pts',(168.293115750986,-26.2176807156358,-1.));
732 | #665=CARTESIAN_POINT('Ctrl Pts',(168.178974189741,-26.0739110445245,-1.5));
733 | #666=CARTESIAN_POINT('Ctrl Pts',(168.178974189741,-26.0739110445245,-1.));
734 | #667=CARTESIAN_POINT('Ctrl Pts',(167.745148469752,-25.9733472348551,-1.5));
735 | #668=CARTESIAN_POINT('Ctrl Pts',(167.745148469752,-25.9733472348551,-1.));
736 | #669=CARTESIAN_POINT('Ctrl Pts',(166.667358989435,-26.0492075059636,-1.5));
737 | #670=CARTESIAN_POINT('Ctrl Pts',(166.667358989435,-26.0492075059636,-1.));
738 | #671=CARTESIAN_POINT('Ctrl Pts',(164.641283738555,-26.3368905374822,-1.5));
739 | #672=CARTESIAN_POINT('Ctrl Pts',(164.641283738555,-26.3368905374822,-1.));
740 | #673=CARTESIAN_POINT('Ctrl Pts',(162.151449937856,-26.6209346141416,-1.5));
741 | #674=CARTESIAN_POINT('Ctrl Pts',(162.151449937856,-26.6209346141416,-1.));
742 | #675=CARTESIAN_POINT('Ctrl Pts',(159.448735824711,-26.7322561445967,-1.5));
743 | #676=CARTESIAN_POINT('Ctrl Pts',(159.448735824711,-26.7322561445967,-1.));
744 | #677=CARTESIAN_POINT('Ctrl Pts',(156.794863077949,-26.5954994463976,-1.5));
745 | #678=CARTESIAN_POINT('Ctrl Pts',(156.794863077949,-26.5954994463976,-1.));
746 | #679=CARTESIAN_POINT('Ctrl Pts',(154.437465530251,-26.2989077417662,-1.5));
747 | #680=CARTESIAN_POINT('Ctrl Pts',(154.437465530251,-26.2989077417662,-1.));
748 | #681=CARTESIAN_POINT('Ctrl Pts',(152.595454279995,-26.023963985109,-1.5));
749 | #682=CARTESIAN_POINT('Ctrl Pts',(152.595454279995,-26.023963985109,-1.));
750 | #683=CARTESIAN_POINT('Ctrl Pts',(151.443541692357,-25.9717678519297,-1.5));
751 | #684=CARTESIAN_POINT('Ctrl Pts',(151.443541692357,-25.9717678519297,-1.));
752 | #685=CARTESIAN_POINT('Ctrl Pts',(151.096816510228,-26.2948833062794,-1.5));
753 | #686=CARTESIAN_POINT('Ctrl Pts',(151.096816510228,-26.2948833062794,-1.));
754 | #687=CARTESIAN_POINT('Ctrl Pts',(151.5915667389,-27.0178694769788,-1.5));
755 | #688=CARTESIAN_POINT('Ctrl Pts',(151.5915667389,-27.0178694769788,-1.));
756 | #689=CARTESIAN_POINT('Ctrl Pts',(152.871798276161,-27.9853492466992,-1.5));
757 | #690=CARTESIAN_POINT('Ctrl Pts',(152.871798276161,-27.9853492466992,-1.));
758 | #691=CARTESIAN_POINT('Ctrl Pts',(154.810715578253,-28.9513445642654,-1.5));
759 | #692=CARTESIAN_POINT('Ctrl Pts',(154.810715578253,-28.9513445642654,-1.));
760 | #693=CARTESIAN_POINT('Ctrl Pts',(157.225846416091,-29.6504893681724,-1.5));
761 | #694=CARTESIAN_POINT('Ctrl Pts',(157.225846416091,-29.6504893681724,-1.));
762 | #695=CARTESIAN_POINT('Ctrl Pts',(159.895114833455,-29.8718532819581,-1.5));
763 | #696=CARTESIAN_POINT('Ctrl Pts',(159.895114833455,-29.8718532819581,-1.));
764 | #697=CARTESIAN_POINT('Ctrl Pts',(162.570590140636,-29.5410778243762,-1.5));
765 | #698=CARTESIAN_POINT('Ctrl Pts',(162.570590140636,-29.5410778243762,-1.));
766 | #699=CARTESIAN_POINT('Ctrl Pts',(164.994052087855,-28.7752731427081,-1.5));
767 | #700=CARTESIAN_POINT('Ctrl Pts',(164.994052087855,-28.7752731427081,-1.));
768 | #701=CARTESIAN_POINT('Ctrl Pts',(166.921630827271,-27.7962472441959,-1.5));
769 | #702=CARTESIAN_POINT('Ctrl Pts',(166.921630827271,-27.7962472441959,-1.));
770 | #703=CARTESIAN_POINT('Ctrl Pts',(167.902417911483,-27.0512881296118,-1.5));
771 | #704=CARTESIAN_POINT('Ctrl Pts',(167.902417911483,-27.0512881296118,-1.));
772 | #705=CARTESIAN_POINT('Ctrl Pts',(168.258197202986,-26.6165961233801,-1.5));
773 | #706=CARTESIAN_POINT('Ctrl Pts',(168.258197202986,-26.6165961233801,-1.));
774 | #707=CARTESIAN_POINT('Ctrl Pts',(168.319523422068,-26.398575741921,-1.5));
775 | #708=CARTESIAN_POINT('Ctrl Pts',(168.319523422068,-26.398575741921,-1.));
776 | #709=CARTESIAN_POINT('Ctrl Pts',(168.306319586527,-26.3081282287784,-1.5));
777 | #710=CARTESIAN_POINT('Ctrl Pts',(168.306319586527,-26.3081282287784,-1.));
778 | #711=CARTESIAN_POINT('',(168.306319586527,-26.3081282287784,-1.5));
779 | #712=CARTESIAN_POINT('Ctrl Pts',(168.306319586527,-26.3081282287784,-1.5));
780 | #713=CARTESIAN_POINT('Ctrl Pts',(168.293115750986,-26.2176807156358,-1.5));
781 | #714=CARTESIAN_POINT('Ctrl Pts',(168.178974189741,-26.0739110445245,-1.5));
782 | #715=CARTESIAN_POINT('Ctrl Pts',(167.745148469752,-25.9733472348551,-1.5));
783 | #716=CARTESIAN_POINT('Ctrl Pts',(166.667358989435,-26.0492075059636,-1.5));
784 | #717=CARTESIAN_POINT('Ctrl Pts',(164.641283738555,-26.3368905374822,-1.5));
785 | #718=CARTESIAN_POINT('Ctrl Pts',(162.151449937856,-26.6209346141416,-1.5));
786 | #719=CARTESIAN_POINT('Ctrl Pts',(159.448735824711,-26.7322561445967,-1.5));
787 | #720=CARTESIAN_POINT('Ctrl Pts',(156.794863077949,-26.5954994463976,-1.5));
788 | #721=CARTESIAN_POINT('Ctrl Pts',(154.437465530251,-26.2989077417662,-1.5));
789 | #722=CARTESIAN_POINT('Ctrl Pts',(152.595454279995,-26.023963985109,-1.5));
790 | #723=CARTESIAN_POINT('Ctrl Pts',(151.443541692357,-25.9717678519297,-1.5));
791 | #724=CARTESIAN_POINT('Ctrl Pts',(151.096816510228,-26.2948833062794,-1.5));
792 | #725=CARTESIAN_POINT('Ctrl Pts',(151.5915667389,-27.0178694769788,-1.5));
793 | #726=CARTESIAN_POINT('Ctrl Pts',(152.871798276161,-27.9853492466992,-1.5));
794 | #727=CARTESIAN_POINT('Ctrl Pts',(154.810715578253,-28.9513445642654,-1.5));
795 | #728=CARTESIAN_POINT('Ctrl Pts',(157.225846416091,-29.6504893681724,-1.5));
796 | #729=CARTESIAN_POINT('Ctrl Pts',(159.895114833455,-29.8718532819581,-1.5));
797 | #730=CARTESIAN_POINT('Ctrl Pts',(162.570590140636,-29.5410778243762,-1.5));
798 | #731=CARTESIAN_POINT('Ctrl Pts',(164.994052087855,-28.7752731427081,-1.5));
799 | #732=CARTESIAN_POINT('Ctrl Pts',(166.921630827271,-27.7962472441959,-1.5));
800 | #733=CARTESIAN_POINT('Ctrl Pts',(167.902417911483,-27.0512881296118,-1.5));
801 | #734=CARTESIAN_POINT('Ctrl Pts',(168.258197202986,-26.6165961233801,-1.5));
802 | #735=CARTESIAN_POINT('Ctrl Pts',(168.319523422068,-26.398575741921,-1.5));
803 | #736=CARTESIAN_POINT('Ctrl Pts',(168.306319586527,-26.3081282287784,-1.5));
804 | #737=CARTESIAN_POINT('',(168.306319586527,-26.3081282287784,-1.));
805 | #738=CARTESIAN_POINT('',(168.306319586527,-26.3081282287784,-1.5));
806 | #739=CARTESIAN_POINT('Ctrl Pts',(168.306319586527,-26.3081282287784,-1.));
807 | #740=CARTESIAN_POINT('Ctrl Pts',(168.293115750986,-26.2176807156358,-1.));
808 | #741=CARTESIAN_POINT('Ctrl Pts',(168.178974189741,-26.0739110445245,-1.));
809 | #742=CARTESIAN_POINT('Ctrl Pts',(167.745148469752,-25.9733472348551,-1.));
810 | #743=CARTESIAN_POINT('Ctrl Pts',(166.667358989435,-26.0492075059636,-1.));
811 | #744=CARTESIAN_POINT('Ctrl Pts',(164.641283738555,-26.3368905374822,-1.));
812 | #745=CARTESIAN_POINT('Ctrl Pts',(162.151449937856,-26.6209346141416,-1.));
813 | #746=CARTESIAN_POINT('Ctrl Pts',(159.448735824711,-26.7322561445967,-1.));
814 | #747=CARTESIAN_POINT('Ctrl Pts',(156.794863077949,-26.5954994463976,-1.));
815 | #748=CARTESIAN_POINT('Ctrl Pts',(154.437465530251,-26.2989077417662,-1.));
816 | #749=CARTESIAN_POINT('Ctrl Pts',(152.595454279995,-26.023963985109,-1.));
817 | #750=CARTESIAN_POINT('Ctrl Pts',(151.443541692357,-25.9717678519297,-1.));
818 | #751=CARTESIAN_POINT('Ctrl Pts',(151.096816510228,-26.2948833062794,-1.));
819 | #752=CARTESIAN_POINT('Ctrl Pts',(151.5915667389,-27.0178694769788,-1.));
820 | #753=CARTESIAN_POINT('Ctrl Pts',(152.871798276161,-27.9853492466992,-1.));
821 | #754=CARTESIAN_POINT('Ctrl Pts',(154.810715578253,-28.9513445642654,-1.));
822 | #755=CARTESIAN_POINT('Ctrl Pts',(157.225846416091,-29.6504893681724,-1.));
823 | #756=CARTESIAN_POINT('Ctrl Pts',(159.895114833455,-29.8718532819581,-1.));
824 | #757=CARTESIAN_POINT('Ctrl Pts',(162.570590140636,-29.5410778243762,-1.));
825 | #758=CARTESIAN_POINT('Ctrl Pts',(164.994052087855,-28.7752731427081,-1.));
826 | #759=CARTESIAN_POINT('Ctrl Pts',(166.921630827271,-27.7962472441959,-1.));
827 | #760=CARTESIAN_POINT('Ctrl Pts',(167.902417911483,-27.0512881296118,-1.));
828 | #761=CARTESIAN_POINT('Ctrl Pts',(168.258197202986,-26.6165961233801,-1.));
829 | #762=CARTESIAN_POINT('Ctrl Pts',(168.319523422068,-26.398575741921,-1.));
830 | #763=CARTESIAN_POINT('Ctrl Pts',(168.306319586527,-26.3081282287784,-1.));
831 | #764=CARTESIAN_POINT('Origin',(159.708169966148,-27.9218105669439,-1.));
832 | #765=CARTESIAN_POINT('Origin',(147.906319586527,-22.9918537365552,-1.5));
833 | #766=CARTESIAN_POINT('',(146.406319586527,-22.9918537365552,-1.5));
834 | #767=CARTESIAN_POINT('Origin',(147.906319586527,-22.9918537365552,-1.5));
835 | #768=CARTESIAN_POINT('',(146.406319586527,-22.9918537365552,-1.));
836 | #769=CARTESIAN_POINT('',(146.406319586527,-22.9918537365552,-1.5));
837 | #770=CARTESIAN_POINT('Origin',(147.906319586527,-22.9918537365552,-1.));
838 | #771=CARTESIAN_POINT('Origin',(147.906319586527,-22.9918537365552,-1.));
839 | #772=CARTESIAN_POINT('Origin',(245.306319586527,88.2669452190299,0.));
840 | #773=CARTESIAN_POINT('',(245.306319586527,91.2669452190299,1.2));
841 | #774=CARTESIAN_POINT('',(248.306319586527,88.2669452190299,1.2));
842 | #775=CARTESIAN_POINT('Origin',(245.306319586527,88.2669452190299,1.2));
843 | #776=CARTESIAN_POINT('',(248.306319586527,88.2669452190299,-1.5));
844 | #777=CARTESIAN_POINT('',(248.306319586527,88.2669452190299,0.));
845 | #778=CARTESIAN_POINT('',(245.306319586527,91.2669452190299,-1.5));
846 | #779=CARTESIAN_POINT('Origin',(245.306319586527,88.2669452190299,-1.5));
847 | #780=CARTESIAN_POINT('',(245.306319586527,91.2669452190299,0.));
848 | #781=CARTESIAN_POINT('Origin',(159.806319586527,27.2669452190298,1.2));
849 | #782=CARTESIAN_POINT('',(74.3063195865273,91.2669452190299,1.2));
850 | #783=CARTESIAN_POINT('',(71.3063195865273,91.2669452190299,1.2));
851 | #784=CARTESIAN_POINT('',(71.3063195865273,88.2669452190299,1.2));
852 | #785=CARTESIAN_POINT('Origin',(74.3063195865273,88.2669452190299,1.2));
853 | #786=CARTESIAN_POINT('',(71.3063195865273,-37.1349785696168,1.2));
854 | #787=CARTESIAN_POINT('',(71.3063195865273,-36.7330547809702,1.2));
855 | #788=CARTESIAN_POINT('',(248.306319586527,-37.1349785696168,1.2));
856 | #789=CARTESIAN_POINT('',(71.3063195865273,-37.1349785696168,1.2));
857 | #790=CARTESIAN_POINT('',(248.306319586527,-37.0144014330228,1.2));
858 | #791=CARTESIAN_POINT('',(149.806319586527,-33.3330547809702,1.2));
859 | #792=CARTESIAN_POINT('',(149.806319586527,-23.7330547809702,1.2));
860 | #793=CARTESIAN_POINT('',(149.806319586527,-23.3330547809702,1.2));
861 | #794=CARTESIAN_POINT('',(74.3063195865273,-23.7330547809702,1.2));
862 | #795=CARTESIAN_POINT('',(245.306319586527,-23.7330547809702,1.2));
863 | #796=CARTESIAN_POINT('',(74.3063195865273,88.2669452190299,1.2));
864 | #797=CARTESIAN_POINT('',(74.3063195865273,-23.7330547809702,1.2));
865 | #798=CARTESIAN_POINT('',(245.306319586527,88.2669452190299,1.2));
866 | #799=CARTESIAN_POINT('',(74.3063195865273,88.2669452190299,1.2));
867 | #800=CARTESIAN_POINT('',(245.306319586527,-23.7330547809702,1.2));
868 | #801=CARTESIAN_POINT('',(245.306319586527,88.2669452190299,1.2));
869 | #802=CARTESIAN_POINT('',(169.806319586527,-23.7330547809702,1.2));
870 | #803=CARTESIAN_POINT('',(245.306319586527,-23.7330547809702,1.2));
871 | #804=CARTESIAN_POINT('',(169.806319586527,-33.3330547809702,1.2));
872 | #805=CARTESIAN_POINT('',(169.806319586527,-33.3330547809702,1.2));
873 | #806=CARTESIAN_POINT('',(149.806319586527,-33.3330547809702,1.2));
874 | #807=CARTESIAN_POINT('Origin',(71.3063195865273,91.2669452190299,0.));
875 | #808=CARTESIAN_POINT('',(74.3063195865273,91.2669452190299,-1.5));
876 | #809=CARTESIAN_POINT('',(71.3063195865273,91.2669452190299,-1.5));
877 | #810=CARTESIAN_POINT('',(74.3063195865273,91.2669452190299,0.));
878 | #811=CARTESIAN_POINT('Origin',(74.3063195865273,88.2669452190299,0.));
879 | #812=CARTESIAN_POINT('',(71.3063195865273,88.2669452190299,-1.5));
880 | #813=CARTESIAN_POINT('Origin',(74.3063195865273,88.2669452190299,-1.5));
881 | #814=CARTESIAN_POINT('',(71.3063195865273,88.2669452190299,0.));
882 | #815=CARTESIAN_POINT('Origin',(71.3063195865273,-37.1349785696168,1.2));
883 | #816=CARTESIAN_POINT('',(248.306319586527,-37.8584413891809,-1.5));
884 | #817=CARTESIAN_POINT('',(248.306319586527,-37.3091133273462,0.550120236790423));
885 | #818=CARTESIAN_POINT('',(71.3063195865273,-37.8584413891809,-1.5));
886 | #819=CARTESIAN_POINT('',(71.3063195865273,-36.7330547809702,2.7));
887 | #820=CARTESIAN_POINT('',(71.3063195865273,-37.8584413891809,-1.5));
888 | #821=CARTESIAN_POINT('Origin',(169.806319586527,-33.3330547809702,0.));
889 | #822=CARTESIAN_POINT('',(149.806319586527,-33.3330547809702,0.));
890 | #823=CARTESIAN_POINT('',(169.806319586527,-33.3330547809702,0.));
891 | #824=CARTESIAN_POINT('',(164.806319586527,-33.3330547809702,0.));
892 | #825=CARTESIAN_POINT('',(149.806319586527,-33.3330547809702,0.));
893 | #826=CARTESIAN_POINT('',(169.806319586527,-33.3330547809702,0.));
894 | #827=CARTESIAN_POINT('Origin',(169.806319586527,-23.7330547809702,0.));
895 | #828=CARTESIAN_POINT('',(169.806319586527,-23.7330547809702,0.));
896 | #829=CARTESIAN_POINT('',(169.806319586527,1.76694521902983,0.));
897 | #830=CARTESIAN_POINT('',(169.806319586527,-23.7330547809702,0.));
898 | #831=CARTESIAN_POINT('Origin',(245.306319586527,-23.7330547809702,0.));
899 | #832=CARTESIAN_POINT('',(245.306319586527,-23.7330547809702,0.));
900 | #833=CARTESIAN_POINT('',(202.556319586527,-23.7330547809702,0.));
901 | #834=CARTESIAN_POINT('',(245.306319586527,-23.7330547809702,0.));
902 | #835=CARTESIAN_POINT('Origin',(245.306319586527,88.2669452190299,0.));
903 | #836=CARTESIAN_POINT('',(245.306319586527,88.2669452190299,0.));
904 | #837=CARTESIAN_POINT('',(245.306319586527,57.7669452190298,0.));
905 | #838=CARTESIAN_POINT('',(245.306319586527,88.2669452190299,0.));
906 | #839=CARTESIAN_POINT('Origin',(74.3063195865273,88.2669452190299,0.));
907 | #840=CARTESIAN_POINT('',(74.3063195865273,88.2669452190299,0.));
908 | #841=CARTESIAN_POINT('',(117.056319586527,88.2669452190299,0.));
909 | #842=CARTESIAN_POINT('',(74.3063195865273,88.2669452190299,0.));
910 | #843=CARTESIAN_POINT('Origin',(74.3063195865273,-23.7330547809702,0.));
911 | #844=CARTESIAN_POINT('',(74.3063195865273,-23.7330547809702,0.));
912 | #845=CARTESIAN_POINT('',(74.3063195865273,1.76694521902983,0.));
913 | #846=CARTESIAN_POINT('',(74.3063195865273,-23.7330547809702,0.));
914 | #847=CARTESIAN_POINT('Origin',(149.806319586527,-23.7330547809702,0.));
915 | #848=CARTESIAN_POINT('',(149.806319586527,-23.7330547809702,0.));
916 | #849=CARTESIAN_POINT('',(154.806319586527,-23.7330547809702,0.));
917 | #850=CARTESIAN_POINT('',(149.806319586527,-23.7330547809702,0.));
918 | #851=CARTESIAN_POINT('Origin',(149.806319586527,-33.3330547809702,0.));
919 | #852=CARTESIAN_POINT('',(149.806319586527,-3.03305478097017,0.));
920 | #853=CARTESIAN_POINT('Origin',(78.2063195865273,84.3769452190298,0.));
921 | #854=CARTESIAN_POINT('',(78.2063195865273,-13.5430547809702,0.));
922 | #855=CARTESIAN_POINT('',(78.2063195865273,84.3769452190298,0.));
923 | #856=CARTESIAN_POINT('',(78.2063195865273,-13.5430547809702,0.));
924 | #857=CARTESIAN_POINT('',(78.2063195865273,-13.5430547809702,-1.5));
925 | #858=CARTESIAN_POINT('',(78.2063195865273,-13.5430547809702,0.));
926 | #859=CARTESIAN_POINT('',(78.2063195865273,84.3769452190298,-1.5));
927 | #860=CARTESIAN_POINT('',(78.2063195865273,-13.5430547809702,-1.5));
928 | #861=CARTESIAN_POINT('',(78.2063195865273,84.3769452190298,0.));
929 | #862=CARTESIAN_POINT('Origin',(241.406319586527,84.3769452190298,0.));
930 | #863=CARTESIAN_POINT('',(241.406319586527,84.3769452190298,0.));
931 | #864=CARTESIAN_POINT('',(78.2063195865273,84.3769452190298,0.));
932 | #865=CARTESIAN_POINT('',(241.406319586527,84.3769452190298,-1.5));
933 | #866=CARTESIAN_POINT('',(78.2063195865273,84.3769452190298,-1.5));
934 | #867=CARTESIAN_POINT('',(241.406319586527,84.3769452190298,0.));
935 | #868=CARTESIAN_POINT('Origin',(241.406319586527,-13.5430547809702,0.));
936 | #869=CARTESIAN_POINT('',(241.406319586527,-13.5430547809702,0.));
937 | #870=CARTESIAN_POINT('',(241.406319586527,84.3769452190298,0.));
938 | #871=CARTESIAN_POINT('',(241.406319586527,-13.5430547809702,-1.5));
939 | #872=CARTESIAN_POINT('',(241.406319586527,84.3769452190298,-1.5));
940 | #873=CARTESIAN_POINT('',(241.406319586527,-13.5430547809702,0.));
941 | #874=CARTESIAN_POINT('Origin',(78.2063195865273,-13.5430547809702,0.));
942 | #875=CARTESIAN_POINT('',(241.406319586527,-13.5430547809702,0.));
943 | #876=CARTESIAN_POINT('',(241.406319586527,-13.5430547809702,-1.5));
944 | #877=CARTESIAN_POINT('Origin',(248.306319586527,91.2669452190299,0.));
945 | #878=CARTESIAN_POINT('',(248.306319586527,91.2669452190299,-1.5));
946 | #879=CARTESIAN_POINT('Origin',(71.3063195865273,-36.7330547809702,0.));
947 | #880=CARTESIAN_POINT('',(71.3063195865273,-36.7330547809702,-1.5));
948 | #881=CARTESIAN_POINT('Origin',(159.806319586527,27.2669452190298,0.));
949 | #882=CARTESIAN_POINT('Origin',(159.806319586527,27.2669452190298,-1.5));
950 | #883=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#887,
951 | 'DISTANCE_ACCURACY_VALUE',
952 | 'Maximum model space distance between geometric entities at asserted c
953 | onnectivities');
954 | #884=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#887,
955 | 'DISTANCE_ACCURACY_VALUE',
956 | 'Maximum model space distance between geometric entities at asserted c
957 | onnectivities');
958 | #885=(
959 | GEOMETRIC_REPRESENTATION_CONTEXT(3)
960 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#883))
961 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#887,#889,#890))
962 | REPRESENTATION_CONTEXT('','3D')
963 | );
964 | #886=(
965 | GEOMETRIC_REPRESENTATION_CONTEXT(3)
966 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#884))
967 | GLOBAL_UNIT_ASSIGNED_CONTEXT((#887,#889,#890))
968 | REPRESENTATION_CONTEXT('','3D')
969 | );
970 | #887=(
971 | LENGTH_UNIT()
972 | NAMED_UNIT(*)
973 | SI_UNIT(.MILLI.,.METRE.)
974 | );
975 | #888=(
976 | LENGTH_UNIT()
977 | NAMED_UNIT(*)
978 | SI_UNIT($,.METRE.)
979 | );
980 | #889=(
981 | NAMED_UNIT(*)
982 | PLANE_ANGLE_UNIT()
983 | SI_UNIT($,.RADIAN.)
984 | );
985 | #890=(
986 | NAMED_UNIT(*)
987 | SI_UNIT($,.STERADIAN.)
988 | SOLID_ANGLE_UNIT()
989 | );
990 | #891=SHAPE_DEFINITION_REPRESENTATION(#892,#893);
991 | #892=PRODUCT_DEFINITION_SHAPE('',$,#895);
992 | #893=SHAPE_REPRESENTATION('',(#495),#885);
993 | #894=PRODUCT_DEFINITION_CONTEXT('part definition',#899,'design');
994 | #895=PRODUCT_DEFINITION('front','front v7',#896,#894);
995 | #896=PRODUCT_DEFINITION_FORMATION('',$,#901);
996 | #897=PRODUCT_RELATED_PRODUCT_CATEGORY('front v7','front v7',(#901));
997 | #898=APPLICATION_PROTOCOL_DEFINITION('international standard',
998 | 'ap242_managed_model_based_3d_engineering',2011,#899);
999 | #899=APPLICATION_CONTEXT('Managed model based 3d engineering');
1000 | #900=PRODUCT_CONTEXT('part definition',#899,'mechanical');
1001 | #901=PRODUCT('front','front v7',$,(#900));
1002 | #902=PRESENTATION_STYLE_ASSIGNMENT((#903));
1003 | #903=SURFACE_STYLE_USAGE(.BOTH.,#904);
1004 | #904=SURFACE_SIDE_STYLE('',(#905));
1005 | #905=SURFACE_STYLE_FILL_AREA(#906);
1006 | #906=FILL_AREA_STYLE('Steel - Satin',(#907));
1007 | #907=FILL_AREA_STYLE_COLOUR('Steel - Satin',#908);
1008 | #908=COLOUR_RGB('Steel - Satin',0.627450980392157,0.627450980392157,0.627450980392157);
1009 | ENDSEC;
1010 | END-ISO-10303-21;
1011 |
--------------------------------------------------------------------------------