├── test ├── test.ai ├── file-sample.svg ├── stepsample-line.svg ├── stepsample-curve.svg ├── stepsample-leftcurve.svg ├── stepsample-rightcurve.svg ├── stepsample-3curves.svg ├── test.js ├── test_bkup.step ├── stepsample-line.step ├── stepsample-curve.step ├── stepsample-leftcurve.step ├── stepsample-rightcurve.step ├── test_bkup2.step ├── stepsample-3curves.step ├── test2.step └── test.step ├── src ├── calc.js ├── clipboard.js ├── item-SVGPath.js ├── svgParser.js └── svg2stp.js ├── README.md ├── LICENSE.txt ├── index.html ├── data └── data.js ├── script.js └── css └── main.css /test/test.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iskwmsy/svg2step/HEAD/test/test.ai -------------------------------------------------------------------------------- /test/file-sample.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /test/stepsample-line.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /test/stepsample-curve.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /test/stepsample-leftcurve.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /test/stepsample-rightcurve.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /test/stepsample-3curves.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/calc.js: -------------------------------------------------------------------------------- 1 | export { calc_roundNumber, calc_degreesToRadians, calc_multiplyMatrix }; 2 | 3 | function calc_roundNumber(number, decimalPlaces = 3) { 4 | const factor = Math.pow(10, decimalPlaces); 5 | return Math.round(number * factor) / factor; 6 | } 7 | 8 | function calc_degreesToRadians(degrees) { 9 | return (degrees * Math.PI) / 180; 10 | } 11 | 12 | // Function to multiply two matrices 13 | function calc_multiplyMatrix(a, b) { 14 | const rowsA = a.length; 15 | const colsA = a[0].length; 16 | const rowsB = b.length; 17 | const colsB = b[0].length; 18 | const result = new Array(rowsA).fill(0).map(() => new Array(colsB).fill(0)); 19 | if (colsA !== rowsB) { 20 | throw new Error("Columns of matrix A must match rows of matrix B."); 21 | } 22 | 23 | a.forEach((rowA, i) => { 24 | b[0].forEach((_, j) => { 25 | let sum = 0; 26 | rowA.forEach((_, k) => { 27 | sum += a[i][k] * b[k][j]; 28 | }); 29 | result[i][j] = sum; 30 | }); 31 | }); 32 | return result; 33 | } 34 | -------------------------------------------------------------------------------- /src/clipboard.js: -------------------------------------------------------------------------------- 1 | // Copy & Paste 2 | export { copyToClipBoard, pasteFromClipBoard }; 3 | 4 | async function copyToClipBoard() { 5 | //let data = getSVGText(); 6 | let data = "Hello World"; 7 | try { 8 | await navigator.clipboard.writeText(data); 9 | console.log("Copy Succeeded"); 10 | } catch (err) { 11 | console.error("Fail, or user denied."); 12 | } 13 | } 14 | 15 | async function pasteFromClipBoard() { 16 | try { 17 | const clipText = await navigator.clipboard.readText(); // Use await here and remove .then 18 | //console.log("Imported text from clipboard = " + clipText); 19 | console.log("Paste Succeeded"); 20 | return clipText; 21 | } catch (err) { 22 | console.error("Fail, or user denied."); 23 | } 24 | } 25 | 26 | // function saveAsSVGFile() { 27 | // let fileName = "dim-export.svg"; 28 | // let url = "data:image/svg+xml;utf8," + encodeURIComponent(getSVGText()); 29 | // let link = document.createElement("a"); 30 | // link.download = fileName; 31 | // link.href = url; 32 | // link.click(); 33 | // } 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # svg2step 2 | 3 | ## What is this ? 4 | 5 | - A handy tool to copy and paste Adobe Illustrator path data (svg) and convert to a .step file (ISO 10303-21). 6 | - Developed to import path to Plasticity (https://www.plasticity.xyz). 7 | - Try here https://dev.cog.ooo/svg2step/ 8 | - 2023/5/22 ver 1.1 enabled svg file import from finder(explorer). 9 | - 2023/5/20 ver 1.0 10 | 11 | ## How to use 12 | 13 | - Copy and Paste paths from Adobe Illustrator (or other apps) to the app and click the download button. 14 | - Watch how it works. 15 | https://twitter.com/kamone/status/1660366447204507649?s=46&t=YcgSNF5WWYgGoKaLIf18NQ 16 | https://twitter.com/kamone/status/1659889118833426436?s=20 17 | 18 | ## Issues 19 | 20 | - Sometimes complex paths with many overlapping points may not import correctly. Try to simplify your path inside your vector design app. 21 | 22 | ### files 23 | 24 | - ./index.html 25 | - ./script.js 26 | 27 | - ./lib/ Paper.js is here. 28 | - ./src/ modules. 29 | - ./test/ files used during development. 30 | - ./css/ 31 | - ./data/ sample data for test 32 | 33 | ## LICENSE 34 | 35 | This repository is published under an MIT License. See the included [LICENSE file](./LICENSE.txt). 36 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023 Masaya Ishikawa 2 | http://www.cog.ooo/ 3 | All rights reserved. 4 | 5 | The MIT License (MIT) 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. 24 | 25 | Program uses the following files from other authors; 26 | see their respective license headers for more details: 27 | Paper.js : 2011 - 2020, Jürg Lehni & Jonathan Puckey, MIT License -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | svg2step 10 | 11 | 12 | 13 | 14 |
15 |
16 |
17 | 18 |
19 |
20 |
21 | 22 |
23 |
24 |
25 |
26 | 27 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /data/data.js: -------------------------------------------------------------------------------- 1 | export const data = [ 2 | { 3 | id: 1, 4 | controlPoints: [ 5 | // 4 point bezier 6 | [100.0, 100.0, 0.0], 7 | [100.0, 500.0, 0.0], 8 | [500.0, 500.0, 0.0], 9 | [500.0, 100.0, 0.0], 10 | ], 11 | }, 12 | { 13 | id: 2, 14 | controlPoints: [ 15 | // 3 point bezier 16 | [500.0, 100.0, 0.0], 17 | [500.0, 500.0, 0.0], 18 | [800.0, 100.0, 0.0], 19 | ], 20 | }, 21 | { 22 | id: 3, 23 | controlPoints: [ 24 | // straight line 25 | [800.0, 100.0, 0.0], 26 | [1200.0, 500.0, 0.0], 27 | ], 28 | }, 29 | { 30 | id: 4, 31 | controlPoints: [ 32 | // 4 point bezier 33 | [2100.0, 100.0, 0.0], 34 | [2100.0, 500.0, 0.0], 35 | [2500.0, 500.0, 0.0], 36 | [2500.0, 100.0, 0.0], 37 | ], 38 | }, 39 | { 40 | id: 5, 41 | controlPoints: [ 42 | // 8 point bezier 43 | [100.0, 100.0, 0.0], 44 | [100.0, 500.0, 0.0], 45 | [500.0, 500.0, 0.0], 46 | [500.0, 100.0, 0.0], 47 | [2100.0, 100.0, 0.0], 48 | [2100.0, 500.0, 0.0], 49 | [2500.0, 500.0, 0.0], 50 | [2500.0, 100.0, 0.0], 51 | ], 52 | }, 53 | { 54 | id: 6, 55 | controlPoints: [ 56 | // 12 point bezier 57 | [100.0, 100.0, 0.0], 58 | [100.0, 500.0, 0.0], 59 | [500.0, 500.0, 0.0], 60 | [500.0, 100.0, 0.0], 61 | [2100.0, 100.0, 0.0], 62 | [2100.0, 500.0, 0.0], 63 | [2500.0, 500.0, 0.0], 64 | [2500.0, 100.0, 0.0], 65 | [500.0, 100.0, 0.0], 66 | [500.0, 500.0, 0.0], 67 | [800.0, 100.0, 0.0], 68 | [1800.0, 100.0, 0.0], 69 | ], 70 | }, 71 | ]; 72 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | { 2 | "pathArray3D": [ 3 | { 4 | "command": "M", 5 | "point": { 6 | "x": -112.7, 7 | "y": 51.05, 8 | "z": 0 9 | }, 10 | "endCommand": "" 11 | }, 12 | { 13 | "command": "C", 14 | "point": { 15 | "x": -116.9, 16 | "y": -7.64, 17 | "z": 0 18 | }, 19 | "endCommand": "" 20 | }, 21 | { 22 | "command": "", 23 | "point": { 24 | "x": -48.18, 25 | "y": -77.35, 26 | "z": 0 27 | }, 28 | "endCommand": "" 29 | }, 30 | { 31 | "command": "", 32 | "point": { 33 | "x": 0.33, 34 | "y": -53.95, 35 | "z": 0 36 | }, 37 | "endCommand": "" 38 | }, 39 | { 40 | "command": "C", 41 | "point": { 42 | "x": 48.84, 43 | "y": -30.55, 44 | "z": 0 45 | }, 46 | "endCommand": "" 47 | }, 48 | { 49 | "command": "", 50 | "point": { 51 | "x": 112.88, 52 | "y": 58.6, 53 | "z": 0 54 | }, 55 | "endCommand": "" 56 | }, 57 | { 58 | "command": "", 59 | "point": { 60 | "x": 112.88, 61 | "y": 58.6, 62 | "z": 0 63 | }, 64 | "endCommand": "Z" 65 | } 66 | ], 67 | "style": { 68 | "fillColor": "#ab539b" 69 | }, 70 | "transformation": { 71 | "translation": { 72 | "x": 0, 73 | "y": 0, 74 | "z": 0 75 | }, 76 | "scale": { 77 | "x": 1, 78 | "y": 1, 79 | "z": 1 80 | }, 81 | "rotation": { 82 | "x": 0, 83 | "y": 0, 84 | "z": 0 85 | }, 86 | "anchor": { 87 | "x": 0, 88 | "y": 0, 89 | "z": 0 90 | } 91 | } 92 | } -------------------------------------------------------------------------------- /test/test_bkup.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); 4 | FILE_NAME('Open CASCADE Shape Model','2023-05-07T04:04:10',('Author'),(''),'Open CASCADE STEP processor 7.6','FreeCAD','Unknown'); 5 | FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 6 | ENDSEC; 7 | DATA; 8 | #20 = CARTESIAN_POINT('', (100, 100, 0)); 9 | #21 = CARTESIAN_POINT('', (100, 500, 0)); 10 | #22 = CARTESIAN_POINT('', (500, 500, 0)); 11 | #23 = CARTESIAN_POINT('', (500, 100, 0)); 12 | #30 = CARTESIAN_POINT('', (500, 100, 0)); 13 | #31 = CARTESIAN_POINT('', (500, 500, 0)); 14 | #32 = CARTESIAN_POINT('', (800, 100, 0)); 15 | #40 = CARTESIAN_POINT('', (800, 100, 0)); 16 | #41 = CARTESIAN_POINT('', (1200, 500, 0)); 17 | #50 = CARTESIAN_POINT('', (2100, 100, 0)); 18 | #51 = CARTESIAN_POINT('', (2100, 500, 0)); 19 | #52 = CARTESIAN_POINT('', (2500, 500, 0)); 20 | #53 = CARTESIAN_POINT('', (2500, 100, 0)); 21 | #60 = CARTESIAN_POINT('', (100, 100, 0)); 22 | #61 = CARTESIAN_POINT('', (100, 500, 0)); 23 | #62 = CARTESIAN_POINT('', (500, 500, 0)); 24 | #63 = CARTESIAN_POINT('', (500, 100, 0)); 25 | #64 = CARTESIAN_POINT('', (2100, 100, 0)); 26 | #65 = CARTESIAN_POINT('', (2100, 500, 0)); 27 | #66 = CARTESIAN_POINT('', (2500, 500, 0)); 28 | #67 = CARTESIAN_POINT('', (2500, 100, 0)); 29 | #27 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#20, #21, #22, #23), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 30 | #127 = B_SPLINE_CURVE_WITH_KNOTS('', 2, (#30, #31, #32), .UNSPECIFIED., .F., .F., (3, 3), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 31 | #227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#40, #41), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 32 | #327 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#50, #51, #52, #53), .UNSPECIFIED., .F., .F., (4,4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 33 | #427 = B_SPLINE_CURVE_WITH_KNOTS('', 7, (#60, #61, #62, #63, #64, #65, #66, #67), .UNSPECIFIED., .F., .F., (8, 8), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 34 | #26 = TRIMMED_CURVE('', #27, (##20, PARAMETER_VALUE(0.)), (##23, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 35 | #126 = TRIMMED_CURVE('', #127, (##30, PARAMETER_VALUE(0.)), (##32, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 36 | #226 = TRIMMED_CURVE('', #227, (##40, PARAMETER_VALUE(0.)), (##41, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 37 | #326 = TRIMMED_CURVE('', #327, (##50, PARAMETER_VALUE(0.)), (##53, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 38 | #426 = TRIMMED_CURVE('', #427, (##60, PARAMETER_VALUE(0.)), (##67, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 39 | 40 | #10 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#15),(#26, #126, #226, #326, #426)); 41 | #15 = GEOMETRIC_CURVE_SET('',(#26, #126, #226, #326, #426)); 42 | ENDSEC; 43 | END-ISO-10303-21; 44 | -------------------------------------------------------------------------------- /test/stepsample-line.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); 4 | FILE_NAME('Open CASCADE Shape Model','2023-05-07T13:51:28',('Author'),( 5 | ''),'Open CASCADE STEP processor 7.6','FreeCAD','Unknown'); 6 | FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 7 | ENDSEC; 8 | DATA; 9 | #1 = APPLICATION_PROTOCOL_DEFINITION('international standard', 10 | 'automotive_design',2000,#2); 11 | #2 = APPLICATION_CONTEXT( 12 | 'core data for automotive mechanical design processes'); 13 | #3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10); 14 | #4 = PRODUCT_DEFINITION_SHAPE('','',#5); 15 | #5 = PRODUCT_DEFINITION('design','',#6,#9); 16 | #6 = PRODUCT_DEFINITION_FORMATION('','',#7); 17 | #7 = PRODUCT('Line','Line','',(#8)); 18 | #8 = PRODUCT_CONTEXT('',#2,'mechanical'); 19 | #9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); 20 | #10 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#15), 21 | #22); 22 | #11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); 23 | #12 = CARTESIAN_POINT('',(0.,0.,0.)); 24 | #13 = DIRECTION('',(0.,0.,1.)); 25 | #14 = DIRECTION('',(1.,0.,-0.)); 26 | #15 = GEOMETRIC_CURVE_SET('',(#16)); 27 | #16 = TRIMMED_CURVE('',#17,(#20,PARAMETER_VALUE(0.)),(#21, 28 | PARAMETER_VALUE(283.5)),.T.,.PARAMETER.); 29 | #17 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#18,#19),.UNSPECIFIED.,.F.,.F.,(2, 30 | 2),(0.,283.5),.PIECEWISE_BEZIER_KNOTS.); 31 | #18 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 32 | #19 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 33 | #20 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 34 | #21 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 35 | #22 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) 36 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#26)) GLOBAL_UNIT_ASSIGNED_CONTEXT( 37 | (#23,#24,#25)) REPRESENTATION_CONTEXT('Context #1', 38 | '3D Context with UNIT and UNCERTAINTY') ); 39 | #23 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 40 | #24 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 41 | #25 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 42 | #26 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#23, 43 | 'distance_accuracy_value','confusion accuracy'); 44 | #27 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); 45 | #28 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#29), 46 | #22); 47 | #29 = STYLED_ITEM('color',(#30),#15); 48 | #30 = PRESENTATION_STYLE_ASSIGNMENT((#31,#37)); 49 | #31 = SURFACE_STYLE_USAGE(.BOTH.,#32); 50 | #32 = SURFACE_SIDE_STYLE('',(#33)); 51 | #33 = SURFACE_STYLE_FILL_AREA(#34); 52 | #34 = FILL_AREA_STYLE('',(#35)); 53 | #35 = FILL_AREA_STYLE_COLOUR('',#36); 54 | #36 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877); 55 | #37 = CURVE_STYLE('',#38,POSITIVE_LENGTH_MEASURE(0.1),#39); 56 | #38 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); 57 | #39 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, 58 | 9.803921802644E-02); 59 | ENDSEC; 60 | END-ISO-10303-21; 61 | -------------------------------------------------------------------------------- /test/stepsample-curve.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); 4 | FILE_NAME('Open CASCADE Shape Model','2023-05-07T13:46:14',('Author'),( 5 | ''),'Open CASCADE STEP processor 7.6','FreeCAD','Unknown'); 6 | FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 7 | ENDSEC; 8 | DATA; 9 | #1 = APPLICATION_PROTOCOL_DEFINITION('international standard', 10 | 'automotive_design',2000,#2); 11 | #2 = APPLICATION_CONTEXT( 12 | 'core data for automotive mechanical design processes'); 13 | #3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10); 14 | #4 = PRODUCT_DEFINITION_SHAPE('','',#5); 15 | #5 = PRODUCT_DEFINITION('design','',#6,#9); 16 | #6 = PRODUCT_DEFINITION_FORMATION('','',#7); 17 | #7 = PRODUCT('Path','Path','',(#8)); 18 | #8 = PRODUCT_CONTEXT('',#2,'mechanical'); 19 | #9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); 20 | #10 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#15), 21 | #24); 22 | #11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); 23 | #12 = CARTESIAN_POINT('',(0.,0.,0.)); 24 | #13 = DIRECTION('',(0.,0.,1.)); 25 | #14 = DIRECTION('',(1.,0.,-0.)); 26 | #15 = GEOMETRIC_CURVE_SET('',(#16)); 27 | #16 = TRIMMED_CURVE('',#17,(#22,PARAMETER_VALUE(0.)),(#23, 28 | PARAMETER_VALUE(1.)),.T.,.PARAMETER.); 29 | #17 = B_SPLINE_CURVE_WITH_KNOTS('',3,(#18,#19,#20,#21),.UNSPECIFIED.,.F. 30 | ,.F.,(4,4),(0.,1.),.PIECEWISE_BEZIER_KNOTS.); 31 | #18 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 32 | #19 = CARTESIAN_POINT('',(37.491458333333,-37.51791666666,0.)); 33 | #20 = CARTESIAN_POINT('',(112.50083333333,-37.51791666666,0.)); 34 | #21 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 35 | #22 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 36 | #23 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 37 | #24 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) 38 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#28)) GLOBAL_UNIT_ASSIGNED_CONTEXT( 39 | (#25,#26,#27)) REPRESENTATION_CONTEXT('Context #1', 40 | '3D Context with UNIT and UNCERTAINTY') ); 41 | #25 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 42 | #26 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 43 | #27 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 44 | #28 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#25, 45 | 'distance_accuracy_value','confusion accuracy'); 46 | #29 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); 47 | #30 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#31), 48 | #24); 49 | #31 = STYLED_ITEM('color',(#32),#15); 50 | #32 = PRESENTATION_STYLE_ASSIGNMENT((#33,#39)); 51 | #33 = SURFACE_STYLE_USAGE(.BOTH.,#34); 52 | #34 = SURFACE_SIDE_STYLE('',(#35)); 53 | #35 = SURFACE_STYLE_FILL_AREA(#36); 54 | #36 = FILL_AREA_STYLE('',(#37)); 55 | #37 = FILL_AREA_STYLE_COLOUR('',#38); 56 | #38 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877); 57 | #39 = CURVE_STYLE('',#40,POSITIVE_LENGTH_MEASURE(0.1),#41); 58 | #40 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); 59 | #41 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, 60 | 9.803921802644E-02); 61 | ENDSEC; 62 | END-ISO-10303-21; 63 | -------------------------------------------------------------------------------- /test/stepsample-leftcurve.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); 4 | FILE_NAME('Open CASCADE Shape Model','2023-05-07T13:56:04',('Author'),( 5 | ''),'Open CASCADE STEP processor 7.6','FreeCAD','Unknown'); 6 | FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 7 | ENDSEC; 8 | DATA; 9 | #1 = APPLICATION_PROTOCOL_DEFINITION('international standard', 10 | 'automotive_design',2000,#2); 11 | #2 = APPLICATION_CONTEXT( 12 | 'core data for automotive mechanical design processes'); 13 | #3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10); 14 | #4 = PRODUCT_DEFINITION_SHAPE('','',#5); 15 | #5 = PRODUCT_DEFINITION('design','',#6,#9); 16 | #6 = PRODUCT_DEFINITION_FORMATION('','',#7); 17 | #7 = PRODUCT('Path','Path','',(#8)); 18 | #8 = PRODUCT_CONTEXT('',#2,'mechanical'); 19 | #9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); 20 | #10 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#15), 21 | #24); 22 | #11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); 23 | #12 = CARTESIAN_POINT('',(0.,0.,0.)); 24 | #13 = DIRECTION('',(0.,0.,1.)); 25 | #14 = DIRECTION('',(1.,0.,-0.)); 26 | #15 = GEOMETRIC_CURVE_SET('',(#16)); 27 | #16 = TRIMMED_CURVE('',#17,(#22,PARAMETER_VALUE(0.)),(#23, 28 | PARAMETER_VALUE(1.)),.T.,.PARAMETER.); 29 | #17 = B_SPLINE_CURVE_WITH_KNOTS('',3,(#18,#19,#20,#21),.UNSPECIFIED.,.F. 30 | ,.F.,(4,4),(0.,1.),.PIECEWISE_BEZIER_KNOTS.); 31 | #18 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 32 | #19 = CARTESIAN_POINT('',(37.491458333333,-37.51791666666,0.)); 33 | #20 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 34 | #21 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 35 | #22 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 36 | #23 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 37 | #24 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) 38 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#28)) GLOBAL_UNIT_ASSIGNED_CONTEXT( 39 | (#25,#26,#27)) REPRESENTATION_CONTEXT('Context #1', 40 | '3D Context with UNIT and UNCERTAINTY') ); 41 | #25 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 42 | #26 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 43 | #27 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 44 | #28 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#25, 45 | 'distance_accuracy_value','confusion accuracy'); 46 | #29 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); 47 | #30 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#31), 48 | #24); 49 | #31 = STYLED_ITEM('color',(#32),#15); 50 | #32 = PRESENTATION_STYLE_ASSIGNMENT((#33,#39)); 51 | #33 = SURFACE_STYLE_USAGE(.BOTH.,#34); 52 | #34 = SURFACE_SIDE_STYLE('',(#35)); 53 | #35 = SURFACE_STYLE_FILL_AREA(#36); 54 | #36 = FILL_AREA_STYLE('',(#37)); 55 | #37 = FILL_AREA_STYLE_COLOUR('',#38); 56 | #38 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877); 57 | #39 = CURVE_STYLE('',#40,POSITIVE_LENGTH_MEASURE(0.1),#41); 58 | #40 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); 59 | #41 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, 60 | 9.803921802644E-02); 61 | ENDSEC; 62 | END-ISO-10303-21; 63 | -------------------------------------------------------------------------------- /test/stepsample-rightcurve.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); 4 | FILE_NAME('Open CASCADE Shape Model','2023-05-07T13:57:22',('Author'),( 5 | ''),'Open CASCADE STEP processor 7.6','FreeCAD','Unknown'); 6 | FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 7 | ENDSEC; 8 | DATA; 9 | #1 = APPLICATION_PROTOCOL_DEFINITION('international standard', 10 | 'automotive_design',2000,#2); 11 | #2 = APPLICATION_CONTEXT( 12 | 'core data for automotive mechanical design processes'); 13 | #3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10); 14 | #4 = PRODUCT_DEFINITION_SHAPE('','',#5); 15 | #5 = PRODUCT_DEFINITION('design','',#6,#9); 16 | #6 = PRODUCT_DEFINITION_FORMATION('','',#7); 17 | #7 = PRODUCT('Path','Path','',(#8)); 18 | #8 = PRODUCT_CONTEXT('',#2,'mechanical'); 19 | #9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); 20 | #10 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#15), 21 | #24); 22 | #11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); 23 | #12 = CARTESIAN_POINT('',(0.,0.,0.)); 24 | #13 = DIRECTION('',(0.,0.,1.)); 25 | #14 = DIRECTION('',(1.,0.,-0.)); 26 | #15 = GEOMETRIC_CURVE_SET('',(#16)); 27 | #16 = TRIMMED_CURVE('',#17,(#22,PARAMETER_VALUE(0.)),(#23, 28 | PARAMETER_VALUE(1.)),.T.,.PARAMETER.); 29 | #17 = B_SPLINE_CURVE_WITH_KNOTS('',3,(#18,#19,#20,#21),.UNSPECIFIED.,.F. 30 | ,.F.,(4,4),(0.,1.),.PIECEWISE_BEZIER_KNOTS.); 31 | #18 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 32 | #19 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 33 | #20 = CARTESIAN_POINT('',(112.50083333333,-38.62916666666,0.)); 34 | #21 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 35 | #22 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 36 | #23 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 37 | #24 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) 38 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#28)) GLOBAL_UNIT_ASSIGNED_CONTEXT( 39 | (#25,#26,#27)) REPRESENTATION_CONTEXT('Context #1', 40 | '3D Context with UNIT and UNCERTAINTY') ); 41 | #25 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 42 | #26 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 43 | #27 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 44 | #28 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#25, 45 | 'distance_accuracy_value','confusion accuracy'); 46 | #29 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); 47 | #30 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#31), 48 | #24); 49 | #31 = STYLED_ITEM('color',(#32),#15); 50 | #32 = PRESENTATION_STYLE_ASSIGNMENT((#33,#39)); 51 | #33 = SURFACE_STYLE_USAGE(.BOTH.,#34); 52 | #34 = SURFACE_SIDE_STYLE('',(#35)); 53 | #35 = SURFACE_STYLE_FILL_AREA(#36); 54 | #36 = FILL_AREA_STYLE('',(#37)); 55 | #37 = FILL_AREA_STYLE_COLOUR('',#38); 56 | #38 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877); 57 | #39 = CURVE_STYLE('',#40,POSITIVE_LENGTH_MEASURE(0.1),#41); 58 | #40 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); 59 | #41 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, 60 | 9.803921802644E-02); 61 | ENDSEC; 62 | END-ISO-10303-21; 63 | -------------------------------------------------------------------------------- /test/test_bkup2.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | FILE_DESCRIPTION(('svg2stp model'),'2;1'); 4 | FILE_NAME('svg2stp model for Plasticity','2023-05-09T13:52:25',('Author'),(''),'svg2stp 1.0','https://dev.cog.ooo/svg2stp/','Unknown'); 5 | FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 6 | ENDSEC; 7 | DATA; 8 | #20 = CARTESIAN_POINT('', (100, 100, 0)); 9 | #21 = CARTESIAN_POINT('', (100, 500, 0)); 10 | #22 = CARTESIAN_POINT('', (500, 500, 0)); 11 | #23 = CARTESIAN_POINT('', (500, 100, 0)); 12 | #30 = CARTESIAN_POINT('', (500, 100, 0)); 13 | #31 = CARTESIAN_POINT('', (500, 500, 0)); 14 | #32 = CARTESIAN_POINT('', (800, 100, 0)); 15 | #40 = CARTESIAN_POINT('', (800, 100, 0)); 16 | #41 = CARTESIAN_POINT('', (1200, 500, 0)); 17 | #50 = CARTESIAN_POINT('', (2100, 100, 0)); 18 | #51 = CARTESIAN_POINT('', (2100, 500, 0)); 19 | #52 = CARTESIAN_POINT('', (2500, 500, 0)); 20 | #53 = CARTESIAN_POINT('', (2500, 100, 0)); 21 | #60 = CARTESIAN_POINT('', (100, 100, 0)); 22 | #61 = CARTESIAN_POINT('', (100, 500, 0)); 23 | #62 = CARTESIAN_POINT('', (500, 500, 0)); 24 | #63 = CARTESIAN_POINT('', (500, 100, 0)); 25 | #64 = CARTESIAN_POINT('', (2100, 100, 0)); 26 | #65 = CARTESIAN_POINT('', (2100, 500, 0)); 27 | #66 = CARTESIAN_POINT('', (2500, 500, 0)); 28 | #67 = CARTESIAN_POINT('', (2500, 100, 0)); 29 | #70 = CARTESIAN_POINT('', (100, 100, 0)); 30 | #71 = CARTESIAN_POINT('', (100, 500, 0)); 31 | #72 = CARTESIAN_POINT('', (500, 500, 0)); 32 | #73 = CARTESIAN_POINT('', (500, 100, 0)); 33 | #74 = CARTESIAN_POINT('', (2100, 100, 0)); 34 | #75 = CARTESIAN_POINT('', (2100, 500, 0)); 35 | #76 = CARTESIAN_POINT('', (2500, 500, 0)); 36 | #77 = CARTESIAN_POINT('', (2500, 100, 0)); 37 | #78 = CARTESIAN_POINT('', (500, 100, 0)); 38 | #79 = CARTESIAN_POINT('', (500, 500, 0)); 39 | #80 = CARTESIAN_POINT('', (800, 100, 0)); 40 | #81 = CARTESIAN_POINT('', (1800, 100, 0)); 41 | #27 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#20, #21, #22, #23), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 42 | #127 = B_SPLINE_CURVE_WITH_KNOTS('', 2, (#30, #31, #32), .UNSPECIFIED., .F., .F., (3, 3), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 43 | #227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#40, #41), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 44 | #327 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#50, #51, #52, #53), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 45 | #427 = B_SPLINE_CURVE_WITH_KNOTS('', 7, (#60, #61, #62, #63, #64, #65, #66, #67), .UNSPECIFIED., .F., .F., (8, 8), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 46 | #527 = B_SPLINE_CURVE_WITH_KNOTS('', 11, (#70, #71, #72, #73, #74, #75, #76, #77, #78, #79, #80, #81), .UNSPECIFIED., .F., .F., (12, 12), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 47 | #26 = TRIMMED_CURVE('', #27, (##20, PARAMETER_VALUE(0.)), (##23, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 48 | #126 = TRIMMED_CURVE('', #127, (##30, PARAMETER_VALUE(0.)), (##32, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 49 | #226 = TRIMMED_CURVE('', #227, (##40, PARAMETER_VALUE(0.)), (##41, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 50 | #326 = TRIMMED_CURVE('', #327, (##50, PARAMETER_VALUE(0.)), (##53, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 51 | #426 = TRIMMED_CURVE('', #427, (##60, PARAMETER_VALUE(0.)), (##67, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 52 | #526 = TRIMMED_CURVE('', #527, (##70, PARAMETER_VALUE(0.)), (##81, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 53 | 54 | #10 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#15),(#26, #126, #226, #326, #426, #526)); 55 | #15 = GEOMETRIC_CURVE_SET('',(#26, #126, #226, #326, #426, #526)); 56 | ENDSEC; 57 | END-ISO-10303-21; -------------------------------------------------------------------------------- /script.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * svg2step v1.0 (2023-05-20) 3 | * Copy and Paste Illustrator path data (svg) and convert to a .step file (ISO 10303-21). 4 | * https://dev.cog.ooo/svg2step/ 5 | * 6 | * Copyright (c) 2023 Masaya Ishikawa 7 | * http://www.cog.ooo/ 8 | * All rights reserved. 9 | * 10 | * Distributed under the MIT license. See LICENSE file for details. 11 | * 12 | * Date: Sat May 20 17:56:00 2023 UTC+0900 (Japan Standard Time) 13 | * 14 | *** 15 | * 16 | * Paper.js - The Swiss Army Knife of Vector Graphics Scripting. 17 | * 18 | * Copyright (c) 2011 - 2020, Jürg Lehni & Jonathan Puckey 19 | * http://juerglehni.com/ & https://puckey.studio/ 20 | * 21 | * Distributed under the MIT license. 22 | * See http://paperjs.org/license 23 | */ 24 | 25 | import { generateStepFile, createStepFromSVGPathItems } from './src/svg2stp.js'; 26 | import { copyToClipBoard, pasteFromClipBoard } from './src/clipboard.js'; 27 | import { parseSVG, parseSVGFiles } from './src/svgParser.js'; 28 | import { createSVGPathItems, drawSVGPathItems } from './src/item-SVGPath.js'; 29 | import { data } from './data/data.js'; 30 | 31 | const cc_msg = '\u001b[32m'; // green for console.log 32 | const cc_reset = '\u001b[0m'; // reset color 33 | 34 | let svgPathItems = []; 35 | const canvas_1 = document.getElementById('canvas_1'); 36 | const scope_canvas_1 = new paper.PaperScope(); 37 | let stepData = ''; 38 | 39 | //paper.install(window); 40 | 41 | const init = () => { 42 | console.log('init'); 43 | scope_canvas_1.setup(canvas_1); 44 | const btn = document.querySelector('.btn'); 45 | }; 46 | 47 | window.onload = init; 48 | 49 | const stepFile = generateStepFile(data); 50 | //console.log(stepFile); 51 | 52 | document.addEventListener('keydown', async (event) => { 53 | if (event.ctrlKey || event.metaKey) { 54 | if (event.code == 'KeyC') await copyToClipBoard(); 55 | if (event.code == 'KeyV') { 56 | const text = await pasteFromClipBoard(); 57 | console.log(cc_msg + 'clipboard text = \n' + cc_reset + text); 58 | const path2Ddata = parseSVG(text, scope_canvas_1); 59 | console.log(cc_msg + 'path2Ddata = \n' + cc_reset, path2Ddata); 60 | svgPathItems = svgPathItems.concat(structuredClone(createSVGPathItems(path2Ddata, scope_canvas_1))); 61 | console.log(cc_msg + 'svgPathItems = \n' + cc_reset, svgPathItems); 62 | drawSVGPathItems(svgPathItems, scope_canvas_1); // draw Paths 63 | stepData = createStepFromSVGPathItems(svgPathItems); // create STEP file 64 | //drawDot(10, scope_canvas_1); 65 | console.log(cc_msg + 'stepData = \n' + cc_reset, stepData); 66 | } 67 | } 68 | }); 69 | 70 | function drawDot(diameter, scope) { 71 | const dot = new scope_canvas_1.Path.Rectangle({ 72 | point: [scope.view.center.x - diameter / 2, scope.view.center.y - diameter / 2], 73 | size: [diameter, diameter], 74 | fillColor: 'blue', 75 | }); 76 | dot.style = { 77 | strokeColor: 'black', 78 | }; 79 | } 80 | 81 | btn.addEventListener( 82 | 'click', 83 | () => { 84 | let fileName = 'download.step'; 85 | let url = 'data:image/svg+xml;utf8,' + encodeURIComponent(stepData); 86 | let element = document.createElement('a'); 87 | element.download = fileName; 88 | element.target = '_blank'; 89 | element.href = url; 90 | element.click(); 91 | }, 92 | false 93 | ); 94 | 95 | file.addEventListener('change', (event) => { 96 | const files = event.target.files; 97 | getSvgPathItemsFromFile(files, scope_canvas_1); 98 | }); 99 | 100 | async function getSvgPathItemsFromFile(files, scope) { 101 | const svgPathItemsFromFile = await parseSVGFiles(files, scope); 102 | console.log(cc_msg + 'svgPathItemsFromFile = \n' + cc_reset, svgPathItemsFromFile); 103 | svgPathItemsFromFile.forEach((item) => { 104 | svgPathItems = svgPathItems.concat(item); 105 | }); 106 | console.log(cc_msg + 'svgPathItems = \n' + cc_reset, svgPathItems); 107 | drawSVGPathItems(svgPathItems, scope_canvas_1); // draw Paths 108 | stepData = createStepFromSVGPathItems(svgPathItems); // create STEP file 109 | console.log(cc_msg + 'stepData = \n' + cc_reset, stepData); 110 | } 111 | -------------------------------------------------------------------------------- /css/main.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --color-dark: #0f172a; 3 | --color-light: #e3e4e0; 4 | --color-accent: #cdedf3; 5 | --thumb-height: 10px; 6 | --thumb-width: 10px; 7 | --thumb-border-radius: 50%; 8 | --round-input-radius: 40px; 9 | --range-button-radius: 30px; 10 | --font-family-ui: "Quicksand", sans-serif; 11 | --font-family-text: "游ゴシッグ", "ヒラギノ角ゴProN", "メイリオ", "MSPゴシック", sans-serif; 12 | } 13 | 14 | * { 15 | padding: 0; 16 | margin: 0; 17 | box-sizing: border-box; 18 | } 19 | 20 | body { 21 | margin: 0 0 0 0; 22 | padding: 0; 23 | height: 100%; 24 | line-height: 1.6; 25 | word-spacing: 1.4px; 26 | color: var(--color-dark); 27 | background-color: var(--color-light); 28 | } 29 | 30 | #canvas_1[resize] { 31 | width: 100dvw; 32 | height: 100dvh; 33 | background-color: rgb(224, 224, 224); 34 | } 35 | 36 | .panel-left { 37 | width: 220px; 38 | /* height: 100%; */ 39 | position: fixed; 40 | top: 20px; 41 | left: 20px; 42 | background-color: none; 43 | } 44 | 45 | .ui-group { 46 | margin: 0px 0px 30px 0px; 47 | } 48 | 49 | .container { 50 | background-color: none; 51 | width: auto; 52 | position: relative; 53 | display: flex; 54 | align-items: center; 55 | justify-content: space-between; 56 | padding: 5px 10px; 57 | border-radius: 0; 58 | } 59 | 60 | .ui-button { 61 | /* Reset */ 62 | background-color: transparent; 63 | border-color: transparent; 64 | 65 | /* Cursor */ 66 | cursor: pointer; 67 | 68 | /* Size */ 69 | height: var(--round-input-radius); 70 | width: var(--round-input-radius); 71 | 72 | /* Used to position the inner */ 73 | position: relative; 74 | border-radius: 50%; 75 | transition: background-color 0.2s; 76 | } 77 | 78 | .ui-button:hover { 79 | background-color: var(--color-accent); 80 | } 81 | 82 | .ui-button:active { 83 | background-color: #ffffff; 84 | border-width: 8px; 85 | } 86 | 87 | .btn-delete { 88 | background-image: url('data:image/svg+xml;utf-8,'); 89 | background-repeat: no-repeat; 90 | background-size: contain; 91 | background-position: center; 92 | } 93 | 94 | .btn-savefile { 95 | background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Cdefs%3E%3Cstyle%3E.cls-1,.cls-2%7Bfill:none;%7D.cls-2%7Bstroke-linejoin:round;%7D.cls-2,.cls-3%7Bstroke:%23333;stroke-linecap:round;%7D.cls-3%7Bfill:%23fff;stroke-miterlimit:10;%7D%3C/style%3E%3C/defs%3E%3Cg id='save'%3E%3Cg%3E%3Cline class='cls-3' x1='23.6' y1='16.89' x2='23.6' y2='7.89'/%3E%3Cpolyline class='cls-2' points='27.1 12.89 23.6 16.89 20.1 12.89'/%3E%3C/g%3E%3Cg%3E%3Cpath class='cls-2' d='M26.48,22v-2.5h-7.25c-.55,0-1-.45-1-1v-.25c0-.55-.45-1-1-1h-4.25c-.55,0-1,.45-1,1v12.25'/%3E%3Cpolygon class='cls-2' points='11.98 30.5 26.48 30.5 30.02 22 15.52 22 11.98 30.5'/%3E%3C/g%3E%3C/g%3E%3Cg id='guide_40x40'%3E%3Ccircle class='cls-1' cx='20' cy='20' r='20'/%3E%3C/g%3E%3C/svg%3E"); 96 | background-repeat: no-repeat; 97 | background-size: contain; 98 | background-position: center; 99 | } 100 | 101 | .btn-copy { 102 | background-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Cdefs%3E%3Cstyle%3E.cls-1,.cls-2,.cls-3%7Bfill:none;%7D.cls-2,.cls-3%7Bstroke-linejoin:round;%7D.cls-2,.cls-3,.cls-4,.cls-5%7Bstroke:%23333;%7D.cls-2,.cls-4%7Bstroke-linecap:round;%7D.cls-3%7Bstroke-linecap:square;%7D.cls-4%7Bfill:%23fff;%7D.cls-4,.cls-5%7Bstroke-miterlimit:10;%7D.cls-5%7Bfill:%23333;stroke-width:.5px;%7D%3C/style%3E%3C/defs%3E%3Cg id='copy'%3E%3Cg%3E%3Cline class='cls-4' x1='21' y1='22.5' x2='7' y2='22.5'/%3E%3Cpolyline class='cls-2' points='17 19 21 22.5 17 26'/%3E%3C/g%3E%3Cg%3E%3Cpolyline class='cls-3' points='25.5 13.25 28.25 13.25 28.25 30.5 13.75 30.5 13.75 13.25 16.5 13.25'/%3E%3Cpath class='cls-2' d='M23.5,12c0-1.38-1.12-2.5-2.5-2.5s-2.5,1.12-2.5,2.5v.25h-2v3.25h9v-3.25h-2v-.25Z'/%3E%3C/g%3E%3Ccircle class='cls-5' cx='21' cy='12.12' r='.5'/%3E%3C/g%3E%3Cg id='guide_40x40'%3E%3Ccircle class='cls-1' cx='20' cy='20' r='20'/%3E%3C/g%3E%3C/svg%3E"); 103 | background-repeat: no-repeat; 104 | background-size: contain; 105 | background-position: center; 106 | } 107 | -------------------------------------------------------------------------------- /src/item-SVGPath.js: -------------------------------------------------------------------------------- 1 | const cc_msg = "\u001b[35mitem-SVGPath.js : "; // magenta for console.log 2 | const cc_reset = "\u001b[0m"; // reset color 3 | 4 | export { createSVGPathItems, drawSVGPathItems, createSVGPathString, calculateProjectedVertex }; 5 | import { calc_roundNumber } from "./calc.js"; 6 | 7 | class SVGPathItem { 8 | constructor(pathArray3D, style, translation) { 9 | // Constructor Function 10 | this.pathArray3D = pathArray3D; 11 | this.style = style; 12 | 13 | this.transformation = { 14 | translation: translation, 15 | scale: { x: 1, y: 1, z: 1 }, 16 | rotation: { x: 0, y: 0, z: 0 }, 17 | anchor: { x: 0, y: 0, z: 0 }, 18 | }; 19 | } 20 | } 21 | 22 | class SVGPathNode { 23 | constructor(c, p, ec) { 24 | // Constructor Function 25 | this.command = c; 26 | this.point = p; 27 | this.endCommand = ec; 28 | } 29 | } 30 | 31 | function createSVGPathItems(path2Ddata, scope) { 32 | const rounding = 2; 33 | const result = []; 34 | path2Ddata.paths.forEach((path) => { 35 | const tempPath = new scope.CompoundPath(path.pathString); 36 | tempPath.style = path.style; 37 | const pathArray2D = path.pathString.match( 38 | /([MLCZ])[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?|Z/g 39 | ); 40 | 41 | console.log( 42 | cc_msg + "PathArray2D = " + cc_reset + pathArray2D + " | length = " + pathArray2D.length 43 | ); 44 | const pathArray3D = createSVGPathArray3D(pathArray2D); 45 | pathArray3D.forEach((node) => { 46 | // move center to (0,0) 47 | node.point.x -= tempPath.bounds.center.x; 48 | node.point.y -= tempPath.bounds.center.y; 49 | node.point.x = calc_roundNumber(node.point.x, rounding); 50 | node.point.y = calc_roundNumber(node.point.y, rounding); 51 | // Flip vertically since y values of SVG grow top -> down and the y values of the 3D mesh grow bottom 52 | //node.point.y *= -1; 53 | }); 54 | console.log(cc_msg + "centered PathArray3D = " + cc_reset, pathArray3D); 55 | const translation = { 56 | x: calc_roundNumber(tempPath.bounds.center.x - path2Ddata.width / 2, rounding), 57 | y: -calc_roundNumber(tempPath.bounds.center.y - path2Ddata.height / 2, rounding), 58 | z: 0, 59 | }; 60 | result.push(new SVGPathItem(pathArray3D, path.style, translation)); 61 | tempPath.remove(); 62 | }); 63 | return result; 64 | } 65 | function createSVGPathArray3D(pathArray2D) { 66 | let result = []; 67 | let i = 0; 68 | while (i < pathArray2D.length) { 69 | let head, x, y, z, end; 70 | z = 0.0; 71 | head = pathArray2D[i].slice(0, 1); 72 | 73 | if (head == "M" || head == "L" || head == "C") { 74 | x = Number(pathArray2D[i].slice(1)); 75 | i++; 76 | } else if (head == "Z") { 77 | const prevNode = result[result.length - 1]; 78 | result[result.length - 1] = new SVGPathNode(prevNode.command, prevNode.point, "Z"); 79 | i++; 80 | continue; 81 | } else { 82 | head = ""; 83 | x = pathArray2D[i]; 84 | i++; 85 | } 86 | end = pathArray2D[i].slice(-1); 87 | if (end == "Z") { 88 | y = pathArray2D[i].slice(0, -1); 89 | i++; 90 | } else { 91 | y = pathArray2D[i]; 92 | end = ""; 93 | i++; 94 | } 95 | result.push(new SVGPathNode(head, { x: x, y: y, z: z }, end)); 96 | } 97 | return result; 98 | } 99 | 100 | function drawSVGPathItems(svgPathItems, scope) { 101 | let svgDrawPaths = []; 102 | svgPathItems.forEach((path) => { 103 | svgDrawPaths = svgDrawPaths.concat(createSVGDrawPath(path, scope)); 104 | }); 105 | svgDrawPaths.forEach((path) => { 106 | const drawPath = new scope.CompoundPath(path.pathString); 107 | drawPath.style = path.style; 108 | }); 109 | console.log(cc_msg + "svgDrawPaths = " + cc_reset, svgDrawPaths); 110 | } 111 | 112 | function createSVGDrawPath(path, scope) { 113 | let str = ""; 114 | let style = null; 115 | style = path.style; 116 | path.pathArray3D.forEach((node) => { 117 | const projectedPoint = calculateProjectedVertex(node.point, path.transformation); 118 | str = createSVGPathString( 119 | str, 120 | projectedPoint.x + scope.view.center.x, 121 | projectedPoint.y + scope.view.center.y, 122 | projectedPoint.z, 123 | node.command, 124 | node.endCommand 125 | ); 126 | }); 127 | console.log(cc_msg + "DrawPath = " + cc_reset + str); 128 | return { pathString: str, style: style }; 129 | } 130 | 131 | function createSVGPathString(str, x, y, z, command, endCommand) { 132 | str = str + command + x + " " + y + endCommand + " "; 133 | return str; 134 | } 135 | 136 | function calculateProjectedVertex(point, transformation) { 137 | const x = calc_roundNumber(point.x + transformation.translation.x); 138 | const y = calc_roundNumber(point.y - transformation.translation.y); 139 | const z = calc_roundNumber(point.z + transformation.translation.z); 140 | return { x: x, y: y, z: z }; 141 | } 142 | -------------------------------------------------------------------------------- /src/svgParser.js: -------------------------------------------------------------------------------- 1 | // SVG Parser 2 | export { parseSVG, parseSVGFiles }; 3 | import { calc_roundNumber } from "./calc.js"; 4 | import { createSVGPathItems } from "./item-SVGPath.js"; 5 | 6 | const cc_msg = "\u001b[36msvgParser.js : "; // cyan for console.log 7 | const cc_reset = "\u001b[0m"; // reset color 8 | 9 | /////////////////////////////////////////////////////////////////////////////// 10 | // Parse SVG 11 | /////////////////////////////////////////////////////////////////////////////// 12 | 13 | async function parseSVGFiles(files, scope) { 14 | let resultSVGPathItems = []; 15 | for (const file of Array.from(files)) { 16 | if (file.type.match("svg")) { 17 | console.log(cc_msg + "file = \n" + cc_reset, file); 18 | const svgTxtConverted = await convertFileShapesToPath(file, scope); 19 | console.log(cc_msg + "svgTxtConverted = \n" + cc_reset, svgTxtConverted); 20 | const path2Ddata = createPath2DData(svgTxtConverted); 21 | resultSVGPathItems = resultSVGPathItems.concat( 22 | structuredClone(createSVGPathItems(path2Ddata, scope)) 23 | ); 24 | } 25 | } 26 | console.log(cc_msg + "resultSVGPathItems = \n" + cc_reset, resultSVGPathItems); 27 | return resultSVGPathItems; 28 | } 29 | 30 | function convertFileShapesToPath(file, scope) { 31 | return new Promise((resolve) => { 32 | scope.project.importSVG(file, { 33 | svg: String, 34 | expandShapes: true, // expanded shape to path 35 | insert: false, // don't add to the project 36 | onLoad: function (item) { 37 | console.log(cc_msg + "item = \n" + cc_reset, item); 38 | resolve(item.exportSVG({ asString: true })); // PaperJS --> svg 39 | }, 40 | }); 41 | }); 42 | } 43 | 44 | function parseSVG(svgTxt, scope) { 45 | const svgTxtConverted = convertShapeToPath(svgTxt, scope); // svg --> PaperJS to convert shapes to paths. 46 | console.log(cc_msg + "svg shapes converted to paths = \n" + cc_reset, svgTxtConverted); 47 | const path2Ddata = createPath2DData(svgTxtConverted); 48 | return path2Ddata; 49 | // const data = splitPathData(svgTxtConverted); 50 | // console.log(cc_msg + "clip width / height = " + cc_reset + data.width + " / " + data.height); 51 | // console.log(cc_msg + `parsed ${data.paths.length} path objects` + cc_reset); 52 | // let pathStrings = []; 53 | // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 54 | // data.paths.forEach((path) => { 55 | // const pathData = path.getAttribute("d"); 56 | // const normalizedPathData = normalizePathData(pathData); 57 | // const style = extractStyle(path); 58 | // console.log(cc_msg + "path data = \n" + cc_reset + pathData); 59 | // console.log(cc_msg + "normalized path data = \n" + cc_reset + normalizedPathData); 60 | // console.log(cc_msg + "path style = " + cc_reset, style); 61 | // pathStrings.push({ pathString: normalizedPathData, style: style }); 62 | // }); 63 | // return { width: data.width, height: data.height, paths: pathStrings }; 64 | } 65 | 66 | // Convert SVG Shapes to Paths. 67 | function convertShapeToPath(str, scope) { 68 | //Convert SVG Shapes to Paths. 69 | const convertedSvgPath = scope.project.importSVG(str, { 70 | svg: String, 71 | expandShapes: true, // expanded shape to path 72 | insert: false, // don't add to the project 73 | }); 74 | console.log(cc_msg + "convertedSvgPath = " + cc_reset, convertedSvgPath); 75 | const result = convertedSvgPath.exportSVG({ asString: true }); // PaperJS --> svg 76 | //convertedPath.remove(); //don't show tmp path 77 | return result; 78 | } 79 | 80 | function createPath2DData(svgTxtConverted) { 81 | const data = splitPathData(svgTxtConverted); 82 | console.log(cc_msg + "clip width / height = " + cc_reset + data.width + " / " + data.height); 83 | console.log(cc_msg + `parsed ${data.paths.length} path objects` + cc_reset); 84 | let pathStrings = []; 85 | data.paths.forEach((path) => { 86 | const pathData = path.getAttribute("d"); 87 | const normalizedPathData = normalizePathData(pathData); 88 | const style = extractStyle(path); 89 | console.log(cc_msg + "path data = \n" + cc_reset + pathData); 90 | console.log(cc_msg + "normalized path data = \n" + cc_reset + normalizedPathData); 91 | console.log(cc_msg + "path style = " + cc_reset, style); 92 | pathStrings.push({ pathString: normalizedPathData, style: style }); 93 | }); 94 | return { width: data.width, height: data.height, paths: pathStrings }; //path2DData 95 | } 96 | 97 | function splitPathData(str) { 98 | const parser = new DOMParser(); 99 | const svg = parser.parseFromString(str, "image/svg+xml").childNodes[0]; 100 | console.log(cc_msg + "svg document = " + cc_reset, svg); 101 | 102 | const paths = svg.querySelectorAll("path"); // Array of paths 103 | const clipMask = svg.querySelectorAll(" defs > clipPath > rect"); 104 | const w = clipMask[0].getAttribute("width"); 105 | const h = clipMask[0].getAttribute("height"); 106 | 107 | return { 108 | paths: paths, 109 | width: w, 110 | height: h, 111 | }; 112 | } 113 | 114 | // Extract style from path element. 115 | function extractStyle(path) { 116 | // Styles are converted to Paper.js format. 117 | const style = {}; 118 | if (path.hasAttribute("fill")) { 119 | style.fillColor = path.getAttribute("fill"); 120 | } 121 | if (path.hasAttribute("fill-rule")) { 122 | style.fillRule = path.getAttribute("fill-rule"); 123 | } 124 | if (path.hasAttribute("stroke")) { 125 | if (path.getAttribute("stroke") != "none") { 126 | style.strokeColor = path.getAttribute("stroke"); 127 | } 128 | } 129 | if (path.hasAttribute("stroke-width")) { 130 | if (path.getAttribute("stroke") != "none") { 131 | style.strokeWidth = Number(path.getAttribute("stroke-width")); 132 | } 133 | } 134 | if (path.hasAttribute("stroke-linecap")) { 135 | style.strokeCap = path.getAttribute("stroke-linecap"); 136 | } 137 | if (path.hasAttribute("stroke-linejoin")) { 138 | style.strokeJoin = path.getAttribute("stroke-linejoin"); 139 | } 140 | if (path.hasAttribute("stroke-dasharray")) { 141 | const arrayStr = path.getAttribute("stroke-dasharray"); 142 | style.dashArray = arrayStr.split(",").map(Number); 143 | } 144 | if (path.hasAttribute("stroke-dashoffset")) { 145 | style.dashOffset = Number(path.getAttribute("stroke-dashoffset")); 146 | } 147 | return style; 148 | } 149 | 150 | // Normalize path data. 151 | function normalizePathData(pathData, rounding = 2) { 152 | const commandPattern = /[MmLlHhVvCcZz]|[+-]?(?:\d*\.\d+|\d+)(?:[eE][+-]?\d+)?/g; 153 | const commands = pathData.match(commandPattern); 154 | 155 | let currentX = 0; 156 | let currentY = 0; 157 | let lastMx = 0; 158 | let lastMy = 0; 159 | let newPathData = ""; 160 | 161 | while (commands.length > 0) { 162 | const command = commands.shift(); 163 | const isRelative = /[a-z]/.test(command); 164 | let x, y, x1, y1, x2, y2; 165 | 166 | switch (command.toUpperCase()) { 167 | case "M": 168 | case "L": 169 | x = parseFloat(commands.shift()); 170 | y = parseFloat(commands.shift()); 171 | if (isRelative) { 172 | x += currentX; 173 | y += currentY; 174 | } 175 | x = calc_roundNumber(x, rounding); 176 | y = calc_roundNumber(y, rounding); 177 | newPathData += `${command.toUpperCase()}${x},${y} `; 178 | if (command.toUpperCase() === "M") { 179 | lastMx = x; 180 | lastMy = y; 181 | } 182 | currentX = x; 183 | currentY = y; 184 | break; 185 | case "H": 186 | x = parseFloat(commands.shift()); 187 | if (isRelative) { 188 | x += currentX; 189 | } 190 | x = calc_roundNumber(x, rounding); 191 | newPathData += `L${x},${currentY} `; 192 | currentX = x; 193 | break; 194 | case "V": 195 | y = parseFloat(commands.shift()); 196 | if (isRelative) { 197 | y += currentY; 198 | } 199 | y = calc_roundNumber(y, rounding); 200 | newPathData += `L${currentX},${y} `; 201 | currentY = y; 202 | break; 203 | case "C": 204 | x1 = parseFloat(commands.shift()); 205 | y1 = parseFloat(commands.shift()); 206 | x2 = parseFloat(commands.shift()); 207 | y2 = parseFloat(commands.shift()); 208 | x = parseFloat(commands.shift()); 209 | y = parseFloat(commands.shift()); 210 | 211 | if (isRelative) { 212 | x1 += currentX; 213 | y1 += currentY; 214 | x2 += currentX; 215 | y2 += currentY; 216 | x += currentX; 217 | y += currentY; 218 | } 219 | newPathData += `C${x1},${y1} ${x2},${y2} ${x},${y} `; 220 | currentX = x; 221 | currentY = y; 222 | break; 223 | case "Z": 224 | newPathData += "Z "; 225 | currentX = lastMx; 226 | currentY = lastMy; 227 | break; 228 | } 229 | } 230 | return newPathData.trim(); 231 | } 232 | -------------------------------------------------------------------------------- /test/stepsample-3curves.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | FILE_DESCRIPTION(('FreeCAD Model'),'2;1'); 4 | FILE_NAME('Open CASCADE Shape Model','2023-05-07T15:42:20',('Author'),( 5 | ''),'Open CASCADE STEP processor 7.6','FreeCAD','Unknown'); 6 | FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 7 | ENDSEC; 8 | DATA; 9 | #1 = APPLICATION_PROTOCOL_DEFINITION('international standard', 10 | 'automotive_design',2000,#2); 11 | #2 = APPLICATION_CONTEXT( 12 | 'core data for automotive mechanical design processes'); 13 | #3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10); 14 | #4 = PRODUCT_DEFINITION_SHAPE('','',#5); 15 | #5 = PRODUCT_DEFINITION('design','',#6,#9); 16 | #6 = PRODUCT_DEFINITION_FORMATION('','',#7); 17 | #7 = PRODUCT('stepsample_3curves_svg','stepsample_3curves_svg','',(#8)); 18 | #8 = PRODUCT_CONTEXT('',#2,'mechanical'); 19 | #9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); 20 | #10 = SHAPE_REPRESENTATION('',(#11,#15,#19,#23),#27); 21 | #11 = AXIS2_PLACEMENT_3D('',#12,#13,#14); 22 | #12 = CARTESIAN_POINT('',(0.,0.,0.)); 23 | #13 = DIRECTION('',(0.,0.,1.)); 24 | #14 = DIRECTION('',(1.,0.,-0.)); 25 | #15 = AXIS2_PLACEMENT_3D('',#16,#17,#18); 26 | #16 = CARTESIAN_POINT('',(0.,0.,0.)); 27 | #17 = DIRECTION('',(0.,0.,1.)); 28 | #18 = DIRECTION('',(1.,0.,0.)); 29 | #19 = AXIS2_PLACEMENT_3D('',#20,#21,#22); 30 | #20 = CARTESIAN_POINT('',(0.,0.,0.)); 31 | #21 = DIRECTION('',(0.,0.,1.)); 32 | #22 = DIRECTION('',(1.,0.,0.)); 33 | #23 = AXIS2_PLACEMENT_3D('',#24,#25,#26); 34 | #24 = CARTESIAN_POINT('',(0.,0.,0.)); 35 | #25 = DIRECTION('',(0.,0.,1.)); 36 | #26 = DIRECTION('',(1.,0.,0.)); 37 | #27 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) 38 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#31)) GLOBAL_UNIT_ASSIGNED_CONTEXT( 39 | (#28,#29,#30)) REPRESENTATION_CONTEXT('Context #1', 40 | '3D Context with UNIT and UNCERTAINTY') ); 41 | #28 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 42 | #29 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 43 | #30 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 44 | #31 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#28, 45 | 'distance_accuracy_value','confusion accuracy'); 46 | #32 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7)); 47 | #33 = SHAPE_DEFINITION_REPRESENTATION(#34,#40); 48 | #34 = PRODUCT_DEFINITION_SHAPE('','',#35); 49 | #35 = PRODUCT_DEFINITION('design','',#36,#39); 50 | #36 = PRODUCT_DEFINITION_FORMATION('','',#37); 51 | #37 = PRODUCT('Path','Path','',(#38)); 52 | #38 = PRODUCT_CONTEXT('',#2,'mechanical'); 53 | #39 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); 54 | #40 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#41), 55 | #50); 56 | #41 = GEOMETRIC_CURVE_SET('',(#42)); 57 | #42 = TRIMMED_CURVE('',#43,(#48,PARAMETER_VALUE(0.)),(#49, 58 | PARAMETER_VALUE(1.)),.T.,.PARAMETER.); 59 | #43 = B_SPLINE_CURVE_WITH_KNOTS('',3,(#44,#45,#46,#47),.UNSPECIFIED.,.F. 60 | ,.F.,(4,4),(0.,1.),.PIECEWISE_BEZIER_KNOTS.); 61 | #44 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 62 | #45 = CARTESIAN_POINT('',(112.50083333333,-37.51791666666,0.)); 63 | #46 = CARTESIAN_POINT('',(187.51020833333,-75.009375,0.)); 64 | #47 = CARTESIAN_POINT('',(187.51020833333,-75.009375,0.)); 65 | #48 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 66 | #49 = CARTESIAN_POINT('',(187.51020833333,-75.009375,0.)); 67 | #50 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) 68 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#54)) GLOBAL_UNIT_ASSIGNED_CONTEXT( 69 | (#51,#52,#53)) REPRESENTATION_CONTEXT('Context #1', 70 | '3D Context with UNIT and UNCERTAINTY') ); 71 | #51 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 72 | #52 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 73 | #53 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 74 | #54 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#51, 75 | 'distance_accuracy_value','confusion accuracy'); 76 | #55 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#56,#58); 77 | #56 = ( REPRESENTATION_RELATIONSHIP('','',#40,#10) 78 | REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#57) 79 | SHAPE_REPRESENTATION_RELATIONSHIP() ); 80 | #57 = ITEM_DEFINED_TRANSFORMATION('','',#11,#15); 81 | #58 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#59); 82 | #59 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('1','Path','',#5,#35,$); 83 | #60 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#37)); 84 | #61 = SHAPE_DEFINITION_REPRESENTATION(#62,#68); 85 | #62 = PRODUCT_DEFINITION_SHAPE('','',#63); 86 | #63 = PRODUCT_DEFINITION('design','',#64,#67); 87 | #64 = PRODUCT_DEFINITION_FORMATION('','',#65); 88 | #65 = PRODUCT('Line','Line','',(#66)); 89 | #66 = PRODUCT_CONTEXT('',#2,'mechanical'); 90 | #67 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); 91 | #68 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#69), 92 | #76); 93 | #69 = GEOMETRIC_CURVE_SET('',(#70)); 94 | #70 = TRIMMED_CURVE('',#71,(#74,PARAMETER_VALUE(0.)),(#75, 95 | PARAMETER_VALUE(283.5)),.T.,.PARAMETER.); 96 | #71 = B_SPLINE_CURVE_WITH_KNOTS('',1,(#72,#73),.UNSPECIFIED.,.F.,.F.,(2, 97 | 2),(0.,283.5),.PIECEWISE_BEZIER_KNOTS.); 98 | #72 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 99 | #73 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 100 | #74 = CARTESIAN_POINT('',(37.491458333333,-75.009375,0.)); 101 | #75 = CARTESIAN_POINT('',(112.50083333333,-75.009375,0.)); 102 | #76 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) 103 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#80)) GLOBAL_UNIT_ASSIGNED_CONTEXT( 104 | (#77,#78,#79)) REPRESENTATION_CONTEXT('Context #1', 105 | '3D Context with UNIT and UNCERTAINTY') ); 106 | #77 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 107 | #78 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 108 | #79 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 109 | #80 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#77, 110 | 'distance_accuracy_value','confusion accuracy'); 111 | #81 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#82,#84); 112 | #82 = ( REPRESENTATION_RELATIONSHIP('','',#68,#10) 113 | REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#83) 114 | SHAPE_REPRESENTATION_RELATIONSHIP() ); 115 | #83 = ITEM_DEFINED_TRANSFORMATION('','',#11,#19); 116 | #84 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#85); 117 | #85 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('2','Line','',#5,#63,$); 118 | #86 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#65)); 119 | #87 = SHAPE_DEFINITION_REPRESENTATION(#88,#94); 120 | #88 = PRODUCT_DEFINITION_SHAPE('','',#89); 121 | #89 = PRODUCT_DEFINITION('design','',#90,#93); 122 | #90 = PRODUCT_DEFINITION_FORMATION('','',#91); 123 | #91 = PRODUCT('Path001','Path001','',(#92)); 124 | #92 = PRODUCT_CONTEXT('',#2,'mechanical'); 125 | #93 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design'); 126 | #94 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#95), 127 | #104); 128 | #95 = GEOMETRIC_CURVE_SET('',(#96)); 129 | #96 = TRIMMED_CURVE('',#97,(#102,PARAMETER_VALUE(0.)),(#103, 130 | PARAMETER_VALUE(1.)),.T.,.PARAMETER.); 131 | #97 = B_SPLINE_CURVE_WITH_KNOTS('',3,(#98,#99,#100,#101),.UNSPECIFIED., 132 | .F.,.F.,(4,4),(0.,1.),.PIECEWISE_BEZIER_KNOTS.); 133 | #98 = CARTESIAN_POINT('',(187.51020833333,-75.009375,0.)); 134 | #99 = CARTESIAN_POINT('',(187.51020833333,-37.51791666666,0.)); 135 | #100 = CARTESIAN_POINT('',(262.51958333333,-37.51791666666,0.)); 136 | #101 = CARTESIAN_POINT('',(262.51958333333,-75.009375,0.)); 137 | #102 = CARTESIAN_POINT('',(187.51020833333,-75.009375,0.)); 138 | #103 = CARTESIAN_POINT('',(262.51958333333,-75.009375,0.)); 139 | #104 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3) 140 | GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#108)) GLOBAL_UNIT_ASSIGNED_CONTEXT 141 | ((#105,#106,#107)) REPRESENTATION_CONTEXT('Context #1', 142 | '3D Context with UNIT and UNCERTAINTY') ); 143 | #105 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); 144 | #106 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); 145 | #107 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); 146 | #108 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#105, 147 | 'distance_accuracy_value','confusion accuracy'); 148 | #109 = CONTEXT_DEPENDENT_SHAPE_REPRESENTATION(#110,#112); 149 | #110 = ( REPRESENTATION_RELATIONSHIP('','',#94,#10) 150 | REPRESENTATION_RELATIONSHIP_WITH_TRANSFORMATION(#111) 151 | SHAPE_REPRESENTATION_RELATIONSHIP() ); 152 | #111 = ITEM_DEFINED_TRANSFORMATION('','',#11,#23); 153 | #112 = PRODUCT_DEFINITION_SHAPE('Placement','Placement of an item',#113 154 | ); 155 | #113 = NEXT_ASSEMBLY_USAGE_OCCURRENCE('3','Path001','',#5,#89,$); 156 | #114 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#91)); 157 | #115 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#116) 158 | ,#50); 159 | #116 = STYLED_ITEM('color',(#117),#41); 160 | #117 = PRESENTATION_STYLE_ASSIGNMENT((#118,#124)); 161 | #118 = SURFACE_STYLE_USAGE(.BOTH.,#119); 162 | #119 = SURFACE_SIDE_STYLE('',(#120)); 163 | #120 = SURFACE_STYLE_FILL_AREA(#121); 164 | #121 = FILL_AREA_STYLE('',(#122)); 165 | #122 = FILL_AREA_STYLE_COLOUR('',#123); 166 | #123 = COLOUR_RGB('',0.800000010877,0.800000010877,0.800000010877); 167 | #124 = CURVE_STYLE('',#125,POSITIVE_LENGTH_MEASURE(0.1),#126); 168 | #125 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); 169 | #126 = COLOUR_RGB('',9.803921802644E-02,9.803921802644E-02, 170 | 9.803921802644E-02); 171 | #127 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#128) 172 | ,#76); 173 | #128 = STYLED_ITEM('color',(#129),#69); 174 | #129 = PRESENTATION_STYLE_ASSIGNMENT((#130,#135)); 175 | #130 = SURFACE_STYLE_USAGE(.BOTH.,#131); 176 | #131 = SURFACE_SIDE_STYLE('',(#132)); 177 | #132 = SURFACE_STYLE_FILL_AREA(#133); 178 | #133 = FILL_AREA_STYLE('',(#134)); 179 | #134 = FILL_AREA_STYLE_COLOUR('',#123); 180 | #135 = CURVE_STYLE('',#136,POSITIVE_LENGTH_MEASURE(0.1),#126); 181 | #136 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); 182 | #137 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#138) 183 | ,#104); 184 | #138 = STYLED_ITEM('color',(#139),#95); 185 | #139 = PRESENTATION_STYLE_ASSIGNMENT((#140,#145)); 186 | #140 = SURFACE_STYLE_USAGE(.BOTH.,#141); 187 | #141 = SURFACE_SIDE_STYLE('',(#142)); 188 | #142 = SURFACE_STYLE_FILL_AREA(#143); 189 | #143 = FILL_AREA_STYLE('',(#144)); 190 | #144 = FILL_AREA_STYLE_COLOUR('',#123); 191 | #145 = CURVE_STYLE('',#146,POSITIVE_LENGTH_MEASURE(0.1),#126); 192 | #146 = DRAUGHTING_PRE_DEFINED_CURVE_FONT('continuous'); 193 | ENDSEC; 194 | END-ISO-10303-21; 195 | -------------------------------------------------------------------------------- /src/svg2stp.js: -------------------------------------------------------------------------------- 1 | export { generateStepFile, createStepFromSVGPathItems }; 2 | import { createSVGPathString, calculateProjectedVertex } from "./item-SVGPath.js"; 3 | 4 | const cc_msg = "\u001b[33msvg2stp.js : "; // yellow for console.log 5 | const cc_reset = "\u001b[0m"; // reset color 6 | 7 | /////////////////////////////////////////////////////////////////////////////// 8 | // main 9 | /////////////////////////////////////////////////////////////////////////////// 10 | 11 | function createStepFromSVGPathItems(svgPathItems) { 12 | //1. convert path string to spline dat 13 | const bezierPathItems = []; 14 | svgPathItems.forEach((pathItem) => { 15 | const bezierPathItem = convertSVGPathItemsToBezierPathItems(pathItem); 16 | console.log(`${cc_msg}bezierPathItem :${cc_reset}`, bezierPathItem); 17 | bezierPathItems.push(bezierPathItem); 18 | }); 19 | console.log(`${cc_msg}bezierPathItems :${cc_reset}`, bezierPathItems); 20 | //2. convert spline data to bezier data (control points) 21 | // multipy transform and magnification here. 22 | const data = []; 23 | bezierPathItems.forEach((bezierPathItem) => { 24 | data.push( 25 | convertToBezierCurvesData(bezierPathItem.bezierPathArray3D, bezierPathItem.transformation) 26 | ); 27 | }); 28 | console.log(`${cc_msg}data :${cc_reset}`, data); 29 | const mergedData = processControlPointsData(data); 30 | console.log(`${cc_msg}mergedData :${cc_reset}`, mergedData); 31 | //3. generate step file 32 | const step = generateStepFile(mergedData); 33 | console.log(`${cc_msg}step :${cc_reset}`, step); 34 | return step; 35 | } 36 | 37 | /////////////////////////////////////////////////////////////////////////////// 38 | // SVGpathItems -> BezierPathItems functions 39 | /////////////////////////////////////////////////////////////////////////////// 40 | function convertSVGPathItemsToBezierPathItems(pathItem) { 41 | console.log(`${cc_msg}imported SVGPathItem is :${cc_reset}`, pathItem); 42 | 43 | let data = { bezierPathArray3D: [] }; 44 | pathItem.pathArray3D.forEach((node, index) => { 45 | let command = node.command; 46 | let x = node.point.x; 47 | let y = node.point.y; 48 | let z = node.point.z; 49 | let endCommand = node.endCommand; 50 | 51 | let onCurve = command !== "C"; 52 | if (index > 0) { 53 | if (pathItem.pathArray3D[index - 1].command === "C") { 54 | onCurve = false; 55 | } 56 | } 57 | let isM = command === "M"; 58 | let isZ = endCommand === "Z"; 59 | 60 | data.bezierPathArray3D.push({ 61 | point: { x: x, y: y, z: z }, 62 | onCurve: onCurve, 63 | M: isM, 64 | Z: isZ, 65 | }); 66 | }); 67 | data.transformation = pathItem.transformation; 68 | data.style = pathItem.style; 69 | return data; 70 | } 71 | /////////////////////////////////////////////////////////////////////////////// 72 | // Spline -> Bezier 73 | /////////////////////////////////////////////////////////////////////////////// 74 | function convertToBezierCurvesData(bezierPathArray3D, transformation) { 75 | console.log(`${cc_msg}imported bezierPathArray3D${cc_reset}`, bezierPathArray3D); 76 | let bezierCurves = []; 77 | let currentCurve = []; 78 | let startIndex = 0; 79 | 80 | bezierPathArray3D.forEach((node, index) => { 81 | const calcedP = calculateProjectedVertex(node.point, transformation); 82 | calcedP.y = -calcedP.y; 83 | 84 | if (node.M) { 85 | startIndex = index; 86 | } 87 | if (node.onCurve) { 88 | if (currentCurve.length > 0) { 89 | currentCurve.push([calcedP.x, calcedP.y, calcedP.z]); 90 | bezierCurves.push({ controlPoints: currentCurve }); 91 | } 92 | currentCurve = [[calcedP.x, calcedP.y, calcedP.z]]; 93 | } else { 94 | console.log(`${cc_msg}check1${cc_reset}`, node.point); 95 | console.log(`${cc_msg}check2${cc_reset}`, bezierPathArray3D[index - 1].point); 96 | if ( 97 | // if curve control point is same as the previous point ignore 98 | // maybe shift it a litte bit is better. 99 | (node.point.x == bezierPathArray3D[index - 1].point.x && 100 | node.point.y == bezierPathArray3D[index - 1].point.y && 101 | node.point.z == bezierPathArray3D[index - 1].point.z) || 102 | (node.point.x == bezierPathArray3D[index + 1].point.x && 103 | node.point.y == bezierPathArray3D[index + 1].point.y && 104 | node.point.z == bezierPathArray3D[index + 1].point.z) 105 | ) { 106 | calcedP.x += 0.00001; 107 | calcedP.y += 0.00001; 108 | calcedP.z += 0.00001; 109 | console.log(`${cc_msg}point ignored${cc_reset}`); 110 | //console.log("shifted"); 111 | //currentCurve.push([calcedP.x, calcedP.y, calcedP.z]); 112 | } else { 113 | currentCurve.push([calcedP.x, calcedP.y, calcedP.z]); 114 | } 115 | if (index === bezierPathArray3D.length - 1) { 116 | bezierCurves.push({ controlPoints: currentCurve }); 117 | } 118 | } 119 | if (node.Z) { 120 | if ( 121 | node.point.x == bezierPathArray3D[startIndex].point.x && 122 | node.point.y == bezierPathArray3D[startIndex].point.y && 123 | node.point.z == bezierPathArray3D[startIndex].point.z 124 | ) { 125 | console.log(`${cc_msg}start point and end point are same${cc_reset}`); 126 | } else { 127 | const calcedStartP = calculateProjectedVertex( 128 | bezierPathArray3D[startIndex].point, 129 | transformation 130 | ); 131 | bezierCurves.push({ 132 | controlPoints: [ 133 | [calcedP.x, calcedP.y, calcedP.z], 134 | [calcedStartP.x, -calcedStartP.y, calcedStartP.z], 135 | ], 136 | }); 137 | } 138 | currentCurve = []; 139 | } 140 | }); 141 | console.log(`${cc_msg}bezierCurves :${cc_reset}`, bezierCurves); 142 | return bezierCurves; 143 | } 144 | function processControlPointsData(data) { 145 | let result = []; 146 | data.forEach((item) => { 147 | result = result.concat(item); 148 | }); 149 | return result; 150 | } 151 | 152 | /////////////////////////////////////////////////////////////////////////////// 153 | // generateStepFile 154 | /////////////////////////////////////////////////////////////////////////////// 155 | 156 | function generateStepFile(bezierCurves) { 157 | const modelDescription = "svg2stp model"; // FreeCAD Model 158 | const shapeModelName = "svg2stp model for Plasticity"; // Open CASCADE Shape Model 159 | const stepProcessorName = "svg2stp 1.0"; // Open CASCADE STEP processor 7.6 160 | const authoringTool = "https://dev.cog.ooo/svg2stp/"; 161 | const date = new Date().toISOString().replace("Z", "").split(".")[0]; 162 | const header = `ISO-10303-21;\nHEADER;\nFILE_DESCRIPTION(('${modelDescription}'),'2;1');\nFILE_NAME('${shapeModelName}','${date}',('Author'),(''),'${stepProcessorName}','${authoringTool}','Unknown');\nFILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));\nENDSEC;\nDATA;`; 163 | const footer = "ENDSEC;\nEND-ISO-10303-21;"; 164 | let pointDefinitions = ""; 165 | let bezierDefinitions = ""; 166 | let trimmedCurveDefinitions = ""; 167 | let trimmedCurveReferences = []; 168 | let bezierNumber = 27; 169 | let trimmedCurveNumber = 26; 170 | bezierCurves.forEach((curve, curveIndex) => { 171 | let pointReferences = []; 172 | let pointNumber = 20 + curveIndex * 10; 173 | curve.controlPoints.forEach((point, pointIndex) => { 174 | const [x, y, z] = point; 175 | pointDefinitions += `#${pointNumber} = CARTESIAN_POINT('', (${x}, ${y}, ${z}));\n`; 176 | pointReferences.push(`#${pointNumber}`); 177 | pointNumber++; 178 | }); 179 | const degree = curve.controlPoints.length - 1; 180 | const knotsMultiplicity = `${degree + 1}, ${degree + 1}`; 181 | bezierDefinitions += `#${bezierNumber} = B_SPLINE_CURVE_WITH_KNOTS('', ${degree}, (${pointReferences.join( 182 | ", " 183 | )}), .UNSPECIFIED., .F., .F., (${knotsMultiplicity}), (0., 1.), .PIECEWISE_BEZIER_KNOTS.);\n`; 184 | trimmedCurveDefinitions += `#${trimmedCurveNumber} = TRIMMED_CURVE('', #${bezierNumber}, (##${pointReferences[0].substring( 185 | 1 186 | )}, PARAMETER_VALUE(0.)), (##${pointReferences[pointReferences.length - 1].substring( 187 | 1 188 | )}, PARAMETER_VALUE(1.)), .T., .PARAMETER.);\n`; 189 | trimmedCurveReferences.push(`#${trimmedCurveNumber}`); 190 | bezierNumber += 100; 191 | trimmedCurveNumber += 100; 192 | }); 193 | const shapeRepresentation = `#10 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#15),(${trimmedCurveReferences.join( 194 | ", " 195 | )}));\n#15 = GEOMETRIC_CURVE_SET('',(${trimmedCurveReferences.join(", ")}));`; 196 | 197 | return `${header}\n${pointDefinitions}${bezierDefinitions}${trimmedCurveDefinitions}\n${shapeRepresentation}\n${footer}`; 198 | } 199 | 200 | /////////////////////////////////////////////////////////////////////////////// 201 | // pathItems -> String -> Spline functions 202 | /////////////////////////////////////////////////////////////////////////////// 203 | 204 | function convertSVGPathItemsToString(svgPathItems) { 205 | let result = []; 206 | svgPathItems.forEach((pathItem) => { 207 | let str = ""; 208 | console.log(`${cc_msg}pathItem :${cc_reset}`, pathItem); 209 | pathItem.pathArray3D.forEach((node) => { 210 | str = createSVGPathString( 211 | str, 212 | node.point.x, 213 | node.point.y, 214 | node.point.z, 215 | node.command, 216 | node.endCommand 217 | ); 218 | }); 219 | result.push(str); 220 | }); 221 | return result; 222 | } 223 | 224 | function convertSVGPathStringToSpline(pathString) { 225 | const commands = pathString.match(/[A-Za-z]/g); 226 | const points = pathString.match(/-?\d+(\.\d+)?/g); 227 | 228 | let data = { controlPoints: [] }; 229 | let pointIndex = 0; 230 | let newSubpath = false; 231 | 232 | for (const command of commands) { 233 | let onCurve = command !== "C"; 234 | let isM = command === "M"; 235 | let isZ = command === "Z"; 236 | 237 | let pointsPerCommand; 238 | if (command === "M" || command === "L" || command === "Z") { 239 | pointsPerCommand = 1; 240 | } else if (command === "C") { 241 | pointsPerCommand = 3; 242 | } else { 243 | continue; 244 | } 245 | 246 | if (isZ) { 247 | data.controlPoints[data.controlPoints.length - 1].Z = true; 248 | newSubpath = true; 249 | continue; 250 | } 251 | 252 | for (let i = 0; i < pointsPerCommand && pointIndex < points.length; i++) { 253 | const x = parseFloat(points[pointIndex++]); 254 | const y = parseFloat(points[pointIndex++]); 255 | const z = 0.0; 256 | 257 | if (command === "C" && i === pointsPerCommand - 1) { 258 | onCurve = true; 259 | } 260 | 261 | data.controlPoints.push({ x, y, z, onCurve: onCurve, M: isM || newSubpath, Z: isZ }); 262 | 263 | if (command === "C") { 264 | onCurve = false; 265 | } 266 | 267 | if (isM || newSubpath) { 268 | newSubpath = false; 269 | } 270 | } 271 | } 272 | // Check if the path ends with a Z command and set the Z flag for the last point 273 | if (commands[commands.length - 1] === "Z") { 274 | data.controlPoints[data.controlPoints.length - 1].Z = true; 275 | } 276 | return data; 277 | } 278 | -------------------------------------------------------------------------------- /test/test2.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | FILE_DESCRIPTION(('svg2stp model'),'2;1'); 4 | FILE_NAME('svg2stp model for Plasticity','2023-05-17T15:39:14',('Author'),(''),'svg2stp 1.0','https://dev.cog.ooo/svg2stp/','Unknown'); 5 | FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 6 | ENDSEC; 7 | DATA; 8 | #20 = CARTESIAN_POINT('', (-12.82, -57.83, 0)); 9 | #21 = CARTESIAN_POINT('', (2.31, -63, 0)); 10 | #30 = CARTESIAN_POINT('', (2.31, -63, 0)); 11 | #31 = CARTESIAN_POINT('', (2.31, -39.58, 0)); 12 | #40 = CARTESIAN_POINT('', (2.31, -39.58, 0)); 13 | #41 = CARTESIAN_POINT('', (28.32, -39.58, 0)); 14 | #50 = CARTESIAN_POINT('', (28.32, -39.58, 0)); 15 | #51 = CARTESIAN_POINT('', (28.32, -27.58, 0)); 16 | #60 = CARTESIAN_POINT('', (28.32, -27.58, 0)); 17 | #61 = CARTESIAN_POINT('', (2.31, -27.58, 0)); 18 | #70 = CARTESIAN_POINT('', (2.31, -27.58, 0)); 19 | #71 = CARTESIAN_POINT('', (2.31, 30.54, 0)); 20 | #80 = CARTESIAN_POINT('', (2.31, 30.54, 0)); 21 | #81 = CARTESIAN_POINT('', (2.31, 43.27, 0)); 22 | #82 = CARTESIAN_POINT('', (6.18, 50.28, 0)); 23 | #83 = CARTESIAN_POINT('', (15.96, 50.28, 0)); 24 | #90 = CARTESIAN_POINT('', (15.96, 50.28, 0)); 25 | #91 = CARTESIAN_POINT('', (20.57, 50.28, 0)); 26 | #92 = CARTESIAN_POINT('', (23.71, 49.73, 0)); 27 | #93 = CARTESIAN_POINT('', (26.29, 48.79, 0)); 28 | #100 = CARTESIAN_POINT('', (26.29, 48.79, 0)); 29 | #101 = CARTESIAN_POINT('', (27.21, 60.61, 0)); 30 | #110 = CARTESIAN_POINT('', (27.21, 60.61, 0)); 31 | #111 = CARTESIAN_POINT('', (23.89, 62.09, 0)); 32 | #112 = CARTESIAN_POINT('', (18.72, 63.01, 0)); 33 | #113 = CARTESIAN_POINT('', (12.27, 63.01, 0)); 34 | #120 = CARTESIAN_POINT('', (12.27, 63.01, 0)); 35 | #121 = CARTESIAN_POINT('', (-12.08, 63.01, 0)); 36 | #122 = CARTESIAN_POINT('', (-12.82, 40.87, 0)); 37 | #123 = CARTESIAN_POINT('', (-12.82, 30.17, 0)); 38 | #130 = CARTESIAN_POINT('', (-12.82, 30.17, 0)); 39 | #131 = CARTESIAN_POINT('', (-12.82, -27.58, 0)); 40 | #140 = CARTESIAN_POINT('', (-12.82, -27.58, 0)); 41 | #141 = CARTESIAN_POINT('', (-28.32, -27.58, 0)); 42 | #150 = CARTESIAN_POINT('', (-28.32, -27.58, 0)); 43 | #151 = CARTESIAN_POINT('', (-28.32, -39.58, 0)); 44 | #160 = CARTESIAN_POINT('', (-28.32, -39.58, 0)); 45 | #161 = CARTESIAN_POINT('', (-12.82, -39.58, 0)); 46 | #170 = CARTESIAN_POINT('', (-12.82, -39.58, 0)); 47 | #171 = CARTESIAN_POINT('', (-12.82, -57.83, 0)); 48 | #180 = CARTESIAN_POINT('', (36.53, 46.22, 0)); 49 | #181 = CARTESIAN_POINT('', (30.81, 48.99, 0)); 50 | #182 = CARTESIAN_POINT('', (20.29, 52.49, 0)); 51 | #183 = CARTESIAN_POINT('', (4.98, 52.49, 0)); 52 | #190 = CARTESIAN_POINT('', (4.98, 52.49, 0)); 53 | #191 = CARTESIAN_POINT('', (-24.35, 52.49, 0)); 54 | #192 = CARTESIAN_POINT('', (-41.88, 31.83, 0)); 55 | #193 = CARTESIAN_POINT('', (-41.88, 1.75, 0)); 56 | #200 = CARTESIAN_POINT('', (-41.88, 1.75, 0)); 57 | #201 = CARTESIAN_POINT('', (-41.88, -29.8, 0)); 58 | #202 = CARTESIAN_POINT('', (-24.17, -52.49, 0)); 59 | #203 = CARTESIAN_POINT('', (2.95, -52.49, 0)); 60 | #210 = CARTESIAN_POINT('', (2.95, -52.49, 0)); 61 | #211 = CARTESIAN_POINT('', (33.95, -52.49, 0)); 62 | #212 = CARTESIAN_POINT('', (41.88, -24.08, 0)); 63 | #213 = CARTESIAN_POINT('', (41.88, -6.55, 0)); 64 | #220 = CARTESIAN_POINT('', (41.88, -6.55, 0)); 65 | #221 = CARTESIAN_POINT('', (41.88, -3.04, 0)); 66 | #222 = CARTESIAN_POINT('', (41.7, -0.46, 0)); 67 | #223 = CARTESIAN_POINT('', (41.51, 1.94, 0)); 68 | #230 = CARTESIAN_POINT('', (41.51, 1.94, 0)); 69 | #231 = CARTESIAN_POINT('', (-26.94, 1.94, 0)); 70 | #240 = CARTESIAN_POINT('', (-26.94, 1.94, 0)); 71 | #241 = CARTESIAN_POINT('', (-26.76, 29.8, 0)); 72 | #242 = CARTESIAN_POINT('', (-10.89, 40.32, 0)); 73 | #243 = CARTESIAN_POINT('', (7.19, 40.32, 0)); 74 | #250 = CARTESIAN_POINT('', (7.19, 40.32, 0)); 75 | #251 = CARTESIAN_POINT('', (19.74, 40.32, 0)); 76 | #252 = CARTESIAN_POINT('', (27.3, 37.74, 0)); 77 | #253 = CARTESIAN_POINT('', (33.57, 35.15, 0)); 78 | #260 = CARTESIAN_POINT('', (33.57, 35.15, 0)); 79 | #261 = CARTESIAN_POINT('', (36.52, 46.22, 0)); 80 | #270 = CARTESIAN_POINT('', (36.52, 46.22, 0)); 81 | #271 = CARTESIAN_POINT('', (36.53, 46.22, 0)); 82 | #280 = CARTESIAN_POINT('', (26.75, -9.5, 0)); 83 | #281 = CARTESIAN_POINT('', (26.93, -23.15, 0)); 84 | #282 = CARTESIAN_POINT('', (21.22, -40.86, 0)); 85 | #283 = CARTESIAN_POINT('', (1.47, -40.86, 0)); 86 | #290 = CARTESIAN_POINT('', (1.47, -40.86, 0)); 87 | #291 = CARTESIAN_POINT('', (-16.98, -40.86, 0)); 88 | #292 = CARTESIAN_POINT('', (-25.1, -23.33, 0)); 89 | #293 = CARTESIAN_POINT('', (-26.57, -9.5, 0)); 90 | #300 = CARTESIAN_POINT('', (-26.57, -9.5, 0)); 91 | #301 = CARTESIAN_POINT('', (26.75, -9.5, 0)); 92 | #310 = CARTESIAN_POINT('', (23.25, -34.77, 0)); 93 | #311 = CARTESIAN_POINT('', (19.56, -37.17, 0)); 94 | #312 = CARTESIAN_POINT('', (12.72, -40.67, 0)); 95 | #313 = CARTESIAN_POINT('', (3.69, -40.67, 0)); 96 | #320 = CARTESIAN_POINT('', (3.69, -40.67, 0)); 97 | #321 = CARTESIAN_POINT('', (-7.38, -40.67, 0)); 98 | #322 = CARTESIAN_POINT('', (-13.28, -33.84, 0)); 99 | #323 = CARTESIAN_POINT('', (-13.28, -25.73, 0)); 100 | #330 = CARTESIAN_POINT('', (-13.28, -25.73, 0)); 101 | #331 = CARTESIAN_POINT('', (-13.28, -17.06, 0)); 102 | #332 = CARTESIAN_POINT('', (-7.56, -13, 0)); 103 | #333 = CARTESIAN_POINT('', (5.34, -7.47, 0)); 104 | #340 = CARTESIAN_POINT('', (5.34, -7.47, 0)); 105 | #341 = CARTESIAN_POINT('', (21.59, -0.83, 0)); 106 | #342 = CARTESIAN_POINT('', (31, 7.66, 0)); 107 | #343 = CARTESIAN_POINT('', (31, 22.79, 0)); 108 | #350 = CARTESIAN_POINT('', (31, 22.79, 0)); 109 | #351 = CARTESIAN_POINT('', (31, 40.69, 0)); 110 | #352 = CARTESIAN_POINT('', (17.35, 52.49, 0)); 111 | #353 = CARTESIAN_POINT('', (-4.62, 52.49, 0)); 112 | #360 = CARTESIAN_POINT('', (-4.62, 52.49, 0)); 113 | #361 = CARTESIAN_POINT('', (-14.58, 52.49, 0)); 114 | #362 = CARTESIAN_POINT('', (-24.18, 49.72, 0)); 115 | #363 = CARTESIAN_POINT('', (-31, 45.66, 0)); 116 | #370 = CARTESIAN_POINT('', (-31, 45.66, 0)); 117 | #371 = CARTESIAN_POINT('', (-26.75, 33.85, 0)); 118 | #380 = CARTESIAN_POINT('', (-26.75, 33.85, 0)); 119 | #381 = CARTESIAN_POINT('', (-21.4, 36.99, 0)); 120 | #382 = CARTESIAN_POINT('', (-12.73, 40.68, 0)); 121 | #383 = CARTESIAN_POINT('', (-4.06, 40.68, 0)); 122 | #390 = CARTESIAN_POINT('', (-4.06, 40.68, 0)); 123 | #391 = CARTESIAN_POINT('', (9.41, 40.68, 0)); 124 | #392 = CARTESIAN_POINT('', (16.05, 33.48, 0)); 125 | #393 = CARTESIAN_POINT('', (16.05, 24.44, 0)); 126 | #400 = CARTESIAN_POINT('', (16.05, 24.44, 0)); 127 | #401 = CARTESIAN_POINT('', (16.05, 15.4, 0)); 128 | #402 = CARTESIAN_POINT('', (10.7, 9.86, 0)); 129 | #403 = CARTESIAN_POINT('', (-2.58, 4.51, 0)); 130 | #410 = CARTESIAN_POINT('', (-2.58, 4.51, 0)); 131 | #411 = CARTESIAN_POINT('', (-19.55, -2.32, 0)); 132 | #412 = CARTESIAN_POINT('', (-28.22, -11.73, 0)); 133 | #413 = CARTESIAN_POINT('', (-28.22, -23.9, 0)); 134 | #420 = CARTESIAN_POINT('', (-28.22, -23.9, 0)); 135 | #421 = CARTESIAN_POINT('', (-28.22, -39.58, 0)); 136 | #422 = CARTESIAN_POINT('', (-15.67, -52.5, 0)); 137 | #423 = CARTESIAN_POINT('', (4.62, -52.5, 0)); 138 | #430 = CARTESIAN_POINT('', (4.62, -52.5, 0)); 139 | #431 = CARTESIAN_POINT('', (14.21, -52.5, 0)); 140 | #432 = CARTESIAN_POINT('', (22.33, -49.73, 0)); 141 | #433 = CARTESIAN_POINT('', (27.68, -46.41, 0)); 142 | #440 = CARTESIAN_POINT('', (27.68, -46.41, 0)); 143 | #441 = CARTESIAN_POINT('', (23.25, -34.79, 0)); 144 | #450 = CARTESIAN_POINT('', (23.25, -34.79, 0)); 145 | #451 = CARTESIAN_POINT('', (23.25, -34.77, 0)); 146 | #460 = CARTESIAN_POINT('', (-12.82, -57.83, 0)); 147 | #461 = CARTESIAN_POINT('', (2.31, -63, 0)); 148 | #470 = CARTESIAN_POINT('', (2.31, -63, 0)); 149 | #471 = CARTESIAN_POINT('', (2.31, -39.58, 0)); 150 | #480 = CARTESIAN_POINT('', (2.31, -39.58, 0)); 151 | #481 = CARTESIAN_POINT('', (28.32, -39.58, 0)); 152 | #490 = CARTESIAN_POINT('', (28.32, -39.58, 0)); 153 | #491 = CARTESIAN_POINT('', (28.32, -27.58, 0)); 154 | #500 = CARTESIAN_POINT('', (28.32, -27.58, 0)); 155 | #501 = CARTESIAN_POINT('', (2.31, -27.58, 0)); 156 | #510 = CARTESIAN_POINT('', (2.31, -27.58, 0)); 157 | #511 = CARTESIAN_POINT('', (2.31, 30.54, 0)); 158 | #520 = CARTESIAN_POINT('', (2.31, 30.54, 0)); 159 | #521 = CARTESIAN_POINT('', (2.31, 43.27, 0)); 160 | #522 = CARTESIAN_POINT('', (6.18, 50.28, 0)); 161 | #523 = CARTESIAN_POINT('', (15.96, 50.28, 0)); 162 | #530 = CARTESIAN_POINT('', (15.96, 50.28, 0)); 163 | #531 = CARTESIAN_POINT('', (20.57, 50.28, 0)); 164 | #532 = CARTESIAN_POINT('', (23.71, 49.73, 0)); 165 | #533 = CARTESIAN_POINT('', (26.29, 48.79, 0)); 166 | #540 = CARTESIAN_POINT('', (26.29, 48.79, 0)); 167 | #541 = CARTESIAN_POINT('', (27.21, 60.61, 0)); 168 | #550 = CARTESIAN_POINT('', (27.21, 60.61, 0)); 169 | #551 = CARTESIAN_POINT('', (23.89, 62.09, 0)); 170 | #552 = CARTESIAN_POINT('', (18.72, 63.01, 0)); 171 | #553 = CARTESIAN_POINT('', (12.27, 63.01, 0)); 172 | #560 = CARTESIAN_POINT('', (12.27, 63.01, 0)); 173 | #561 = CARTESIAN_POINT('', (-12.08, 63.01, 0)); 174 | #562 = CARTESIAN_POINT('', (-12.82, 40.87, 0)); 175 | #563 = CARTESIAN_POINT('', (-12.82, 30.17, 0)); 176 | #570 = CARTESIAN_POINT('', (-12.82, 30.17, 0)); 177 | #571 = CARTESIAN_POINT('', (-12.82, -27.58, 0)); 178 | #580 = CARTESIAN_POINT('', (-12.82, -27.58, 0)); 179 | #581 = CARTESIAN_POINT('', (-28.32, -27.58, 0)); 180 | #590 = CARTESIAN_POINT('', (-28.32, -27.58, 0)); 181 | #591 = CARTESIAN_POINT('', (-28.32, -39.58, 0)); 182 | #600 = CARTESIAN_POINT('', (-28.32, -39.58, 0)); 183 | #601 = CARTESIAN_POINT('', (-12.82, -39.58, 0)); 184 | #610 = CARTESIAN_POINT('', (-12.82, -39.58, 0)); 185 | #611 = CARTESIAN_POINT('', (-12.82, -57.83, 0)); 186 | #27 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#20, #21), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 187 | #127 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#30, #31), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 188 | #227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#40, #41), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 189 | #327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#50, #51), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 190 | #427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#60, #61), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 191 | #527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#70, #71), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 192 | #627 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#80, #81, #82, #83), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 193 | #727 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#90, #91, #92, #93), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 194 | #827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#100, #101), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 195 | #927 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#110, #111, #112, #113), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 196 | #1027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#120, #121, #122, #123), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 197 | #1127 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#130, #131), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 198 | #1227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#140, #141), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 199 | #1327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#150, #151), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 200 | #1427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#160, #161), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 201 | #1527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#170, #171), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 202 | #1627 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#180, #181, #182, #183), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 203 | #1727 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#190, #191, #192, #193), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 204 | #1827 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#200, #201, #202, #203), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 205 | #1927 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#210, #211, #212, #213), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 206 | #2027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#220, #221, #222, #223), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 207 | #2127 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#230, #231), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 208 | #2227 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#240, #241, #242, #243), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 209 | #2327 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#250, #251, #252, #253), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 210 | #2427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#260, #261), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 211 | #2527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#270, #271), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 212 | #2627 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#280, #281, #282, #283), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 213 | #2727 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#290, #291, #292, #293), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 214 | #2827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#300, #301), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 215 | #2927 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#310, #311, #312, #313), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 216 | #3027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#320, #321, #322, #323), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 217 | #3127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#330, #331, #332, #333), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 218 | #3227 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#340, #341, #342, #343), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 219 | #3327 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#350, #351, #352, #353), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 220 | #3427 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#360, #361, #362, #363), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 221 | #3527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#370, #371), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 222 | #3627 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#380, #381, #382, #383), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 223 | #3727 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#390, #391, #392, #393), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 224 | #3827 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#400, #401, #402, #403), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 225 | #3927 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#410, #411, #412, #413), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 226 | #4027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#420, #421, #422, #423), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 227 | #4127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#430, #431, #432, #433), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 228 | #4227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#440, #441), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 229 | #4327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#450, #451), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 230 | #4427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#460, #461), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 231 | #4527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#470, #471), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 232 | #4627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#480, #481), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 233 | #4727 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#490, #491), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 234 | #4827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#500, #501), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 235 | #4927 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#510, #511), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 236 | #5027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#520, #521, #522, #523), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 237 | #5127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#530, #531, #532, #533), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 238 | #5227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#540, #541), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 239 | #5327 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#550, #551, #552, #553), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 240 | #5427 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#560, #561, #562, #563), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 241 | #5527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#570, #571), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 242 | #5627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#580, #581), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 243 | #5727 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#590, #591), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 244 | #5827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#600, #601), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 245 | #5927 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#610, #611), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 246 | #26 = TRIMMED_CURVE('', #27, (##20, PARAMETER_VALUE(0.)), (##21, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 247 | #126 = TRIMMED_CURVE('', #127, (##30, PARAMETER_VALUE(0.)), (##31, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 248 | #226 = TRIMMED_CURVE('', #227, (##40, PARAMETER_VALUE(0.)), (##41, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 249 | #326 = TRIMMED_CURVE('', #327, (##50, PARAMETER_VALUE(0.)), (##51, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 250 | #426 = TRIMMED_CURVE('', #427, (##60, PARAMETER_VALUE(0.)), (##61, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 251 | #526 = TRIMMED_CURVE('', #527, (##70, PARAMETER_VALUE(0.)), (##71, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 252 | #626 = TRIMMED_CURVE('', #627, (##80, PARAMETER_VALUE(0.)), (##83, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 253 | #726 = TRIMMED_CURVE('', #727, (##90, PARAMETER_VALUE(0.)), (##93, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 254 | #826 = TRIMMED_CURVE('', #827, (##100, PARAMETER_VALUE(0.)), (##101, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 255 | #926 = TRIMMED_CURVE('', #927, (##110, PARAMETER_VALUE(0.)), (##113, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 256 | #1026 = TRIMMED_CURVE('', #1027, (##120, PARAMETER_VALUE(0.)), (##123, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 257 | #1126 = TRIMMED_CURVE('', #1127, (##130, PARAMETER_VALUE(0.)), (##131, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 258 | #1226 = TRIMMED_CURVE('', #1227, (##140, PARAMETER_VALUE(0.)), (##141, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 259 | #1326 = TRIMMED_CURVE('', #1327, (##150, PARAMETER_VALUE(0.)), (##151, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 260 | #1426 = TRIMMED_CURVE('', #1427, (##160, PARAMETER_VALUE(0.)), (##161, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 261 | #1526 = TRIMMED_CURVE('', #1527, (##170, PARAMETER_VALUE(0.)), (##171, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 262 | #1626 = TRIMMED_CURVE('', #1627, (##180, PARAMETER_VALUE(0.)), (##183, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 263 | #1726 = TRIMMED_CURVE('', #1727, (##190, PARAMETER_VALUE(0.)), (##193, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 264 | #1826 = TRIMMED_CURVE('', #1827, (##200, PARAMETER_VALUE(0.)), (##203, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 265 | #1926 = TRIMMED_CURVE('', #1927, (##210, PARAMETER_VALUE(0.)), (##213, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 266 | #2026 = TRIMMED_CURVE('', #2027, (##220, PARAMETER_VALUE(0.)), (##223, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 267 | #2126 = TRIMMED_CURVE('', #2127, (##230, PARAMETER_VALUE(0.)), (##231, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 268 | #2226 = TRIMMED_CURVE('', #2227, (##240, PARAMETER_VALUE(0.)), (##243, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 269 | #2326 = TRIMMED_CURVE('', #2327, (##250, PARAMETER_VALUE(0.)), (##253, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 270 | #2426 = TRIMMED_CURVE('', #2427, (##260, PARAMETER_VALUE(0.)), (##261, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 271 | #2526 = TRIMMED_CURVE('', #2527, (##270, PARAMETER_VALUE(0.)), (##271, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 272 | #2626 = TRIMMED_CURVE('', #2627, (##280, PARAMETER_VALUE(0.)), (##283, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 273 | #2726 = TRIMMED_CURVE('', #2727, (##290, PARAMETER_VALUE(0.)), (##293, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 274 | #2826 = TRIMMED_CURVE('', #2827, (##300, PARAMETER_VALUE(0.)), (##301, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 275 | #2926 = TRIMMED_CURVE('', #2927, (##310, PARAMETER_VALUE(0.)), (##313, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 276 | #3026 = TRIMMED_CURVE('', #3027, (##320, PARAMETER_VALUE(0.)), (##323, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 277 | #3126 = TRIMMED_CURVE('', #3127, (##330, PARAMETER_VALUE(0.)), (##333, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 278 | #3226 = TRIMMED_CURVE('', #3227, (##340, PARAMETER_VALUE(0.)), (##343, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 279 | #3326 = TRIMMED_CURVE('', #3327, (##350, PARAMETER_VALUE(0.)), (##353, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 280 | #3426 = TRIMMED_CURVE('', #3427, (##360, PARAMETER_VALUE(0.)), (##363, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 281 | #3526 = TRIMMED_CURVE('', #3527, (##370, PARAMETER_VALUE(0.)), (##371, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 282 | #3626 = TRIMMED_CURVE('', #3627, (##380, PARAMETER_VALUE(0.)), (##383, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 283 | #3726 = TRIMMED_CURVE('', #3727, (##390, PARAMETER_VALUE(0.)), (##393, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 284 | #3826 = TRIMMED_CURVE('', #3827, (##400, PARAMETER_VALUE(0.)), (##403, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 285 | #3926 = TRIMMED_CURVE('', #3927, (##410, PARAMETER_VALUE(0.)), (##413, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 286 | #4026 = TRIMMED_CURVE('', #4027, (##420, PARAMETER_VALUE(0.)), (##423, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 287 | #4126 = TRIMMED_CURVE('', #4127, (##430, PARAMETER_VALUE(0.)), (##433, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 288 | #4226 = TRIMMED_CURVE('', #4227, (##440, PARAMETER_VALUE(0.)), (##441, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 289 | #4326 = TRIMMED_CURVE('', #4327, (##450, PARAMETER_VALUE(0.)), (##451, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 290 | #4426 = TRIMMED_CURVE('', #4427, (##460, PARAMETER_VALUE(0.)), (##461, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 291 | #4526 = TRIMMED_CURVE('', #4527, (##470, PARAMETER_VALUE(0.)), (##471, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 292 | #4626 = TRIMMED_CURVE('', #4627, (##480, PARAMETER_VALUE(0.)), (##481, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 293 | #4726 = TRIMMED_CURVE('', #4727, (##490, PARAMETER_VALUE(0.)), (##491, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 294 | #4826 = TRIMMED_CURVE('', #4827, (##500, PARAMETER_VALUE(0.)), (##501, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 295 | #4926 = TRIMMED_CURVE('', #4927, (##510, PARAMETER_VALUE(0.)), (##511, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 296 | #5026 = TRIMMED_CURVE('', #5027, (##520, PARAMETER_VALUE(0.)), (##523, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 297 | #5126 = TRIMMED_CURVE('', #5127, (##530, PARAMETER_VALUE(0.)), (##533, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 298 | #5226 = TRIMMED_CURVE('', #5227, (##540, PARAMETER_VALUE(0.)), (##541, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 299 | #5326 = TRIMMED_CURVE('', #5327, (##550, PARAMETER_VALUE(0.)), (##553, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 300 | #5426 = TRIMMED_CURVE('', #5427, (##560, PARAMETER_VALUE(0.)), (##563, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 301 | #5526 = TRIMMED_CURVE('', #5527, (##570, PARAMETER_VALUE(0.)), (##571, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 302 | #5626 = TRIMMED_CURVE('', #5627, (##580, PARAMETER_VALUE(0.)), (##581, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 303 | #5726 = TRIMMED_CURVE('', #5727, (##590, PARAMETER_VALUE(0.)), (##591, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 304 | #5826 = TRIMMED_CURVE('', #5827, (##600, PARAMETER_VALUE(0.)), (##601, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 305 | #5926 = TRIMMED_CURVE('', #5927, (##610, PARAMETER_VALUE(0.)), (##611, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 306 | 307 | #10 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#15),(#26, #126, #226, #326, #426, #526, #626, #726, #826, #926, #1026, #1126, #1226, #1326, #1426, #1526, #1626, #1726, #1826, #1926, #2026, #2126, #2226, #2326, #2426, #2526, #2626, #2726, #2826, #2926, #3026, #3126, #3226, #3326, #3426, #3526, #3626, #3726, #3826, #3926, #4026, #4126, #4226, #4326, #4426, #4526, #4626, #4726, #4826, #4926, #5026, #5126, #5226, #5326, #5426, #5526, #5626, #5726, #5826, #5926)); 308 | #15 = GEOMETRIC_CURVE_SET('',(#26, #126, #226, #326, #426, #526, #626, #726, #826, #926, #1026, #1126, #1226, #1326, #1426, #1526, #1626, #1726, #1826, #1926, #2026, #2126, #2226, #2326, #2426, #2526, #2626, #2726, #2826, #2926, #3026, #3126, #3226, #3326, #3426, #3526, #3626, #3726, #3826, #3926, #4026, #4126, #4226, #4326, #4426, #4526, #4626, #4726, #4826, #4926, #5026, #5126, #5226, #5326, #5426, #5526, #5626, #5726, #5826, #5926)); 309 | ENDSEC; 310 | END-ISO-10303-21; -------------------------------------------------------------------------------- /test/test.step: -------------------------------------------------------------------------------- 1 | ISO-10303-21; 2 | HEADER; 3 | FILE_DESCRIPTION(('svg2stp model'),'2;1'); 4 | FILE_NAME('svg2stp model for Plasticity','2023-05-17T17:47:18',('Author'),(''),'svg2stp 1.0','https://dev.cog.ooo/svg2stp/','Unknown'); 5 | FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); 6 | ENDSEC; 7 | DATA; 8 | #20 = CARTESIAN_POINT('', (139.15, -47.95, 0)); 9 | #21 = CARTESIAN_POINT('', (139.15, -17.86, 0)); 10 | #22 = CARTESIAN_POINT('', (199.34, -8.42, 0)); 11 | #23 = CARTESIAN_POINT('', (209.67, -35.82, 0)); 12 | #30 = CARTESIAN_POINT('', (-300.08, 90.96, 0)); 13 | #31 = CARTESIAN_POINT('', (-304.28, 149.65, 0)); 14 | #32 = CARTESIAN_POINT('', (-235.56, 219.36, 0)); 15 | #33 = CARTESIAN_POINT('', (-187.05, 195.96, 0)); 16 | #40 = CARTESIAN_POINT('', (-187.05, 195.96, 0)); 17 | #41 = CARTESIAN_POINT('', (-138.54, 172.56, 0)); 18 | #42 = CARTESIAN_POINT('', (-74.5, 83.41, 0)); 19 | #43 = CARTESIAN_POINT('', (-74.5, 83.41, 0)); 20 | #50 = CARTESIAN_POINT('', (-74.5, 83.41, 0)); 21 | #51 = CARTESIAN_POINT('', (-300.08, 90.96, 0)); 22 | #60 = CARTESIAN_POINT('', (-299.46, 45.87, 0)); 23 | #61 = CARTESIAN_POINT('', (-416.9, 95.73, 0)); 24 | #70 = CARTESIAN_POINT('', (-416.9, 95.73, 0)); 25 | #71 = CARTESIAN_POINT('', (-489.45, -30.93, 0)); 26 | #80 = CARTESIAN_POINT('', (-489.45, -30.93, 0)); 27 | #81 = CARTESIAN_POINT('', (-223.99, -95.61, 0)); 28 | #90 = CARTESIAN_POINT('', (-223.99, -95.61, 0)); 29 | #91 = CARTESIAN_POINT('', (-299.46, 45.87, 0)); 30 | #100 = CARTESIAN_POINT('', (-404.56, -12.07, 0)); 31 | #101 = CARTESIAN_POINT('', (-397.75, 39.13, 0)); 32 | #110 = CARTESIAN_POINT('', (-397.75, 39.13, 0)); 33 | #111 = CARTESIAN_POINT('', (-356.72, 27, 0)); 34 | #120 = CARTESIAN_POINT('', (-356.72, 27, 0)); 35 | #121 = CARTESIAN_POINT('', (-347.97, -24.2, 0)); 36 | #130 = CARTESIAN_POINT('', (-347.97, -24.2, 0)); 37 | #131 = CARTESIAN_POINT('', (-404.56, -12.07, 0)); 38 | #140 = CARTESIAN_POINT('', (-331.41, -13.86, 0)); 39 | #141 = CARTESIAN_POINT('', (-331.41, 13.54, 0)); 40 | #150 = CARTESIAN_POINT('', (-331.41, 13.54, 0)); 41 | #151 = CARTESIAN_POINT('', (-295.48, 13.54, 0)); 42 | #160 = CARTESIAN_POINT('', (-295.48, 13.54, 0)); 43 | #161 = CARTESIAN_POINT('', (-295.48, -13.86, 0)); 44 | #170 = CARTESIAN_POINT('', (-295.48, -13.86, 0)); 45 | #171 = CARTESIAN_POINT('', (-331.41, -13.86, 0)); 46 | #180 = CARTESIAN_POINT('', (-488.05, 101.9, 0)); 47 | #181 = CARTESIAN_POINT('', (-488.05, 131.99, 0)); 48 | #182 = CARTESIAN_POINT('', (-427.86, 141.43, 0)); 49 | #183 = CARTESIAN_POINT('', (-417.53, 114.03, 0)); 50 | #190 = CARTESIAN_POINT('', (-364.59, 393.8, 0)); 51 | #191 = CARTESIAN_POINT('', (-510.59, 277.8, 0)); 52 | #200 = CARTESIAN_POINT('', (-173.99, 181.44, 0)); 53 | #201 = CARTESIAN_POINT('', (-70.15, 330.89, 0)); 54 | #210 = CARTESIAN_POINT('', (-70.15, 330.89, 0)); 55 | #211 = CARTESIAN_POINT('', (67.31, 236.15, 0)); 56 | #220 = CARTESIAN_POINT('', (-405.72, -46.1, 0)); 57 | #221 = CARTESIAN_POINT('', (-404.72, 14.48, 0)); 58 | #222 = CARTESIAN_POINT('', (-357.72, 71.48, 0)); 59 | #223 = CARTESIAN_POINT('', (-307.72, 34.48, 0)); 60 | #230 = CARTESIAN_POINT('', (-571.9, -33.37, 0)); 61 | #231 = CARTESIAN_POINT('', (-556.77, -28.2, 0)); 62 | #240 = CARTESIAN_POINT('', (-556.77, -28.2, 0)); 63 | #241 = CARTESIAN_POINT('', (-556.77, -51.63, 0)); 64 | #250 = CARTESIAN_POINT('', (-556.77, -51.63, 0)); 65 | #251 = CARTESIAN_POINT('', (-530.76, -51.63, 0)); 66 | #260 = CARTESIAN_POINT('', (-530.76, -51.63, 0)); 67 | #261 = CARTESIAN_POINT('', (-530.76, -63.62, 0)); 68 | #270 = CARTESIAN_POINT('', (-530.76, -63.62, 0)); 69 | #271 = CARTESIAN_POINT('', (-556.77, -63.62, 0)); 70 | #280 = CARTESIAN_POINT('', (-556.77, -63.62, 0)); 71 | #281 = CARTESIAN_POINT('', (-556.77, -121.73, 0)); 72 | #290 = CARTESIAN_POINT('', (-556.77, -121.73, 0)); 73 | #291 = CARTESIAN_POINT('', (-556.77, -134.46, 0)); 74 | #292 = CARTESIAN_POINT('', (-552.9, -141.47, 0)); 75 | #293 = CARTESIAN_POINT('', (-543.12, -141.47, 0)); 76 | #300 = CARTESIAN_POINT('', (-543.12, -141.47, 0)); 77 | #301 = CARTESIAN_POINT('', (-538.51, -141.47, 0)); 78 | #302 = CARTESIAN_POINT('', (-535.37, -140.93, 0)); 79 | #303 = CARTESIAN_POINT('', (-532.79, -139.99, 0)); 80 | #310 = CARTESIAN_POINT('', (-532.79, -139.99, 0)); 81 | #311 = CARTESIAN_POINT('', (-531.87, -151.81, 0)); 82 | #320 = CARTESIAN_POINT('', (-531.87, -151.81, 0)); 83 | #321 = CARTESIAN_POINT('', (-535.19, -153.29, 0)); 84 | #322 = CARTESIAN_POINT('', (-540.36, -154.21, 0)); 85 | #323 = CARTESIAN_POINT('', (-546.81, -154.21, 0)); 86 | #330 = CARTESIAN_POINT('', (-546.81, -154.21, 0)); 87 | #331 = CARTESIAN_POINT('', (-571.16, -154.21, 0)); 88 | #332 = CARTESIAN_POINT('', (-571.9, -132.07, 0)); 89 | #333 = CARTESIAN_POINT('', (-571.9, -121.36, 0)); 90 | #340 = CARTESIAN_POINT('', (-571.9, -121.36, 0)); 91 | #341 = CARTESIAN_POINT('', (-571.9, -63.62, 0)); 92 | #350 = CARTESIAN_POINT('', (-571.9, -63.62, 0)); 93 | #351 = CARTESIAN_POINT('', (-587.4, -63.62, 0)); 94 | #360 = CARTESIAN_POINT('', (-587.4, -63.62, 0)); 95 | #361 = CARTESIAN_POINT('', (-587.4, -51.63, 0)); 96 | #370 = CARTESIAN_POINT('', (-587.4, -51.63, 0)); 97 | #371 = CARTESIAN_POINT('', (-571.9, -51.63, 0)); 98 | #380 = CARTESIAN_POINT('', (-571.9, -51.63, 0)); 99 | #381 = CARTESIAN_POINT('', (-571.9, -33.37, 0)); 100 | #390 = CARTESIAN_POINT('', (-439.43, -147.93, 0)); 101 | #391 = CARTESIAN_POINT('', (-445.15, -150.7, 0)); 102 | #392 = CARTESIAN_POINT('', (-455.67, -154.2, 0)); 103 | #393 = CARTESIAN_POINT('', (-470.98, -154.2, 0)); 104 | #400 = CARTESIAN_POINT('', (-470.98, -154.2, 0)); 105 | #401 = CARTESIAN_POINT('', (-500.31, -154.2, 0)); 106 | #402 = CARTESIAN_POINT('', (-517.84, -133.54, 0)); 107 | #403 = CARTESIAN_POINT('', (-517.84, -103.46, 0)); 108 | #410 = CARTESIAN_POINT('', (-517.84, -103.46, 0)); 109 | #411 = CARTESIAN_POINT('', (-517.84, -71.91, 0)); 110 | #412 = CARTESIAN_POINT('', (-500.13, -49.22, 0)); 111 | #413 = CARTESIAN_POINT('', (-473.01, -49.22, 0)); 112 | #420 = CARTESIAN_POINT('', (-473.01, -49.22, 0)); 113 | #421 = CARTESIAN_POINT('', (-442.01, -49.22, 0)); 114 | #422 = CARTESIAN_POINT('', (-434.08, -77.63, 0)); 115 | #423 = CARTESIAN_POINT('', (-434.08, -95.16, 0)); 116 | #430 = CARTESIAN_POINT('', (-434.08, -95.16, 0)); 117 | #431 = CARTESIAN_POINT('', (-434.08, -98.67, 0)); 118 | #432 = CARTESIAN_POINT('', (-434.26, -101.25, 0)); 119 | #433 = CARTESIAN_POINT('', (-434.45, -103.65, 0)); 120 | #440 = CARTESIAN_POINT('', (-434.45, -103.65, 0)); 121 | #441 = CARTESIAN_POINT('', (-502.9, -103.65, 0)); 122 | #450 = CARTESIAN_POINT('', (-502.9, -103.65, 0)); 123 | #451 = CARTESIAN_POINT('', (-502.72, -131.51, 0)); 124 | #452 = CARTESIAN_POINT('', (-486.85, -142.03, 0)); 125 | #453 = CARTESIAN_POINT('', (-468.77, -142.03, 0)); 126 | #460 = CARTESIAN_POINT('', (-468.77, -142.03, 0)); 127 | #461 = CARTESIAN_POINT('', (-456.22, -142.03, 0)); 128 | #462 = CARTESIAN_POINT('', (-448.66, -139.45, 0)); 129 | #463 = CARTESIAN_POINT('', (-442.39, -136.86, 0)); 130 | #470 = CARTESIAN_POINT('', (-442.39, -136.86, 0)); 131 | #471 = CARTESIAN_POINT('', (-439.44, -147.93, 0)); 132 | #480 = CARTESIAN_POINT('', (-439.44, -147.93, 0)); 133 | #481 = CARTESIAN_POINT('', (-439.43, -147.93, 0)); 134 | #490 = CARTESIAN_POINT('', (-449.21, -92.21, 0)); 135 | #491 = CARTESIAN_POINT('', (-449.03, -78.56, 0)); 136 | #492 = CARTESIAN_POINT('', (-454.74, -60.85, 0)); 137 | #493 = CARTESIAN_POINT('', (-474.49, -60.85, 0)); 138 | #500 = CARTESIAN_POINT('', (-474.49, -60.85, 0)); 139 | #501 = CARTESIAN_POINT('', (-492.94, -60.85, 0)); 140 | #502 = CARTESIAN_POINT('', (-501.06, -78.38, 0)); 141 | #503 = CARTESIAN_POINT('', (-502.53, -92.21, 0)); 142 | #510 = CARTESIAN_POINT('', (-502.53, -92.21, 0)); 143 | #511 = CARTESIAN_POINT('', (-449.21, -92.21, 0)); 144 | #520 = CARTESIAN_POINT('', (-364.16, -66.94, 0)); 145 | #521 = CARTESIAN_POINT('', (-367.85, -64.54, 0)); 146 | #522 = CARTESIAN_POINT('', (-374.69, -61.04, 0)); 147 | #523 = CARTESIAN_POINT('', (-383.72, -61.04, 0)); 148 | #530 = CARTESIAN_POINT('', (-383.72, -61.04, 0)); 149 | #531 = CARTESIAN_POINT('', (-394.79, -61.04, 0)); 150 | #532 = CARTESIAN_POINT('', (-400.69, -67.87, 0)); 151 | #533 = CARTESIAN_POINT('', (-400.69, -75.98, 0)); 152 | #540 = CARTESIAN_POINT('', (-400.69, -75.98, 0)); 153 | #541 = CARTESIAN_POINT('', (-400.69, -84.65, 0)); 154 | #542 = CARTESIAN_POINT('', (-394.97, -88.71, 0)); 155 | #543 = CARTESIAN_POINT('', (-382.07, -94.24, 0)); 156 | #550 = CARTESIAN_POINT('', (-382.07, -94.24, 0)); 157 | #551 = CARTESIAN_POINT('', (-365.82, -100.88, 0)); 158 | #552 = CARTESIAN_POINT('', (-356.41, -109.37, 0)); 159 | #553 = CARTESIAN_POINT('', (-356.41, -124.51, 0)); 160 | #560 = CARTESIAN_POINT('', (-356.41, -124.51, 0)); 161 | #561 = CARTESIAN_POINT('', (-356.41, -142.4, 0)); 162 | #562 = CARTESIAN_POINT('', (-370.06, -154.21, 0)); 163 | #563 = CARTESIAN_POINT('', (-392.03, -154.21, 0)); 164 | #570 = CARTESIAN_POINT('', (-392.03, -154.21, 0)); 165 | #571 = CARTESIAN_POINT('', (-401.99, -154.21, 0)); 166 | #572 = CARTESIAN_POINT('', (-411.59, -151.44, 0)); 167 | #573 = CARTESIAN_POINT('', (-418.41, -147.38, 0)); 168 | #580 = CARTESIAN_POINT('', (-418.41, -147.38, 0)); 169 | #581 = CARTESIAN_POINT('', (-414.16, -135.56, 0)); 170 | #590 = CARTESIAN_POINT('', (-414.16, -135.56, 0)); 171 | #591 = CARTESIAN_POINT('', (-408.81, -138.7, 0)); 172 | #592 = CARTESIAN_POINT('', (-400.14, -142.4, 0)); 173 | #593 = CARTESIAN_POINT('', (-391.47, -142.4, 0)); 174 | #600 = CARTESIAN_POINT('', (-391.47, -142.4, 0)); 175 | #601 = CARTESIAN_POINT('', (-378, -142.4, 0)); 176 | #602 = CARTESIAN_POINT('', (-371.36, -135.19, 0)); 177 | #603 = CARTESIAN_POINT('', (-371.36, -126.15, 0)); 178 | #610 = CARTESIAN_POINT('', (-371.36, -126.15, 0)); 179 | #611 = CARTESIAN_POINT('', (-371.36, -117.11, 0)); 180 | #612 = CARTESIAN_POINT('', (-376.71, -111.58, 0)); 181 | #613 = CARTESIAN_POINT('', (-389.99, -106.22, 0)); 182 | #620 = CARTESIAN_POINT('', (-389.99, -106.22, 0)); 183 | #621 = CARTESIAN_POINT('', (-406.96, -99.4, 0)); 184 | #622 = CARTESIAN_POINT('', (-415.63, -89.98, 0)); 185 | #623 = CARTESIAN_POINT('', (-415.63, -77.81, 0)); 186 | #630 = CARTESIAN_POINT('', (-415.63, -77.81, 0)); 187 | #631 = CARTESIAN_POINT('', (-415.63, -62.13, 0)); 188 | #632 = CARTESIAN_POINT('', (-403.08, -49.21, 0)); 189 | #633 = CARTESIAN_POINT('', (-382.79, -49.21, 0)); 190 | #640 = CARTESIAN_POINT('', (-382.79, -49.21, 0)); 191 | #641 = CARTESIAN_POINT('', (-373.2, -49.21, 0)); 192 | #642 = CARTESIAN_POINT('', (-365.08, -51.98, 0)); 193 | #643 = CARTESIAN_POINT('', (-359.73, -55.3, 0)); 194 | #650 = CARTESIAN_POINT('', (-359.73, -55.3, 0)); 195 | #651 = CARTESIAN_POINT('', (-364.16, -66.92, 0)); 196 | #660 = CARTESIAN_POINT('', (-364.16, -66.92, 0)); 197 | #661 = CARTESIAN_POINT('', (-364.16, -66.94, 0)); 198 | #670 = CARTESIAN_POINT('', (-328.92, -33.37, 0)); 199 | #671 = CARTESIAN_POINT('', (-313.79, -28.2, 0)); 200 | #680 = CARTESIAN_POINT('', (-313.79, -28.2, 0)); 201 | #681 = CARTESIAN_POINT('', (-313.79, -51.63, 0)); 202 | #690 = CARTESIAN_POINT('', (-313.79, -51.63, 0)); 203 | #691 = CARTESIAN_POINT('', (-287.78, -51.63, 0)); 204 | #700 = CARTESIAN_POINT('', (-287.78, -51.63, 0)); 205 | #701 = CARTESIAN_POINT('', (-287.78, -63.62, 0)); 206 | #710 = CARTESIAN_POINT('', (-287.78, -63.62, 0)); 207 | #711 = CARTESIAN_POINT('', (-313.79, -63.62, 0)); 208 | #720 = CARTESIAN_POINT('', (-313.79, -63.62, 0)); 209 | #721 = CARTESIAN_POINT('', (-313.79, -121.73, 0)); 210 | #730 = CARTESIAN_POINT('', (-313.79, -121.73, 0)); 211 | #731 = CARTESIAN_POINT('', (-313.79, -134.46, 0)); 212 | #732 = CARTESIAN_POINT('', (-309.92, -141.47, 0)); 213 | #733 = CARTESIAN_POINT('', (-300.14, -141.47, 0)); 214 | #740 = CARTESIAN_POINT('', (-300.14, -141.47, 0)); 215 | #741 = CARTESIAN_POINT('', (-295.53, -141.47, 0)); 216 | #742 = CARTESIAN_POINT('', (-292.39, -140.93, 0)); 217 | #743 = CARTESIAN_POINT('', (-289.81, -139.99, 0)); 218 | #750 = CARTESIAN_POINT('', (-289.81, -139.99, 0)); 219 | #751 = CARTESIAN_POINT('', (-288.89, -151.81, 0)); 220 | #760 = CARTESIAN_POINT('', (-288.89, -151.81, 0)); 221 | #761 = CARTESIAN_POINT('', (-292.21, -153.29, 0)); 222 | #762 = CARTESIAN_POINT('', (-297.38, -154.21, 0)); 223 | #763 = CARTESIAN_POINT('', (-303.83, -154.21, 0)); 224 | #770 = CARTESIAN_POINT('', (-303.83, -154.21, 0)); 225 | #771 = CARTESIAN_POINT('', (-328.18, -154.21, 0)); 226 | #772 = CARTESIAN_POINT('', (-328.92, -132.07, 0)); 227 | #773 = CARTESIAN_POINT('', (-328.92, -121.36, 0)); 228 | #780 = CARTESIAN_POINT('', (-328.92, -121.36, 0)); 229 | #781 = CARTESIAN_POINT('', (-328.92, -63.62, 0)); 230 | #790 = CARTESIAN_POINT('', (-328.92, -63.62, 0)); 231 | #791 = CARTESIAN_POINT('', (-344.42, -63.62, 0)); 232 | #800 = CARTESIAN_POINT('', (-344.42, -63.62, 0)); 233 | #801 = CARTESIAN_POINT('', (-344.42, -51.63, 0)); 234 | #810 = CARTESIAN_POINT('', (-344.42, -51.63, 0)); 235 | #811 = CARTESIAN_POINT('', (-328.92, -51.63, 0)); 236 | #820 = CARTESIAN_POINT('', (-328.92, -51.63, 0)); 237 | #821 = CARTESIAN_POINT('', (-328.92, -33.37, 0)); 238 | #830 = CARTESIAN_POINT('', (419.91, 157.81, 0)); 239 | #831 = CARTESIAN_POINT('', (366.61, 157.81, 0)); 240 | #832 = CARTESIAN_POINT('', (323.41, 114.61, 0)); 241 | #833 = CARTESIAN_POINT('', (323.41, 61.31, 0)); 242 | #840 = CARTESIAN_POINT('', (323.41, 61.31, 0)); 243 | #841 = CARTESIAN_POINT('', (323.41, 8.01, 0)); 244 | #842 = CARTESIAN_POINT('', (384.11, -71.19, 0)); 245 | #843 = CARTESIAN_POINT('', (437.41, -71.19, 0)); 246 | #850 = CARTESIAN_POINT('', (437.41, -71.19, 0)); 247 | #851 = CARTESIAN_POINT('', (490.71, -71.19, 0)); 248 | #852 = CARTESIAN_POINT('', (516.41, 8.01, 0)); 249 | #853 = CARTESIAN_POINT('', (516.41, 61.31, 0)); 250 | #860 = CARTESIAN_POINT('', (516.41, 61.31, 0)); 251 | #861 = CARTESIAN_POINT('', (516.41, 114.61, 0)); 252 | #862 = CARTESIAN_POINT('', (473.21, 157.81, 0)); 253 | #863 = CARTESIAN_POINT('', (419.91, 157.81, 0)); 254 | #870 = CARTESIAN_POINT('', (446.7, 12.81, 0)); 255 | #871 = CARTESIAN_POINT('', (419.91, 12.81, 0)); 256 | #872 = CARTESIAN_POINT('', (371.41, 34.52, 0)); 257 | #873 = CARTESIAN_POINT('', (371.41, 61.31, 0)); 258 | #880 = CARTESIAN_POINT('', (371.41, 61.31, 0)); 259 | #881 = CARTESIAN_POINT('', (371.41, 88.1, 0)); 260 | #882 = CARTESIAN_POINT('', (393.12, 109.81, 0)); 261 | #883 = CARTESIAN_POINT('', (419.91, 109.81, 0)); 262 | #890 = CARTESIAN_POINT('', (419.91, 109.81, 0)); 263 | #891 = CARTESIAN_POINT('', (446.7, 109.81, 0)); 264 | #892 = CARTESIAN_POINT('', (468.41, 88.1, 0)); 265 | #893 = CARTESIAN_POINT('', (468.41, 61.31, 0)); 266 | #900 = CARTESIAN_POINT('', (468.41, 61.31, 0)); 267 | #901 = CARTESIAN_POINT('', (468.41, 34.52, 0)); 268 | #902 = CARTESIAN_POINT('', (473.48, 12.81, 0)); 269 | #903 = CARTESIAN_POINT('', (446.7, 12.81, 0)); 270 | #910 = CARTESIAN_POINT('', (-34.63, -273.21, 0)); 271 | #911 = CARTESIAN_POINT('', (-34.63, -222.39, 0)); 272 | #912 = CARTESIAN_POINT('', (6.57, -181.19, 0)); 273 | #913 = CARTESIAN_POINT('', (57.39, -181.19, 0)); 274 | #920 = CARTESIAN_POINT('', (57.39, -181.19, 0)); 275 | #921 = CARTESIAN_POINT('', (108.21, -181.19, 0)); 276 | #922 = CARTESIAN_POINT('', (149.41, -222.39, 0)); 277 | #923 = CARTESIAN_POINT('', (149.41, -273.21, 0)); 278 | #930 = CARTESIAN_POINT('', (149.41, -273.21, 0)); 279 | #931 = CARTESIAN_POINT('', (149.41, -324.03, 0)); 280 | #932 = CARTESIAN_POINT('', (108.21, -365.23, 0)); 281 | #933 = CARTESIAN_POINT('', (57.39, -365.23, 0)); 282 | #940 = CARTESIAN_POINT('', (57.39, -365.23, 0)); 283 | #941 = CARTESIAN_POINT('', (6.57, -365.23, 0)); 284 | #942 = CARTESIAN_POINT('', (-34.63, -324.03, 0)); 285 | #943 = CARTESIAN_POINT('', (-34.63, -273.21, 0)); 286 | #950 = CARTESIAN_POINT('', (-597.59, -353.2, 0)); 287 | #951 = CARTESIAN_POINT('', (-640.06, -307.8, 0)); 288 | #952 = CARTESIAN_POINT('', (-497.83, -218.2, 0)); 289 | #953 = CARTESIAN_POINT('', (-449.21, -287.2, 0)); 290 | #960 = CARTESIAN_POINT('', (-449.21, -287.2, 0)); 291 | #961 = CARTESIAN_POINT('', (-400.59, -356.2, 0)); 292 | #962 = CARTESIAN_POINT('', (-539.59, -415.2, 0)); 293 | #963 = CARTESIAN_POINT('', (-597.59, -353.2, 0)); 294 | #970 = CARTESIAN_POINT('', (-331.59, -307.2, 0)); 295 | #971 = CARTESIAN_POINT('', (-360.59, -387.2, 0)); 296 | #980 = CARTESIAN_POINT('', (-360.59, -387.2, 0)); 297 | #981 = CARTESIAN_POINT('', (-204.59, -394.2, 0)); 298 | #990 = CARTESIAN_POINT('', (-204.59, -394.2, 0)); 299 | #991 = CARTESIAN_POINT('', (-228.58, -320.66, 0)); 300 | #1000 = CARTESIAN_POINT('', (-228.58, -320.66, 0)); 301 | #1001 = CARTESIAN_POINT('', (-331.59, -307.2, 0)); 302 | #1010 = CARTESIAN_POINT('', (310.41, -242.19, 0)); 303 | #1011 = CARTESIAN_POINT('', (322.41, -165.19, 0)); 304 | #1012 = CARTESIAN_POINT('', (530.41, -163.19, 0)); 305 | #1013 = CARTESIAN_POINT('', (605.41, -227.19, 0)); 306 | #1020 = CARTESIAN_POINT('', (605.41, -227.19, 0)); 307 | #1021 = CARTESIAN_POINT('', (310.41, -242.19, 0)); 308 | #1030 = CARTESIAN_POINT('', (-104.6, -86.45, 0)); 309 | #1031 = CARTESIAN_POINT('', (-104.6, 13.55, 0)); 310 | #1040 = CARTESIAN_POINT('', (-104.6, 13.55, 0)); 311 | #1041 = CARTESIAN_POINT('', (-4.6, 13.55, 0)); 312 | #1050 = CARTESIAN_POINT('', (-4.6, 13.55, 0)); 313 | #1051 = CARTESIAN_POINT('', (-4.6, -86.45, 0)); 314 | #1060 = CARTESIAN_POINT('', (-4.6, -86.45, 0)); 315 | #1061 = CARTESIAN_POINT('', (-104.6, -86.45, 0)); 316 | #1070 = CARTESIAN_POINT('', (125.41, 96.45, 0)); 317 | #1071 = CARTESIAN_POINT('', (125.41, 124.81, 0)); 318 | #1080 = CARTESIAN_POINT('', (125.41, 124.81, 0)); 319 | #1081 = CARTESIAN_POINT('', (153.76, 124.81, 0)); 320 | #1090 = CARTESIAN_POINT('', (153.76, 124.81, 0)); 321 | #1091 = CARTESIAN_POINT('', (153.76, 96.45, 0)); 322 | #1100 = CARTESIAN_POINT('', (153.76, 96.45, 0)); 323 | #1101 = CARTESIAN_POINT('', (125.41, 96.45, 0)); 324 | #27 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#20, #21, #22, #23), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 325 | #127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#30, #31, #32, #33), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 326 | #227 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#40, #41, #42, #43), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 327 | #327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#50, #51), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 328 | #427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#60, #61), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 329 | #527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#70, #71), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 330 | #627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#80, #81), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 331 | #727 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#90, #91), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 332 | #827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#100, #101), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 333 | #927 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#110, #111), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 334 | #1027 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#120, #121), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 335 | #1127 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#130, #131), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 336 | #1227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#140, #141), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 337 | #1327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#150, #151), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 338 | #1427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#160, #161), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 339 | #1527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#170, #171), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 340 | #1627 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#180, #181, #182, #183), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 341 | #1727 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#190, #191), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 342 | #1827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#200, #201), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 343 | #1927 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#210, #211), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 344 | #2027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#220, #221, #222, #223), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 345 | #2127 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#230, #231), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 346 | #2227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#240, #241), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 347 | #2327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#250, #251), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 348 | #2427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#260, #261), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 349 | #2527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#270, #271), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 350 | #2627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#280, #281), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 351 | #2727 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#290, #291, #292, #293), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 352 | #2827 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#300, #301, #302, #303), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 353 | #2927 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#310, #311), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 354 | #3027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#320, #321, #322, #323), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 355 | #3127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#330, #331, #332, #333), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 356 | #3227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#340, #341), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 357 | #3327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#350, #351), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 358 | #3427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#360, #361), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 359 | #3527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#370, #371), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 360 | #3627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#380, #381), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 361 | #3727 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#390, #391, #392, #393), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 362 | #3827 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#400, #401, #402, #403), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 363 | #3927 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#410, #411, #412, #413), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 364 | #4027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#420, #421, #422, #423), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 365 | #4127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#430, #431, #432, #433), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 366 | #4227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#440, #441), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 367 | #4327 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#450, #451, #452, #453), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 368 | #4427 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#460, #461, #462, #463), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 369 | #4527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#470, #471), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 370 | #4627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#480, #481), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 371 | #4727 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#490, #491, #492, #493), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 372 | #4827 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#500, #501, #502, #503), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 373 | #4927 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#510, #511), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 374 | #5027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#520, #521, #522, #523), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 375 | #5127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#530, #531, #532, #533), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 376 | #5227 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#540, #541, #542, #543), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 377 | #5327 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#550, #551, #552, #553), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 378 | #5427 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#560, #561, #562, #563), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 379 | #5527 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#570, #571, #572, #573), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 380 | #5627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#580, #581), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 381 | #5727 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#590, #591, #592, #593), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 382 | #5827 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#600, #601, #602, #603), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 383 | #5927 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#610, #611, #612, #613), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 384 | #6027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#620, #621, #622, #623), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 385 | #6127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#630, #631, #632, #633), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 386 | #6227 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#640, #641, #642, #643), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 387 | #6327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#650, #651), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 388 | #6427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#660, #661), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 389 | #6527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#670, #671), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 390 | #6627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#680, #681), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 391 | #6727 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#690, #691), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 392 | #6827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#700, #701), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 393 | #6927 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#710, #711), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 394 | #7027 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#720, #721), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 395 | #7127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#730, #731, #732, #733), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 396 | #7227 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#740, #741, #742, #743), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 397 | #7327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#750, #751), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 398 | #7427 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#760, #761, #762, #763), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 399 | #7527 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#770, #771, #772, #773), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 400 | #7627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#780, #781), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 401 | #7727 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#790, #791), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 402 | #7827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#800, #801), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 403 | #7927 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#810, #811), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 404 | #8027 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#820, #821), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 405 | #8127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#830, #831, #832, #833), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 406 | #8227 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#840, #841, #842, #843), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 407 | #8327 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#850, #851, #852, #853), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 408 | #8427 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#860, #861, #862, #863), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 409 | #8527 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#870, #871, #872, #873), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 410 | #8627 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#880, #881, #882, #883), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 411 | #8727 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#890, #891, #892, #893), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 412 | #8827 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#900, #901, #902, #903), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 413 | #8927 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#910, #911, #912, #913), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 414 | #9027 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#920, #921, #922, #923), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 415 | #9127 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#930, #931, #932, #933), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 416 | #9227 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#940, #941, #942, #943), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 417 | #9327 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#950, #951, #952, #953), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 418 | #9427 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#960, #961, #962, #963), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 419 | #9527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#970, #971), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 420 | #9627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#980, #981), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 421 | #9727 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#990, #991), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 422 | #9827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1000, #1001), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 423 | #9927 = B_SPLINE_CURVE_WITH_KNOTS('', 3, (#1010, #1011, #1012, #1013), .UNSPECIFIED., .F., .F., (4, 4), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 424 | #10027 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1020, #1021), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 425 | #10127 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1030, #1031), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 426 | #10227 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1040, #1041), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 427 | #10327 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1050, #1051), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 428 | #10427 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1060, #1061), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 429 | #10527 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1070, #1071), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 430 | #10627 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1080, #1081), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 431 | #10727 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1090, #1091), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 432 | #10827 = B_SPLINE_CURVE_WITH_KNOTS('', 1, (#1100, #1101), .UNSPECIFIED., .F., .F., (2, 2), (0., 1.), .PIECEWISE_BEZIER_KNOTS.); 433 | #26 = TRIMMED_CURVE('', #27, (##20, PARAMETER_VALUE(0.)), (##23, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 434 | #126 = TRIMMED_CURVE('', #127, (##30, PARAMETER_VALUE(0.)), (##33, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 435 | #226 = TRIMMED_CURVE('', #227, (##40, PARAMETER_VALUE(0.)), (##43, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 436 | #326 = TRIMMED_CURVE('', #327, (##50, PARAMETER_VALUE(0.)), (##51, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 437 | #426 = TRIMMED_CURVE('', #427, (##60, PARAMETER_VALUE(0.)), (##61, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 438 | #526 = TRIMMED_CURVE('', #527, (##70, PARAMETER_VALUE(0.)), (##71, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 439 | #626 = TRIMMED_CURVE('', #627, (##80, PARAMETER_VALUE(0.)), (##81, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 440 | #726 = TRIMMED_CURVE('', #727, (##90, PARAMETER_VALUE(0.)), (##91, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 441 | #826 = TRIMMED_CURVE('', #827, (##100, PARAMETER_VALUE(0.)), (##101, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 442 | #926 = TRIMMED_CURVE('', #927, (##110, PARAMETER_VALUE(0.)), (##111, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 443 | #1026 = TRIMMED_CURVE('', #1027, (##120, PARAMETER_VALUE(0.)), (##121, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 444 | #1126 = TRIMMED_CURVE('', #1127, (##130, PARAMETER_VALUE(0.)), (##131, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 445 | #1226 = TRIMMED_CURVE('', #1227, (##140, PARAMETER_VALUE(0.)), (##141, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 446 | #1326 = TRIMMED_CURVE('', #1327, (##150, PARAMETER_VALUE(0.)), (##151, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 447 | #1426 = TRIMMED_CURVE('', #1427, (##160, PARAMETER_VALUE(0.)), (##161, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 448 | #1526 = TRIMMED_CURVE('', #1527, (##170, PARAMETER_VALUE(0.)), (##171, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 449 | #1626 = TRIMMED_CURVE('', #1627, (##180, PARAMETER_VALUE(0.)), (##183, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 450 | #1726 = TRIMMED_CURVE('', #1727, (##190, PARAMETER_VALUE(0.)), (##191, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 451 | #1826 = TRIMMED_CURVE('', #1827, (##200, PARAMETER_VALUE(0.)), (##201, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 452 | #1926 = TRIMMED_CURVE('', #1927, (##210, PARAMETER_VALUE(0.)), (##211, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 453 | #2026 = TRIMMED_CURVE('', #2027, (##220, PARAMETER_VALUE(0.)), (##223, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 454 | #2126 = TRIMMED_CURVE('', #2127, (##230, PARAMETER_VALUE(0.)), (##231, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 455 | #2226 = TRIMMED_CURVE('', #2227, (##240, PARAMETER_VALUE(0.)), (##241, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 456 | #2326 = TRIMMED_CURVE('', #2327, (##250, PARAMETER_VALUE(0.)), (##251, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 457 | #2426 = TRIMMED_CURVE('', #2427, (##260, PARAMETER_VALUE(0.)), (##261, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 458 | #2526 = TRIMMED_CURVE('', #2527, (##270, PARAMETER_VALUE(0.)), (##271, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 459 | #2626 = TRIMMED_CURVE('', #2627, (##280, PARAMETER_VALUE(0.)), (##281, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 460 | #2726 = TRIMMED_CURVE('', #2727, (##290, PARAMETER_VALUE(0.)), (##293, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 461 | #2826 = TRIMMED_CURVE('', #2827, (##300, PARAMETER_VALUE(0.)), (##303, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 462 | #2926 = TRIMMED_CURVE('', #2927, (##310, PARAMETER_VALUE(0.)), (##311, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 463 | #3026 = TRIMMED_CURVE('', #3027, (##320, PARAMETER_VALUE(0.)), (##323, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 464 | #3126 = TRIMMED_CURVE('', #3127, (##330, PARAMETER_VALUE(0.)), (##333, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 465 | #3226 = TRIMMED_CURVE('', #3227, (##340, PARAMETER_VALUE(0.)), (##341, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 466 | #3326 = TRIMMED_CURVE('', #3327, (##350, PARAMETER_VALUE(0.)), (##351, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 467 | #3426 = TRIMMED_CURVE('', #3427, (##360, PARAMETER_VALUE(0.)), (##361, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 468 | #3526 = TRIMMED_CURVE('', #3527, (##370, PARAMETER_VALUE(0.)), (##371, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 469 | #3626 = TRIMMED_CURVE('', #3627, (##380, PARAMETER_VALUE(0.)), (##381, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 470 | #3726 = TRIMMED_CURVE('', #3727, (##390, PARAMETER_VALUE(0.)), (##393, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 471 | #3826 = TRIMMED_CURVE('', #3827, (##400, PARAMETER_VALUE(0.)), (##403, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 472 | #3926 = TRIMMED_CURVE('', #3927, (##410, PARAMETER_VALUE(0.)), (##413, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 473 | #4026 = TRIMMED_CURVE('', #4027, (##420, PARAMETER_VALUE(0.)), (##423, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 474 | #4126 = TRIMMED_CURVE('', #4127, (##430, PARAMETER_VALUE(0.)), (##433, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 475 | #4226 = TRIMMED_CURVE('', #4227, (##440, PARAMETER_VALUE(0.)), (##441, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 476 | #4326 = TRIMMED_CURVE('', #4327, (##450, PARAMETER_VALUE(0.)), (##453, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 477 | #4426 = TRIMMED_CURVE('', #4427, (##460, PARAMETER_VALUE(0.)), (##463, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 478 | #4526 = TRIMMED_CURVE('', #4527, (##470, PARAMETER_VALUE(0.)), (##471, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 479 | #4626 = TRIMMED_CURVE('', #4627, (##480, PARAMETER_VALUE(0.)), (##481, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 480 | #4726 = TRIMMED_CURVE('', #4727, (##490, PARAMETER_VALUE(0.)), (##493, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 481 | #4826 = TRIMMED_CURVE('', #4827, (##500, PARAMETER_VALUE(0.)), (##503, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 482 | #4926 = TRIMMED_CURVE('', #4927, (##510, PARAMETER_VALUE(0.)), (##511, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 483 | #5026 = TRIMMED_CURVE('', #5027, (##520, PARAMETER_VALUE(0.)), (##523, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 484 | #5126 = TRIMMED_CURVE('', #5127, (##530, PARAMETER_VALUE(0.)), (##533, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 485 | #5226 = TRIMMED_CURVE('', #5227, (##540, PARAMETER_VALUE(0.)), (##543, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 486 | #5326 = TRIMMED_CURVE('', #5327, (##550, PARAMETER_VALUE(0.)), (##553, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 487 | #5426 = TRIMMED_CURVE('', #5427, (##560, PARAMETER_VALUE(0.)), (##563, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 488 | #5526 = TRIMMED_CURVE('', #5527, (##570, PARAMETER_VALUE(0.)), (##573, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 489 | #5626 = TRIMMED_CURVE('', #5627, (##580, PARAMETER_VALUE(0.)), (##581, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 490 | #5726 = TRIMMED_CURVE('', #5727, (##590, PARAMETER_VALUE(0.)), (##593, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 491 | #5826 = TRIMMED_CURVE('', #5827, (##600, PARAMETER_VALUE(0.)), (##603, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 492 | #5926 = TRIMMED_CURVE('', #5927, (##610, PARAMETER_VALUE(0.)), (##613, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 493 | #6026 = TRIMMED_CURVE('', #6027, (##620, PARAMETER_VALUE(0.)), (##623, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 494 | #6126 = TRIMMED_CURVE('', #6127, (##630, PARAMETER_VALUE(0.)), (##633, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 495 | #6226 = TRIMMED_CURVE('', #6227, (##640, PARAMETER_VALUE(0.)), (##643, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 496 | #6326 = TRIMMED_CURVE('', #6327, (##650, PARAMETER_VALUE(0.)), (##651, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 497 | #6426 = TRIMMED_CURVE('', #6427, (##660, PARAMETER_VALUE(0.)), (##661, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 498 | #6526 = TRIMMED_CURVE('', #6527, (##670, PARAMETER_VALUE(0.)), (##671, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 499 | #6626 = TRIMMED_CURVE('', #6627, (##680, PARAMETER_VALUE(0.)), (##681, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 500 | #6726 = TRIMMED_CURVE('', #6727, (##690, PARAMETER_VALUE(0.)), (##691, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 501 | #6826 = TRIMMED_CURVE('', #6827, (##700, PARAMETER_VALUE(0.)), (##701, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 502 | #6926 = TRIMMED_CURVE('', #6927, (##710, PARAMETER_VALUE(0.)), (##711, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 503 | #7026 = TRIMMED_CURVE('', #7027, (##720, PARAMETER_VALUE(0.)), (##721, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 504 | #7126 = TRIMMED_CURVE('', #7127, (##730, PARAMETER_VALUE(0.)), (##733, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 505 | #7226 = TRIMMED_CURVE('', #7227, (##740, PARAMETER_VALUE(0.)), (##743, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 506 | #7326 = TRIMMED_CURVE('', #7327, (##750, PARAMETER_VALUE(0.)), (##751, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 507 | #7426 = TRIMMED_CURVE('', #7427, (##760, PARAMETER_VALUE(0.)), (##763, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 508 | #7526 = TRIMMED_CURVE('', #7527, (##770, PARAMETER_VALUE(0.)), (##773, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 509 | #7626 = TRIMMED_CURVE('', #7627, (##780, PARAMETER_VALUE(0.)), (##781, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 510 | #7726 = TRIMMED_CURVE('', #7727, (##790, PARAMETER_VALUE(0.)), (##791, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 511 | #7826 = TRIMMED_CURVE('', #7827, (##800, PARAMETER_VALUE(0.)), (##801, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 512 | #7926 = TRIMMED_CURVE('', #7927, (##810, PARAMETER_VALUE(0.)), (##811, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 513 | #8026 = TRIMMED_CURVE('', #8027, (##820, PARAMETER_VALUE(0.)), (##821, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 514 | #8126 = TRIMMED_CURVE('', #8127, (##830, PARAMETER_VALUE(0.)), (##833, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 515 | #8226 = TRIMMED_CURVE('', #8227, (##840, PARAMETER_VALUE(0.)), (##843, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 516 | #8326 = TRIMMED_CURVE('', #8327, (##850, PARAMETER_VALUE(0.)), (##853, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 517 | #8426 = TRIMMED_CURVE('', #8427, (##860, PARAMETER_VALUE(0.)), (##863, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 518 | #8526 = TRIMMED_CURVE('', #8527, (##870, PARAMETER_VALUE(0.)), (##873, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 519 | #8626 = TRIMMED_CURVE('', #8627, (##880, PARAMETER_VALUE(0.)), (##883, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 520 | #8726 = TRIMMED_CURVE('', #8727, (##890, PARAMETER_VALUE(0.)), (##893, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 521 | #8826 = TRIMMED_CURVE('', #8827, (##900, PARAMETER_VALUE(0.)), (##903, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 522 | #8926 = TRIMMED_CURVE('', #8927, (##910, PARAMETER_VALUE(0.)), (##913, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 523 | #9026 = TRIMMED_CURVE('', #9027, (##920, PARAMETER_VALUE(0.)), (##923, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 524 | #9126 = TRIMMED_CURVE('', #9127, (##930, PARAMETER_VALUE(0.)), (##933, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 525 | #9226 = TRIMMED_CURVE('', #9227, (##940, PARAMETER_VALUE(0.)), (##943, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 526 | #9326 = TRIMMED_CURVE('', #9327, (##950, PARAMETER_VALUE(0.)), (##953, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 527 | #9426 = TRIMMED_CURVE('', #9427, (##960, PARAMETER_VALUE(0.)), (##963, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 528 | #9526 = TRIMMED_CURVE('', #9527, (##970, PARAMETER_VALUE(0.)), (##971, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 529 | #9626 = TRIMMED_CURVE('', #9627, (##980, PARAMETER_VALUE(0.)), (##981, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 530 | #9726 = TRIMMED_CURVE('', #9727, (##990, PARAMETER_VALUE(0.)), (##991, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 531 | #9826 = TRIMMED_CURVE('', #9827, (##1000, PARAMETER_VALUE(0.)), (##1001, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 532 | #9926 = TRIMMED_CURVE('', #9927, (##1010, PARAMETER_VALUE(0.)), (##1013, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 533 | #10026 = TRIMMED_CURVE('', #10027, (##1020, PARAMETER_VALUE(0.)), (##1021, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 534 | #10126 = TRIMMED_CURVE('', #10127, (##1030, PARAMETER_VALUE(0.)), (##1031, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 535 | #10226 = TRIMMED_CURVE('', #10227, (##1040, PARAMETER_VALUE(0.)), (##1041, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 536 | #10326 = TRIMMED_CURVE('', #10327, (##1050, PARAMETER_VALUE(0.)), (##1051, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 537 | #10426 = TRIMMED_CURVE('', #10427, (##1060, PARAMETER_VALUE(0.)), (##1061, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 538 | #10526 = TRIMMED_CURVE('', #10527, (##1070, PARAMETER_VALUE(0.)), (##1071, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 539 | #10626 = TRIMMED_CURVE('', #10627, (##1080, PARAMETER_VALUE(0.)), (##1081, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 540 | #10726 = TRIMMED_CURVE('', #10727, (##1090, PARAMETER_VALUE(0.)), (##1091, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 541 | #10826 = TRIMMED_CURVE('', #10827, (##1100, PARAMETER_VALUE(0.)), (##1101, PARAMETER_VALUE(1.)), .T., .PARAMETER.); 542 | 543 | #10 = GEOMETRICALLY_BOUNDED_WIREFRAME_SHAPE_REPRESENTATION('',(#11,#15),(#26, #126, #226, #326, #426, #526, #626, #726, #826, #926, #1026, #1126, #1226, #1326, #1426, #1526, #1626, #1726, #1826, #1926, #2026, #2126, #2226, #2326, #2426, #2526, #2626, #2726, #2826, #2926, #3026, #3126, #3226, #3326, #3426, #3526, #3626, #3726, #3826, #3926, #4026, #4126, #4226, #4326, #4426, #4526, #4626, #4726, #4826, #4926, #5026, #5126, #5226, #5326, #5426, #5526, #5626, #5726, #5826, #5926, #6026, #6126, #6226, #6326, #6426, #6526, #6626, #6726, #6826, #6926, #7026, #7126, #7226, #7326, #7426, #7526, #7626, #7726, #7826, #7926, #8026, #8126, #8226, #8326, #8426, #8526, #8626, #8726, #8826, #8926, #9026, #9126, #9226, #9326, #9426, #9526, #9626, #9726, #9826, #9926, #10026, #10126, #10226, #10326, #10426, #10526, #10626, #10726, #10826)); 544 | #15 = GEOMETRIC_CURVE_SET('',(#26, #126, #226, #326, #426, #526, #626, #726, #826, #926, #1026, #1126, #1226, #1326, #1426, #1526, #1626, #1726, #1826, #1926, #2026, #2126, #2226, #2326, #2426, #2526, #2626, #2726, #2826, #2926, #3026, #3126, #3226, #3326, #3426, #3526, #3626, #3726, #3826, #3926, #4026, #4126, #4226, #4326, #4426, #4526, #4626, #4726, #4826, #4926, #5026, #5126, #5226, #5326, #5426, #5526, #5626, #5726, #5826, #5926, #6026, #6126, #6226, #6326, #6426, #6526, #6626, #6726, #6826, #6926, #7026, #7126, #7226, #7326, #7426, #7526, #7626, #7726, #7826, #7926, #8026, #8126, #8226, #8326, #8426, #8526, #8626, #8726, #8826, #8926, #9026, #9126, #9226, #9326, #9426, #9526, #9626, #9726, #9826, #9926, #10026, #10126, #10226, #10326, #10426, #10526, #10626, #10726, #10826)); 545 | ENDSEC; 546 | END-ISO-10303-21; --------------------------------------------------------------------------------