├── 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 | ![InkLink](./images/inklink.jpg) 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 | { 354 | if (tool === "fill") { 355 | handleFill(e); 356 | } else { 357 | startDrawing(e); 358 | } 359 | }} 360 | onTouchStart={(e) => { 361 | if (tool === "fill") { 362 | handleFill(e); 363 | } else { 364 | startDrawing(e); 365 | } 366 | }} 367 | onMouseMove={drawing} 368 | onTouchMove={drawing} 369 | onMouseUp={endDrawing} 370 | onMouseOut={endDrawing} 371 | onTouchEnd={endDrawing} 372 | onTouchCancel={endDrawing} 373 | /> 374 |
375 | 381 | 382 | 383 | 384 | 385 |
386 |
387 | 388 | 391 | 392 | 393 | Server Disconnected 394 | 395 | Lost connection to the drawing server. 396 | {reconnectAttemptsRef.current < MAX_RECONNECT_ATTEMPTS 397 | ? " Attempting to reconnect..." 398 | : " Maximum reconnection attempts reached."} 399 | 400 | 401 | 402 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | Clear Canvas? 415 | 416 | Are you sure you want to clear the entire canvas? This action 417 | cannot be undone. 418 | 419 | 420 | 421 | 427 | 430 | 431 | 432 | 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 | --------------------------------------------------------------------------------