├── 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 |
10 |
--------------------------------------------------------------------------------
/test/stepsample-line.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
--------------------------------------------------------------------------------
/test/stepsample-curve.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
--------------------------------------------------------------------------------
/test/stepsample-leftcurve.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
--------------------------------------------------------------------------------
/test/stepsample-rightcurve.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
--------------------------------------------------------------------------------
/test/stepsample-3curves.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
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;
--------------------------------------------------------------------------------