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