HundM05-Testfall und DXF-Analyse-Skripte

- lib/dxf_scan_components.py: erkennt ILS-/Omniflo-Komponenten in fremden
  Projektzeichnungen und schreibt sie im Testdaten-JSON-Schema aus
- lib/dxf_abbild.py: getreue Abbildung der Bauteile einer Fremdzeichnung
  (Attribute, Weltkoordinaten, Unterkomponenten) ohne Interpretation
- tests/test_hundm05.{lsp,py}, testdata/hundm05.json, conftest-Fixtures und
  alltests.json-Eintrag fuer den Kreisel-Abschnitt aus ST500592_05.dxf
- menu: TEST_HUNDM05 im Testmenue, Connection_Insert/Edit in SSG_LIB.cui
- Doku: hartkodierte Pfade durch (getenv "DXFMAKRO") ersetzt

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-24 12:10:58 +02:00
parent e91608d7cc
commit 7242e815f8
15 changed files with 3112 additions and 63 deletions
+573
View File
@@ -0,0 +1,573 @@
[
{
"id": "Kreisel_HundM05_01",
"function": "connect",
"start_x": 216120.19,
"start_y": 151070.0,
"start_z": 0.0,
"end_x": 239701.9,
"end_y": 151070.0,
"end_z": 0.0,
"typ": "STANDARD",
"hoehe": 0.0,
"comment": "aus DXF: AN8 (Layer 1ANTR-800) -> SP8 (Layer 1SP-800), Abstand 23581.71; daraus folgt produktionsseitig abstand = 23581.71 - 800.0 = 22781.71 und rotation = 0.00 Grad. ACHTUNG hoehe: AN8 und SP8 sind in dieser Zeichnung flache 2D-Symbole (nur Linien/Kreis/Text auf Z=0) und auf Z=0 eingefuegt - die Einfuegehoehe des Kreisels steht NICHT im DXF und muss hier von Hand gesetzt werden (vgl. mubea.json, wo z ebenfalls Handarbeit ist)."
},
{
"test_id": "GF_HundM05_04",
"modus": 1,
"deltaL_mm": 2094.45,
"winkel_grad": 48.21,
"hz_grad": 125.48,
"start_mm": [219540.85, 152832.91, 2342.96],
"as_seite": "links",
"es_seite": "links",
"as_winkel": "90",
"es_winkel": "90",
"comment": "aus DXF: 3D_FF_Antrieb_rechts -> Umlenkung FF (Layer _3D_Fingerförderer / z-3), XY-Abstand 2094.45, Neigung 48.21 Grad; Gefaellestrecke, da fallend und Neigung >= 3 Grad. as_/es_seite und -winkel sind Defaults (im DXF nicht ableitbar)."
},
{
"test_id": "VF_HundM05_05",
"typ": "standard",
"richtung": "Auf",
"deltaL": 1694.19,
"deltaH": 2057.58,
"startpunkt": [219542.27, 153175.18, 0.0],
"seite": "rechts",
"hz": 135.86,
"comment": "aus DXF: Antrieb FF -> 3D_FF_Umlenk_rechts (Layer z-3 / _3D_Fingerförderer), XY-Abstand 1694.19, Neigung 50.53 Grad; VarioFoerderer. 'winkel' bewusst nicht gesetzt - der Solver waehlt den kleinsten gueltigen Kandidaten. 'seite' ist Default (im DXF nicht ableitbar)."
},
{
"test_id": "GERADE_HundM05_08",
"typ": "gerade",
"laenge": 3305.26,
"hz": 143.35,
"startpunkt": [223150.89, 152953.65, 0.0],
"endpunkt": [220499.01, 154926.53, 0.0],
"comment": "aus DXF: Antrieb FF -> Umlenkung FF (Layer z-3 / z-3), XY-Abstand 3305.26, Neigung 0.00 Grad; waagrechte Foerderstrecke (Hoehendifferenz 0.00 mm < 10 mm) - KEIN VarioFoerderer, da dessen Winkel-Solver eine Hoehendifferenz braucht."
},
{
"test_id": "GF_HundM05_09",
"modus": 1,
"deltaL_mm": 3817.56,
"winkel_grad": 6.75,
"hz_grad": 107.51,
"start_mm": [223151.48, 152603.13, 2337.66],
"as_seite": "links",
"es_seite": "links",
"as_winkel": "90",
"es_winkel": "90",
"comment": "aus DXF: 3D_FF_Antrieb_rechts -> 3D_FF_Umlenk_rechts (Layer _3D_Fingerförderer / _3D_Fingerförderer), XY-Abstand 3817.56, Neigung 6.75 Grad; Gefaellestrecke, da fallend und Neigung >= 3 Grad. as_/es_seite und -winkel sind Defaults (im DXF nicht ableitbar)."
},
{
"test_id": "GERADE_HundM05_10",
"typ": "gerade",
"laenge": 11940.15,
"hz": 33.61,
"startpunkt": [225207.36, 149949.84, 0.0],
"endpunkt": [235151.11, 156559.61, -3.45],
"comment": "aus DXF: Antrieb FF -> Umlenkung FF (Layer z-3 / z-3), XY-Abstand 11940.15, Neigung 0.02 Grad; waagrechte Foerderstrecke (Hoehendifferenz 3.45 mm < 10 mm) - KEIN VarioFoerderer, da dessen Winkel-Solver eine Hoehendifferenz braucht."
},
{
"test_id": "VF_HundM05_11",
"typ": "standard",
"richtung": "Auf",
"deltaL": 11769.21,
"deltaH": 5827.59,
"startpunkt": [225207.48, 149949.9, -3941.61],
"seite": "rechts",
"hz": 32.34,
"comment": "aus DXF: Antrieb FF -> 3D_FF_Umlenk_rechts (Layer z-3 / _3D_Fingerförderer), XY-Abstand 11769.21, Neigung 26.34 Grad; VarioFoerderer. 'winkel' bewusst nicht gesetzt - der Solver waehlt den kleinsten gueltigen Kandidaten. 'seite' ist Default (im DXF nicht ableitbar)."
},
{
"test_id": "VF_HundM05_12",
"typ": "standard",
"richtung": "Auf",
"deltaL": 3450.94,
"deltaH": 1885.98,
"startpunkt": [227298.92, 152942.18, 0.0],
"seite": "rechts",
"hz": 106.79,
"comment": "aus DXF: Antrieb FF -> 3D_FF_Umlenk_rechts (Layer z-3 / _3D_Fingerförderer), XY-Abstand 3450.94, Neigung 28.66 Grad; VarioFoerderer. 'winkel' bewusst nicht gesetzt - der Solver waehlt den kleinsten gueltigen Kandidaten. 'seite' ist Default (im DXF nicht ableitbar)."
},
{
"test_id": "GF_HundM05_13",
"modus": 1,
"deltaL_mm": 4078.06,
"winkel_grad": 29.82,
"hz_grad": 104.2,
"start_mm": [227300.62, 152605.32, 2337.74],
"as_seite": "links",
"es_seite": "links",
"as_winkel": "90",
"es_winkel": "90",
"comment": "aus DXF: 3D_FF_Antrieb_rechts -> Umlenkung FF (Layer _3D_Fingerförderer / z-3), XY-Abstand 4078.06, Neigung 29.82 Grad; Gefaellestrecke, da fallend und Neigung >= 3 Grad. as_/es_seite und -winkel sind Defaults (im DXF nicht ableitbar)."
},
{
"function": "insert",
"block": "Vario_Motorstation_500mm_rechts",
"x": 224346.52,
"y": 149549.9,
"z": 21677.04,
"rotation": 90.0,
"comment": "aus DXF: Block 'Antrieb FF', Layer 'z-3', auf Makro-Block 'Vario_Motorstation_500mm_rechts' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "Vario_Motorstation_500mm_rechts",
"x": 223998.19,
"y": 149549.84,
"z": 2384.8,
"rotation": 180.0,
"comment": "aus DXF: Block '3D_FF_Antrieb_rechts', Layer '_3D_Fingerförderer', auf Makro-Block 'Vario_Motorstation_500mm_rechts' abgebildet"
},
{
"function": "insert",
"block": "Vario_Motorstation_500mm_rechts",
"x": 224346.4,
"y": 149549.84,
"z": 0.0,
"rotation": 90.0,
"comment": "aus DXF: Block 'Antrieb FF', Layer 'z-3', auf Makro-Block 'Vario_Motorstation_500mm_rechts' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "Vario_Kurve_rechts_30_TEF_aussen",
"x": 219480.78,
"y": 153174.98,
"z": 2230.86,
"rotation": 270.0,
"comment": "aus DXF: Block '3D_FF_Bogen_außen_30°', Layer '_3D_Fingerförderer', auf Makro-Block 'Vario_Kurve_rechts_30_TEF_aussen' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "Vario_Kurve_rechts_30_TEF_innen",
"x": 220438.78,
"y": 154981.88,
"z": 1726.02,
"rotation": 90.0,
"comment": "aus DXF: Block '3D_FF_Bogen_innen_30°', Layer '_3D_Fingerförderer', auf Makro-Block 'Vario_Kurve_rechts_30_TEF_innen' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "Vario_Kurve_rechts_30_TEF_aussen",
"x": 219535.71,
"y": 153172.45,
"z": 2349.22,
"rotation": 270.0,
"comment": "aus DXF: Block '3D_ILS_Bogen_30°', Layer '_3D_ILS_Bogen_30°', auf Makro-Block 'Vario_Kurve_rechts_30_TEF_aussen' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Lage=aussen, Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "Vario_Kurve_rechts_30_TEF_aussen",
"x": 220500.01,
"y": 154973.55,
"z": 1850.0,
"rotation": 90.0,
"comment": "aus DXF: Block '3D_ILS_Bogen_30°', Layer '_3D_ILS_Bogen_30°', auf Makro-Block 'Vario_Kurve_rechts_30_TEF_aussen' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Lage=aussen, Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "Vario_Kurve_rechts_30_TEF_aussen",
"x": 222776.13,
"y": 149549.84,
"z": 2335.65,
"rotation": 0.0,
"comment": "aus DXF: Block '3D_ILS_Bogen_30°', Layer '_3D_ILS_Bogen_30°', auf Makro-Block 'Vario_Kurve_rechts_30_TEF_aussen' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Lage=aussen, Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "Vario_Kurve_rechts_30_TEF_aussen",
"x": 223249.77,
"y": 149949.81,
"z": 2360.47,
"rotation": 0.0,
"comment": "aus DXF: Block '3D_ILS_Bogen_30°', Layer '_3D_ILS_Bogen_30°', auf Makro-Block 'Vario_Kurve_rechts_30_TEF_aussen' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Lage=aussen, Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "AS_Element_90_rechts",
"x": 217765.98,
"y": 151472.13,
"z": 2099.94,
"rotation": 0.0,
"comment": "aus DXF: Block 'Ausschleuselement_V3', Layer '_3D_ILS_AE', auf Makro-Block 'AS_Element_90_rechts' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Winkel=90, Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "AS_Element_90_rechts",
"x": 221440.62,
"y": 151470.0,
"z": 2067.0,
"rotation": 0.0,
"comment": "aus DXF: Block 'Ausschleuselement_V3', Layer '_3D_ILS_AE', auf Makro-Block 'AS_Element_90_rechts' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Winkel=90, Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "AS_Element_90_rechts",
"x": 225739.77,
"y": 151470.0,
"z": 2067.0,
"rotation": 0.0,
"comment": "aus DXF: Block 'Ausschleuselement_V3', Layer '_3D_ILS_AE', auf Makro-Block 'AS_Element_90_rechts' abgebildet; ACHTUNG geraten (im DXF nicht ableitbar): Winkel=90, Seite=rechts - bei Bedarf hier im JSON korrigieren"
},
{
"function": "insert",
"block": "S-LP",
"x": 216525.22,
"y": 150670.0,
"z": 0.0,
"rotation": 0.0,
"comment": "aus DXF: Block 'S-LP', Layer '5SEP-LP'; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 217622.88,
"y": 151470.0,
"z": 0.0,
"rotation": 180.0,
"comment": "aus DXF: Block 'S-LP', Layer '5SEP-LP'; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 221298.51,
"y": 151470.0,
"z": 0.0,
"rotation": 180.0,
"comment": "aus DXF: Block 'S-LP', Layer '5SEP-LP'; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 224908.15,
"y": 150670.0,
"z": 0.0,
"rotation": 0.0,
"comment": "aus DXF: Block 'S-LP', Layer '5SEP-LP'; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 225508.15,
"y": 150670.0,
"z": 0.0,
"rotation": 0.0,
"comment": "aus DXF: Block 'S-LP', Layer '5SEP-LP'; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 225597.66,
"y": 151470.0,
"z": 0.0,
"rotation": 180.0,
"comment": "aus DXF: Block 'S-LP', Layer '5SEP-LP'; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 218325.21,
"y": 154009.54,
"z": 0.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 219542.38,
"y": 151961.76,
"z": 0.0,
"rotation": 90.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 220498.95,
"y": 155645.73,
"z": 0.09,
"rotation": 90.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 220498.95,
"y": 155953.39,
"z": 0.09,
"rotation": 90.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 222000.85,
"y": 155698.7,
"z": 0.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 222153.05,
"y": 149875.67,
"z": 0.0,
"rotation": 330.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 223150.84,
"y": 151972.72,
"z": -7.54,
"rotation": 90.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 223617.86,
"y": 149949.84,
"z": 0.0,
"rotation": 0.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 226300.0,
"y": 155718.69,
"z": 0.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-SP",
"x": 227300.01,
"y": 151981.61,
"z": -7.54,
"rotation": 90.0,
"comment": "aus DXF: Block 'S-SP', Layer '5SEP-SP'; Block 'S-SP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "Scanner",
"x": 217622.88,
"y": 151190.0,
"z": 0.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'SCAN', Layer 'ZZSCANNER', auf Makro-Block 'Scanner' abgebildet"
},
{
"function": "insert",
"block": "Scanner",
"x": 220218.95,
"y": 155609.84,
"z": 0.09,
"rotation": 180.0,
"comment": "aus DXF: Block 'SCAN', Layer 'ZZSCANNER', auf Makro-Block 'Scanner' abgebildet"
},
{
"function": "insert",
"block": "Scanner",
"x": 221298.51,
"y": 151190.0,
"z": 0.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'SCAN', Layer 'ZZSCANNER', auf Makro-Block 'Scanner' abgebildet"
},
{
"function": "insert",
"block": "Scanner",
"x": 222013.05,
"y": 149633.18,
"z": 0.0,
"rotation": 240.0,
"comment": "aus DXF: Block 'SCAN', Layer 'ZZSCANNER', auf Makro-Block 'Scanner' abgebildet"
},
{
"function": "insert",
"block": "Scanner",
"x": 223617.86,
"y": 149669.84,
"z": 0.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'SCAN', Layer 'ZZSCANNER', auf Makro-Block 'Scanner' abgebildet"
},
{
"function": "insert",
"block": "Scanner",
"x": 224882.1,
"y": 150392.28,
"z": 0.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'SCAN', Layer 'ZZSCANNER', auf Makro-Block 'Scanner' abgebildet"
},
{
"function": "insert",
"block": "Scanner",
"x": 225597.66,
"y": 151190.0,
"z": 0.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'SCAN', Layer 'ZZSCANNER', auf Makro-Block 'Scanner' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 218326.39,
"y": 153912.84,
"z": 2066.06,
"rotation": 0.0,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 219544.61,
"y": 152086.0,
"z": 2318.68,
"rotation": 180.29,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 220500.0,
"y": 155763.99,
"z": 1876.16,
"rotation": 180.0,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 222001.54,
"y": 155600.71,
"z": 1923.14,
"rotation": 359.97,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 222001.69,
"y": 155900.21,
"z": 1905.78,
"rotation": 359.97,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 222201.22,
"y": 149847.53,
"z": 2318.04,
"rotation": 60.49,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 223149.87,
"y": 152086.02,
"z": 2318.68,
"rotation": 180.29,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 223747.95,
"y": 149950.46,
"z": 2386.66,
"rotation": 90.81,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 226300.69,
"y": 155600.71,
"z": 1923.14,
"rotation": 359.97,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 226300.84,
"y": 155900.21,
"z": 1905.78,
"rotation": 359.97,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "Separator_SP",
"x": 227298.05,
"y": 152086.02,
"z": 2318.68,
"rotation": 180.29,
"comment": "aus DXF: Block 'Separator 200000070', Layer '_3D_Separator', auf Makro-Block 'Separator_SP' abgebildet"
},
{
"function": "insert",
"block": "S-LP",
"x": 216630.12,
"y": 150670.0,
"z": 2167.0,
"rotation": 90.0,
"comment": "aus DXF: Block 'Separator LP 3D', Layer '_3D_Separator', auf Makro-Block 'S-LP' abgebildet; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 217517.98,
"y": 151470.0,
"z": 2167.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'Separator LP 3D', Layer '_3D_Separator', auf Makro-Block 'S-LP' abgebildet; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 221193.61,
"y": 151470.0,
"z": 2167.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'Separator LP 3D', Layer '_3D_Separator', auf Makro-Block 'S-LP' abgebildet; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 225013.06,
"y": 150670.0,
"z": 2167.0,
"rotation": 90.0,
"comment": "aus DXF: Block 'Separator LP 3D', Layer '_3D_Separator', auf Makro-Block 'S-LP' abgebildet; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 225492.76,
"y": 151470.0,
"z": 2167.0,
"rotation": 270.0,
"comment": "aus DXF: Block 'Separator LP 3D', Layer '_3D_Separator', auf Makro-Block 'S-LP' abgebildet; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
},
{
"function": "insert",
"block": "S-LP",
"x": 225613.06,
"y": 150670.0,
"z": 2167.0,
"rotation": 90.0,
"comment": "aus DXF: Block 'Separator LP 3D', Layer '_3D_Separator', auf Makro-Block 'S-LP' abgebildet; Block 'S-LP' ist in data/ils/ NICHT vorhanden - erzeugt im Testlauf einen Platzhalter"
}
]
+37 -7
View File
@@ -52,7 +52,7 @@
"function": "insert",
"block": "S-LP",
"x": 400,
"y": -3815,
"y": -4038,
"z": 1467,
"rotation": 90,
"assigned_to": "Kreisel_links"
@@ -62,7 +62,7 @@
"function": "insert",
"block": "Scanner",
"x": 400,
"y": -3925,
"y": -4083,
"z": 1467,
"rotation": 0,
"assigned_to": "Kreisel_links"
@@ -83,7 +83,7 @@
"block": "Scanner",
"x": 10310,
"y": -610,
"z": 1467,
"z": 1941,
"rotation": 0,
"assigned_to": "Kreisel_rechts"
},
@@ -264,13 +264,23 @@
"rotation": 180,
"assigned_to": "Kreisel_unten"
},
{
"comment": "Scanner unterer Kreisel",
"function": "insert",
"block": "Scanner",
"x": 1415,
"y": -5100,
"z": 1467,
"rotation": 270,
"assigned_to": "Kreisel_unten"
},
{
"comment": "Separator S-LP #11 Y-Abgleich mit Gefaellestrecken (Sep-Y=8777, GF_Mubea_04-Y=9126, diff=349mm, enger Treffer)",
"function": "insert",
"block": "S-LP",
"x": 9510,
"y": 13649,
"z": 1467,
"y": 14334,
"z": 1941,
"rotation": 270,
"assigned_to": "Kreisel_rechts"
},
@@ -293,13 +303,33 @@
"z": 1941,
"rotation": 90,
"assigned_to": "Kreisel_rechts"
},
{
"comment": "Separator Eingang 3 Rechter_Kreisel",
"function": "insert",
"block": "S-LP",
"x": 10310,
"y": -5073,
"z": 1941,
"rotation": 90,
"assigned_to": "Kreisel_rechts"
},
{
"comment": "",
"function": "insert",
"block": "S-LP",
"x": 8725,
"y": -4743,
"z": 1941,
"rotation": 180,
"assigned_to": "GF_Mubea"
},
{
"comment": "Separator S-LP #8 Y-Abgleich mit Gefaellestrecken (Sep-Y=-4823, GF_Mubea_20-Y=-3673, diff=1150mm, naechstgelegene Reihe, kein enger Treffer)",
"function": "insert",
"block": "S-LP",
"x": 9510,
"y": -3887,
"y": -3636,
"z": 1941,
"rotation": 270,
"assigned_to": "GF_Mubea_20"
@@ -309,7 +339,7 @@
"function": "insert",
"block": "Scanner",
"x": 9510,
"y": -3787,
"y": -3557,
"z": 1941,
"rotation": 0,
"assigned_to": "Kreisel_rechts"
+48 -1
View File
@@ -49,6 +49,7 @@ Grad). Richtung `hz`/`hz_grad`: 0=Ost(+X), 90=Nord(+Y), 180=West(-X),
| 4.3 | Omniflo TEF/Zubehoer | `omni:insert-dxf` (fester Sivasnr) | Position ja, Punkt interaktiv | 1 Punkt (nur via Wrapper) | [#43](#43-omniflo-tefzubehoer) |
| 4.4 | Omniflo TV_*/APBW_* | — (DUMMY) | **nein** | — | [#44](#44-omniflo-tv_-apbw_) |
| 5 | Separator/Scanner/Sensor | `ils-insert-sensor (fname)` + `_.INSERT` | **nein** (Schleife) | 1 Punkt `x,y,z` (nur via Wrapper) | [#5](#5-separatorscannersensor) |
| 6 | Waagrechte Foerderstrecke (`gerade`) | `insert-hz-scaled-block-by-ks (blockname startpunkt laenge hz vert)` | **ja** | 1 Punkt `startpunkt` (+ `endpunkt` als Doku) | [#6](#6-waagrechte-foerderstrecke-gerade) |
Legende Scriptbar-Spalte:
- **ja** — direkt per JSON aufrufbar.
@@ -541,7 +542,53 @@ Vollstaendiges JSON (wie in `mubea.json`s Separator-Eintraegen):
---
## 6. Zusammenfassung: scriptbar vs. nicht scriptbar
## 6. Waagrechte Foerderstrecke (`gerade`)
Produktionsfunktion:
`insert-hz-scaled-block-by-ks (blockname startpunkt laenge hz-winkel vert-winkel)`
(`Lisp/vf_etage.lsp`) — dieselbe Primitive, mit der der Etage-Foerderer seine
waagrechten Abschnitte baut. Skaliert `Staustrecke_SP_1000_mm` auf `laenge`
(Massstab = `laenge / 1000`) und richtet sie ueber `KS_EIN`/`KS_AUS` am
`startpunkt` aus.
Dieser Typ entstand beim Nachbau von `results/ST500592_05.dxf`: ein
Antriebs-/Umlenkstation-Paar **ohne** Hoehendifferenz ist fachlich kein
VarioFoerderer. Dessen Solver (`berechne-standard`
`berechne-alle-winkel`) muss einen Bogenwinkel aus der Kandidatenliste
3…51 Grad waehlen, was bei `deltaH ≈ 0` nicht aufgeht — der Eintrag waere
unbaubar. `lib/dxf_scan_components.py` trennt solche Paare darum ueber
`GERADE_MAX_DELTA_H` (10 mm) ab und gibt sie als `gerade` aus.
| Feld | Typ | Pflicht | Bedeutung | Default |
|---|---|---|---|---|
| `test_id` | string | **ja** | Kennung, Praefix `GERADE_` (steuert den Dispatcher) | - |
| `typ` | string | nein | `"gerade"` (Dokumentation, nicht ausgewertet) | - |
| `laenge` | real (mm) | **ja** | horizontale Laenge; Massstab der Staustrecke | - |
| `hz` | real (Grad) | nein | Fahrtrichtung in der XY-Ebene | 0.0 |
| `startpunkt` | [x,y,z] (mm) | **ja** | Anfangspunkt (`KS_EIN` wird hierhin gelegt) | - |
| `endpunkt` | [x,y,z] (mm) | nein | Endpunkt — reine Dokumentation/Herkunft, **kein** Parameter; die Geometrie folgt aus `startpunkt` + `laenge` + `hz` | - |
`vert-winkel` wird vom Treiber fest auf `0` gesetzt (waagrecht). Die Funktion
gibt den **Ausgangspunkt** zurueck, nicht die Entity — ein Treiber holt den
Block ueber `(entlast)`. Bei fehlender Blockdatei ruft sie `(exit)` auf und
wuerde einen Testlauf abbrechen, darum vorher mit `ssg-ils-block-laden`
pruefen (so macht es `hundm05:build-gerade` in `tests/test_hundm05.lsp`).
Vollstaendiges JSON (wie in `hundm05.json`):
```json
{
"test_id": "GERADE_HundM05_08",
"typ": "gerade",
"laenge": 3305.26,
"hz": 143.35,
"startpunkt": [223150.89, 152953.65, 0.0],
"endpunkt": [220499.01, 154926.53, 0.0]
}
```
---
## 7. Zusammenfassung: scriptbar vs. nicht scriptbar
| Element | Produktionsfunktion | Scriptbar? |
|---|---|---|