alle TEFBogen sind neue eingepflegt in 2d Wizard

This commit is contained in:
2025-05-22 15:25:47 +02:00
parent 50a72f338e
commit ed44f62712
159 changed files with 4475 additions and 239 deletions
@@ -4,4 +4,4 @@
<g transform="translate(.00035062 -.00033298)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-miterlimit="0" stroke-width="3.7795"><path d="m1.8894 1.8901v68.678"/><path d="m1.8894 36.226h165.52c237.98 0.0014 466.22 94.579 634.5 262.93l171.22 171.15"/><path d="m948.78 494.66 48.546-48.566" stroke-linejoin="miter"/></g></svg>
<g transform="translate(.00036292 -.00033708)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-miterlimit="0" stroke-width="3.7795"><path d="m1.8894 1.8901v68.678"/><path d="m1.8894 36.226h165.52c237.98 0.0014 466.22 94.579 634.5 262.93l171.22 171.15"/><path d="m948.78 494.66 48.546-48.566" stroke-linejoin="miter"/></g></svg>

Before

Width:  |  Height:  |  Size: 579 B

After

Width:  |  Height:  |  Size: 579 B

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="729.46" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 729.46" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<svg width="1e3" height="729.48" fill-rule="evenodd" stroke-linecap="round" 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(.99629 0 0 .99629 9.6881e-6 -1.761e-5)" stroke="#ffe31b" stroke-linecap="square" stroke-linejoin="miter" stroke-miterlimit="0" stroke-width="3.7795"><path d="m950.67 729.71 50.584-20.948"/><path d="m1.8898 29.265h210.13c289.43 0.002307 550.36 174.35 661.12 441.75l102.82 248.22" fill="none"/><path d="m1.8898 1.8898v54.751"/></g></svg>
<g transform="matrix(1.0017 0 0 1.0017 -7.0728e-5 -2.9756e-5)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-miterlimit="0" stroke-width="3.7729"><path d="m945.5 725.74 50.3-20.837"/><path d="m1.8865 29.106 208.98 1.1e-5c287.86-0.0012 547.37 173.4 657.53 439.35l102.25 246.87"/><path d="m1.8865 1.8865v54.447"/></g>
</svg>

Before

Width:  |  Height:  |  Size: 595 B

After

Width:  |  Height:  |  Size: 574 B

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="384.97" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 384.97" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<svg width="1e3" height="384.98" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 384.98" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(.99998 0 0 .99998 .0077027 .0077178)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-linejoin="bevel" stroke-miterlimit="0" stroke-width="3.7795"><path d="m963.7 382.29 33.637-33.641"/><path d="m1.8821 25.669h343.81c188.9 5.98e-4 370.07 75.042 503.64 208.62l131.19 131.19"/><path d="m1.8821 1.882v47.574"/></g></svg>
<g transform="matrix(.99998 0 0 .99998 .0086192 .0085736)" fill="none" stroke="#ffe31b" stroke-linecap="square" stroke-miterlimit="0" stroke-width="3.7796"><path d="m963.7 382.3 33.641-33.641"/><path d="m1.8811 25.683 343.8 9.8e-5c188.9-0.0024 370.07 75.038 503.65 208.61l131.19 131.19"/><path d="m1.8811 1.8812v47.586"/></g></svg>

Before

Width:  |  Height:  |  Size: 589 B

After

Width:  |  Height:  |  Size: 570 B

@@ -6,11 +6,11 @@
</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="404.806,419.409 396.842,422.707 " />
<polyline points="400.824,421.058 384.636,381.978 " stroke-dasharray="4.263798,0.473755,0.947511,0.473755,0.947511,0.473755" />
<polyline points="247.465,312.428 280.548,312.428 " stroke-dasharray="4.263798,0.473755,0.947511,0.473755,0.947511,0.473755" />
<polyline points="247.465,308.118 247.465,316.738 " />
<path d="M384.636,381.978 A112.665,112.665 0 0,0 280.548,312.428 " stroke-dasharray="4.263798,0.473755,0.947511,0.473755,0.947511,0.473755" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.25" >
<polyline points="479.885,460.698 473.092,463.512 " />
<polyline points="476.488,462.105 462.679,428.766 " stroke-dasharray="0.786384,0.087376,0.174752,0.087376,0.174752,0.087376" />
<polyline points="345.659,369.433 373.881,369.433 " stroke-dasharray="0.786384,0.087376,0.174752,0.087376,0.174752,0.087376" />
<polyline points="345.659,365.757 345.659,373.11 " />
<path d="M462.679,428.766 A96.1136,96.1136 0 0,0 373.881,369.433 " stroke-dasharray="0.786384,0.087376,0.174752,0.087376,0.174752,0.087376" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -6,11 +6,11 @@
</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="573.224,465.257 580.498,457.982 " />
<polyline points="365.228,388.136 439.577,388.136 " stroke-dasharray="7.194777,0.799420,1.598839,0.799420,1.598839,0.799420" />
<polyline points="576.861,461.619 548.491,433.25 " stroke-dasharray="7.194777,0.799420,1.598839,0.799420,1.598839,0.799420" />
<polyline points="365.228,393.28 365.228,382.992 " />
<path d="M548.491,433.25 A154.028,154.028 0 0,0 439.577,388.136 " stroke-dasharray="7.194777,0.799420,1.598839,0.799420,1.598839,0.799420" />
<g clip-path="url(#clipId0)" fill="none" stroke="rgb(0,255,255)" stroke-width="0.25" >
<polyline points="501.322,407.374 503.206,405.49 " />
<polyline points="447.457,387.402 466.711,387.402 " stroke-dasharray="0.284920,0.031658,0.063315,0.031658,0.063315,0.031658" />
<polyline points="502.264,406.432 494.917,399.085 " stroke-dasharray="0.284920,0.031658,0.063315,0.031658,0.063315,0.031658" />
<polyline points="447.457,388.734 447.457,386.069 " />
<path d="M494.917,399.085 A39.8888,39.8888 0 0,0 466.711,387.402 " stroke-dasharray="0.284920,0.031658,0.063315,0.031658,0.063315,0.031658" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

@@ -0,0 +1,4 @@
<?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">
<path d="m996.22 996.22-0.01-192.98c0-212.03-84.232-415.38-234.16-565.3-149.93-149.93-353.27-234.16-565.3-234.16h-192.98" fill="none" stroke="#ec2525" stroke-dasharray="18.89763832,18.89763832" stroke-linecap="square" stroke-width="7.5591"/>
</svg>

After

Width:  |  Height:  |  Size: 459 B

@@ -0,0 +1,5 @@
<?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">
<path d="m3.7795 3.7824h233.92c201.18 0 394.11 80.218 536.36 223.01 142.25 142.79 222.16 336.46 222.16 538.39v234.82" fill="none" stroke="#ec2525" stroke-dasharray="18.89761276,18.89761276" stroke-linecap="square" stroke-width="7.5591"/>
</svg>

After

Width:  |  Height:  |  Size: 456 B

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="358.92" height="1e3" fill-rule="evenodd" version="1.1" viewBox="0 0 358.92 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="m353.57 5.3451-124.69 124.43c-144.12 143.83-225.1 338.9-225.1 542.29v324.15" fill="none" stroke="#ec2525" stroke-dasharray="18.89763832,18.89763832" stroke-linecap="square" stroke-width="7.5591"/>
</svg>

After

Width:  |  Height:  |  Size: 407 B

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="348.52" height="1e3" fill-rule="evenodd" version="1.1" viewBox="0 0 348.52 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="m343.17 5.345-143.39 142.81c-125.49 124.99-196 294.52-196 471.28l0.0215 376.78" fill="none" stroke="#ec2525" stroke-dasharray="18.8976, 18.8976" stroke-linecap="square" stroke-width="7.559"/>
</svg>

After

Width:  |  Height:  |  Size: 401 B

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1000.3" height="423.82" fill-rule="evenodd" version="1.1" viewBox="0 0 1000.3 423.82" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="m5.345 418.29 82.831-83.518c210.62-211.92 496.27-330.98 794.11-331l58.647 0.06757 58.637 0.038883" fill="none" stroke="#ec2525" stroke-dasharray="18.8977, 18.8977" stroke-linecap="square" stroke-width="7.5591"/>
</svg>

After

Width:  |  Height:  |  Size: 429 B

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="592.79" fill-rule="evenodd" version="1.1" viewBox="0 0 1e3 592.79" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="m996.22 3.9544-226.17-0.17583c-316.78-0.24842-602.22 190.32-723.24 482.83l-41.873 101.25" fill="none" stroke="#ec2525" stroke-dasharray="18.8976, 18.8976" stroke-linecap="square" stroke-width="7.5591"/>
</svg>

After

Width:  |  Height:  |  Size: 414 B

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="694.45" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 694.45" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="m4.9343 692.15 72.148-175.13c128-310.71 429.58-513.27 764.12-513.23l158.8 0.0107" fill="none" stroke="#ec2525" stroke-dasharray="18.8976, 18.8976" stroke-linecap="square" stroke-width="7.559"/>
</svg>

After

Width:  |  Height:  |  Size: 429 B

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="207.76" height="1e3" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" version="1.1" viewBox="0 0 207.76 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="m3.7844 3.7795v300.25c-1e-3 141.94 28.217 282.49 83.049 413.64l115.98 277.39" fill="none" stroke="#ec2525" stroke-dasharray="18.89762521,18.89762521" stroke-linecap="square" stroke-width="7.559"/>
</svg>

After

Width:  |  Height:  |  Size: 455 B

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="208.32" height="996.03" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" version="1.1" viewBox="0 0 208.32 996.03" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="m80.234 694.37 124.79 300.69m-201.23-991.28-0.021276 306.94m4.1e-6 0a1004.8 1002.6 0 0 0 76.449 383.67" fill="none" stroke="#ec2525" stroke-dasharray="18.8976, 18.8976" stroke-linecap="square" stroke-width="7.559"/>
</svg>

After

Width:  |  Height:  |  Size: 480 B

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="669.81" fill-rule="evenodd" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 669.81" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(-2.447e-6 1 -1 -2.447e-6 1e3 .005797)" fill="none" stroke-linecap="square">
<path d="m1.89 998.11v-195.67c-7.424e-4 -317.43 191.27-603.61 484.61-725.09l180.83-74.879" stroke="#ffe31b" stroke-width="3.7867"/>
<path d="m198.17 848.74v-111.83c-6.3e-4 -198.4 119.54-377.26 302.88-453.18l87.029-36.042" stroke="#ec2525" stroke-dasharray="18.9335, 18.9335" stroke-width="7.5734"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 647 B

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="359.94" height="1e3" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" version="1.1"
viewBox="0 0 359.94 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(.99935 0 0 .99936 -.021242 .023437)" fill="none" stroke-linecap="square">
<path d="m1.9122 1.8675v400.72c-0.00168 137.82 27.793 274.3 81.798 401.63l82.249 193.92" stroke="#ffe31b"
stroke-width="3.7867" />
<path d="m197.32 164.06v238.53c6.5e-4 112.76 22.744 224.42 66.93 328.6l93.465 220.37"
style="stroke:#ec2525;stroke-dasharray:18.9335, 18.9335;" stroke-width="7.5734" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 696 B

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="289.73" height="1e3" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" version="1.1" viewBox="0 0 289.73 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1.0101 0 0 1.0152 -46.38 .0062736)" fill="none" stroke-linecap="square">
<path d="m248.24 980.17-123.15-291.8c-49.818-118.05-75.454-244.57-75.443-372.34l0.0245-297.87" style="stroke:#ec2525;stroke-dasharray:18.9335, 18.9335;" stroke-width="7.5734"/>
<path d="m330.3 783.37-64.21-152.12c-42.162-99.882-63.863-206.93-63.864-315.05v-314.34" stroke="#ffe31b" stroke-width="3.7867"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 675 B

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="437.76" fill-rule="evenodd" version="1.1" viewBox="0 0 1e3 437.76" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(.29825 -.71813 .72004 .29746 -.4307 380.59)" fill="none" stroke-linecap="square">
<path d="m2.4702 2.4702 194.35 80.76c282.5 116.99 506.94 341.39 623.96 623.84l120.33 290.46" stroke="#ffe31b" stroke-width="3.7867"/>
<path d="m25.721 240.32 91.49 37.774c232.29 96.197 416.84 280.71 513.05 512.95l18.89 45.753 18.909 45.736" style="stroke:#ec2525;stroke-dasharray:18.9335, 18.9335;" stroke-width="7.5734"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 653 B

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="708.35" fill-rule="evenodd" version="1.1" viewBox="0 0 1e3 708.35" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(.95309 .39481 -.39479 .95317 397.03 -247.19)" fill="none" stroke-linecap="square">
<path d="m630.76 0.22005-192.52 79.575c-265.18 109.6-438.07 367.79-438.07 654.19v265.85" stroke="#ffe31b" stroke-width="3.7867"/>
<path d="m585.42 158.21-137.69 56.907c-192.85 79.703-318.59 267.48-318.6 475.77l6e-3 72.091" style="stroke:#ec2525;stroke-dasharray:18.9335, 18.9335;" stroke-width="7.5734"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 636 B

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="431.69" height="1e3" fill-rule="evenodd" version="1.1" viewBox="0 0 431.69 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(.9973 0 0 .99732 1.9001 2.6723)" fill="none" stroke-linecap="square">
<path d="m428.27 77.98-112.92 112.66c-132.36 132.08-206.72 311.22-206.71 498.01l-0.28938 309.46" stroke="#ffe31b" stroke-width="3.7867"/>
<path d="m351.67 2.68-124.68 124.43c-144.12 143.83-225.09 338.9-225.09 542.29v324.15" style="stroke:#ec2525;stroke-dasharray:18.9335, 18.9335;" stroke-width="7.5734"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 623 B

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="434.9" height="1e3" fill-rule="evenodd" version="1.1" viewBox="0 0 434.9 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1 0 0 1 .0041827 .0028903)" fill="none" fill-rule="nonzero" stroke-linecap="square">
<path d="m429.55 83.85-132.03 131.74c-115.55 115.3-180.47 271.68-180.47 434.74l0.0198 347.56" style="stroke:#ec2525;stroke-dasharray:18.9335, 18.9335;" stroke-width="7.5734"/>
<path d="m1.8876 998.11 0.3124-334.8c0.0011535-202.07 80.447-395.86 223.64-538.74l122.17-121.9" stroke="#ffe31b" stroke-width="3.7867"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 642 B

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1e3" height="1e3" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round" version="1.1" viewBox="0 0 1e3 1e3" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(.99998 0 0 .99998 .0067904 .008556)" fill="none" stroke-linecap="square">
<path d="m996.22 996.22v-192.97c0-212.03-84.23-415.38-234.16-565.31s-353.28-234.16-565.31-234.16l-192.97-0.001548" stroke="#ec2525" stroke-dasharray="18.9338, 18.9338" stroke-width="7.5735"/>
<path d="m885.95 996.22v-165.41c0-190.1-75.516-372.41-209.94-506.83-134.42-134.42-316.73-209.94-506.83-209.94h-165.41" stroke="#ffe31b" stroke-width="3.7868"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 714 B

@@ -0,0 +1,9 @@
<?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(.9981 0 0 .9981 1.8933 .0035334)" fill="none" stroke-linecap="square">
<path d="m1.8898 126.42h205.46c176.7 0 346.16 70.191 471.1 195.13 124.94 124.94 195.13 294.4 195.13 471.09v205.47" style="stroke:#ec2525;stroke-dasharray:18.9335, 18.9335;" stroke-width="7.5734"/>
<path d="m-0.003575 1.8898h187.13c215.09-0.0053101 421.37 85.434 573.46 237.52 152.09 152.09 237.53 358.36 237.53 573.45v187.15" stroke="#ffe31b" stroke-width="3.7867" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 707 B

@@ -0,0 +1,23 @@
<?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>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,23 @@
<?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>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,23 @@
<?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>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,23 @@
<?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>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,23 @@
<?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>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,22 @@
<?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>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,23 @@
<?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>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,23 @@
<?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>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,23 @@
<?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>

After

Width:  |  Height:  |  Size: 1.2 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(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>

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,30 @@
<?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>

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,28 @@
<?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>

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(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>

After

Width:  |  Height:  |  Size: 1.7 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(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>

After

Width:  |  Height:  |  Size: 1.7 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(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>

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,28 @@
<?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>

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(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>

After

Width:  |  Height:  |  Size: 1.7 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(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>

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,228 @@
[
{
"SVGname": "APB_110_R400_45_400_821104021.svg",
"Sivasnr": "821104021",
"Winkel":45,
"center_line_width_mm": 669.491,
"center_line_height_mm": 399.505,
"Objekt_width_mm":684.367,
"Objekt_height_mm":435.421
},
{
"SVGname": "APB_110_R400_67_5_339_821104024.svg",
"Sivasnr": "821104024",
"Winkel":67.5,
"center_line_width_mm": 507.820,
"center_line_height_mm": 339.315,
"Objekt_width_mm":527.258,
"Objekt_height_mm":368.405
},
{
"SVGname": "APB_110_R400_90_500_821104022.svg",
"Sivasnr": "821104022",
"Winkel":90,
"center_line_width_mm": 500,
"center_line_height_mm": 500,
"Objekt_width_mm":521.040,
"Objekt_height_mm":521.040
},
{
"SVGname": "APB_110_R500_90_550_550_821104030.svg",
"Sivasnr": "821104030",
"Winkel":90,
"center_line_width_mm": 550,
"center_line_height_mm": 550,
"Objekt_width_mm":571.040,
"Objekt_height_mm":571.040
},
{
"SVGname": "APB_110_R550_22_5_84_821104025.svg",
"Sivasnr": "821104025",
"Winkel":22.5,
"center_line_width_mm": 514.491,
"center_line_height_mm": 122.230,
"Objekt_width_mm":522.542,
"Objekt_height_mm":162.707
},
{
"SVGname": "APB_110_R550_22_5_84_821104025.svg",
"Sivasnr": "OFBogen22",
"Winkel":22.5,
"center_line_width_mm": 514.491,
"center_line_height_mm": 122.230,
"Objekt_width_mm":522.542,
"Objekt_height_mm":162.707
},
{
"SVGname": "APB_110_R550_45_191_821104029.svg",
"Sivasnr": "821104029",
"Winkel":45,
"center_line_width_mm": 551.606,
"center_line_height_mm": 190.792 ,
"Objekt_width_mm":566.483,
"Objekt_height_mm":226.709
},
{
"SVGname": "APB_110_R550_45_205_821104037.svg",
"Sivasnr": "821104037",
"Winkel":45,
"center_line_width_mm": 537.249,
"center_line_height_mm": 204.932,
"Objekt_width_mm":552.126,
"Objekt_height_mm":240.849
},
{
"SVGname": "APB_110_R550_45_232_821104026.svg",
"Sivasnr": "821104026",
"Winkel":45,
"center_line_width_mm": 595.265,
"center_line_height_mm": 265.998,
"Objekt_width_mm":610.142,
"Objekt_height_mm":301.914
},
{
"SVGname": "APB_110_R550_67_5_420_821104028.svg",
"Sivasnr": "821104028",
"Winkel":67.5,
"center_line_width_mm": 582.427,
"center_line_height_mm": 419.902,
"Objekt_width_mm":601.865,
"Objekt_height_mm":448.992
},
{
"SVGname": "APB_110_R550_67_5_432_821104027.svg",
"Sivasnr": "821104027",
"Winkel":67.5,
"center_line_width_mm": 748.658,
"center_line_height_mm": 530.305,
"Objekt_width_mm":768.095,
"Objekt_height_mm":559.396
},
{
"SVGname": "APB_110_R550_67_5_432_821104027.svg",
"Sivasnr": "OFBogen67",
"Winkel":67.5,
"center_line_width_mm": 748.658,
"center_line_height_mm": 530.305,
"Objekt_width_mm":768.095,
"Objekt_height_mm":559.396
},
{
"SVGname": "APB_110_R550_67_5_L_185_170_821104065.svg",
"Sivasnr": "821104065",
"Winkel":67.5,
"center_line_width_mm": 758.190,
"center_line_height_mm": 496.584,
"Objekt_width_mm":777.628,
"Objekt_height_mm":525.674
},
{
"SVGname": "APB_110_R550_90_900_605_821104066.svg",
"Sivasnr": "821104066",
"Winkel":90,
"center_line_width_mm": 900,
"center_line_height_mm": 605,
"Objekt_width_mm":921.040,
"Objekt_height_mm":626.040
},
{
"SVGname": "APB_110_R630_45_400_821104031.svg",
"Sivasnr": "821104031",
"Winkel":45,
"center_line_width_mm": 865.613,
"center_line_height_mm": 300.559,
"Objekt_width_mm":880.491,
"Objekt_height_mm":336.475
},
{
"SVGname": "APB_110_R630_45_400_821104031.svg",
"Sivasnr": "OFBogen45",
"Winkel":45,
"center_line_width_mm": 865.613,
"center_line_height_mm": 300.559,
"Objekt_width_mm":880.491,
"Objekt_height_mm":336.475
},
{
"SVGname": "APB_110_R630_90_800_800_821104033.svg",
"Sivasnr": "821104033",
"Winkel":90,
"center_line_width_mm": 800,
"center_line_height_mm": 800,
"Objekt_width_mm":821.040,
"Objekt_height_mm":821.040
},
{
"SVGname": "APB_110_R630_90_800_800_821104033.svg",
"Sivasnr": "OFBogen90",
"Winkel":90,
"center_line_width_mm": 800,
"center_line_height_mm": 800,
"Objekt_width_mm":821.040,
"Objekt_height_mm":821.040
},
{
"SVGname": "APB_110_R630_90_850_690_821104041.svg",
"Sivasnr": "821104041",
"Winkel":90,
"center_line_width_mm": 690,
"center_line_height_mm": 850,
"Objekt_width_mm":711.040,
"Objekt_height_mm":871.040
},
{
"SVGname": "APB_110_R630_90_850_870_821104035.svg",
"Sivasnr": "821104035",
"Winkel":90,
"center_line_width_mm": 850,
"center_line_height_mm": 870,
"Objekt_width_mm":871.04,
"Objekt_height_mm":891.04
},
{
"SVGname": "APB_110_R630_90_850_890_821104034.svg",
"Sivasnr": "821104034",
"Winkel":90,
"center_line_width_mm": 890,
"center_line_height_mm": 850,
"Objekt_width_mm":911.040,
"Objekt_height_mm":871.040
},
{
"SVGname": "APB_110_R650_180_L_150_821104043.svg",
"Sivasnr": "821104043",
"Winkel":180,
"center_line_width_mm": 800,
"center_line_height_mm": 1300,
"Objekt_width_mm":821.040,
"Objekt_height_mm":1342.080
},
{
"SVGname": "APB_110_R650_180_L_150_821104043.svg",
"Sivasnr": "OFBogen180",
"Winkel":180,
"center_line_width_mm": 800,
"center_line_height_mm": 1300,
"Objekt_width_mm":821.040,
"Objekt_height_mm":1342.080
},
{
"SVGname": "APB_60_R515_90_650_821094040.svg",
"Sivasnr": "821094040",
"Winkel":90,
"center_line_width_mm": 650.0,
"center_line_height_mm": 650.0,
"Objekt_width_mm": 671.040,
"Objekt_height_mm": 671.040
},
{
"SVGname": "APB_60_R515_90_810_821094101.svg",
"Sivasnr": "821094101",
"Winkel":90,
"center_line_width_mm": 810.0,
"center_line_height_mm": 810.0,
"Objekt_width_mm": 831.04,
"Objekt_height_mm": 831.04
}
]
@@ -0,0 +1,277 @@
[
{
"SVGname": "APB_110_R400_45_400_821104021.svg",
"Sivasnr": "821104021",
"Winkel": 45.0,
"center_line_width_mm": 669.491,
"center_line_height_mm": 399.505,
"Objekt_width_mm": 684.367,
"Objekt_height_mm": 435.421,
"calculated_objekt_width_mm": 684.369,
"calculated_objekt_height_mm": 435.423
},
{
"SVGname": "APB_110_R400_67_5_339_821104024.svg",
"Sivasnr": "821104024",
"Winkel": 67.5,
"center_line_width_mm": 507.82,
"center_line_height_mm": 339.315,
"Objekt_width_mm": 527.258,
"Objekt_height_mm": 368.405,
"calculated_objekt_width_mm": 527.258,
"calculated_objekt_height_mm": 368.407
},
{
"SVGname": "APB_110_R400_90_500_821104022.svg",
"Sivasnr": "821104022",
"Winkel": 90.0,
"center_line_width_mm": 500.0,
"center_line_height_mm": 500.0,
"Objekt_width_mm": 521.04,
"Objekt_height_mm": 521.04,
"calculated_objekt_width_mm": 521.04,
"calculated_objekt_height_mm": 521.04
},
{
"SVGname": "APB_110_R500_90_550_550_821104030.svg",
"Sivasnr": "821104030",
"Winkel": 90.0,
"center_line_width_mm": 550.0,
"center_line_height_mm": 550.0,
"Objekt_width_mm": 571.04,
"Objekt_height_mm": 571.04,
"calculated_objekt_width_mm": 571.04,
"calculated_objekt_height_mm": 571.04
},
{
"SVGname": "APB_110_R550_22_5_84_821104025.svg",
"Sivasnr": "821104025",
"Winkel": 22.5,
"center_line_width_mm": 514.491,
"center_line_height_mm": 122.23,
"Objekt_width_mm": 522.542,
"Objekt_height_mm": 162.707,
"calculated_objekt_width_mm": 522.543,
"calculated_objekt_height_mm": 162.708
},
{
"SVGname": "APB_110_R550_22_5_84_821104025.svg",
"Sivasnr": "OFBogen22",
"Winkel": 22.5,
"center_line_width_mm": 514.491,
"center_line_height_mm": 122.23,
"Objekt_width_mm": 522.542,
"Objekt_height_mm": 162.707,
"calculated_objekt_width_mm": 522.543,
"calculated_objekt_height_mm": 162.708
},
{
"SVGname": "APB_110_R550_45_191_821104029.svg",
"Sivasnr": "821104029",
"Winkel": 45.0,
"center_line_width_mm": 551.606,
"center_line_height_mm": 190.792,
"Objekt_width_mm": 566.483,
"Objekt_height_mm": 226.709,
"calculated_objekt_width_mm": 566.484,
"calculated_objekt_height_mm": 226.71
},
{
"SVGname": "APB_110_R550_45_205_821104037.svg",
"Sivasnr": "821104037",
"Winkel": 45.0,
"center_line_width_mm": 537.249,
"center_line_height_mm": 204.932,
"Objekt_width_mm": 552.126,
"Objekt_height_mm": 240.849,
"calculated_objekt_width_mm": 552.127,
"calculated_objekt_height_mm": 240.85
},
{
"SVGname": "APB_110_R550_45_232_821104026.svg",
"Sivasnr": "821104026",
"Winkel": 45.0,
"center_line_width_mm": 595.265,
"center_line_height_mm": 265.998,
"Objekt_width_mm": 610.142,
"Objekt_height_mm": 301.914,
"calculated_objekt_width_mm": 610.143,
"calculated_objekt_height_mm": 301.916
},
{
"SVGname": "APB_110_R550_67_5_420_821104028.svg",
"Sivasnr": "821104028",
"Winkel": 67.5,
"center_line_width_mm": 582.427,
"center_line_height_mm": 419.902,
"Objekt_width_mm": 601.865,
"Objekt_height_mm": 448.992,
"calculated_objekt_width_mm": 601.865,
"calculated_objekt_height_mm": 448.994
},
{
"SVGname": "APB_110_R550_67_5_432_821104027.svg",
"Sivasnr": "821104027",
"Winkel": 67.5,
"center_line_width_mm": 748.658,
"center_line_height_mm": 530.305,
"Objekt_width_mm": 768.095,
"Objekt_height_mm": 559.396,
"calculated_objekt_width_mm": 768.096,
"calculated_objekt_height_mm": 559.397
},
{
"SVGname": "APB_110_R550_67_5_432_821104027.svg",
"Sivasnr": "OFBogen67",
"Winkel": 67.5,
"center_line_width_mm": 748.658,
"center_line_height_mm": 530.305,
"Objekt_width_mm": 768.095,
"Objekt_height_mm": 559.396,
"calculated_objekt_width_mm": 768.096,
"calculated_objekt_height_mm": 559.397
},
{
"SVGname": "APB_110_R550_67_5_L_185_170_821104065.svg",
"Sivasnr": "821104065",
"Winkel": 67.5,
"center_line_width_mm": 758.19,
"center_line_height_mm": 496.584,
"Objekt_width_mm": 777.628,
"Objekt_height_mm": 525.674,
"calculated_objekt_width_mm": 777.628,
"calculated_objekt_height_mm": 525.676
},
{
"SVGname": "APB_110_R550_90_900_605_821104066.svg",
"Sivasnr": "821104066",
"Winkel": 90.0,
"center_line_width_mm": 900.0,
"center_line_height_mm": 605.0,
"Objekt_width_mm": 921.04,
"Objekt_height_mm": 626.04,
"calculated_objekt_width_mm": 921.04,
"calculated_objekt_height_mm": 626.04
},
{
"SVGname": "APB_110_R630_45_400_821104031.svg",
"Sivasnr": "821104031",
"Winkel": 45.0,
"center_line_width_mm": 865.613,
"center_line_height_mm": 300.559,
"Objekt_width_mm": 880.491,
"Objekt_height_mm": 336.475,
"calculated_objekt_width_mm": 880.491,
"calculated_objekt_height_mm": 336.477
},
{
"SVGname": "APB_110_R630_45_400_821104031.svg",
"Sivasnr": "OFBogen45",
"Winkel": 45.0,
"center_line_width_mm": 865.613,
"center_line_height_mm": 300.559,
"Objekt_width_mm": 880.491,
"Objekt_height_mm": 336.475,
"calculated_objekt_width_mm": 880.491,
"calculated_objekt_height_mm": 336.477
},
{
"SVGname": "APB_110_R630_90_800_800_821104033.svg",
"Sivasnr": "821104033",
"Winkel": 90.0,
"center_line_width_mm": 800.0,
"center_line_height_mm": 800.0,
"Objekt_width_mm": 821.04,
"Objekt_height_mm": 821.04,
"calculated_objekt_width_mm": 821.04,
"calculated_objekt_height_mm": 821.04
},
{
"SVGname": "APB_110_R630_90_800_800_821104033.svg",
"Sivasnr": "OFBogen90",
"Winkel": 90.0,
"center_line_width_mm": 800.0,
"center_line_height_mm": 800.0,
"Objekt_width_mm": 821.04,
"Objekt_height_mm": 821.04,
"calculated_objekt_width_mm": 821.04,
"calculated_objekt_height_mm": 821.04
},
{
"SVGname": "APB_110_R630_90_850_690_821104041.svg",
"Sivasnr": "821104041",
"Winkel": 90.0,
"center_line_width_mm": 690.0,
"center_line_height_mm": 850.0,
"Objekt_width_mm": 711.04,
"Objekt_height_mm": 871.04,
"calculated_objekt_width_mm": 711.04,
"calculated_objekt_height_mm": 871.04
},
{
"SVGname": "APB_110_R630_90_850_870_821104035.svg",
"Sivasnr": "821104035",
"Winkel": 90.0,
"center_line_width_mm": 850.0,
"center_line_height_mm": 870.0,
"Objekt_width_mm": 871.04,
"Objekt_height_mm": 891.04,
"calculated_objekt_width_mm": 871.04,
"calculated_objekt_height_mm": 891.04
},
{
"SVGname": "APB_110_R630_90_850_890_821104034.svg",
"Sivasnr": "821104034",
"Winkel": 90.0,
"center_line_width_mm": 890.0,
"center_line_height_mm": 850.0,
"Objekt_width_mm": 911.04,
"Objekt_height_mm": 871.04,
"calculated_objekt_width_mm": 911.04,
"calculated_objekt_height_mm": 871.04
},
{
"SVGname": "APB_110_R650_180_L_150_821104043.svg",
"Sivasnr": "821104043",
"Winkel": 180.0,
"center_line_width_mm": 800.0,
"center_line_height_mm": 1300.0,
"Objekt_width_mm": 821.04,
"Objekt_height_mm": 1342.08,
"calculated_objekt_width_mm": 821.04,
"calculated_objekt_height_mm": 1342.08
},
{
"SVGname": "APB_110_R650_180_L_150_821104043.svg",
"Sivasnr": "OFBogen180",
"Winkel": 180.0,
"center_line_width_mm": 800.0,
"center_line_height_mm": 1300.0,
"Objekt_width_mm": 821.04,
"Objekt_height_mm": 1342.08,
"calculated_objekt_width_mm": 821.04,
"calculated_objekt_height_mm": 1342.08
},
{
"SVGname": "APB_60_R515_90_650_821094040.svg",
"Sivasnr": "821094040",
"Winkel": 90.0,
"center_line_width_mm": 650.0,
"center_line_height_mm": 650.0,
"Objekt_width_mm": 671.04,
"Objekt_height_mm": 671.04,
"calculated_objekt_width_mm": 671.04,
"calculated_objekt_height_mm": 671.04
},
{
"SVGname": "APB_60_R515_90_810_821094101.svg",
"Sivasnr": "821094101",
"Winkel": 90.0,
"center_line_width_mm": 810.0,
"center_line_height_mm": 810.0,
"Objekt_width_mm": 831.04,
"Objekt_height_mm": 831.04,
"calculated_objekt_width_mm": 831.04,
"calculated_objekt_height_mm": 831.04
}
]
@@ -0,0 +1,151 @@
''' Key Analysis Points:
Data Safety:
Uses safe_float() to handle potential data conversion issues
Creates copies of items to avoid modifying original data
Geometric Calculations:
Converts angles to radians for trigonometric functions
Performs width/height calculations based on center line measurements and angles
Rounds results to 3 decimal places for consistency
Validation:
Compares calculated values with original values
Flags discrepancies with "Please verify" status
Provides detailed difference metrics
Error Handling:
Preserves original data when processing fails
Tracks and reports all errors
Provides comprehensive statistics
Output:
Generates a new JSON file with calculated fields
Provides detailed console output for verification
Maintains original structure while adding new calculated fields
The script is designed to process SVG measurement data, perform geometric validations, and produce an enhanced dataset while providing thorough feedback about the processing results. '''
import json
import math
def safe_float(value, default=0.0):
"""Safely convert value to float, return default if conversion fails"""
try:
return float(value) if value != '' else default
except (ValueError, TypeError):
return default
def calculate_attributes(item):
"""Calculate and add new attributes to the item based on geometric calculations"""
# Create a copy of the item to avoid modifying the original
processed_item = item.copy()
# Ensure all numeric fields have valid values using safe_float
processed_item["center_line_width_mm"] = safe_float(item.get("center_line_width_mm", 0))
processed_item["center_line_height_mm"] = safe_float(item.get("center_line_height_mm", 0))
processed_item["Objekt_width_mm"] = safe_float(item.get("Objekt_width_mm", 0))
processed_item["Objekt_height_mm"] = safe_float(item.get("Objekt_height_mm", 0))
processed_item["Winkel"] = safe_float(item.get("Winkel", 0))
# Convert angle to radians for trigonometric calculations
winkel_rad = math.radians(processed_item["Winkel"])
sin_value = math.sin(winkel_rad)
cos_value = math.cos(winkel_rad)
# Calculate new dimensions with 3 decimal places precision
if processed_item["Winkel"]!=180:
calculated_width = processed_item["center_line_width_mm"] + sin_value * 21.040
calculated_height = processed_item["center_line_height_mm"] + 21.040 + cos_value * 21.040
else:
calculated_width = processed_item["center_line_width_mm"]+21.040
calculated_height = processed_item["center_line_height_mm"]+ 21.040 + 21.040
processed_item["calculated_objekt_width_mm"] = round(calculated_width, 3)
processed_item["calculated_objekt_height_mm"] = round(calculated_height, 3)
# Calculate differences between original and calculated values
width_diff = round(processed_item["Objekt_width_mm"] - processed_item["calculated_objekt_width_mm"], 3)
height_diff = round(processed_item["Objekt_height_mm"] - processed_item["calculated_objekt_height_mm"], 3)
# Prepare comparison results for console output (not saved to JSON)
comparison_results = {
"width": {
"calculated": processed_item["calculated_objekt_width_mm"],
"original": processed_item["Objekt_width_mm"],
"difference": width_diff,
"status": "OK" if abs(width_diff) < 0.001 else "Please verify"
},
"height": {
"calculated": processed_item["calculated_objekt_height_mm"],
"original": processed_item["Objekt_height_mm"],
"difference": height_diff,
"status": "OK" if abs(height_diff) < 0.001 else "Please verify"
}
}
return processed_item, comparison_results
def process_json_file(input_file, output_file):
"""Main function to process JSON file and generate output"""
# Read input file
try:
with open(input_file, 'r', encoding='utf-8') as f:
data = json.load(f)
except FileNotFoundError:
print(f"Error: Input file '{input_file}' not found")
return
except json.JSONDecodeError as e:
print(f"JSON parsing error: {e}")
return
# Verify data is a list
if not isinstance(data, list):
print("Error: JSON data should be an array")
return
# Process data
processed_data = []
error_items = []
print("\nStarting JSON data processing...\n")
for idx, item in enumerate(data, start=1):
try:
processed_item, comparison = calculate_attributes(item)
processed_data.append(processed_item)
# Print comparison results to console
print(f"Item {idx} [{item.get('SVGname', 'Unnamed')}] comparison results:")
print(f" Width: Calculated={comparison['width']['calculated']} | Original={comparison['width']['original']} | Difference={comparison['width']['difference']} | {comparison['width']['status']}")
print(f" Height: Calculated={comparison['height']['calculated']} | Original={comparison['height']['original']} | Difference={comparison['height']['difference']} | {comparison['height']['status']}")
print("-" * 60)
except Exception as e:
error_items.append((idx, str(e)))
# Preserve original data (without any processed fields)
processed_data.append(item)
# Print error message to console
print(f"Error processing item {idx} [{item.get('SVGname', 'Unnamed')}]: {str(e)}")
print("-" * 60)
# Write output file
try:
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(processed_data, f, indent=4, ensure_ascii=False)
print(f"\nProcessing complete. Results saved to {output_file}")
except IOError as e:
print(f"Error writing output file: {e}")
return
# Print statistics
total_items = len(data)
success_items = total_items - len(error_items)
print("\nProcessing statistics:")
print(f"Total items: {total_items}")
print(f"Successfully processed: {success_items}")
print(f"Failed items: {len(error_items)}")
# Example usage
if __name__ == "__main__":
input_filename = "1_SVGErfassung_updated_new_input.json" # Replace with your input filename
output_filename = "1_SVGErfassung_updated_new_output.json" # Replace with desired output filename
process_json_file(input_filename, output_filename)
@@ -0,0 +1,752 @@
[
{
"SVGname": "APB_110_R400_45_400_821104021.svg",
"Sivasnr": "821104021",
"Winkel": 45.0,
"center_line_width_mm": 669.491,
"center_line_height_mm": 399.505,
"Objekt_width_mm": 684.367,
"Objekt_height_mm": 435.421,
"calculated_objekt_width_mm": 684.369,
"calculated_objekt_height_mm": 435.423,
"Objekt_width_px": 2586.565,
"Objekt_height_px": 1645.674,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 638.912,
"scale_factor": 1.4612043,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 48.119,
"direction": 270.0
},
{
"id": "cp2",
"x": 978.263,
"y": 961.795,
"direction": 135.0
}
]
},
{
"SVGname": "APB_110_R400_67_5_339_821104024.svg",
"Sivasnr": "821104024",
"Winkel": 67.5,
"center_line_width_mm": 507.82,
"center_line_height_mm": 339.315,
"Objekt_width_mm": 527.258,
"Objekt_height_mm": 368.405,
"calculated_objekt_width_mm": 527.258,
"calculated_objekt_height_mm": 368.407,
"Objekt_width_px": 1992.772,
"Objekt_height_px": 1392.387,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 700.764,
"scale_factor": 1.8966047,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 56.944,
"direction": 270.0
},
{
"id": "cp2",
"x": 963.134,
"y": 975.294,
"direction": 157.5
}
]
},
{
"SVGname": "APB_110_R400_90_500_821104022.svg",
"Sivasnr": "821104022",
"Winkel": 90.0,
"center_line_width_mm": 500.0,
"center_line_height_mm": 500.0,
"Objekt_width_mm": 521.04,
"Objekt_height_mm": 521.04,
"calculated_objekt_width_mm": 521.04,
"calculated_objekt_height_mm": 521.04,
"Objekt_width_px": 1969.271,
"Objekt_height_px": 1969.271,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"scale_factor": 1.919238,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 40.381,
"direction": 270.0
},
{
"id": "cp2",
"x": 959.619,
"y": 1000.0,
"direction": 180.0
}
]
},
{
"SVGname": "APB_110_R500_90_550_550_821104030.svg",
"Sivasnr": "821104030",
"Winkel": 90.0,
"center_line_width_mm": 550.0,
"center_line_height_mm": 550.0,
"Objekt_width_mm": 571.04,
"Objekt_height_mm": 571.04,
"calculated_objekt_width_mm": 571.04,
"calculated_objekt_height_mm": 571.04,
"Objekt_width_px": 2158.246,
"Objekt_height_px": 2158.246,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"scale_factor": 1.751191,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 36.845,
"direction": 270.0
},
{
"id": "cp2",
"x": 963.155,
"y": 1000.0,
"direction": 180.0
}
]
},
{
"SVGname": "APB_110_R550_22_5_84_821104025.svg",
"Sivasnr": "821104025",
"Winkel": 22.5,
"center_line_width_mm": 514.491,
"center_line_height_mm": 122.23,
"Objekt_width_mm": 522.542,
"Objekt_height_mm": 162.707,
"calculated_objekt_width_mm": 522.543,
"calculated_objekt_height_mm": 162.708,
"Objekt_width_px": 1974.947,
"Objekt_height_px": 614.951,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 316.315,
"scale_factor": 1.9137218,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 127.293,
"direction": 270.0
},
{
"id": "cp2",
"x": 984.593,
"y": 866.791,
"direction": 112.5
}
]
},
{
"SVGname": "APB_110_R550_22_5_84_821104025.svg",
"Sivasnr": "OFBogen22",
"Winkel": 22.5,
"center_line_width_mm": 514.491,
"center_line_height_mm": 122.23,
"Objekt_width_mm": 522.542,
"Objekt_height_mm": 162.707,
"calculated_objekt_width_mm": 522.543,
"calculated_objekt_height_mm": 162.708,
"Objekt_width_px": 1974.947,
"Objekt_height_px": 614.951,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 316.315,
"scale_factor": 1.9137218,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 127.293,
"direction": 270.0
},
{
"id": "cp2",
"x": 984.593,
"y": 866.791,
"direction": 112.5
}
]
},
{
"SVGname": "APB_110_R550_45_191_821104029.svg",
"Sivasnr": "821104029",
"Winkel": 45.0,
"center_line_width_mm": 551.606,
"center_line_height_mm": 190.792,
"Objekt_width_mm": 566.483,
"Objekt_height_mm": 226.709,
"calculated_objekt_width_mm": 566.484,
"calculated_objekt_height_mm": 226.71,
"Objekt_width_px": 2141.022,
"Objekt_height_px": 856.847,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 402.877,
"scale_factor": 1.765278,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 92.191,
"direction": 270.0
},
{
"id": "cp2",
"x": 973.738,
"y": 928.18,
"direction": 135.0
}
]
},
{
"SVGname": "APB_110_R550_45_205_821104037.svg",
"Sivasnr": "821104037",
"Winkel": 45.0,
"center_line_width_mm": 537.249,
"center_line_height_mm": 204.932,
"Objekt_width_mm": 552.126,
"Objekt_height_mm": 240.849,
"calculated_objekt_width_mm": 552.127,
"calculated_objekt_height_mm": 240.85,
"Objekt_width_px": 2086.76,
"Objekt_height_px": 910.289,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 438.894,
"scale_factor": 1.8111808,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 86.826,
"direction": 270.0
},
{
"id": "cp2",
"x": 973.055,
"y": 932.517,
"direction": 135.0
}
]
},
{
"SVGname": "APB_110_R550_45_232_821104026.svg",
"Sivasnr": "821104026",
"Winkel": 45.0,
"center_line_width_mm": 595.265,
"center_line_height_mm": 265.998,
"Objekt_width_mm": 610.142,
"Objekt_height_mm": 301.914,
"calculated_objekt_width_mm": 610.143,
"calculated_objekt_height_mm": 301.916,
"Objekt_width_px": 2306.032,
"Objekt_height_px": 1141.084,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 497.499,
"scale_factor": 1.6389627,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 69.314,
"direction": 270.0
},
{
"id": "cp2",
"x": 975.617,
"y": 945.619,
"direction": 135.0
}
]
},
{
"SVGname": "APB_110_R550_67_5_420_821104028.svg",
"Sivasnr": "821104028",
"Winkel": 67.5,
"center_line_width_mm": 582.427,
"center_line_height_mm": 419.902,
"Objekt_width_mm": 601.865,
"Objekt_height_mm": 448.992,
"calculated_objekt_width_mm": 601.865,
"calculated_objekt_height_mm": 448.994,
"Objekt_width_px": 2274.749,
"Objekt_height_px": 1696.965,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 748.047,
"scale_factor": 1.6615022,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 46.732,
"direction": 270.0
},
{
"id": "cp2",
"x": 967.704,
"y": 979.385,
"direction": 157.5
}
]
},
{
"SVGname": "APB_110_R550_67_5_432_821104027.svg",
"Sivasnr": "821104027",
"Winkel": 67.5,
"center_line_width_mm": 748.658,
"center_line_height_mm": 530.305,
"Objekt_width_mm": 768.095,
"Objekt_height_mm": 559.396,
"calculated_objekt_width_mm": 768.096,
"calculated_objekt_height_mm": 559.397,
"Objekt_width_px": 2903.015,
"Objekt_height_px": 2114.237,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 730.336,
"scale_factor": 1.3019223,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 37.507,
"direction": 270.0
},
{
"id": "cp2",
"x": 974.695,
"y": 982.847,
"direction": 157.5
}
]
},
{
"SVGname": "APB_110_R550_67_5_432_821104027.svg",
"Sivasnr": "OFBogen67",
"Winkel": 67.5,
"center_line_width_mm": 748.658,
"center_line_height_mm": 530.305,
"Objekt_width_mm": 768.095,
"Objekt_height_mm": 559.396,
"calculated_objekt_width_mm": 768.096,
"calculated_objekt_height_mm": 559.397,
"Objekt_width_px": 2903.015,
"Objekt_height_px": 2114.237,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 730.336,
"scale_factor": 1.3019223,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 37.507,
"direction": 270.0
},
{
"id": "cp2",
"x": 974.695,
"y": 982.847,
"direction": 157.5
}
]
},
{
"SVGname": "APB_110_R550_67_5_L_185_170_821104065.svg",
"Sivasnr": "821104065",
"Winkel": 67.5,
"center_line_width_mm": 758.19,
"center_line_height_mm": 496.584,
"Objekt_width_mm": 777.628,
"Objekt_height_mm": 525.674,
"calculated_objekt_width_mm": 777.628,
"calculated_objekt_height_mm": 525.676,
"Objekt_width_px": 2939.045,
"Objekt_height_px": 1986.785,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 678.042,
"scale_factor": 1.2859619,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 39.904,
"direction": 270.0
},
{
"id": "cp2",
"x": 975.003,
"y": 981.716,
"direction": 157.5
}
]
},
{
"SVGname": "APB_110_R550_90_900_605_821104066.svg",
"Sivasnr": "821104066",
"Winkel": 90.0,
"center_line_width_mm": 900.0,
"center_line_height_mm": 605.0,
"Objekt_width_mm": 921.04,
"Objekt_height_mm": 626.04,
"calculated_objekt_width_mm": 921.04,
"calculated_objekt_height_mm": 626.04,
"Objekt_width_px": 3481.071,
"Objekt_height_px": 2366.118,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 681.6,
"scale_factor": 1.0857292,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 33.515,
"direction": 270.0
},
{
"id": "cp2",
"x": 977.156,
"y": 997.227,
"direction": 180.0
}
]
},
{
"SVGname": "APB_110_R630_45_400_821104031.svg",
"Sivasnr": "821104031",
"Winkel": 45.0,
"center_line_width_mm": 865.613,
"center_line_height_mm": 300.559,
"Objekt_width_mm": 880.491,
"Objekt_height_mm": 336.475,
"calculated_objekt_width_mm": 880.491,
"calculated_objekt_height_mm": 336.477,
"Objekt_width_px": 3327.816,
"Objekt_height_px": 1271.707,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 384.818,
"scale_factor": 1.13573,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 62.096,
"direction": 270.0
},
{
"id": "cp2",
"x": 983.103,
"y": 949.149,
"direction": 135.0
}
]
},
{
"SVGname": "APB_110_R630_45_400_821104031.svg",
"Sivasnr": "OFBogen45",
"Winkel": 45.0,
"center_line_width_mm": 865.613,
"center_line_height_mm": 300.559,
"Objekt_width_mm": 880.491,
"Objekt_height_mm": 336.475,
"calculated_objekt_width_mm": 880.491,
"calculated_objekt_height_mm": 336.477,
"Objekt_width_px": 3327.816,
"Objekt_height_px": 1271.707,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 384.818,
"scale_factor": 1.13573,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 62.096,
"direction": 270.0
},
{
"id": "cp2",
"x": 983.103,
"y": 949.149,
"direction": 135.0
}
]
},
{
"SVGname": "APB_110_R630_90_800_800_821104033.svg",
"Sivasnr": "821104033",
"Winkel": 90.0,
"center_line_width_mm": 800.0,
"center_line_height_mm": 800.0,
"Objekt_width_mm": 821.04,
"Objekt_height_mm": 821.04,
"calculated_objekt_width_mm": 821.04,
"calculated_objekt_height_mm": 821.04,
"Objekt_width_px": 3103.121,
"Objekt_height_px": 3103.121,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"scale_factor": 1.217967,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 25.626,
"direction": 270.0
},
{
"id": "cp2",
"x": 974.374,
"y": 1000.0,
"direction": 180.0
}
]
},
{
"SVGname": "APB_110_R630_90_800_800_821104033.svg",
"Sivasnr": "OFBogen90",
"Winkel": 90.0,
"center_line_width_mm": 800.0,
"center_line_height_mm": 800.0,
"Objekt_width_mm": 821.04,
"Objekt_height_mm": 821.04,
"calculated_objekt_width_mm": 821.04,
"calculated_objekt_height_mm": 821.04,
"Objekt_width_px": 3103.121,
"Objekt_height_px": 3103.121,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"scale_factor": 1.217967,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 25.626,
"direction": 270.0
},
{
"id": "cp2",
"x": 974.374,
"y": 1000.0,
"direction": 180.0
}
]
},
{
"SVGname": "APB_110_R630_90_850_690_821104041.svg",
"Sivasnr": "821104041",
"Winkel": 90.0,
"center_line_width_mm": 690.0,
"center_line_height_mm": 850.0,
"Objekt_width_mm": 711.04,
"Objekt_height_mm": 871.04,
"calculated_objekt_width_mm": 711.04,
"calculated_objekt_height_mm": 871.04,
"Objekt_width_px": 2687.376,
"Objekt_height_px": 3292.096,
"calculated_SVG_height_px": 1000,
"calculated_SVG_width_px": 3.0866042377540064e+16,
"scale_factor": 1.1480529,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 24.155,
"direction": 270.0
},
{
"id": "cp2",
"x": 0.0,
"y": 1000.0,
"direction": 180.0
}
]
},
{
"SVGname": "APB_110_R630_90_850_870_821104035.svg",
"Sivasnr": "821104035",
"Winkel": 90.0,
"center_line_width_mm": 850.0,
"center_line_height_mm": 870.0,
"Objekt_width_mm": 871.04,
"Objekt_height_mm": 891.04,
"calculated_objekt_width_mm": 871.04,
"calculated_objekt_height_mm": 891.04,
"Objekt_width_px": 3292.096,
"Objekt_height_px": 3367.686,
"calculated_SVG_height_px": 1000,
"calculated_SVG_width_px": 3.0866042377540224e+16,
"scale_factor": 1.1222841,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 23.613,
"direction": 270.0
},
{
"id": "cp2",
"x": 0.0,
"y": 1000.0,
"direction": 180.0
}
]
},
{
"SVGname": "APB_110_R630_90_850_890_821104034.svg",
"Sivasnr": "821104034",
"Winkel": 90.0,
"center_line_width_mm": 890.0,
"center_line_height_mm": 850.0,
"Objekt_width_mm": 911.04,
"Objekt_height_mm": 871.04,
"calculated_objekt_width_mm": 911.04,
"calculated_objekt_height_mm": 871.04,
"Objekt_width_px": 3443.276,
"Objekt_height_px": 3292.096,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 957.984,
"scale_factor": 1.0976466,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 24.107,
"direction": 270.0
},
{
"id": "cp2",
"x": 976.905,
"y": 998.027,
"direction": 180.0
}
]
},
{
"SVGname": "APB_110_R650_180_L_150_821104043.svg",
"Sivasnr": "821104043",
"Winkel": 180.0,
"center_line_width_mm": 800.0,
"center_line_height_mm": 1300.0,
"Objekt_width_mm": 821.04,
"Objekt_height_mm": 1342.08,
"calculated_objekt_width_mm": 821.04,
"calculated_objekt_height_mm": 1342.08,
"Objekt_width_px": 3103.121,
"Objekt_height_px": 5072.391,
"calculated_SVG_height_px": 1000,
"calculated_SVG_width_px": 613.657,
"scale_factor": 0.7451121,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 15.677,
"direction": 270.0
},
{
"id": "cp2",
"x": 0,
"y": 984.323,
"direction": 270.0
}
]
},
{
"SVGname": "APB_110_R650_180_L_150_821104043.svg",
"Sivasnr": "OFBogen180",
"Winkel": 180.0,
"center_line_width_mm": 800.0,
"center_line_height_mm": 1300.0,
"Objekt_width_mm": 821.04,
"Objekt_height_mm": 1342.08,
"calculated_objekt_width_mm": 821.04,
"calculated_objekt_height_mm": 1342.08,
"Objekt_width_px": 3103.121,
"Objekt_height_px": 5072.391,
"calculated_SVG_height_px": 1000,
"calculated_SVG_width_px": 613.657,
"scale_factor": 0.7451121,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 15.677,
"direction": 270.0
},
{
"id": "cp2",
"x": 0,
"y": 984.323,
"direction": 270.0
}
]
},
{
"SVGname": "APB_60_R515_90_650_821094040.svg",
"Sivasnr": "821094040",
"Winkel": 90.0,
"center_line_width_mm": 650.0,
"center_line_height_mm": 650.0,
"Objekt_width_mm": 671.04,
"Objekt_height_mm": 671.04,
"calculated_objekt_width_mm": 671.04,
"calculated_objekt_height_mm": 671.04,
"Objekt_width_px": 2536.196,
"Objekt_height_px": 2536.196,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"scale_factor": 1.490224,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 31.354,
"direction": 270.0
},
{
"id": "cp2",
"x": 968.646,
"y": 1000.0,
"direction": 180.0
}
]
},
{
"SVGname": "APB_60_R515_90_810_821094101.svg",
"Sivasnr": "821094101",
"Winkel": 90.0,
"center_line_width_mm": 810.0,
"center_line_height_mm": 810.0,
"Objekt_width_mm": 831.04,
"Objekt_height_mm": 831.04,
"calculated_objekt_width_mm": 831.04,
"calculated_objekt_height_mm": 831.04,
"Objekt_width_px": 3140.916,
"Objekt_height_px": 3140.916,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"scale_factor": 1.203312,
"connectionPoints": [
{
"id": "cp1",
"x": 0,
"y": 25.318,
"direction": 270.0
},
{
"id": "cp2",
"x": 974.683,
"y": 1000.0,
"direction": 180.0
}
]
}
]
@@ -0,0 +1,175 @@
''' This Python script processes JSON data containing SVG object measurements and performs several calculations to standardize the dimensions and add connection points. Here's the main logic:
Data Processing:
Converts all numeric fields to floats
Determines the dominant dimension (width or height) and scales it to 1000px
Calculates the other dimension proportionally
Computes two connection points (cp1 and cp2) with their coordinates and directions
Error Checking:
Validates that connection points stay within the 1000px boundary
Provides detailed error reporting
Scaling Logic:
Uses different scaling approaches based on whether width or height is larger
Maintains aspect ratio while standardizing dimensions '''
import json
import math
def process_json_item(item):
# Ensure all numeric fields are floats
item["Winkel"] = float(item["Winkel"])
item["center_line_width_mm"] = float(item["center_line_width_mm"])
item["center_line_height_mm"] = float(item["center_line_height_mm"])
item["Objekt_width_mm"] = float(item["Objekt_width_mm"])
item["Objekt_height_mm"] = float(item["Objekt_height_mm"])
item["calculated_objekt_width_mm"] = float(item["calculated_objekt_width_mm"])
item["calculated_objekt_height_mm"] = float(item["calculated_objekt_height_mm"])
# Calculate the direct mm to px conversions (requested additions)
item["Objekt_width_px"] = round(item["Objekt_width_mm"] * 3.7795, 3)
item["Objekt_height_px"] = round(item["Objekt_height_mm"] * 3.7795, 3)
winkel_rad = math.radians(item["Winkel"])
sin_value = math.sin(winkel_rad)
cos_value = math.cos(winkel_rad)
# Determine which dimension is larger
if item["Objekt_width_mm"] == item["Objekt_height_mm"]:
# "Width =Height"
scale = round(1000 / item["Objekt_width_mm"], 6)
item["calculated_SVG_width_px"] = 1000
item["calculated_SVG_height_px"] = round(item["Objekt_height_mm"] * scale, 3)
scale_RD_H = 1000 / item["calculated_SVG_height_px"]
scale_RD_W = 1
elif item["Objekt_width_mm"] > item["Objekt_height_mm"]:
# Width is larger, set calculated_SVG width to 1000px
scale = round(1000 / item["Objekt_width_mm"], 7)
item["calculated_SVG_width_px"] = 1000
if item["Winkel"]==180:
item["calculated_SVG_height_px"] = round(item["Objekt_height_mm"] * scale+3.78/2, 3)
else:
item["calculated_SVG_height_px"] = round(item["Objekt_height_mm"] * scale+3.78/2/sin_value, 3)
scale_RD_H = round(1000 / item["calculated_SVG_height_px"], 6)
scale_RD_W = 1
else:
# Height is larger, set calculated_SVG height to 1000px
scale = round(1000 / item["Objekt_height_mm"], 7)
item["calculated_SVG_height_px"] = 1000
if item["Winkel"]==180:
item["calculated_SVG_width_px"] = round(item["Objekt_width_mm"] * scale+3.78/2, 3)
else:
item["calculated_SVG_width_px"] = round(item["Objekt_width_mm"] * scale+3.78/2/cos_value, 3)
scale_RD_W = round(1000 / item["calculated_SVG_width_px"], 6)
scale_RD_H = 1
item["scale_factor"] = scale # Add scale factor
# Calculate connection points
cp1_y = round(21.040 * scale*scale_RD_H, 3)
if item["calculated_SVG_height_px"] == item["calculated_SVG_width_px"]:
cp2_x = round(item["center_line_width_mm"] * scale * scale_RD_W, 3)
cp2_y = round((21.040 + item["center_line_height_mm"]) * scale * scale_RD_H, 3)
elif item["calculated_SVG_height_px"] == 1000 and item["calculated_SVG_width_px"] != 1000:
if item["Winkel"]==180:
cp2_x = 0
else:
cp2_x = round((item["center_line_width_mm"] * scale) * scale_RD_W, 3)
cp2_y = round(((21.040 + item["center_line_height_mm"]) * scale) * scale_RD_H, 3)
else:
cp2_x = round((item["center_line_width_mm"] * scale) * scale_RD_W, 3)
cp2_y = round(((21.040 + item["center_line_height_mm"]) * scale) * scale_RD_H, 3)
cp2_direction = round(90 + item["Winkel"], 1) # Keep 1 decimal place
# Add connection points attributes
item["connectionPoints"] = [
{
"id": "cp1",
"x": 0,
"y": cp1_y,
"direction": 270.0
},
{
"id": "cp2",
"x": cp2_x,
"y": cp2_y,
"direction": cp2_direction
}
]
return item
def check_connection_points(item):
"""Check if connection point coordinates exceed 1000"""
errors = []
for cp in item.get("connectionPoints", []):
if cp["x"] > 1000 or cp["y"] > 1000:
errors.append(f"Connection point {cp['id']} exceeds range: x={cp['x']}, y={cp['y']}")
return errors
def process_json_file(input_file, output_file):
try:
# Read input file
with open(input_file, 'r', encoding='utf-8') as f:
data = json.load(f)
# Verify data is a list
if not isinstance(data, list):
print("Error: JSON data should be an array")
return
# Process each item
processed_data = []
error_reports = []
for idx, item in enumerate(data, start=1):
try:
processed_item = process_json_item(item)
# Check connection point coordinates
errors = check_connection_points(processed_item)
if errors:
error_msg = f"Item {idx} [{item.get('SVGname')}] coordinate errors:"
for err in errors:
error_msg += f"\n - {err}"
error_reports.append(error_msg)
processed_data.append(processed_item)
except Exception as e:
error_msg = f"Error processing item {idx} [{item.get('SVGname')}]: {str(e)}"
error_reports.append(error_msg)
processed_data.append(item) # Keep original data
# Write output file
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(processed_data, f, indent=4, ensure_ascii=False)
print(f"Processing complete. Results saved to {output_file}")
# Print error reports
if error_reports:
print("\n" + "="*50)
print("Coordinate Validation Error Report:")
print("="*50)
for report in error_reports:
print("\n" + report)
print("\n" + "="*50)
print(f"Found {len(error_reports)} coordinate issues")
print("="*50)
else:
print("\nAll connection point coordinates validated successfully - no out-of-range issues found")
except FileNotFoundError:
print(f"Error: Input file '{input_file}' not found")
except json.JSONDecodeError as e:
print(f"JSON parsing error: {e}")
except Exception as e:
print(f"Error during processing: {e}")
# Example usage
if __name__ == "__main__":
input_filename = "1_SVGErfassung_updated_new_output.json"
output_filename = "2_calculated_px_cps_output.json"
process_json_file(input_filename, output_filename)
process_json_file(input_filename, output_filename)
@@ -0,0 +1,134 @@
''' Script Analysis
This Python script processes JSON and TXT files to update dimensions and connection points in SVG-related data. Here's the main logic:
Input Handling:
Reads a JSON file containing reference data
Processes all TXT files in a specified directory
Data Processing:
Creates a mapping between Sivasnr (from filenames) and JSON data
For each matching TXT file:
Updates width and height based on JSON data (converting mm to px)
Updates connection points (x, y, direction) from JSON data
Preserves the original file structure while updating specific values
Reporting:
Prints detailed change reports to console
Skips files without matching JSON data '''
import json
import os
import glob
from datetime import datetime
def process_files(json_file_path, txt_files_dir):
# Create a log file with timestamp
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
log_file_path = os.path.join(txt_files_dir, f"modification_report_OFBogen_{timestamp}.txt")
# Read JSON file
with open(json_file_path, 'r', encoding='utf-8') as f:
json_data = json.load(f)
# Create Sivasnr to JSON data mapping
sivasnr_mapping = {item["Sivasnr"]: item for item in json_data}
# Prepare report content
report_content = []
report_content.append(f"Modification Report - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
report_content.append("="*50 + "\n")
# Process all TXT files
for txt_file_path in glob.glob(os.path.join(txt_files_dir, '*.txt')):
# Extract Sivasnr from filename
sivasnr = os.path.splitext(os.path.basename(txt_file_path))[0]
# Check if corresponding JSON data exists
if sivasnr in sivasnr_mapping:
json_item = sivasnr_mapping[sivasnr]
# Read TXT file content (using utf-8-sig to handle BOM)
with open(txt_file_path, 'r', encoding='utf-8-sig') as f:
txt_content = json.load(f)
# Prepare entry for this file
file_entry = []
file_entry.append(f"\nProcessing file: {txt_file_path}")
file_entry.append("="*50)
# Record old values
old_width = txt_content["width"]
old_height = txt_content["height"]
old_cps = {cp["id"]: {"x": cp["x"], "y": cp["y"], "direction": cp["direction"]}
for cp in txt_content["connectionPoints"]}
# Update width and height
new_width = round(json_item["Objekt_width_mm"] * 3.7795, 3)
new_height = round(json_item["Objekt_height_mm"] * 3.7795, 3)
txt_content["width"] = new_width
txt_content["height"] = new_height
# Update connectionPoints
cp_changes = []
for cp in txt_content["connectionPoints"]:
cp_id = cp["id"]
# Find corresponding connection point in JSON data
json_cp = next((item for item in json_item["connectionPoints"] if item["id"] == cp_id), None)
if json_cp:
# Record old values
old_x = cp["x"]
old_y = cp["y"]
old_dir = cp["direction"]
# Update values
cp["x"] = json_cp["x"]
cp["y"] = json_cp["y"]
cp["direction"] = json_cp["direction"]
# Record changes
cp_changes.append({
"id": cp_id,
"x": (old_x, cp["x"]),
"y": (old_y, cp["y"]),
"direction": (old_dir, cp["direction"])
})
# Write back to TXT file
with open(txt_file_path, 'w', encoding='utf-8') as f:
json.dump(txt_content, f, indent=2, ensure_ascii=False)
# Add to report
file_entry.append("[Dimension Changes]")
file_entry.append(f"width: {old_width}{new_width}")
file_entry.append(f"height: {old_height}{new_height}")
if cp_changes:
file_entry.append("\n[Connection Point Changes]")
for change in cp_changes:
file_entry.append(f"Connection point {change['id']}:")
file_entry.append(f" x: {change['x'][0]}{change['x'][1]}")
file_entry.append(f" y: {change['y'][0]}{change['y'][1]}")
file_entry.append(f" direction: {change['direction'][0]}{change['direction'][1]}")
file_entry.append(f"\nFile {txt_file_path} processed successfully")
file_entry.append("="*50)
# Add this file's entry to main report
report_content.extend(file_entry)
# Also print to console
print("\n" + "\n".join(file_entry))
else:
print(f"\nSkipping file {txt_file_path} (no matching JSON data found)")
# Write the report file if any changes were made
if len(report_content) > 2: # More than just the header
with open(log_file_path, 'w', encoding='utf-8') as f:
f.write("\n".join(report_content))
print(f"\nModification report saved to: {log_file_path}")
else:
print("\nNo files were modified - no report generated")
# Example usage
if __name__ == "__main__":
json_file_path = "2_calculated_px_cps_output.json"
txt_files_dir = "C:/Program Files/RuleDesigner/RDConfigurator Fusion/WebApi/Editor2D/SSG/shapes/props"
process_files(json_file_path, txt_files_dir)
print("\nAll files processed!")
@@ -0,0 +1,150 @@
"""
SVG XML Batch Modifier Script
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
"""
import json
import os
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element, SubElement, tostring
def process_xml_file(xml_path):
"""
Process a single XML file with proper namespace handling
Returns modification statistics
"""
try:
tree = ET.parse(xml_path)
root = tree.getroot()
# Register and handle SVG namespace
ET.register_namespace('', 'http://www.w3.org/2000/svg')
namespaces = {'svg': 'http://www.w3.org/2000/svg'}
stats = {
'ffe31b_groups': 0,
'ec2525_groups': 0,
'elements_modified': 0,
'modified': False
}
# Process all group elements
for g in root.findall('.//svg:g', namespaces):
stroke = g.get('stroke')
if stroke == "#ffe31b":
stats['ffe31b_groups'] += 1
if 'stroke-width' in g.attrib:
del g.attrib['stroke-width']
stats['modified'] = True
if 'stroke-miterlimit' in g.attrib:
del g.attrib['stroke-miterlimit']
stats['modified'] = True
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
for attr in ['stroke', 'stroke-width', 'stroke-linejoin']:
if attr in g.attrib:
del g.attrib[attr]
stats['modified'] = True
for child in g.findall('.//svg:path[@stroke-width="1px"]', namespaces):
del child.attrib['stroke-width']
child.set('style', 'stroke:#ec2525;stroke-width:2px')
stats['elements_modified'] += 1
stats['modified'] = True
# Save changes if modified
if stats['modified']:
xml_str = ET.tostring(root, encoding='unicode')
xml_str = xml_str.replace('><', '>\n<').replace('</svg>', '\n</svg>')
with open(xml_path, 'w', encoding='utf-8') as f:
f.write(xml_str)
return stats
except Exception as e:
print(f" Error processing file: {str(e)}")
return None
def main():
"""
Main processing function
"""
# Configure paths
json_file_path = r"C:\Users\y.wang\Documents\SSG-Ruledesigner-Konfigurator\SVGs\Omniflo\python\OFBogen\1_SVGErfassung_updated_new_input.json"
svg_folder_path = r"C:\Program Files\RuleDesigner\RDConfigurator Fusion\WebApi\Editor2D\SSG\shapes\svg"
try:
# Read and parse JSON file
with open(json_file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# Verify we have a list of items
if not isinstance(data, list):
print("Error: JSON data should be an array of items")
return
print(f"\nFound {len(data)} items in JSON file")
# Process each item in the JSON array
for index, item in enumerate(data, 1):
if not isinstance(item, dict):
print(f"\nItem {index}: Not a dictionary, skipping")
continue
sivasnr = item.get("Sivasnr")
if not sivasnr:
print(f"\nItem {index}: Missing 'Sivasnr' value, skipping")
continue
print(f"\nProcessing item {index}: Sivasnr = {sivasnr}")
# Build XML filename and path
xml_filename = f"{sivasnr}.xml"
xml_path = os.path.join(svg_folder_path, xml_filename)
if not os.path.exists(xml_path):
print(f" XML file not found: {xml_path}")
continue
print(f" Found XML file: {xml_path}")
# Process the XML file
stats = process_xml_file(xml_path)
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']}")
else:
print(" No modifications needed")
print("\nProcessing complete")
except FileNotFoundError:
print("\nError: JSON file not found")
except json.JSONDecodeError:
print("\nError: Invalid JSON format")
except Exception as e:
print(f"\nUnexpected error: {str(e)}")
if __name__ == "__main__":
print("SVG XML Batch Modifier - Starting execution")
main()
+16
View File
@@ -0,0 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python Debugger: Current File",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"args": ["1_TEF_Boegen_input.json"],
"console": "integratedTerminal"
}
]
}
@@ -0,0 +1,166 @@
[{
"Sivasnr": "821104033+0_B10040",
"ProfilTyp": "APB 110 R 630/90° 800/800 mit TEF Aussen",
"Radius": 630,
"KurvenWinkel": 90,
"Gruppe_width_mm":931.30,
"Gruppe_height_mm":931.30,
"OFBogen_center_line_width_mm": 800,
"OFBogen_center_line_height_mm": 800,
"TEFBogen_center_line_width_mm": 900,
"TEFBogen_center_line_height_mm": 900,
"OFBogen_CP1_x_mm":0,
"TEFBogen_CP1_x_mm":0,
"OFBogen_CP1_y_mm":131.30,
"TEFBogen_CP1_y_mm":31.30,
"SivasnrTEF": "0_B10040",
"Antriebsart":1
},
{
"Sivasnr": "821104033+0_B10050",
"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,
"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,
"SivasnrTEF": "0_B10050",
"Antriebsart":1
},
{
"Sivasnr": "821104025+0_B10090",
"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,
"OFBogen_CP1_x_mm":15.002,
"TEFBogen_CP1_x_mm":0,
"OFBogen_CP1_y_mm":21.040,
"TEFBogen_CP1_y_mm":121.049,
"SivasnrTEF": "0_B10090",
"Antriebsart":1
},
{
"Sivasnr": "821104025+0_B10091",
"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,
"OFBogen_CP1_x_mm":100.867,
"TEFBogen_CP1_x_mm":0,
"OFBogen_CP1_y_mm":131.310,
"TEFBogen_CP1_y_mm":31.300,
"SivasnrTEF": "0_B10091",
"Antriebsart":2
},
{
"Sivasnr": "821104026+0_B10071",
"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,
"OFBogen_CP1_x_mm":0,
"TEFBogen_CP1_x_mm":54.446,
"OFBogen_CP1_y_mm":21.040,
"TEFBogen_CP1_y_mm":121.049,
"SivasnrTEF": "0_B10071",
"Antriebsart":1
},
{
"Sivasnr": "821104031+0_B10060",
"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,
"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_CP1_x_mm":0,
"OFBogen_CP1_y_mm":131.310,
"TEFBogen_CP1_y_mm":31.30,
"SivasnrTEF": "0_B10060",
"Antriebsart":2
},
{
"Sivasnr": "821104031+0_B10070",
"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,
"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_CP1_x_mm":0,
"OFBogen_CP1_y_mm":21.04,
"TEFBogen_CP1_y_mm":121.049,
"SivasnrTEF": "0_B10070",
"Antriebsart":1
},
{
"Sivasnr": "821104024+0_B10081",
"ProfilTyp": "APB 110 R 400/67,5° 339/508 mit TEF Innen",
"Radius": 400,
"KurvenWinkel": 67.5,
"Gruppe_width_mm":527.258,
"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_CP1_x_mm":0,
"TEFBogen_CP1_x_mm":76.402,
"OFBogen_CP1_y_mm":21.040,
"TEFBogen_CP1_y_mm":121.049,
"SivasnrTEF": "0_B10081",
"Antriebsart":1
},
{
"Sivasnr": "821104027+0_B10080",
"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,
"OFBogen_CP1_x_mm":0,
"TEFBogen_CP1_x_mm":138.902,
"OFBogen_CP1_y_mm":21.040,
"TEFBogen_CP1_y_mm":121.050,
"SivasnrTEF": "0_B10080",
"Antriebsart":1
}
]
@@ -0,0 +1,506 @@
[
{
"Sivasnr": "821104033+0_B10040",
"ProfilTyp": "APB 110 R 630/90° 800/800 mit TEF Aussen",
"Radius": 630.0,
"KurvenWinkel": 90.0,
"Gruppe_width_mm": 931.3,
"Gruppe_height_mm": 931.3,
"OFBogen_center_line_width_mm": 800.0,
"OFBogen_center_line_height_mm": 800.0,
"TEFBogen_center_line_width_mm": 900.0,
"TEFBogen_center_line_height_mm": 900.0,
"OFBogen_CP1_x_mm": 0.0,
"TEFBogen_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 131.3,
"TEFBogen_CP1_y_mm": 31.3,
"SivasnrTEF": "0_B10040",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 800.0,
"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,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"connectionPoints": [
{
"id": "cp1",
"x": 0.0,
"y": 140.986,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 859.014,
"y": 1000.0,
"direction": 180.0,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 33.609,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 966.391,
"y": 1000.0,
"direction": 180.0,
"linkClass": "OmnifloTEF"
}
]
},
{
"Sivasnr": "821104033+0_B10050",
"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,
"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,
"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,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 1000.0,
"connectionPoints": [
{
"id": "cp1",
"x": 0.0,
"y": 25.626,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 974.374,
"y": 1000.0,
"direction": 180.0,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 147.423,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 852.577,
"y": 1000.0,
"direction": 180.0,
"linkClass": "OmnifloTEF"
}
]
},
{
"Sivasnr": "821104025+0_B10090",
"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,
"OFBogen_CP1_x_mm": 15.002,
"TEFBogen_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.049,
"SivasnrTEF": "0_B10090",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 529.493,
"TEFBogen_CP2_x_mm": 412.692,
"OFBogen_CP2_y_mm": 143.27,
"TEFBogen_CP2_y_mm": 203.139,
"Gruppe_width_px": 2031.648,
"Gruppe_height_px": 877.059,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 433.588,
"connectionPoints": [
{
"id": "cp1",
"x": 27.908,
"y": 90.272,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 985.023,
"y": 614.701,
"direction": 112.5,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 519.362,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 767.736,
"y": 871.57,
"direction": 112.5,
"linkClass": "OmnifloTEF"
}
]
},
{
"Sivasnr": "821104025+0_B10091",
"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,
"OFBogen_CP1_x_mm": 100.867,
"TEFBogen_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 131.31,
"TEFBogen_CP1_y_mm": 31.3,
"SivasnrTEF": "0_B10091",
"Antriebsart": 2,
"OFBogen_CP2_x_mm": 615.358,
"TEFBogen_CP2_x_mm": 643.589,
"OFBogen_CP2_y_mm": 253.54,
"TEFBogen_CP2_y_mm": 156.983,
"Gruppe_width_px": 2477.704,
"Gruppe_height_px": 1031.72,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 418.291,
"connectionPoints": [
{
"id": "cp1",
"x": 153.863,
"y": 478.855,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 938.67,
"y": 924.598,
"direction": 112.5,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 114.143,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 981.733,
"y": 572.478,
"direction": 112.5,
"linkClass": "OmnifloTEF"
}
]
},
{
"Sivasnr": "821104026+0_B10071",
"ProfilTyp": "APB 110 R 550/45° 232/610 mit TEF Innen",
"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,
"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,
"SivasnrTEF": "0_B10071",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 595.265,
"TEFBogen_CP2_x_mm": 452.878,
"OFBogen_CP2_y_mm": 287.038,
"TEFBogen_CP2_y_mm": 286.085,
"Gruppe_width_px": 2306.032,
"Gruppe_height_px": 1164.906,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 507.046,
"connectionPoints": [
{
"id": "cp1",
"x": 0.0,
"y": 68.009,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 975.617,
"y": 927.815,
"direction": 135.0,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 89.235,
"y": 391.276,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 742.25,
"y": 924.734,
"direction": 135.0,
"linkClass": "OmnifloTEF"
}
]
},
{
"Sivasnr": "821104031+0_B10060",
"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,
"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_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 131.31,
"TEFBogen_CP1_y_mm": 31.3,
"SivasnrTEF": "0_B10060",
"Antriebsart": 2,
"OFBogen_CP2_x_mm": 865.89,
"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,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 467.797,
"connectionPoints": [
{
"id": "cp1",
"x": 0.288,
"y": 292.738,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 903.028,
"y": 962.793,
"direction": 135.0,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 69.779,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 976.918,
"y": 805.436,
"direction": 135.0,
"linkClass": "OmnifloTEF"
}
]
},
{
"Sivasnr": "821104031+0_B10070",
"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,
"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_CP1_x_mm": 0.0,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.049,
"SivasnrTEF": "0_B10070",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 866.067,
"TEFBogen_CP2_x_mm": 759.396,
"OFBogen_CP2_y_mm": 321.599,
"TEFBogen_CP2_y_mm": 392.362,
"Gruppe_width_px": 3329.52,
"Gruppe_height_px": 1566.588,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 472.404,
"connectionPoints": [
{
"id": "cp1",
"x": 0.514,
"y": 50.557,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 983.115,
"y": 772.777,
"direction": 135.0,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 0.0,
"y": 290.871,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 862.028,
"y": 942.814,
"direction": 135.0,
"linkClass": "OmnifloTEF"
}
]
},
{
"Sivasnr": "821104024+0_B10081",
"ProfilTyp": "APB 110 R 400/67,5° 339/508 mit TEF Innen",
"Radius": 400.0,
"KurvenWinkel": 67.5,
"Gruppe_width_mm": 527.258,
"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_CP1_x_mm": 0.0,
"TEFBogen_CP1_x_mm": 76.402,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.049,
"SivasnrTEF": "0_B10081",
"Antriebsart": 1,
"OFBogen_CP2_x_mm": 507.82,
"TEFBogen_CP2_x_mm": 382.741,
"OFBogen_CP2_y_mm": 360.355,
"TEFBogen_CP2_y_mm": 319.724,
"Gruppe_width_px": 1992.772,
"Gruppe_height_px": 1392.387,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 700.609,
"connectionPoints": [
{
"id": "cp1",
"x": 0.0,
"y": 56.957,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 963.134,
"y": 975.51,
"direction": 157.5,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 144.904,
"y": 327.689,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 725.908,
"y": 865.519,
"direction": 157.5,
"linkClass": "OmnifloTEF"
}
]
},
{
"Sivasnr": "821104027+0_B10080",
"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,
"OFBogen_CP1_x_mm": 0.0,
"TEFBogen_CP1_x_mm": 138.902,
"OFBogen_CP1_y_mm": 21.04,
"TEFBogen_CP1_y_mm": 121.05,
"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,
"calculated_SVG_width_px": 1000,
"calculated_SVG_height_px": 730.18,
"connectionPoints": [
{
"id": "cp1",
"x": 0.0,
"y": 37.515,
"direction": 270.0,
"linkClass": "Omniflo"
},
{
"id": "cp2",
"x": 974.694,
"y": 983.056,
"direction": 157.5,
"linkClass": "Omniflo"
},
{
"id": "cp3",
"x": 180.84,
"y": 215.834,
"direction": 270.0,
"linkClass": "OmnifloTEF"
},
{
"id": "cp4",
"x": 792.42,
"y": 846.37,
"direction": 157.5,
"linkClass": "OmnifloTEF"
}
]
}
]
@@ -0,0 +1,189 @@
import json
import sys
import os
from datetime import datetime
def convert_to_float(value):
"""Safely convert value to float, return original if conversion fails"""
try:
return float(value)
except (ValueError, TypeError):
return value
def process_json_file(input_file):
# Validate and prepare file paths
input_path = os.path.abspath(input_file)
if not os.path.isfile(input_path):
print(f"Error: Input file not found - {input_path}")
sys.exit(1)
print(f"Reading file: {input_path}")
# Read JSON file
try:
with open(input_path, 'r', encoding='utf-8') as f:
data = json.load(f)
except json.JSONDecodeError as e:
print(f"Error: Invalid JSON format in {input_path}")
print(f"Details: {str(e)}")
sys.exit(1)
except Exception as e:
print(f"Error reading file {input_path}: {str(e)}")
sys.exit(1)
# Process each item in the JSON array
for i, item in enumerate(data):
print(f"\nProcessing item {i+1}: {item.get('Sivasnr', 'Unknown')}")
# Convert numerical values to float
for key in item:
if isinstance(item[key], (int, float, str)) and any(x in key.lower() for x in ['mm', 'width', 'height', 'radius', 'winkel']):
item[key] = convert_to_float(item[key])
# 1. Add four new attributes and calculate their values
print("\nStep 1: Adding four new attributes with calculations")
# OFBogen_CP2_x_mm
of_cp2_x = float(item["OFBogen_CP1_x_mm"]) + float(item["OFBogen_center_line_width_mm"])
item["OFBogen_CP2_x_mm"] = round(of_cp2_x, 3)
print(f"Added OFBogen_CP2_x_mm: {item['OFBogen_CP2_x_mm']}")
# TEFBogen_CP2_x_mm
tef_cp2_x = float(item["TEFBogen_CP1_x_mm"]) + float(item["TEFBogen_center_line_width_mm"])
item["TEFBogen_CP2_x_mm"] = round(tef_cp2_x, 3)
print(f"Added TEFBogen_CP2_x_mm: {item['TEFBogen_CP2_x_mm']}")
# OFBogen_CP2_y_mm
of_cp2_y = float(item["OFBogen_CP1_y_mm"]) + float(item["OFBogen_center_line_height_mm"])
item["OFBogen_CP2_y_mm"] = round(of_cp2_y, 3)
print(f"Added OFBogen_CP2_y_mm: {item['OFBogen_CP2_y_mm']}")
# TEFBogen_CP2_y_mm
tef_cp2_y = float(item["TEFBogen_CP1_y_mm"]) + float(item["TEFBogen_center_line_height_mm"])
item["TEFBogen_CP2_y_mm"] = round(tef_cp2_y, 3)
print(f"Added TEFBogen_CP2_y_mm: {item['TEFBogen_CP2_y_mm']}")
# 2. Calculate pixel dimensions and SVG dimensions
print("\nStep 2: Calculating pixel and SVG dimensions")
# Calculate Gruppe_width_px and 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)
print(f"Calculated Gruppe_width_px: {item['Gruppe_width_px']}")
print(f"Calculated Gruppe_height_px: {item['Gruppe_height_px']}")
# Compare width and height to determine scaling
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)
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)
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)
scale_RD_W = 1
else:
print("Height is larger, setting calculated_SVG_height to 1000px")
scale = round(1000 / float(item["Gruppe_height_mm"]), 6)
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)
scale_RD_H = 1
print(f"Calculated scale: {scale}")
print(f"Calculated calculated_SVG_width_px: {item['calculated_SVG_width_px']}")
print(f"Calculated calculated_SVG_height_px: {item['calculated_SVG_height_px']}")
print(f"Calculated scale_RD_W: {scale_RD_W}")
print(f"Calculated scale_RD_H: {scale_RD_H}")
# 3. Create connectionPoints array
print("\nStep 3: Creating connectionPoints array")
connection_points = []
# CP1
cp1_x = round(float(item["OFBogen_CP1_x_mm"]) * scale * scale_RD_W, 3)
cp1_y = round(float(item["OFBogen_CP1_y_mm"]) * scale * scale_RD_H, 3)
cp1 = {
"id": "cp1",
"x": cp1_x,
"y": cp1_y,
"direction": 270.0,
"linkClass": "Omniflo"
}
connection_points.append(cp1)
print(f"Created CP1: x={cp1_x}, y={cp1_y}, direction=270.0, linkClass=Omniflo")
# CP2
cp2_x = round(float(item["OFBogen_CP2_x_mm"]) * scale * scale_RD_W, 3)
cp2_y = round(float(item["OFBogen_CP2_y_mm"]) * scale * scale_RD_H, 3)
cp2_direction = round(90 + float(item["KurvenWinkel"]), 1)
cp2 = {
"id": "cp2",
"x": cp2_x,
"y": cp2_y,
"direction": cp2_direction,
"linkClass": "Omniflo"
}
connection_points.append(cp2)
print(f"Created CP2: x={cp2_x}, y={cp2_y}, direction={cp2_direction}, linkClass=Omniflo")
# CP3
cp3_x = round(float(item["TEFBogen_CP1_x_mm"]) * scale * scale_RD_W, 3)
cp3_y = round(float(item["TEFBogen_CP1_y_mm"]) * scale * scale_RD_H, 3)
cp3 = {
"id": "cp3",
"x": cp3_x,
"y": cp3_y,
"direction": 270.0,
"linkClass": "OmnifloTEF"
}
connection_points.append(cp3)
print(f"Created CP3: x={cp3_x}, y={cp3_y}, direction=270.0, linkClass=OmnifloTEF")
# CP4
cp4_x = round(float(item["TEFBogen_CP2_x_mm"]) * scale * scale_RD_W, 3)
cp4_y = round(float(item["TEFBogen_CP2_y_mm"]) * scale * scale_RD_H, 3)
cp4_direction = round(90 + float(item["KurvenWinkel"]), 1)
cp4 = {
"id": "cp4",
"x": cp4_x,
"y": cp4_y,
"direction": cp4_direction,
"linkClass": "OmnifloTEF"
}
connection_points.append(cp4)
print(f"Created CP4: x={cp4_x}, y={cp4_y}, direction={cp4_direction}, linkClass=OmnifloTEF")
item["connectionPoints"] = connection_points
# Prepare output path
output_dir = os.path.dirname(input_path) or '.' # Handle case when no directory in path
base_name = os.path.splitext(os.path.basename(input_path))[0]
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_path = os.path.join(output_dir, f"{base_name}_processed_output.json")
# Save processed JSON file
try:
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
print(f"\nProcessing complete! Results saved to new file: {output_path}")
print(f"Original file remains unchanged: {input_path}")
except Exception as e:
print(f"\nError saving processed file: {str(e)}")
sys.exit(1)
if __name__ == "__main__":
try:
if len(sys.argv) != 2:
raise ValueError("请提供输入文件路径")
input_file = sys.argv[1]
process_json_file(input_file)
except Exception as e:
print(f"错误详情: {str(e)}", file=sys.stderr)
sys.exit(1)
@@ -0,0 +1,135 @@
''' Script Analysis
This Python script processes JSON and TXT files to update dimensions and connection points in SVG-related data. Here's the main logic:
Input Handling:
Reads a JSON file containing reference data
Processes all TXT files in a specified directory
Data Processing:
Creates a mapping between Sivasnr (from filenames) and JSON data
For each matching TXT file:
Updates width and height based on JSON data (converting mm to px)
Updates connection points (x, y, direction) from JSON data
Preserves the original file structure while updating specific values
Reporting:
Prints detailed change reports to console
Skips files without matching JSON data '''
import json
import os
import glob
from datetime import datetime
def process_files(json_file_path, txt_files_dir):
# Create a log file with timestamp
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
log_file_path = os.path.join(txt_files_dir, f"modification_report_TEFBogen_{timestamp}.txt")
# Read JSON file
with open(json_file_path, 'r', encoding='utf-8') as f:
json_data = json.load(f)
# Create Sivasnr to JSON data mapping
sivasnr_mapping = {item["Sivasnr"]: item for item in json_data}
# Prepare report content
report_content = []
report_content.append(f"Modification Report - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
report_content.append("="*50 + "\n")
# Process all TXT files
for txt_file_path in glob.glob(os.path.join(txt_files_dir, '*.txt')):
# Extract Sivasnr from filename
sivasnr = os.path.splitext(os.path.basename(txt_file_path))[0]
# Check if corresponding JSON data exists
if sivasnr in sivasnr_mapping:
json_item = sivasnr_mapping[sivasnr]
# Read TXT file content (using utf-8-sig to handle BOM)
with open(txt_file_path, 'r', encoding='utf-8-sig') as f:
txt_content = json.load(f)
# Prepare entry for this file
file_entry = []
file_entry.append(f"\nProcessing file: {txt_file_path}")
file_entry.append("="*50)
# Record old values
old_width = txt_content["width"]
old_height = txt_content["height"]
old_cps = {cp["id"]: {"x": cp["x"], "y": cp["y"], "direction": cp["direction"],"linkClass": cp["linkClass"]}
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)
txt_content["width"] = new_width
txt_content["height"] = new_height
# Update connectionPoints
cp_changes = []
for cp in txt_content["connectionPoints"]:
cp_id = cp["id"]
# Find corresponding connection point in JSON data
json_cp = next((item for item in json_item["connectionPoints"] if item["id"] == cp_id), None)
if json_cp:
# Record old values
old_x = cp["x"]
old_y = cp["y"]
old_dir = cp["direction"]
old_linkClass = cp["linkClass"]
# Update values
cp["x"] = json_cp["x"]
cp["y"] = json_cp["y"]
cp["direction"] = json_cp["direction"]
cp["linkClass"] = json_cp["linkClass"]
# Record changes
cp_changes.append({
"id": cp_id,
"x": (old_x, cp["x"]),
"y": (old_y, cp["y"]),
"direction": (old_dir, cp["direction"]),
"linkClass": (old_linkClass, cp["linkClass"])
})
# Write back to TXT file
with open(txt_file_path, 'w', encoding='utf-8') as f:
json.dump(txt_content, f, indent=2, ensure_ascii=False)
# Add to report
file_entry.append("[Dimension Changes]")
file_entry.append(f"width: {old_width}{new_width}")
file_entry.append(f"height: {old_height}{new_height}")
if cp_changes:
file_entry.append("\n[Connection Point Changes]")
for change in cp_changes:
file_entry.append(f"Connection point {change['id']}:")
file_entry.append(f" x: {change['x'][0]}{change['x'][1]}")
file_entry.append(f" y: {change['y'][0]}{change['y'][1]}")
file_entry.append(f" direction: {change['direction'][0]}{change['direction'][1]}")
file_entry.append(f" linkClass: {change['linkClass'][0]}{change['linkClass'][1]}")
file_entry.append(f"\nFile {txt_file_path} processed successfully")
file_entry.append("="*50)
# Add this file's entry to main report
report_content.extend(file_entry)
# Also print to console
print("\n" + "\n".join(file_entry))
else:
print(f"\nSkipping file {txt_file_path} (no matching JSON data found)")
# Write the report file if any changes were made
if len(report_content) > 2: # More than just the header
with open(log_file_path, 'w', encoding='utf-8') as f:
f.write("\n".join(report_content))
print(f"\nModification report saved to: {log_file_path}")
else:
print("\nNo files were modified - no report generated")
# Example usage
if __name__ == "__main__":
json_file_path = "1_TEF_Boegen_input_processed_output.json"
txt_files_dir = "C:/Program Files/RuleDesigner/RDConfigurator Fusion/WebApi/Editor2D/SSG/shapes/props"
process_files(json_file_path, txt_files_dir)
print("\nAll files processed!")
@@ -0,0 +1,172 @@
"""
SVG XML Batch Modifier Script
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
"""
import json
import os
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element, SubElement, tostring
def process_xml_file(xml_path):
"""
Process a single XML file with enhanced style handling
Returns modification statistics
"""
try:
tree = ET.parse(xml_path)
root = tree.getroot()
# Register and handle SVG namespace
ET.register_namespace('', 'http://www.w3.org/2000/svg')
namespaces = {'svg': 'http://www.w3.org/2000/svg'}
stats = {
'ffe31b_groups': 0,
'ec2525_groups': 0,
'other_groups_processed': 0,
'elements_modified': 0,
'modified': False
}
# Process all group elements
for g in root.findall('.//svg:g', namespaces):
stroke = g.get('stroke')
if stroke == "#ffe31b":
stats['ffe31b_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
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')
stats['elements_modified'] += 1
stats['modified'] = True
else:
# Handle groups without specific stroke color
stats['other_groups_processed'] += 1
# Process elements with style="stroke:#ec2525;"
for child in g.findall('.//svg:*[@style]', namespaces):
style = child.get('style', '')
if 'stroke:#ec2525;' in style:
# Remove stroke-width 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;')
stats['elements_modified'] += 1
stats['modified'] = True
# Save changes if modified
if stats['modified']:
xml_str = ET.tostring(root, encoding='unicode')
xml_str = xml_str.replace('><', '>\n<').replace('</svg>', '\n</svg>')
with open(xml_path, 'w', encoding='utf-8') as f:
f.write(xml_str)
return stats
except Exception as e:
print(f" Error processing file: {str(e)}")
return None
def main():
"""
Main processing function
"""
# Configure paths
json_file_path = "1_TEF_Boegen_input.json"
svg_folder_path = r"C:\Program Files\RuleDesigner\RDConfigurator Fusion\WebApi\Editor2D\SSG\shapes\svg"
try:
# Read and parse JSON file
with open(json_file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
# Verify we have a list of items
if not isinstance(data, list):
print("Error: JSON data should be an array of items")
return
print(f"\nFound {len(data)} items in JSON file")
# Process each item in the JSON array
for index, item in enumerate(data, 1):
if not isinstance(item, dict):
print(f"\nItem {index}: Not a dictionary, skipping")
continue
sivasnr = item.get("Sivasnr")
if not sivasnr:
print(f"\nItem {index}: Missing 'Sivasnr' value, skipping")
continue
print(f"\nProcessing item {index}: Sivasnr = {sivasnr}")
# Build XML filename and path
xml_filename = f"{sivasnr}.xml"
xml_path = os.path.join(svg_folder_path, xml_filename)
if not os.path.exists(xml_path):
print(f" XML file not found: {xml_path}")
continue
print(f" Found XML file: {xml_path}")
# Process the XML file
stats = process_xml_file(xml_path)
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']}")
else:
print(" No modifications needed")
print("\nProcessing complete")
except FileNotFoundError:
print("\nError: JSON file not found")
except json.JSONDecodeError:
print("\nError: Invalid JSON format")
except Exception as e:
print(f"\nUnexpected error: {str(e)}")
if __name__ == "__main__":
print("SVG XML Batch Modifier - Starting execution")
main()