From 6ab835c42517bba6cdb84cc5c3321316c697b6cc Mon Sep 17 00:00:00 2001 From: Simon Hensch Date: Wed, 22 Jul 2026 12:48:07 +0200 Subject: [PATCH 1/4] =?UTF-8?q?[FIX]=20Dropdown=20Men=C3=BC=20f=C3=BCr=20W?= =?UTF-8?q?eichenauswahl=20Omniflo=20verbreitert,=20um=20den=20gesamten=20?= =?UTF-8?q?Text=20sichtbar=20zu=20machen;=20[FIX]=20Grad=20Zeichen=20in=20?= =?UTF-8?q?Beschreibungen=20der=20Dropdowns=20bzw=20in=20den=20entsprechen?= =?UTF-8?q?den=20JSON=20Dateien=20entfernt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/json/omniflo_boegen.json | 58 +++++++------- data/json/omniflo_weichen.json | 112 +++++++++++++-------------- data/json/tef_Antriebst_Spannst.json | 36 ++++----- data/json/tef_boegen.json | 18 ++--- data/json/tef_weichen.json | 40 +++++----- dcl/omniflo_weichen.dcl | 2 +- 6 files changed, 133 insertions(+), 133 deletions(-) diff --git a/data/json/omniflo_boegen.json b/data/json/omniflo_boegen.json index 6211977..66f083b 100644 --- a/data/json/omniflo_boegen.json +++ b/data/json/omniflo_boegen.json @@ -1,7 +1,7 @@ [ { "Sivasnr": 821104025, - "ProfilTyp": "APB 110 R 550/22,5° – 84/522", + "ProfilTyp": "APB 110 R 550/22,5 – 84/522", "Radius": 550, "KurvenWinkel": 22.5, "Breite": 84, @@ -12,7 +12,7 @@ }, { "Sivasnr": "821104025+0_B10090", - "ProfilTyp": "APB 110 R 550/22,5° – 84/522 mit TEF Innen", + "ProfilTyp": "APB 110 R 550/22,5 – 84/522 mit TEF Innen", "Radius": 550, "KurvenWinkel": 22.5, "Breite": 84, @@ -23,7 +23,7 @@ }, { "Sivasnr": "821104025+0_B10091", - "ProfilTyp": "APB 110 R 550/22,5° – 84/522 mit TEF Aussen", + "ProfilTyp": "APB 110 R 550/22,5 – 84/522 mit TEF Aussen", "Radius": 550, "KurvenWinkel": 22.5, "Breite": 84, @@ -34,7 +34,7 @@ }, { "Sivasnr": 821104021, - "ProfilTyp": "APB 110 R 400/45° – 400/670", + "ProfilTyp": "APB 110 R 400/45 – 400/670", "Radius": 400, "KurvenWinkel": 45, "Breite": 400, @@ -44,7 +44,7 @@ }, { "Sivasnr": 821104026, - "ProfilTyp": "APB 110 R 550/45° – 232/610", + "ProfilTyp": "APB 110 R 550/45 – 232/610", "Radius": 550, "KurvenWinkel": 45, "Breite": 232, @@ -54,7 +54,7 @@ }, { "Sivasnr": "821104026+0_B10071", - "ProfilTyp": "APB 110 R 550/45° – 232/610 mit TEF Innen", + "ProfilTyp": "APB 110 R 550/45 – 232/610 mit TEF Innen", "Radius": 550, "KurvenWinkel": 45, "Breite": 232, @@ -64,7 +64,7 @@ }, { "Sivasnr": 821104037, - "ProfilTyp": "APB 110 R 550/45° – 205/337", + "ProfilTyp": "APB 110 R 550/45 – 205/337", "Radius": 550, "KurvenWinkel": 45, "Breite": 205, @@ -74,7 +74,7 @@ }, { "Sivasnr": 821104029, - "ProfilTyp": "APB 110 R 550/45° 191/552", + "ProfilTyp": "APB 110 R 550/45 191/552", "Radius": 550, "KurvenWinkel": 45, "Breite": 191, @@ -84,7 +84,7 @@ }, { "Sivasnr": 821104031, - "ProfilTyp": "APB 110 R 630/45° – 400/825", + "ProfilTyp": "APB 110 R 630/45 – 400/825", "Radius": 630, "KurvenWinkel": 45, "Breite": 400, @@ -94,7 +94,7 @@ }, { "Sivasnr": "821104031+0_B10060", - "ProfilTyp": "APB 110 R 630/45° – 400/825 mit TEF Aussen", + "ProfilTyp": "APB 110 R 630/45 – 400/825 mit TEF Aussen", "Radius": 630, "KurvenWinkel": 45, "Breite": 400, @@ -104,7 +104,7 @@ }, { "Sivasnr": "821104031+0_B10070", - "ProfilTyp": "APB 110 R 630/45° – 400/825 mit TEF Innen", + "ProfilTyp": "APB 110 R 630/45 – 400/825 mit TEF Innen", "Radius": 630, "KurvenWinkel": 45, "Breite": 400, @@ -114,7 +114,7 @@ }, { "Sivasnr": 821104024, - "ProfilTyp": "APB 110 R 400/67,5° – 339/508", + "ProfilTyp": "APB 110 R 400/67,5 – 339/508", "Radius": 400, "KurvenWinkel": 67.5, "Breite": 339, @@ -124,7 +124,7 @@ }, { "Sivasnr": "821104024+0_B10081", - "ProfilTyp": "APB 110 R 400/67,5° – 339/508 mit TEF Innen", + "ProfilTyp": "APB 110 R 400/67,5 – 339/508 mit TEF Innen", "Radius": 400, "KurvenWinkel": 67.5, "Breite": 339, @@ -134,7 +134,7 @@ }, { "Sivasnr": 821104027, - "ProfilTyp": "APB 110 R 550/67,5° – 488/778", + "ProfilTyp": "APB 110 R 550/67,5 – 488/778", "Radius": 550, "KurvenWinkel": 67.5, "Breite": 448, @@ -144,7 +144,7 @@ }, { "Sivasnr": "821104027+0_B10080", - "ProfilTyp": "APB 110 R 550/67,5° – 488/778 mit TEF Innen", + "ProfilTyp": "APB 110 R 550/67,5 – 488/778 mit TEF Innen", "Radius": 550, "KurvenWinkel": 67.5, "Breite": 448, @@ -154,7 +154,7 @@ }, { "Sivasnr": 821104028, - "ProfilTyp": "APB 110 R 550/67,5° – 420/582", + "ProfilTyp": "APB 110 R 550/67,5 – 420/582", "Radius": 550, "KurvenWinkel": 67.5, "Breite": 420, @@ -164,7 +164,7 @@ }, { "Sivasnr": 821104065, - "ProfilTyp": "APB 110 R 550/67,5° – 498/758", + "ProfilTyp": "APB 110 R 550/67,5 – 498/758", "Radius": 550, "KurvenWinkel": 67.5, "Breite": 498, @@ -174,7 +174,7 @@ }, { "Sivasnr": 821094101, - "ProfilTyp": "APB 60 R 515/90° – 135/135", + "ProfilTyp": "APB 60 R 515/90 – 135/135", "Radius": 515, "KurvenWinkel": 90, "Breite": 650, @@ -184,7 +184,7 @@ }, { "Sivasnr": 821094040, - "ProfilTyp": "APB 60 R 515/90° – 295/295", + "ProfilTyp": "APB 60 R 515/90 – 295/295", "Radius": 515, "KurvenWinkel": 90, "Breite": 810, @@ -194,7 +194,7 @@ }, { "Sivasnr": 821104022, - "ProfilTyp": "APB 110 R 400/90° – 500/500", + "ProfilTyp": "APB 110 R 400/90 – 500/500", "Radius": 400, "KurvenWinkel": 90, "Breite": 500, @@ -204,7 +204,7 @@ }, { "Sivasnr": 821104030, - "ProfilTyp": "APB 110 R 500/90° – 550/550", + "ProfilTyp": "APB 110 R 500/90 – 550/550", "Radius": 500, "KurvenWinkel": 90, "Breite": 550, @@ -214,7 +214,7 @@ }, { "Sivasnr": 821104033, - "ProfilTyp": "APB 110 R 630/90° – 800/800", + "ProfilTyp": "APB 110 R 630/90 – 800/800", "Radius": 630, "KurvenWinkel": 90, "Breite": 800, @@ -224,7 +224,7 @@ }, { "Sivasnr": "821104033+0_B10040", - "ProfilTyp": "APB 110 R 630/90° – 800/800 mit TEF Aussen", + "ProfilTyp": "APB 110 R 630/90 – 800/800 mit TEF Aussen", "Radius": 630, "KurvenWinkel": 90, "Breite": 800, @@ -234,7 +234,7 @@ }, { "Sivasnr": "821104033+0_B10050", - "ProfilTyp": "APB 110 R 630/90° – 800/800 mit TEF Innen", + "ProfilTyp": "APB 110 R 630/90 – 800/800 mit TEF Innen", "Radius": 630, "KurvenWinkel": 90, "Breite": 800, @@ -244,7 +244,7 @@ }, { "Sivasnr": 821104035, - "ProfilTyp": "APB 110 R 630/90° – 850/870", + "ProfilTyp": "APB 110 R 630/90 – 850/870", "Radius": 630, "KurvenWinkel": 90, "Breite": 850, @@ -254,7 +254,7 @@ }, { "Sivasnr": 821104041, - "ProfilTyp": "APB 110 R 630/90° – 850/690", + "ProfilTyp": "APB 110 R 630/90 – 850/690", "Radius": 630, "KurvenWinkel": 90, "Breite": 850, @@ -264,7 +264,7 @@ }, { "Sivasnr": 821104034, - "ProfilTyp": "APB 110 R 630/90° – 850/890", + "ProfilTyp": "APB 110 R 630/90 – 850/890", "Radius": 630, "KurvenWinkel": 90, "Breite": 850, @@ -274,7 +274,7 @@ }, { "Sivasnr": 821104066, - "ProfilTyp": "APB 110 R 550/90° – 900/605", + "ProfilTyp": "APB 110 R 550/90 – 900/605", "Radius": 550, "KurvenWinkel": 90, "Breite": 900, @@ -284,7 +284,7 @@ }, { "Sivasnr": 821104043, - "ProfilTyp": "APB 110 R 630/180° – 1300/800", + "ProfilTyp": "APB 110 R 630/180 – 1300/800", "Radius": 650, "KurvenWinkel": 180, "Breite": 1300, diff --git a/data/json/omniflo_weichen.json b/data/json/omniflo_weichen.json index 19b4c5e..a2be83d 100644 --- a/data/json/omniflo_weichen.json +++ b/data/json/omniflo_weichen.json @@ -1,7 +1,7 @@ [ { "Sivasnr": 834372001, - "ProfilTyp": "WEICHE S 45°-L-350/700, KPL. MIT M", + "ProfilTyp": "WEICHE S 45-L-350/700, KPL. MIT M", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "M", @@ -13,7 +13,7 @@ }, { "Sivasnr": 834372002, - "ProfilTyp": "WEICHE S 45°-L-350/700, KPL. MIT P", + "ProfilTyp": "WEICHE S 45-L-350/700, KPL. MIT P", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -25,7 +25,7 @@ }, { "Sivasnr": "834372002+0_BG090090", - "ProfilTyp": "WEICHE S 45°-L-350/700, KPL. MIT P mit TEF Innen", + "ProfilTyp": "WEICHE S 45-L-350/700, KPL. MIT P mit TEF Innen", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -37,7 +37,7 @@ }, { "Sivasnr": 834372004, - "ProfilTyp": "WEICHE S 45°-R-350/700, KPL. MIT M", + "ProfilTyp": "WEICHE S 45-R-350/700, KPL. MIT M", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "M", @@ -49,7 +49,7 @@ }, { "Sivasnr": 834372005, - "ProfilTyp": "WEICHE S 45°-R-350/700, KPL. MIT P", + "ProfilTyp": "WEICHE S 45-R-350/700, KPL. MIT P", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -61,7 +61,7 @@ }, { "Sivasnr": "834372005+0_BG090090", - "ProfilTyp": "WEICHE S 45°-R-350/700, KPL. MIT P mit TEF Innen", + "ProfilTyp": "WEICHE S 45-R-350/700, KPL. MIT P mit TEF Innen", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -73,7 +73,7 @@ }, { "Sivasnr": 834372007, - "ProfilTyp": "WEICHE S 45°-L-400/750, KPL. MIT M", + "ProfilTyp": "WEICHE S 45-L-400/750, KPL. MIT M", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "M", @@ -85,7 +85,7 @@ }, { "Sivasnr": 834372008, - "ProfilTyp": "WEICHE S 45°-L-400/750, KPL. MIT P", + "ProfilTyp": "WEICHE S 45-L-400/750, KPL. MIT P", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -97,7 +97,7 @@ }, { "Sivasnr": "834372008+0_BG190090", - "ProfilTyp": "WEICHE S 45°-L-400/750, KPL. MIT P mit TEF Ihnen", + "ProfilTyp": "WEICHE S 45-L-400/750, KPL. MIT P mit TEF Ihnen", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -109,7 +109,7 @@ }, { "Sivasnr": 834372010, - "ProfilTyp": "WEICHE S 45°-R-400/750, KPL. MIT M", + "ProfilTyp": "WEICHE S 45-R-400/750, KPL. MIT M", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "M", @@ -121,7 +121,7 @@ }, { "Sivasnr": 834372011, - "ProfilTyp": "WEICHE S 45°-R-400/750, KPL. MIT P", + "ProfilTyp": "WEICHE S 45-R-400/750, KPL. MIT P", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -133,7 +133,7 @@ }, { "Sivasnr": "834372011+0_BG190090", - "ProfilTyp": "WEICHE S 45°-R-400/750, KPL. MIT P mit TEF Ihnen", + "ProfilTyp": "WEICHE S 45-R-400/750, KPL. MIT P mit TEF Ihnen", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -145,7 +145,7 @@ }, { "Sivasnr": 834372021, - "ProfilTyp": "WEICHE S 90°-L-500/600, KPL. MIT M", + "ProfilTyp": "WEICHE S 90-L-500/600, KPL. MIT M", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "M", @@ -157,7 +157,7 @@ }, { "Sivasnr": 834372022, - "ProfilTyp": "WEICHE S 90°-L-500/600, KPL. MIT P", + "ProfilTyp": "WEICHE S 90-L-500/600, KPL. MIT P", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -169,7 +169,7 @@ }, { "Sivasnr": 834372024, - "ProfilTyp": "WEICHE S 90°-R-500/600, KPL. MIT M", + "ProfilTyp": "WEICHE S 90-R-500/600, KPL. MIT M", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "M", @@ -181,7 +181,7 @@ }, { "Sivasnr": 834372025, - "ProfilTyp": "WEICHE S 90°-R-500/600, KPL. MIT P", + "ProfilTyp": "WEICHE S 90-R-500/600, KPL. MIT P", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -193,7 +193,7 @@ }, { "Sivasnr": 834372027, - "ProfilTyp": "WEICHE S 90°-L-700/700, KPL. MIT M", + "ProfilTyp": "WEICHE S 90-L-700/700, KPL. MIT M", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "M", @@ -205,7 +205,7 @@ }, { "Sivasnr": 834372028, - "ProfilTyp": "WEICHE S 90°-L-700/700, KPL. MIT P", + "ProfilTyp": "WEICHE S 90-L-700/700, KPL. MIT P", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -217,7 +217,7 @@ }, { "Sivasnr": "834372028+0_BG080090", - "ProfilTyp": "WEICHE S 90°-L-700/700, KPL. MIT P mit TEF Innen", + "ProfilTyp": "WEICHE S 90-L-700/700, KPL. MIT P mit TEF Innen", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -229,7 +229,7 @@ }, { "Sivasnr": 834372030, - "ProfilTyp": "WEICHE S 90°-R-700/700, KPL. MIT M", + "ProfilTyp": "WEICHE S 90-R-700/700, KPL. MIT M", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "M", @@ -241,7 +241,7 @@ }, { "Sivasnr": 834372031, - "ProfilTyp": "WEICHE S 90°-R-700/700, KPL. MIT P", + "ProfilTyp": "WEICHE S 90-R-700/700, KPL. MIT P", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -253,7 +253,7 @@ }, { "Sivasnr": "834372031+0_BG080090", - "ProfilTyp": "WEICHE S 90°-R-700/700, KPL. MIT P mit TEF Innen", + "ProfilTyp": "WEICHE S 90-R-700/700, KPL. MIT P mit TEF Innen", "WeichenTyp": "Einzelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -313,7 +313,7 @@ }, { "Sivasnr": 834372100, - "ProfilTyp": "WEICHE S D 45°-350/700, KPL. MIT M", + "ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT M", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "M", @@ -324,7 +324,7 @@ }, { "Sivasnr": 834372101, - "ProfilTyp": "WEICHE S D 45°-350/700, KPL. MIT P", + "ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -335,7 +335,7 @@ }, { "Sivasnr": "0_BG090090+834372101", - "ProfilTyp": "WEICHE S D 45°-350/700, KPL. MIT P mit TEF links", + "ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P mit TEF links", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -346,7 +346,7 @@ }, { "Sivasnr": "834372101+0_BG090090", - "ProfilTyp": "WEICHE S D 45°-350/700, KPL. MIT P mit TEF rechts", + "ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P mit TEF rechts", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -357,7 +357,7 @@ }, { "Sivasnr": "0_BG090090+834372101+0_BG090090", - "ProfilTyp": "WEICHE S D 45°-350/700, KPL. MIT P mit TEF beideseitig", + "ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P mit TEF beideseitig", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -368,7 +368,7 @@ }, { "Sivasnr": 834372103, - "ProfilTyp": "WEICHE S D 45°-400/750, KPL. MIT M", + "ProfilTyp": "WEICHE S D 45-400/750, KPL. MIT M", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "M", @@ -379,7 +379,7 @@ }, { "Sivasnr": 834372104, - "ProfilTyp": "WEICHE S D 45°-400/750, KPL. MIT P", + "ProfilTyp": "WEICHE S D 45-400/750, KPL. MIT P", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -390,7 +390,7 @@ }, { "Sivasnr": "0_BG190090+834372104", - "ProfilTyp": "WEICHE S D 45°-400/750, KPL. MIT P mit TEF links", + "ProfilTyp": "WEICHE S D 45-400/750, KPL. MIT P mit TEF links", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -401,7 +401,7 @@ }, { "Sivasnr": "834372104+0_BG190090", - "ProfilTyp": "WEICHE S D 45°-400/750, KPL. MIT P mit TEF rechts", + "ProfilTyp": "WEICHE S D 45-400/750, KPL. MIT P mit TEF rechts", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -412,7 +412,7 @@ }, { "Sivasnr": "0_BG190090+834372104+0_BG190090", - "ProfilTyp": "WEICHE S D 45°-400/750, KPL. MIT P mit TEF beideseitig", + "ProfilTyp": "WEICHE S D 45-400/750, KPL. MIT P mit TEF beideseitig", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -423,7 +423,7 @@ }, { "Sivasnr": 834372106, - "ProfilTyp": "WEICHE S D 90°-500/600, KPL. MIT M", + "ProfilTyp": "WEICHE S D 90-500/600, KPL. MIT M", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 90, "Schaltungstyp": "M", @@ -434,7 +434,7 @@ }, { "Sivasnr": 834372107, - "ProfilTyp": "WEICHE S D 90°-500/600, KPL. MIT P", + "ProfilTyp": "WEICHE S D 90-500/600, KPL. MIT P", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -445,7 +445,7 @@ }, { "Sivasnr": 834372109, - "ProfilTyp": "WEICHE S D 90°-700/700, KPL. MIT M", + "ProfilTyp": "WEICHE S D 90-700/700, KPL. MIT M", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 90, "Schaltungstyp": "M", @@ -456,7 +456,7 @@ }, { "Sivasnr": 834372110, - "ProfilTyp": "WEICHE S D 90°-700/700, KPL. MIT P", + "ProfilTyp": "WEICHE S D 90-700/700, KPL. MIT P", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -467,7 +467,7 @@ }, { "Sivasnr": "0_BG080090+834372110", - "ProfilTyp": "WEICHE S D 90°-700/700, KPL. MIT P mit TEF links", + "ProfilTyp": "WEICHE S D 90-700/700, KPL. MIT P mit TEF links", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -478,7 +478,7 @@ }, { "Sivasnr": "834372110+0_BG080090", - "ProfilTyp": "WEICHE S D 90°-700/700, KPL. MIT P mit TEF rechts", + "ProfilTyp": "WEICHE S D 90-700/700, KPL. MIT P mit TEF rechts", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -489,7 +489,7 @@ }, { "Sivasnr": "0_BG080090+834372110+0_BG080090", - "ProfilTyp": "WEICHE S D 90°-700/700, KPL. MIT P mit TEF beideseitig", + "ProfilTyp": "WEICHE S D 90-700/700, KPL. MIT P mit TEF beideseitig", "WeichenTyp": "Doppelweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -522,7 +522,7 @@ }, { "Sivasnr": 834372200, - "ProfilTyp": "WEICHE S T 45°-350/700, KPL. MIT M", + "ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT M", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "M", @@ -533,7 +533,7 @@ }, { "Sivasnr": 834372201, - "ProfilTyp": "WEICHE S T 45°-350/700, KPL. MIT P", + "ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -544,7 +544,7 @@ }, { "Sivasnr": "0_BG090090+834372201", - "ProfilTyp": "WEICHE S T 45°-350/700, KPL. MIT P mit TEF links", + "ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P mit TEF links", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -555,7 +555,7 @@ }, { "Sivasnr": "834372201+0_BG090090", - "ProfilTyp": "WEICHE S T 45°-350/700, KPL. MIT P mit TEF rechts", + "ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P mit TEF rechts", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -566,7 +566,7 @@ }, { "Sivasnr": "0_BG090090+834372201+0_BG090090", - "ProfilTyp": "WEICHE S T 45°-350/700, KPL. MIT P mit TEF beideseitig", + "ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P mit TEF beideseitig", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -577,7 +577,7 @@ }, { "Sivasnr": 834372203, - "ProfilTyp": "WEICHE S T 45°-400/750, KPL. MIT M", + "ProfilTyp": "WEICHE S T 45-400/750, KPL. MIT M", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "M", @@ -588,7 +588,7 @@ }, { "Sivasnr": 834372204, - "ProfilTyp": "WEICHE S T 45°-400/750, KPL. MIT P", + "ProfilTyp": "WEICHE S T 45-400/750, KPL. MIT P", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -599,7 +599,7 @@ }, { "Sivasnr": "0_BG190090+834372204", - "ProfilTyp": "WEICHE S T 45°-400/750, KPL. MIT P mit TEF links", + "ProfilTyp": "WEICHE S T 45-400/750, KPL. MIT P mit TEF links", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -610,7 +610,7 @@ }, { "Sivasnr": "834372204+0_BG190090", - "ProfilTyp": "WEICHE S T 45°-400/750, KPL. MIT P mit TEF rechts", + "ProfilTyp": "WEICHE S T 45-400/750, KPL. MIT P mit TEF rechts", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -621,7 +621,7 @@ }, { "Sivasnr": "0_BG190090+834372204+0_BG190090", - "ProfilTyp": "WEICHE S T 45°-400/750, KPL. MIT P mit TEF beideseitig", + "ProfilTyp": "WEICHE S T 45-400/750, KPL. MIT P mit TEF beideseitig", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 45, "Schaltungstyp": "P", @@ -632,7 +632,7 @@ }, { "Sivasnr": 834372206, - "ProfilTyp": "WEICHE S T 90°-500/600, KPL. MIT M", + "ProfilTyp": "WEICHE S T 90-500/600, KPL. MIT M", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 90, "Schaltungstyp": "M", @@ -643,7 +643,7 @@ }, { "Sivasnr": 834372207, - "ProfilTyp": "WEICHE S T 90°-500/600, KPL. MIT P", + "ProfilTyp": "WEICHE S T 90-500/600, KPL. MIT P", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -654,7 +654,7 @@ }, { "Sivasnr": 834372209, - "ProfilTyp": "WEICHE S T 90°-700/700, KPL. MIT M", + "ProfilTyp": "WEICHE S T 90-700/700, KPL. MIT M", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 90, "Schaltungstyp": "M", @@ -665,7 +665,7 @@ }, { "Sivasnr": 834372210, - "ProfilTyp": "WEICHE S T 90°-700/700, KPL. MIT P", + "ProfilTyp": "WEICHE S T 90-700/700, KPL. MIT P", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -676,7 +676,7 @@ }, { "Sivasnr": "0_BG080090+834372210", - "ProfilTyp": "WEICHE S T 90°-700/700, KPL. MIT P mit TEF links", + "ProfilTyp": "WEICHE S T 90-700/700, KPL. MIT P mit TEF links", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -687,7 +687,7 @@ }, { "Sivasnr": "834372210+0_BG080090", - "ProfilTyp": "WEICHE S T 90°-700/700, KPL. MIT P mit TEF rechts", + "ProfilTyp": "WEICHE S T 90-700/700, KPL. MIT P mit TEF rechts", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", @@ -698,7 +698,7 @@ }, { "Sivasnr": "0_BG080090+834372210+0_BG080090", - "ProfilTyp": "WEICHE S T 90°-700/700, KPL. MIT P mit TEF beideseitig", + "ProfilTyp": "WEICHE S T 90-700/700, KPL. MIT P mit TEF beideseitig", "WeichenTyp": "Dreiwegeweiche", "KurvenWinkel": 90, "Schaltungstyp": "P", diff --git a/data/json/tef_Antriebst_Spannst.json b/data/json/tef_Antriebst_Spannst.json index 63a844c..d44759a 100644 --- a/data/json/tef_Antriebst_Spannst.json +++ b/data/json/tef_Antriebst_Spannst.json @@ -1,30 +1,30 @@ [ { - "Sivasnr": 0_B10001, - "Beschreibung": "Antribestation links für TEF links", - "Radius": , - "KurvenWinkel": , - "innen": + "Sivasnr": "0_B10001", + "Beschreibung": "Antriebstation links für TEF links", + "Radius": "", + "KurvenWinkel": "", + "innen": "" }, { - "Sivasnr": 0_B10020, - "Beschreibung": "Antribestation rechts für TEF rechts", - "Radius": , - "KurvenWinkel": , - "innen": + "Sivasnr": "0_B10020", + "Beschreibung": "Antriebstation rechts für TEF rechts", + "Radius": "", + "KurvenWinkel": "", + "innen": "" }, { - "Sivasnr": YYYYY, + "Sivasnr": "-", "Beschreibung": "Umlenkspannstation links für TEF links", - "Radius": , - "KurvenWinkel": , - "innen": + "Radius": "", + "KurvenWinkel": "", + "innen": "" }, { - "Sivasnr": YYYYY, + "Sivasnr": "-", "Beschreibung": "Umlenkspannstation rechts für TEF rechts", - "Radius": , - "KurvenWinkel": , - "innen": + "Radius": "", + "KurvenWinkel": "", + "innen": "" } ] diff --git a/data/json/tef_boegen.json b/data/json/tef_boegen.json index edf59c2..46bc747 100644 --- a/data/json/tef_boegen.json +++ b/data/json/tef_boegen.json @@ -1,62 +1,62 @@ [ { - "Sivasnr": 0_B10040, + "Sivasnr": "0_B10040", "Beschreibung": "TEF Bogen 90° R725", "Radius": 725, "KurvenWinkel": 90, "innen": false }, { - "Sivasnr": 0_B10050, + "Sivasnr": "0_B10050", "Beschreibung": "TEF Bogen 90° R535", "Radius": 535, "KurvenWinkel": 90, "innen": true }, { - "Sivasnr": 0_B10060, + "Sivasnr": "0_B10060", "Beschreibung": "TEF Bogen 45° R725", "Radius": 725, "KurvenWinkel": 45, "innen": false }, { - "Sivasnr": 0_B10070, + "Sivasnr": "0_B10070", "Beschreibung": "TEF Bogen 45° R535", "Radius": 535, "KurvenWinkel": 45, "innen": true }, { - "Sivasnr": 0_B10071, + "Sivasnr": "0_B10071", "Beschreibung": "TEF Bogen 45° R450 für S C Delta 1600", "Radius": 450, "KurvenWinkel": 45, "innen": true }, { - "Sivasnr": 0_B10080, + "Sivasnr": "0_B10080", "Beschreibung": "TEF Bogen 67.5° R400", "Radius": 400, "KurvenWinkel": 67.5, "innen": true }, { - "Sivasnr": 0_B10081, + "Sivasnr": "0_B10081", "Beschreibung": "TEF Bogen 67.5° R250", "Radius": 250, "KurvenWinkel": 67.5, "innen": true }, { - "Sivasnr": 0_B10090, + "Sivasnr": "0_B10090", "Beschreibung": "TEF Bogen 22.5° R450", "Radius": 450, "KurvenWinkel": 22.5, "innen": true }, { - "Sivasnr": 0_B10091, + "Sivasnr": "0_B10091", "Beschreibung": "TEF Bogen 22.5° R650", "Radius": 650, "KurvenWinkel": 22.5, diff --git a/data/json/tef_weichen.json b/data/json/tef_weichen.json index f60e447..97e0fbd 100644 --- a/data/json/tef_weichen.json +++ b/data/json/tef_weichen.json @@ -1,71 +1,71 @@ [ { - "Sivasnr": _BG080090, + "Sivasnr": "_BG080090", "Beschreibung": "TEF Bogen für Weiche S 90° 700/700 links", - "Radius": , + "Radius": "", "KurvenWinkel": 90, "innen": true }, { - "Sivasnr": _BG080090, + "Sivasnr": "_BG080090", "Beschreibung": "TEF Bogen für Weiche S 90° 700/700 rechts", - "Radius": , + "Radius": "", "KurvenWinkel": 90, "innen": true }, { - "Sivasnr": _BG081090, + "Sivasnr": "_BG081090", "Beschreibung": "TEF Bogen für Weiche S 90° 500/600 links", - "Radius": , + "Radius": "", "KurvenWinkel": 90, "innen": true }, { - "Sivasnr": _BG081090, + "Sivasnr": "_BG081090", "Beschreibung": "TEF Bogen für Weiche S 90° 500/600 rechts", - "Radius": , + "Radius": "", "KurvenWinkel": 90, "innen": true }, { - "Sivasnr": _BG190090, + "Sivasnr": "_BG190090", "Beschreibung": "TEF Bogen für Weiche S 45° 400/750 links", - "Radius": , + "Radius": "", "KurvenWinkel": 45, "innen": true }, { - "Sivasnr": _BG190090, + "Sivasnr": "_BG190090", "Beschreibung": "TEF Bogen für Weiche S 45° 400/750 rechts", - "Radius": , + "Radius": "", "KurvenWinkel": 45, "innen": true }, { - "Sivasnr": _BG090090, + "Sivasnr": "_BG090090", "Beschreibung": "TEF Bogen für Weiche S 45° 350/700 links", - "Radius": , + "Radius": "", "KurvenWinkel": 45, "innen": true }, { - "Sivasnr": _BG090090, + "Sivasnr": "_BG090090", "Beschreibung": "TEF Bogen für Weiche S 45° 350/700 rechts", - "Radius": , + "Radius": "", "KurvenWinkel": 45, "innen": true }, { - "Sivasnr": _BG071090, + "Sivasnr": "_BG071090", "Beschreibung": "TEF Bogen für Weiche S C Delta 1600/800 links", - "Radius": , + "Radius": "", "KurvenWinkel": 90, "innen": true }, { - "Sivasnr": _BG071090, + "Sivasnr": "_BG071090", "Beschreibung": "TEF Bogen für Weiche S C Delta 1600/800 rechts", - "Radius": , + "Radius": "", "KurvenWinkel": 90, "innen": true } diff --git a/dcl/omniflo_weichen.dcl b/dcl/omniflo_weichen.dcl index b29c9ca..f894814 100644 --- a/dcl/omniflo_weichen.dcl +++ b/dcl/omniflo_weichen.dcl @@ -10,7 +10,7 @@ omniflo_weichen : dialog { : popup_list { key = "profiltyp"; label = "Profiltyp-Auswahl:"; - width = 50; + width = 65; } } From 193b0dea04e35bffb24b8502b4578c9489c5bdf0 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Wed, 22 Jul 2026 12:49:25 +0200 Subject: [PATCH 2/4] CSV-Export: Bounding-Box (Position/Boundingbox) und Planquadrat-Spalte ergaenzt Nur EXPORTCSV betroffen, EXPORTSIVAS bleibt unveraendert: - Position/Boundingbox: Bounding-Box je Block per vla-getboundingbox (Lisp/export.lsp, csv:get-bbox), Mittelpunkt und Ausdehnung x/y/z. - Planquadrat: aus x/y-Koordinate berechnet nach cfg/export.cfg [Planquadrate] (Schrittweite, numerisch/alphabetisch je Achse, alphabetische Zaehlung mit Excel-Spalten-Umlauf Z->AA), siehe lib/export_planquadrat.py. Co-Authored-By: Claude Sonnet 5 --- Lisp/export.lsp | 81 ++++++- cfg/export.cfg | 30 +++ lib/export_csv.py | 72 +++++- lib/export_planquadrat.py | 71 ++++++ tests/reference/omniflo_export_reference.csv | 218 +++++++++---------- tests/test_foerderer.py | 18 +- tests/test_omniflo.py | 4 +- 7 files changed, 367 insertions(+), 127 deletions(-) create mode 100644 lib/export_planquadrat.py diff --git a/Lisp/export.lsp b/Lisp/export.lsp index 109e6f5..a129c52 100644 --- a/Lisp/export.lsp +++ b/Lisp/export.lsp @@ -11,6 +11,7 @@ ;; Datei-/Skriptnamen sind fest im Code hinterlegt (*export-filenames*). ;; ============================================================ +(vl-load-com) ;; --- Export-Konfiguration aus cfg/export.cfg laden --- ;; Nutzt den zentralen INI-Parser aus ssg_core.lsp (ssg-load-ini / ssg-ini-get / @@ -78,6 +79,47 @@ ) +;; --- Safearray/Variant-Rueckgabe von vla-getboundingbox in Liste wandeln --- +;; BricsCAD liefert ein Safearray, AutoCAD ein Variant mit Safearray. +(defun csv:pt->list (v) + (cond + ((= (type v) 'variant) (vlax-safearray->list (vlax-variant-value v))) + ((= (type v) 'safearray) (vlax-safearray->list v)) + ((listp v) v) + (t nil) + ) +) + +;; --- Bounding-Box (WCS, achsparallel) eines INSERT-Blocks ermitteln --- +;; Erzwingt vorher ein vla-update (Regen), da vla-getboundingbox sonst auf +;; nicht-regenerierten oder auf eingefrorenen Layern liegenden Bloecken scheitert. +;; Rueckgabe: Liste (cx cy cz dx dy dz) -- Mittelpunkt + Ausdehnung, oder nil bei Fehler. +(defun csv:get-bbox (ename / obj res minpt maxpt) + (setq obj (vlax-ename->vla-object ename)) + (vl-catch-all-apply 'vla-update (list obj)) + (setq res + (vl-catch-all-apply + '(lambda ( / ll ur) + (vla-getboundingbox obj 'll 'ur) + (list (csv:pt->list ll) (csv:pt->list ur))))) + (if (vl-catch-all-error-p res) + nil + (progn + (setq minpt (car res)) + (setq maxpt (cadr res)) + (list + (/ (+ (car minpt) (car maxpt)) 2.0) + (/ (+ (cadr minpt) (cadr maxpt)) 2.0) + (/ (+ (caddr minpt) (caddr maxpt)) 2.0) + (- (car maxpt) (car minpt)) + (- (cadr maxpt) (cadr minpt)) + (- (caddr maxpt) (caddr minpt)) + ) + ) + ) +) + + ;; --- Attribute eines INSERT-Blocks als JSON-Objekt lesen --- ;; ename = Entity-Name des INSERT ;; Rueckgabe: String wie {"TAG1":"Wert1","TAG2":"Wert2"} @@ -111,7 +153,9 @@ ;; --- Einen INSERT-Block als JSON-Objekt schreiben --- -(defun csv:block-to-json (ename / ed blk-name layer pt rotation handle attribs) +;; include-bbox = T -> zusaetzlich Bounding-Box (Mitte + Ausdehnung) ermitteln +;; und als "bbox"-Objekt anhaengen (nur fuer EXPORTCSV, nicht fuer EXPORTSIVAS). +(defun csv:block-to-json (ename include-bbox / ed blk-name layer pt rotation handle attribs bbox bbox-json) (setq ed (entget ename)) (setq blk-name (cdr (assoc 2 ed))) (setq layer (cdr (assoc 8 ed))) @@ -120,6 +164,26 @@ (setq handle (cdr (assoc 5 ed))) (if (null rotation) (setq rotation 0.0)) (setq attribs (csv:read-attribs ename)) + (setq bbox-json "") + (if include-bbox + (progn + (setq bbox (csv:get-bbox ename)) + (if bbox + (setq bbox-json + (strcat + ",\"bbox\":{" + "\"cx\":" (rtos (nth 0 bbox) 2 4) + ",\"cy\":" (rtos (nth 1 bbox) 2 4) + ",\"cz\":" (rtos (nth 2 bbox) 2 4) + ",\"dx\":" (rtos (nth 3 bbox) 2 4) + ",\"dy\":" (rtos (nth 4 bbox) 2 4) + ",\"dz\":" (rtos (nth 5 bbox) 2 4) + "}" + ) + ) + ) + ) + ) (strcat " {\"block_name\":\"" (csv:json-escape blk-name) "\"" ",\"layer\":\"" (csv:json-escape layer) "\"" @@ -129,6 +193,7 @@ ",\"z\":" (rtos (if (caddr pt) (caddr pt) 0.0) 2 4) ",\"rotation\":" (rtos (* (/ rotation pi) 180.0) 2 4) ",\"attribs\":" attribs + bbox-json "}" ) ) @@ -203,7 +268,9 @@ ;; label = Anzeigename (z.B. "EXPORTCSV") ;; py-name = Python-Skript-Name (z.B. "export_csv.py") ;; csv-name = Ergebnis-CSV-Name (z.B. "export.csv") -(defun csv:run-export (label py-name csv-name / ss i ename fh out-pfad +;; include-bbox = T -> Bounding-Box je Block ermitteln und mit exportieren +;; (siehe csv:block-to-json); fuer EXPORTSIVAS nil. +(defun csv:run-export (label py-name csv-name include-bbox / ss i ename fh out-pfad py-skript ergebnis-pfad cmd first-block count out-dir) ;; Vor dem Export: IDs aller Bloecke sicherstellen und Duplikate korrigieren (princ (ssg-textf "exp-check-ids" (list label))) @@ -254,7 +321,7 @@ (if (not first-block) (write-line "," fh) ) - (write-line (csv:block-to-json ename) fh) + (write-line (csv:block-to-json ename include-bbox) fh) (setq first-block nil) (setq i (1+ i)) ) @@ -289,14 +356,18 @@ (defun c:EXPORTSIVAS () (csv:run-export "EXPORTSIVAS" (export:filename "sivas_script") - (export:filename "sivas_csv")) + (export:filename "sivas_csv") + nil) ) ;; --- EXPORTCSV: Einfache Item-Liste aller Bloecke (ohne Summierung) --- +;; Ermittelt zusaetzlich je Block eine Bounding-Box (siehe csv:get-bbox), +;; die im Python-Skript als Position/Boundingbox-Spalten ausgegeben wird. (defun c:EXPORTCSV () (csv:run-export "EXPORTCSV" (export:filename "csv_script") - (export:filename "csv_csv")) + (export:filename "csv_csv") + T) ) diff --git a/cfg/export.cfg b/cfg/export.cfg index c36b582..56ec74e 100644 --- a/cfg/export.cfg +++ b/cfg/export.cfg @@ -27,3 +27,33 @@ pattern_variofoerderer= VF_* pattern_gefaellestrecke= GF_* pattern_strecke_module= Vario*, Staustrecke*, AUS_Element*, EIN_Element* pattern_ks_subblocks= KS_EIN, KS_AUS, K1, K2, K3, K4 + +[Planquadrate] +section=Planquadrate_AN + +# hier kann man im csv Export aus den Koordinaten der Bauteile die Planquadrate berechnen lassen, in denen sie liegen +# Zählung ist numerisch oder Alphabetisch möglich, Schrittweite in m (z.B. 2m pro Spalte, 4m pro Zeile) +# liegt man im ersten Quadrat, ist diese A/1, oder 1/1 oder 1/A, je nach Formatierung. Die Zählung beginnt immer bei 1 +[Planquadrate_NA] +# z.B. 1/A +x_step=2 +x_description=numerisch # zahlen, von links nach rechts, 2m pro Spalte +y_step=4 +y_description=alphabetisch # Buchstaben von unten nach oben, 4m pro Zeile +format= {x}/{y} # Formatierung der Planquadrate, {y} und {x} werden durch die berechneten gerundeten Werte der Objektkoordinaten ersetzt + +[Planquadrate_AN] +# z.B. A/1 +x_step=2 +x_description=alphabetisch # Buchstaben, von links nach rechts, 2m pro Spalte +y_step=2 +y_description=alphabetisch # Zahlen von unten nach oben, 2m pro Zeile +format= {x}/{y} + +[Planquadrate_NN] +# z.B. 2/5 +x_step=2 +x_description=numerisch # Zahlen, von links nach rechts, 2m pro Spalte +y_step=4 +y_description=numerisch # Zahlen von unten nach oben, 4m pro Zeile +format= {x}/{y} \ No newline at end of file diff --git a/lib/export_csv.py b/lib/export_csv.py index de39fe3..aac7040 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -11,7 +11,16 @@ Aufruf: python export_csv.py CSV-Format: - Elementnummer;TeileArt;TeileId;NachbarIds;Bezeichnung;Planquadrat;rotation;Merkmale + Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Merkmale + +Position und Boundingbox stammen aus der von export.lsp (csv:get-bbox, per +vla-getboundingbox) ermittelten Bounding-Box je Block: + Position = Mittenkoordinate x, y, z + Boundingbox = Ausdehnung (Laenge, Breite, Hoehe) in x, y, z +Planquadrat wird aus der x/y-Koordinate des Blocks berechnet, siehe +export_planquadrat.py ([Planquadrate] in cfg/export.cfg). +Position, Boundingbox und Planquadrat sind nur fuer EXPORTCSV vorhanden +(nicht EXPORTSIVAS) - siehe csv:run-export. """ import json @@ -19,8 +28,10 @@ import sys import os from export_blockpatterns import load_patterns, matches_any +from export_planquadrat import load_planquadrat_config, compute_planquadrat BLOCKPATTERNS = load_patterns() +PLANQUADRAT_CFG = load_planquadrat_config() # --------------------------------------------------------------------------- @@ -219,6 +230,41 @@ def build_kreisel_merkmale(block): } +# --------------------------------------------------------------------------- +# Bounding-Box-Spalten (Position/Boundingbox) +# --------------------------------------------------------------------------- + +def bbox_columns(block): + """Liest die von export.lsp (csv:get-bbox) ermittelte Bounding-Box. + + Rueckgabe: dict mit "position" (Mittenkoordinate x,y,z) und "boundingbox" + (Ausdehnung x,y,z) als Strings, oder leere Strings falls kein bbox-Feld + vorhanden ist (z.B. EXPORTSIVAS oder die synthetische Omniflo-Sum-Zeile). + """ + bbox = block.get("bbox") + if not bbox: + return {"position": "", "boundingbox": ""} + return { + "position": f'{bbox.get("cx", 0):.2f}, {bbox.get("cy", 0):.2f}, {bbox.get("cz", 0):.2f}', + "boundingbox": f'{bbox.get("dx", 0):.2f}, {bbox.get("dy", 0):.2f}, {bbox.get("dz", 0):.2f}', + } + + +def planquadrat_column(block): + """Berechnet das Planquadrat aus x/y des Blocks (siehe export_planquadrat.py). + + Leerer String, wenn keine Planquadrat-Konfiguration geladen werden konnte + (fehlende/unvollstaendige [Planquadrate]-Sektion in cfg/export.cfg). + """ + if PLANQUADRAT_CFG is None: + return "" + x = block.get("x") + y = block.get("y") + if x is None or y is None: + return "" + return compute_planquadrat(float(x), float(y), PLANQUADRAT_CFG) + + # --------------------------------------------------------------------------- # Bekannte Blocknamen # --------------------------------------------------------------------------- @@ -268,7 +314,9 @@ def process_blocks(blocks, lookup): "teileart": "Omniflo Kurve", "teileid": shape_id, "bezeichnung": f"OFBogen :{bogen_count}", + "planquadrat": planquadrat_column(block), "merkmale": build_bogen_merkmale(block, eintrag), + **bbox_columns(block), }) elif typ == "weiche": @@ -279,7 +327,9 @@ def process_blocks(blocks, lookup): "teileart": "Omniflo Weiche", "teileid": shape_id, "bezeichnung": f"OFWeiche :{weiche_count[wt]}", + "planquadrat": planquadrat_column(block), "merkmale": build_weiche_merkmale(block, eintrag), + **bbox_columns(block), }) subtyp = weichensubtyp(block, eintrag) if subtyp == "weichenkoerper": @@ -304,7 +354,9 @@ def process_blocks(blocks, lookup): "teileart": "Omniflo Gerade", "teileid": block.get("attribs", {}).get("ID", "0000"), "bezeichnung": f"OFGerade :{gerade_count}", + "planquadrat": planquadrat_column(block), "merkmale": build_gerade_merkmale(block), + **bbox_columns(block), }) len_ap110_mm += get_laenge_mm(block) continue @@ -318,7 +370,9 @@ def process_blocks(blocks, lookup): "teileart": "ILS 2.0 Strecke", "teileid": block.get("attribs", {}).get("ID", "0000"), "bezeichnung": f"VarioFoerderer :{vf_count}", + "planquadrat": planquadrat_column(block), "merkmale": build_variofoerderer_merkmale(block), + **bbox_columns(block), }) continue @@ -331,7 +385,9 @@ def process_blocks(blocks, lookup): "teileart": "ILS 2.0 Gefaellestrecke", "teileid": block.get("attribs", {}).get("ID", "0000"), "bezeichnung": f"Gefaellestrecke :{gf_count}", + "planquadrat": planquadrat_column(block), "merkmale": build_variofoerderer_merkmale(block), + **bbox_columns(block), }) continue @@ -345,7 +401,9 @@ def process_blocks(blocks, lookup): "teileart": "ILS 2.0 Eckrad", "teileid": block.get("attribs", {}).get("ID", "0000"), "bezeichnung": f"Eckrad :{eckrad_count}", + "planquadrat": planquadrat_column(block), "merkmale": build_kreisel_merkmale(block), + **bbox_columns(block), }) continue @@ -358,7 +416,9 @@ def process_blocks(blocks, lookup): "teileart": "ILS 2.0 Kreisel", "teileid": block.get("attribs", {}).get("ID", "0000"), "bezeichnung": f"Kreisel :{kreisel_count}", + "planquadrat": planquadrat_column(block), "merkmale": build_kreisel_merkmale(block), + **bbox_columns(block), }) continue @@ -371,7 +431,9 @@ def process_blocks(blocks, lookup): "teileart": "ILS 2.0 Strecke - Modul", "teileid": block.get("attribs", {}).get("ID", "0000"), "bezeichnung": f"Streckenmodul :{strecke_modul_count}", + "planquadrat": planquadrat_column(block), "merkmale": {"Blockname": bname}, + **bbox_columns(block), }) continue @@ -382,9 +444,12 @@ def process_blocks(blocks, lookup): "teileart": "Omniflo Sum", "teileid": "autogenerated_of_json", "bezeichnung": "Omniflo sum", + "planquadrat": "", "merkmale": build_omni_sum_merkmale( bogen_count, cnt_wk, cnt_einzel, cnt_delta, cnt_doppel, cnt_stern, len_ap110_mm, len_ap60_mm), + "position": "", + "boundingbox": "", }) return items @@ -401,7 +466,10 @@ def format_csv_line(item): f';"{item["teileart"]}"' f';"{item["teileid"]}"' f';"{item["bezeichnung"]}"' + f';"{item["planquadrat"]}"' f';1' + f';"{item["position"]}"' + f';"{item["boundingbox"]}"' f';{merkmale_json}' ) @@ -433,7 +501,7 @@ def main(): items = process_blocks(blocks, lookup) - header = "Elementnummer;TeileArt;TeileId;Bezeichnung;Anzahl;Merkmale" + header = "Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Merkmale" with open(output_csv, "w", encoding="utf-8") as f: f.write(header + "\n") for item in items: diff --git a/lib/export_planquadrat.py b/lib/export_planquadrat.py new file mode 100644 index 0000000..ccf3040 --- /dev/null +++ b/lib/export_planquadrat.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +export_planquadrat.py - Berechnet das Planquadrat eines Blocks aus x/y-Koordinate. + +Liest die aktive Planquadrat-Konfiguration aus cfg/export.cfg +([Planquadrate] -> section=, z.B. Planquadrate_AN) und +rundet die x/y-Koordinate eines Blocks (mm, wie im Roh-JSON von export.lsp) +je Achse auf die konfigurierte Schrittweite (in Metern) herunter. + +Nur von export_csv.py genutzt (EXPORTCSV), nicht von export_sivas.py. +""" + +import configparser + +from export_blockpatterns import cfg_path_from_env + + +def load_planquadrat_config(cfg_path=None): + """Liest die aktive Planquadrat-Konfiguration aus export.cfg. + + Rueckgabe: dict mit x_step_mm, x_alpha, y_step_mm, y_alpha, format, + oder None, wenn [Planquadrate] bzw. die referenzierte Sub-Sektion fehlt. + """ + if cfg_path is None: + cfg_path = cfg_path_from_env() + # inline_comment_prefixes noetig, da export.cfg Werte wie + # "numerisch # zahlen, von links nach rechts, 2m pro Spalte" nutzt. + parser = configparser.ConfigParser(inline_comment_prefixes=("#",)) + parser.read(cfg_path, encoding="utf-8") + + if not parser.has_section("Planquadrate"): + return None + section_name = parser.get("Planquadrate", "section", fallback=None) + if not section_name or not parser.has_section(section_name): + return None + + sec = parser[section_name] + return { + "x_step_mm": float(sec.get("x_step", "1")) * 1000.0, + "x_alpha": sec.get("x_description", "numerisch").strip().lower().startswith("alpha"), + "y_step_mm": float(sec.get("y_step", "1")) * 1000.0, + "y_alpha": sec.get("y_description", "numerisch").strip().lower().startswith("alpha"), + "format": sec.get("format", "{x}/{y}").strip(), + } + + +def _index_to_alpha(n): + """Wandelt einen 1-basierten Index in eine Buchstaben-Bezeichnung um. + + 1=A, 26=Z, 27=AA, 28=AB, ... (wie Excel-Spaltennamen). + """ + result = "" + while n > 0: + n, remainder = divmod(n - 1, 26) + result = chr(65 + remainder) + result + return result + + +def _index_for(coord_mm, step_mm): + """1-basierter Planquadrat-Index einer Koordinate fuer eine Schrittweite.""" + return int(coord_mm // step_mm) + 1 + + +def compute_planquadrat(x_mm, y_mm, cfg): + """Berechnet die Planquadrat-Bezeichnung fuer eine x/y-Koordinate (mm).""" + x_idx = _index_for(x_mm, cfg["x_step_mm"]) + y_idx = _index_for(y_mm, cfg["y_step_mm"]) + x_label = _index_to_alpha(x_idx) if cfg["x_alpha"] else str(x_idx) + y_label = _index_to_alpha(y_idx) if cfg["y_alpha"] else str(y_idx) + return cfg["format"].format(x=x_label, y=y_label) diff --git a/tests/reference/omniflo_export_reference.csv b/tests/reference/omniflo_export_reference.csv index f2da339..14c7f54 100644 --- a/tests/reference/omniflo_export_reference.csv +++ b/tests/reference/omniflo_export_reference.csv @@ -1,109 +1,109 @@ -Elementnummer;TeileArt;TeileId;Bezeichnung;Anzahl;Merkmale -1;"Omniflo Kurve";"0000";"OFBogen :1";1;{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025"} -2;"Omniflo Kurve";"0000";"OFBogen :2";1;{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025+0_B10090"} -3;"Omniflo Kurve";"0000";"OFBogen :3";1;{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025+0_B10091"} -4;"Omniflo Kurve";"0000";"OFBogen :4";1;{"Kurvenwinkel": 45.0, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104021"} -5;"Omniflo Kurve";"0000";"OFBogen :5";1;{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104026"} -6;"Omniflo Kurve";"0000";"OFBogen :6";1;{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104026+0_B10071"} -7;"Omniflo Kurve";"0000";"OFBogen :7";1;{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104037"} -8;"Omniflo Kurve";"0000";"OFBogen :8";1;{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104029"} -9;"Omniflo Kurve";"0000";"OFBogen :9";1;{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031"} -10;"Omniflo Kurve";"0000";"OFBogen :10";1;{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031+0_B10060"} -11;"Omniflo Kurve";"0000";"OFBogen :11";1;{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031+0_B10070"} -12;"Omniflo Kurve";"0000";"OFBogen :12";1;{"Kurvenwinkel": 67.5, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104024"} -13;"Omniflo Kurve";"0000";"OFBogen :13";1;{"Kurvenwinkel": 67.5, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104024+0_B10081"} -14;"Omniflo Kurve";"0000";"OFBogen :14";1;{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104027"} -15;"Omniflo Kurve";"0000";"OFBogen :15";1;{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104027+0_B10080"} -16;"Omniflo Kurve";"0000";"OFBogen :16";1;{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104028"} -17;"Omniflo Kurve";"0000";"OFBogen :17";1;{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104065"} -18;"Omniflo Kurve";"0000";"OFBogen :18";1;{"Kurvenwinkel": 90.0, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104022"} -19;"Omniflo Kurve";"0000";"OFBogen :19";1;{"Kurvenwinkel": 90.0, "Radius": 500.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104030"} -20;"Omniflo Kurve";"0000";"OFBogen :20";1;{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033"} -21;"Omniflo Kurve";"0000";"OFBogen :21";1;{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033+0_B10040"} -22;"Omniflo Kurve";"0000";"OFBogen :22";1;{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033+0_B10050"} -23;"Omniflo Kurve";"0000";"OFBogen :23";1;{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104035"} -24;"Omniflo Kurve";"0000";"OFBogen :24";1;{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104041"} -25;"Omniflo Kurve";"0000";"OFBogen :25";1;{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104034"} -26;"Omniflo Kurve";"0000";"OFBogen :26";1;{"Kurvenwinkel": 90.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104066"} -27;"Omniflo Kurve";"0000";"OFBogen :27";1;{"Kurvenwinkel": 180.0, "Radius": 650.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104043"} -28;"Omniflo Weiche";"0000";"OFWeiche :1";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342011"} -29;"Omniflo Weiche";"0000";"OFWeiche :2";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342001"} -30;"Omniflo Weiche";"0000";"OFWeiche :3";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342012"} -31;"Omniflo Weiche";"0000";"OFWeiche :4";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342002"} -32;"Omniflo Weiche";"0000";"OFWeiche :1";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342100"} -33;"Omniflo Weiche";"0000";"OFWeiche :2";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342101"} -34;"Omniflo Weiche";"0000";"OFWeiche :1";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342200"} -35;"Omniflo Weiche";"0000";"OFWeiche :2";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342201"} -36;"Omniflo Weiche";"0000";"OFWeiche :5";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372001"} -37;"Omniflo Weiche";"0000";"OFWeiche :6";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372002"} -38;"Omniflo Weiche";"0000";"OFWeiche :7";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372002+0_BG090090"} -39;"Omniflo Weiche";"0000";"OFWeiche :8";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372004"} -40;"Omniflo Weiche";"0000";"OFWeiche :9";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372005"} -41;"Omniflo Weiche";"0000";"OFWeiche :10";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372005+0_BG090090"} -42;"Omniflo Weiche";"0000";"OFWeiche :11";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372007"} -43;"Omniflo Weiche";"0000";"OFWeiche :12";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372008"} -44;"Omniflo Weiche";"0000";"OFWeiche :13";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372008+0_BG190090"} -45;"Omniflo Weiche";"0000";"OFWeiche :14";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372010"} -46;"Omniflo Weiche";"0000";"OFWeiche :15";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372011"} -47;"Omniflo Weiche";"0000";"OFWeiche :16";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372011+0_BG190090"} -48;"Omniflo Weiche";"0000";"OFWeiche :17";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372021"} -49;"Omniflo Weiche";"0000";"OFWeiche :18";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372022"} -50;"Omniflo Weiche";"0000";"OFWeiche :19";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372024"} -51;"Omniflo Weiche";"0000";"OFWeiche :20";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372025"} -52;"Omniflo Weiche";"0000";"OFWeiche :21";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372027"} -53;"Omniflo Weiche";"0000";"OFWeiche :22";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372028"} -54;"Omniflo Weiche";"0000";"OFWeiche :23";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372028+0_BG080090"} -55;"Omniflo Weiche";"0000";"OFWeiche :24";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372030"} -56;"Omniflo Weiche";"0000";"OFWeiche :25";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372031"} -57;"Omniflo Weiche";"0000";"OFWeiche :26";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372031+0_BG080090"} -58;"Omniflo Weiche";"0000";"OFWeiche :27";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372047"} -59;"Omniflo Weiche";"0000";"OFWeiche :28";1;{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372048"} -60;"Omniflo Weiche";"0000";"OFWeiche :29";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372050"} -61;"Omniflo Weiche";"0000";"OFWeiche :30";1;{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372051"} -62;"Omniflo Weiche";"0000";"OFWeiche :3";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372100"} -63;"Omniflo Weiche";"0000";"OFWeiche :4";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372101"} -64;"Omniflo Weiche";"0000";"OFWeiche :5";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372101"} -65;"Omniflo Weiche";"0000";"OFWeiche :6";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372101+0_BG090090"} -66;"Omniflo Weiche";"0000";"OFWeiche :7";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372101+0_BG090090"} -67;"Omniflo Weiche";"0000";"OFWeiche :8";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372103"} -68;"Omniflo Weiche";"0000";"OFWeiche :9";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372104"} -69;"Omniflo Weiche";"0000";"OFWeiche :10";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372104"} -70;"Omniflo Weiche";"0000";"OFWeiche :11";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372104+0_BG190090"} -71;"Omniflo Weiche";"0000";"OFWeiche :12";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372104+0_BG190090"} -72;"Omniflo Weiche";"0000";"OFWeiche :13";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372106"} -73;"Omniflo Weiche";"0000";"OFWeiche :14";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372107"} -74;"Omniflo Weiche";"0000";"OFWeiche :15";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372109"} -75;"Omniflo Weiche";"0000";"OFWeiche :16";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372110"} -76;"Omniflo Weiche";"0000";"OFWeiche :17";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372110"} -77;"Omniflo Weiche";"0000";"OFWeiche :18";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372110+0_BG080090"} -78;"Omniflo Weiche";"0000";"OFWeiche :19";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372110+0_BG080090"} -79;"Omniflo Weiche";"0000";"OFWeiche :20";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372115"} -80;"Omniflo Weiche";"0000";"OFWeiche :21";1;{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372116"} -81;"Omniflo Weiche";"0000";"OFWeiche :3";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372200"} -82;"Omniflo Weiche";"0000";"OFWeiche :4";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372201"} -83;"Omniflo Weiche";"0000";"OFWeiche :5";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372201"} -84;"Omniflo Weiche";"0000";"OFWeiche :6";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372201+0_BG090090"} -85;"Omniflo Weiche";"0000";"OFWeiche :7";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372201+0_BG090090"} -86;"Omniflo Weiche";"0000";"OFWeiche :8";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372203"} -87;"Omniflo Weiche";"0000";"OFWeiche :9";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372204"} -88;"Omniflo Weiche";"0000";"OFWeiche :10";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372204"} -89;"Omniflo Weiche";"0000";"OFWeiche :11";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372204+0_BG190090"} -90;"Omniflo Weiche";"0000";"OFWeiche :12";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372204+0_BG190090"} -91;"Omniflo Weiche";"0000";"OFWeiche :13";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372206"} -92;"Omniflo Weiche";"0000";"OFWeiche :14";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372207"} -93;"Omniflo Weiche";"0000";"OFWeiche :15";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372209"} -94;"Omniflo Weiche";"0000";"OFWeiche :16";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372210"} -95;"Omniflo Weiche";"0000";"OFWeiche :17";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372210"} -96;"Omniflo Weiche";"0000";"OFWeiche :18";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372210+0_BG080090"} -97;"Omniflo Weiche";"0000";"OFWeiche :19";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372210+0_BG080090"} -98;"Omniflo Weiche";"0000";"OFWeiche :20";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372215"} -99;"Omniflo Weiche";"0000";"OFWeiche :21";1;{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372216"} -100;"Omniflo Weiche";"0000";"OFWeiche :1";1;{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372400"} -101;"Omniflo Weiche";"0000";"OFWeiche :2";1;{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372403"} -102;"Omniflo Weiche";"0000";"OFWeiche :3";1;{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372404"} -103;"Omniflo Weiche";"0000";"OFWeiche :4";1;{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG071090+834372404+0_BG071090"} -104;"Omniflo Weiche";"0000";"OFWeiche :5";1;{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG071090+834372404"} -105;"Omniflo Weiche";"0000";"OFWeiche :6";1;{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372404+0_BG071090"} -106;"Omniflo Weiche";"0000";"OFWeiche :1";1;{"Weichentyp": "Deltaweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372401"} -107;"Omniflo Weiche";"0000";"OFWeiche :1";1;{"Weichentyp": "Sternweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372420"} -108;"Omniflo Sum";"autogenerated_of_json";"Omniflo sum";1;{"Anzahl Bögen": 27, "Anzahl Weichengrundkörper": 0, "Anzahl Einwegweichen": 30, "Anzahl Deltaweichen": 7, "Anzahl Doppelweichen und Dreiwegeweichen": 42, "Anzahl Sternweichen": 1, "Gesamtlänge AP110": 0.0, "Gesamtlänge AP60": 0.0} +Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Merkmale +1;"Omniflo Kurve";"0000";"OFBogen :1";"A/A";1;"";"";{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025"} +2;"Omniflo Kurve";"0000";"OFBogen :2";"A/A";1;"";"";{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025+0_B10090"} +3;"Omniflo Kurve";"0000";"OFBogen :3";"A/A";1;"";"";{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025+0_B10091"} +4;"Omniflo Kurve";"0000";"OFBogen :4";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104021"} +5;"Omniflo Kurve";"0000";"OFBogen :5";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104026"} +6;"Omniflo Kurve";"0000";"OFBogen :6";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104026+0_B10071"} +7;"Omniflo Kurve";"0000";"OFBogen :7";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104037"} +8;"Omniflo Kurve";"0000";"OFBogen :8";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104029"} +9;"Omniflo Kurve";"0000";"OFBogen :9";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031"} +10;"Omniflo Kurve";"0000";"OFBogen :10";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031+0_B10060"} +11;"Omniflo Kurve";"0000";"OFBogen :11";"B/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031+0_B10070"} +12;"Omniflo Kurve";"0000";"OFBogen :12";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104024"} +13;"Omniflo Kurve";"0000";"OFBogen :13";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104024+0_B10081"} +14;"Omniflo Kurve";"0000";"OFBogen :14";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104027"} +15;"Omniflo Kurve";"0000";"OFBogen :15";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104027+0_B10080"} +16;"Omniflo Kurve";"0000";"OFBogen :16";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104028"} +17;"Omniflo Kurve";"0000";"OFBogen :17";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104065"} +18;"Omniflo Kurve";"0000";"OFBogen :18";"B/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104022"} +19;"Omniflo Kurve";"0000";"OFBogen :19";"B/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 500.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104030"} +20;"Omniflo Kurve";"0000";"OFBogen :20";"B/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033"} +21;"Omniflo Kurve";"0000";"OFBogen :21";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033+0_B10040"} +22;"Omniflo Kurve";"0000";"OFBogen :22";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033+0_B10050"} +23;"Omniflo Kurve";"0000";"OFBogen :23";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104035"} +24;"Omniflo Kurve";"0000";"OFBogen :24";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104041"} +25;"Omniflo Kurve";"0000";"OFBogen :25";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104034"} +26;"Omniflo Kurve";"0000";"OFBogen :26";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104066"} +27;"Omniflo Kurve";"0000";"OFBogen :27";"C/A";1;"";"";{"Kurvenwinkel": 180.0, "Radius": 650.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104043"} +28;"Omniflo Weiche";"0000";"OFWeiche :1";"C/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342011"} +29;"Omniflo Weiche";"0000";"OFWeiche :2";"C/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342001"} +30;"Omniflo Weiche";"0000";"OFWeiche :3";"C/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342012"} +31;"Omniflo Weiche";"0000";"OFWeiche :4";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342002"} +32;"Omniflo Weiche";"0000";"OFWeiche :1";"D/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342100"} +33;"Omniflo Weiche";"0000";"OFWeiche :2";"D/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342101"} +34;"Omniflo Weiche";"0000";"OFWeiche :1";"D/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342200"} +35;"Omniflo Weiche";"0000";"OFWeiche :2";"D/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342201"} +36;"Omniflo Weiche";"0000";"OFWeiche :5";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372001"} +37;"Omniflo Weiche";"0000";"OFWeiche :6";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372002"} +38;"Omniflo Weiche";"0000";"OFWeiche :7";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372002+0_BG090090"} +39;"Omniflo Weiche";"0000";"OFWeiche :8";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372004"} +40;"Omniflo Weiche";"0000";"OFWeiche :9";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372005"} +41;"Omniflo Weiche";"0000";"OFWeiche :10";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372005+0_BG090090"} +42;"Omniflo Weiche";"0000";"OFWeiche :11";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372007"} +43;"Omniflo Weiche";"0000";"OFWeiche :12";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372008"} +44;"Omniflo Weiche";"0000";"OFWeiche :13";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372008+0_BG190090"} +45;"Omniflo Weiche";"0000";"OFWeiche :14";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372010"} +46;"Omniflo Weiche";"0000";"OFWeiche :15";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372011"} +47;"Omniflo Weiche";"0000";"OFWeiche :16";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372011+0_BG190090"} +48;"Omniflo Weiche";"0000";"OFWeiche :17";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372021"} +49;"Omniflo Weiche";"0000";"OFWeiche :18";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372022"} +50;"Omniflo Weiche";"0000";"OFWeiche :19";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372024"} +51;"Omniflo Weiche";"0000";"OFWeiche :20";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372025"} +52;"Omniflo Weiche";"0000";"OFWeiche :21";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372027"} +53;"Omniflo Weiche";"0000";"OFWeiche :22";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372028"} +54;"Omniflo Weiche";"0000";"OFWeiche :23";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372028+0_BG080090"} +55;"Omniflo Weiche";"0000";"OFWeiche :24";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372030"} +56;"Omniflo Weiche";"0000";"OFWeiche :25";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372031"} +57;"Omniflo Weiche";"0000";"OFWeiche :26";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372031+0_BG080090"} +58;"Omniflo Weiche";"0000";"OFWeiche :27";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372047"} +59;"Omniflo Weiche";"0000";"OFWeiche :28";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372048"} +60;"Omniflo Weiche";"0000";"OFWeiche :29";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372050"} +61;"Omniflo Weiche";"0000";"OFWeiche :30";"G/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372051"} +62;"Omniflo Weiche";"0000";"OFWeiche :3";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372100"} +63;"Omniflo Weiche";"0000";"OFWeiche :4";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372101"} +64;"Omniflo Weiche";"0000";"OFWeiche :5";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372101"} +65;"Omniflo Weiche";"0000";"OFWeiche :6";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372101+0_BG090090"} +66;"Omniflo Weiche";"0000";"OFWeiche :7";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372101+0_BG090090"} +67;"Omniflo Weiche";"0000";"OFWeiche :8";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372103"} +68;"Omniflo Weiche";"0000";"OFWeiche :9";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372104"} +69;"Omniflo Weiche";"0000";"OFWeiche :10";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372104"} +70;"Omniflo Weiche";"0000";"OFWeiche :11";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372104+0_BG190090"} +71;"Omniflo Weiche";"0000";"OFWeiche :12";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372104+0_BG190090"} +72;"Omniflo Weiche";"0000";"OFWeiche :13";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372106"} +73;"Omniflo Weiche";"0000";"OFWeiche :14";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372107"} +74;"Omniflo Weiche";"0000";"OFWeiche :15";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372109"} +75;"Omniflo Weiche";"0000";"OFWeiche :16";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372110"} +76;"Omniflo Weiche";"0000";"OFWeiche :17";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372110"} +77;"Omniflo Weiche";"0000";"OFWeiche :18";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372110+0_BG080090"} +78;"Omniflo Weiche";"0000";"OFWeiche :19";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372110+0_BG080090"} +79;"Omniflo Weiche";"0000";"OFWeiche :20";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372115"} +80;"Omniflo Weiche";"0000";"OFWeiche :21";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372116"} +81;"Omniflo Weiche";"0000";"OFWeiche :3";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372200"} +82;"Omniflo Weiche";"0000";"OFWeiche :4";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372201"} +83;"Omniflo Weiche";"0000";"OFWeiche :5";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372201"} +84;"Omniflo Weiche";"0000";"OFWeiche :6";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372201+0_BG090090"} +85;"Omniflo Weiche";"0000";"OFWeiche :7";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372201+0_BG090090"} +86;"Omniflo Weiche";"0000";"OFWeiche :8";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372203"} +87;"Omniflo Weiche";"0000";"OFWeiche :9";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372204"} +88;"Omniflo Weiche";"0000";"OFWeiche :10";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372204"} +89;"Omniflo Weiche";"0000";"OFWeiche :11";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372204+0_BG190090"} +90;"Omniflo Weiche";"0000";"OFWeiche :12";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372204+0_BG190090"} +91;"Omniflo Weiche";"0000";"OFWeiche :13";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372206"} +92;"Omniflo Weiche";"0000";"OFWeiche :14";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372207"} +93;"Omniflo Weiche";"0000";"OFWeiche :15";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372209"} +94;"Omniflo Weiche";"0000";"OFWeiche :16";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372210"} +95;"Omniflo Weiche";"0000";"OFWeiche :17";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372210"} +96;"Omniflo Weiche";"0000";"OFWeiche :18";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372210+0_BG080090"} +97;"Omniflo Weiche";"0000";"OFWeiche :19";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372210+0_BG080090"} +98;"Omniflo Weiche";"0000";"OFWeiche :20";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372215"} +99;"Omniflo Weiche";"0000";"OFWeiche :21";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372216"} +100;"Omniflo Weiche";"0000";"OFWeiche :1";"J/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372400"} +101;"Omniflo Weiche";"0000";"OFWeiche :2";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372403"} +102;"Omniflo Weiche";"0000";"OFWeiche :3";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372404"} +103;"Omniflo Weiche";"0000";"OFWeiche :4";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG071090+834372404+0_BG071090"} +104;"Omniflo Weiche";"0000";"OFWeiche :5";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG071090+834372404"} +105;"Omniflo Weiche";"0000";"OFWeiche :6";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372404+0_BG071090"} +106;"Omniflo Weiche";"0000";"OFWeiche :1";"K/A";1;"";"";{"Weichentyp": "Deltaweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372401"} +107;"Omniflo Weiche";"0000";"OFWeiche :1";"K/A";1;"";"";{"Weichentyp": "Sternweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372420"} +108;"Omniflo Sum";"autogenerated_of_json";"Omniflo sum";"";1;"";"";{"Anzahl Bögen": 27, "Anzahl Weichengrundkörper": 0, "Anzahl Einwegweichen": 30, "Anzahl Deltaweichen": 7, "Anzahl Doppelweichen und Dreiwegeweichen": 42, "Anzahl Sternweichen": 1, "Gesamtlänge AP110": 0.0, "Gesamtlänge AP60": 0.0} diff --git a/tests/test_foerderer.py b/tests/test_foerderer.py index 7515323..9d228c0 100644 --- a/tests/test_foerderer.py +++ b/tests/test_foerderer.py @@ -202,8 +202,8 @@ class TestFoerdererExportCSV: def test_header_felder(self): """CSV-Header muss korrekte Spaltenbezeichnungen haben.""" - expected = ["Elementnummer", "TeileArt", "TeileId", - "Bezeichnung", "Anzahl", "Merkmale"] + expected = ["Elementnummer", "TeileArt", "TeileId", "Bezeichnung", + "Planquadrat", "Anzahl", "Position", "Boundingbox", "Merkmale"] for i, name in enumerate(expected): assert self.header[i] == name, ( f"Header[{i}]: erwartet '{name}', ist '{self.header[i]}'" @@ -226,19 +226,19 @@ class TestFoerdererExportCSV: def test_anzahl_spalte_ist_eins(self): """Anzahl-Spalte muss fuer alle Zeilen '1' sein.""" for i, row in enumerate(self.rows): - if len(row) < 5: + if len(row) < 6: continue - assert row[4] == "1", ( - f"Zeile {i + 2}: Anzahl={row[4]}, erwartet 1" + assert row[5] == "1", ( + f"Zeile {i + 2}: Anzahl={row[5]}, erwartet 1" ) def test_merkmale_sind_valides_json(self): """Merkmale-Spalte muss valides JSON enthalten.""" for i, row in enumerate(self.rows): - if len(row) < 6: + if len(row) < 9: continue try: - json.loads(row[5]) + json.loads(row[8]) except json.JSONDecodeError as e: pytest.fail(f"Zeile {i + 2}: Merkmale ist kein valides JSON: {e}") @@ -247,9 +247,9 @@ class TestFoerdererExportCSV: required = {"Typ", "Winkel", "DeltaH_mm", "DeltaL_mm", "L_VF_m", "Hoehe_Von_mm", "Hoehe_Bis_mm"} for i, row in enumerate(self.rows): - if len(row) < 6: + if len(row) < 9: continue - merkmale = json.loads(row[5]) + merkmale = json.loads(row[8]) missing = required - set(merkmale.keys()) assert not missing, ( f"Zeile {i + 2}: Fehlende Merkmale-Felder: {missing}" diff --git a/tests/test_omniflo.py b/tests/test_omniflo.py index 2816277..d1b32bb 100644 --- a/tests/test_omniflo.py +++ b/tests/test_omniflo.py @@ -107,7 +107,7 @@ class TestOmnifloExportUnit: out_dir = _output_dir() os.makedirs(out_dir, exist_ok=True) csv_path = os.path.join(out_dir, "omniflo_export.csv") - header = "Elementnummer;TeileArt;TeileId;Bezeichnung;Anzahl;Merkmale" + header = "Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Merkmale" with open(csv_path, "w", encoding="utf-8") as f: f.write(header + "\n") for item in self.items: @@ -333,7 +333,7 @@ def _reference_dir(): def _normalize_row(line): """Splittet eine CSV-Zeile und ersetzt die TeileId (UUID) durch Platzhalter.""" - cols = line.strip().split(";", 5) + cols = line.strip().split(";", 8) if len(cols) >= 3: cols[2] = "" return cols From 57badf05562f214bb4feb8df8b39d53298d54601 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Wed, 22 Jul 2026 13:01:24 +0200 Subject: [PATCH 3/4] Sivas-Export: Spalte Hoehe[m] entfernt Die Hoehe-Angabe steht bereits pro Element in der details-JSON-Spalte (z.B. "Hoehe in m" aus dem MONTAGEHOEHE_m-Attribut bei VarioFoerderer/ Linienzug), die separate Top-Level-Spalte war redundant. --- lib/export_sivas.py | 44 +++++++---------------------------------- tests/test_foerderer.py | 2 +- 2 files changed, 8 insertions(+), 38 deletions(-) diff --git a/lib/export_sivas.py b/lib/export_sivas.py index 95ef94f..acadcb1 100644 --- a/lib/export_sivas.py +++ b/lib/export_sivas.py @@ -4,7 +4,7 @@ export_sivas.py - Erzeugt Sivas-Export-CSV mit gruppierten Zeilen und Summierungszeilen. Neues CSV-Format: - Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];Hoehe[m];IDs;details + Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];IDs;details - Bezeichnung: Wert des Attributs "Bezeichnung" (Kreisel/Eckrad/VF/GF/Strecke). Bei gruppierten Zeilen (mehrere Bloecke je Zeile) kommasepariert. @@ -80,13 +80,6 @@ def classify_weiche(eintrag): return "einzelweiche" -def get_hoehe_mm(block): - """Liest HOEHE aus Block-Attributen. Fallback: Z-Koordinate.""" - attribs = block.get("attribs", {}) - v = attribs.get("HOEHE") or str(int(block.get("z", 0) or 0)) or "2000" - return v - - def get_id(block): """Liest das eindeutige ID-Attribut eines Blocks (von ssg-id-check-all vergeben).""" return block.get("attribs", {}).get("ID", "") @@ -101,17 +94,6 @@ def format_sivasnr(sivasnr): return ", ".join(p.strip() for p in str(sivasnr).split("+") if p.strip()) -def format_hoehe_m(hoehe_mm_str): - """Konvertiert mm-String nach m mit deutschem Dezimaltrennzeichen.""" - try: - m = float(hoehe_mm_str) / 1000.0 - if m == int(m): - return str(int(m)) - return f"{m:.1f}".replace(".", ",") - except (ValueError, TypeError): - return "" - - def build_gefaellestrecke_details(block): """Merkmale-Dict fuer eine einzelne ILS Gefaellestrecke (GF_N-Block).""" attribs = block.get("attribs", {}) @@ -286,10 +268,10 @@ def process_blocks(blocks, lookup): items - Liste der CSV-Zeilen als Dicts counters - Zaehler fuer ILS-Automation-Summierungszeile """ - # Gruppen: sivasnr_str -> {anzahl, hoehe_mm, ids} + # Gruppen: sivasnr_str -> {anzahl, ids} bogen_groups = {} # sivasnr -> dict weiche_groups = {} # sivasnr -> dict - # Gerade: artinr_str -> {anzahl, laenge_mm_total, hoehe_mm, ids} + # Gerade: artinr_str -> {anzahl, laenge_mm_total, ids} gerade_groups = {} kreisel_list = [] # Liste von blocks eckrad_ids = [] # IDs aller Eckrad-Bloecke @@ -340,18 +322,17 @@ def process_blocks(blocks, lookup): if bname in lookup: typ, eintrag = lookup[bname] sivasnr = format_sivasnr(eintrag.get("Sivasnr", bname)) - hoehe = get_hoehe_mm(block) if typ == "bogen": if sivasnr not in bogen_groups: - bogen_groups[sivasnr] = {"anzahl": 0, "hoehe_mm": hoehe, "ids": []} + bogen_groups[sivasnr] = {"anzahl": 0, "ids": []} bogen_groups[sivasnr]["anzahl"] += 1 bogen_groups[sivasnr]["ids"].append(get_id(block)) counters["anzahl_boegen"] += 1 elif typ == "weiche": if sivasnr not in weiche_groups: - weiche_groups[sivasnr] = {"anzahl": 0, "hoehe_mm": hoehe, "ids": []} + weiche_groups[sivasnr] = {"anzahl": 0, "ids": []} weiche_groups[sivasnr]["anzahl"] += 1 weiche_groups[sivasnr]["ids"].append(get_id(block)) subtyp = classify_weiche(eintrag) @@ -372,7 +353,6 @@ def process_blocks(blocks, lookup): attribs = block.get("attribs", {}) artinr = attribs.get("ARTINR", "") key = artinr if artinr else "AP110" - hoehe = get_hoehe_mm(block) laenge = 2000.0 laenge_attr = attribs.get("LAENGE") or attribs.get("A") if laenge_attr: @@ -382,7 +362,7 @@ def process_blocks(blocks, lookup): pass if key not in gerade_groups: gerade_groups[key] = { - "anzahl": 0, "laenge_mm": 0.0, "hoehe_mm": hoehe, + "anzahl": 0, "laenge_mm": 0.0, "artinr": artinr, "ids": [], } gerade_groups[key]["anzahl"] += 1 @@ -484,7 +464,6 @@ def process_blocks(blocks, lookup): "dispgruppe": 10, "anzahl": g["anzahl"], "laenge_mm": "", - "hoehe_m": format_hoehe_m(g["hoehe_mm"]), "ids": g["ids"], "details": {}, }) @@ -500,7 +479,6 @@ def process_blocks(blocks, lookup): "dispgruppe": 10, "anzahl": g["anzahl"], "laenge_mm": "", - "hoehe_m": format_hoehe_m(g["hoehe_mm"]), "ids": g["ids"], "details": {}, }) @@ -516,7 +494,6 @@ def process_blocks(blocks, lookup): "dispgruppe": 10, "anzahl": g["anzahl"], "laenge_mm": int(g["laenge_mm"]), - "hoehe_m": format_hoehe_m(g["hoehe_mm"]), "ids": g["ids"], "details": {}, }) @@ -544,7 +521,6 @@ def process_blocks(blocks, lookup): "dispgruppe": 20, "anzahl": len(group["ids"]), "laenge_mm": "", - "hoehe_m": "", "ids": group["ids"], "details": build_kreisel_details(group["block"]), }) @@ -561,7 +537,6 @@ def process_blocks(blocks, lookup): "dispgruppe": 20, "anzahl": counters["anzahl_eckraeder"], "laenge_mm": "", - "hoehe_m": "", "ids": eckrad_ids, "details": {}, }) @@ -581,7 +556,6 @@ def process_blocks(blocks, lookup): "dispgruppe": 20, "anzahl": len(strecke_ids), "laenge_mm": "", - "hoehe_m": "", "ids": strecke_ids, "details": {}, }) @@ -600,7 +574,6 @@ def process_blocks(blocks, lookup): "dispgruppe": 20, "anzahl": 1, "laenge_mm": "", - "hoehe_m": "", "ids": [get_id(block)], "details": build_variofoerderer_details(block), }) @@ -629,7 +602,6 @@ def process_blocks(blocks, lookup): "dispgruppe": 20, "anzahl": len(group["ids"]), "laenge_mm": "", - "hoehe_m": "", "ids": group["ids"], "details": details, }) @@ -673,7 +645,6 @@ def process_blocks(blocks, lookup): "dispgruppe": 20, "anzahl": 1, "laenge_mm": "", - "hoehe_m": "", "details": automation_details, }) @@ -693,7 +664,6 @@ def format_csv_line(item): f';{item["dispgruppe"]}' f';{item["anzahl"]}' f';{item["laenge_mm"]}' - f';{item["hoehe_m"]}' f';"{ids_str}"' f';{details_json}' ) @@ -722,7 +692,7 @@ def main(): items, _ = process_blocks(blocks, lookup) - header = "Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];Hoehe[m];IDs;details" + header = "Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];IDs;details" with open(output_csv, "w", encoding="utf-8") as f: f.write(header + "\n") for item in items: diff --git a/tests/test_foerderer.py b/tests/test_foerderer.py index 9d228c0..422ce8f 100644 --- a/tests/test_foerderer.py +++ b/tests/test_foerderer.py @@ -290,7 +290,7 @@ class TestFoerdererExportSivas: def test_header_felder(self): """Sivas-CSV-Header muss korrekte Spalten haben.""" expected = ["Nr", "TeileArt", "SivasNummer", "Bezeichnung", - "Dispogruppe", "Anzahl", "Laenge[mm]", "Hoehe[m]", "details"] + "Dispogruppe", "Anzahl", "Laenge[mm]", "details"] for i, name in enumerate(expected): assert self.header[i] == name, ( f"Header[{i}]: erwartet '{name}', ist '{self.header[i]}'" From 6ab698286f88c95e9ad64e684b4b5e45a8496012 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Wed, 22 Jul 2026 15:26:30 +0200 Subject: [PATCH 4/4] CSV-Export: Nachbarschaftserkennung ueber Bounding-Box-Ueberschneidung (STRtree/shapely) Neue Spalte "Nachbarn" (kommaseparierte TeileId-Liste) in export_csv.py: zwei Elemente gelten als benachbart, wenn ihre Bounding-Boxes (x/y-Ebene) sich ueberschneiden. Toleranz konfigurierbar in mm ueber cfg/export.cfg [Nachbarschaft] -> toleranz_mm, siehe lib/export_neighbors.py. Nur EXPORTCSV betroffen, EXPORTSIVAS bleibt unveraendert. shapely als neue Abhaengigkeit in requirements.txt ergaenzt. Co-Authored-By: Claude Sonnet 5 --- bin/run_tests.bat | 91 +++++++- bin/setenv.bat | 13 ++ cfg/export.cfg | 10 +- lib/export_csv.py | 23 +- lib/export_neighbors.py | 72 ++++++ requirements.txt | 1 + tests/reference/omniflo_export_reference.csv | 218 +++++++++---------- tests/test_foerderer.py | 10 +- tests/test_omniflo.py | 4 +- 9 files changed, 315 insertions(+), 127 deletions(-) create mode 100644 lib/export_neighbors.py diff --git a/bin/run_tests.bat b/bin/run_tests.bat index faa7740..7ffed5b 100644 --- a/bin/run_tests.bat +++ b/bin/run_tests.bat @@ -1,14 +1,19 @@ @echo off +setlocal EnableDelayedExpansion REM ================================================================ REM run_tests.bat - Testausfuehrung fuer SSG_LIB REM REM Schalter: -REM --check Fuehrt pytest-Validierung aus -REM (ohne) Zeigt Hilfe an +REM --check Fuehrt pytest-Validierung aus +REM --diff_references Vergleicht CSVs in tests\reference und tests\output, +REM ruft bei Unterschieden das Diff-Tool (meld) auf +REM (ohne) Zeigt Hilfe an REM REM Beispiele: REM bin\run_tests.bat --check REM bin\run_tests.bat --check test_kreisel.py +REM bin\run_tests.bat --diff_references +REM bin\run_tests.bat --diff_references kreisel_tests_export.csv REM ================================================================ REM Umgebung setzen @@ -23,6 +28,8 @@ if exist "%DXFMAKRO%\.venv\Scripts\activate.bat" ( set DO_CHECK=0 set CHECK_ARG= +set DO_DIFF=0 +set DIFF_ARG= REM Argumente parsen :parse_args @@ -36,11 +43,20 @@ if "%~1"=="--check" ( shift goto :parse_args ) +if "%~1"=="--diff_references" ( + set DO_DIFF=1 + if not "%~2"=="" ( + set "DIFF_ARG=%~2" + shift + ) + shift + goto :parse_args +) echo Unbekannter Schalter: %~1 goto :show_help :after_args -if %DO_CHECK%==0 goto :show_help +if %DO_CHECK%==0 if %DO_DIFF%==0 goto :show_help REM ================================================================ REM --check: pytest-Validierung @@ -79,18 +95,83 @@ if %DO_CHECK%==1 ( echo ================================================================ ) +REM ================================================================ +REM --diff_references: CSV-Referenzvergleich +REM ================================================================ +if %DO_DIFF%==1 ( + echo. + echo ================================================================ + echo REFERENZVERGLEICH ^(--diff_references^) + echo ================================================================ + + if not defined DXFM_DIFFTOOL ( + echo. + echo FEHLER: Kein Diff-Tool ^(meld^) gefunden - siehe setenv.bat. + echo meld installieren: https://meldmerge.org + exit /b 1 + ) + + set DIFF_COUNT=0 + + if not "%DIFF_ARG%"=="" ( + if not exist "%DXFM_TESTREF%\%DIFF_ARG%" ( + echo FEHLER: Referenzdatei nicht gefunden: %DXFM_TESTREF%\%DIFF_ARG% + exit /b 1 + ) + call :diff_one "%DXFM_TESTREF%\%DIFF_ARG%" + ) else ( + for %%F in ("%DXFM_TESTREF%\*.csv") do call :diff_one "%%F" + ) + + echo. + if !DIFF_COUNT!==0 ( + echo ================================================================ + echo ERGEBNIS: KEINE UNTERSCHIEDE GEFUNDEN + echo ================================================================ + ) else ( + echo ================================================================ + echo ERGEBNIS: !DIFF_COUNT! DATEI^(EN^) MIT UNTERSCHIEDEN + echo ================================================================ + ) +) + exit /b 0 +REM ---------------------------------------------------------------- +REM :diff_one +REM Vergleicht eine Referenzdatei mit der gleichnamigen Output-Datei +REM und ruft bei Unterschieden das Diff-Tool auf. +REM ---------------------------------------------------------------- +:diff_one +set "REF_FILE=%~1" +set "OUT_FILE=%DXFM_TESTOUT%\%~nx1" +if not exist "%OUT_FILE%" ( + echo WARNUNG: Keine Output-Datei fuer %~nx1 gefunden - uebersprungen. + goto :eof +) +fc "%REF_FILE%" "%OUT_FILE%" >nul 2>nul +if errorlevel 1 ( + set /a DIFF_COUNT+=1 + echo Unterschied: %~nx1 + "%DXFM_DIFFTOOL%" "%REF_FILE%" "%OUT_FILE%" +) +goto :eof + :show_help echo. echo Aufruf: bin\run_tests.bat --check [testdatei] +echo bin\run_tests.bat --diff_references [csv-datei] echo. echo Schalter: -echo --check Fuehrt pytest-Validierung fuer alle Module aus -echo --check test_kreisel.py Validiert nur Kreisel-Tests +echo --check Fuehrt pytest-Validierung fuer alle Module aus +echo --check test_kreisel.py Validiert nur Kreisel-Tests +echo --diff_references Vergleicht alle CSVs in tests\reference/output, +echo ruft bei Unterschieden meld auf +echo --diff_references datei.csv Vergleicht nur die angegebene CSV-Datei echo. echo Workflow: echo 1. In BricsCAD: SSG_RUN_ALL_TESTS ausfuehren echo 2. bin\run_tests.bat --check +echo 3. bin\run_tests.bat --diff_references echo. exit /b 1 diff --git a/bin/setenv.bat b/bin/setenv.bat index 243ae14..6551c91 100644 --- a/bin/setenv.bat +++ b/bin/setenv.bat @@ -41,6 +41,18 @@ if exist "C:\Program Files\Bricsys\BricsCAD V25 de_DE\bricscad.exe" ( echo Keine BricsCAD-Installation gefunden. ) +REM Diff-Tool fuer Referenzvergleich (run_tests.bat --diff_references) ermitteln +set "DXFM_DIFFTOOL=" +for /f "delims=" %%D in ('where meld 2^>nul') do ( + if not defined DXFM_DIFFTOOL set "DXFM_DIFFTOOL=%%D" +) +if not defined DXFM_DIFFTOOL ( + if exist "C:\Program Files\Meld\Meld.exe" set "DXFM_DIFFTOOL=C:\Program Files\Meld\Meld.exe" +) +if not defined DXFM_DIFFTOOL ( + echo HINWEIS: Kein Diff-Tool ^(meld^) gefunden - run_tests.bat --diff_references steht nicht zur Verfuegung. +) + REM Ueberladen von Umgebungsvariablen durch _setenv.bat (z.B. DXFM_DIM=3D) if exist "%~dp0_setenv.bat" ( echo Lade lokale Umgebungseinstellungen aus _setenv.bat... @@ -95,6 +107,7 @@ echo DXFMAKRO = %DXFMAKRO% echo DXFM_DIM = %DXFM_DIM% echo DXFM_BLOCKS = %DXFM_BLOCKS% echo DXFM_OMNIFLO = %DXFM_OMNIFLO% +echo DXFM_DIFFTOOL = %DXFM_DIFFTOOL% echo ================================================================ echo. diff --git a/cfg/export.cfg b/cfg/export.cfg index 56ec74e..6e187c4 100644 --- a/cfg/export.cfg +++ b/cfg/export.cfg @@ -56,4 +56,12 @@ x_step=2 x_description=numerisch # Zahlen, von links nach rechts, 2m pro Spalte y_step=4 y_description=numerisch # Zahlen von unten nach oben, 4m pro Zeile -format= {x}/{y} \ No newline at end of file +format= {x}/{y} + +[Nachbarschaft] +# Toleranz fuer die Nachbarschaftserkennung beim CSV-Export (Spalte "Nachbarn"). +# Die Bounding-Box jedes Elements wird um die Haelfte dieses Werts nach allen +# Seiten erweitert, bevor per STRtree (shapely) auf Ueberschneidung mit anderen +# Elementen geprueft wird - zwei Elemente mit einem Abstand <= toleranz_mm +# (z.B. zwei Kreisel) gelten dann ebenfalls als benachbart. Wert in mm. +toleranz_mm=200 \ No newline at end of file diff --git a/lib/export_csv.py b/lib/export_csv.py index aac7040..7e296d8 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -11,7 +11,7 @@ Aufruf: python export_csv.py CSV-Format: - Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Merkmale + Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Nachbarn;Merkmale Position und Boundingbox stammen aus der von export.lsp (csv:get-bbox, per vla-getboundingbox) ermittelten Bounding-Box je Block: @@ -19,8 +19,11 @@ vla-getboundingbox) ermittelten Bounding-Box je Block: Boundingbox = Ausdehnung (Laenge, Breite, Hoehe) in x, y, z Planquadrat wird aus der x/y-Koordinate des Blocks berechnet, siehe export_planquadrat.py ([Planquadrate] in cfg/export.cfg). -Position, Boundingbox und Planquadrat sind nur fuer EXPORTCSV vorhanden -(nicht EXPORTSIVAS) - siehe csv:run-export. +Nachbarn = kommaseparierte TeileId-Liste ueberschneidender Elemente (Bounding- +Box-Ueberschneidung in der x/y-Ebene per shapely-STRtree, Toleranz konfigurierbar +ueber [Nachbarschaft] -> toleranz_mm in cfg/export.cfg), siehe export_neighbors.py. +Position, Boundingbox, Planquadrat und Nachbarn sind nur fuer EXPORTCSV +vorhanden (nicht EXPORTSIVAS) - siehe csv:run-export. """ import json @@ -29,9 +32,11 @@ import os from export_blockpatterns import load_patterns, matches_any from export_planquadrat import load_planquadrat_config, compute_planquadrat +from export_neighbors import load_neighbor_tolerance_mm, compute_neighbor_ids BLOCKPATTERNS = load_patterns() PLANQUADRAT_CFG = load_planquadrat_config() +NEIGHBOR_TOLERANCE_MM = load_neighbor_tolerance_mm() # --------------------------------------------------------------------------- @@ -240,13 +245,16 @@ def bbox_columns(block): Rueckgabe: dict mit "position" (Mittenkoordinate x,y,z) und "boundingbox" (Ausdehnung x,y,z) als Strings, oder leere Strings falls kein bbox-Feld vorhanden ist (z.B. EXPORTSIVAS oder die synthetische Omniflo-Sum-Zeile). + "_bbox" enthaelt zusaetzlich die rohen Zahlenwerte fuer die Nachbarschafts- + erkennung (siehe export_neighbors.py), wird nicht in die CSV geschrieben. """ bbox = block.get("bbox") if not bbox: - return {"position": "", "boundingbox": ""} + return {"position": "", "boundingbox": "", "_bbox": None} return { "position": f'{bbox.get("cx", 0):.2f}, {bbox.get("cy", 0):.2f}, {bbox.get("cz", 0):.2f}', "boundingbox": f'{bbox.get("dx", 0):.2f}, {bbox.get("dy", 0):.2f}, {bbox.get("dz", 0):.2f}', + "_bbox": bbox, } @@ -452,6 +460,10 @@ def process_blocks(blocks, lookup): "boundingbox": "", }) + neighbor_ids = compute_neighbor_ids(items, NEIGHBOR_TOLERANCE_MM) + for item, nachbarn in zip(items, neighbor_ids): + item["nachbarn"] = nachbarn + return items @@ -470,6 +482,7 @@ def format_csv_line(item): f';1' f';"{item["position"]}"' f';"{item["boundingbox"]}"' + f';"{item["nachbarn"]}"' f';{merkmale_json}' ) @@ -501,7 +514,7 @@ def main(): items = process_blocks(blocks, lookup) - header = "Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Merkmale" + header = "Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Nachbarn;Merkmale" with open(output_csv, "w", encoding="utf-8") as f: f.write(header + "\n") for item in items: diff --git a/lib/export_neighbors.py b/lib/export_neighbors.py new file mode 100644 index 0000000..98117aa --- /dev/null +++ b/lib/export_neighbors.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +export_neighbors.py - Ermittelt benachbarte Elemente ueber die Bounding-Box (STRtree). + +Zwei Elemente gelten als benachbart, wenn ihre Bounding-Boxes sich in der +x/y-Ebene (Grundriss, Z/Hoehe wird ignoriert) ueberschneiden. Um auch nah +beieinander liegende, aber nicht direkt beruehrende Elemente (z.B. Kreisel) +als benachbart zu erkennen, wird jede Bounding-Box vor der Pruefung um die +Haelfte der konfigurierten Toleranz nach allen Seiten erweitert - zwei +Elemente mit einem Abstand <= toleranz_mm gelten dann ebenfalls als +benachbart. Die Toleranz wird aus cfg/export.cfg ([Nachbarschaft] -> +toleranz_mm) gelesen. + +Nur von export_csv.py genutzt (EXPORTCSV), nicht von export_sivas.py. +""" + +import configparser + +from shapely.geometry import box +from shapely.strtree import STRtree + +from export_blockpatterns import cfg_path_from_env + + +def load_neighbor_tolerance_mm(cfg_path=None): + """Liest die Nachbarschafts-Toleranz (mm) aus export.cfg. Default: 0.""" + if cfg_path is None: + cfg_path = cfg_path_from_env() + parser = configparser.ConfigParser(inline_comment_prefixes=("#",)) + parser.read(cfg_path, encoding="utf-8") + return parser.getfloat("Nachbarschaft", "toleranz_mm", fallback=0.0) + + +def compute_neighbor_ids(items, tolerance_mm): + """Ermittelt je Item die IDs (item["teileid"]) ueberschneidender Nachbarn. + + items = Liste von dict mit "teileid" und optional "_bbox" + ({"cx","cy","dx","dy",...}, siehe export.lsp csv:get-bbox / export_csv.py + bbox_columns). Items ohne _bbox (z.B. die synthetische Omniflo-Sum-Zeile) + haben keine Nachbarn. + + Rueckgabe: Liste von kommaseparierten Nachbar-ID-Strings, positionsgleich + zu items (nicht ueber die ID dedupliziert, da TeileId nicht zwingend + eindeutig ist). + """ + idx_with_bbox = [i for i, it in enumerate(items) if it.get("_bbox")] + result = [""] * len(items) + if len(idx_with_bbox) < 2: + return result + + half_tol = tolerance_mm / 2.0 + geoms = [] + for i in idx_with_bbox: + bb = items[i]["_bbox"] + minx = bb["cx"] - bb["dx"] / 2.0 - half_tol + maxx = bb["cx"] + bb["dx"] / 2.0 + half_tol + miny = bb["cy"] - bb["dy"] / 2.0 - half_tol + maxy = bb["cy"] + bb["dy"] / 2.0 + half_tol + geoms.append(box(minx, miny, maxx, maxy)) + + tree = STRtree(geoms) + for local_i, global_i in enumerate(idx_with_bbox): + hits = tree.query(geoms[local_i], predicate="intersects") + neighbor_ids = [ + items[idx_with_bbox[int(local_j)]]["teileid"] + for local_j in hits + if int(local_j) != local_i + ] + result[global_i] = ", ".join(neighbor_ids) + + return result diff --git a/requirements.txt b/requirements.txt index 59150b5..a34eb0c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ ezdxf==1.4.1 pytest==9.0.2 +shapely==2.1.2 diff --git a/tests/reference/omniflo_export_reference.csv b/tests/reference/omniflo_export_reference.csv index 14c7f54..35988b3 100644 --- a/tests/reference/omniflo_export_reference.csv +++ b/tests/reference/omniflo_export_reference.csv @@ -1,109 +1,109 @@ -Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Merkmale -1;"Omniflo Kurve";"0000";"OFBogen :1";"A/A";1;"";"";{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025"} -2;"Omniflo Kurve";"0000";"OFBogen :2";"A/A";1;"";"";{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025+0_B10090"} -3;"Omniflo Kurve";"0000";"OFBogen :3";"A/A";1;"";"";{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025+0_B10091"} -4;"Omniflo Kurve";"0000";"OFBogen :4";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104021"} -5;"Omniflo Kurve";"0000";"OFBogen :5";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104026"} -6;"Omniflo Kurve";"0000";"OFBogen :6";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104026+0_B10071"} -7;"Omniflo Kurve";"0000";"OFBogen :7";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104037"} -8;"Omniflo Kurve";"0000";"OFBogen :8";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104029"} -9;"Omniflo Kurve";"0000";"OFBogen :9";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031"} -10;"Omniflo Kurve";"0000";"OFBogen :10";"A/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031+0_B10060"} -11;"Omniflo Kurve";"0000";"OFBogen :11";"B/A";1;"";"";{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031+0_B10070"} -12;"Omniflo Kurve";"0000";"OFBogen :12";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104024"} -13;"Omniflo Kurve";"0000";"OFBogen :13";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104024+0_B10081"} -14;"Omniflo Kurve";"0000";"OFBogen :14";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104027"} -15;"Omniflo Kurve";"0000";"OFBogen :15";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104027+0_B10080"} -16;"Omniflo Kurve";"0000";"OFBogen :16";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104028"} -17;"Omniflo Kurve";"0000";"OFBogen :17";"B/A";1;"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104065"} -18;"Omniflo Kurve";"0000";"OFBogen :18";"B/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104022"} -19;"Omniflo Kurve";"0000";"OFBogen :19";"B/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 500.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104030"} -20;"Omniflo Kurve";"0000";"OFBogen :20";"B/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033"} -21;"Omniflo Kurve";"0000";"OFBogen :21";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033+0_B10040"} -22;"Omniflo Kurve";"0000";"OFBogen :22";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033+0_B10050"} -23;"Omniflo Kurve";"0000";"OFBogen :23";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104035"} -24;"Omniflo Kurve";"0000";"OFBogen :24";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104041"} -25;"Omniflo Kurve";"0000";"OFBogen :25";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104034"} -26;"Omniflo Kurve";"0000";"OFBogen :26";"C/A";1;"";"";{"Kurvenwinkel": 90.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104066"} -27;"Omniflo Kurve";"0000";"OFBogen :27";"C/A";1;"";"";{"Kurvenwinkel": 180.0, "Radius": 650.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104043"} -28;"Omniflo Weiche";"0000";"OFWeiche :1";"C/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342011"} -29;"Omniflo Weiche";"0000";"OFWeiche :2";"C/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342001"} -30;"Omniflo Weiche";"0000";"OFWeiche :3";"C/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342012"} -31;"Omniflo Weiche";"0000";"OFWeiche :4";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342002"} -32;"Omniflo Weiche";"0000";"OFWeiche :1";"D/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342100"} -33;"Omniflo Weiche";"0000";"OFWeiche :2";"D/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342101"} -34;"Omniflo Weiche";"0000";"OFWeiche :1";"D/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342200"} -35;"Omniflo Weiche";"0000";"OFWeiche :2";"D/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342201"} -36;"Omniflo Weiche";"0000";"OFWeiche :5";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372001"} -37;"Omniflo Weiche";"0000";"OFWeiche :6";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372002"} -38;"Omniflo Weiche";"0000";"OFWeiche :7";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372002+0_BG090090"} -39;"Omniflo Weiche";"0000";"OFWeiche :8";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372004"} -40;"Omniflo Weiche";"0000";"OFWeiche :9";"D/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372005"} -41;"Omniflo Weiche";"0000";"OFWeiche :10";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372005+0_BG090090"} -42;"Omniflo Weiche";"0000";"OFWeiche :11";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372007"} -43;"Omniflo Weiche";"0000";"OFWeiche :12";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372008"} -44;"Omniflo Weiche";"0000";"OFWeiche :13";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372008+0_BG190090"} -45;"Omniflo Weiche";"0000";"OFWeiche :14";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372010"} -46;"Omniflo Weiche";"0000";"OFWeiche :15";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372011"} -47;"Omniflo Weiche";"0000";"OFWeiche :16";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372011+0_BG190090"} -48;"Omniflo Weiche";"0000";"OFWeiche :17";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372021"} -49;"Omniflo Weiche";"0000";"OFWeiche :18";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372022"} -50;"Omniflo Weiche";"0000";"OFWeiche :19";"E/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372024"} -51;"Omniflo Weiche";"0000";"OFWeiche :20";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372025"} -52;"Omniflo Weiche";"0000";"OFWeiche :21";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372027"} -53;"Omniflo Weiche";"0000";"OFWeiche :22";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372028"} -54;"Omniflo Weiche";"0000";"OFWeiche :23";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372028+0_BG080090"} -55;"Omniflo Weiche";"0000";"OFWeiche :24";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372030"} -56;"Omniflo Weiche";"0000";"OFWeiche :25";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372031"} -57;"Omniflo Weiche";"0000";"OFWeiche :26";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372031+0_BG080090"} -58;"Omniflo Weiche";"0000";"OFWeiche :27";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372047"} -59;"Omniflo Weiche";"0000";"OFWeiche :28";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372048"} -60;"Omniflo Weiche";"0000";"OFWeiche :29";"F/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372050"} -61;"Omniflo Weiche";"0000";"OFWeiche :30";"G/A";1;"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372051"} -62;"Omniflo Weiche";"0000";"OFWeiche :3";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372100"} -63;"Omniflo Weiche";"0000";"OFWeiche :4";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372101"} -64;"Omniflo Weiche";"0000";"OFWeiche :5";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372101"} -65;"Omniflo Weiche";"0000";"OFWeiche :6";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372101+0_BG090090"} -66;"Omniflo Weiche";"0000";"OFWeiche :7";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372101+0_BG090090"} -67;"Omniflo Weiche";"0000";"OFWeiche :8";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372103"} -68;"Omniflo Weiche";"0000";"OFWeiche :9";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372104"} -69;"Omniflo Weiche";"0000";"OFWeiche :10";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372104"} -70;"Omniflo Weiche";"0000";"OFWeiche :11";"G/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372104+0_BG190090"} -71;"Omniflo Weiche";"0000";"OFWeiche :12";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372104+0_BG190090"} -72;"Omniflo Weiche";"0000";"OFWeiche :13";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372106"} -73;"Omniflo Weiche";"0000";"OFWeiche :14";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372107"} -74;"Omniflo Weiche";"0000";"OFWeiche :15";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372109"} -75;"Omniflo Weiche";"0000";"OFWeiche :16";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372110"} -76;"Omniflo Weiche";"0000";"OFWeiche :17";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372110"} -77;"Omniflo Weiche";"0000";"OFWeiche :18";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372110+0_BG080090"} -78;"Omniflo Weiche";"0000";"OFWeiche :19";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372110+0_BG080090"} -79;"Omniflo Weiche";"0000";"OFWeiche :20";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372115"} -80;"Omniflo Weiche";"0000";"OFWeiche :21";"H/A";1;"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372116"} -81;"Omniflo Weiche";"0000";"OFWeiche :3";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372200"} -82;"Omniflo Weiche";"0000";"OFWeiche :4";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372201"} -83;"Omniflo Weiche";"0000";"OFWeiche :5";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372201"} -84;"Omniflo Weiche";"0000";"OFWeiche :6";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372201+0_BG090090"} -85;"Omniflo Weiche";"0000";"OFWeiche :7";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372201+0_BG090090"} -86;"Omniflo Weiche";"0000";"OFWeiche :8";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372203"} -87;"Omniflo Weiche";"0000";"OFWeiche :9";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372204"} -88;"Omniflo Weiche";"0000";"OFWeiche :10";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372204"} -89;"Omniflo Weiche";"0000";"OFWeiche :11";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372204+0_BG190090"} -90;"Omniflo Weiche";"0000";"OFWeiche :12";"I/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372204+0_BG190090"} -91;"Omniflo Weiche";"0000";"OFWeiche :13";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372206"} -92;"Omniflo Weiche";"0000";"OFWeiche :14";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372207"} -93;"Omniflo Weiche";"0000";"OFWeiche :15";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372209"} -94;"Omniflo Weiche";"0000";"OFWeiche :16";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372210"} -95;"Omniflo Weiche";"0000";"OFWeiche :17";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372210"} -96;"Omniflo Weiche";"0000";"OFWeiche :18";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372210+0_BG080090"} -97;"Omniflo Weiche";"0000";"OFWeiche :19";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372210+0_BG080090"} -98;"Omniflo Weiche";"0000";"OFWeiche :20";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372215"} -99;"Omniflo Weiche";"0000";"OFWeiche :21";"J/A";1;"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372216"} -100;"Omniflo Weiche";"0000";"OFWeiche :1";"J/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372400"} -101;"Omniflo Weiche";"0000";"OFWeiche :2";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372403"} -102;"Omniflo Weiche";"0000";"OFWeiche :3";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372404"} -103;"Omniflo Weiche";"0000";"OFWeiche :4";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG071090+834372404+0_BG071090"} -104;"Omniflo Weiche";"0000";"OFWeiche :5";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG071090+834372404"} -105;"Omniflo Weiche";"0000";"OFWeiche :6";"K/A";1;"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372404+0_BG071090"} -106;"Omniflo Weiche";"0000";"OFWeiche :1";"K/A";1;"";"";{"Weichentyp": "Deltaweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372401"} -107;"Omniflo Weiche";"0000";"OFWeiche :1";"K/A";1;"";"";{"Weichentyp": "Sternweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372420"} -108;"Omniflo Sum";"autogenerated_of_json";"Omniflo sum";"";1;"";"";{"Anzahl Bögen": 27, "Anzahl Weichengrundkörper": 0, "Anzahl Einwegweichen": 30, "Anzahl Deltaweichen": 7, "Anzahl Doppelweichen und Dreiwegeweichen": 42, "Anzahl Sternweichen": 1, "Gesamtlänge AP110": 0.0, "Gesamtlänge AP60": 0.0} +Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Nachbarn;Merkmale +1;"Omniflo Kurve";"0000";"OFBogen :1";"A/A";1;"";"";"";{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025"} +2;"Omniflo Kurve";"0000";"OFBogen :2";"A/A";1;"";"";"";{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025+0_B10090"} +3;"Omniflo Kurve";"0000";"OFBogen :3";"A/A";1;"";"";"";{"Kurvenwinkel": 22.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104025+0_B10091"} +4;"Omniflo Kurve";"0000";"OFBogen :4";"A/A";1;"";"";"";{"Kurvenwinkel": 45.0, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104021"} +5;"Omniflo Kurve";"0000";"OFBogen :5";"A/A";1;"";"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104026"} +6;"Omniflo Kurve";"0000";"OFBogen :6";"A/A";1;"";"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104026+0_B10071"} +7;"Omniflo Kurve";"0000";"OFBogen :7";"A/A";1;"";"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104037"} +8;"Omniflo Kurve";"0000";"OFBogen :8";"A/A";1;"";"";"";{"Kurvenwinkel": 45.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104029"} +9;"Omniflo Kurve";"0000";"OFBogen :9";"A/A";1;"";"";"";{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031"} +10;"Omniflo Kurve";"0000";"OFBogen :10";"A/A";1;"";"";"";{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031+0_B10060"} +11;"Omniflo Kurve";"0000";"OFBogen :11";"B/A";1;"";"";"";{"Kurvenwinkel": 45.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104031+0_B10070"} +12;"Omniflo Kurve";"0000";"OFBogen :12";"B/A";1;"";"";"";{"Kurvenwinkel": 67.5, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104024"} +13;"Omniflo Kurve";"0000";"OFBogen :13";"B/A";1;"";"";"";{"Kurvenwinkel": 67.5, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104024+0_B10081"} +14;"Omniflo Kurve";"0000";"OFBogen :14";"B/A";1;"";"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104027"} +15;"Omniflo Kurve";"0000";"OFBogen :15";"B/A";1;"";"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104027+0_B10080"} +16;"Omniflo Kurve";"0000";"OFBogen :16";"B/A";1;"";"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104028"} +17;"Omniflo Kurve";"0000";"OFBogen :17";"B/A";1;"";"";"";{"Kurvenwinkel": 67.5, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104065"} +18;"Omniflo Kurve";"0000";"OFBogen :18";"B/A";1;"";"";"";{"Kurvenwinkel": 90.0, "Radius": 400.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104022"} +19;"Omniflo Kurve";"0000";"OFBogen :19";"B/A";1;"";"";"";{"Kurvenwinkel": 90.0, "Radius": 500.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104030"} +20;"Omniflo Kurve";"0000";"OFBogen :20";"B/A";1;"";"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033"} +21;"Omniflo Kurve";"0000";"OFBogen :21";"C/A";1;"";"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033+0_B10040"} +22;"Omniflo Kurve";"0000";"OFBogen :22";"C/A";1;"";"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104033+0_B10050"} +23;"Omniflo Kurve";"0000";"OFBogen :23";"C/A";1;"";"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104035"} +24;"Omniflo Kurve";"0000";"OFBogen :24";"C/A";1;"";"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104041"} +25;"Omniflo Kurve";"0000";"OFBogen :25";"C/A";1;"";"";"";{"Kurvenwinkel": 90.0, "Radius": 630.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104034"} +26;"Omniflo Kurve";"0000";"OFBogen :26";"C/A";1;"";"";"";{"Kurvenwinkel": 90.0, "Radius": 550.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104066"} +27;"Omniflo Kurve";"0000";"OFBogen :27";"C/A";1;"";"";"";{"Kurvenwinkel": 180.0, "Radius": 650.0, "Höhe": "2000", "Drehung": 0.0, "SivasNummer": "821104043"} +28;"Omniflo Weiche";"0000";"OFWeiche :1";"C/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342011"} +29;"Omniflo Weiche";"0000";"OFWeiche :2";"C/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342001"} +30;"Omniflo Weiche";"0000";"OFWeiche :3";"C/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342012"} +31;"Omniflo Weiche";"0000";"OFWeiche :4";"D/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342002"} +32;"Omniflo Weiche";"0000";"OFWeiche :1";"D/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342100"} +33;"Omniflo Weiche";"0000";"OFWeiche :2";"D/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342101"} +34;"Omniflo Weiche";"0000";"OFWeiche :1";"D/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342200"} +35;"Omniflo Weiche";"0000";"OFWeiche :2";"D/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 22.5, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834342201"} +36;"Omniflo Weiche";"0000";"OFWeiche :5";"D/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372001"} +37;"Omniflo Weiche";"0000";"OFWeiche :6";"D/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372002"} +38;"Omniflo Weiche";"0000";"OFWeiche :7";"D/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372002+0_BG090090"} +39;"Omniflo Weiche";"0000";"OFWeiche :8";"D/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372004"} +40;"Omniflo Weiche";"0000";"OFWeiche :9";"D/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372005"} +41;"Omniflo Weiche";"0000";"OFWeiche :10";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372005+0_BG090090"} +42;"Omniflo Weiche";"0000";"OFWeiche :11";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372007"} +43;"Omniflo Weiche";"0000";"OFWeiche :12";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372008"} +44;"Omniflo Weiche";"0000";"OFWeiche :13";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372008+0_BG190090"} +45;"Omniflo Weiche";"0000";"OFWeiche :14";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372010"} +46;"Omniflo Weiche";"0000";"OFWeiche :15";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372011"} +47;"Omniflo Weiche";"0000";"OFWeiche :16";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372011+0_BG190090"} +48;"Omniflo Weiche";"0000";"OFWeiche :17";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372021"} +49;"Omniflo Weiche";"0000";"OFWeiche :18";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372022"} +50;"Omniflo Weiche";"0000";"OFWeiche :19";"E/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372024"} +51;"Omniflo Weiche";"0000";"OFWeiche :20";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372025"} +52;"Omniflo Weiche";"0000";"OFWeiche :21";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372027"} +53;"Omniflo Weiche";"0000";"OFWeiche :22";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372028"} +54;"Omniflo Weiche";"0000";"OFWeiche :23";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372028+0_BG080090"} +55;"Omniflo Weiche";"0000";"OFWeiche :24";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372030"} +56;"Omniflo Weiche";"0000";"OFWeiche :25";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372031"} +57;"Omniflo Weiche";"0000";"OFWeiche :26";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372031+0_BG080090"} +58;"Omniflo Weiche";"0000";"OFWeiche :27";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372047"} +59;"Omniflo Weiche";"0000";"OFWeiche :28";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "1", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372048"} +60;"Omniflo Weiche";"0000";"OFWeiche :29";"F/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372050"} +61;"Omniflo Weiche";"0000";"OFWeiche :30";"G/A";1;"";"";"";{"Weichentyp": "Einzelweiche", "Richtung": "2", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372051"} +62;"Omniflo Weiche";"0000";"OFWeiche :3";"G/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372100"} +63;"Omniflo Weiche";"0000";"OFWeiche :4";"G/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372101"} +64;"Omniflo Weiche";"0000";"OFWeiche :5";"G/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372101"} +65;"Omniflo Weiche";"0000";"OFWeiche :6";"G/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372101+0_BG090090"} +66;"Omniflo Weiche";"0000";"OFWeiche :7";"G/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372101+0_BG090090"} +67;"Omniflo Weiche";"0000";"OFWeiche :8";"G/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372103"} +68;"Omniflo Weiche";"0000";"OFWeiche :9";"G/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372104"} +69;"Omniflo Weiche";"0000";"OFWeiche :10";"G/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372104"} +70;"Omniflo Weiche";"0000";"OFWeiche :11";"G/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372104+0_BG190090"} +71;"Omniflo Weiche";"0000";"OFWeiche :12";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372104+0_BG190090"} +72;"Omniflo Weiche";"0000";"OFWeiche :13";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372106"} +73;"Omniflo Weiche";"0000";"OFWeiche :14";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372107"} +74;"Omniflo Weiche";"0000";"OFWeiche :15";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372109"} +75;"Omniflo Weiche";"0000";"OFWeiche :16";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372110"} +76;"Omniflo Weiche";"0000";"OFWeiche :17";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372110"} +77;"Omniflo Weiche";"0000";"OFWeiche :18";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372110+0_BG080090"} +78;"Omniflo Weiche";"0000";"OFWeiche :19";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372110+0_BG080090"} +79;"Omniflo Weiche";"0000";"OFWeiche :20";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372115"} +80;"Omniflo Weiche";"0000";"OFWeiche :21";"H/A";1;"";"";"";{"Weichentyp": "Doppelweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372116"} +81;"Omniflo Weiche";"0000";"OFWeiche :3";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372200"} +82;"Omniflo Weiche";"0000";"OFWeiche :4";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372201"} +83;"Omniflo Weiche";"0000";"OFWeiche :5";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372201"} +84;"Omniflo Weiche";"0000";"OFWeiche :6";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372201+0_BG090090"} +85;"Omniflo Weiche";"0000";"OFWeiche :7";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG090090+834372201+0_BG090090"} +86;"Omniflo Weiche";"0000";"OFWeiche :8";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372203"} +87;"Omniflo Weiche";"0000";"OFWeiche :9";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372204"} +88;"Omniflo Weiche";"0000";"OFWeiche :10";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372204"} +89;"Omniflo Weiche";"0000";"OFWeiche :11";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372204+0_BG190090"} +90;"Omniflo Weiche";"0000";"OFWeiche :12";"I/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 45.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG190090+834372204+0_BG190090"} +91;"Omniflo Weiche";"0000";"OFWeiche :13";"J/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372206"} +92;"Omniflo Weiche";"0000";"OFWeiche :14";"J/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372207"} +93;"Omniflo Weiche";"0000";"OFWeiche :15";"J/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372209"} +94;"Omniflo Weiche";"0000";"OFWeiche :16";"J/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372210"} +95;"Omniflo Weiche";"0000";"OFWeiche :17";"J/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372210"} +96;"Omniflo Weiche";"0000";"OFWeiche :18";"J/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372210+0_BG080090"} +97;"Omniflo Weiche";"0000";"OFWeiche :19";"J/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG080090+834372210+0_BG080090"} +98;"Omniflo Weiche";"0000";"OFWeiche :20";"J/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372215"} +99;"Omniflo Weiche";"0000";"OFWeiche :21";"J/A";1;"";"";"";{"Weichentyp": "Dreiwegeweiche", "Richtung": "7", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372216"} +100;"Omniflo Weiche";"0000";"OFWeiche :1";"J/A";1;"";"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372400"} +101;"Omniflo Weiche";"0000";"OFWeiche :2";"K/A";1;"";"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372403"} +102;"Omniflo Weiche";"0000";"OFWeiche :3";"K/A";1;"";"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372404"} +103;"Omniflo Weiche";"0000";"OFWeiche :4";"K/A";1;"";"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG071090+834372404+0_BG071090"} +104;"Omniflo Weiche";"0000";"OFWeiche :5";"K/A";1;"";"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "0_BG071090+834372404"} +105;"Omniflo Weiche";"0000";"OFWeiche :6";"K/A";1;"";"";"";{"Weichentyp": "Dreifachweiche", "Richtung": "3", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": true, "SivasNummer": "834372404+0_BG071090"} +106;"Omniflo Weiche";"0000";"OFWeiche :1";"K/A";1;"";"";"";{"Weichentyp": "Deltaweiche", "Richtung": "7", "Weichenwinkel": 90.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372401"} +107;"Omniflo Weiche";"0000";"OFWeiche :1";"K/A";1;"";"";"";{"Weichentyp": "Sternweiche", "Richtung": "3", "Weichenwinkel": 0.0, "Höhe": "2000", "Drehung": 0.0, "Antrieb Kurve": false, "SivasNummer": "834372420"} +108;"Omniflo Sum";"autogenerated_of_json";"Omniflo sum";"";1;"";"";"";{"Anzahl Bögen": 27, "Anzahl Weichengrundkörper": 0, "Anzahl Einwegweichen": 30, "Anzahl Deltaweichen": 7, "Anzahl Doppelweichen und Dreiwegeweichen": 42, "Anzahl Sternweichen": 1, "Gesamtlänge AP110": 0.0, "Gesamtlänge AP60": 0.0} diff --git a/tests/test_foerderer.py b/tests/test_foerderer.py index 422ce8f..cad5337 100644 --- a/tests/test_foerderer.py +++ b/tests/test_foerderer.py @@ -203,7 +203,7 @@ class TestFoerdererExportCSV: def test_header_felder(self): """CSV-Header muss korrekte Spaltenbezeichnungen haben.""" expected = ["Elementnummer", "TeileArt", "TeileId", "Bezeichnung", - "Planquadrat", "Anzahl", "Position", "Boundingbox", "Merkmale"] + "Planquadrat", "Anzahl", "Position", "Boundingbox", "Nachbarn", "Merkmale"] for i, name in enumerate(expected): assert self.header[i] == name, ( f"Header[{i}]: erwartet '{name}', ist '{self.header[i]}'" @@ -235,10 +235,10 @@ class TestFoerdererExportCSV: def test_merkmale_sind_valides_json(self): """Merkmale-Spalte muss valides JSON enthalten.""" for i, row in enumerate(self.rows): - if len(row) < 9: + if len(row) < 10: continue try: - json.loads(row[8]) + json.loads(row[9]) except json.JSONDecodeError as e: pytest.fail(f"Zeile {i + 2}: Merkmale ist kein valides JSON: {e}") @@ -247,9 +247,9 @@ class TestFoerdererExportCSV: required = {"Typ", "Winkel", "DeltaH_mm", "DeltaL_mm", "L_VF_m", "Hoehe_Von_mm", "Hoehe_Bis_mm"} for i, row in enumerate(self.rows): - if len(row) < 9: + if len(row) < 10: continue - merkmale = json.loads(row[8]) + merkmale = json.loads(row[9]) missing = required - set(merkmale.keys()) assert not missing, ( f"Zeile {i + 2}: Fehlende Merkmale-Felder: {missing}" diff --git a/tests/test_omniflo.py b/tests/test_omniflo.py index d1b32bb..7f927dd 100644 --- a/tests/test_omniflo.py +++ b/tests/test_omniflo.py @@ -107,7 +107,7 @@ class TestOmnifloExportUnit: out_dir = _output_dir() os.makedirs(out_dir, exist_ok=True) csv_path = os.path.join(out_dir, "omniflo_export.csv") - header = "Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Merkmale" + header = "Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Nachbarn;Merkmale" with open(csv_path, "w", encoding="utf-8") as f: f.write(header + "\n") for item in self.items: @@ -333,7 +333,7 @@ def _reference_dir(): def _normalize_row(line): """Splittet eine CSV-Zeile und ersetzt die TeileId (UUID) durch Platzhalter.""" - cols = line.strip().split(";", 8) + cols = line.strip().split(";", 9) if len(cols) >= 3: cols[2] = "" return cols