diff --git a/CAD/OmnifloCAD/dwg/821104024+0_B10081.dwg b/CAD/OmnifloCAD/dwg/821104024+0_B10081.dwg index e37eb85..14e5ac8 100644 Binary files a/CAD/OmnifloCAD/dwg/821104024+0_B10081.dwg and b/CAD/OmnifloCAD/dwg/821104024+0_B10081.dwg differ diff --git a/CAD/OmnifloCAD/dwg/821104025+0_B10090.dwg b/CAD/OmnifloCAD/dwg/821104025+0_B10090.dwg index 239f0af..5d2e4b0 100644 Binary files a/CAD/OmnifloCAD/dwg/821104025+0_B10090.dwg and b/CAD/OmnifloCAD/dwg/821104025+0_B10090.dwg differ diff --git a/CAD/OmnifloCAD/dwg/821104025+0_B10091.dwg b/CAD/OmnifloCAD/dwg/821104025+0_B10091.dwg index f1b127b..c2f0e7e 100644 Binary files a/CAD/OmnifloCAD/dwg/821104025+0_B10091.dwg and b/CAD/OmnifloCAD/dwg/821104025+0_B10091.dwg differ diff --git a/CAD/OmnifloCAD/dwg/821104026+0_B10071.dwg b/CAD/OmnifloCAD/dwg/821104026+0_B10071.dwg index b6bd74d..c2deb53 100644 Binary files a/CAD/OmnifloCAD/dwg/821104026+0_B10071.dwg and b/CAD/OmnifloCAD/dwg/821104026+0_B10071.dwg differ diff --git a/CAD/OmnifloCAD/dwg/821104027+0_B10080.dwg b/CAD/OmnifloCAD/dwg/821104027+0_B10080.dwg index 20596cf..036d41e 100644 Binary files a/CAD/OmnifloCAD/dwg/821104027+0_B10080.dwg and b/CAD/OmnifloCAD/dwg/821104027+0_B10080.dwg differ diff --git a/CAD/OmnifloCAD/dwg/821104031+0_B10060.dwg b/CAD/OmnifloCAD/dwg/821104031+0_B10060.dwg index 290e3b2..c20a177 100644 Binary files a/CAD/OmnifloCAD/dwg/821104031+0_B10060.dwg and b/CAD/OmnifloCAD/dwg/821104031+0_B10060.dwg differ diff --git a/CAD/OmnifloCAD/dwg/821104031+0_B10070.dwg b/CAD/OmnifloCAD/dwg/821104031+0_B10070.dwg index 67688f9..32e8466 100644 Binary files a/CAD/OmnifloCAD/dwg/821104031+0_B10070.dwg and b/CAD/OmnifloCAD/dwg/821104031+0_B10070.dwg differ diff --git a/CAD/OmnifloCAD/dwg/821104033+0_B10040.dwg b/CAD/OmnifloCAD/dwg/821104033+0_B10040.dwg index afd774d..fd7e8eb 100644 Binary files a/CAD/OmnifloCAD/dwg/821104033+0_B10040.dwg and b/CAD/OmnifloCAD/dwg/821104033+0_B10040.dwg differ diff --git a/CAD/OmnifloCAD/dwg/821104033+0_B10050.dwg b/CAD/OmnifloCAD/dwg/821104033+0_B10050.dwg index 5b1ffba..ee1a961 100644 Binary files a/CAD/OmnifloCAD/dwg/821104033+0_B10050.dwg and b/CAD/OmnifloCAD/dwg/821104033+0_B10050.dwg differ diff --git a/Editor2DLibrary/SSG/shapes/props/821104024+0_B10081.txt b/Editor2DLibrary/SSG/shapes/props/821104024+0_B10081.txt index f707fb9..338d0ab 100644 --- a/Editor2DLibrary/SSG/shapes/props/821104024+0_B10081.txt +++ b/Editor2DLibrary/SSG/shapes/props/821104024+0_B10081.txt @@ -1,92 +1,92 @@ { - "shapeMode": 0, - "name": "APB 110 R 400/67.5 339 mit TEF Innen", - "family": "OFBogen", - "icon": "SSG/shapes/img/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_32px.png", - "iconBig": "SSG/shapes/img/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_64px.png", - "srcSVG": "SSG/shapes/svg/821104024+0_B10081.xml", - "src3D": "SSG/shapes/obj/821104024+0_B10081.stl", - "width": 1992.772, - "height": 1392.387, - "depth": 415.748, - "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", - "connectionPoints": [ - { - "id": "cp1", - "x": 0.0, - "y": 56.957, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp2", - "x": 963.134, - "y": 975.51, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 157.5, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp3", - "x": 144.904, - "y": 327.689, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - }, - { - "id": "cp4", - "x": 725.908, - "y": 865.519, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 157.5, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - } - ], - "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" + "shapeMode": 0, + "name": "APB 110 R 400/67.5 339 mit TEF Innen", + "family": "OFBogen", + "icon": "SSG/shapes/img/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_32px.png", + "iconBig": "SSG/shapes/img/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_64px.png", + "srcSVG": "SSG/shapes/svg/821104024+0_B10081.xml", + "src3D": "SSG/shapes/obj/821104024+0_B10081.stl", + "width": 1992.785, + "height": 1392.3969, + "depth": 415.748, + "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", + "connectionPoints": [ + { + "id": "cp1", + "x": 0.0, + "y": 57.109, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp2", + "x": 963.134, + "y": 978.146, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 157.5, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp3", + "x": 144.905, + "y": 328.576, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + }, + { + "id": "cp4", + "x": 725.909, + "y": 867.86, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 157.5, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + } + ], + "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" } \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/props/821104025+0_B10090.txt b/Editor2DLibrary/SSG/shapes/props/821104025+0_B10090.txt index 8f4b300..b12a86c 100644 --- a/Editor2DLibrary/SSG/shapes/props/821104025+0_B10090.txt +++ b/Editor2DLibrary/SSG/shapes/props/821104025+0_B10090.txt @@ -1,92 +1,92 @@ { - "shapeMode": 0, - "name": "APB 110 R 550/22.5 84 mit TEF Innen", - "family": "OFBogen", - "icon": "SSG/shapes/img/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_32px.png", - "iconBig": "SSG/shapes/img/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_64px.png", - "srcSVG": "SSG/shapes/svg/821104025+0_B10090.xml", - "src3D": "SSG/shapes/obj/821104025+0_B10090.stl", - "width": 2031.648, - "height": 877.059, - "depth": 415.748, - "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", - "connectionPoints": [ - { - "id": "cp1", - "x": 27.908, - "y": 90.272, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp2", - "x": 985.023, - "y": 614.701, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 112.5, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp3", - "x": 0.0, - "y": 519.362, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - }, - { - "id": "cp4", - "x": 767.736, - "y": 871.57, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 112.5, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - } - ], - "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" + "shapeMode": 0, + "name": "APB 110 R 550/22.5 84 mit TEF Innen", + "family": "OFBogen", + "icon": "SSG/shapes/img/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_32px.png", + "iconBig": "SSG/shapes/img/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_64px.png", + "srcSVG": "SSG/shapes/svg/821104025+0_B10090.xml", + "src3D": "SSG/shapes/obj/821104025+0_B10090.stl", + "width": 2031.662, + "height": 877.0624, + "depth": 415.748, + "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", + "connectionPoints": [ + { + "id": "cp1", + "x": 27.908, + "y": 90.664, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp2", + "x": 985.023, + "y": 617.39, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 112.5, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp3", + "x": 0.0, + "y": 521.637, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + }, + { + "id": "cp4", + "x": 767.736, + "y": 875.387, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 112.5, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + } + ], + "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" } \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/props/821104025+0_B10091.txt b/Editor2DLibrary/SSG/shapes/props/821104025+0_B10091.txt index e8c9df3..1a846bc 100644 --- a/Editor2DLibrary/SSG/shapes/props/821104025+0_B10091.txt +++ b/Editor2DLibrary/SSG/shapes/props/821104025+0_B10091.txt @@ -1,92 +1,92 @@ { - "shapeMode": 0, - "name": "APB 110 R 550/22.5 84 mit TEF Aussen", - "family": "OFBogen", - "icon": "SSG/shapes/img/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_32px.png", - "iconBig": "SSG/shapes/img/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_64px.png", - "srcSVG": "SSG/shapes/svg/821104025+0_B10091.xml", - "src3D": "SSG/shapes/obj/821104025+0_B10091.stl", - "width": 2477.704, - "height": 1031.72, - "depth": 415.748, - "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", - "connectionPoints": [ - { - "id": "cp1", - "x": 153.863, - "y": 478.855, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp2", - "x": 938.67, - "y": 924.598, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 112.5, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp3", - "x": 0.0, - "y": 114.143, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - }, - { - "id": "cp4", - "x": 981.733, - "y": 572.478, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 112.5, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - } - ], - "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" + "shapeMode": 0, + "name": "APB 110 R 550/22.5 84 mit TEF Aussen", + "family": "OFBogen", + "icon": "SSG/shapes/img/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_32px.png", + "iconBig": "SSG/shapes/img/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_64px.png", + "srcSVG": "SSG/shapes/svg/821104025+0_B10091.xml", + "src3D": "SSG/shapes/obj/821104025+0_B10091.stl", + "width": 2477.7411, + "height": 1031.7267, + "depth": 415.748, + "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", + "connectionPoints": [ + { + "id": "cp1", + "x": 153.862, + "y": 481.028, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp2", + "x": 938.662, + "y": 928.794, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 112.5, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp3", + "x": 0.0, + "y": 114.661, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + }, + { + "id": "cp4", + "x": 981.721, + "y": 575.076, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 112.5, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + } + ], + "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" } \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/props/821104026+0_B10071.txt b/Editor2DLibrary/SSG/shapes/props/821104026+0_B10071.txt index 4c89c14..caac8fc 100644 --- a/Editor2DLibrary/SSG/shapes/props/821104026+0_B10071.txt +++ b/Editor2DLibrary/SSG/shapes/props/821104026+0_B10071.txt @@ -1,92 +1,92 @@ { - "shapeMode": 0, - "name": "APB 110 R 550/45 232 mit TEF Innen", - "family": "OFBogen", - "icon": "SSG/shapes/img/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_32xp.png", - "iconBig": "SSG/shapes/img/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_64xp.png", - "srcSVG": "SSG/shapes/svg/821104026+0_B10071.xml", - "src3D": "SSG/shapes/obj/821104026+0_B10071.stl", - "width": 2306.032, - "height": 1164.906, - "depth": 415.748, - "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", - "connectionPoints": [ - { - "id": "cp1", - "x": 0.0, - "y": 68.009, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp2", - "x": 975.617, - "y": 927.815, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 135.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp3", - "x": 89.235, - "y": 391.276, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - }, - { - "id": "cp4", - "x": 742.25, - "y": 924.734, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 135.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - } - ], - "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" + "shapeMode": 0, + "name": "APB 110 R 550/45 232 mit TEF Innen", + "family": "OFBogen", + "icon": "SSG/shapes/img/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_32xp.png", + "iconBig": "SSG/shapes/img/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_64xp.png", + "srcSVG": "SSG/shapes/svg/821104026+0_B10071.xml", + "src3D": "SSG/shapes/obj/821104026+0_B10071.stl", + "width": 2306.0485, + "height": 1164.9165, + "depth": 415.748, + "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", + "connectionPoints": [ + { + "id": "cp1", + "x": 0.0, + "y": 68.261, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp2", + "x": 975.617, + "y": 931.281, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 135.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp3", + "x": 89.235, + "y": 392.739, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + }, + { + "id": "cp4", + "x": 742.25, + "y": 928.192, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 135.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + } + ], + "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" } \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/props/821104027+0_B10080.txt b/Editor2DLibrary/SSG/shapes/props/821104027+0_B10080.txt index c78d98e..19a5dfb 100644 --- a/Editor2DLibrary/SSG/shapes/props/821104027+0_B10080.txt +++ b/Editor2DLibrary/SSG/shapes/props/821104027+0_B10080.txt @@ -1,92 +1,92 @@ { - "shapeMode": 0, - "name": "APB 110 R 550/67.5 432 mit TEF Innen", - "family": "OFBogen", - "icon": "SSG/shapes/img/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_32px.png", - "iconBig": "SSG/shapes/img/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_64px.png", - "srcSVG": "SSG/shapes/svg/821104027+0_B10080.xml", - "src3D": "SSG/shapes/obj/821104027+0_B10080.stl", - "width": 2903.015, - "height": 2114.237, - "depth": 415.748, - "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", - "connectionPoints": [ - { - "id": "cp1", - "x": 0.0, - "y": 37.515, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp2", - "x": 974.694, - "y": 983.056, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 157.5, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp3", - "x": 180.84, - "y": 215.834, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - }, - { - "id": "cp4", - "x": 792.42, - "y": 846.37, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 157.5, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - } - ], - "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" + "shapeMode": 0, + "name": "APB 110 R 550/67.5 432 mit TEF Innen", + "family": "OFBogen", + "icon": "SSG/shapes/img/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_32px.png", + "iconBig": "SSG/shapes/img/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_64px.png", + "srcSVG": "SSG/shapes/svg/821104027+0_B10080.xml", + "src3D": "SSG/shapes/obj/821104027+0_B10080.stl", + "width": 2903.0378, + "height": 2114.2511, + "depth": 415.748, + "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", + "connectionPoints": [ + { + "id": "cp1", + "x": 0.0, + "y": 37.61, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp2", + "x": 974.694, + "y": 985.607, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 157.5, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp3", + "x": 180.84, + "y": 216.393, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + }, + { + "id": "cp4", + "x": 792.42, + "y": 848.566, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 157.5, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + } + ], + "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" } \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/props/821104031+0_B10060.txt b/Editor2DLibrary/SSG/shapes/props/821104031+0_B10060.txt index 69efac2..58ab86c 100644 --- a/Editor2DLibrary/SSG/shapes/props/821104031+0_B10060.txt +++ b/Editor2DLibrary/SSG/shapes/props/821104031+0_B10060.txt @@ -1,92 +1,92 @@ { - "shapeMode": 0, - "name": "APB 110 R 630/45 400 mit TEF Aussen", - "family": "OFBogen", - "icon": "SSG/shapes/img/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_32px.png", - "iconBig": "SSG/shapes/img/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_64px.png", - "srcSVG": "SSG/shapes/svg/821104031+0_B10060.xml", - "src3D": "SSG/shapes/obj/821104031+0_B10060.stl", - "width": 3624.064, - "height": 1688.477, - "depth": 415.748, - "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", - "connectionPoints": [ - { - "id": "cp1", - "x": 0.288, - "y": 292.738, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp2", - "x": 903.028, - "y": 962.793, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 135.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp3", - "x": 0.0, - "y": 69.779, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - }, - { - "id": "cp4", - "x": 976.918, - "y": 805.436, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 135.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - } - ], - "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" + "shapeMode": 0, + "name": "APB 110 R 630/45 400 mit TEF Aussen", + "family": "OFBogen", + "icon": "SSG/shapes/img/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_32px.png", + "iconBig": "SSG/shapes/img/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_64px.png", + "srcSVG": "SSG/shapes/svg/821104031+0_B10060.xml", + "src3D": "SSG/shapes/obj/821104031+0_B10060.stl", + "width": 3624.09, + "height": 1688.4881, + "depth": 415.748, + "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", + "connectionPoints": [ + { + "id": "cp1", + "x": 0.288, + "y": 293.926, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp2", + "x": 903.028, + "y": 966.7, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 135.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp3", + "x": 0.0, + "y": 70.062, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + }, + { + "id": "cp4", + "x": 976.918, + "y": 808.704, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 135.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + } + ], + "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" } \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/props/821104031+0_B10070.txt b/Editor2DLibrary/SSG/shapes/props/821104031+0_B10070.txt index c677079..e6773c5 100644 --- a/Editor2DLibrary/SSG/shapes/props/821104031+0_B10070.txt +++ b/Editor2DLibrary/SSG/shapes/props/821104031+0_B10070.txt @@ -1,92 +1,92 @@ { - "shapeMode": 0, - "name": "APB 110 R 630/45 400 mit TEF Innen", - "family": "OFBogen", - "icon": "SSG/shapes/img/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_32px.png", - "iconBig": "SSG/shapes/img/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_64px.png", - "srcSVG": "SSG/shapes/svg/821104031+0_B10070.xml", - "src3D": "SSG/shapes/obj/821104031+0_B10070.stl", - "width": 3329.52, - "height": 1566.588, - "depth": 415.748, - "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", - "connectionPoints": [ - { - "id": "cp1", - "x": 0.514, - "y": 50.557, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp2", - "x": 983.115, - "y": 772.777, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 135.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp3", - "x": 0.0, - "y": 290.871, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - }, - { - "id": "cp4", - "x": 862.028, - "y": 942.814, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 135.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - } - ], - "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" + "shapeMode": 0, + "name": "APB 110 R 630/45 400 mit TEF Innen", + "family": "OFBogen", + "icon": "SSG/shapes/img/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_32px.png", + "iconBig": "SSG/shapes/img/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_64px.png", + "srcSVG": "SSG/shapes/svg/821104031+0_B10070.xml", + "src3D": "SSG/shapes/obj/821104031+0_B10070.stl", + "width": 3329.5461, + "height": 1566.5987, + "depth": 415.748, + "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", + "connectionPoints": [ + { + "id": "cp1", + "x": 0.513, + "y": 50.758, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp2", + "x": 983.113, + "y": 775.877, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 135.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp3", + "x": 0.0, + "y": 292.039, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + }, + { + "id": "cp4", + "x": 862.027, + "y": 946.6, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 135.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + } + ], + "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" } \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/props/821104033+0_B10040.txt b/Editor2DLibrary/SSG/shapes/props/821104033+0_B10040.txt index b557749..2490cba 100644 --- a/Editor2DLibrary/SSG/shapes/props/821104033+0_B10040.txt +++ b/Editor2DLibrary/SSG/shapes/props/821104033+0_B10040.txt @@ -1,92 +1,92 @@ -{ - "shapeMode": 0, - "name": "APB 110 R 630/90 800/800 mit TEF Aussen", - "family": "TEFBogen", - "icon": "SSG/shapes/img/APB_110_R630_90_800_800_821104033_mit_TEF_R725_32px.png", - "iconBig": "SSG/shapes/img/APB_110_R630_90_800_800_821104033_mit_TEF_R725_64px.png", - "srcSVG": "SSG/shapes/svg/821104033+0_B10040.xml", - "src3D": "SSG/shapes/obj/821104033+0_B10040.stl", - "width": 3519.848, - "height": 3519.848, - "depth": 415.748, - "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", - "connectionPoints": [ - { - "id": "cp1", - "x": 0.0, - "y": 140.986, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp2", - "x": 859.014, - "y": 1000.0, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 180.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp3", - "x": 0.0, - "y": 33.609, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - }, - { - "id": "cp4", - "x": 966.391, - "y": 1000.0, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 180.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - } - ], - "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" +{ + "shapeMode": 0, + "name": "APB 110 R 630/90 800/800 mit TEF Aussen", + "family": "TEFBogen", + "icon": "SSG/shapes/img/APB_110_R630_90_800_800_821104033_mit_TEF_R725_32px.png", + "iconBig": "SSG/shapes/img/APB_110_R630_90_800_800_821104033_mit_TEF_R725_64px.png", + "srcSVG": "SSG/shapes/svg/821104033+0_B10040.xml", + "src3D": "SSG/shapes/obj/821104033+0_B10040.stl", + "width": 3519.874, + "height": 3519.874, + "depth": 415.748, + "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", + "connectionPoints": [ + { + "id": "cp1", + "x": 0.0, + "y": 140.986, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp2", + "x": 859.014, + "y": 1000.0, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 180.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp3", + "x": 0.0, + "y": 33.609, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + }, + { + "id": "cp4", + "x": 966.391, + "y": 1000.0, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 180.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + } + ], + "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" } \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/props/821104033+0_B10050.txt b/Editor2DLibrary/SSG/shapes/props/821104033+0_B10050.txt index cb59617..43c0c33 100644 --- a/Editor2DLibrary/SSG/shapes/props/821104033+0_B10050.txt +++ b/Editor2DLibrary/SSG/shapes/props/821104033+0_B10050.txt @@ -1,92 +1,92 @@ -{ - "shapeMode": 0, - "name": "APB 110 R 630/90 800/800 mit TEF Innen", - "family": "TEFBogen", - "icon": "SSG/shapes/img/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_32px.png", - "iconBig": "SSG/shapes/img/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_64px.png", - "srcSVG": "SSG/shapes/svg/821104033+0_B10050.xml", - "src3D": "SSG/shapes/obj/821104033+0_B10050.stl", - "width": 3103.121, - "height": 3103.121, - "depth": 415.748, - "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", - "connectionPoints": [ - { - "id": "cp1", - "x": 0.0, - "y": 25.626, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp2", - "x": 974.374, - "y": 1000.0, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 180.0, - "linkClass": "Omniflo", - "label": "", - "isDimension": true - }, - { - "id": "cp3", - "x": 0.0, - "y": 147.423, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 270.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - }, - { - "id": "cp4", - "x": 852.577, - "y": 1000.0, - "z": 0.0, - "xMin": "", - "xMax": "", - "xStep": "", - "yMin": "", - "yMax": "", - "yStep": "", - "zMin": "", - "zMax": "", - "zStep": "", - "direction": 180.0, - "linkClass": "OmnifloTEF", - "label": "", - "isDimension": true - } - ], - "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" +{ + "shapeMode": 0, + "name": "APB 110 R 630/90 800/800 mit TEF Innen", + "family": "TEFBogen", + "icon": "SSG/shapes/img/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_32px.png", + "iconBig": "SSG/shapes/img/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_64px.png", + "srcSVG": "SSG/shapes/svg/821104033+0_B10050.xml", + "src3D": "SSG/shapes/obj/821104033+0_B10050.stl", + "width": 3103.1399, + "height": 3103.1399, + "depth": 415.748, + "behaviour": "(NOSTRETCH)(NOSTRETCHONVIEW)(NOROTATE)(NOROTATEONVIEW)(CONTAINER)(HIDEDIMENSIONS)(HIDEROTATION)(HIDEPIN)(ALWAYSFRONT)(ORIGIN=CENTER)", + "connectionPoints": [ + { + "id": "cp1", + "x": 0.0, + "y": 25.625, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp2", + "x": 974.375, + "y": 1000.0, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 180.0, + "linkClass": "Omniflo", + "label": "", + "isDimension": true + }, + { + "id": "cp3", + "x": 0.0, + "y": 147.422, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 270.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + }, + { + "id": "cp4", + "x": 852.578, + "y": 1000.0, + "z": 0.0, + "xMin": "", + "xMax": "", + "xStep": "", + "yMin": "", + "yMax": "", + "yStep": "", + "zMin": "", + "zMax": "", + "zStep": "", + "direction": 180.0, + "linkClass": "OmnifloTEF", + "label": "", + "isDimension": true + } + ], + "eventClass": "OnDoubleclick,OnPasted,OnInserted,OnLinked,OnRemoved" } \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/svg/821104024+0_B10081.xml b/Editor2DLibrary/SSG/shapes/svg/821104024+0_B10081.xml index 12661df..9f55094 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104024+0_B10081.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104024+0_B10081.xml @@ -1,36 +1,30 @@ - - - - - - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/svg/821104025+0_B10090.xml b/Editor2DLibrary/SSG/shapes/svg/821104025+0_B10090.xml index 32a2d30..e6260e3 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104025+0_B10090.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104025+0_B10090.xml @@ -1,36 +1,28 @@ - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + - - - - - - - - \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/svg/821104025+0_B10091.xml b/Editor2DLibrary/SSG/shapes/svg/821104025+0_B10091.xml index 09ce1e3..4396e83 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104025+0_B10091.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104025+0_B10091.xml @@ -1,36 +1,28 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/svg/821104026+0_B10071.xml b/Editor2DLibrary/SSG/shapes/svg/821104026+0_B10071.xml index bc124d3..9327226 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104026+0_B10071.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104026+0_B10071.xml @@ -1,27 +1,29 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Editor2DLibrary/SSG/shapes/svg/821104027+0_B10080.xml b/Editor2DLibrary/SSG/shapes/svg/821104027+0_B10080.xml index 308b70f..4d97df5 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104027+0_B10080.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104027+0_B10080.xml @@ -1,36 +1,30 @@ - - - - - - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/svg/821104031+0_B10060.xml b/Editor2DLibrary/SSG/shapes/svg/821104031+0_B10060.xml index 149f2c2..8cf1186 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104031+0_B10060.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104031+0_B10060.xml @@ -1,36 +1,30 @@ - - - - - - - + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/svg/821104031+0_B10070.xml b/Editor2DLibrary/SSG/shapes/svg/821104031+0_B10070.xml index 5e2c1ea..7e07b7e 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104031+0_B10070.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104031+0_B10070.xml @@ -1,36 +1,39 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/svg/821104033+0_B10040.xml b/Editor2DLibrary/SSG/shapes/svg/821104033+0_B10040.xml index 9ba4067..ad07fa8 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104033+0_B10040.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104033+0_B10040.xml @@ -1,26 +1,30 @@ - - - - - - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - + + + + + + \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/svg/821104033+0_B10050.xml b/Editor2DLibrary/SSG/shapes/svg/821104033+0_B10050.xml index bca330a..91ce1c5 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104033+0_B10050.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104033+0_B10050.xml @@ -1,26 +1,30 @@ - - - - - - - + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - + + + + + + \ No newline at end of file diff --git a/Editor2DLibrary/SSG/shapes/svg/821104043.xml b/Editor2DLibrary/SSG/shapes/svg/821104043.xml index 86f1847..567b3ad 100644 --- a/Editor2DLibrary/SSG/shapes/svg/821104043.xml +++ b/Editor2DLibrary/SSG/shapes/svg/821104043.xml @@ -1,7 +1,7 @@ - + diff --git a/SVGs/Omniflo/OFBogen/Optimiert/APB_110_R650_180_L_150_821104043.svg b/SVGs/Omniflo/OFBogen/Optimiert/APB_110_R650_180_L_150_821104043.svg index 6d05a49..177df52 100644 --- a/SVGs/Omniflo/OFBogen/Optimiert/APB_110_R650_180_L_150_821104043.svg +++ b/SVGs/Omniflo/OFBogen/Optimiert/APB_110_R650_180_L_150_821104043.svg @@ -1,5 +1,5 @@ - + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/821104024+0_B10081_TEFBogen_67_5_R250_optimized.svg b/SVGs/Omniflo/TEFBogen/Optimiert/821104024+0_B10081_TEFBogen_67_5_R250_optimized.svg new file mode 100644 index 0000000..cba1563 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Optimiert/821104024+0_B10081_TEFBogen_67_5_R250_optimized.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/821104025+0_B10090_TEFBogen_22_5_R450_optimized.svg b/SVGs/Omniflo/TEFBogen/Optimiert/821104025+0_B10090_TEFBogen_22_5_R450_optimized.svg new file mode 100644 index 0000000..41519be --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Optimiert/821104025+0_B10090_TEFBogen_22_5_R450_optimized.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/821104025+0_B10091_TEFBogen_22_5_R650_optimized.svg b/SVGs/Omniflo/TEFBogen/Optimiert/821104025+0_B10091_TEFBogen_22_5_R650_optimized.svg new file mode 100644 index 0000000..2de3210 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Optimiert/821104025+0_B10091_TEFBogen_22_5_R650_optimized.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/821104026+0_B10071_TEFBogen_45_R450_optimized.svg b/SVGs/Omniflo/TEFBogen/Optimiert/821104026+0_B10071_TEFBogen_45_R450_optimized.svg new file mode 100644 index 0000000..31c3a17 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Optimiert/821104026+0_B10071_TEFBogen_45_R450_optimized.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/821104027+0_B10080_TEFBogen_67_5_R400_optimized.svg b/SVGs/Omniflo/TEFBogen/Optimiert/821104027+0_B10080_TEFBogen_67_5_R400_optimized.svg new file mode 100644 index 0000000..d0fd913 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Optimiert/821104027+0_B10080_TEFBogen_67_5_R400_optimized.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/821104031+0_B10060_TEFBogen_45_R725_optimized.svg b/SVGs/Omniflo/TEFBogen/Optimiert/821104031+0_B10060_TEFBogen_45_R725_optimized.svg new file mode 100644 index 0000000..b74727e --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Optimiert/821104031+0_B10060_TEFBogen_45_R725_optimized.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/821104031+0_B10070_TEFBogen_45_R535_optimized.svg b/SVGs/Omniflo/TEFBogen/Optimiert/821104031+0_B10070_TEFBogen_45_R535_optimized.svg new file mode 100644 index 0000000..6d054c6 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Optimiert/821104031+0_B10070_TEFBogen_45_R535_optimized.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/821104033+0_B10040_TEFBogen_90_R725_optimized.svg b/SVGs/Omniflo/TEFBogen/Optimiert/821104033+0_B10040_TEFBogen_90_R725_optimized.svg new file mode 100644 index 0000000..dc1bb16 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Optimiert/821104033+0_B10040_TEFBogen_90_R725_optimized.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/821104033+0_B10050_TEFBogen_90_R535_optimized.svg b/SVGs/Omniflo/TEFBogen/Optimiert/821104033+0_B10050_TEFBogen_90_R535_optimized.svg new file mode 100644 index 0000000..0965779 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Optimiert/821104033+0_B10050_TEFBogen_90_R535_optimized.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_optimiert1.svg b/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_optimiert1.svg deleted file mode 100644 index 9ab3528..0000000 --- a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_optimiert1.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_optimiert1.svg b/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_optimiert1.svg deleted file mode 100644 index 15a669f..0000000 --- a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_optimiert1.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_optimiert1.svg b/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_optimiert1.svg deleted file mode 100644 index fdc4e77..0000000 --- a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_optimiert1.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_optimiert1.svg b/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_optimiert1.svg deleted file mode 100644 index b2fc8cb..0000000 --- a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_optimiert1.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_optimiert1.svg b/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_optimiert1.svg deleted file mode 100644 index e23d940..0000000 --- a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_optimiert1.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_optimiert1.svg b/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_optimiert1.svg deleted file mode 100644 index f3404be..0000000 --- a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_optimiert1.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_optimiert1.svg b/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_optimiert1.svg deleted file mode 100644 index 2d69e43..0000000 --- a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_optimiert1.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_90_800_800_821104033_mit_0_B10040_TEFBogen_90_R725_optimiert1.svg b/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_90_800_800_821104033_mit_0_B10040_TEFBogen_90_R725_optimiert1.svg deleted file mode 100644 index f86264f..0000000 --- a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_90_800_800_821104033_mit_0_B10040_TEFBogen_90_R725_optimiert1.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_optimiert1.svg b/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_optimiert1.svg deleted file mode 100644 index 8d13535..0000000 --- a/SVGs/Omniflo/TEFBogen/Optimiert/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_optimiert1.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Original/821104024+0_B10081_TEFBogen_67_5_R250_new.svg b/SVGs/Omniflo/TEFBogen/Original/821104024+0_B10081_TEFBogen_67_5_R250_new.svg new file mode 100644 index 0000000..bd28292 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Original/821104024+0_B10081_TEFBogen_67_5_R250_new.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Original/821104025+0_B10090_TEFBogen_22_5_R450_new.svg b/SVGs/Omniflo/TEFBogen/Original/821104025+0_B10090_TEFBogen_22_5_R450_new.svg new file mode 100644 index 0000000..df154aa --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Original/821104025+0_B10090_TEFBogen_22_5_R450_new.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Original/821104025+0_B10091_TEFBogen_22_5_R650_new.svg b/SVGs/Omniflo/TEFBogen/Original/821104025+0_B10091_TEFBogen_22_5_R650_new.svg new file mode 100644 index 0000000..e787bf9 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Original/821104025+0_B10091_TEFBogen_22_5_R650_new.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Original/821104026+0_B10071_TEFBogen_45_R450_new.svg b/SVGs/Omniflo/TEFBogen/Original/821104026+0_B10071_TEFBogen_45_R450_new.svg new file mode 100644 index 0000000..93c16e6 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Original/821104026+0_B10071_TEFBogen_45_R450_new.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Original/821104027+0_B10080_TEFBogen_67_5_R400_new.svg b/SVGs/Omniflo/TEFBogen/Original/821104027+0_B10080_TEFBogen_67_5_R400_new.svg new file mode 100644 index 0000000..5c97985 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Original/821104027+0_B10080_TEFBogen_67_5_R400_new.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Original/821104031+0_B10060_TEFBogen_45_R725_new.svg b/SVGs/Omniflo/TEFBogen/Original/821104031+0_B10060_TEFBogen_45_R725_new.svg new file mode 100644 index 0000000..a7f8f83 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Original/821104031+0_B10060_TEFBogen_45_R725_new.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Original/821104031+0_B10070_TEFBogen_45_R535_new.svg b/SVGs/Omniflo/TEFBogen/Original/821104031+0_B10070_TEFBogen_45_R535_new.svg new file mode 100644 index 0000000..d0fb43c --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Original/821104031+0_B10070_TEFBogen_45_R535_new.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Original/821104033+0_B10040_TEFBogen_90_R725_new.svg b/SVGs/Omniflo/TEFBogen/Original/821104033+0_B10040_TEFBogen_90_R725_new.svg new file mode 100644 index 0000000..12dc01f --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Original/821104033+0_B10040_TEFBogen_90_R725_new.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Original/821104033+0_B10050_TEFBogen_90_R535_new.svg b/SVGs/Omniflo/TEFBogen/Original/821104033+0_B10050_TEFBogen_90_R535_new.svg new file mode 100644 index 0000000..61063f3 --- /dev/null +++ b/SVGs/Omniflo/TEFBogen/Original/821104033+0_B10050_TEFBogen_90_R535_new.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGs/Omniflo/TEFBogen/Original/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_new.svg b/SVGs/Omniflo/TEFBogen/Original/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_new.svg deleted file mode 100644 index 772c725..0000000 --- a/SVGs/Omniflo/TEFBogen/Original/APB_110_R400_67_5_339_821104024_mit_0_B10081_TEFBogen_67_5_R250_new.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_new.svg b/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_new.svg deleted file mode 100644 index e560298..0000000 --- a/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_22_5_84_821104025_mit_0_B10090_TEFBogen_22_5_R450_new.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_new.svg b/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_new.svg deleted file mode 100644 index b4fde50..0000000 --- a/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_22_5_84_821104025_mit_0_B10091_TEFBogen_22_5_R650_new.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_new.svg b/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_new.svg deleted file mode 100644 index 77e296d..0000000 --- a/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_45_232_821104026_mit_0_B10071_TEFBogen_45_R450_new.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_new.svg b/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_new.svg deleted file mode 100644 index 6f68269..0000000 --- a/SVGs/Omniflo/TEFBogen/Original/APB_110_R550_67_5_432_821104027_mit_0_B10080_TEFBogen_67_5_R400_new.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_new.svg b/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_new.svg deleted file mode 100644 index 80ec7af..0000000 --- a/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_45_400_821104031_mit_0_B10060_TEFBogen_45_R725_new.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_new.svg b/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_new.svg deleted file mode 100644 index 95a19d8..0000000 --- a/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_45_400_821104031_mit_0_B10070_TEFBogen_45_R535_new.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_90_800_800_821104033_mit_0_B10040_TEFBogen_90_R725_new.svg b/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_90_800_800_821104033_mit_0_B10040_TEFBogen_90_R725_new.svg deleted file mode 100644 index 57c0d09..0000000 --- a/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_90_800_800_821104033_mit_0_B10040_TEFBogen_90_R725_new.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_new.svg b/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_new.svg deleted file mode 100644 index 98ede57..0000000 --- a/SVGs/Omniflo/TEFBogen/Original/APB_110_R630_90_800_800_821104033_mit_0_B10050_TEFBogen_90_R535_new.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SVGs/Omniflo/bin/02_svg_optimzier_OFBogen.bat b/SVGs/Omniflo/bin/02_svg_optimzier_OFBogen.bat index 7d24a4b..6012e37 100644 --- a/SVGs/Omniflo/bin/02_svg_optimzier_OFBogen.bat +++ b/SVGs/Omniflo/bin/02_svg_optimzier_OFBogen.bat @@ -19,7 +19,7 @@ echo "[DEBUG] Output_PATH: %RD_CONF_OUTPUT_OFBOGEN%" python %OFBogen_PATH%\02_svg_step1_convert_polylines_to_lines.py -python %OFBogen_PATH%\02_svg_step2_find_and_mark_auxiliary_lines.py +::python %OFBogen_PATH%\02_svg_step2_find_and_mark_auxiliary_lines.py python %OFBogen_PATH%\02_svg_step3_scaler.py python %OFBogen_PATH%\02_svg_step4_format_optimization.py diff --git a/SVGs/Omniflo/bin/02_svg_optimzier_TEFBogen.bat b/SVGs/Omniflo/bin/02_svg_optimzier_TEFBogen.bat new file mode 100644 index 0000000..901db41 --- /dev/null +++ b/SVGs/Omniflo/bin/02_svg_optimzier_TEFBogen.bat @@ -0,0 +1,33 @@ +@echo off +call setenv.bat +setlocal + + +:: Check if Python is available +where python >nul 2>&1 +if %ERRORLEVEL% neq 0 ( + echo Error: Python is not found in your PATH + pause + exit /b 1 +) + +:: Run the Python script +echo Running omnfilo Bogen SVG... + +echo "[DEBUG] TEFBogen_PATH: %TEFBogen_PATH%" +echo "[DEBUG] Output_PATH: %RD_CONF_OUTPUT_TEFBOGEN%" + + +python %TEFBogen_PATH%\02_svg_step1_convert_polylines_to_lines.py +:: python %TEFBogen_PATH%\02_svg_step2_find_and_mark_auxiliary_lines.py +python %TEFBogen_PATH%\02_svg_step3_scaler.py +python %TEFBogen_PATH%\02_svg_step4_format_optimization.py + +:: Check if Python script succeeded +if %ERRORLEVEL% equ 0 ( + echo SVG optimization completed successfully +) else ( + echo SVG optimization failed with error %ERRORLEVEL% +) + +pause \ No newline at end of file diff --git a/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_OFBogen.bat b/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_OFBogen.bat index 52fc2b0..19448a7 100644 --- a/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_OFBogen.bat +++ b/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_OFBogen.bat @@ -20,4 +20,10 @@ echo "[DEBUG] RD_CONF_OUTPUT_OFBOGEN: %RD_CONF_OUTPUT_OFBOGEN%" python %OFBogen_PATH%\03_convert_svgs_to_xml_and_update_xml_path_in_props.py +:: Check if Python script succeeded +if %ERRORLEVEL% equ 0 ( + echo SVG importation completed successfully +) else ( + echo SVG importation failed with error %ERRORLEVEL% +) pause \ No newline at end of file diff --git a/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_OFWeiche.bat b/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_OFWeiche.bat index 56bca1b..c0120e1 100644 --- a/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_OFWeiche.bat +++ b/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_OFWeiche.bat @@ -20,4 +20,10 @@ echo "[DEBUG] RD_CONF_OUTPUT_OFWEICHEN: %RD_CONF_OUTPUT_OFWEICHEN%" python %OFWeiche_PATH%\03_convert_svgs_to_xml_and_update_xml_path_in_props.py +:: Check if Python script succeeded +if %ERRORLEVEL% equ 0 ( + echo SVG importation completed successfully +) else ( + echo SVG importation failed with error %ERRORLEVEL% +) pause \ No newline at end of file diff --git a/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_TEFBogen.bat b/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_TEFBogen.bat new file mode 100644 index 0000000..ebfdcca --- /dev/null +++ b/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_TEFBogen.bat @@ -0,0 +1,31 @@ +@echo off +call setenv.bat +setlocal + +:: Check if Python is available +where python >nul 2>&1 +if %ERRORLEVEL% neq 0 ( + echo Error: Python is not found in your PATH + pause + exit /b 1 +) + +:: Run the Python script +echo Running convert svgs to xml and update xml path in Props... + +echo "[DEBUG] TEFBogen_PATH: %TEFBogen_PATH%" +echo "[DEBUG] PROPS_PATH: %PROPS_PATH%" +echo "[DEBUG] SVG_PATH: %SVG_PATH%" +echo "[DEBUG] RD_CONF_OUTPUT_TEFBOGEN: %RD_CONF_OUTPUT_TEFBOGEN%" + +python %TEFBogen_PATH%\03_convert_svgs_to_xml_and_update_xml_path_in_props.py +python %TEFBogen_PATH%\03_TEFBogen_SVG_XML_Modifier_Script.py + +:: Check if Python script succeeded +if %ERRORLEVEL% equ 0 ( + echo SVG importation completed successfully +) else ( + echo SVG importation failed with error %ERRORLEVEL% +) + +pause \ No newline at end of file diff --git a/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_TEFWeiche.bat b/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_TEFWeiche.bat index 5b66775..f04a362 100644 --- a/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_TEFWeiche.bat +++ b/SVGs/Omniflo/bin/03_update_xml_and_props_in_SSGLib_TEFWeiche.bat @@ -19,6 +19,12 @@ echo "[DEBUG] SVG_PATH: %SVG_PATH%" echo "[DEBUG] RD_CONF_OUTPUT_TEFWEICHEN: %RD_CONF_OUTPUT_TEFWEICHEN%" python %TEFWeiche_PATH%\03_convert_svgs_to_xml_and_update_xml_path_in_props.py -python %TEFWeiche_PATH%\04_TEFWEICHE_SVG_XML_Modifier_Script.py +python %TEFWeiche_PATH%\03_TEFWEICHE_SVG_XML_Modifier_Script.py +:: Check if Python script succeeded +if %ERRORLEVEL% equ 0 ( + echo SVG importation completed successfully +) else ( + echo SVG importation failed with error %ERRORLEVEL% +) pause \ No newline at end of file diff --git a/SVGs/Omniflo/bin/setenv.bat b/SVGs/Omniflo/bin/setenv.bat index 4e91fc5..6d9ceaf 100644 --- a/SVGs/Omniflo/bin/setenv.bat +++ b/SVGs/Omniflo/bin/setenv.bat @@ -9,6 +9,7 @@ set RD_CONF_WORK=%RD_CONF%\work set RD_CONF_LIB=%RD_CONF%\lib set "OFBogen_PATH=%RD_CONF%\lib\OFBogen" +set "TEFBogen_PATH=%RD_CONF%\lib\TEFBogen" set "OFWeiche_PATH=%RD_CONF%\lib\OFWeiche" set "TEFWeiche_PATH=%RD_CONF%\lib\TEFWeiche" @@ -16,7 +17,9 @@ set "TEFWeiche_PATH=%RD_CONF%\lib\TEFWeiche" set "PROPS_PATH=C:\Program Files\RuleDesigner\RDConfigurator Fusion\WebApi\Editor2D\SSG\shapes\props" set "SVG_PATH=C:\Program Files\RuleDesigner\RDConfigurator Fusion\WebApi\Editor2D\SSG\shapes\svg" +set "JSON_PATH_OFBOGEN=%OFBogen_PATH%\json" set "JSON_PATH_OFWEICHE=%OFWeiche_PATH%\json" +set "JSON_PATH_TEFBOGEN=%TEFBogen_PATH%\json" set "JSON_PATH_TEFWEICHE=%TEFWeiche_PATH%\json" diff --git a/SVGs/Omniflo/lib/OFBogen/02_svg_step1_convert_polylines_to_lines.py b/SVGs/Omniflo/lib/OFBogen/02_svg_step1_convert_polylines_to_lines.py index 482b6ca..ecf04d0 100644 --- a/SVGs/Omniflo/lib/OFBogen/02_svg_step1_convert_polylines_to_lines.py +++ b/SVGs/Omniflo/lib/OFBogen/02_svg_step1_convert_polylines_to_lines.py @@ -4,7 +4,7 @@ import os import re import xml.etree.ElementTree as ET from xml.dom import minidom -import argparse +import shutil def analyze_and_normalize_path(d, path_type, path_id=""): """Strictly normalize path direction and generate detailed report""" @@ -365,6 +365,18 @@ def batch_process_svgs(input_dir, output_dir): print("\nProcessing summary:") print(f"Successfully processed: {success_count} files") print(f"Failed to process: {failure_count} files") +def clear_output_dir(path: str): + + os.makedirs(path, exist_ok=True) + for filename in os.listdir(path): + file_path = os.path.join(path, filename) + try: + if os.path.isdir(file_path): + shutil.rmtree(file_path) # 删除目录 + elif os.path.isfile(file_path) or os.path.islink(file_path): + os.unlink(file_path) # 删除文件或符号链接 + except Exception as e: + print(f"Failed to delete {file_path}. Reason: {e}") if __name__ == '__main__': input_dir = os.environ.get('RD_CONF_OFBOGEN') @@ -377,7 +389,12 @@ if __name__ == '__main__': if not os.path.exists(input_dir): print(f"Error: Input directory '{input_dir}' does not exist") exit(1) - + # 确保输出目录存在 + os.makedirs(output_dir, exist_ok=True) + + # 清空 output_dir + clear_output_dir(output_dir) + print(f"Starting SVG file processing, working directory: {input_dir}") print("=" * 50) diff --git a/SVGs/Omniflo/lib/OFBogen/02_svg_step2_find_and_mark_auxiliary_lines.py b/SVGs/Omniflo/lib/OFBogen/02_svg_step2_find_and_mark_auxiliary_lines.py deleted file mode 100644 index 61e56eb..0000000 --- a/SVGs/Omniflo/lib/OFBogen/02_svg_step2_find_and_mark_auxiliary_lines.py +++ /dev/null @@ -1,247 +0,0 @@ -import os -from lxml import etree -import re -from math import sqrt, isclose -from collections import defaultdict - -# Constants -WEICHEN_PROFILE_WIDTH = 42.000 -L_R_TARGET_LENGTH = 55.7237 -DELTA_TARGET_LENGTH = 53.5437 -MATCH_TOLERANCE = 0.1 # Matching tolerance 0.1mm - -def process_svg_files(directory): - print(f"🔍 Scanning directory: {directory}") - print("-" * 60) - - result_stats = { - 'total_files': 0, - 'L_R_files': {'with_pairs': [], 'no_pairs': [], 'excess_pairs': []}, - 'Delta_files': {'with_triples': [], 'no_triples': [], 'excess_triples': []} - } - - for filename in os.listdir(directory): - if not filename.endswith('.svg'): - continue - - filepath = os.path.join(directory, filename) - result_stats['total_files'] += 1 - - if '_L_' in filename or '_R_' in filename: - print(f"\n📄 Processing L/R file: {filename}") - process_lr_file(filepath, filename, result_stats) - elif 'DeltaWeiche' in filename: - print(f"\n📄 Processing DeltaWeiche file: {filename}") - process_delta_file(filepath, filename, result_stats) - - # Print final statistics - print("\n" + "="*60) - print("📊 Final processing statistics:") - print(f"Total files processed: {result_stats['total_files']}") - - print("\nL/R type files results:") - print(f"✅ Files with matching path pairs: {len(result_stats['L_R_files']['with_pairs'])}") - print(f" {result_stats['L_R_files']['with_pairs']}") - print(f"⚠️ Files with no matching paths: {len(result_stats['L_R_files']['no_pairs'])}") - print(f" {result_stats['L_R_files']['no_pairs']}") - print(f"❌ Files with >2 matching paths: {len(result_stats['L_R_files']['excess_pairs'])}") - print(f" {result_stats['L_R_files']['excess_pairs']}") - - print("\nDeltaWeiche type files results:") - print(f"✅ Files with matching path triples: {len(result_stats['Delta_files']['with_triples'])}") - print(f" {result_stats['Delta_files']['with_triples']}") - print(f"⚠️ Files with no matching paths: {len(result_stats['Delta_files']['no_triples'])}") - print(f" {result_stats['Delta_files']['no_triples']}") - print(f"❌ Files with ≠3 matching paths: {len(result_stats['Delta_files']['excess_triples'])}") - print(f" {result_stats['Delta_files']['excess_triples']}") - - print("\n✨ Processing complete!") - -def process_lr_file(filepath, filename, stats): - try: - tree = etree.parse(filepath) - root = tree.getroot() - - # Find all straight line paths - straight_lines = find_straight_lines(root) - print(f" 📊 Found {len(straight_lines)} straight paths") - - # Print all straight paths - print("\n 🔍 All straight path details:") - for line in straight_lines: - print(f" Path{line['index']}: ({line['p1'][0]:.2f},{line['p1'][1]:.2f})→" - f"({line['p2'][0]:.2f},{line['p2'][1]:.2f}) length={line['length']:.4f}mm") - - # Group by length - length_groups = group_lines_by_length(straight_lines) - - # Only print groups with exactly 2 paths - print("\n 🔍 Same-length path groups (2 paths):") - perfect_pairs = [group for group in length_groups.values() if len(group) == 2] - for group in perfect_pairs: - print(f" ┌ Length group ({group[0]['length']:.4f}mm, 2 paths)") - for line in group: - print(f" │ Path{line['index']}: ({line['p1'][0]:.2f},{line['p1'][1]:.2f})→" - f"({line['p2'][0]:.2f},{line['p2'][1]:.2f})") - print(" └" + "─" * 40) - - if len(perfect_pairs) == 1: - pair = perfect_pairs[0] - original_length = pair[0]['length'] - scale_factor = WEICHEN_PROFILE_WIDTH / original_length - print(f"\n 🔄 Scaling calculation (based on length {original_length:.4f}mm):") - print(f" Scale factor: {scale_factor:.4f}") - - # Print scaled lengths - print("\n 🔍 Scaled path lengths:") - for line in straight_lines: - scaled_len = line['length'] * scale_factor - print(f" Path{line['index']}: {line['length']:.4f}mm → {scaled_len:.4f}mm") - - # Find path matching target length (within tolerance) - target_path = find_target_path(straight_lines, scale_factor, L_R_TARGET_LENGTH) - if target_path: - target_path['element'].set('style', 'stroke:none;fill:none;') - tree.write(filepath, encoding='utf-8', xml_declaration=True) - print(f"\n ✅ Hid path{target_path['index']} matching target length {L_R_TARGET_LENGTH:.4f}mm (±{MATCH_TOLERANCE}mm)") - stats['L_R_files']['with_pairs'].append(filename) - else: - print(f"\n ❌ No path found matching {L_R_TARGET_LENGTH:.4f}mm (±{MATCH_TOLERANCE}mm)") - stats['L_R_files']['no_pairs'].append(filename) - elif len(perfect_pairs) > 1: - print(f"\n ❗ Found multiple same-length path groups: {[len(g) for g in length_groups.values()]}") - stats['L_R_files']['excess_pairs'].append(filename) - else: - print("\n ❌ No same-length path pairs found") - stats['L_R_files']['no_pairs'].append(filename) - - except Exception as e: - print(f" ❌ Processing failed: {str(e)}") - -def process_delta_file(filepath, filename, stats): - try: - tree = etree.parse(filepath) - root = tree.getroot() - - # Find all straight line paths - straight_lines = find_straight_lines(root) - print(f" 📊 Found {len(straight_lines)} straight paths") - - # Print all straight paths - print("\n 🔍 All straight path details:") - for line in straight_lines: - print(f" Path{line['index']}: ({line['p1'][0]:.2f},{line['p1'][1]:.2f})→" - f"({line['p2'][0]:.2f},{line['p2'][1]:.2f}) length={line['length']:.4f}mm") - - # Group by length - length_groups = group_lines_by_length(straight_lines) - - # Only print groups with exactly 3 paths - print("\n 🔍 Same-length path groups (3 paths):") - perfect_triples = [group for group in length_groups.values() if len(group) == 3] - for group in perfect_triples: - print(f" ┌ Length group ({group[0]['length']:.4f}mm, 3 paths)") - for line in group: - print(f" │ Path{line['index']}: ({line['p1'][0]:.2f},{line['p1'][1]:.2f})→" - f"({line['p2'][0]:.2f},{line['p2'][1]:.2f})") - print(" └" + "─" * 40) - - if len(perfect_triples) == 1: - triple = perfect_triples[0] - original_length = triple[0]['length'] - scale_factor = WEICHEN_PROFILE_WIDTH / original_length - print(f"\n 🔄 Scaling calculation (based on length {original_length:.4f}mm):") - print(f" Scale factor: {scale_factor:.4f}") - - # Print scaled lengths - print("\n 🔍 Scaled path lengths:") - for line in straight_lines: - scaled_len = line['length'] * scale_factor - print(f" Path{line['index']}: {line['length']:.4f}mm → {scaled_len:.4f}mm") - - # Find all paths matching target length (there might be multiple) - target_paths = [line for line in straight_lines - if abs(line['length'] * scale_factor - DELTA_TARGET_LENGTH) < MATCH_TOLERANCE] - - if target_paths: - for target in target_paths: - target['element'].set('style', 'stroke:none;fill:none;') - tree.write(filepath, encoding='utf-8', xml_declaration=True) - print(f"\n ✅ Hid {len(target_paths)} paths matching target length {DELTA_TARGET_LENGTH:.4f}mm (±{MATCH_TOLERANCE}mm):") - for target in target_paths: - print(f" - Path{target['index']}") - stats['Delta_files']['with_triples'].append(filename) - else: - print(f"\n ❌ No path found matching {DELTA_TARGET_LENGTH:.4f}mm (±{MATCH_TOLERANCE}mm)") - stats['Delta_files']['no_triples'].append(filename) - elif len(perfect_triples) > 1: - print(f"\n ❗ Found multiple same-length path groups: {[len(g) for g in length_groups.values()]}") - stats['Delta_files']['excess_triples'].append(filename) - else: - print("\n ❌ No same-length path groups (3 paths) found") - stats['Delta_files']['no_triples'].append(filename) - - except Exception as e: - print(f" ❌ Processing failed: {str(e)}") - -def find_straight_lines(root): - """Find all straight line paths""" - lines = [] - paths = root.xpath('.//svg:path|.//svg:g//svg:path', - namespaces={'svg': 'http://www.w3.org/2000/svg'}) - - for i, path in enumerate(paths, 1): - d = path.get('d', '').strip() - if not d: - continue - - if is_straight_line(d): - length, (p1, p2) = calculate_line_length(d) - if length > 0: - lines.append({ - 'index': i, - 'element': path, - 'length': round(length, 4), # Keep 4 decimal places - 'p1': (round(p1[0], 2), round(p1[1], 2)), # Coordinates rounded to 2 decimals - 'p2': (round(p2[0], 2), round(p2[1], 2)) - }) - return lines - -def group_lines_by_length(lines): - """Group straight paths by length""" - groups = defaultdict(list) - for line in lines: - groups[line['length']].append(line) - return groups - -def find_target_path(lines, scale_factor, target_length): - """Find path that matches target length after scaling (within tolerance)""" - for line in lines: - scaled_length = line['length'] * scale_factor - if abs(scaled_length - target_length) < MATCH_TOLERANCE: - return line - return None - -def is_straight_line(d): - """Check if path is strictly a straight line""" - commands = [cmd[0].upper() for cmd in re.findall('([A-Za-z])', d)] - return len(commands) == 2 and commands[0] == 'M' and commands[1] == 'L' - -def calculate_line_length(d): - """Calculate line length and return endpoints""" - points = [] - for cmd, params in re.findall('([A-Za-z])([^A-Za-z]*)', d): - if cmd.upper() in ('M', 'L'): - coords = [float(p) for p in re.findall('[-+]?\d*\.\d+|[-+]?\d+', params)] - points.append((coords[0], coords[1])) - - if len(points) != 2: - return 0, ((0,0), (0,0)) - - length = sqrt((points[1][0]-points[0][0])**2 + (points[1][1]-points[0][1])**2) - return round(length, 4), (points[0], points[1]) # Length rounded to 4 decimals -if __name__ == '__main__': - # Set SVG files directory path - # svg_directory = r'C:\Users\y.wang\Documents\SSG-Ruledesigner-Konfigurator\SVGs\Omniflo\work' - svg_directory =os.environ.get('RD_CONF_WORK') - process_svg_files(svg_directory) \ No newline at end of file diff --git a/SVGs/Omniflo/lib/OFBogen/02_svg_step3_scaler.py b/SVGs/Omniflo/lib/OFBogen/02_svg_step3_scaler.py index fb0416e..a88facd 100644 --- a/SVGs/Omniflo/lib/OFBogen/02_svg_step3_scaler.py +++ b/SVGs/Omniflo/lib/OFBogen/02_svg_step3_scaler.py @@ -1,8 +1,67 @@ import os import re import xml.etree.ElementTree as ET -from typing import Tuple, List +from typing import Tuple, List,Optional +import math +def arc_to_points(x0, y0, rx, ry, phi, large_arc, sweep, x1, y1, steps=100): + """ + 将SVG弧命令近似为一系列点 + 用公式计算中心和角度范围,然后采样,得到边界安全点 + """ + phi = math.radians(phi) + dx2 = (x0 - x1) / 2.0 + dy2 = (y0 - y1) / 2.0 + cos_phi = math.cos(phi) + sin_phi = math.sin(phi) + # Step 1: Transform to ellipse coordinate system + x_ = cos_phi * dx2 + sin_phi * dy2 + y_ = -sin_phi * dx2 + cos_phi * dy2 + + # Step 2: Correct radii + rx = abs(rx) + ry = abs(ry) + lam = (x_**2)/(rx**2) + (y_**2)/(ry**2) + if lam > 1: + rx *= math.sqrt(lam) + ry *= math.sqrt(lam) + + # Step 3: Compute center + sign = 1 if large_arc != sweep else -1 + coef = sign * math.sqrt( + max(0, ((rx**2 * ry**2) - (rx**2 * y_**2) - (ry**2 * x_**2)) / + ((rx**2 * y_**2) + (ry**2 * x_**2))) + ) + cx_ = coef * (rx * y_) / ry + cy_ = coef * (-ry * x_) / rx + + cx = cos_phi * cx_ - sin_phi * cy_ + (x0 + x1)/2 + cy = sin_phi * cx_ + cos_phi * cy_ + (y0 + y1)/2 + + # Step 4: Compute angles + def angle(u, v): + dot = u[0]*v[0] + u[1]*v[1] + det = u[0]*v[1] - u[1]*v[0] + return math.atan2(det, dot) + + u = ((x_ - cx_) / rx, (y_ - cy_) / ry) + v = ((-x_ - cx_) / rx, (-y_ - cy_) / ry) + + theta1 = angle((1,0), u) + delta_theta = angle(u, v) + if not sweep and delta_theta > 0: + delta_theta -= 2*math.pi + elif sweep and delta_theta < 0: + delta_theta += 2*math.pi + + # Step 5: Sample points along the arc + points = [] + for i in range(steps+1): + t = theta1 + delta_theta * i/steps + x = cx + rx*math.cos(phi)*math.cos(t) - ry*math.sin(phi)*math.sin(t) + y = cy + rx*math.sin(phi)*math.cos(t) + ry*math.cos(phi)*math.sin(t) + points.append((x,y)) + return points def parse_svg_path(d: str) -> List[Tuple[float, float]]: """Extract all coordinates from SVG path data (including curve control points)""" points = [] @@ -31,13 +90,19 @@ def parse_svg_path(d: str) -> List[Tuple[float, float]]: x += current_pos[0]; y += current_pos[1] points.extend([(x1, y1), (x2, y2), (x, y)]) current_pos = (x, y) - elif cmd in ('A', 'a'): # Arc commands (start/end points only) + elif cmd in ('A', 'a'): for i in range(0, len(args), 7): - x, y = args[i+5], args[i+6] + rx, ry, phi, large_arc, sweep, x, y = args[i:i+7] if cmd.islower(): x += current_pos[0] y += current_pos[1] - points.append((x, y)) + arc_points = arc_to_points( + current_pos[0], current_pos[1], + rx, ry, phi, + int(large_arc), int(sweep), + x, y + ) + points.extend(arc_points) current_pos = (x, y) return points @@ -155,4 +220,4 @@ def batch_process_svg(input_dir: str, output_dir: str): if __name__ == '__main__': input_dir = os.environ.get('RD_CONF_WORK') output_dir = os.environ.get('RD_CONF_WORK') - batch_process_svg(input_dir, output_dir) + batch_process_svg(input_dir, output_dir) \ No newline at end of file diff --git a/SVGs/Omniflo/lib/OFWeiche/02_svg_step1_convert_polylines_to_lines.py b/SVGs/Omniflo/lib/OFWeiche/02_svg_step1_convert_polylines_to_lines.py index d295190..8e3721d 100644 --- a/SVGs/Omniflo/lib/OFWeiche/02_svg_step1_convert_polylines_to_lines.py +++ b/SVGs/Omniflo/lib/OFWeiche/02_svg_step1_convert_polylines_to_lines.py @@ -5,6 +5,7 @@ import re import xml.etree.ElementTree as ET from xml.dom import minidom import argparse +import shutil def analyze_and_normalize_path(d, path_type, path_id=""): """Strictly normalize path direction and generate detailed report""" @@ -337,7 +338,18 @@ def optimize_svg(input_path, output_path): print(f"\nProcessing error: {str(e)}") print("="*60) return False - +def clear_output_dir(path: str): + + os.makedirs(path, exist_ok=True) + for filename in os.listdir(path): + file_path = os.path.join(path, filename) + try: + if os.path.isdir(file_path): + shutil.rmtree(file_path) # 删除目录 + elif os.path.isfile(file_path) or os.path.islink(file_path): + os.unlink(file_path) # 删除文件或符号链接 + except Exception as e: + print(f"Failed to delete {file_path}. Reason: {e}") def batch_process_svgs(input_dir, output_dir): if not os.path.exists(output_dir): @@ -416,7 +428,8 @@ if __name__ == '__main__': print(f"file {filename} does not exist") if in_dir: - """Batch process SVG files""" + # 清空 output_dir + clear_output_dir(out_dir) batch_process_svgs(in_dir, out_dir) else: diff --git a/SVGs/Omniflo/lib/TEFBogen/1_process_TEFBogen_json_1.py b/SVGs/Omniflo/lib/TEFBogen/01_props_step1_process_TEFBogen_json.py similarity index 95% rename from SVGs/Omniflo/lib/TEFBogen/1_process_TEFBogen_json_1.py rename to SVGs/Omniflo/lib/TEFBogen/01_props_step1_process_TEFBogen_json.py index 4a6660f..5fe0772 100644 --- a/SVGs/Omniflo/lib/TEFBogen/1_process_TEFBogen_json_1.py +++ b/SVGs/Omniflo/lib/TEFBogen/01_props_step1_process_TEFBogen_json.py @@ -19,7 +19,7 @@ def process_json_file(input_filename, output_filename=None): output_filename: Optional output file path. Auto-generated if not provided """ # Get base path from environment variable - json_base_path = os.environ.get("JSON_PATH","JSON") + json_base_path = os.environ.get("JSON_PATH_TEFBOGEN","JSON") if not json_base_path: print("Error: JSON_PATH environment variable not set") print("Please set JSON_PATH in your .bat file") @@ -101,32 +101,32 @@ def process_json_file(input_filename, output_filename=None): print("\nStep 2: Calculating pixel and SVG dimensions") # 计算 Gruppe_width_px 和 Gruppe_height_px - item["Gruppe_width_px"] = round(float(item["Gruppe_width_mm"]) * 3.7795, 3) - item["Gruppe_height_px"] = round(float(item["Gruppe_height_mm"]) * 3.7795, 3) + item["Gruppe_width_px"] = round(float(item["Gruppe_width_mm"]) * 3.779527592,4) + item["Gruppe_height_px"] = round(float(item["Gruppe_height_mm"]) * 3.779527592, 4) print(f"Calculated Gruppe_width_px: {item['Gruppe_width_px']}") print(f"Calculated Gruppe_height_px: {item['Gruppe_height_px']}") # 比较宽度和高度以确定缩放比例 if float(item["Gruppe_width_mm"]) > float(item["Gruppe_height_mm"]): print("Width is larger, setting calculated_SVG_width to 1000px") - scale = round(1000 / float(item["Gruppe_width_mm"]), 6) + scale = round(1000 / float(item["Gruppe_width_mm"]), 7) item["calculated_SVG_width_px"] = 1000 - item["calculated_SVG_height_px"] = round(float(item["Gruppe_height_mm"]) * scale+3.7795/2, 3) - scale_RD_H = round(1000 / float(item["calculated_SVG_height_px"]), 6) + item["calculated_SVG_height_px"] = round(float(item["Gruppe_height_mm"]) * scale, 4) + scale_RD_H = round(1000 / float(item["calculated_SVG_height_px"]), 7) scale_RD_W = 1 elif float(item["Gruppe_width_mm"]) == float(item["Gruppe_height_mm"]): print("Width = Height") scale = round(1000 / float(item["Gruppe_width_mm"]), 6) item["calculated_SVG_width_px"] = 1000 - item["calculated_SVG_height_px"] = round(float(item["Gruppe_height_mm"]) * scale, 3) - scale_RD_H = round(1000 / float(item["calculated_SVG_height_px"]), 6) + item["calculated_SVG_height_px"] = 1000 + scale_RD_H = 1 scale_RD_W = 1 else: print("Height is larger, setting calculated_SVG_height to 1000px") - scale = round(1000 / float(item["Gruppe_height_mm"]), 6) + scale = round(1000 / float(item["Gruppe_height_mm"]), 7) item["calculated_SVG_height_px"] = 1000 - item["calculated_SVG_width_px"] = round(float(item["Gruppe_width_mm"]) * scale+3.7795/2, 3) - scale_RD_W = round(1000 / float(item["calculated_SVG_width_px"]), 6) + item["calculated_SVG_width_px"] = round(float(item["Gruppe_width_mm"]) * scale, 4) + scale_RD_W = round(1000 / float(item["calculated_SVG_width_px"]), 7) scale_RD_H = 1 print(f"Calculated scale: {scale}") diff --git a/SVGs/Omniflo/lib/TEFBogen/2_update_props_TEF_Boegen_from_json_1.py b/SVGs/Omniflo/lib/TEFBogen/01_props_step2_update_props_TEF_Boegen_from_json.py similarity index 97% rename from SVGs/Omniflo/lib/TEFBogen/2_update_props_TEF_Boegen_from_json_1.py rename to SVGs/Omniflo/lib/TEFBogen/01_props_step2_update_props_TEF_Boegen_from_json.py index 93360c0..7385c75 100644 --- a/SVGs/Omniflo/lib/TEFBogen/2_update_props_TEF_Boegen_from_json_1.py +++ b/SVGs/Omniflo/lib/TEFBogen/01_props_step2_update_props_TEF_Boegen_from_json.py @@ -53,8 +53,8 @@ def process_files(json_file_path, txt_files_dir): for cp in txt_content["connectionPoints"]} # Update width and height - new_width = round(json_item["Gruppe_width_px"], 3) - new_height = round(json_item["Gruppe_height_px"], 3) + new_width = round(json_item["Gruppe_width_px"], 4) + new_height = round(json_item["Gruppe_height_px"], 4) txt_content["width"] = new_width txt_content["height"] = new_height diff --git a/SVGs/Omniflo/lib/TEFBogen/02_svg_step1_convert_polylines_to_lines.py b/SVGs/Omniflo/lib/TEFBogen/02_svg_step1_convert_polylines_to_lines.py new file mode 100644 index 0000000..4e91a5a --- /dev/null +++ b/SVGs/Omniflo/lib/TEFBogen/02_svg_step1_convert_polylines_to_lines.py @@ -0,0 +1,397 @@ + +import os +import re +import xml.etree.ElementTree as ET +from xml.dom import minidom +import shutil + +def analyze_and_normalize_path(d, path_type, path_id=""): + """Strictly normalize path direction and generate detailed report""" + original_d = d + report = [] + normalized = [] + changed = False + + # First check if path contains any arc commands + if 'A' in d or 'a' in d: + report.append(" Path contains arc commands - leaving unchanged") + return original_d, report, False + # Ensure path starts with M command + if not d.strip().startswith('M'): + d = 'M' + d[1:] if d.startswith('L') else 'M ' + d + report.append(" Fix: Added M command at path start") + changed = True + + # Parse path commands + commands = [] + current_cmd = None + for token in re.split('([A-Za-z])', d): + if not token: + continue + if token in 'MLAZHVCSQTa-z': + current_cmd = token + else: + if current_cmd: + commands.append((current_cmd, token.strip())) + + prev_x, prev_y = None, None + + for cmd, params in commands: + params = [float(p) for p in re.split('[, ]+', params.strip()) if p] + + if cmd == 'M': + if len(params) >= 2: + x, y = params[0], params[1] + normalized.append(f"M {x} {y}") + prev_x, prev_y = x, y + continue + + if path_type == 'Line segment' and cmd == 'L': + if len(params) >= 2 and prev_x is not None: + x, y = params[0], params[1] + need_swap = x < prev_x or (x == prev_x and y < prev_y) + + if need_swap: + new_segment = [f"M {x} {y}", f"L {prev_x} {prev_y}"] + report.append(f" Need to swap start/end → New path: {' '.join(new_segment)}") + normalized = new_segment + changed = True + else: + normalized.append(f"L {x} {y}") + report.append(" Path direction already correct, no changes made") + + prev_x, prev_y = x, y + continue + + if path_type == 'Arc' and cmd == 'A': + if len(params) >= 7 and prev_x is not None: + rx, ry, xrot, large, sweep, x, y = params[0], params[1], params[2], int(params[3]), int(params[4]), params[5], params[6] + + # Force left-to-right clockwise + need_swap = x < prev_x + new_sweep = 1 + + if need_swap: + new_segment = [f"M {x} {y}", f"A {rx} {ry} {xrot} {large} {new_sweep} {prev_x} {prev_y}"] + report.append(f" Need to swap start/end → New path: {' '.join(new_segment)}") + normalized = new_segment + changed = True + else: + if sweep != new_sweep: + new_segment = [f"A {rx} {ry} {xrot} {large} {new_sweep} {x} {y}"] + report.append(f" Need to adjust sweep to 1 → New path: {' '.join(new_segment)}") + normalized.extend(new_segment) + changed = True + else: + normalized.append(f"A {rx} {ry} {xrot} {large} {sweep} {x} {y}") + report.append(" Arc direction already correct, no changes made") + + prev_x, prev_y = x, y + continue + + normalized.append(f"{cmd} {' '.join(map(str, params))}") + + new_d = ' '.join(normalized) + report_header = f"[{path_id}-Analysis] Type: {path_type}" + full_report = [report_header, f"Original path: {original_d}"] + report + + if changed: + full_report.append(f"Modified path: {new_d}") + else: + full_report.append("Path not modified") + + return new_d, '\n'.join(full_report) +def analyze_and_normalize_path(d, path_type, path_id=""): + """Strictly normalize path direction and generate detailed report""" + original_d = d + report = [] + normalized = [] + changed = False + + # First check if path contains any arc commands + if 'A' in d or 'a' in d: + report_header = f"[{path_id}-Analysis] Type: {path_type} (contains arcs)" + full_report = [report_header, + f"Original path: {original_d}", + " Path contains arc commands - leaving unchanged", + "Path not modified"] + return original_d, '\n'.join(full_report) + + # Ensure path starts with M command + if not d.strip().startswith('M'): + d = 'M' + d[1:] if d.startswith('L') else 'M ' + d + report.append(" Fix: Added M command at path start") + changed = True + + # Parse path commands + commands = [] + current_cmd = None + for token in re.split('([A-Za-z])', d): + if not token: + continue + if token in 'MLAZHVCSQTa-z': + current_cmd = token + else: + if current_cmd: + commands.append((current_cmd, token.strip())) + + prev_x, prev_y = None, None + + for cmd, params in commands: + params = [float(p) for p in re.split('[, ]+', params.strip()) if p] + + if cmd == 'M': + if len(params) >= 2: + x, y = params[0], params[1] + normalized.append(f"M {x} {y}") + prev_x, prev_y = x, y + continue + + if path_type == 'Line segment' and cmd == 'L': + if len(params) >= 2 and prev_x is not None: + x, y = params[0], params[1] + need_swap = x < prev_x or (x == prev_x and y < prev_y) + + if need_swap: + new_segment = [f"M {x} {y}", f"L {prev_x} {prev_y}"] + report.append(f" Need to swap start/end → New path: {' '.join(new_segment)}") + normalized = new_segment + changed = True + else: + normalized.append(f"L {x} {y}") + report.append(" Path direction already correct, no changes made") + + prev_x, prev_y = x, y + continue + + normalized.append(f"{cmd} {' '.join(map(str, params))}") + + new_d = ' '.join(normalized) + report_header = f"[{path_id}-Analysis] Type: {path_type}" + full_report = [report_header, f"Original path: {original_d}"] + report + + if changed: + full_report.append(f"Modified path: {new_d}") + else: + full_report.append("Path not modified") + + return new_d, '\n'.join(full_report) + +def optimize_svg(input_path, output_path): + """Process single SVG file with all optimizations""" + try: + # Register namespace + ET.register_namespace('', 'http://www.w3.org/2000/svg') + + # Parse SVG file + tree = ET.parse(input_path) + root = tree.getroot() + + print(f"\nProcessing file: {os.path.basename(input_path)}") + print("="*60) + + # Create parent map + parent_map = {c: p for p in tree.iter() for c in p} + + # 1. Remove xlink namespace + for attr in list(root.attrib): + if 'xlink' in attr: + del root.attrib[attr] + + # 2. Set standard dimensions + root.set('width', '1e3') + root.set('height', '1e3') + root.set('viewBox', '0 0 1e3 1e3') + + # 3. Remove all clipPath definitions and references + defs = root.find('{http://www.w3.org/2000/svg}defs') + if defs is not None: + clip_paths = defs.findall('{http://www.w3.org/2000/svg}clipPath') + for cp in clip_paths: + defs.remove(cp) + if len(defs) == 0: + root.remove(defs) + + # 4. Remove clip-path attributes + for elem in tree.iter(): + if 'clip-path' in elem.attrib: + del elem.attrib['clip-path'] + + # 5. Force square line caps + for g in root.findall('.//{http://www.w3.org/2000/svg}g'): + g.set('stroke-linecap', 'square') + + # 6. Remove dashed line styles + for elem in tree.iter(): + if 'stroke-dasharray' in elem.attrib: + del elem.attrib['stroke-dasharray'] + + # 7. Completely remove empty groups + removed_groups = True + while removed_groups: + removed_groups = False + for g in root.findall('.//{http://www.w3.org/2000/svg}g'): + is_empty = ( + len(g) == 0 and + not (g.text or '').strip() and + not (g.tail or '').strip() and + all(not k.startswith('{') for k in g.attrib)) + if is_empty: + parent = parent_map.get(g) + if parent is not None: + parent.remove(g) + removed_groups = True + parent_map = {c: p for p in tree.iter() for c in p} + + # 8. Convert polylines to paths + for polyline in root.findall('.//{http://www.w3.org/2000/svg}polyline'): + points = polyline.get('points', '').strip() + if points: + coords = [p for p in re.split(r'[\s,]', points) if p] + path_data = [] + for i in range(0, len(coords), 2): + if i == 0: + path_data.append(f"M {coords[i]} {coords[i+1]}") + else: + path_data.append(f"L {coords[i]} {coords[i+1]}") + + path = ET.Element('{http://www.w3.org/2000/svg}path') + new_d, analysis_report = analyze_and_normalize_path( + ' '.join(path_data), + 'Line segment', + "Polyline conversion" + ) + path.set('d', new_d) + print(f"\n[Polyline conversion analysis]\n{analysis_report}") + + for attr, value in polyline.attrib.items(): + if attr not in ('points', 'stroke-dasharray'): + path.set(attr, value) + + parent = parent_map.get(polyline) + if parent is not None: + parent.remove(polyline) + parent.append(path) + + # 9. Normalize path directions (final step) + group_num = 0 + for g in root.findall('.//{http://www.w3.org/2000/svg}g'): + group_num += 1 + path_num = 0 + group_report = [] + + for path in g.findall('.//{http://www.w3.org/2000/svg}path'): + path_num += 1 + if 'd' not in path.attrib: + continue + + # Auto-detect path type + path_type = 'Arc' if 'A' in path.get('d') else 'Line segment' + path_id = f"Group{group_num}-Path{path_num}" + + new_d, analysis_report = analyze_and_normalize_path( + path.get('d'), + path_type, + path_id + ) + + if new_d != path.get('d'): + path.set('d', new_d) + + group_report.append(analysis_report) + + # Print all path reports for current group + if group_report: + print(f"\n=== Group {group_num} Path Analysis ===") + print('\n\n'.join(group_report)) + + # 10. Update colors and line width + for elem in root.findall('.//*[@stroke]'): + stroke = elem.get('stroke', '').lower() + if stroke == '#0ff' or stroke == 'rgb(0,255,255)': + elem.set('stroke', '#ffe31b') + elif stroke == '#000' or stroke == 'rgb(255,0,0)': + elem.set('stroke', '#FF0000') + elem.set('stroke-width', f'{1}px') + + # Generate final XML + rough_string = ET.tostring(root, encoding='utf-8', xml_declaration=True) + rough_string = rough_string.replace(b'standalone="no"', b'') + + # Format output (remove empty lines) + reparsed = minidom.parseString(rough_string) + pretty_svg = reparsed.toprettyxml(indent=' ', encoding='utf-8') + pretty_svg = b'\n'.join( + line for line in pretty_svg.splitlines() + if line.strip() + ).replace(b'', b'') + + with open(output_path, 'wb') as f: + f.write(pretty_svg) + + print("\n" + "="*60) + return True + + except Exception as e: + print(f"\nProcessing error: {str(e)}") + print("="*60) + return False + +def batch_process_svgs(input_dir, output_dir): + + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + success_count = 0 + failure_count = 0 + + for filename in os.listdir(input_dir): + if os.path.isdir(os.path.join(input_dir, filename)): + continue + if filename.lower().endswith('.svg') or '_new.svg' in filename.lower(): + input_path = os.path.join(input_dir, filename) + output_filename = filename.replace('_new.svg', '_optimized.svg') + output_path = os.path.join(output_dir, output_filename) + + if optimize_svg(input_path, output_path): + success_count += 1 + print(f"✓ Processed successfully: {filename} → {output_filename}") + else: + failure_count += 1 + print(f"✗ Processing failed: {filename}") + print("\n" + "="*60 + "\n") + + print("\nProcessing summary:") + print(f"Successfully processed: {success_count} files") + print(f"Failed to process: {failure_count} files") +def clear_output_dir(path: str): + + os.makedirs(path, exist_ok=True) + for filename in os.listdir(path): + file_path = os.path.join(path, filename) + try: + if os.path.isdir(file_path): + shutil.rmtree(file_path) # 删除目录 + elif os.path.isfile(file_path) or os.path.islink(file_path): + os.unlink(file_path) # 删除文件或符号链接 + except Exception as e: + print(f"Failed to delete {file_path}. Reason: {e}") + +if __name__ == '__main__': + input_dir = os.environ.get('RD_CONF_TEFBOGEN') + output_dir = os.environ.get('RD_CONF_WORK') + + if not input_dir or not output_dir: + print("Error: Environment variable RD_CONF_WORK is not set") + exit(1) + + if not os.path.exists(input_dir): + print(f"Error: Input directory '{input_dir}' does not exist") + exit(1) + clear_output_dir(output_dir) + print(f"Starting SVG file processing, working directory: {input_dir}") + print("=" * 50) + + batch_process_svgs(input_dir, output_dir) + + print("Processing completed!") \ No newline at end of file diff --git a/SVGs/Omniflo/lib/TEFBogen/02_svg_step3_scaler.py b/SVGs/Omniflo/lib/TEFBogen/02_svg_step3_scaler.py new file mode 100644 index 0000000..fb0416e --- /dev/null +++ b/SVGs/Omniflo/lib/TEFBogen/02_svg_step3_scaler.py @@ -0,0 +1,158 @@ +import os +import re +import xml.etree.ElementTree as ET +from typing import Tuple, List + +def parse_svg_path(d: str) -> List[Tuple[float, float]]: + """Extract all coordinates from SVG path data (including curve control points)""" + points = [] + commands = re.findall( + r'([MmLlCcQqAaHhVvZz])([^MmLlCcQqAaHhVvZz]*)', + d.strip().replace(',', ' ') + ) + current_pos = (0.0, 0.0) + + for cmd, args in commands: + args = list(map(float, re.findall(r'[-+]?\d*\.?\d+', args))) + if cmd in ('M', 'm', 'L', 'l'): # Move/line commands + for i in range(0, len(args), 2): + x, y = args[i], args[i+1] + if cmd.islower(): # Relative coordinates + x += current_pos[0] + y += current_pos[1] + points.append((x, y)) + current_pos = (x, y) + elif cmd in ('C', 'c'): # Cubic Bezier curves + for i in range(0, len(args), 6): + x1, y1, x2, y2, x, y = args[i:i+6] + if cmd.islower(): + x1 += current_pos[0]; y1 += current_pos[1] + x2 += current_pos[0]; y2 += current_pos[1] + x += current_pos[0]; y += current_pos[1] + points.extend([(x1, y1), (x2, y2), (x, y)]) + current_pos = (x, y) + elif cmd in ('A', 'a'): # Arc commands (start/end points only) + for i in range(0, len(args), 7): + x, y = args[i+5], args[i+6] + if cmd.islower(): + x += current_pos[0] + y += current_pos[1] + points.append((x, y)) + current_pos = (x, y) + return points + +def calculate_bounding_box(svg_file: str) -> Tuple[float, float, float, float]: + """Calculate true bounding box of all paths in SVG""" + tree = ET.parse(svg_file) + root = tree.getroot() + all_points = [] + + for path in root.findall('.//{http://www.w3.org/2000/svg}path'): + d = path.get('d', '') + all_points.extend(parse_svg_path(d)) + + if not all_points: + return (0, 0, 0, 0) + + x_min = min(p[0] for p in all_points) + x_max = max(p[0] for p in all_points) + y_min = min(p[1] for p in all_points) + y_max = max(p[1] for p in all_points) + return (x_min, y_min, x_max, y_max) + + +def normalize_stroke_widths2(root, scale): + """Normalize stroke widths to ensure consistent appearance after scaling""" + for elem in root.iter(): + if 'stroke-width' in elem.attrib: + # Remove existing stroke-width + del elem.attrib['stroke-width'] + # Apply scaled stroke width (e.g., 1px → 1/scale) + elem.set('stroke-width', f'{1/scale:.6f}px') + +def apply_non_scaling_stroke(root): + + for elem in root.iter(): + if 'stroke' in elem.attrib and elem.attrib['stroke'] != 'none': + # set stroke-width=1(no unit) + elem.set('stroke-width', '1') + # set vector-effect + elem.set('vector-effect', 'non-scaling-stroke') + +def scale_svg_file(input_path: str, output_path: str): + """Scale SVG file with consistent stroke widths""" + print(f"\nProcessing: {os.path.basename(input_path)}") + + tree = ET.parse(input_path) + root = tree.getroot() + + # Calculate original bounding box + x_min, y_min, x_max, y_max = calculate_bounding_box(input_path) + width = x_max - x_min + height = y_max - y_min + + print(f"Original bounding box: ({x_min:.3f}, {y_min:.3f}) to ({x_max:.3f}, {y_max:.3f})") + print(f"Original dimensions: {width:.3f} (w) × {height:.3f} (h)") + + + # Determine scaling base (larger dimension → 1000px) + if width > height: + scale = 1000.0 / width + new_width = 1000.0 + new_height = round(height * scale,3) + print(f"Scaling base: Width (larger dimension)") + else: + scale = 1000.0 / height + new_height = 1000.0 + new_width = round(width * scale,3) + print(f"Scaling base: Height (larger dimension)") + + print(f"Scale factor: {scale:.6f}") + print(f"New dimensions: {new_width:.3f}px × {new_height:.3f}px") + print(f"ViewBox: 0 0 {new_width:.3f} {new_height:.3f}") + normalize_stroke_widths2(root, scale) + #apply_non_scaling_stroke(root) + # + # Update SVG attributes + root.set('viewBox', f'0 0 {new_width:.3f} {new_height:.3f}') + root.set('width', f'{new_width:.3f}') + root.set('height', f'{new_height:.3f}') + + # Apply translation and scaling + for g in root.findall('{http://www.w3.org/2000/svg}g'): + transform = g.get('transform', '') + new_transform = f'translate({-x_min*scale},{-y_min*scale}) scale({scale})' + if transform: + new_transform = f'{transform} {new_transform}' + g.set('transform', new_transform) + + # Save modified SVG + tree.write(output_path, encoding='utf-8', xml_declaration=True) + print(f"Finished processing: {os.path.basename(input_path)}") + +def batch_process_svg(input_dir: str, output_dir: str): + """Batch process SVG files in directory (non-recursive)""" + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + svg_files = [ + f for f in os.listdir(input_dir) + if f.lower().endswith('.svg') and os.path.isfile(os.path.join(input_dir, f)) + ] + + if not svg_files: + print("No SVG files found in the input directory!") + return + + print(f"\nFound {len(svg_files)} SVG files to process") + for filename in svg_files: + input_path = os.path.join(input_dir, filename) + output_path = os.path.join(output_dir, filename) + scale_svg_file(input_path, output_path) + + print("\nAll files processed successfully!") + +if __name__ == '__main__': + input_dir = os.environ.get('RD_CONF_WORK') + output_dir = os.environ.get('RD_CONF_WORK') + batch_process_svg(input_dir, output_dir) diff --git a/SVGs/Omniflo/lib/TEFBogen/02_svg_step4_format_optimization.py b/SVGs/Omniflo/lib/TEFBogen/02_svg_step4_format_optimization.py new file mode 100644 index 0000000..8ff0b5d --- /dev/null +++ b/SVGs/Omniflo/lib/TEFBogen/02_svg_step4_format_optimization.py @@ -0,0 +1,159 @@ +import re +import os +import xml.etree.ElementTree as ET +from typing import List, Dict, Tuple + +def process_svg_file(input_path: str, output_path: str) -> bool: + """Process SVG file while preserving original dimensions and viewBox""" + try: + # Parse SVG file + tree = ET.parse(input_path) + root = tree.getroot() + + # Store original dimensions and viewBox + original_attrs = { + 'width': root.attrib.get('width', '100%'), + 'height': root.attrib.get('height', '100%'), + 'viewBox': root.attrib.get('viewBox', '') + } + + # Remove namespace prefixes + for elem in root.iter(): + if '}' in elem.tag: + elem.tag = elem.tag.split('}', 1)[1] + for attr in list(elem.attrib): + if '}' in attr: + new_attr = attr.split('}', 1)[1] + elem.attrib[new_attr] = elem.attrib[attr] + del elem.attrib[attr] + + # Process all groups with transforms + for g in root.findall('g'): + if 'transform' in g.attrib: + # Parse transform and convert to matrix + transform = g.attrib['transform'] + matrix_str = convert_transform_to_matrix(transform) + + # Update group attributes + g.attrib['transform'] = matrix_str # Force stroke color + g.attrib['fill'] = 'none' + g.attrib['stroke-linecap'] = 'butt' + g.attrib['vector-effect'] = 'non-scaling-stroke' + + # Format paths within group + for path in g.findall('path'): + path.attrib['d'] = simplify_path_data(path.attrib.get('d', '')) + path.tail = '\n ' # Maintain consistent indentation + + # Set root attributes while preserving original dimensions + root.attrib.update({ + 'version': '1.1', + 'xmlns': 'http://www.w3.org/2000/svg', + 'width': original_attrs['width'], + 'height': original_attrs['height'], + 'viewBox': original_attrs['viewBox'], + 'fill-rule': 'evenodd', + 'stroke-linecap': 'round', + 'stroke-linejoin': 'round', + 'space': 'preserve' + }) + + # Format XML with proper indentation + indent(root) + + # Generate XML string + xml_str = ET.tostring(root, encoding='unicode') + xml_str = '\n' + xml_str + + # Clean up formatting + xml_str = re.sub(r'\n\s*\n', '\n', xml_str) + xml_str = re.sub(r'>\s+<', '>\n<', xml_str) + + # Write to file + with open(output_path, 'w', encoding='utf-8') as f: + f.write(xml_str) + + print(f"Processed: {os.path.basename(input_path)}") + return True + + except Exception as e: + print(f"Failed {os.path.basename(input_path)}: {str(e)}") + return False + +def convert_transform_to_matrix(transform: str) -> str: + """Convert transform string to matrix notation with 4 decimal places""" + tx = ty = 0.0 + translate_match = re.search(r'translate\(([^,]+),\s*([^)]+)\)', transform) + if translate_match: + tx = float(translate_match.group(1)) + ty = float(translate_match.group(2)) + + scale = 1.0 + scale_match = re.search(r'scale\(([^)]+)\)', transform) + if scale_match: + scale = float(scale_match.group(1)) + + return f"matrix({scale:.4f} 0 0 {scale:.4f} {tx:.2f} {ty:.2f})" + +def simplify_path_data(d: str) -> str: + """Simplify path data while maintaining relative commands""" + d = re.sub(r'\s+', ' ', d.strip()) + + def format_number(num_str: str) -> str: + try: + num = float(num_str) + if abs(num) < 0.001 and num != 0: + return f"{num:.0e}".replace('e-0', 'e-') + if abs(num - 1000) < 0.1: + return '1e3' + if abs(num - round(num, 3)) < 0.0001: + return f"{round(num, 3):g}" + return num_str + except ValueError: + return num_str + + parts = [] + for part in re.split(r'([ ,])', d): + if re.match(r'^[-+]?\d*\.?\d+$', part): + parts.append(format_number(part)) + else: + parts.append(part) + + return ''.join(parts).replace(' ,', ',') + +def indent(elem: ET.Element, level: int = 0): + """Properly indent XML elements""" + indent_str = "\n" + level * " " + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = indent_str + " " + if not elem.tail or not elem.tail.strip(): + elem.tail = indent_str + for child in elem: + indent(child, level + 1) + if not elem.tail or not elem.tail.strip(): + elem.tail = indent_str + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = indent_str + +def batch_process_svgs(input_dir: str, output_dir: str): + """Process all SVG files in a directory""" + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + success_count = 0 + for filename in sorted(os.listdir(input_dir)): + if filename.lower().endswith('.svg'): + input_path = os.path.join(input_dir, filename) + output_path = os.path.join(output_dir, filename) + if process_svg_file(input_path, output_path): + success_count += 1 + + print(f"\nCompleted: {success_count} files processed") + +if __name__ == '__main__': + input_dir = os.environ.get('RD_CONF_WORK') + output_dir = os.environ.get('RD_CONF_OUTPUT_TEFBOGEN') +# Example usage: + batch_process_svgs(input_dir, output_dir) \ No newline at end of file diff --git a/SVGs/Omniflo/lib/TEFBogen/4_TEFBogen_SVG_XML_Modifier_Script.py b/SVGs/Omniflo/lib/TEFBogen/03_TEFBogen_SVG_XML_Modifier_Script.py similarity index 51% rename from SVGs/Omniflo/lib/TEFBogen/4_TEFBogen_SVG_XML_Modifier_Script.py rename to SVGs/Omniflo/lib/TEFBogen/03_TEFBogen_SVG_XML_Modifier_Script.py index f6af7cb..09195cf 100644 --- a/SVGs/Omniflo/lib/TEFBogen/4_TEFBogen_SVG_XML_Modifier_Script.py +++ b/SVGs/Omniflo/lib/TEFBogen/03_TEFBogen_SVG_XML_Modifier_Script.py @@ -5,7 +5,8 @@ This script: 1. Reads a JSON array of items 2. For each item, extracts the "Sivasnr" value 3. Locates and modifies the corresponding XML file -4. Provides comprehensive reporting +4. Processes only red color groups (#FF0000) +5. Provides comprehensive reporting """ import json @@ -15,7 +16,7 @@ from xml.etree.ElementTree import Element, SubElement, tostring def process_xml_file(xml_path): """ - Process a single XML file with enhanced style handling + Process a single XML file focusing on red color groups only Returns modification statistics """ try: @@ -27,68 +28,60 @@ def process_xml_file(xml_path): namespaces = {'svg': 'http://www.w3.org/2000/svg'} stats = { - 'ffe31b_groups': 0, - 'ec2525_groups': 0, - 'other_groups_processed': 0, - 'elements_modified': 0, - 'modified': False + 'ff0000_groups': 0, # Count of #FF0000 groups processed + 'other_red_groups': 0, # Count of other red-style groups processed + 'elements_modified': 0, # Total elements modified + 'modified': False # Whether file was modified } # Process all group elements for g in root.findall('.//svg:g', namespaces): - stroke = g.get('stroke') + stroke = g.get('stroke', '').upper() # Normalize to uppercase for comparison - if stroke == "#ffe31b": - stats['ffe31b_groups'] += 1 + # Process #FF0000 red groups + if stroke == "#FF0000": + stats['ff0000_groups'] += 1 - # Remove group attributes - for attr in ['stroke-width', 'stroke-miterlimit']: - if attr in g.attrib: - del g.attrib[attr] - stats['modified'] = True - - # Set stroke-width for all path children - for child in g.findall('.//svg:path', namespaces): - child.set('stroke-width', '1px') - stats['elements_modified'] += 1 - stats['modified'] = True - - elif stroke == "#ec2525": - stats['ec2525_groups'] += 1 - - # Remove group attributes + # Remove group attributes: stroke, stroke-width, stroke-linejoin for attr in ['stroke', 'stroke-width', 'stroke-linejoin']: if attr in g.attrib: del g.attrib[attr] stats['modified'] = True - # Modify path children - for child in g.findall('.//svg:path[@stroke-width="1px"]', namespaces): - del child.attrib['stroke-width'] - child.set('style', 'stroke:#ec2525;stroke-width:2px') + # Modify path children: remove stroke-width, set new style + for child in g.findall('.//svg:path', namespaces): + if 'stroke-width' in child.attrib: + del child.attrib['stroke-width'] + stats['modified'] = True + + # Set new style for red stroke with 2px width + child.set('style', 'stroke:#FF0000;stroke-width:2px') stats['elements_modified'] += 1 stats['modified'] = True + # Process other groups with red color in style attributes else: - # Handle groups without specific stroke color - stats['other_groups_processed'] += 1 - - # Process elements with style="stroke:#ec2525;" + # Process elements with style="stroke:#FF0000;" + red_elements_found = False for child in g.findall('.//svg:*[@style]', namespaces): style = child.get('style', '') - if 'stroke:#ec2525;' in style: - # Remove stroke-width if exists + if 'stroke:#FF0000;' in style: + red_elements_found = True + + # Remove stroke-width attribute if exists if 'stroke-width' in child.attrib: del child.attrib['stroke-width'] stats['modified'] = True - # Update the style attribute - - child.set('style', 'stroke:#ec2525;stroke-width:2px;') + # Update the style attribute with standardized format + child.set('style', 'stroke:#FF0000;stroke-width:2px;') stats['elements_modified'] += 1 stats['modified'] = True + + if red_elements_found: + stats['other_red_groups'] += 1 - # Save changes if modified + # Save changes if modifications were made if stats['modified']: xml_str = ET.tostring(root, encoding='unicode') xml_str = xml_str.replace('><', '>\n<').replace('', '\n') @@ -106,11 +99,19 @@ def main(): """ Main processing function """ - # Configure paths - json_path=os.environ.get("JSON_PATH_TEFBOGEN","JSON") - json_file_path = os.path.join(json_path,"1_TEF_Boegen_input.json") - svg_folder_path = os.environ.get("SVG_PATH","svg") + # Configure paths from environment variables + json_path = os.environ.get("JSON_PATH_TEFBOGEN", "JSON") + json_file_path = os.path.join(json_path, "1_TEF_Boegen_output.json") + svg_folder_path = os.environ.get("SVG_PATH", "svg") + # Statistics for final report + total_stats = { + 'files_processed': 0, + 'files_modified': 0, + 'total_ff0000_groups': 0, + 'total_other_red_groups': 0, + 'total_elements_modified': 0 + } try: # Read and parse JSON file @@ -123,6 +124,8 @@ def main(): return print(f"\nFound {len(data)} items in JSON file") + print("Starting XML file processing...") + print("=" * 60) # Process each item in the JSON array for index, item in enumerate(data, 1): @@ -146,6 +149,7 @@ def main(): continue print(f" Found XML file: {xml_path}") + total_stats['files_processed'] += 1 # Process the XML file stats = process_xml_file(xml_path) @@ -153,22 +157,40 @@ def main(): if stats is None: print(" Processing failed") elif stats['modified']: - print(" File successfully modified") - print(f" - #ffe31b groups: {stats['ffe31b_groups']}") - print(f" - #ec2525 groups: {stats['ec2525_groups']}") - print(f" - Elements modified: {stats['elements_modified']}") + print(" ✓ File successfully modified") + total_stats['files_modified'] += 1 + total_stats['total_ff0000_groups'] += stats['ff0000_groups'] + total_stats['total_other_red_groups'] += stats['other_red_groups'] + total_stats['total_elements_modified'] += stats['elements_modified'] + + # Print detailed statistics for this file + if stats['ff0000_groups'] > 0: + print(f" - #FF0000 groups processed: {stats['ff0000_groups']}") + if stats['other_red_groups'] > 0: + print(f" - Other red style groups: {stats['other_red_groups']}") + print(f" - Elements modified: {stats['elements_modified']}") else: - print(" No modifications needed") + print(" - No modifications needed (no red groups found)") - print("\nProcessing complete") + # Generate final comprehensive report + print("\n" + "=" * 60) + print("PROCESSING SUMMARY REPORT") + print("=" * 60) + print(f"Total files processed: {total_stats['files_processed']}") + print(f"Total files modified: {total_stats['files_modified']}") + print(f"Total #FF0000 groups processed: {total_stats['total_ff0000_groups']}") + print(f"Total other red style groups: {total_stats['total_other_red_groups']}") + print(f"Total elements modified: {total_stats['total_elements_modified']}") + print("=" * 60) except FileNotFoundError: - print("\nError: JSON file not found") + print("\nError: JSON file not found at specified path") except json.JSONDecodeError: - print("\nError: Invalid JSON format") + print("\nError: Invalid JSON format in input file") except Exception as e: print(f"\nUnexpected error: {str(e)}") if __name__ == "__main__": print("SVG XML Batch Modifier - Starting execution") + print("Focus: Processing only red color groups (#FF0000)") main() \ No newline at end of file diff --git a/SVGs/Omniflo/lib/TEFBogen/03_convert_svgs_to_xml_and_update_xml_path_in_props.py b/SVGs/Omniflo/lib/TEFBogen/03_convert_svgs_to_xml_and_update_xml_path_in_props.py new file mode 100644 index 0000000..21f489a --- /dev/null +++ b/SVGs/Omniflo/lib/TEFBogen/03_convert_svgs_to_xml_and_update_xml_path_in_props.py @@ -0,0 +1,194 @@ +import os +import re +import json +from xml.etree import ElementTree as ET +from xml.dom import minidom + +def extract_sivasnr(filename): + """Extract content before _TEFBogen from filename""" + match = re.search(r'^(.+?)_TEFBogen', filename) + return match.group(1) if match else None + +def should_skip_stroke_width(element_attrib): + """Check if element should skip stroke-width setting""" + # Check style attribute + if 'style' in element_attrib: + style = element_attrib['style'].lower() + if 'stroke:none' in style and 'fill:none' in style: + return True + + # Check separate stroke and fill attributes + stroke = element_attrib.get('stroke', '').lower() + fill = element_attrib.get('fill', '').lower() + return stroke == 'none' and fill == 'none' + +def create_xml_structure(svg_root): + """Create target XML structure preserving all elements""" + # Create base structure + new_root = ET.Element("svg", xmlns="http://www.w3.org/2000/svg") + g_layer = ET.SubElement(new_root, "g", transform="rotate(0)") + + # Add inner SVG container + inner_svg = ET.SubElement(g_layer, "svg", { + "viewBox": svg_root.attrib.get("viewBox", "0 0 1000 1000"), + "preserveAspectRatio": "none", + "position": "absolute", + "overflow": "visible" + }) + + # Transfer all content + for elem in svg_root: + if elem.tag.endswith("}g"): + # Process group with namespace + new_g = ET.SubElement(inner_svg, "g", attrib={ + k: v for k, v in elem.attrib.items() + if not k.startswith("xmlns") + }) + + # Process all elements within group + for child in elem: + child_tag = child.tag.split("}")[-1] # Remove namespace + child_attrib = {} + + # Preserve all original attributes (except namespace) + for k, v in child.attrib.items(): + if not k.startswith("xmlns"): + child_attrib[k] = v + + # Only add stroke-width if not stroke:none;fill:none + if not should_skip_stroke_width(child.attrib): + child_attrib["stroke-width"] = "1px" + + # Create element with preserved attributes + ET.SubElement(new_g, child_tag, attrib=child_attrib) + + else: + # Process standalone elements (path, circle, etc.) + elem_tag = elem.tag.split("}")[-1] # Remove namespace + elem_attrib = {} + + # Preserve all original attributes (except namespace) + for k, v in elem.attrib.items(): + if not k.startswith("xmlns"): + elem_attrib[k] = v + + # Only add stroke-width if not stroke:none;fill:none + if not should_skip_stroke_width(elem.attrib): + elem_attrib["stroke-width"] = "1px" + + ET.SubElement(inner_svg, elem_tag, attrib=elem_attrib) + + return new_root + +def format_xml(element): + """Generate formatted XML string""" + # Generate XML with declaration + xml_str = ET.tostring(element, encoding="UTF-8", xml_declaration=True) + + # Pretty format with 2-space indent + dom = minidom.parseString(xml_str) + pretty_xml = dom.toprettyxml(indent=" ", encoding="UTF-8").decode("UTF-8") + + # Remove extra empty lines (preserve structure) + lines = [] + for line in pretty_xml.split("\n"): + if line.strip() or line.lstrip().startswith("