This commit is contained in:
2025-09-23 11:05:25 +02:00
89 changed files with 2930 additions and 2038 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -1,36 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 700.04" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(3.9046 0 0 3.9046 -1139.8 -1233.5)" fill="none" stroke="#ffe31b" stroke-linecap="square">
<path d="m340.75 326.58a193.45 193.45 0 0 1 178.72 119.42" stroke-width="1px" />
<path d="m292.39 316.4v20.35" stroke-width="1px" />
<path d="m292.39 326.58h48.362" stroke-width="1px" />
<path d="m519.47 445.99 18.507 44.681" stroke-width="1px" />
<path d="m528.58 494.57 18.801-7.788" stroke-width="1px" />
<svg viewBox="0 0 1000.000 698.719" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.287446px" transform="matrix(3.4789 0 0 3.4789 -1281.20 -986.54)" vector-effect="non-scaling-stroke">
<path d="M624.263,429.665 A218.069,218.069 0 0,0 422.794,295.048" stroke-width="1px" />
<path d="M 368.277 283.578 L 368.277 306.518" stroke-width="1px" />
<path d="M 368.277 295.048 L 422.794 295.048" stroke-width="1px" />
<path d="M 624.263 429.665 L 645.126 480.033" stroke-width="1px" />
</g>
<g transform="matrix(3.9046 0 0 3.9046 -1139.8 -1233.5)" fill="none" stroke-linecap="square">
<path d="m356.9 359.8a136.04 136.04 0 0 1 125.69 83.981" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m356.9 390.08a105.77 105.77 0 0 1 97.717 65.292" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m356.9 374.94a120.9 120.9 0 0 1 111.7 74.636" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m463.5 476.82 27.97-11.586" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m482.59 443.78 8.883 21.447" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m329.34 359.8h27.566" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m329.34 359.8v30.275" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m329.34 390.08h27.566" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m454.62 455.37 8.883 21.447" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m468.61 449.58 8.883 21.447" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m329.34 374.94h27.566" style="stroke:#ec2525;stroke-width:2px;" />
<g fill="none" stroke-linecap="butt" transform="matrix(3.4789 0 0 3.4789 -1281.20 -986.54)" vector-effect="non-scaling-stroke">
<path d="M582.687,427.176 A153.357,153.357 0 0,0 441.004,332.507" style="stroke:#FF0000;stroke-width:2px" />
<path d="M551.157,440.237 A119.229,119.229 0 0,0 441.004,366.634" style="stroke:#FF0000;stroke-width:2px" />
<path d="M566.922,433.706 A136.293,136.293 0 0,0 441.004,349.571" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 561.172 464.413 L 592.702 451.353" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 582.687 427.176 L 592.702 451.353" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 409.929 332.507 L 441.004 332.507" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 409.929 332.507 L 409.929 366.634" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 409.929 366.634 L 441.004 366.634" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 551.157 440.237 L 561.172 464.413" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 566.922 433.706 L 576.937 457.883" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 409.929 349.571 L 441.004 349.571" style="stroke:#FF0000;stroke-width:2px" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.287446px" transform="matrix(3.4789 0 0 3.4789 -1281.20 -986.54)" vector-effect="non-scaling-stroke">
<path d="M 634.529 484.422 L 655.723 475.643" stroke-width="1px" />
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,36 +1,28 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 434.19" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(7.9454 0 0 7.9454 -2977.7 -2991.4)" fill="none" stroke="#ffe31b" stroke-linecap="square">
<path d="m404.14 381.64a128.21 128.21 0 0 1 49.064 9.759" stroke-width="1px" />
<path d="m378.5 376.74v9.809" stroke-width="1px" />
<path d="m378.5 381.64h25.642" stroke-width="1px" />
<path d="m453.21 391.4 45.227 18.734" stroke-width="1px" />
<path d="m496.56 414.66 3.754-9.062" stroke-width="1px" />
<svg viewBox="0 0 1000.000 431.695" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke-linecap="butt" transform="matrix(11.9164 0 0 11.9164 -2094.46 -4354.36)" vector-effect="non-scaling-stroke">
<path d="M220.292,394.168 A65.3651,65.3651 0 0,0 195.277,389.193" style="stroke:#FF0000;stroke-width:2px" />
<path d="M224.031,385.14 A75.1378,75.1378 0 0,0 195.277,379.42" style="stroke:#FF0000;stroke-width:2px" />
<path d="M222.161,389.654 A70.2514,70.2514 0 0,0 195.277,384.306" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 175.763 389.193 L 195.277 389.193" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 175.763 379.42 L 175.763 389.193" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 175.763 379.42 L 195.277 379.42" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 224.031 385.14 L 242.06 392.607" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 238.32 401.636 L 242.06 392.607" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 220.292 394.168 L 238.32 401.636" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 175.763 384.306 L 195.277 384.306" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 222.161 389.654 L 240.19 397.122" style="stroke:#FF0000;stroke-width:2px" />
</g>
<g transform="matrix(7.9454 0 0 7.9454 -2977.7 -2991.4)" fill="none" stroke-linecap="square">
<path d="m404.14 412.25a97.603 97.603 0 0 1 37.351 7.43" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m404.14 397.66a112.2 112.2 0 0 1 42.935 8.54" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m404.14 404.95a104.9 104.9 0 0 1 40.143 7.985" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m375 412.25h29.139" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m375 397.66v14.592" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m375 397.66h29.139" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m447.08 406.2 26.921 11.151" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m468.42 430.83 5.585-13.482" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m441.5 419.68 26.92 11.151" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m375 404.95h29.139" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m444.29 412.94 26.921 11.151" style="stroke:#ec2525;stroke-width:2px;" />
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.083918px" transform="matrix(11.9164 0 0 11.9164 -2094.46 -4354.36)" vector-effect="non-scaling-stroke">
<path d="M228.136,375.229 A85.8629,85.8629 0 0,0 195.278,368.693" stroke-width="1px" />
<path d="M 178.105 368.693 L 195.278 368.693" stroke-width="1px" />
<path d="M 228.136 375.229 L 258.424 387.775" stroke-width="1px" />
<path d="M 257.168 390.81 L 259.681 384.741" stroke-width="1px" />
<path d="M 178.105 365.409 L 178.105 371.978" stroke-width="1px" />
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -1,36 +1,28 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 418.97" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(12.296 0 0 12.296 -8054.7 -4124.2)" fill="none" stroke-linecap="square">
<path d="m681.3 335.58a84.15 84.15 0 0 1 32.202 6.409" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m681.3 339.45a80.284 80.284 0 0 1 30.723 6.114" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m681.3 343.31a76.418 76.418 0 0 1 29.244 5.82" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m655.24 343.31 1e-3 -7.732" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m655.24 343.31 26.061 2e-3" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m710.55 349.13 22.707 9.408" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m655.24 339.44 26.062 2e-3" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m712.03 345.56 22.707 9.408" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m655.24 335.58 26.061 2e-3" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m713.51 341.99 22.708 9.407" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m733.26 358.54 2.96-7.144" style="stroke:#ec2525;stroke-width:2px;" />
<svg viewBox="0 0 1000.000 416.397" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke-linecap="butt" transform="matrix(5.4217 0 0 5.4217 -1179.88 -2055.78)" vector-effect="non-scaling-stroke">
<path d="M350.34,393.778 A191.683,191.683 0 0,0 276.987,379.181" style="stroke:#FF0000;stroke-width:2px" />
<path d="M346.969,401.914 A182.877,182.877 0 0,0 276.987,387.987" style="stroke:#FF0000;stroke-width:2px" />
<path d="M343.599,410.049 A174.071,174.071 0 0,0 276.986,396.794" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 217.621 396.789 L 217.623 379.177" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 217.621 396.789 L 276.986 396.794" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 343.599 410.049 L 395.324 431.479" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 217.622 387.983 L 276.987 387.987" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 346.969 401.914 L 398.694 423.344" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 217.623 379.177 L 276.987 379.181" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 350.34 393.778 L 402.065 415.208" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 395.324 431.479 L 402.065 415.208" style="stroke:#FF0000;stroke-width:2px" />
</g>
<g transform="matrix(12.296 0 0 12.296 -8054.7 -4124.2)" fill="none" stroke="#ffe31b" stroke-linecap="square">
<path d="m681.29 351.8a67.932 67.932 0 0 1 25.997 5.171" stroke-width="1px" />
<path d="m667.7 349.2v5.198" stroke-width="1px" />
<path d="m667.7 351.8h13.586" stroke-width="1px" />
<path d="m707.28 356.97 23.963 9.926" stroke-width="1px" />
<path d="m730.25 369.3 1.989-4.802" stroke-width="1px" />
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.184444px" transform="matrix(5.4217 0 0 5.4217 -1179.88 -2055.78)" vector-effect="non-scaling-stroke">
<path d="M336.166,427.899 A154.742,154.742 0 0,0 276.948,416.12" stroke-width="1px" />
<path d="M 246 416.12 L 276.948 416.12" stroke-width="1px" />
<path d="M 336.166 427.899 L 390.751 450.51" stroke-width="1px" />
<path d="M 388.486 455.979 L 393.017 445.041" stroke-width="1px" />
<path d="M 246 410.201 L 246 422.04" stroke-width="1px" />
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -1,27 +1,29 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 506.11" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(25.768 0 0 25.768 -7425.6 -10013)" fill="none" stroke="#ffe31b" stroke-linecap="square">
<path d="m294.66 389.98a34.824 34.824 0 0 1 24.624 10.2" stroke-width="1px" />
<path d="m288.24 388.65v2.664" stroke-width="1px" />
<path d="m288.24 389.98h6.423" stroke-width="1px" />
<path d="m319.29 400.18 6.642 6.642" stroke-width="1px" />
<path d="m324.99 407.77 1.883-1.884" stroke-width="1px" />
</g>
<g transform="matrix(25.768 0 0 25.768 -7425.6 -10013)" fill="none" stroke-linecap="square">
<path d="m294.65 394.32a30.395 30.395 0 0 1 21.492 8.903" style="stroke:#ec2525;stroke-width:2px" />
<path d="m294.65 398.27a26.442 26.442 0 0 1 18.698 7.745" style="stroke:#ec2525;stroke-width:2px" />
<path d="m294.65 396.29a28.422 28.422 0 0 1 20.097 8.3245" style="stroke:#ec2525;stroke-width:2px" />
<path d="m313.34 406.02 2.0986 2.0986" style="stroke:#ec2525;stroke-width:2px" />
<path d="m315.44 408.12 2.7948-2.7958" style="stroke:#ec2525;stroke-width:2px" />
<path d="m316.14 403.22 2.0986 2.0986" style="stroke:#ec2525;stroke-width:2px" />
<path d="m291.68 394.32h2.9683" style="stroke:#ec2525;stroke-width:2px" />
<path d="m291.68 394.32v3.9538" style="stroke:#ec2525;stroke-width:2px" />
<path d="m291.68 398.27h2.9683" style="stroke:#ec2525;stroke-width:2px" />
<path d="m291.68 396.3 2.9683-3e-3" style="stroke:#ec2525;stroke-width:2px" />
<path d="m314.74 404.62 2.0966 2.1016" style="stroke:#ec2525;stroke-width:2px" />
</g>
<svg viewBox="0 0 1000.000 505.158" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.604936px" transform="matrix(1.6531 0 0 1.6531 -346.37 -382.20)" vector-effect="non-scaling-stroke">
<path d="M695.707,411.783 A545.308,545.308 0 0,0 310.116,252.066" stroke-width="1px" />
<path d="M 209.532 231.206 L 209.532 272.925" stroke-width="1px" />
<path d="M 209.532 252.066 L 310.116 252.066" stroke-width="1px" />
<path d="M 695.707 411.783 L 799.719 515.794" stroke-width="1px" />
</g>
<g fill="none" stroke-linecap="butt" transform="matrix(1.6531 0 0 1.6531 -346.37 -382.20)" vector-effect="non-scaling-stroke">
<path d="M647.539,459.956 A477.194,477.194 0 0,0 310.112,320.189" style="stroke:#FF0000;stroke-width:2px" />
<path d="M603.652,503.844 A415.128,415.128 0 0,0 310.112,382.255" style="stroke:#FF0000;stroke-width:2px" />
<path d="M625.629,481.866 A446.209,446.209 0 0,0 310.112,351.175" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 603.652 503.844 L 636.602 536.794" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 636.602 536.794 L 680.49 492.907" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 647.539 459.956 L 680.49 492.907" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 263.513 320.189 L 310.112 320.189" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 263.513 320.189 L 263.513 382.255" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 263.513 382.255 L 310.112 382.255" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 263.513 351.222 L 310.112 351.175" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 625.629 481.866 L 658.546 514.85" style="stroke:#FF0000;stroke-width:2px" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.604936px" transform="matrix(1.6531 0 0 1.6531 -346.37 -382.20)" vector-effect="non-scaling-stroke">
<path d="M 784.969 530.544 L 814.468 501.044" stroke-width="1px" />
</g>
</svg>
</g>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,36 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 729.48" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(8.0024 0 0 8.0024 -3381.5 -3126.8)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-linejoin="miter">
<path d="m448.96 394.38a89.088 89.088 0 0 1 82.307 54.995" stroke-width="1px" />
<path d="m540.92 481.58 6.297-2.608" stroke-width="1px" />
<path d="m531.26 449.38 12.8 30.903" stroke-width="1px" />
<path d="m422.8 394.38h26.159" stroke-width="1px" />
<path d="m422.8 390.97v6.816" stroke-width="1px" />
<svg viewBox="0 0 1000.000 728.287" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.275776px" transform="matrix(3.6261 0 0 3.6261 -1356.58 -1028.29)" vector-effect="non-scaling-stroke">
<path d="M614.536,413.034 A197.471,197.471 0 0,0 432.097,291.132" stroke-width="1px" />
<path d="M 635.93 484.422 L 649.888 478.641" stroke-width="1px" />
<path d="M 614.536 413.034 L 642.909 481.531" stroke-width="1px" />
<path d="M 374.112 291.132 L 432.097 291.132" stroke-width="1px" />
</g>
<g transform="matrix(8.0024 0 0 8.0024 -3381.5 -3126.8)" fill="none" stroke-linecap="square">
<path d="m454.52 415.77a60.011 60.011 0 0 1 55.443 37.046" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m454.52 405.58a70.2 70.2 0 0 1 64.856 43.336" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m454.52 410.68a65.106 65.106 0 0 1 60.149 40.191" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m445.41 415.77h9.115" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m509.97 452.82 7.1947 17.369" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m517.16 470.19 9.4134-3.8998" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m519.38 448.92 7.1947 17.368" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m445.41 405.58h9.115" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m445.41 405.58v10.189" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m445.41 410.68h9.115" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m514.67 450.87 7.1947 17.368" style="stroke:#ec2525;stroke-width:2px;" />
<g fill="none" stroke-linecap="butt" transform="matrix(3.6261 0 0 3.6261 -1356.58 -1028.29)" vector-effect="non-scaling-stroke">
<path d="M566.39,419.996 A132.377,132.377 0 0,0 444.09,338.277" style="stroke:#FF0000;stroke-width:2px" />
<path d="M587.155,411.395 A154.853,154.853 0 0,0 444.09,315.801" style="stroke:#FF0000;stroke-width:2px" />
<path d="M576.773,415.695 A143.615,143.615 0 0,0 444.09,327.039" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 423.984 338.277 L 444.09 338.277" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 566.39 419.996 L 582.26 458.308" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 582.26 458.308 L 603.025 449.707" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 587.155 411.395 L 603.025 449.707" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 423.984 315.801 L 444.09 315.801" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 423.984 315.801 L 423.984 338.277" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 423.984 327.039 L 444.09 327.039" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 576.773 415.695 L 592.642 454.007" style="stroke:#FF0000;stroke-width:2px" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.275776px" transform="matrix(3.6261 0 0 3.6261 -1356.58 -1028.29)" vector-effect="non-scaling-stroke">
<path d="M 374.112 283.578 L 374.112 298.686" stroke-width="1px" />
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,36 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 468.34" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(2.7858 0 0 2.7858 -1004.9 -919.89)" fill="none" stroke="#ffe31b" stroke-linecap="square">
<path d="m361.52 379.82h113.32" stroke-width="1px" />
<path d="m361.52 371.98v15.68" stroke-width="1px" />
<path d="m474.85 379.82a234.77 234.77 0 0 1 166.01 68.764" stroke-width="1px" />
<path d="m678.56 497.37 11.088-11.088" stroke-width="1px" />
<path d="m640.86 448.58 43.242 43.241" stroke-width="1px" />
<svg viewBox="0 0 1000.000 465.907" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.241132px" transform="matrix(4.1471 0 0 4.1471 -1059.76 -1420.27)" vector-effect="non-scaling-stroke">
<path d="M444.11,421.897 A158.429,158.429 0 0,0 332.084,375.494" stroke-width="1px" />
<path d="M 444.11 421.897 L 473.29 451.077" stroke-width="1px" />
</g>
<g transform="matrix(2.7858 0 0 2.7858 -1004.9 -919.89)" fill="none" stroke-linecap="square">
<path d="m475.62 330.89a281.84 281.84 0 0 1 199.29 82.549" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m475.62 354.22a258.51 258.51 0 0 1 182.8 75.716" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m475.62 342.55a270.18 270.18 0 0 1 191.04 79.132" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m658.42 429.93 43.838 43.838" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m702.26 473.77 16.496-16.495" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m674.91 413.44 43.838 43.839" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m361.42 330.89h114.2" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m361.42 330.89v23.329" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m361.42 354.22h114.2" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m666.67 421.68 43.838 43.839" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m361.42 342.55h114.2" style="stroke:#ec2525;stroke-width:2px;" />
<g fill="none" stroke-linecap="butt" transform="matrix(4.1471 0 0 4.1471 -1059.76 -1420.27)" vector-effect="non-scaling-stroke">
<path d="M467.09,398.179 A190.19,190.19 0 0,0 332.606,342.473" style="stroke:#FF0000;stroke-width:2px" />
<path d="M455.959,409.31 A174.448,174.448 0 0,0 332.606,358.216" style="stroke:#FF0000;stroke-width:2px" />
<path d="M461.525,403.744 A182.319,182.319 0 0,0 332.606,350.345" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 455.959 409.31 L 485.542 438.893" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 485.542 438.893 L 496.673 427.761" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 467.09 398.179 L 496.673 427.761" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 255.541 342.473 L 332.606 342.473" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 255.541 342.473 L 255.541 358.216" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 255.541 358.216 L 332.606 358.216" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 461.525 403.744 L 491.107 433.327" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 255.541 350.345 L 332.606 350.345" style="stroke:#FF0000;stroke-width:2px" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.241132px" transform="matrix(4.1471 0 0 4.1471 -1059.76 -1420.27)" vector-effect="non-scaling-stroke">
<path d="M 255.611 375.494 L 332.084 375.494" stroke-width="1px" />
<path d="M 255.611 370.204 L 255.611 380.785" stroke-width="1px" />
<path d="M 469.549 454.818 L 477.031 447.336" stroke-width="1px" />
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,36 +1,39 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 473.18" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(6.4098 0 0 6.4098 -2358.3 -2331.8)" fill="none" stroke-linecap="square">
<path d="m421.59 379.91a99.882 99.882 0 0 1 70.628 29.253" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m421.59 390.95a88.841 88.841 0 0 1 62.821 26.02" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m421.59 385.43a94.362 94.362 0 0 1 66.725 27.636" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m484.41 416.97 20.22 20.218" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m504.63 437.18 7.807-7.807" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m492.22 409.16 20.22 20.219" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m368.25 379.91 53.344-2e-3" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m368.25 379.91 1e-3 11.041" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m368.25 390.95 53.344-2e-3" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m368.25 385.43 53.344-1e-3" style="stroke:#ec2525;stroke-width:2px;" />
<path d="m488.32 413.06 20.22 20.219" style="stroke:#ec2525;stroke-width:2px;" />
<svg viewBox="0 0 1000.000 470.515" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke-linecap="butt" transform="matrix(7.1522 0 0 7.1522 -2065.09 -2593.76)" vector-effect="non-scaling-stroke">
<path d="M400.292,403.219 A89.8793,89.8793 0 0,0 336.737,376.896" style="stroke:#FF0000;stroke-width:2px" />
<path d="M393.267,410.244 A79.9439,79.9439 0 0,0 336.738,386.831" style="stroke:#FF0000;stroke-width:2px" />
<path d="M396.78,406.732 A84.9116,84.9116 0 0,0 336.738,381.863" style="stroke:#FF0000;stroke-width:2px" />
<path d="M400.292,403.219 A89.8793,89.8793 0 0,0 336.737,376.896" style="stroke:#FF0000;stroke-width:2px" />
<path d="M393.267,410.244 A79.9439,79.9439 0 0,0 336.738,386.831" style="stroke:#FF0000;stroke-width:2px" />
<path d="M396.78,406.732 A84.9116,84.9116 0 0,0 336.738,381.863" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 393.267 410.244 L 411.462 428.438" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 411.462 428.438 L 418.487 421.413" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 400.292 403.219 L 418.487 421.413" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 288.735 376.897 L 336.737 376.896" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 288.735 376.897 L 288.735 386.832" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 288.735 386.832 L 336.738 386.831" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 288.735 381.865 L 336.738 381.863" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 396.78 406.732 L 414.975 424.926" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 393.267 410.244 L 411.462 428.438" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 411.462 428.438 L 418.487 421.413" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 400.292 403.219 L 418.487 421.413" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 288.735 376.897 L 336.737 376.896" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 288.735 376.897 L 288.735 386.832" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 288.735 386.832 L 336.738 386.831" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 288.735 381.865 L 336.738 381.863" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 396.78 406.732 L 414.975 424.926" style="stroke:#FF0000;stroke-width:2px" />
</g>
<g transform="matrix(6.4098 0 0 6.4098 -2358.3 -2331.8)" fill="none" stroke="#ffe31b" stroke-linecap="square">
<path d="m421.85 367.79a111.12 111.12 0 0 1 78.572 32.545" stroke-width="1px" />
<path d="m518.26 423.42 5.248-5.248" stroke-width="1px" />
<path d="m368.22 367.79h53.636" stroke-width="1px" />
<path d="m500.42 400.33 20.466 20.466" stroke-width="1px" />
<path d="m368.22 364.08v7.422" stroke-width="1px" />
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.139817px" transform="matrix(7.1522 0 0 7.1522 -2065.09 -2593.76)" vector-effect="non-scaling-stroke">
<path d="M407.775,395.278 A99.9893,99.9893 0 0,0 337.071,365.992" stroke-width="1px" />
<path d="M 288.807 365.992 L 337.071 365.992" stroke-width="1px" />
<path d="M 407.775 395.278 L 426.191 413.694" stroke-width="1px" />
<path d="M 288.807 362.652 L 288.807 369.331" stroke-width="1px" />
<path d="M 423.83 416.056 L 428.552 411.333" stroke-width="1px" />
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

@@ -1,26 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 1e3" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(8.497 0 0 8.497 -4283.5 -2426.3)" fill="none" stroke="#ffe31b" stroke-linecap="square">
<path d="m525.75 302.3a79.311 79.311 0 0 1 79.311 79.311" stroke-width="1px" />
<path d="m504.34 299.66v5.297" stroke-width="1px" />
<path d="m602.41 403.02h5.297" stroke-width="1px" />
<path d="m605.06 381.62v21.402" stroke-width="1px" />
<path d="m504.34 302.3h21.401" stroke-width="1px" />
<svg viewBox="0 0 1000.000 1000.000" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.096686px" transform="matrix(10.3428 0 0 10.3428 -2362.02 -3363.78)" vector-effect="non-scaling-stroke">
<path d="M311.429,404.267 A65.4056,65.4056 0 0,0 246.023,338.861" stroke-width="1px" />
<path d="M 309.244 421.916 L 313.613 421.916" stroke-width="1px" />
<path d="M 311.429 404.267 L 311.429 421.916" stroke-width="1px" />
<path d="M 228.374 338.861 L 246.023 338.861" stroke-width="1px" />
</g>
<g transform="matrix(8.497 0 0 8.497 -4283.5 -2426.3)" fill="none" stroke-linecap="square">
<path d="m526.38 293.66a87.33 87.33 0 0 1 87.33 87.33" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m526.38 285.78a95.211 95.211 0 0 1 95.211 95.211" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m526.38 289.72a91.271 91.271 0 0 1 91.27 91.271" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m613.71 380.99v22.031" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m613.71 403.02h7.881" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m621.59 380.99v22.031" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m504.34 285.78h22.031" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m504.34 285.78v7.881" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m504.34 293.66h22.031" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m504.34 289.72h22.031" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m617.65 380.99v22.031" style="stroke:#ec2525;" stroke-width="1px" />
<g fill="none" stroke-linecap="butt" transform="matrix(10.3428 0 0 10.3428 -2362.02 -3363.78)" vector-effect="non-scaling-stroke">
<path d="M318.561,403.748 A72.0188,72.0188 0 0,0 246.542,331.729" style="stroke:#FF0000;stroke-width:2px" />
<path d="M325.06,403.748 A78.5178,78.5178 0 0,0 246.542,325.23" style="stroke:#FF0000;stroke-width:2px" />
<path d="M321.811,403.748 A75.2683,75.2683 0 0,0 246.542,328.479" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 318.561 403.748 L 318.561 421.916" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 318.561 421.916 L 325.06 421.916" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 325.06 403.748 L 325.06 421.916" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 228.374 325.23 L 246.542 325.23" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 228.374 325.23 L 228.374 331.729" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 228.374 331.729 L 246.542 331.729" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 228.374 328.479 L 246.542 328.479" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 321.811 403.748 L 321.811 421.916" style="stroke:#FF0000;stroke-width:2px" />
</g>
</svg>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.096686px" transform="matrix(10.3428 0 0 10.3428 -2362.02 -3363.78)" vector-effect="non-scaling-stroke">
<path d="M 228.374 336.677 L 228.374 341.045" stroke-width="1px" />
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -1,26 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 1e3 1e3" preserveAspectRatio="none" position="absolute" overflow="visible">
<g transform="matrix(5.3462 0 0 5.3462 -2252.1 -1673)" fill="none" stroke="#ffe31b" stroke-linecap="square">
<path d="m460.2 318.07a142.98 142.98 0 0 1 142.98 142.98" stroke-width="1px" />
<path d="m421.62 313.29v9.551" stroke-width="1px" />
<path d="m598.41 499.64h9.551" stroke-width="1px" />
<path d="m603.18 461.05v38.582" stroke-width="1px" />
<path d="m421.62 318.07h38.582" stroke-width="1px" />
<svg viewBox="0 0 1000.000 1000.000" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.103411px" transform="matrix(9.6702 0 0 9.6702 -3430.96 -3487.99)" vector-effect="non-scaling-stroke">
<path d="M455.56,442.696 A79.3491,79.3491 0 0,0 376.211,363.347" stroke-width="1px" />
<path d="M 452.91 464.108 L 458.21 464.108" stroke-width="1px" />
<path d="M 455.56 442.696 L 455.56 464.108" stroke-width="1px" />
<path d="M 354.799 363.347 L 376.211 363.347" stroke-width="1px" />
</g>
<g transform="matrix(5.3462 0 0 5.3462 -2252.1 -1673)" fill="none" stroke-linecap="square">
<path d="m459.01 347.82a114.14 114.14 0 0 1 114.14 114.14" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m459.01 333.63a128.32 128.32 0 0 1 128.32 128.32" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m459.01 340.72a121.23 121.23 0 0 1 121.23 121.23" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m573.15 461.96v37.389" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m573.15 499.34h14.185" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m587.33 461.96v37.389" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m421.62 333.63h37.389" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m421.62 333.63v14.185" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m421.62 347.82h37.389" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m421.62 340.72h37.389" style="stroke:#ec2525;" stroke-width="1px" />
<path d="m580.24 461.96v37.389" style="stroke:#ec2525;" stroke-width="1px" />
<g fill="none" stroke-linecap="butt" transform="matrix(9.6702 0 0 9.6702 -3430.96 -3487.99)" vector-effect="non-scaling-stroke">
<path d="M439.022,443.326 A63.4415,63.4415 0 0,0 375.581,379.885" style="stroke:#FF0000;stroke-width:2px" />
<path d="M446.907,443.326 A71.3261,71.3261 0 0,0 375.581,372" style="stroke:#FF0000;stroke-width:2px" />
<path d="M442.965,443.326 A67.3838,67.3838 0 0,0 375.581,375.942" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 439.022 443.326 L 439.022 464.108" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 439.022 464.108 L 446.907 464.108" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 446.907 443.326 L 446.907 464.108" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 354.799 372 L 375.581 372" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 354.799 372 L 354.799 379.885" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 354.799 379.885 L 375.581 379.885" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 354.799 375.942 L 375.581 375.942" style="stroke:#FF0000;stroke-width:2px" />
<path d="M 442.965 443.326 L 442.965 464.108" style="stroke:#FF0000;stroke-width:2px" />
</g>
</svg>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.103411px" transform="matrix(9.6702 0 0 9.6702 -3430.96 -3487.99)" vector-effect="non-scaling-stroke">
<path d="M 354.799 360.697 L 354.799 365.997" stroke-width="1px" />
</g>
</svg>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="rotate(0)">
<svg viewBox="0 0 111.763 1000.000" preserveAspectRatio="none" position="absolute" overflow="visible">
<svg viewBox="0 0 596.085 1000.000" preserveAspectRatio="none" position="absolute" overflow="visible">
<g fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width="0.126294px" transform="matrix(7.9180 0 0 7.9180 -3145.15 -2510.31)" vector-effect="non-scaling-stroke">
<path d="M411.328,441.351 A61.1669,61.1669 0 0,0 411.328,319.017" stroke-width="1px"/>
<path d="M 397.213 441.351 L 411.328 441.351" stroke-width="1px"/>

Before

Width:  |  Height:  |  Size: 825 B

After

Width:  |  Height:  |  Size: 825 B

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 111.763 1000.000" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="111.763" height="1000.000" space="preserve" xmlns="http://www.w3.org/2000/svg">
<svg viewBox="0 0 596.085 1000.000" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="596.085" height="1000.000" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width="0.126294px" transform="matrix(7.9180 0 0 7.9180 -3145.15 -2510.31)" vector-effect="non-scaling-stroke">
<path d="M411.328,441.351 A61.1669,61.1669 0 0,0 411.328,319.017" />
<path d="M 397.213 441.351 L 411.328 441.351" />

Before

Width:  |  Height:  |  Size: 694 B

After

Width:  |  Height:  |  Size: 694 B

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 1000.000 698.719" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="1000.000" height="698.719" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.287446px" transform="matrix(3.4789 0 0 3.4789 -1281.20 -986.54)" vector-effect="non-scaling-stroke">
<path d="M624.263,429.665 A218.069,218.069 0 0,0 422.794,295.048" />
<path d="M 368.277 283.578 L 368.277 306.518" />
<path d="M 368.277 295.048 L 422.794 295.048" />
<path d="M 624.263 429.665 L 645.126 480.033" />
</g>
<g fill="none" stroke="#FF0000" stroke-linecap="butt" stroke-width="0.287446px" transform="matrix(3.4789 0 0 3.4789 -1281.20 -986.54)" vector-effect="non-scaling-stroke">
<path d="M582.687,427.176 A153.357,153.357 0 0,0 441.004,332.507" />
<path d="M551.157,440.237 A119.229,119.229 0 0,0 441.004,366.634" />
<path d="M566.922,433.706 A136.293,136.293 0 0,0 441.004,349.571" />
<path d="M 561.172 464.413 L 592.702 451.353" />
<path d="M 582.687 427.176 L 592.702 451.353" />
<path d="M 409.929 332.507 L 441.004 332.507" />
<path d="M 409.929 332.507 L 409.929 366.634" />
<path d="M 409.929 366.634 L 441.004 366.634" />
<path d="M 551.157 440.237 L 561.172 464.413" />
<path d="M 566.922 433.706 L 576.937 457.883" />
<path d="M 409.929 349.571 L 441.004 349.571" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.287446px" transform="matrix(3.4789 0 0 3.4789 -1281.20 -986.54)" vector-effect="non-scaling-stroke">
<path d="M 634.529 484.422 L 655.723 475.643" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 1000.000 431.695" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="1000.000" height="431.695" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="#FF0000" stroke-linecap="butt" stroke-width="0.083918px" transform="matrix(11.9164 0 0 11.9164 -2094.46 -4354.36)" vector-effect="non-scaling-stroke">
<path d="M220.292,394.168 A65.3651,65.3651 0 0,0 195.277,389.193" />
<path d="M224.031,385.14 A75.1378,75.1378 0 0,0 195.277,379.42" />
<path d="M222.161,389.654 A70.2514,70.2514 0 0,0 195.277,384.306" />
<path d="M 175.763 389.193 L 195.277 389.193" />
<path d="M 175.763 379.42 L 175.763 389.193" />
<path d="M 175.763 379.42 L 195.277 379.42" />
<path d="M 224.031 385.14 L 242.06 392.607" />
<path d="M 238.32 401.636 L 242.06 392.607" />
<path d="M 220.292 394.168 L 238.32 401.636" />
<path d="M 175.763 384.306 L 195.277 384.306" />
<path d="M 222.161 389.654 L 240.19 397.122" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.083918px" transform="matrix(11.9164 0 0 11.9164 -2094.46 -4354.36)" vector-effect="non-scaling-stroke">
<path d="M228.136,375.229 A85.8629,85.8629 0 0,0 195.278,368.693" />
<path d="M 178.105 368.693 L 195.278 368.693" />
<path d="M 228.136 375.229 L 258.424 387.775" />
<path d="M 257.168 390.81 L 259.681 384.741" />
<path d="M 178.105 365.409 L 178.105 371.978" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 1000.000 416.397" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="1000.000" height="416.397" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="#FF0000" stroke-linecap="butt" stroke-width="0.184444px" transform="matrix(5.4217 0 0 5.4217 -1179.88 -2055.78)" vector-effect="non-scaling-stroke">
<path d="M350.34,393.778 A191.683,191.683 0 0,0 276.987,379.181" />
<path d="M346.969,401.914 A182.877,182.877 0 0,0 276.987,387.987" />
<path d="M343.599,410.049 A174.071,174.071 0 0,0 276.986,396.794" />
<path d="M 217.621 396.789 L 217.623 379.177" />
<path d="M 217.621 396.789 L 276.986 396.794" />
<path d="M 343.599 410.049 L 395.324 431.479" />
<path d="M 217.622 387.983 L 276.987 387.987" />
<path d="M 346.969 401.914 L 398.694 423.344" />
<path d="M 217.623 379.177 L 276.987 379.181" />
<path d="M 350.34 393.778 L 402.065 415.208" />
<path d="M 395.324 431.479 L 402.065 415.208" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.184444px" transform="matrix(5.4217 0 0 5.4217 -1179.88 -2055.78)" vector-effect="non-scaling-stroke">
<path d="M336.166,427.899 A154.742,154.742 0 0,0 276.948,416.12" />
<path d="M 246 416.12 L 276.948 416.12" />
<path d="M 336.166 427.899 L 390.751 450.51" />
<path d="M 388.486 455.979 L 393.017 445.041" />
<path d="M 246 410.201 L 246 422.04" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 1000.000 505.158" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="1000.000" height="505.158" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.604936px" transform="matrix(1.6531 0 0 1.6531 -346.37 -382.20)" vector-effect="non-scaling-stroke">
<path d="M695.707,411.783 A545.308,545.308 0 0,0 310.116,252.066" />
<path d="M 209.532 231.206 L 209.532 272.925" />
<path d="M 209.532 252.066 L 310.116 252.066" />
<path d="M 695.707 411.783 L 799.719 515.794" />
</g>
<g fill="none" stroke="#FF0000" stroke-linecap="butt" stroke-width="0.604936px" transform="matrix(1.6531 0 0 1.6531 -346.37 -382.20)" vector-effect="non-scaling-stroke">
<path d="M647.539,459.956 A477.194,477.194 0 0,0 310.112,320.189" />
<path d="M603.652,503.844 A415.128,415.128 0 0,0 310.112,382.255" />
<path d="M625.629,481.866 A446.209,446.209 0 0,0 310.112,351.175" />
<path d="M 603.652 503.844 L 636.602 536.794" />
<path d="M 636.602 536.794 L 680.49 492.907" />
<path d="M 647.539 459.956 L 680.49 492.907" />
<path d="M 263.513 320.189 L 310.112 320.189" />
<path d="M 263.513 320.189 L 263.513 382.255" />
<path d="M 263.513 382.255 L 310.112 382.255" />
<path d="M 263.513 351.222 L 310.112 351.175" />
<path d="M 625.629 481.866 L 658.546 514.85" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.604936px" transform="matrix(1.6531 0 0 1.6531 -346.37 -382.20)" vector-effect="non-scaling-stroke">
<path d="M 784.969 530.544 L 814.468 501.044" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 1000.000 728.287" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="1000.000" height="728.287" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.275776px" transform="matrix(3.6261 0 0 3.6261 -1356.58 -1028.29)" vector-effect="non-scaling-stroke">
<path d="M614.536,413.034 A197.471,197.471 0 0,0 432.097,291.132" />
<path d="M 635.93 484.422 L 649.888 478.641" />
<path d="M 614.536 413.034 L 642.909 481.531" />
<path d="M 374.112 291.132 L 432.097 291.132" />
</g>
<g fill="none" stroke="#FF0000" stroke-linecap="butt" stroke-width="0.275776px" transform="matrix(3.6261 0 0 3.6261 -1356.58 -1028.29)" vector-effect="non-scaling-stroke">
<path d="M566.39,419.996 A132.377,132.377 0 0,0 444.09,338.277" />
<path d="M587.155,411.395 A154.853,154.853 0 0,0 444.09,315.801" />
<path d="M576.773,415.695 A143.615,143.615 0 0,0 444.09,327.039" />
<path d="M 423.984 338.277 L 444.09 338.277" />
<path d="M 566.39 419.996 L 582.26 458.308" />
<path d="M 582.26 458.308 L 603.025 449.707" />
<path d="M 587.155 411.395 L 603.025 449.707" />
<path d="M 423.984 315.801 L 444.09 315.801" />
<path d="M 423.984 315.801 L 423.984 338.277" />
<path d="M 423.984 327.039 L 444.09 327.039" />
<path d="M 576.773 415.695 L 592.642 454.007" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.275776px" transform="matrix(3.6261 0 0 3.6261 -1356.58 -1028.29)" vector-effect="non-scaling-stroke">
<path d="M 374.112 283.578 L 374.112 298.686" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 1000.000 465.907" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="1000.000" height="465.907" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.241132px" transform="matrix(4.1471 0 0 4.1471 -1059.76 -1420.27)" vector-effect="non-scaling-stroke">
<path d="M444.11,421.897 A158.429,158.429 0 0,0 332.084,375.494" />
<path d="M 444.11 421.897 L 473.29 451.077" />
</g>
<g fill="none" stroke="#FF0000" stroke-linecap="butt" stroke-width="0.241132px" transform="matrix(4.1471 0 0 4.1471 -1059.76 -1420.27)" vector-effect="non-scaling-stroke">
<path d="M467.09,398.179 A190.19,190.19 0 0,0 332.606,342.473" />
<path d="M455.959,409.31 A174.448,174.448 0 0,0 332.606,358.216" />
<path d="M461.525,403.744 A182.319,182.319 0 0,0 332.606,350.345" />
<path d="M 455.959 409.31 L 485.542 438.893" />
<path d="M 485.542 438.893 L 496.673 427.761" />
<path d="M 467.09 398.179 L 496.673 427.761" />
<path d="M 255.541 342.473 L 332.606 342.473" />
<path d="M 255.541 342.473 L 255.541 358.216" />
<path d="M 255.541 358.216 L 332.606 358.216" />
<path d="M 461.525 403.744 L 491.107 433.327" />
<path d="M 255.541 350.345 L 332.606 350.345" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.241132px" transform="matrix(4.1471 0 0 4.1471 -1059.76 -1420.27)" vector-effect="non-scaling-stroke">
<path d="M 255.611 375.494 L 332.084 375.494" />
<path d="M 255.611 370.204 L 255.611 380.785" />
<path d="M 469.549 454.818 L 477.031 447.336" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 1000.000 470.515" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="1000.000" height="470.515" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="#FF0000" stroke-linecap="butt" stroke-width="0.139817px" transform="matrix(7.1522 0 0 7.1522 -2065.09 -2593.76)" vector-effect="non-scaling-stroke">
<path d="M400.292,403.219 A89.8793,89.8793 0 0,0 336.737,376.896" />
<path d="M393.267,410.244 A79.9439,79.9439 0 0,0 336.738,386.831" />
<path d="M396.78,406.732 A84.9116,84.9116 0 0,0 336.738,381.863" />
<path d="M400.292,403.219 A89.8793,89.8793 0 0,0 336.737,376.896" />
<path d="M393.267,410.244 A79.9439,79.9439 0 0,0 336.738,386.831" />
<path d="M396.78,406.732 A84.9116,84.9116 0 0,0 336.738,381.863" />
<path d="M 393.267 410.244 L 411.462 428.438" />
<path d="M 411.462 428.438 L 418.487 421.413" />
<path d="M 400.292 403.219 L 418.487 421.413" />
<path d="M 288.735 376.897 L 336.737 376.896" />
<path d="M 288.735 376.897 L 288.735 386.832" />
<path d="M 288.735 386.832 L 336.738 386.831" />
<path d="M 288.735 381.865 L 336.738 381.863" />
<path d="M 396.78 406.732 L 414.975 424.926" />
<path d="M 393.267 410.244 L 411.462 428.438" />
<path d="M 411.462 428.438 L 418.487 421.413" />
<path d="M 400.292 403.219 L 418.487 421.413" />
<path d="M 288.735 376.897 L 336.737 376.896" />
<path d="M 288.735 376.897 L 288.735 386.832" />
<path d="M 288.735 386.832 L 336.738 386.831" />
<path d="M 288.735 381.865 L 336.738 381.863" />
<path d="M 396.78 406.732 L 414.975 424.926" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.139817px" transform="matrix(7.1522 0 0 7.1522 -2065.09 -2593.76)" vector-effect="non-scaling-stroke">
<path d="M407.775,395.278 A99.9893,99.9893 0 0,0 337.071,365.992" />
<path d="M 288.807 365.992 L 337.071 365.992" />
<path d="M 407.775 395.278 L 426.191 413.694" />
<path d="M 288.807 362.652 L 288.807 369.331" />
<path d="M 423.83 416.056 L 428.552 411.333" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 1000.000 1000.000" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="1000.000" height="1000.000" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.096686px" transform="matrix(10.3428 0 0 10.3428 -2362.02 -3363.78)" vector-effect="non-scaling-stroke">
<path d="M311.429,404.267 A65.4056,65.4056 0 0,0 246.023,338.861" />
<path d="M 309.244 421.916 L 313.613 421.916" />
<path d="M 311.429 404.267 L 311.429 421.916" />
<path d="M 228.374 338.861 L 246.023 338.861" />
</g>
<g fill="none" stroke="#FF0000" stroke-linecap="butt" stroke-width="0.096686px" transform="matrix(10.3428 0 0 10.3428 -2362.02 -3363.78)" vector-effect="non-scaling-stroke">
<path d="M318.561,403.748 A72.0188,72.0188 0 0,0 246.542,331.729" />
<path d="M325.06,403.748 A78.5178,78.5178 0 0,0 246.542,325.23" />
<path d="M321.811,403.748 A75.2683,75.2683 0 0,0 246.542,328.479" />
<path d="M 318.561 403.748 L 318.561 421.916" />
<path d="M 318.561 421.916 L 325.06 421.916" />
<path d="M 325.06 403.748 L 325.06 421.916" />
<path d="M 228.374 325.23 L 246.542 325.23" />
<path d="M 228.374 325.23 L 228.374 331.729" />
<path d="M 228.374 331.729 L 246.542 331.729" />
<path d="M 228.374 328.479 L 246.542 328.479" />
<path d="M 321.811 403.748 L 321.811 421.916" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.096686px" transform="matrix(10.3428 0 0 10.3428 -2362.02 -3363.78)" vector-effect="non-scaling-stroke">
<path d="M 228.374 336.677 L 228.374 341.045" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 1000.000 1000.000" version="1.1" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" width="1000.000" height="1000.000" space="preserve" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.103411px" transform="matrix(9.6702 0 0 9.6702 -3430.96 -3487.99)" vector-effect="non-scaling-stroke">
<path d="M455.56,442.696 A79.3491,79.3491 0 0,0 376.211,363.347" />
<path d="M 452.91 464.108 L 458.21 464.108" />
<path d="M 455.56 442.696 L 455.56 464.108" />
<path d="M 354.799 363.347 L 376.211 363.347" />
</g>
<g fill="none" stroke="#FF0000" stroke-linecap="butt" stroke-width="0.103411px" transform="matrix(9.6702 0 0 9.6702 -3430.96 -3487.99)" vector-effect="non-scaling-stroke">
<path d="M439.022,443.326 A63.4415,63.4415 0 0,0 375.581,379.885" />
<path d="M446.907,443.326 A71.3261,71.3261 0 0,0 375.581,372" />
<path d="M442.965,443.326 A67.3838,67.3838 0 0,0 375.581,375.942" />
<path d="M 439.022 443.326 L 439.022 464.108" />
<path d="M 439.022 464.108 L 446.907 464.108" />
<path d="M 446.907 443.326 L 446.907 464.108" />
<path d="M 354.799 372 L 375.581 372" />
<path d="M 354.799 372 L 354.799 379.885" />
<path d="M 354.799 379.885 L 375.581 379.885" />
<path d="M 354.799 375.942 L 375.581 375.942" />
<path d="M 442.965 443.326 L 442.965 464.108" />
</g>
<g fill="none" stroke="rgb(255,255,0)" stroke-linecap="butt" stroke-width="0.103411px" transform="matrix(9.6702 0 0 9.6702 -3430.96 -3487.99)" vector-effect="non-scaling-stroke">
<path d="M 354.799 360.697 L 354.799 365.997" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="700.04" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 700.04" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(3.9046 0 0 3.9046 -1139.8 -1233.5)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width=".96802">
<path d="m340.75 326.58a193.45 193.45 0 0 1 178.72 119.42"/>
<path d="m292.39 316.4v20.35"/>
<path d="m292.39 326.58h48.362"/>
<path d="m519.47 445.99 18.507 44.681"/>
<path d="m528.58 494.57 18.801-7.788"/>
</g>
<g transform="matrix(3.9046 0 0 3.9046 -1139.8 -1233.5)" fill="none" stroke="#ec2525" stroke-linecap="square" stroke-width=".96802">
<path d="m356.9 359.8a136.04 136.04 0 0 1 125.69 83.981"/>
<path d="m356.9 390.08a105.77 105.77 0 0 1 97.717 65.292"/>
<path d="m356.9 374.94a120.9 120.9 0 0 1 111.7 74.636"/>
<path d="m463.5 476.82 27.97-11.586"/>
<path d="m482.59 443.78 8.883 21.447"/>
<path d="m329.34 359.8h27.566"/>
<path d="m329.34 359.8v30.275"/>
<path d="m329.34 390.08h27.566"/>
<path d="m454.62 455.37 8.883 21.447"/>
<path d="m468.61 449.58 8.883 21.447"/>
<path d="m329.34 374.94h27.566"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="434.11" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 434.11" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(7.9452 0 0 7.9452 -2977.5 -2991.4)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width=".47569">
<path d="m404.14 381.64a128.21 128.21 0 0 1 49.064 9.759"/>
<path d="m378.5 376.74v9.809"/>
<path d="m378.5 381.64h25.642"/>
<path d="m453.21 391.4 45.227 18.734"/>
<path d="m496.56 414.66 3.754-9.062"/>
</g>
<g transform="matrix(7.9452 0 0 7.9452 -2977.5 -2991.4)" fill="none" stroke="#ec2525" stroke-linecap="square" stroke-width=".47567">
<path d="m404.14 412.25a97.6 97.6 0 0 1 37.35 7.4298"/>
<path d="m404.14 397.66a112.2 112.2 0 0 1 42.934 8.5398"/>
<path d="m404.14 404.95a104.9 104.9 0 0 1 40.142 7.9848"/>
<path d="m375 412.25h29.138"/>
<path d="m375 397.66v14.592"/>
<path d="m375 397.66h29.138"/>
<path d="m447.08 406.2 26.92 11.151"/>
<path d="m468.42 430.83 5.5848-13.482"/>
<path d="m441.5 419.68 26.919 11.151"/>
<path d="m375 404.95h29.138"/>
<path d="m444.29 412.94 26.92 11.151"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="418.97" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 418.97" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(12.296 0 0 12.296 -8054.7 -4124.2)" fill="none" stroke="#ec2525" stroke-linecap="square" stroke-width=".3104">
<path d="m681.3 335.58a84.15 84.15 0 0 1 32.202 6.409"/>
<path d="m681.3 339.45a80.284 80.284 0 0 1 30.723 6.114"/>
<path d="m681.3 343.31a76.418 76.418 0 0 1 29.244 5.82"/>
<path d="m655.24 343.31 1e-3 -7.732"/>
<path d="m655.24 343.31 26.061 2e-3"/>
<path d="m710.55 349.13 22.707 9.408"/>
<path d="m655.24 339.44 26.062 2e-3"/>
<path d="m712.03 345.56 22.707 9.408"/>
<path d="m655.24 335.58 26.061 2e-3"/>
<path d="m713.51 341.99 22.708 9.407"/>
<path d="m733.26 358.54 2.96-7.144"/>
</g>
<g transform="matrix(12.296 0 0 12.296 -8054.7 -4124.2)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width=".3104">
<path d="m681.29 351.8a67.932 67.932 0 0 1 25.997 5.171"/>
<path d="m667.7 349.2v5.198"/>
<path d="m667.7 351.8h13.586"/>
<path d="m707.28 356.97 23.963 9.926"/>
<path d="m730.25 369.3 1.989-4.802"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="506.11" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 506.11" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(25.768 0 0 25.768 -7425.6 -10013)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width=".1463">
<path d="m294.66 389.98a34.824 34.824 0 0 1 24.624 10.2"/>
<path d="m288.24 388.65v2.664"/>
<path d="m288.24 389.98h6.423"/>
<path d="m319.29 400.18 6.642 6.642"/>
<path d="m324.99 407.77 1.883-1.884"/>
</g>
<g transform="matrix(25.768 0 0 25.768 -7425.6 -10013)" fill="none" stroke="#ec2525" stroke-linecap="square" stroke-width=".14592">
<path d="m294.65 394.32a30.395 30.395 0 0 1 21.492 8.903"/>
<path d="m294.65 398.27a26.442 26.442 0 0 1 18.698 7.745"/>
<path d="m294.65 396.29a28.422 28.422 0 0 1 20.097 8.3245"/>
<path d="m313.34 406.02 2.0986 2.0986"/>
<path d="m315.44 408.12 2.7948-2.7958"/>
<path d="m316.14 403.22 2.0986 2.0986"/>
<path d="m291.68 394.32h2.9683"/>
<path d="m291.68 394.32v3.9538"/>
<path d="m291.68 398.27h2.9683"/>
<path d="m291.68 396.3 2.9683-3e-3"/>
<path d="m314.74 404.62 2.0966 2.1016"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="729.48" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 729.48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(8.0024 0 0 8.0024 -3381.5 -3126.8)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-linejoin="miter" stroke-width=".47459">
<path d="m448.96 394.38a89.088 89.088 0 0 1 82.307 54.995"/>
<path d="m540.92 481.58 6.297-2.608"/>
<path d="m531.26 449.38 12.8 30.903"/>
<path d="m422.8 394.38h26.159"/>
<path d="m422.8 390.97v6.816"/>
</g>
<g transform="matrix(8.0024 0 0 8.0024 -3381.5 -3126.8)" fill="none" stroke="#ec2525" stroke-linecap="square" stroke-width=".47689">
<path d="m454.52 415.77a60.011 60.011 0 0 1 55.443 37.046"/>
<path d="m454.52 405.58a70.2 70.2 0 0 1 64.856 43.336"/>
<path d="m454.52 410.68a65.106 65.106 0 0 1 60.149 40.191"/>
<path d="m445.41 415.77h9.115"/>
<path d="m509.97 452.82 7.1947 17.369"/>
<path d="m517.16 470.19 9.4134-3.8998"/>
<path d="m519.38 448.92 7.1947 17.368"/>
<path d="m445.41 405.58h9.115"/>
<path d="m445.41 405.58v10.189"/>
<path d="m445.41 410.68h9.115"/>
<path d="m514.67 450.87 7.1947 17.368"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="468.34" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 468.34" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(2.7858 0 0 2.7858 -1004.9 -919.89)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width="1.3551">
<path d="m361.52 379.82h113.32"/><path d="m361.52 371.98v15.68"/><path d="m474.85 379.82a234.77 234.77 0 0 1 166.01 68.764"/>
<path d="m678.56 497.37 11.088-11.088"/>
<path d="m640.86 448.58 43.242 43.241"/>
</g>
<g transform="matrix(2.7858 0 0 2.7858 -1004.9 -919.89)" fill="none" stroke="#ec2525" stroke-linecap="square" stroke-width="1.3551">
<path d="m475.62 330.89a281.84 281.84 0 0 1 199.29 82.549"/>
<path d="m475.62 354.22a258.51 258.51 0 0 1 182.8 75.716"/>
<path d="m475.62 342.55a270.18 270.18 0 0 1 191.04 79.132"/>
<path d="m658.42 429.93 43.838 43.838"/>
<path d="m702.26 473.77 16.496-16.495"/>
<path d="m674.91 413.44 43.838 43.839"/>
<path d="m361.42 330.89h114.2"/>
<path d="m361.42 330.89v23.329"/>
<path d="m361.42 354.22h114.2"/>
<path d="m666.67 421.68 43.838 43.839"/>
<path d="m361.42 342.55h114.2"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="473.18" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 473.18" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(6.4098 0 0 6.4098 -2358.3 -2331.8)" fill="none" stroke="#ec2525" stroke-linecap="square" stroke-width=".59152">
<path d="m421.59 379.91a99.882 99.882 0 0 1 70.628 29.253"/>
<path d="m421.59 390.95a88.841 88.841 0 0 1 62.821 26.02"/>
<path d="m421.59 385.43a94.362 94.362 0 0 1 66.725 27.636"/>
<path d="m484.41 416.97 20.22 20.218"/>
<path d="m504.63 437.18 7.807-7.807"/>
<path d="m492.22 409.16 20.22 20.219"/>
<path d="m368.25 379.91 53.344-2e-3"/>
<path d="m368.25 379.91 1e-3 11.041"/>
<path d="m368.25 390.95 53.344-2e-3"/>
<path d="m368.25 385.43 53.344-1e-3"/>
<path d="m488.32 413.06 20.22 20.219"/>
</g>
<g transform="matrix(6.4098 0 0 6.4098 -2358.3 -2331.8)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width=".59152">
<path d="m421.85 367.79a111.12 111.12 0 0 1 78.572 32.545"/>
<path d="m518.26 423.42 5.248-5.248"/>
<path d="m368.22 367.79h53.636"/>
<path d="m500.42 400.33 20.466 20.466"/>
<path d="m368.22 364.08v7.422"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="1e3" fill-rule="evenodd" version="1.1" viewBox="0 0 1e3 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(8.497 0 0 8.497 -4283.5 -2426.3)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width=".4469">
<path d="m525.75 302.3a79.311 79.311 0 0 1 79.311 79.311"/>
<path d="m504.34 299.66v5.297"/>
<path d="m602.41 403.02h5.297"/>
<path d="m605.06 381.62v21.402"/>
<path d="m504.34 302.3h21.401"/>
</g>
<g transform="matrix(8.497 0 0 8.497 -4283.5 -2426.3)" fill="none" stroke="#ec2525" stroke-linecap="square" stroke-width=".4469">
<path d="m526.38 293.66a87.33 87.33 0 0 1 87.33 87.33"/>
<path d="m526.38 285.78a95.211 95.211 0 0 1 95.211 95.211"/>
<path d="m526.38 289.72a91.271 91.271 0 0 1 91.27 91.271"/>
<path d="m613.71 380.99v22.031"/>
<path d="m613.71 403.02h7.881"/>
<path d="m621.59 380.99v22.031"/>
<path d="m504.34 285.78h22.031"/>
<path d="m504.34 285.78v7.881"/>
<path d="m504.34 293.66h22.031"/>
<path d="m504.34 289.72h22.031"/>
<path d="m617.65 380.99v22.031"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -1,23 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="1e3" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(5.3462 0 0 5.3462 -2252.1 -1673)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-width=".70807">
<path d="m460.2 318.07a142.98 142.98 0 0 1 142.98 142.98"/>
<path d="m421.62 313.29v9.551"/>
<path d="m598.41 499.64h9.551"/>
<path d="m603.18 461.05v38.582"/>
<path d="m421.62 318.07h38.582"/>
</g>
<g transform="matrix(5.3462 0 0 5.3462 -2252.1 -1673)" fill="none" stroke="#ec2525" stroke-linecap="square" stroke-linejoin="miter" stroke-width=".70696">
<path d="m459.01 347.82a114.14 114.14 0 0 1 114.14 114.14"/>
<path d="m459.01 333.63a128.32 128.32 0 0 1 128.32 128.32"/>
<path d="m459.01 340.72a121.23 121.23 0 0 1 121.23 121.23"/>
<path d="m573.15 461.96v37.389"/>
<path d="m573.15 499.34h14.185"/>
<path d="m587.33 461.96v37.389"/>
<path d="m421.62 333.63h37.389"/>
<path d="m421.62 333.63v14.185"/>
<path d="m421.62 347.82h37.389"/>
<path d="m421.62 340.72h37.389"/>
<path d="m580.24 461.96v37.389"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,31 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="368.277,283.578 368.277,306.518 " />
<polyline points="368.277,295.048 422.794,295.048 " />
<polyline points="645.126,480.033 624.263,429.665 " />
<path d="M624.263,429.665 A218.069,218.069 0 0,0 422.794,295.048 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.1" >
<polyline points="561.172,464.413 592.702,451.353 " />
<polyline points="592.702,451.353 582.687,427.176 " />
<path d="M582.687,427.176 A153.357,153.357 0 0,0 441.004,332.507 " />
<polyline points="441.004,332.507 409.929,332.507 " />
<polyline points="409.929,332.507 409.929,366.634 " />
<polyline points="409.929,366.634 441.004,366.634 " />
<path d="M551.157,440.237 A119.229,119.229 0 0,0 441.004,366.634 " />
<polyline points="551.157,440.237 561.172,464.413 " />
<polyline points="576.937,457.883 566.922,433.706 " />
<path d="M566.922,433.706 A136.293,136.293 0 0,0 441.004,349.571 " />
<polyline points="441.004,349.571 409.929,349.571 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="634.529,484.422 655.723,475.643 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,29 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.1" >
<path d="M220.292,394.168 A65.3651,65.3651 0 0,0 195.277,389.193 " />
<polyline points="195.277,389.193 175.763,389.193 " />
<polyline points="175.763,389.193 175.763,379.42 " />
<polyline points="175.763,379.42 195.277,379.42 " />
<path d="M224.031,385.14 A75.1378,75.1378 0 0,0 195.277,379.42 " />
<polyline points="224.031,385.14 242.06,392.607 " />
<polyline points="242.06,392.607 238.32,401.636 " />
<polyline points="238.32,401.636 220.292,394.168 " />
<path d="M222.161,389.654 A70.2514,70.2514 0 0,0 195.277,384.306 " />
<polyline points="195.277,384.306 175.763,384.306 " />
<polyline points="222.161,389.654 240.19,397.122 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="178.105,368.693 195.278,368.693 " />
<polyline points="258.424,387.775 228.136,375.229 " />
<path d="M228.136,375.229 A85.8629,85.8629 0 0,0 195.278,368.693 " />
<polyline points="257.168,390.81 259.681,384.741 " />
<polyline points="178.105,365.409 178.105,371.978 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,29 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.1" >
<polyline points="217.621,396.789 217.623,379.177 " />
<polyline points="276.986,396.794 217.621,396.789 " />
<polyline points="395.324,431.479 343.599,410.049 " />
<polyline points="276.987,387.987 217.622,387.983 " />
<polyline points="346.969,401.914 398.694,423.344 " />
<polyline points="276.987,379.181 217.623,379.177 " />
<polyline points="402.065,415.208 350.34,393.778 " />
<polyline points="395.324,431.479 402.065,415.208 " />
<path d="M350.34,393.778 A191.683,191.683 0 0,0 276.987,379.181 " />
<path d="M346.969,401.914 A182.877,182.877 0 0,0 276.987,387.987 " />
<path d="M343.599,410.049 A174.071,174.071 0 0,0 276.986,396.794 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="246,416.12 276.948,416.12 " />
<polyline points="390.751,450.51 336.166,427.899 " />
<polyline points="393.017,445.041 388.486,455.979 " />
<path d="M336.166,427.899 A154.742,154.742 0 0,0 276.948,416.12 " />
<polyline points="246,410.201 246,422.04 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,31 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="209.532,272.925 209.532,231.206 " />
<polyline points="209.532,252.066 310.116,252.066 " />
<polyline points="799.719,515.794 695.707,411.783 " />
<path d="M695.707,411.783 A545.308,545.308 0 0,0 310.116,252.066 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.1" >
<polyline points="603.652,503.844 636.602,536.794 " />
<polyline points="636.602,536.794 680.49,492.907 " />
<polyline points="680.49,492.907 647.539,459.956 " />
<path d="M647.539,459.956 A477.194,477.194 0 0,0 310.112,320.189 " />
<polyline points="310.112,320.189 263.513,320.189 " />
<polyline points="263.513,320.189 263.513,382.255 " />
<polyline points="263.513,382.255 310.112,382.255 " />
<path d="M603.652,503.844 A415.128,415.128 0 0,0 310.112,382.255 " />
<path d="M625.629,481.866 A446.209,446.209 0 0,0 310.112,351.175 " />
<polyline points="310.112,351.175 263.513,351.222 " />
<polyline points="625.629,481.866 658.546,514.85 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="784.969,530.544 814.468,501.044 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,31 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="649.888,478.641 635.93,484.422 " />
<polyline points="642.909,481.531 614.536,413.034 " />
<polyline points="374.112,291.132 432.097,291.132 " />
<path d="M614.536,413.034 A197.471,197.471 0 0,0 432.097,291.132 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.1" >
<polyline points="423.984,338.277 444.09,338.277 " />
<path d="M566.39,419.996 A132.377,132.377 0 0,0 444.09,338.277 " />
<polyline points="566.39,419.996 582.26,458.308 " />
<polyline points="582.26,458.308 603.025,449.707 " />
<polyline points="603.025,449.707 587.155,411.395 " />
<path d="M587.155,411.395 A154.853,154.853 0 0,0 444.09,315.801 " />
<polyline points="444.09,315.801 423.984,315.801 " />
<polyline points="423.984,315.801 423.984,338.277 " />
<polyline points="423.984,327.039 444.09,327.039 " />
<path d="M576.773,415.695 A143.615,143.615 0 0,0 444.09,327.039 " />
<polyline points="576.773,415.695 592.642,454.007 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="374.112,283.578 374.112,298.686 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,31 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="473.29,451.077 444.11,421.897 " />
<path d="M444.11,421.897 A158.429,158.429 0 0,0 332.084,375.494 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.1" >
<polyline points="455.959,409.31 485.542,438.893 " />
<polyline points="485.542,438.893 496.673,427.761 " />
<polyline points="496.673,427.761 467.09,398.179 " />
<path d="M467.09,398.179 A190.19,190.19 0 0,0 332.606,342.473 " />
<polyline points="332.606,342.473 255.541,342.473 " />
<polyline points="255.541,342.473 255.541,358.216 " />
<polyline points="255.541,358.216 332.606,358.216 " />
<path d="M455.959,409.31 A174.448,174.448 0 0,0 332.606,358.216 " />
<polyline points="461.525,403.744 491.107,433.327 " />
<path d="M461.525,403.744 A182.319,182.319 0 0,0 332.606,350.345 " />
<polyline points="332.606,350.345 255.541,350.345 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="255.611,375.494 332.084,375.494 " />
<polyline points="255.611,380.785 255.611,370.204 " />
<polyline points="469.549,454.818 477.031,447.336 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,40 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.1" >
<polyline points="393.267,410.244 411.462,428.438 " />
<polyline points="411.462,428.438 418.487,421.413 " />
<polyline points="418.487,421.413 400.292,403.219 " />
<path d="M400.292,403.219 A89.8793,89.8793 0 0,0 336.737,376.896 " />
<polyline points="336.737,376.896 288.735,376.897 " />
<polyline points="288.735,376.897 288.735,386.832 " />
<polyline points="288.735,386.832 336.738,386.831 " />
<path d="M393.267,410.244 A79.9439,79.9439 0 0,0 336.738,386.831 " />
<path d="M396.78,406.732 A84.9116,84.9116 0 0,0 336.738,381.863 " />
<polyline points="336.738,381.863 288.735,381.865 " />
<polyline points="396.78,406.732 414.975,424.926 " />
<polyline points="393.267,410.244 411.462,428.438 " />
<polyline points="411.462,428.438 418.487,421.413 " />
<polyline points="418.487,421.413 400.292,403.219 " />
<path d="M400.292,403.219 A89.8793,89.8793 0 0,0 336.737,376.896 " />
<polyline points="336.737,376.896 288.735,376.897 " />
<polyline points="288.735,376.897 288.735,386.832 " />
<polyline points="288.735,386.832 336.738,386.831 " />
<path d="M393.267,410.244 A79.9439,79.9439 0 0,0 336.738,386.831 " />
<path d="M396.78,406.732 A84.9116,84.9116 0 0,0 336.738,381.863 " />
<polyline points="336.738,381.863 288.735,381.865 " />
<polyline points="396.78,406.732 414.975,424.926 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="288.807,365.992 337.071,365.992 " />
<polyline points="426.191,413.694 407.775,395.278 " />
<polyline points="288.807,369.331 288.807,362.652 " />
<path d="M407.775,395.278 A99.9893,99.9893 0 0,0 337.071,365.992 " />
<polyline points="423.83,416.056 428.552,411.333 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,31 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="309.244,421.916 313.613,421.916 " />
<polyline points="311.429,421.916 311.429,404.267 " />
<polyline points="228.374,338.861 246.023,338.861 " />
<path d="M311.429,404.267 A65.4056,65.4056 0 0,0 246.023,338.861 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.1" >
<path d="M318.561,403.748 A72.0188,72.0188 0 0,0 246.542,331.729 " />
<polyline points="318.561,403.748 318.561,421.916 " />
<polyline points="318.561,421.916 325.06,421.916 " />
<polyline points="325.06,421.916 325.06,403.748 " />
<path d="M325.06,403.748 A78.5178,78.5178 0 0,0 246.542,325.23 " />
<polyline points="246.542,325.23 228.374,325.23 " />
<polyline points="228.374,325.23 228.374,331.729 " />
<polyline points="228.374,331.729 246.542,331.729 " />
<polyline points="246.542,328.479 228.374,328.479 " />
<path d="M321.811,403.748 A75.2683,75.2683 0 0,0 246.542,328.479 " />
<polyline points="321.811,403.748 321.811,421.916 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="228.374,336.677 228.374,341.045 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -0,0 +1,31 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="452.91,464.108 458.21,464.108 " />
<polyline points="455.56,464.108 455.56,442.696 " />
<polyline points="354.799,363.347 376.211,363.347 " />
<path d="M455.56,442.696 A79.3491,79.3491 0 0,0 376.211,363.347 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.1" >
<path d="M439.022,443.326 A63.4415,63.4415 0 0,0 375.581,379.885 " />
<polyline points="439.022,443.326 439.022,464.108 " />
<polyline points="439.022,464.108 446.907,464.108 " />
<polyline points="446.907,464.108 446.907,443.326 " />
<path d="M446.907,443.326 A71.3261,71.3261 0 0,0 375.581,372 " />
<polyline points="375.581,372 354.799,372 " />
<polyline points="354.799,372 354.799,379.885 " />
<polyline points="354.799,379.885 375.581,379.885 " />
<polyline points="375.581,375.942 354.799,375.942 " />
<path d="M442.965,443.326 A67.3838,67.3838 0 0,0 375.581,375.942 " />
<polyline points="442.965,443.326 442.965,464.108 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,255,0)" stroke-width="0.1" >
<polyline points="354.799,360.697 354.799,365.997 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -1,29 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.1" >
<polyline points="292.389,316.4 292.389,336.75 " />
<polyline points="292.389,326.575 340.751,326.575 " stroke-dasharray="14.231860,1.581318,3.162635,1.581318,3.162635,1.581318" />
<polyline points="537.981,490.674 519.474,445.993 " stroke-dasharray="14.231860,1.581318,3.162635,1.581318,3.162635,1.581318" />
<polyline points="547.382,486.78 528.581,494.568 " />
<path d="M519.474,445.993 A193.448,193.448 0 0,0 340.751,326.575 " stroke-dasharray="14.231860,1.581318,3.162635,1.581318,3.162635,1.581318" />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" >
<polyline points="463.505,476.818 491.475,465.232 " />
<polyline points="491.475,465.232 482.592,443.785 " />
<path d="M482.592,443.785 A136.042,136.042 0 0,0 356.905,359.804 " />
<polyline points="356.905,359.804 329.339,359.804 " />
<polyline points="329.339,359.804 329.339,390.079 " />
<polyline points="329.339,390.079 356.905,390.079 " />
<path d="M454.622,455.371 A105.768,105.768 0 0,0 356.905,390.079 " />
<polyline points="454.622,455.371 463.505,476.818 " />
<polyline points="477.49,471.025 468.607,449.578 " />
<path d="M468.607,449.578 A120.905,120.905 0 0,0 356.905,374.942 " />
<polyline points="356.905,374.942 329.339,374.942 " />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,30 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.1" >
<polyline points="378.502,386.545 378.502,376.736 " />
<polyline points="378.502,381.641 404.144,381.641 " stroke-dasharray="6.859903,0.762211,1.524423,0.762211,1.524423,0.762211" />
<polyline points="498.435,410.134 453.208,391.4 " stroke-dasharray="6.859903,0.762211,1.524423,0.762211,1.524423,0.762211" />
<polyline points="500.312,405.603 496.558,414.665 " />
<path d="M453.208,391.4 A128.211,128.211 0 0,0 404.144,381.641 " stroke-dasharray="6.859903,0.762211,1.524423,0.762211,1.524423,0.762211" />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" >
<path d="M441.495,419.68 A97.6032,97.6032 0 0,0 404.144,412.25 " />
<polyline points="404.144,412.25 375.005,412.25 " />
<polyline points="375.005,412.25 375.005,397.658 " />
<polyline points="375.005,397.658 404.144,397.658 " />
<path d="M447.079,406.198 A112.196,112.196 0 0,0 404.144,397.658 " />
<polyline points="447.079,406.198 474,417.349 " />
<polyline points="474,417.349 468.415,430.831 " />
<polyline points="468.415,430.831 441.495,419.68 " />
<path d="M444.287,412.939 A104.9,104.9 0 0,0 404.144,404.954 " />
<polyline points="404.144,404.954 375.005,404.954 " />
<polyline points="444.287,412.939 471.208,424.09 " />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,28 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" >
<polyline points="655.243,343.311 655.244,335.579 " />
<polyline points="681.304,343.313 655.243,343.311 " />
<polyline points="733.255,358.541 710.548,349.133 " />
<polyline points="681.305,339.447 655.243,339.445 " />
<polyline points="712.028,345.561 734.735,354.969 " />
<polyline points="681.305,335.581 655.244,335.579 " />
<polyline points="736.215,351.397 713.507,341.99 " />
<polyline points="733.255,358.541 736.215,351.397 " />
<path d="M713.507,341.99 A84.1497,84.1497 0 0,0 681.305,335.581 " />
<path d="M712.028,345.561 A80.2837,80.2837 0 0,0 681.305,339.447 " />
<path d="M710.548,349.133 A76.4178,76.4178 0 0,0 681.304,343.313 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.1" >
<polyline points="667.702,354.397 667.702,349.199 " />
<polyline points="667.702,351.798 681.288,351.798 " stroke-dasharray="3.634723,0.403858,0.807716,0.403858,0.807716,0.403858" />
<polyline points="731.248,366.895 707.285,356.969 " stroke-dasharray="3.634723,0.403858,0.807716,0.403858,0.807716,0.403858" />
<polyline points="732.243,364.494 730.254,369.296 " />
<path d="M707.285,356.969 A67.9324,67.9324 0 0,0 681.288,351.798 " stroke-dasharray="3.634723,0.403858,0.807716,0.403858,0.807716,0.403858" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

@@ -1,29 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.25" >
<polyline points="288.241,391.315 288.241,388.651 " />
<polyline points="288.241,389.983 294.664,389.983 " stroke-dasharray="0.284920,0.031658,0.063315,0.031658,0.063315,0.031658" />
<polyline points="325.93,406.825 319.288,400.183 " stroke-dasharray="0.284920,0.031658,0.063315,0.031658,0.063315,0.031658" />
<polyline points="326.872,405.883 324.989,407.767 " />
<path d="M319.288,400.183 A34.8235,34.8235 0 0,0 294.664,389.983 " stroke-dasharray="0.284920,0.031658,0.063315,0.031658,0.063315,0.031658" />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(255,0,0)" stroke-width="0.25" >
<polyline points="313.41,406.062 315.514,408.166 " />
<polyline points="315.514,408.166 318.316,405.363 " />
<polyline points="318.316,405.363 316.212,403.259 " />
<path d="M316.212,403.259 A30.4737,30.4737 0 0,0 294.664,394.333 " />
<polyline points="294.664,394.333 291.688,394.333 " />
<polyline points="291.688,394.333 291.688,398.297 " />
<polyline points="291.688,398.297 294.664,398.297 " />
<path d="M313.41,406.062 A26.5102,26.5102 0 0,0 294.664,398.297 " />
<path d="M314.813,404.658 A28.495,28.495 0 0,0 294.664,396.312 " />
<polyline points="294.664,396.312 291.688,396.315 " />
<polyline points="314.813,404.658 316.915,406.765 " />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,29 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.1" >
<polyline points="547.214,478.976 540.917,481.584 " />
<polyline points="544.065,480.28 531.265,449.377 " stroke-dasharray="4.766665,0.529629,1.059259,0.529629,1.059259,0.529629" />
<polyline points="422.799,394.382 448.958,394.382 " stroke-dasharray="4.766665,0.529629,1.059259,0.529629,1.059259,0.529629" />
<polyline points="422.799,390.974 422.799,397.79 " />
<path d="M531.265,449.377 A89.0882,89.0882 0 0,0 448.958,394.382 " stroke-dasharray="4.766665,0.529629,1.059259,0.529629,1.059259,0.529629" />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" >
<polyline points="445.298,415.651 454.369,415.651 " />
<path d="M509.544,452.518 A59.7215,59.7215 0 0,0 454.369,415.651 " />
<polyline points="509.544,452.518 516.704,469.803 " />
<polyline points="516.704,469.803 526.072,465.922 " />
<polyline points="526.072,465.922 518.912,448.638 " />
<path d="M518.912,448.638 A69.8614,69.8614 0 0,0 454.369,405.511 " />
<polyline points="454.369,405.511 445.298,405.511 " />
<polyline points="445.298,405.511 445.298,415.651 " />
<polyline points="445.298,410.581 454.369,410.581 " />
<path d="M514.228,450.578 A64.7914,64.7914 0 0,0 454.369,410.581 " />
<polyline points="514.228,450.578 521.388,467.862 " />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,31 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.1" >
<polyline points="678.557,497.369 689.645,486.281 " />
<polyline points="684.101,491.825 640.859,448.584 " stroke-dasharray="10.966450,1.218494,2.436989,1.218494,2.436989,1.218494" />
<path d="M640.859,448.584 A234.774,234.774 0 0,0 474.849,379.82 " stroke-dasharray="10.966450,1.218494,2.436989,1.218494,2.436989,1.218494" />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" >
<polyline points="658.418,429.931 702.256,473.769 " />
<polyline points="702.256,473.769 718.752,457.274 " />
<polyline points="718.752,457.274 674.914,413.435 " />
<path d="M674.914,413.435 A281.84,281.84 0 0,0 475.622,330.886 " />
<polyline points="475.622,330.886 361.421,330.886 " />
<polyline points="361.421,330.886 361.421,354.215 " />
<polyline points="361.421,354.215 475.622,354.215 " />
<path d="M658.418,429.931 A258.512,258.512 0 0,0 475.622,354.215 " />
<polyline points="666.666,421.683 710.504,465.522 " />
<path d="M666.666,421.683 A270.176,270.176 0 0,0 475.622,342.551 " />
<polyline points="475.622,342.551 361.421,342.551 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.1" >
<polyline points="361.524,379.82 474.849,379.82 " stroke-dasharray="10.966450,1.218494,2.436989,1.218494,2.436989,1.218494" />
<polyline points="361.524,387.66 361.524,371.98 " />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

@@ -1,28 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" >
<polyline points="484.412,416.967 504.632,437.185 " />
<polyline points="504.632,437.185 512.439,429.378 " />
<polyline points="512.439,429.378 492.219,409.159 " />
<path d="M492.219,409.159 A99.8821,99.8821 0 0,0 421.591,379.906 " />
<polyline points="421.591,379.906 368.247,379.908 " />
<polyline points="368.246,379.908 368.247,390.949 " />
<polyline points="368.247,390.949 421.591,390.947 " />
<path d="M484.412,416.967 A88.8409,88.8409 0 0,0 421.591,390.947 " />
<path d="M488.316,413.063 A94.3615,94.3615 0 0,0 421.591,385.427 " />
<polyline points="421.591,385.427 368.247,385.428 " />
<polyline points="488.316,413.063 508.536,433.282 " />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.1" >
<polyline points="518.265,423.424 523.513,418.176 " />
<polyline points="368.215,367.789 421.851,367.789 " stroke-dasharray="5.190369,0.576708,1.153415,0.576708,1.153415,0.576708" />
<polyline points="520.889,420.8 500.423,400.334 " stroke-dasharray="5.190369,0.576708,1.153415,0.576708,1.153415,0.576708" />
<polyline points="368.215,371.5 368.215,364.078 " />
<path d="M500.423,400.334 A111.117,111.117 0 0,0 421.851,367.789 " stroke-dasharray="5.190369,0.576708,1.153415,0.576708,1.153415,0.576708" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

@@ -1,29 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.1" >
<polyline points="504.345,304.954 504.345,299.657 " />
<polyline points="602.409,403.018 607.706,403.018 " />
<polyline points="605.057,403.018 605.057,381.616 " stroke-dasharray="3.704670,0.411630,0.823260,0.411630,0.823260,0.411630" />
<polyline points="504.345,302.305 525.746,302.305 " stroke-dasharray="3.704670,0.411630,0.823260,0.411630,0.823260,0.411630" />
<path d="M605.057,381.616 A79.3109,79.3109 0 0,0 525.746,302.305 " stroke-dasharray="3.704670,0.411630,0.823260,0.411630,0.823260,0.411630" />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" >
<path d="M613.706,380.987 A87.3301,87.3301 0 0,0 526.376,293.657 " />
<polyline points="613.706,380.987 613.706,403.018 " />
<polyline points="613.706,403.018 621.587,403.018 " />
<polyline points="621.587,403.018 621.587,380.987 " />
<path d="M621.587,380.987 A95.2109,95.2109 0 0,0 526.376,285.776 " />
<polyline points="526.376,285.776 504.345,285.776 " />
<polyline points="504.345,285.776 504.345,293.657 " />
<polyline points="504.345,293.657 526.376,293.657 " />
<polyline points="526.376,289.716 504.345,289.716 " />
<path d="M617.646,380.987 A91.2705,91.2705 0 0,0 526.376,289.716 " />
<polyline points="617.646,380.987 617.646,403.018 " />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -1,29 +0,0 @@
<?xml version="1.0" standalone="no"?>
<svg viewBox="0 0 1024 768" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-linecap="round" stroke-linejoin="round" fill-rule="evenodd" xml:space="preserve" >
<defs >
<clipPath id="clipId0" >
<path d="M0,768 1024,768 1024,0 0,0 z" />
</clipPath>
</defs>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.1" >
<polyline points="421.617,322.83 421.617,313.294 " />
<polyline points="598.131,499.344 607.667,499.344 " />
<polyline points="602.899,499.344 602.899,460.822 " stroke-dasharray="6.668406,0.740934,1.481868,0.740934,1.481868,0.740934" />
<polyline points="421.617,318.062 460.139,318.062 " stroke-dasharray="6.668406,0.740934,1.481868,0.740934,1.481868,0.740934" />
<path d="M602.899,460.822 A142.76,142.76 0 0,0 460.139,318.062 " stroke-dasharray="6.668406,0.740934,1.481868,0.740934,1.481868,0.740934" />
</g>
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,0,0)" stroke-width="0.1" >
<path d="M573.146,461.955 A114.14,114.14 0 0,0 459.006,347.815 " />
<polyline points="573.146,461.955 573.146,499.344 " />
<polyline points="573.146,499.344 587.331,499.344 " />
<polyline points="587.331,499.344 587.331,461.955 " />
<path d="M587.331,461.955 A128.325,128.325 0 0,0 459.006,333.63 " />
<polyline points="459.006,333.63 421.617,333.63 " />
<polyline points="421.617,333.63 421.617,347.815 " />
<polyline points="421.617,347.815 459.006,347.815 " />
<polyline points="459.006,340.722 421.617,340.722 " />
<path d="M580.239,461.955 A121.232,121.232 0 0,0 459.006,340.722 " />
<polyline points="580.239,461.955 580.239,499.344 " />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
+3
View File
@@ -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"
@@ -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)
@@ -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)
@@ -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)
@@ -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:
@@ -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}")
@@ -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
@@ -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'<?xml version="1.0" ?>', b'<?xml version="1.0" encoding="utf-8"?>')
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!")
@@ -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=1no 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)
@@ -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 = '<?xml version="1.0" encoding="UTF-8"?>\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)
@@ -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('</svg>', '\n</svg>')
@@ -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()
@@ -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("</"):
lines.append(line)
return "\n".join(lines)
def convert_svg_to_xml(svg_path, output_dir):
"""Convert SVG to target XML format"""
sivasnr = extract_sivasnr(os.path.basename(svg_path))
if not sivasnr:
raise ValueError(f"Invalid filename format: {os.path.basename(svg_path)}")
# Parse original SVG
try:
tree = ET.parse(svg_path)
svg_root = tree.getroot()
except Exception as e:
raise ValueError(f"SVG parsing error: {str(e)}")
# Build new structure
new_xml = create_xml_structure(svg_root)
formatted_xml = format_xml(new_xml)
# Ensure output directory exists
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, f"{sivasnr}.xml")
# Write file (UTF-8 encoding)
with open(output_path, "w", encoding="UTF-8") as f:
f.write(formatted_xml)
return f"SSG/shapes/svg/{sivasnr}.xml"
def update_txt_file(txt_path, xml_rel_path):
"""Update path in TXT file"""
try:
with open(txt_path, "r", encoding="UTF-8-sig") as f:
data = json.load(f)
if "srcSVG" not in data:
raise ValueError("Missing srcSVG field")
data["srcSVG"] = xml_rel_path
with open(txt_path, "w", encoding="UTF-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
return True
except Exception as e:
print(f"Update failed {os.path.basename(txt_path)}: {str(e)}")
return False
def process_files(svg_dir, txt_dir, output_dir):
"""Batch process files"""
if not all(map(os.path.exists, [svg_dir, txt_dir])):
raise FileNotFoundError("Input directory not found")
results = {"success": 0, "failed": 0}
for svg_file in os.listdir(svg_dir):
if not svg_file.endswith(".svg"):
continue
svg_path = os.path.join(svg_dir, svg_file)
sivasnr = extract_sivasnr(svg_file)
if not sivasnr:
print(f"Skipping invalid file: {svg_file}")
results["failed"] += 1
continue
try:
# Convert file
xml_rel_path = convert_svg_to_xml(svg_path, output_dir)
# Update TXT
txt_path = os.path.join(txt_dir, f"{sivasnr}.txt")
if not os.path.exists(txt_path):
raise FileNotFoundError(f"Corresponding TXT file not found: {sivasnr}.txt")
if update_txt_file(txt_path, xml_rel_path):
print(f"Success: {svg_file}{sivasnr}.xml")
results["success"] += 1
else:
results["failed"] += 1
except Exception as e:
print(f"Processing failed {svg_file}: {str(e)}")
results["failed"] += 1
# Output report
print(f"\nProcessing complete: {results['success']} succeeded, {results['failed']} failed")
if __name__ == "__main__":
# Configuration - modify these paths as needed
SVG_INPUT_FOLDER = os.environ.get('RD_CONF_OUTPUT_TEFBOGEN') # Folder containing SVG files
SVG_OUTPUT_FOLDER = os.environ.get("SVG_PATH","svg")
PRORPS_FOLDER = os.environ.get("PROPS_PATH", "props") # Folder containing txt files
# Start processing
process_files(SVG_INPUT_FOLDER, PRORPS_FOLDER, SVG_OUTPUT_FOLDER)
print("\nProcessing complete.")
@@ -23,16 +23,16 @@
"ProfilTyp": "APB 110 R 630/90° 800/800 mit TEF Innen",
"Radius": 630,
"KurvenWinkel": 90,
"Gruppe_width_mm":821.040,
"Gruppe_height_mm":821.040,
"Gruppe_width_mm":821.0391,
"Gruppe_height_mm":821.0391,
"OFBogen_center_line_width_mm": 800,
"OFBogen_center_line_height_mm": 800,
"TEFBogen_center_line_width_mm": 700,
"TEFBogen_center_line_height_mm": 700,
"OFBogen_CP1_x_mm":0,
"TEFBogen_CP1_x_mm":0,
"OFBogen_CP1_y_mm":21.040,
"TEFBogen_CP1_y_mm":121.040,
"OFBogen_CP1_y_mm":21.0391,
"TEFBogen_CP1_y_mm":121.0391,
"SivasnrTEF": "0_B10050",
"Antriebsart":1
},
@@ -41,16 +41,16 @@
"ProfilTyp": "APB 110 R 550/22,5° 84/522 mit TEF Innen",
"Radius": 550,
"KurvenWinkel": 22.5,
"Gruppe_width_mm":537.544,
"Gruppe_height_mm":232.057,
"OFBogen_center_line_width_mm": 514.491,
"OFBogen_center_line_height_mm": 122.230,
"TEFBogen_center_line_width_mm": 412.692,
"TEFBogen_center_line_height_mm": 82.090,
"Gruppe_width_mm":537.5439,
"Gruppe_height_mm":232.0561,
"OFBogen_center_line_width_mm": 514.4906,
"OFBogen_center_line_height_mm": 122.2298,
"TEFBogen_center_line_width_mm": 412.6925,
"TEFBogen_center_line_height_mm": 82.0896,
"OFBogen_CP1_x_mm":15.002,
"TEFBogen_CP1_x_mm":0,
"OFBogen_CP1_y_mm":21.040,
"TEFBogen_CP1_y_mm":121.049,
"OFBogen_CP1_y_mm":21.0391,
"TEFBogen_CP1_y_mm":121.0491,
"SivasnrTEF": "0_B10090",
"Antriebsart":1
},
@@ -59,12 +59,12 @@
"ProfilTyp": "APB 110 R 550/22,5° 84/522 mit TEF Aussen",
"Radius": 550,
"KurvenWinkel": 22.5,
"Gruppe_width_mm":655.564,
"Gruppe_height_mm":272.978,
"OFBogen_center_line_width_mm": 514.491,
"OFBogen_center_line_height_mm": 122.230,
"TEFBogen_center_line_width_mm": 643.589,
"TEFBogen_center_line_height_mm": 125.683,
"Gruppe_width_mm":655.569,
"Gruppe_height_mm":272.9777,
"OFBogen_center_line_width_mm": 514.4906,
"OFBogen_center_line_height_mm": 122.2298,
"TEFBogen_center_line_width_mm": 643.5863,
"TEFBogen_center_line_height_mm": 125.6835,
"OFBogen_CP1_x_mm":100.867,
"TEFBogen_CP1_x_mm":0,
"OFBogen_CP1_y_mm":131.310,
@@ -78,16 +78,16 @@
"ProfilTyp": "APB 110 R 550/45° 232/610 mit TEF Innen",
"Radius": 550,
"KurvenWinkel": 45,
"Gruppe_width_mm":610.142,
"Gruppe_height_mm":308.217,
"OFBogen_center_line_width_mm": 595.265,
"OFBogen_center_line_height_mm": 265.998,
"TEFBogen_center_line_width_mm": 398.432,
"TEFBogen_center_line_height_mm": 165.036,
"Gruppe_width_mm":610.1420,
"Gruppe_height_mm":308.2175,
"OFBogen_center_line_width_mm": 595.2651,
"OFBogen_center_line_height_mm": 265.9976,
"TEFBogen_center_line_width_mm": 398.4321,
"TEFBogen_center_line_height_mm": 165.0360,
"OFBogen_CP1_x_mm":0,
"TEFBogen_CP1_x_mm":54.446,
"OFBogen_CP1_y_mm":21.040,
"TEFBogen_CP1_y_mm":121.049,
"TEFBogen_CP1_x_mm":54.4459,
"OFBogen_CP1_y_mm":21.0391,
"TEFBogen_CP1_y_mm":121.0491,
"SivasnrTEF": "0_B10071",
"Antriebsart":1
},
@@ -96,13 +96,13 @@
"ProfilTyp": "APB 110 R 630/45° 400/825 mit TEF Aussen",
"Radius": 630,
"KurvenWinkel": 45,
"Gruppe_width_mm":958.874,
"Gruppe_height_mm":446.746,
"OFBogen_center_line_width_mm": 865.614,
"Gruppe_width_mm":958.8738,
"Gruppe_height_mm":446.7458,
"OFBogen_center_line_width_mm": 865.6135,
"OFBogen_center_line_height_mm": 300.559,
"TEFBogen_center_line_width_mm": 936.741,
"TEFBogen_center_line_height_mm":329.985,
"OFBogen_CP1_x_mm":0.276,
"TEFBogen_center_line_width_mm": 936.7413,
"TEFBogen_center_line_height_mm":329.9848,
"OFBogen_CP1_x_mm":0.2765,
"TEFBogen_CP1_x_mm":0,
"OFBogen_CP1_y_mm":131.310,
"TEFBogen_CP1_y_mm":31.30,
@@ -114,16 +114,16 @@
"ProfilTyp": "APB 110 R 630/45° 400/825 mit TEF Innen",
"Radius": 630,
"KurvenWinkel": 45,
"Gruppe_width_mm":880.942,
"Gruppe_height_mm":414.496,
"OFBogen_center_line_width_mm": 865.614,
"Gruppe_width_mm":880.9424,
"Gruppe_height_mm":414.4959,
"OFBogen_center_line_width_mm": 865.6135,
"OFBogen_center_line_height_mm": 300.559,
"TEFBogen_center_line_width_mm": 759.396,
"TEFBogen_center_line_height_mm": 271.313,
"OFBogen_CP1_x_mm":0.453,
"TEFBogen_center_line_width_mm": 759.3957,
"TEFBogen_center_line_height_mm": 271.3132,
"OFBogen_CP1_x_mm":0.4520,
"TEFBogen_CP1_x_mm":0,
"OFBogen_CP1_y_mm":21.04,
"TEFBogen_CP1_y_mm":121.049,
"OFBogen_CP1_y_mm":21.0391,
"TEFBogen_CP1_y_mm":121.0491,
"SivasnrTEF": "0_B10070",
"Antriebsart":1
},
@@ -132,16 +132,16 @@
"ProfilTyp": "APB 110 R 400/67,5° 339/508 mit TEF Innen",
"Radius": 400,
"KurvenWinkel": 67.5,
"Gruppe_width_mm":527.258,
"Gruppe_width_mm":527.2577,
"Gruppe_height_mm":368.405,
"OFBogen_center_line_width_mm": 507.820,
"OFBogen_center_line_height_mm": 339.315,
"TEFBogen_center_line_width_mm": 306.339,
"TEFBogen_center_line_height_mm": 198.675,
"OFBogen_center_line_width_mm": 507.8202,
"OFBogen_center_line_height_mm": 339.3146,
"TEFBogen_center_line_width_mm": 306.3387,
"TEFBogen_center_line_height_mm": 198.6754,
"OFBogen_CP1_x_mm":0,
"TEFBogen_CP1_x_mm":76.402,
"OFBogen_CP1_y_mm":21.040,
"TEFBogen_CP1_y_mm":121.049,
"TEFBogen_CP1_x_mm":76.4023,
"OFBogen_CP1_y_mm":21.0391,
"TEFBogen_CP1_y_mm":121.0491,
"SivasnrTEF": "0_B10081",
"Antriebsart":1
},
@@ -150,16 +150,16 @@
"ProfilTyp": "APB 110 R 550/67,5° 488/778 mit TEF Innen",
"Radius": 550,
"KurvenWinkel": 67.5,
"Gruppe_width_mm":768.095,
"Gruppe_height_mm":559.396,
"OFBogen_center_line_width_mm": 748.658,
"OFBogen_center_line_height_mm": 530.305,
"TEFBogen_center_line_width_mm": 469.752,
"TEFBogen_center_line_height_mm": 353.635,
"Gruppe_width_mm":768.0954,
"Gruppe_height_mm":559.3956,
"OFBogen_center_line_width_mm": 748.6579,
"OFBogen_center_line_height_mm": 530.3052,
"TEFBogen_center_line_width_mm": 469.7517,
"TEFBogen_center_line_height_mm": 353.6347,
"OFBogen_CP1_x_mm":0,
"TEFBogen_CP1_x_mm":138.902,
"OFBogen_CP1_y_mm":21.040,
"TEFBogen_CP1_y_mm":121.050,
"TEFBogen_CP1_x_mm":138.9023,
"OFBogen_CP1_y_mm":21.0391,
"TEFBogen_CP1_y_mm":121.0491,
"SivasnrTEF": "0_B10080",
"Antriebsart":1
}
@@ -20,10 +20,10 @@
"TEFBogen_CP2_x_mm": 900.0,
"OFBogen_CP2_y_mm": 931.3,
"TEFBogen_CP2_y_mm": 931.3,
"Gruppe_width_px": 3519.848,
"Gruppe_height_px": 3519.848,
"Gruppe_width_px": 3519.874,
"Gruppe_height_px": 3519.874,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"calculated_SVG_height_px": 1000,
"connectionPoints": [
{
"id": "cp1",
@@ -60,37 +60,37 @@
"ProfilTyp": "APB 110 R 630/90° 800/800 mit TEF Innen",
"Radius": 630.0,
"KurvenWinkel": 90.0,
"Gruppe_width_mm": 821.04,
"Gruppe_height_mm": 821.04,
"Gruppe_width_mm": 821.0391,
"Gruppe_height_mm": 821.0391,
"OFBogen_center_line_width_mm": 800.0,
"OFBogen_center_line_height_mm": 800.0,
"TEFBogen_center_line_width_mm": 700.0,
"TEFBogen_center_line_height_mm": 700.0,
"OFBogen_CP1_x_mm": 0.0,
"TEFBogen_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.04,
"OFBogen_CP1_y_mm": 21.0391,
"TEFBogen_CP1_y_mm": 121.0391,
"SivasnrTEF": "0_B10050",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 800.0,
"TEFBogen_CP2_x_mm": 700.0,
"OFBogen_CP2_y_mm": 821.04,
"TEFBogen_CP2_y_mm": 821.04,
"Gruppe_width_px": 3103.121,
"Gruppe_height_px": 3103.121,
"OFBogen_CP2_y_mm": 821.039,
"TEFBogen_CP2_y_mm": 821.039,
"Gruppe_width_px": 3103.1399,
"Gruppe_height_px": 3103.1399,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"calculated_SVG_height_px": 1000,
"connectionPoints": [
{
"id": "cp1",
"x": 0.0,
"y": 25.626,
"y": 25.625,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 974.374,
"x": 974.375,
"y": 1000.0,
"direction": 180.0,
"linkClass": "Omniflo"
@@ -98,13 +98,13 @@
{
"id": "cp3",
"x": 0.0,
"y": 147.423,
"y": 147.422,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 852.577,
"x": 852.578,
"y": 1000.0,
"direction": 180.0,
"linkClass": "OmnifloTEF"
@@ -116,52 +116,52 @@
"ProfilTyp": "APB 110 R 550/22,5° 84/522 mit TEF Innen",
"Radius": 550.0,
"KurvenWinkel": 22.5,
"Gruppe_width_mm": 537.544,
"Gruppe_height_mm": 232.057,
"OFBogen_center_line_width_mm": 514.491,
"OFBogen_center_line_height_mm": 122.23,
"TEFBogen_center_line_width_mm": 412.692,
"TEFBogen_center_line_height_mm": 82.09,
"Gruppe_width_mm": 537.5439,
"Gruppe_height_mm": 232.0561,
"OFBogen_center_line_width_mm": 514.4906,
"OFBogen_center_line_height_mm": 122.2298,
"TEFBogen_center_line_width_mm": 412.6925,
"TEFBogen_center_line_height_mm": 82.0896,
"OFBogen_CP1_x_mm": 15.002,
"TEFBogen_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.049,
"OFBogen_CP1_y_mm": 21.0391,
"TEFBogen_CP1_y_mm": 121.0491,
"SivasnrTEF": "0_B10090",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 529.493,
"TEFBogen_CP2_x_mm": 412.692,
"OFBogen_CP2_y_mm": 143.27,
"OFBogen_CP2_y_mm": 143.269,
"TEFBogen_CP2_y_mm": 203.139,
"Gruppe_width_px": 2031.648,
"Gruppe_height_px": 877.059,
"Gruppe_width_px": 2031.662,
"Gruppe_height_px": 877.0624,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 433.588,
"calculated_SVG_height_px": 431.697,
"connectionPoints": [
{
"id": "cp1",
"x": 27.908,
"y": 90.272,
"y": 90.664,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 985.023,
"y": 614.701,
"y": 617.39,
"direction": 112.5,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 519.362,
"y": 521.637,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 767.736,
"y": 871.57,
"y": 875.387,
"direction": 112.5,
"linkClass": "OmnifloTEF"
}
@@ -172,12 +172,12 @@
"ProfilTyp": "APB 110 R 550/22,5° 84/522 mit TEF Aussen",
"Radius": 550.0,
"KurvenWinkel": 22.5,
"Gruppe_width_mm": 655.564,
"Gruppe_height_mm": 272.978,
"OFBogen_center_line_width_mm": 514.491,
"OFBogen_center_line_height_mm": 122.23,
"TEFBogen_center_line_width_mm": 643.589,
"TEFBogen_center_line_height_mm": 125.683,
"Gruppe_width_mm": 655.569,
"Gruppe_height_mm": 272.9777,
"OFBogen_center_line_width_mm": 514.4906,
"OFBogen_center_line_height_mm": 122.2298,
"TEFBogen_center_line_width_mm": 643.5863,
"TEFBogen_center_line_height_mm": 125.6835,
"OFBogen_CP1_x_mm": 100.867,
"TEFBogen_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 131.31,
@@ -185,39 +185,39 @@
"SivasnrTEF": "0_B10091",
"Antriebsart": 2,
"OFBogen_CP2_x_mm": 615.358,
"TEFBogen_CP2_x_mm": 643.589,
"TEFBogen_CP2_x_mm": 643.586,
"OFBogen_CP2_y_mm": 253.54,
"TEFBogen_CP2_y_mm": 156.983,
"Gruppe_width_px": 2477.704,
"Gruppe_height_px": 1031.72,
"Gruppe_width_px": 2477.7411,
"Gruppe_height_px": 1031.7267,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 418.291,
"calculated_SVG_height_px": 416.3981,
"connectionPoints": [
{
"id": "cp1",
"x": 153.863,
"y": 478.855,
"x": 153.862,
"y": 481.028,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 938.67,
"y": 924.598,
"x": 938.662,
"y": 928.794,
"direction": 112.5,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 114.143,
"y": 114.661,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 981.733,
"y": 572.478,
"x": 981.721,
"y": 575.076,
"direction": 112.5,
"linkClass": "OmnifloTEF"
}
@@ -229,51 +229,51 @@
"Radius": 550.0,
"KurvenWinkel": 45.0,
"Gruppe_width_mm": 610.142,
"Gruppe_height_mm": 308.217,
"OFBogen_center_line_width_mm": 595.265,
"OFBogen_center_line_height_mm": 265.998,
"TEFBogen_center_line_width_mm": 398.432,
"Gruppe_height_mm": 308.2175,
"OFBogen_center_line_width_mm": 595.2651,
"OFBogen_center_line_height_mm": 265.9976,
"TEFBogen_center_line_width_mm": 398.4321,
"TEFBogen_center_line_height_mm": 165.036,
"OFBogen_CP1_x_mm": 0.0,
"TEFBogen_CP1_x_mm": 54.446,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.049,
"TEFBogen_CP1_x_mm": 54.4459,
"OFBogen_CP1_y_mm": 21.0391,
"TEFBogen_CP1_y_mm": 121.0491,
"SivasnrTEF": "0_B10071",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 595.265,
"TEFBogen_CP2_x_mm": 452.878,
"OFBogen_CP2_y_mm": 287.038,
"OFBogen_CP2_y_mm": 287.037,
"TEFBogen_CP2_y_mm": 286.085,
"Gruppe_width_px": 2306.032,
"Gruppe_height_px": 1164.906,
"Gruppe_width_px": 2306.0485,
"Gruppe_height_px": 1164.9165,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 507.046,
"calculated_SVG_height_px": 505.157,
"connectionPoints": [
{
"id": "cp1",
"x": 0.0,
"y": 68.009,
"y": 68.261,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 975.617,
"y": 927.815,
"y": 931.281,
"direction": 135.0,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 89.235,
"y": 391.276,
"y": 392.739,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 742.25,
"y": 924.734,
"y": 928.192,
"direction": 135.0,
"linkClass": "OmnifloTEF"
}
@@ -284,13 +284,13 @@
"ProfilTyp": "APB 110 R 630/45° 400/825 mit TEF Aussen",
"Radius": 630.0,
"KurvenWinkel": 45.0,
"Gruppe_width_mm": 958.874,
"Gruppe_height_mm": 446.746,
"OFBogen_center_line_width_mm": 865.614,
"Gruppe_width_mm": 958.8738,
"Gruppe_height_mm": 446.7458,
"OFBogen_center_line_width_mm": 865.6135,
"OFBogen_center_line_height_mm": 300.559,
"TEFBogen_center_line_width_mm": 936.741,
"TEFBogen_center_line_height_mm": 329.985,
"OFBogen_CP1_x_mm": 0.276,
"TEFBogen_center_line_width_mm": 936.7413,
"TEFBogen_center_line_height_mm": 329.9848,
"OFBogen_CP1_x_mm": 0.2765,
"TEFBogen_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 131.31,
"TEFBogen_CP1_y_mm": 31.3,
@@ -300,36 +300,36 @@
"TEFBogen_CP2_x_mm": 936.741,
"OFBogen_CP2_y_mm": 431.869,
"TEFBogen_CP2_y_mm": 361.285,
"Gruppe_width_px": 3624.064,
"Gruppe_height_px": 1688.477,
"Gruppe_width_px": 3624.09,
"Gruppe_height_px": 1688.4881,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 467.797,
"calculated_SVG_height_px": 465.9068,
"connectionPoints": [
{
"id": "cp1",
"x": 0.288,
"y": 292.738,
"y": 293.926,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 903.028,
"y": 962.793,
"y": 966.7,
"direction": 135.0,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 69.779,
"y": 70.062,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 976.918,
"y": 805.436,
"y": 808.704,
"direction": 135.0,
"linkClass": "OmnifloTEF"
}
@@ -340,52 +340,52 @@
"ProfilTyp": "APB 110 R 630/45° 400/825 mit TEF Innen",
"Radius": 630.0,
"KurvenWinkel": 45.0,
"Gruppe_width_mm": 880.942,
"Gruppe_height_mm": 414.496,
"OFBogen_center_line_width_mm": 865.614,
"Gruppe_width_mm": 880.9424,
"Gruppe_height_mm": 414.4959,
"OFBogen_center_line_width_mm": 865.6135,
"OFBogen_center_line_height_mm": 300.559,
"TEFBogen_center_line_width_mm": 759.396,
"TEFBogen_center_line_height_mm": 271.313,
"OFBogen_CP1_x_mm": 0.453,
"TEFBogen_center_line_width_mm": 759.3957,
"TEFBogen_center_line_height_mm": 271.3132,
"OFBogen_CP1_x_mm": 0.452,
"TEFBogen_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.049,
"OFBogen_CP1_y_mm": 21.0391,
"TEFBogen_CP1_y_mm": 121.0491,
"SivasnrTEF": "0_B10070",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 866.067,
"OFBogen_CP2_x_mm": 866.066,
"TEFBogen_CP2_x_mm": 759.396,
"OFBogen_CP2_y_mm": 321.599,
"OFBogen_CP2_y_mm": 321.598,
"TEFBogen_CP2_y_mm": 392.362,
"Gruppe_width_px": 3329.52,
"Gruppe_height_px": 1566.588,
"Gruppe_width_px": 3329.5461,
"Gruppe_height_px": 1566.5987,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 472.404,
"calculated_SVG_height_px": 470.5142,
"connectionPoints": [
{
"id": "cp1",
"x": 0.514,
"y": 50.557,
"x": 0.513,
"y": 50.758,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 983.115,
"y": 772.777,
"x": 983.113,
"y": 775.877,
"direction": 135.0,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 290.871,
"y": 292.039,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 862.028,
"y": 942.814,
"x": 862.027,
"y": 946.6,
"direction": 135.0,
"linkClass": "OmnifloTEF"
}
@@ -396,52 +396,52 @@
"ProfilTyp": "APB 110 R 400/67,5° 339/508 mit TEF Innen",
"Radius": 400.0,
"KurvenWinkel": 67.5,
"Gruppe_width_mm": 527.258,
"Gruppe_width_mm": 527.2577,
"Gruppe_height_mm": 368.405,
"OFBogen_center_line_width_mm": 507.82,
"OFBogen_center_line_height_mm": 339.315,
"TEFBogen_center_line_width_mm": 306.339,
"TEFBogen_center_line_height_mm": 198.675,
"OFBogen_center_line_width_mm": 507.8202,
"OFBogen_center_line_height_mm": 339.3146,
"TEFBogen_center_line_width_mm": 306.3387,
"TEFBogen_center_line_height_mm": 198.6754,
"OFBogen_CP1_x_mm": 0.0,
"TEFBogen_CP1_x_mm": 76.402,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.049,
"TEFBogen_CP1_x_mm": 76.4023,
"OFBogen_CP1_y_mm": 21.0391,
"TEFBogen_CP1_y_mm": 121.0491,
"SivasnrTEF": "0_B10081",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 507.82,
"TEFBogen_CP2_x_mm": 382.741,
"OFBogen_CP2_y_mm": 360.355,
"OFBogen_CP2_y_mm": 360.354,
"TEFBogen_CP2_y_mm": 319.724,
"Gruppe_width_px": 1992.772,
"Gruppe_height_px": 1392.387,
"Gruppe_width_px": 1992.785,
"Gruppe_height_px": 1392.3969,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 700.609,
"calculated_SVG_height_px": 698.7191,
"connectionPoints": [
{
"id": "cp1",
"x": 0.0,
"y": 56.957,
"y": 57.109,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 963.134,
"y": 975.51,
"y": 978.146,
"direction": 157.5,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 144.904,
"y": 327.689,
"x": 144.905,
"y": 328.576,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 725.908,
"y": 865.519,
"x": 725.909,
"y": 867.86,
"direction": 157.5,
"linkClass": "OmnifloTEF"
}
@@ -452,52 +452,52 @@
"ProfilTyp": "APB 110 R 550/67,5° 488/778 mit TEF Innen",
"Radius": 550.0,
"KurvenWinkel": 67.5,
"Gruppe_width_mm": 768.095,
"Gruppe_height_mm": 559.396,
"OFBogen_center_line_width_mm": 748.658,
"OFBogen_center_line_height_mm": 530.305,
"TEFBogen_center_line_width_mm": 469.752,
"TEFBogen_center_line_height_mm": 353.635,
"Gruppe_width_mm": 768.0954,
"Gruppe_height_mm": 559.3956,
"OFBogen_center_line_width_mm": 748.6579,
"OFBogen_center_line_height_mm": 530.3052,
"TEFBogen_center_line_width_mm": 469.7517,
"TEFBogen_center_line_height_mm": 353.6347,
"OFBogen_CP1_x_mm": 0.0,
"TEFBogen_CP1_x_mm": 138.902,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.05,
"TEFBogen_CP1_x_mm": 138.9023,
"OFBogen_CP1_y_mm": 21.0391,
"TEFBogen_CP1_y_mm": 121.0491,
"SivasnrTEF": "0_B10080",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 748.658,
"TEFBogen_CP2_x_mm": 608.654,
"OFBogen_CP2_y_mm": 551.345,
"TEFBogen_CP2_y_mm": 474.685,
"Gruppe_width_px": 2903.015,
"Gruppe_height_px": 2114.237,
"OFBogen_CP2_y_mm": 551.344,
"TEFBogen_CP2_y_mm": 474.684,
"Gruppe_width_px": 2903.0378,
"Gruppe_height_px": 2114.2511,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 730.18,
"calculated_SVG_height_px": 728.2892,
"connectionPoints": [
{
"id": "cp1",
"x": 0.0,
"y": 37.515,
"y": 37.61,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 974.694,
"y": 983.056,
"y": 985.607,
"direction": 157.5,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 180.84,
"y": 215.834,
"y": 216.393,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 792.42,
"y": 846.37,
"y": 848.566,
"direction": 157.5,
"linkClass": "OmnifloTEF"
}
@@ -1,12 +0,0 @@
@echo off
set TEFBogen_PATH=%~dp0
set SVG_PATH=C:\Program Files\RuleDesigner\RDConfigurator Fusion\WebApi\Editor2D\SSG\shapes\svg
set JSON_PATH_TEFBOGEN=%TEFBogen_PATH%JSON
python 4_TEFBogen_SVG_XML_Modifier_Script.py
pause
+8 -3
View File
@@ -5,8 +5,13 @@ set PROPS_PATH=C:\Program Files\RuleDesigner\RDConfigurator Fusion\WebApi\Editor
set JSON_PATH_TEFBOGEN=%TEFBogen_PATH%JSON
python 1_process_TEFBogen_json_1.py
python 2_update_props_TEF_Boegen_from_json_1.py
python 01_props_step1_process_TEFBogen_json.py
python 01_props_step2_update_props_TEF_Boegen_from_json.py
:: Check if Python script succeeded
if %ERRORLEVEL% equ 0 (
echo update dimensions and connection points in props completed successfully
) else (
echo update dimensions and connection points in props failed with error %ERRORLEVEL%
)
pause
@@ -3,7 +3,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"""
@@ -364,7 +364,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_TEFWEICHEN')
output_dir = os.environ.get('RD_CONF_WORK')
@@ -376,7 +387,7 @@ if __name__ == '__main__':
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)