Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros
This commit is contained in:
+980
-86
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+95
-55
@@ -5,13 +5,13 @@
|
||||
"teileart": "Geruest Rohrabhaenger",
|
||||
"dummy": "Rohrabhaenger_dummy.dwg",
|
||||
"attribute": {
|
||||
"Laenge": {
|
||||
"LAENGE": {
|
||||
"typ": "number",
|
||||
"min": 0,
|
||||
"max": 6000,
|
||||
"einheit": "mm"
|
||||
},
|
||||
"Teilefarbe": {
|
||||
"TEILEFARBE": {
|
||||
"typ": "auswahl",
|
||||
"optionen": [
|
||||
"RAL7035",
|
||||
@@ -29,13 +29,13 @@
|
||||
"artikel": "ROHR R 1\" 33,7 x 2,6",
|
||||
"sivas_id": 821006026,
|
||||
"farbig": true,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
},
|
||||
{
|
||||
"artikel": "CAD - ROHRABH. 1\" NICHT GEQUETSCHT - MONTAGEELEMENTE KPL.",
|
||||
"sivas_id": 821004202,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -46,13 +46,13 @@
|
||||
"artikel": "ROHR R 1\" 33,7 x 2,6 einseitig gequetscht",
|
||||
"sivas_id": 821006034,
|
||||
"farbig": true,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
},
|
||||
{
|
||||
"artikel": "CAD - ROHRABHÄNGER 1\" EINSEITIG GEQUETSCHT - MONTAGEELEMENTE KPL.",
|
||||
"sivas_id": 821004203,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -63,13 +63,25 @@
|
||||
"artikel": "ROHR R 1\" 33,7 x 2,6 beidseitig gequetscht",
|
||||
"sivas_id": 821006035,
|
||||
"farbig": true,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
},
|
||||
{
|
||||
"artikel": "CAD - ROHRABHÄNGER 1\" BEIDSEITIG GEQUETSCHT - MONTAGEELEMENTE KPL.",
|
||||
"sivas_id": 821004204,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "T-Abhaenger mit 300 mm Flanschrohr R 1\" 33,7 x 2,6",
|
||||
"dummy": "821006036.dwg",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "T-ABHÄNGER MIT FLANSCH-ROHR 33,7 x 2,6",
|
||||
"sivas_id": 821006036,
|
||||
"farbig": true,
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -79,34 +91,37 @@
|
||||
"artikel": "SPANNPRATZE ST - KH 8-11 KPL.SELBSTSICHERND",
|
||||
"sivas_id": 821004120,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"artikel": "SPANNPRATZE SELBSTSICHERND KPL.",
|
||||
"sivas_id": 821004058,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"name": "Schraubenset",
|
||||
"anzahl_vorgabe": 1,
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "Scheibe DIN 125 - A 10,5 - 140 HV - St",
|
||||
"sivas_id": 913011010,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
},
|
||||
{
|
||||
"artikel": "Sechskantmutter DIN 934 - M10 - 8",
|
||||
"sivas_id": 912011010,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 2
|
||||
},
|
||||
{
|
||||
"artikel": "Sechskantschraube DIN 933 - M10 x 30 - 8.8",
|
||||
"sivas_id": 911011008,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -114,43 +129,50 @@
|
||||
"artikel": "U-BÜGEL M7 41X49 FÜR PROFILGERÜST - BG",
|
||||
"sivas_id": 825004049,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"artikel": "ROHRKLAMMER 1\" KPL. VERTIKAL",
|
||||
"sivas_id": 825004040,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 2
|
||||
},
|
||||
{
|
||||
"artikel": "WINKEL 60X60X6X300",
|
||||
"sivas_id": 821006043,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"artikel": "WINKEL 60X60X6X60",
|
||||
"sivas_id": 821006042,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"artikel": "ROHRKLAMMER 1\" T-VERBINDUNG KPL.",
|
||||
"sivas_id": 825004030,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"artikel": "ROHRKLAMMER 1\" FLACH UND LANG, KPL.",
|
||||
"sivas_id": 825002021,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"artikel": "DURCHSTECKANKER HST M12X115X20",
|
||||
"sivas_id": 922021003,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
}
|
||||
],
|
||||
"konfigurationen": [
|
||||
@@ -162,17 +184,17 @@
|
||||
"oben": [
|
||||
{
|
||||
"artikel": "SPANNPRATZE SELBSTSICHERND KPL.",
|
||||
"menge": 1
|
||||
"anzahl": 1
|
||||
},
|
||||
{
|
||||
"artikel": "Schraubenset",
|
||||
"menge": 1
|
||||
"anzahl": 1
|
||||
}
|
||||
],
|
||||
"unten": [
|
||||
{
|
||||
"artikel": "ROHRKLAMMER 1\" KPL. VERTIKAL",
|
||||
"menge": 2
|
||||
"anzahl": 2
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -184,13 +206,13 @@
|
||||
"oben": [
|
||||
{
|
||||
"artikel": "DURCHSTECKANKER HST M12X115X20",
|
||||
"menge": 2
|
||||
"anzahl": 2
|
||||
}
|
||||
],
|
||||
"unten": [
|
||||
{
|
||||
"artikel": "ROHRKLAMMER 1\" T-VERBINDUNG KPL.",
|
||||
"menge": 1
|
||||
"anzahl": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -200,15 +222,15 @@
|
||||
"id": "Saeulen",
|
||||
"titel": "Saeulen",
|
||||
"teileart": "Geruest Saeule",
|
||||
"dummy": "R2-Saeule_dummy.dwg",
|
||||
"dummy": "821006051.dwg",
|
||||
"attribute": {
|
||||
"Laenge": {
|
||||
"LAENGE": {
|
||||
"typ": "number",
|
||||
"min": 0,
|
||||
"max": 6000,
|
||||
"einheit": "mm"
|
||||
},
|
||||
"Teilefarbe": {
|
||||
"TEILEFARBE": {
|
||||
"typ": "auswahl",
|
||||
"optionen": [
|
||||
"RAL7035",
|
||||
@@ -239,31 +261,32 @@
|
||||
"artikel": "BODENSÄULE R 2\" 60,3 MIT FUSSPLATTE",
|
||||
"sivas_id": 821006051,
|
||||
"farbig": true,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
},
|
||||
{
|
||||
"artikel": "CAD - BODENSÄULE R 2\" - DURCHSTECKANKER KPL.",
|
||||
"sivas_id": 821004201,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "R 1\"",
|
||||
"teileart": "Geruest Saeule 1 Zoll",
|
||||
"dummy": "821004200.dwg",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "ROHR R 1\" 33,7 x 2,6",
|
||||
"sivas_id": 821006026,
|
||||
"farbig": true,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
},
|
||||
{
|
||||
"artikel": "CAD - BODENSÄULE R 1\" - BODENPLATTE KPL.",
|
||||
"sivas_id": 821004200,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -273,67 +296,78 @@
|
||||
"artikel": "KLEMMRING MIT MUFFE EINFACH KPL.",
|
||||
"sivas_id": 825002019,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 2
|
||||
},
|
||||
{
|
||||
"artikel": "KLEMMRING MIT MUFFE DOPPELT 90 Grad, KPL.",
|
||||
"sivas_id": 825002009,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 2
|
||||
},
|
||||
{
|
||||
"artikel": "KLEMMRING MIT MUFFE DOPPELT 180 Grad, KPL.",
|
||||
"sivas_id": 825002008,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 2
|
||||
},
|
||||
{
|
||||
"artikel": "KLEMMRING M. MUFFE DREIFACH 90 Grad/180 Grad KPL.",
|
||||
"sivas_id": 825002007,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 2
|
||||
},
|
||||
{
|
||||
"artikel": "KLEMMRING MIT LASCHE KPL. ZUSAMMENBAUZEICHNUNG",
|
||||
"sivas_id": 825002020,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 2
|
||||
},
|
||||
{
|
||||
"artikel": "QUERSCHELLE F. 1\" UND 2\" ROHR GESCHW./VZ. M. 4X M10X30 KPL.",
|
||||
"sivas_id": 825002022,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 2
|
||||
},
|
||||
{
|
||||
"artikel": "KREUZSCHELLE F. 2\" UND 1\" ROHR SCHWENKBAR 360 Grad",
|
||||
"sivas_id": 922083009,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 2
|
||||
},
|
||||
{
|
||||
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 1-ARMIG KPL.",
|
||||
"sivas_id": 821004051,
|
||||
"farbig": true,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 90 Grad KPL.",
|
||||
"sivas_id": 821004054,
|
||||
"farbig": true,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 180 Grad KPL.",
|
||||
"sivas_id": 821004052,
|
||||
"farbig": true,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
},
|
||||
{
|
||||
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 3-ARMIG KPL.",
|
||||
"sivas_id": 821004053,
|
||||
"farbig": true,
|
||||
"menge": 1
|
||||
"stueckzahl": 1,
|
||||
"anzahl_vorgabe": 1
|
||||
}
|
||||
],
|
||||
"konfigurationen": [
|
||||
@@ -353,7 +387,7 @@
|
||||
"oben": [
|
||||
{
|
||||
"artikel": "KLEMMRING MIT MUFFE EINFACH KPL.",
|
||||
"menge": 2
|
||||
"anzahl": 2
|
||||
}
|
||||
],
|
||||
"unten": []
|
||||
@@ -366,13 +400,13 @@
|
||||
"oben": [
|
||||
{
|
||||
"artikel": "KLEMMRING MIT MUFFE DOPPELT 90 Grad, KPL.",
|
||||
"menge": 2
|
||||
"anzahl": 2
|
||||
}
|
||||
],
|
||||
"unten": [
|
||||
{
|
||||
"artikel": "QUERSCHELLE F. 1\" UND 2\" ROHR GESCHW./VZ. M. 4X M10X30 KPL.",
|
||||
"menge": 2
|
||||
"anzahl": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -386,45 +420,49 @@
|
||||
"geometrie_varianten": [
|
||||
{
|
||||
"name": "WANDFLANSCH EINZELTEIL",
|
||||
"dummy": "821006031.dwg",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "WANDFLANSCH EINZELTEIL",
|
||||
"sivas_id": 821006031,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "WINKEL 60X60X6X60",
|
||||
"dummy": "821006042.dwg",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "WINKEL 60X60X6X60",
|
||||
"sivas_id": 821006042,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "WINKEL 60X60X6X300",
|
||||
"dummy": "821006043.dwg",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "WINKEL 60X60X6X300",
|
||||
"sivas_id": 821006043,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "ROHRSCHELLE 1\" OBERTEIL",
|
||||
"dummy": "825006009.dwg",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "ROHRSCHELLE 1\" OBERTEIL",
|
||||
"sivas_id": 825006009,
|
||||
"farbig": false,
|
||||
"menge": 1
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -432,29 +470,31 @@
|
||||
"anbaugruppen": [
|
||||
{
|
||||
"name": "Nylondübel 12x60 inkl. Holzschrauben",
|
||||
"anzahl_vorgabe": 2,
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "HOLZSCHRAUB,10X70, 6KT DIN 571 VZ",
|
||||
"sivas_id": 911271027,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1
|
||||
},
|
||||
{
|
||||
"artikel": "NYLON - DUEBEL 12X60 (TYP S)",
|
||||
"sivas_id": 922013003,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "HST M12X115X20",
|
||||
"anzahl_vorgabe": 2,
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "DURCHSTECKANKER HST M12X115X20 WANDABH.",
|
||||
"sivas_id": 922021003,
|
||||
"farbig": false,
|
||||
"menge": 2
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -466,7 +506,7 @@
|
||||
"oben": [
|
||||
{
|
||||
"artikel": "Nylondübel 12x60 inkl. Holzschrauben",
|
||||
"menge": 1
|
||||
"anzahl": 2
|
||||
}
|
||||
],
|
||||
"unten": []
|
||||
@@ -477,7 +517,7 @@
|
||||
"oben": [
|
||||
{
|
||||
"artikel": "HST M12X115X20",
|
||||
"menge": 1
|
||||
"anzahl": 2
|
||||
}
|
||||
],
|
||||
"unten": []
|
||||
|
||||
@@ -0,0 +1,193 @@
|
||||
{
|
||||
"Rohr-Gerüst-Träger": {
|
||||
"id": "Traeger",
|
||||
"titel": "Traeger",
|
||||
"teileart": "Geruest Traeger",
|
||||
"querstrebe": {
|
||||
"dummy": "dummy_Strebe_30x4.dwg",
|
||||
"abstand_max": 500,
|
||||
"rand_min": 100,
|
||||
"rand_max": 250
|
||||
},
|
||||
"muffe": {
|
||||
"dummy": "dummy_Muffe_1zoll.dwg"
|
||||
},
|
||||
"beschriftung": {
|
||||
"format": "%1 L=%2",
|
||||
"stil": "Lan",
|
||||
"ausrichtung": "BL",
|
||||
"hoehe": 100
|
||||
},
|
||||
"attribute": {
|
||||
"LAENGE": {
|
||||
"typ": "number",
|
||||
"min": 0,
|
||||
"max": 6000,
|
||||
"einheit": "mm"
|
||||
},
|
||||
"LAENGENABZUGANFANG": {
|
||||
"typ": "number",
|
||||
"einheit": "mm",
|
||||
"vorgabe": 35,
|
||||
"aktiv": false
|
||||
},
|
||||
"LAENGENABZUGENDE": {
|
||||
"typ": "number",
|
||||
"einheit": "mm",
|
||||
"vorgabe": 35,
|
||||
"aktiv": false
|
||||
},
|
||||
"TEILEFARBE": {
|
||||
"typ": "auswahl",
|
||||
"optionen": [
|
||||
"RAL7035",
|
||||
"RAL7030"
|
||||
],
|
||||
"frei_erlaubt": true,
|
||||
"frei_option": "Individuell"
|
||||
}
|
||||
},
|
||||
"geometrie_varianten": [
|
||||
{
|
||||
"name": "Rohr 1\"",
|
||||
"beschriftung": {
|
||||
"text": "Rohr 1\"",
|
||||
"layer": "D-6-BEM"
|
||||
},
|
||||
"teileart": "Geruest Traeger",
|
||||
"layer": "D-6",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "ROHR R 1\"",
|
||||
"sivas_id": 821006026,
|
||||
"farbig": true,
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Rohr 1\" mit Muffe",
|
||||
"beschriftung": {
|
||||
"text": "Rohr 1\"",
|
||||
"layer": "D-6-BEM"
|
||||
},
|
||||
"mit_muffe": true,
|
||||
"teileart": "Geruest Traeger",
|
||||
"layer": "D-6",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "ROHR R 1\" mit Muffe",
|
||||
"sivas_id": 825004000,
|
||||
"farbig": true,
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DRT 80 1\"",
|
||||
"beschriftung": {
|
||||
"text": "DRT 80",
|
||||
"layer": "D-1-BEM"
|
||||
},
|
||||
"teileart": "Geruest Traeger",
|
||||
"layer": "D-1",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "DRT DOPPELROHRTRAEGER 80 1\"",
|
||||
"sivas_id": 825084000,
|
||||
"farbig": true,
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DRT 80 1\" mit 2 Muffen",
|
||||
"beschriftung": {
|
||||
"text": "DRT 80",
|
||||
"layer": "D-1-BEM"
|
||||
},
|
||||
"mit_muffe": true,
|
||||
"teileart": "Geruest Traeger",
|
||||
"layer": "D-1",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "DRT DOPPELROHRTRAEGER 80 1\" mit 2 Muffen",
|
||||
"sivas_id": 825084007,
|
||||
"farbig": true,
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DRT 114 1\"",
|
||||
"beschriftung": {
|
||||
"text": "DRT 114",
|
||||
"layer": "D-3-BEM"
|
||||
},
|
||||
"teileart": "Geruest Traeger",
|
||||
"layer": "D-3",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "DRT DOPPELROHRTRAEGER 114 1\"",
|
||||
"sivas_id": 825104000,
|
||||
"farbig": true,
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "DRT 114 1\" mit 2 Muffen",
|
||||
"beschriftung": {
|
||||
"text": "DRT 114",
|
||||
"layer": "D-3-BEM"
|
||||
},
|
||||
"mit_muffe": true,
|
||||
"teileart": "Geruest Traeger",
|
||||
"layer": "D-3",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "DRT DOPPELROHRTRAEGER 114 1\" mit 2 Muffen",
|
||||
"sivas_id": 825104007,
|
||||
"farbig": true,
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "RT 80/80 1\"",
|
||||
"beschriftung": {
|
||||
"text": "RT 80/80",
|
||||
"layer": "D-5-BEM"
|
||||
},
|
||||
"teileart": "Geruest Traeger",
|
||||
"layer": "D-5",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "RT ROHRTRAEGER 80/80 1\"",
|
||||
"sivas_id": 825144000,
|
||||
"farbig": true,
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "RT 80/80 1\" mit 3 Muffen",
|
||||
"beschriftung": {
|
||||
"text": "RT 80/80",
|
||||
"layer": "D-5-BEM"
|
||||
},
|
||||
"mit_muffe": true,
|
||||
"teileart": "Geruest Traeger",
|
||||
"layer": "D-5",
|
||||
"teile": [
|
||||
{
|
||||
"artikel": "RT ROHRTRAEGER 80/80 1\" mit 3 Muffen",
|
||||
"sivas_id": 825144007,
|
||||
"farbig": true,
|
||||
"stueckzahl": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
// ============================================================
|
||||
// geruest_traeger.dcl - Rohr-Geruest-Traeger konfigurieren
|
||||
// Verwendet von: GERUEST_TRAEGER (GeruestInsert.lsp, geruest-traeger-dialog)
|
||||
//
|
||||
// Die Laenge steht bewusst NICHT im Dialog - sie wird nach dem Dialog in der
|
||||
// Zeichnung per Start-/Endpunkt (oder getippter Laenge) bestimmt. Aktive
|
||||
// Laengenabzuege ruecken die Linie am Anfang bzw. Ende ein.
|
||||
// ============================================================
|
||||
|
||||
geruest_traeger : dialog {
|
||||
label = "Rohr-Geruest-Traeger konfigurieren";
|
||||
|
||||
: boxed_column {
|
||||
label = "Basis";
|
||||
: popup_list { key = "variante"; label = "Variante:"; width = 56; }
|
||||
: row {
|
||||
: popup_list { key = "farbe"; label = "Farbe:"; width = 25; }
|
||||
: edit_box { key = "farbe_frei"; label = "eigene:"; edit_width = 12; }
|
||||
}
|
||||
}
|
||||
|
||||
: boxed_column {
|
||||
label = "Laengenabzug";
|
||||
: row {
|
||||
: toggle { key = "abzug_a"; label = "Laengenabzug Anfang"; width = 24; fixed_width = true; }
|
||||
: edit_box { key = "abzug_a_w"; label = "mm:"; edit_width = 8; fixed_width = true; }
|
||||
}
|
||||
: row {
|
||||
: toggle { key = "abzug_e"; label = "Laengenabzug Ende"; width = 24; fixed_width = true; }
|
||||
: edit_box { key = "abzug_e_w"; label = "mm:"; edit_width = 8; fixed_width = true; }
|
||||
}
|
||||
}
|
||||
|
||||
: toggle { key = "beschriftung"; label = "Beschriftung einfuegen"; }
|
||||
|
||||
: text { key = "hinweis"; label = ""; width = 56; }
|
||||
|
||||
ok_cancel;
|
||||
}
|
||||
@@ -0,0 +1,437 @@
|
||||
# JSON-Eingabe fuer den LISP-Bau
|
||||
|
||||
Welche Objekte sich aus einer JSON-Datei an einer gegebenen x/y/z-Koordinate
|
||||
erzeugen lassen, in welchem Format sie beschrieben werden und welche
|
||||
LISP-Routine sie baut. Grundlage sind die Testdaten in `tests/testdata/*.json`
|
||||
und die Treiber in `tests/test_*.lsp`, die sie lesen.
|
||||
|
||||
Die zugehoerigen LISP-Routinen mit Signaturen stehen in
|
||||
[lisp_methods.md](lisp_methods.md). Diese Seite ersetzt das fruehere
|
||||
`tests/testdata/object_data.md` (geloescht in Commit `e147b89`, auf das Code-
|
||||
Kommentare teilweise noch verweisen).
|
||||
|
||||
---
|
||||
|
||||
## 0. Uebersicht
|
||||
|
||||
| Objekt | Erkennungsmerkmal im JSON | Bau-Routine (Produktion) | Koordinaten-Eingang | Beispiel-Datei |
|
||||
|---|---|---|---|---|
|
||||
| [Kreisel (Insert)](#1-kreisel) | `"function": "insert"`, KEIN `block` | `kreisel-insert-script` | `x`,`y`,`z` = Einfuegepunkt | `kreisel_tests.json`, `mubea.json`, `hundm05.json`, `dematic_arvato.json` |
|
||||
| [Kreisel (Connect)](#12-connect-start--und-endpunkt) | `"function": "connect"` | `kreisel-connect-script` | `start_*`, `end_*` | (nur `test_kreisel.lsp`, z.Z. kein Datensatz) |
|
||||
| [Einzelblock](#2-einzelbloecke-separator-scanner-btmt-eingangausgang-vario-bausteine) (Separator, Scanner, BTMT, Eingang/Ausgang, Vario-Bausteine) | `"function": "insert"` + `"block"` | direktes `_.INSERT` nach `ssg-ils-block-laden` | `x`,`y`,`z` + `rotation` | `mubea.json`, `hundm05.json`, `dematic_arvato.json` |
|
||||
| [VarioFoerderer Standard](#3-variofoerderer-standard-und-etage) | `test_id` beginnt mit `VF_`, `typ` fehlt oder `"standard"` | `berechne-alle-winkel` + `variofoerderer-einfuegen` + `vf-block-erstellen` | `x`,`y`,`z` = KS_EIN des AS-Elements | `mubea.json`, `foerderer_tests.json` |
|
||||
| [VarioFoerderer Etage](#3-variofoerderer-standard-und-etage) | `test_id` `VF_*` + `"typ": "etage"` | `berechne-etage` + `etage-foerderanlage-einfuegen` + `vf-block-erstellen` | wie Standard | `mubea.json` |
|
||||
| [Gefaellestrecke Modus 1](#4-gefaellestrecke) | `test_id` `GF_*` bzw. `"modus": 1` | `gefaellestrecke-einfuegen` (bzw. `gf-rebuild`) | `start_mm` = KS_EIN des AS-Elements | `mubea.json`, `gefaellestrecke_tests.json` |
|
||||
| [Gefaellestrecke Modus 2](#42-modus-2---richtung-aus-zwei-punkten) | `"modus": 2` | wie Modus 1, `deltaL`/`hz` aus zwei Punkten | `start_mm` + `linie_start_mm`/`linie_ende_mm` | `gefaellestrecke_tests.json` |
|
||||
| [Gefaellestrecke Modus 3](#43-modus-3---linienzug) | `"modus": 3` | nur ueber `test_gefaellestrecke.lsp` | `start_mm`, `ende_mm`, `bogen` | `gefaellestrecke_tests.json` |
|
||||
| [VF-Linienzug-Kette (Spec)](#5-vf-linienzug-kette-spec) | Kopf mit `spec_id`, danach `glied`/`sub` | `vsp-bau-aus-spec` (Replay durch `vf-linienzug-modus`) | `start_punkt` = Kettenanfang | `hundm05.json` |
|
||||
| [VF-Linienzug (Journal)](#6-vf-linienzug-eingabe-journal) | Kopf mit `test_id`, danach `typ` = `point_abs`/`real`/`string`/... | `vfl-journal-replay-start` + `vf-linienzug-modus` | erstes `point_abs` | `linienzug_tests.json`, `hm_recformat.json` |
|
||||
| [Omniflo Bogen/Weiche](#71-bogen-und-weiche) | `"type": "bogen"` / `"weiche"` + `sivasnr` | `_.INSERT` der `<sivasnr>.dxf` (Kern `omni:insert-dxf` fragt den Punkt interaktiv) | `x`,`y`, Z = `hoehe` | `omniflo_tests.json`, `omniflo_strecke_tests.json` |
|
||||
| [Omniflo Gerade](#72-aluprofil-gerade) | `"type": "gerade"` + `profil` | `omni:make-gerade` | `x`,`y` -> `x_ende`,`y_ende`, Z = `hoehe` | `omniflo_strecke_tests.json` |
|
||||
| [Waagrechte Foerderstrecke](#8-waagrechte-foerderstrecke-gerade---noch-ohne-bau-pfad) | `"typ": "gerade"` + `startpunkt` | **kein Bau-Pfad** (wird gemeldet und uebersprungen) | `startpunkt`, `endpunkt` | `dematic_arvato.json` |
|
||||
|
||||
Nicht aus JSON baubar (es gibt keine Testdaten und keinen Treiber): Eckrad,
|
||||
Geruest, TEF-Foerderer-Linie, TRO-Marker, Connections, Omniflo-Ladeschleife.
|
||||
Fuer Eckrad und Geruest existiert ein skriptfaehiger Kern, siehe
|
||||
[lisp_methods.md](lisp_methods.md).
|
||||
|
||||
### Allgemeine Regeln
|
||||
|
||||
- **Einheiten**: Laengen und Koordinaten in **mm**, Winkel in **Grad**.
|
||||
Fahrtrichtung `hz`: 0 = +X (Ost), 90 = +Y (Nord), 180 = -X, 270 = -Y.
|
||||
- **Z ist absolut**: `z` (bzw. Z in `start_mm`/`start_punkt`) ist die
|
||||
Weltkoordinate des Einfuegepunkts, also die Einbauhoehe.
|
||||
- **Dimension 2D/3D**: Gebaut wird in der aktuellen Dimension
|
||||
(`ssg-ils-dim-aktuell`: `*ssg-ils-dim*` -> `DXFM_DIM`, Default 3D).
|
||||
Das Feld `darstellung` in `dematic_arvato.json` ist reine Dokumentation und
|
||||
wird nicht ausgewertet; `TEST_HUNDM05_2D`/`_3D` erzwingen die Dimension.
|
||||
- **Flaches JSON**: Die meisten Dateien werden mit `ssg-load-json` gelesen
|
||||
(zeilenweise, ein Objekt je `{`). Verschachtelte Objekte und mehrzeilige
|
||||
Arrays darin funktionieren nicht - darum stehen z.B. die Glieder einer
|
||||
Kette als eigene Objekte hinter ihrem Kopf-Objekt. Ausnahme:
|
||||
`TEST_DEMATIC_ARVATO` liest mit dem rekursiven `ssg-json-laden`.
|
||||
- **Reine Doku-Felder**: `comment`, `beschreibung`, `description`, `quelle`,
|
||||
`row`, `seq`, `gruppe`, `assigned_to`, `hoehe_unbekannt`, `darstellung`
|
||||
sowie alle `expect_*`/`erwartung_*`-Felder werden beim Bau nicht gelesen.
|
||||
`expect_*` pruefen die Python-Tests gegen das Ergebnis.
|
||||
- **Template-Felder** (nur `test_mubea.lsp`): `anzahl`, `delta_x`, `delta_y`
|
||||
erzeugen aus einem Eintrag `anzahl` Kopien, jeweils um `delta_x`/`delta_y`
|
||||
versetzt; `test_id` bekommt dann das Suffix `_01` ... `_nn`. Gilt fuer VF,
|
||||
GF und Einzelbloecke.
|
||||
|
||||
---
|
||||
|
||||
## 1. Kreisel
|
||||
|
||||
Block `KREISEL_n`, gebaut von `KreiselInsert.lsp`.
|
||||
|
||||
### 1.1 Insert (freier Punkt)
|
||||
|
||||
```json
|
||||
{ "id": "KR_Kreuz_Q1_0Grad", "function": "insert",
|
||||
"x": 500, "y": 500, "z": 2500,
|
||||
"abstand": 2000, "rotation": 0.0, "typ": "STANDARD" }
|
||||
```
|
||||
|
||||
| Feld | Pflicht | Bedeutung | Default |
|
||||
|---|---|---|---|
|
||||
| `id` | ja (fuer den Treiber) | Kennung im Ergebnis; NICHT die Block-ID (die vergibt `ssg-id-generate`) | - |
|
||||
| `function` | ja | `"insert"`; ohne `block` = Kreisel | - |
|
||||
| `x`, `y` | ja | Einfuegepunkt. Liegt auf der Kreiselachse **einen Radius (400 mm) vor der Mitte des Antriebsrads (AN)**, also am aeussersten Punkt der AN-Seite | - |
|
||||
| `z` | ja | Einbauhoehe; wird als `hoehe` uebergeben und in das Attribut `HOEHE` geschrieben | `kreisel.default_hoehe` (2000) |
|
||||
| `abstand` | ja | Mittenabstand Antriebsrad - Spannrad | `kreisel.default_laenge` (2300) |
|
||||
| `rotation` | nein | Drehung der Achse AN -> SP, frei (kein Raster) | 0.0 |
|
||||
| `typ` | nein | `"STANDARD"` oder `"PIN"` -> Attribut `KREISELART` | `"STANDARD"` |
|
||||
|
||||
Treiber: `kreisel:run-insert-test` (`test_kreisel.lsp`), `mubea:build-kreisel`,
|
||||
`hundm05:bau-kreisel` (auch fuer `dematic_arvato.json`).
|
||||
|
||||
### 1.2 Connect (Start- und Endpunkt)
|
||||
|
||||
```json
|
||||
{ "id": "K2", "function": "connect",
|
||||
"start_x": 0, "start_y": 0, "start_z": 2000,
|
||||
"end_x": 5000, "end_y": 0, "end_z": 2000, "typ": "STANDARD" }
|
||||
```
|
||||
|
||||
`start_*` und `end_*` sind die aeussersten Punkte der AN- bzw. SP-Seite.
|
||||
`abstand` (= Distanz - Kreiseldurchmesser 800) und `rotation` werden daraus
|
||||
berechnet. Die Einbauhoehe kommt aus `start_z`. Nur `test_kreisel.lsp` kennt
|
||||
`connect`; die anderen Treiber bauen ausschliesslich `insert`.
|
||||
|
||||
---
|
||||
|
||||
## 2. Einzelbloecke (Separator, Scanner, BTMT, Eingang/Ausgang, Vario-Bausteine)
|
||||
|
||||
Jeder Eintrag mit `"function": "insert"` UND `"block"` wird als einzelner
|
||||
Block eingefuegt, ohne Wrapper-Block und ohne Verkettung.
|
||||
|
||||
```json
|
||||
{ "id": "HundM05_SCANNER_02", "function": "insert", "block": "Scanner",
|
||||
"x": 4095.5, "y": 1164.1, "z": 2154, "rotation": 270 }
|
||||
```
|
||||
|
||||
| Feld | Pflicht | Bedeutung | Default |
|
||||
|---|---|---|---|
|
||||
| `block` | ja | Blockname OHNE `_2D`/`_3D`-Suffix | - |
|
||||
| `x`, `y`, `z` | ja | Einfuegepunkt = **Basispunkt der Block-DWG** (nicht KS_EIN) | - |
|
||||
| `rotation` | nein | Drehung um Z | 0 |
|
||||
| `id` / `test_id` | nein | Kennung im Ergebnis | `SEPARATOR_<n>` bzw. Blockname |
|
||||
|
||||
Ablauf: `ssg-ils-block-laden` loest den Namen auf `data/ils/<block>_<DIM>.dwg`
|
||||
auf (3D-Fallback), danach `_.INSERT eff pt "" "" rotation` und
|
||||
`ssg-id-generate`. **Fehlt die DWG, wird `Separator_SP` eingefuegt.**
|
||||
Treiber: `mubea:build-separator`, `hundm05:bau-sensor` (auch Dematic).
|
||||
Das Layer-Attribut `LAYER` wird dabei nicht angewendet; der Block landet auf
|
||||
dem aktuellen Layer.
|
||||
|
||||
### In den Testdaten verwendete Blocknamen
|
||||
|
||||
| `block` | DWG in `data/ils` | Verwendet in | Hinweis |
|
||||
|---|---|---|---|
|
||||
| `Scanner` | `Scanner_2D/_3D.dwg` | mubea, hundm05, dematic_arvato | |
|
||||
| `Separator_SP` | `Separator_SP_2D/_3D.dwg` | (Fallback) | Block von `ILS_SEPARATOR_INSERT` |
|
||||
| `S-LP` | **fehlt** | mubea, hundm05, dematic_arvato | wird zu `Separator_SP` |
|
||||
| `S-SP` | **fehlt** | dematic_arvato | wird zu `Separator_SP` |
|
||||
| `BTMT-Beladung` | `BTMT-Beladung_2D/_3D.dwg` | mubea, hundm05 | wie `ILS_BTMT_Beladung` |
|
||||
| `SC_Entladung` | `SC_Entladung_2D/_3D.dwg` | mubea, hundm05 | wie `ILS_BTMT_Entladung` |
|
||||
| `Eingang` / `Ausgang` | `Eingang_*/Ausgang_*.dwg` | mubea | Symbole wie `ILS_EINGANG_INSERT`/`ILS_AUSGANG_INSERT` |
|
||||
| `AS_Element_90_links` / `_rechts` | vorhanden | dematic_arvato | loses AS-Element (sonst Teil eines VF/GF) |
|
||||
| `ES_Element_90_rechts`, `ES_Element_30_rechts` | vorhanden | dematic_arvato | loses ES-Element |
|
||||
| `Vario_Motorstation_500mm_rechts` | vorhanden | dematic_arvato | lose Motorstation |
|
||||
| `Vario_Umlenkstation_500mm_rechts` | vorhanden | dematic_arvato | lose Umlenkstation |
|
||||
| `Vario_Kurve_rechts_30_TEF_aussen` | vorhanden | dematic_arvato | lose Vario-Kurve |
|
||||
|
||||
Grundsaetzlich ist **jeder** Blockname aus `data/ils` erlaubt (es gibt keine
|
||||
Whitelist). Die losen AS/ES-/Vario-Bausteine bilden aber keine Kette und keinen
|
||||
`VF_n`/`GF_n`-Block - fuer eine zusammenhaengende Strecke Abschnitt 3-5 nutzen.
|
||||
|
||||
---
|
||||
|
||||
## 3. VarioFoerderer Standard und Etage
|
||||
|
||||
Block `VF_n`. Eingang sind die **Gesamtmasse** der Anlage; Winkel und
|
||||
Teillaengen berechnet der Solver.
|
||||
|
||||
```json
|
||||
{ "test_id": "VF_Schnitt_C", "richtung": "Auf",
|
||||
"deltaL": 9110, "deltaH": 474, "winkel": 21,
|
||||
"gf_verteilung": "manuell", "L_GF1": 2298, "seite": "links",
|
||||
"hz": 0.0, "x": 400, "y": 14120, "z": 1554 }
|
||||
```
|
||||
|
||||
| Feld | Pflicht | Bedeutung | Default |
|
||||
|---|---|---|---|
|
||||
| `test_id` | ja | muss mit `VF_` beginnen (steuert den Dispatcher in `test_mubea.lsp`) | - |
|
||||
| `typ` | nein | `"standard"` (AS/ES 90 Grad) oder `"etage"` (AS/ES 30 Grad, uebereinander) | `"standard"` |
|
||||
| `richtung` | ja | `"Auf"` oder `"Ab"` | - |
|
||||
| `deltaL` | ja | horizontale Gesamtlaenge inkl. AS/ES, Boegen, GF-Vor-/Nachlauf | - |
|
||||
| `deltaH` | ja | Hoehendifferenz (Betrag; Vorzeichen kommt aus `richtung`) | - |
|
||||
| `winkel` | nein | Bogenwinkel erzwingen, nur aus der Kandidatenliste (`vario.bogen_winkel`: 3, 6, 9, 12, 15, 18, 21, 27, 33, 39, 45, 51). Ist er nicht loesbar, wird NICHT gebaut | kleinster gueltiger Winkel |
|
||||
| `L_GF1` | nein (mubea) | Vorlauf-Laenge (GF vor dem Foerderer); Nachlauf = Rest von `L_GF` | - |
|
||||
| `gf_verteilung` | nein (foerderer) | `"gleichmaessig"`, `"vorne"`, `"hinten"`; in `mubea.json` nur Doku (dort zaehlt `L_GF1`) | `"gleichmaessig"` |
|
||||
| `seite` | nein | `"links"`/`"rechts"` (Seite der AS/ES-Elemente) | `"links"` |
|
||||
| `hz` | nein | Fahrtrichtung | 0.0 |
|
||||
| `x`, `y`, `z` | ja (mubea) | Startpunkt = **KS_EIN des AS-Elements**; `z` = Einbauhoehe am Anfang | - |
|
||||
|
||||
Hinweise:
|
||||
- `foerderer_tests.json` hat statt `x/y/z` einen Kopf-Eintrag
|
||||
`{"y_abstand": 600}`: alle Foerderer starten bei x = 0, z = 0 und werden um
|
||||
`y_abstand` versetzt. Dieses Format kennt nur `test_foerderer.lsp`.
|
||||
- `"Ab"` mit `deltaH` < 1 ist geometrisch unmoeglich und wird abgewiesen.
|
||||
- Der Treiber schreibt nach dem Bau `vf-edit-xdata-schreiben` (Typ + `hz`),
|
||||
damit der Block per Doppelklick editierbar ist.
|
||||
|
||||
---
|
||||
|
||||
## 4. Gefaellestrecke
|
||||
|
||||
Block `GF_n`: AS-Element -> Staustrecke (skaliert) -> Separator -> ES-Element.
|
||||
Eingang ist die **horizontale Laenge**, nicht die Hoehendifferenz - die ergibt
|
||||
sich aus Laenge und Neigung.
|
||||
|
||||
### 4.1 Modus 1 - Werteingabe
|
||||
|
||||
```json
|
||||
{ "test_id": "GF_Mubea", "modus": 1,
|
||||
"deltaL_mm": 9110, "hz_grad": 180.0, "winkel_grad": 2.27,
|
||||
"start_mm": [9510, 12300, 2028],
|
||||
"as_seite": "links", "es_seite": "links",
|
||||
"as_winkel": "90", "es_winkel": "90" }
|
||||
```
|
||||
|
||||
| Feld | Pflicht | Bedeutung | Default |
|
||||
|---|---|---|---|
|
||||
| `test_id` | ja | in `mubea.json` muss sie mit `GF_` beginnen | - |
|
||||
| `modus` | nein | `1` | - |
|
||||
| `deltaL_mm` | ja | horizontale Gesamtlaenge AS + Staustrecke + Separator + ES | - |
|
||||
| `winkel_grad` | nein | Neigung der Staustrecke | 3.0 |
|
||||
| `hz_grad` | nein | Fahrtrichtung | 0.0 |
|
||||
| `start_mm` | ja | `[x, y, z]` = **KS_EIN des AS-Elements**; Z = Einbauhoehe oben | - |
|
||||
| `as_seite`, `es_seite` | nein | `"links"`/`"rechts"` | `"links"` |
|
||||
| `as_winkel`, `es_winkel` | nein | `"90"` oder `"30"` (als STRING) | `"90"` |
|
||||
|
||||
Die Staustrecke ergibt sich aus
|
||||
`L_stau = (deltaL - aus-dx - ein-dx - 300 * cos(w)) / cos(w)`
|
||||
(300 = `gefaelle.separator_breite`). Eine Ziel-Hoehe gibt es nicht.
|
||||
|
||||
In `gefaellestrecke_tests.json` stehen `deltaL_mm`, `winkel_grad` und
|
||||
`z_start_mm` in einem gemeinsamen Kopf-Eintrag ohne `test_id` und gelten fuer
|
||||
alle Faelle der Datei.
|
||||
|
||||
### 4.2 Modus 2 - Richtung aus zwei Punkten
|
||||
|
||||
Wie Modus 1, aber `deltaL` und `hz` werden aus `linie_start_mm` ->
|
||||
`linie_ende_mm` berechnet (nur X/Y). `start_mm` bleibt der Einfuegepunkt und
|
||||
ist unabhaengig von der Linie.
|
||||
|
||||
```json
|
||||
{ "test_id": "M2_hz000", "modus": 2, "start_mm": [0, -35000, 5000],
|
||||
"linie_start_mm": [0, -35000, 0], "linie_ende_mm": [10000, -35000, 0],
|
||||
"as_seite": "links", "es_seite": "links", "as_winkel": "90", "es_winkel": "90" }
|
||||
```
|
||||
|
||||
### 4.3 Modus 3 - Linienzug
|
||||
|
||||
In der Produktion nicht skriptbar (`gf-linienzug-modus` waehlt vorgezeichnete
|
||||
LINE/ARC-Objekte per Maus). `test_gefaellestrecke.lsp` zeichnet die Leitlinie
|
||||
selbst und baut sie nicht-interaktiv nach. Zwei Formen:
|
||||
|
||||
```json
|
||||
{ "test_id": "M3_Bogen", "modus": 3,
|
||||
"start_mm": [30000, -50000, 2000], "ende_mm": [38500, -43500, 1800],
|
||||
"bogen": {"winkel_grad": 90, "radius_mm": 500, "seite": "links"},
|
||||
"as_seite": "links", "es_seite": "links", "as_winkel": "90", "es_winkel": "90" }
|
||||
{ "test_id": "M3_hz270", "modus": 3, "richtung": "Sued",
|
||||
"start_mm": [0, -50000, 5000],
|
||||
"deltaH_quelle": "M2_hz000", "deltaL_quelle": "M2_hz000", ... }
|
||||
```
|
||||
|
||||
`deltaH_quelle`/`deltaL_quelle` uebernehmen die Masse eines frueher gebauten
|
||||
Falls. Dieses Format ist an den Treiber gebunden. Fuer neue Anlagen besser
|
||||
eine VF-Linienzug-Spec (Abschnitt 5) mit `Linie-GF`/`GF-Bogen` verwenden.
|
||||
|
||||
---
|
||||
|
||||
## 5. VF-Linienzug-Kette (Spec)
|
||||
|
||||
Beliebige Ketten aus GF-Linien, GF-Boegen, Vario-Kurven und VF-Einheiten,
|
||||
**ohne Dialog** gebaut (`VF_SPEC_BAU`, `TEST_HUNDM05`). Eine Kette = ein
|
||||
Kopf-Objekt, danach ihre Glieder (`glied`) und deren Unterknoten (`sub`) in
|
||||
Baureihenfolge. Ergebnis ist ein `VF_n`-Block mit vollem `SSG_VF_EDIT`-Journal
|
||||
(per Doppelklick editierbar).
|
||||
|
||||
```json
|
||||
{ "spec_id": "VF_spec_LZ_01", "modus": 1,
|
||||
"start_punkt": [4912.2, 1230.9, 2154.0], "start_hoehe": 2154.0,
|
||||
"as": 1, "as_winkel": "90", "as_seite": "links" }
|
||||
{ "glied": "Linie-GF", "nr": 1, "dl": 2249.3, "hz": 90.0,
|
||||
"gefaelle": "winkel", "winkel": 3.0, "ende": "nein" }
|
||||
{ "glied": "Horizontal-VF", "nr": 2, "dl": 3256.9, "gf_verteilung": "einlauf",
|
||||
"vf_sep_vor": 0, "vf_sep_nach": 0, "vf_ende": "nein", "vf_separator": 0 }
|
||||
{ "sub": "vario-kurve", "winkel": 90, "seite": "rechts", "variante": "innen" }
|
||||
{ "sub": "motorstation" }
|
||||
{ "glied": "ES", "winkel": "90", "seite": "links" }
|
||||
```
|
||||
|
||||
**Kopf**
|
||||
|
||||
| Feld | Bedeutung |
|
||||
|---|---|
|
||||
| `spec_id` | Kennung der Kette |
|
||||
| `modus` | `1` (nur Modus 1 hat einen Uebersetzer) |
|
||||
| `start_punkt` | `[x, y, z]` Kettenanfang (KS_EIN des AS-Elements bzw. erstes Glied) |
|
||||
| `start_hoehe` | Einbauhoehe am Start |
|
||||
| `as` | `1` = AS-Element setzen, `0` = nicht |
|
||||
| `as_winkel` / `as_seite` | `"90"`/`"30"` bzw. `"links"`/`"rechts"` |
|
||||
|
||||
**Glieder** (`glied`)
|
||||
|
||||
| `glied` | wichtigste Felder |
|
||||
|---|---|
|
||||
| `Linie-GF` | `dl`, `hz` (nur beim ersten Glied der Kette), `laenge_modus` (`endpunkt`/`hoehe`/`steigend`), `ende` (`ja-mit-es`/`ja-ohne-es`/`nein`), `sep_vor`, `sep_nach`, `gefaelle` (`hoehe`/`winkel`) + `hoehe` bzw. `winkel` |
|
||||
| `GF-Bogen` | `winkel` (30/60/90), `seite` |
|
||||
| `Vario-Kurve` | als eigenes Glied (Kettenanfang) vom Uebersetzer noch NICHT unterstuetzt -> Spec-Fehler; Vario-Kurven als `sub` einer VF-Einheit angeben |
|
||||
| `Horizontal-VF` | `dl`, `eingang_hoehe`, `gf_verteilung` (`haelfte`/`einlauf`), `vf_sep_vor`, `vf_sep_nach`, `vf_ende` (`ja-mit-es`/`nein`/`automatisch`/`zielpunkt-ohne-es`), `vf_separator` (nur bei `vf_ende` = `nein`) + `sub`-Knoten |
|
||||
| `Linie-VF` | `dl`, `hoehe`, optional `winkel_idx` + `sub`-Knoten |
|
||||
| `Linie` | `dl`, `hoehe`, `segment_typ` (`GF`/`VF`), optional `winkel_idx` |
|
||||
| `ES` | `winkel` (`"90"`/`"30"`), `seite` |
|
||||
|
||||
**Unterknoten einer VF-Einheit** (`sub`): `horizontal` (`sep_vor`, `sep_nach`),
|
||||
`vario-kurve` (`winkel`, `seite`, `variante` `aussen`/`innen`), `auf-ab`
|
||||
(`richtung` `auf`/`ab`, `hoehe`), `motorstation`, `kettenende` (`es`,
|
||||
`es_winkel`, `es_seite`).
|
||||
|
||||
Ja/Nein-Felder (`as`, `sep_vor`, `vf_sep_vor`, `es`, ...) als `1`/`0` oder
|
||||
`"ja"`/`"nein"`; mehrwertige Felder (`ende`, `vf_ende`) nur mit den genannten
|
||||
Woertern. Vollstaendige Regeln
|
||||
(Menue-Codes je Frame, `hz` nur einmal, Verhalten bei `winkel_idx`):
|
||||
[variofoerderer.md, Abschnitt 8b](variofoerderer.md#spec-pfad-kette-aus-eingabedaten-vf_spec_bau).
|
||||
Die Spec wird nicht von Hand geschrieben, sondern mit
|
||||
`python lib/vf_spec_export.py <protokoll.json> <spec.json>` aus einer
|
||||
aufgezeichneten Kette erzeugt. Fehlerhafte Specs werden komplett abgewiesen
|
||||
(`vsp-pruefen` sammelt alle Fehler, gebaut wird dann nichts).
|
||||
|
||||
**Andere Objekte in derselben Datei**: Neben den Ketten darf `hundm05.json`
|
||||
Kreisel (Abschnitt 1) und Einzelbloecke (Abschnitt 2) enthalten. Erkennbar
|
||||
sind sie an `function`; `vsp-gruppieren` ueberspringt sie, und
|
||||
`hundm05:bau-zusatzobjekte` baut sie nach den Ketten. `vf_spec_export.py`
|
||||
haengt sie beim Neuerzeugen unveraendert ans Dateiende.
|
||||
|
||||
---
|
||||
|
||||
## 6. VF-Linienzug (Eingabe-Journal)
|
||||
|
||||
Das Rohformat hinter der Spec: die Antworten auf die Fragen des interaktiven
|
||||
Linienzug-Ablaufs, in Reihenfolge. Nur fuer Regressionstests gedacht - fuer
|
||||
neue Anlagen die Spec (Abschnitt 5) verwenden.
|
||||
|
||||
```json
|
||||
{ "test_id": "VF_hundm05_LZ_01", "anlagetyp": "linienzug", "modus": 1, ... }
|
||||
{ "typ": "point_abs", "wert": [4912.2, 1230.9, 2154.0], "kommentar": "Startpunkt" }
|
||||
{ "typ": "real", "wert": 2154.0, "kommentar": "Hoehe (Z)" }
|
||||
{ "typ": "string", "wert": "1", "kommentar": "AS-Element? Ja" }
|
||||
{ "typ": "step", "wert": "Linie-GF", "kommentar": "Glied-Marker" }
|
||||
{ "typ": "point_rel", "dL": 2249.3, "hz": 90.0, "kommentar": "Endpunkt" }
|
||||
{ "typ": "int", "wert": 90, "kommentar": "Vario-Kurve Winkel" }
|
||||
```
|
||||
|
||||
`typ`: `point_abs` (absoluter Punkt), `point_rel` (Abstand `dL` + Richtung
|
||||
`hz`, `hz` nur beim ersten Segment), `real`, `int`, `string` (Menue-Code als
|
||||
String), `step` (Glied-Marker, beim Replay uebersprungen). Kopf-Feld heisst
|
||||
`anlagetyp`, nicht `typ`, damit Kopf und Eingabe unterscheidbar bleiben.
|
||||
|
||||
| Datei | Treiber |
|
||||
|---|---|
|
||||
| `linienzug_tests.json`, `linienzug_tests_stufe2.json` | `TEST_LINIENZUG`, `TEST_LINIENZUG_STUFE2` |
|
||||
| `hm_recformat.json` (5 echte HundM-Ketten, erzeugt mit `lib/vf_journal_export.py`) | `TEST_HM_RECFORMAT` (in `alltests.json` abgeschaltet) |
|
||||
|
||||
---
|
||||
|
||||
## 7. Omniflo
|
||||
|
||||
### 7.1 Bogen und Weiche
|
||||
|
||||
```json
|
||||
{ "id": "821104025", "type": "bogen", "sivasnr": "821104025",
|
||||
"x": 219.4, "y": 223.06, "hoehe": 2000, "drehung": 0.0 }
|
||||
```
|
||||
|
||||
| Feld | Pflicht | Bedeutung | Default |
|
||||
|---|---|---|---|
|
||||
| `type` | ja | `"bogen"` oder `"weiche"` | - |
|
||||
| `sivasnr` | ja | Sivas-Nummer = Dateiname `%DXFM_OMNIFLO%/<sivasnr>.dxf` | - |
|
||||
| `x`, `y` | ja | Einfuegepunkt (`$INSBASE` der DXF, gesetzt mit `set_einfuegepkt.py`) | - |
|
||||
| `hoehe` | nein | Z des Einfuegepunkts UND Attribut `HOEHE` | 2000 |
|
||||
| `drehung` | nein | Drehung + Attribut `DREHUNG` | 0 |
|
||||
|
||||
Es gibt kein `z`: die Hoehe ist zugleich die Z-Koordinate. Gueltige
|
||||
Sivas-Nummern: `data/json/omniflo_boegen.json`, `omniflo_weichen.json`.
|
||||
Treiber: `omni:test-insert` (`test_omniflo.lsp`), `omnistr:insert-bogen`
|
||||
(`test_omniflo_strecke.lsp`).
|
||||
|
||||
### 7.2 Aluprofil-Gerade
|
||||
|
||||
```json
|
||||
{ "seq": 1, "type": "gerade", "profil": "AP110", "laenge": 1000.0,
|
||||
"x": 2000.0, "y": 0.0, "x_ende": 3000.0, "y_ende": 0.0,
|
||||
"drehung": 0.0, "hoehe": 2000, "id": "0003" }
|
||||
```
|
||||
|
||||
`profil` = `"AP60"`, `"AP110"` oder `"APG110"`. Die Gerade laeuft von
|
||||
(`x`,`y`) nach (`x_ende`,`y_ende`) auf Z = `hoehe`; Laenge und Drehung folgen
|
||||
aus den Punkten (`laenge` ist nur Doku). Gebaut mit `omni:make-gerade`.
|
||||
|
||||
---
|
||||
|
||||
## 8. Waagrechte Foerderstrecke (`gerade`) - noch ohne Bau-Pfad
|
||||
|
||||
```json
|
||||
{ "test_id": "GERADE_Arvato_01", "typ": "gerade", "laenge": 8313.39, "hz": 90.0,
|
||||
"startpunkt": [2334.97, 177818.67, 0.0], "endpunkt": [2334.96, 186132.06, 0.0] }
|
||||
```
|
||||
|
||||
Ein Antriebs-/Umlenkstation-Paar ohne Hoehendifferenz, so von
|
||||
`lib/dxf_scan_components.py` ausgegeben (ein VarioFoerderer ist bei
|
||||
`deltaH` = 0 nicht loesbar). `TEST_DEMATIC_ARVATO` meldet diese Eintraege und
|
||||
ueberspringt sie. Passende Primitive waere `insert-hz-scaled-block-by-ks`
|
||||
(`vf_etage.lsp`) mit `Staustrecke_SP_1000_mm`, siehe
|
||||
[lisp_methods.md](lisp_methods.md).
|
||||
|
||||
---
|
||||
|
||||
## 9. Testdaten-Dateien im Ueberblick
|
||||
|
||||
| Datei | Inhalt | Treiber / Befehl |
|
||||
|---|---|---|
|
||||
| `kreisel_tests.json` | 8 Kreisel (`insert`) | `TEST_KREISEL` |
|
||||
| `foerderer_tests.json` | Kopf `y_abstand` + 17 VF Standard | `TEST_FOERDERER` |
|
||||
| `gefaellestrecke_tests.json` | Kopf + GF Modus 1/2/3 | `TEST_GEFAELLESTRECKE` |
|
||||
| `omniflo_tests.json` | 27 Boegen, 80 Weichen | `TEST_OMNIFLO` |
|
||||
| `omniflo_strecke_tests.json` | Streckenzug aus Geraden und Boegen | `TEST_OMNIFLO_STRECKE` |
|
||||
| `linienzug_tests.json` / `_stufe2.json` | Eingabe-Journal je einer Kette | `TEST_LINIENZUG` / `TEST_LINIENZUG_STUFE2` |
|
||||
| `hm_recformat.json` | 5 HundM-Ketten als Journal | `TEST_HM_RECFORMAT` |
|
||||
| `hundm05.json` | 5 HundM-Ketten als Spec + Kreisel, Separatoren, Scanner, BTMT | `TEST_HUNDM05`, `VF_SPEC_BAU` |
|
||||
| `mubea.json` | Gesamtanlage: Kreisel, VF Standard/Etage, GF-Template (20 Stueck), Separatoren, Scanner, BTMT, Eingang/Ausgang | `TEST_MUBEA` |
|
||||
| `dematic_arvato.json` | Vorlage aus `dxf_scan_components.py`: Kreisel, Einzelbloecke, `gerade` (Hoehen fehlen) | `TEST_DEMATIC_ARVATO` (abgeschaltet) |
|
||||
| `hundm05_linienzug_polylines.json` | Polylinien aus `extract_polylines.py` | kein Treiber (Analyse-Daten) |
|
||||
| `vfl_journal_hm05_abbruch.json` | rohes Journal (`kind`/`value`) eines abgebrochenen Baus | kein Treiber |
|
||||
|
||||
---
|
||||
|
||||
## 10. Eigene Anlage beschreiben - Kurzanleitung
|
||||
|
||||
1. Kreisel als `insert` (Abschnitt 1): `x/y` am aeussersten Punkt der AN-Seite,
|
||||
`z` = Einbauhoehe.
|
||||
2. Einfache Steig-/Fall-Strecken mit fester Form als VF Standard/Etage
|
||||
(Abschnitt 3) bzw. Gefaellestrecke Modus 1 (Abschnitt 4.1), Startpunkt
|
||||
jeweils = KS_EIN des AS-Elements.
|
||||
3. Ketten mit Kurven, mehreren VF-Einheiten oder GF-Boegen als Spec
|
||||
(Abschnitt 5) - am einfachsten eine Kette einmal interaktiv bauen, mit
|
||||
`lib/vf_journal_export.py` + `lib/vf_spec_export.py` als Spec exportieren
|
||||
und Startpunkt/Laengen anpassen.
|
||||
4. Separatoren, Scanner, BTMT-Stationen, Eingang/Ausgang als Einzelblock
|
||||
(Abschnitt 2).
|
||||
5. Aus Kreisel, Einzelbloecken und Specs gemischt baut derzeit nur der
|
||||
HundM05-Treiber (`TEST_HUNDM05`); fuer VF Standard/Etage + GF zusammen mit
|
||||
Kreiseln den Mubea-Treiber (`TEST_MUBEA`) als Vorlage nehmen.
|
||||
@@ -0,0 +1,328 @@
|
||||
# LISP-Routinen zum Bau einzelner Einheiten
|
||||
|
||||
Uebersicht ueber die LISP-Funktionen, die eine Einheit (Kreisel, Eckrad,
|
||||
VarioFoerderer, Gefaellestrecke, Omniflo-Element, Geruest, Einzelblock)
|
||||
erzeugen, mit Signatur, Parametern, Rueckgabe und Voraussetzungen.
|
||||
|
||||
Zu jedem Element steht der interaktive **Befehl** (was der Anwender aufruft)
|
||||
und der **skriptfaehige Kern** (ohne `getpoint`/Dialog, aus Code oder JSON
|
||||
aufrufbar). Das JSON-Format, mit dem die Testtreiber diese Kerne aufrufen,
|
||||
steht in [json-input-lisp.md](json-input-lisp.md); alle Befehle in
|
||||
[kommandos.md](kommandos.md).
|
||||
|
||||
Einheiten: mm und Grad. `hz` = Fahrtrichtung in der XY-Ebene, 0 = +X,
|
||||
90 = +Y. Punkte sind Listen `(x y z)` in Weltkoordinaten.
|
||||
|
||||
---
|
||||
|
||||
## 0. Uebersicht
|
||||
|
||||
| Einheit | Befehl | Skriptfaehiger Kern | Ergebnis-Block | Modul |
|
||||
|---|---|---|---|---|
|
||||
| Kreisel | `KreiselInsert`, `KreiselConnect`, `KreiselQuick` | `kreisel-insert-script`, `kreisel-connect-script` | `KREISEL_n` | `KreiselInsert.lsp` |
|
||||
| Eckrad | `ILS_Eckrad` | `ils-eckrad-insert` | `ECKRAD_n` | `KreiselInsert.lsp` |
|
||||
| VF Standard | `StandardVarioFoerderer`, `FOERDERANLAGE` | `berechne-standard` + `variofoerderer-einfuegen` + `vf-block-erstellen` | `VF_n` | `vf_standard.lsp`, `vf_core.lsp` |
|
||||
| VF Etage | `EtageVarioFoerderer` | `berechne-etage` + `etage-foerderanlage-einfuegen` + `vf-block-erstellen` | `VF_n` | `vf_etage.lsp`, `vf_core.lsp` |
|
||||
| VF Linienzug | `LinienzugVarioFoerderer` | `vsp-bau-aus-spec` (Spec) bzw. `vfl-journal-replay-start` + `vf-linienzug-modus` | `VF_n` | `vf_linienzug.lsp`, `vf_spec.lsp` |
|
||||
| Gefaellestrecke | `GEFAELLESTRECKE_EINFACH`/`_3DLINIE` | `gf-rebuild` bzw. `gefaellestrecke-einfuegen` | `GF_n` | `Gefaellestrecke.lsp` |
|
||||
| Gefaellestrecke Linienzug | `GEFAELLESTRECKE_LINIENZUG` | - (nur interaktiv; Kern `gf-linienzug-einfuegen` braucht analysierte Segmente) | `GF_n` | `Gefaellestrecke.lsp` |
|
||||
| Separator, Scanner | `ILS_SEPARATOR_INSERT`, `ILS_SCANNER_INSERT` | - (Schleife mit `getpoint`); Kern: `ssg-ils-block-laden` + `_.INSERT` | Einzelblock | `SSG_LIB_Commands.lsp`, `ssg_core.lsp` |
|
||||
| BTMT, Eingang/Ausgang | `ILS_BTMT_*`, `ILS_EINGANG_INSERT`/`ILS_AUSGANG_INSERT` | wie Separator | Einzelblock | `SSG_LIB_Commands.lsp` |
|
||||
| Omniflo Bogen/Weiche/TEF | `OMNI_APB_*`, `OMNI_W*_*`, `OMNI_TEF_*` ... | `_.INSERT` der `<sivasnr>.dxf` (Kern `omni:insert-dxf` fragt den Punkt) | Einzelblock | `OmniModulInsert.lsp` |
|
||||
| Omniflo Gerade | `OMNI_AP60`/`AP110`/`APG110` | `omni:make-gerade` | Compound-Block | `OmniModulInsert.lsp` |
|
||||
| TEF-Foerderer-Linie | `TEF_FOERDERER_LINIE` | `tefl-insert-element` (ein Element) | Einzelbloecke | `TEFInsert.lsp` |
|
||||
| Geruest (Saeule, Rohrabhaenger, Wandbefestigung) | `GERUEST`, `GERUEST_SAEULEN` ... | `geruest-block-bauen` | `GR_<id>_<ts>` | `GeruestInsert.lsp` |
|
||||
| Geruest-Traeger | `GERUEST_TRAEGER` | `geruest-traeger-block-bauen` | `GR_<id>_<ts>` | `GeruestInsert.lsp` |
|
||||
|
||||
---
|
||||
|
||||
## 1. Kreisel und Eckrad (`KreiselInsert.lsp`)
|
||||
|
||||
### `kreisel-insert-script (pt abstand rotation typ hoehe)`
|
||||
|
||||
Kreisel an einem freien Punkt. Ruft `draw-module` auf.
|
||||
|
||||
| Parameter | Bedeutung |
|
||||
|---|---|
|
||||
| `pt` | Einfuegepunkt: aeusserster Punkt der AN-Seite auf der Achse (einen Radius = 400 mm vor der Mitte des Antriebsrads) |
|
||||
| `abstand` | Mittenabstand Antriebsrad - Spannrad |
|
||||
| `rotation` | Drehung der Achse AN -> SP in Grad |
|
||||
| `typ` | `"STANDARD"` oder `"PIN"` (nil = `"STANDARD"`) -> Attribut `KREISELART` |
|
||||
| `hoehe` | Einbauhoehe; nil = Z von `pt`, sonst `*kreisel-default-hoehe*` |
|
||||
|
||||
Rueckgabe: Entity des `KREISEL_n`-Blocks oder nil. Setzt `ssg-start`/`ssg-end`
|
||||
selbst.
|
||||
|
||||
### `kreisel-connect-script (ptStart ptEnd typ hoehe)`
|
||||
|
||||
Kreisel zwischen zwei aeussersten Punkten (AN-Seite, SP-Seite). Berechnet
|
||||
`abstand` = Distanz - `*kreisel-durchmesser*` (800) und `rotation` aus den
|
||||
Punkten. Rueckgabe wie oben.
|
||||
|
||||
### `draw-module (basePoint abstand rotation attribs)`
|
||||
|
||||
Gemeinsamer Bau-Kern beider Funktionen: setzt Antriebs- und Spannstation,
|
||||
Tangenten, Beschriftung, fasst alles zu `KREISEL_n` zusammen, schreibt die
|
||||
Attribute (`attribs` = Alist, wird mit `*kreisel-attrib-defs*` gemischt).
|
||||
Direkt nur aufrufen, wenn zusaetzliche Attribute gesetzt werden muessen.
|
||||
|
||||
### `ils-eckrad-insert (pt rotation attribs)`
|
||||
|
||||
Eckrad als Compound-Block `ECKRAD_n`.
|
||||
|
||||
| Parameter | Bedeutung |
|
||||
|---|---|
|
||||
| `pt` | **Radmitte** `(x y hoehe)` |
|
||||
| `rotation` | Drehung in Grad |
|
||||
| `attribs` | Alist mit Ueberschreibungen, z.B. `(("GERUEST_EINZELMODUL" . "1") ("GERUEST_TYP" . "Schoenenberger Geruest"))`; nil = Defaults |
|
||||
|
||||
`c:ILS_Eckrad` berechnet die Radmitte aus Beruehrpunkt + Radius in Richtung
|
||||
des zweiten Klicks. Rueckgabe: Entity des Blocks.
|
||||
|
||||
---
|
||||
|
||||
## 2. VarioFoerderer Standard und Etage (`vf_core.lsp`, `vf_standard.lsp`, `vf_etage.lsp`)
|
||||
|
||||
Ablauf in drei Schritten: **loesen** (Winkel und Teillaengen aus den
|
||||
Gesamtmassen), **einfuegen** (Bausteine verketten), **Block bilden**
|
||||
(`VF_n` mit Attributen). Der Dialog-Ablauf `vf-dialog-ablauf` /
|
||||
`vf-dialog-berechnen-einfuegen` macht dasselbe, oeffnet aber Dialog 2 und ist
|
||||
darum nicht skriptfaehig.
|
||||
|
||||
### Vorbereitung
|
||||
|
||||
| Funktion | Zweck |
|
||||
|---|---|
|
||||
| `init-bibliothek ()` | Bogen-, AS-/ES- und Stationsmasse aus den Bloecken lesen. Setzt `*lib-initialized*`. Wird von `berechne-standard` aufgerufen |
|
||||
| `init-bibliothek-etage ()` | dasselbe fuer Etage, aufgerufen von `berechne-etage` |
|
||||
| `vf-set-as-masse (winkel seite)` / `vf-set-es-masse (winkel seite)` | AS-/ES-Masse (`aus-dx`/`aus-dz`, `ein-dx`/`ein-dz`) fuer die Variante `"90"`/`"30"` + `"links"`/`"rechts"` setzen |
|
||||
|
||||
### Loesen
|
||||
|
||||
| Funktion | Rueckgabe |
|
||||
|---|---|
|
||||
| `berechne-standard (deltaL deltaH richtung seite)` | `(best-winkel L_GF L_VF ergebnis-liste)` |
|
||||
| `berechne-alle-winkel (deltaL deltaH richtung feste-hz schon-flach)` | wie oben; `feste-hz` nil = 1600 mm feste Horizontale, `schon-flach` nil |
|
||||
| `berechne-etage (deltaL deltaH richtung seite)` | wie oben, Etage-Geometrie (setzt die Gefaellebogen-Masse je `seite`) |
|
||||
| `vf-winkel-solve (...)` | gemeinsamer L_GF/L_VF-Solve beider Typen (intern) |
|
||||
|
||||
- `richtung` = `"Auf"`/`"Ab"`, `deltaH` als Betrag.
|
||||
- `ergebnis-liste` = je Kandidatenwinkel `(winkel L_GF L_VF gueltig)`.
|
||||
Kandidaten aus `vario.bogen_winkel` (3 ... 51). Einen bestimmten Winkel
|
||||
erzwingen: Eintrag mit diesem `winkel` aus der Liste nehmen und
|
||||
`gueltig`, `L_GF` > 0, `L_VF` > 0 pruefen (so `mubea:build-vario-one`).
|
||||
- `L_GF` wird danach auf Vorlauf `L_GF1` und Nachlauf `L_GF2` aufgeteilt
|
||||
(gleichmaessig / vorne / hinten / manuell, `foerderer:split-gf`).
|
||||
|
||||
### Einfuegen
|
||||
|
||||
```
|
||||
(variofoerderer-einfuegen deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz)
|
||||
(etage-foerderanlage-einfuegen deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz)
|
||||
```
|
||||
|
||||
Identische Signatur (Registry-Vertrag `*vf-typ-registry*`). `startpunkt` =
|
||||
Lage von **KS_EIN des AS-Elements**, Z = Einbauhoehe am Anfang. `seite` =
|
||||
`"links"`/`"rechts"`. Rueckgabe: Endpunkt (KS_AUS des ES-Elements).
|
||||
`variofoerderer-einfuegen` ist aus Teilen zusammengesetzt (`vfs-as-teil`,
|
||||
VF-Eingang/Koerper, `vfs-es-teil`), die auch der Linienzug nutzt.
|
||||
|
||||
### Block bilden
|
||||
|
||||
```
|
||||
(setq lastEnt (ssg-lastent-ohne-attribute)) ; VOR dem Einfuegen merken
|
||||
...einfuegen...
|
||||
(vf-block-erstellen anlage-typ seite (vf-next-number) n-scanner
|
||||
hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2
|
||||
richtung best-winkel startpunkt lastEnt hz
|
||||
geruest-einzelmodul geruest-typ)
|
||||
(vf-edit-xdata-schreiben ent anlage-typ hz) ; editierbar per Doppelklick
|
||||
```
|
||||
|
||||
- `anlage-typ` = `"standard"`/`"etage"`; `hoehe-bis` = +deltaH bei `"Auf"`,
|
||||
-deltaH bei `"Ab"`; `geruest-einzelmodul` `"0"`/`"1"` (nil = `"1"`),
|
||||
`geruest-typ` einer aus `*ssg-geruest-optionen*`.
|
||||
- Sammelt alle Objekte seit `lastEnt` zum Block `VF_n`, setzt Layer, Attribute,
|
||||
ID (`ssg-id-generate`) und Dimension. Rueckgabe: Entity des Blocks.
|
||||
- `lastEnt` immer mit `ssg-lastent-ohne-attribute` holen, nicht mit
|
||||
`(entlast)` (siehe `CLAUDE.md`, ssg_core).
|
||||
- Blocknummer immer ueber `vf-next-number`: eine feste Nummer fuehrt bei der
|
||||
zweiten Anlage zu einer Rueckfrage von `_.-BLOCK` und einem haengenden Befehl.
|
||||
|
||||
---
|
||||
|
||||
## 3. VF-Linienzug (`vf_linienzug.lsp`, `vf_spec.lsp`)
|
||||
|
||||
Ketten mit Vario-Kurven, GF-Boegen und mehreren VF-Einheiten. Der Bau-Ablauf
|
||||
ist ein Frage-Antwort-Assistent; jede Eingabe wird journalisiert und als XDATA
|
||||
am `VF_n`-Block gespeichert. Nicht-interaktiv baut man ihn, indem man ein
|
||||
Journal **abspielt**.
|
||||
|
||||
| Funktion | Zweck |
|
||||
|---|---|
|
||||
| `vf-linienzug-modus ()` | Modus 1, frei zeichnend. Liest alle Eingaben ueber `vfl-in-point`/`-string`/`-real`/`-int` - aus der Replay-Queue, falls eine aktiv ist |
|
||||
| `vf-linienzug-modus2 ()` | Modus 2, Pfad + Zielhoehe (Objektauswahl, eigenes Journal `"linienzug2"`) |
|
||||
| `vfl-journal-replay-start (forward-journal)` | Journal als Antwort-Queue setzen; danach `vf-linienzug-modus` aufrufen |
|
||||
| `vsp-journal (spec)` | Spec -> Journal (nil bei Spec-Fehlern, Fehler in `*vsp-fehler*`) |
|
||||
| `vsp-pruefen (spec)` | alle Spec-Fehler sammeln |
|
||||
| `vsp-bau-aus-spec (spec)` | eine Kette aus einer Spec bauen (headless, Replay, Ergebnis-Record mit `status`, Block, `prompts`, `glieder_soll`/`glieder_ist`) |
|
||||
| `vsp-bau-liste (specs)` | mehrere Specs, je mit `vl-catch-all-apply` |
|
||||
| `vsp-bau-datei (datei)` | Spec-Datei lesen (`vsp-json-laden` + `vsp-gruppieren`) und alle Ketten bauen; das ist `VF_SPEC_BAU` |
|
||||
| `vsp-headless-an ()` / `vsp-headless-aus ()` | Headless-Rahmen: `*vfl-headless*`, Wizard aus, `*ssg-gui-aus*`, zaehlende Eingabe-Stubs |
|
||||
|
||||
Ein Abbruch im Headless-Modus nennt die Stelle (`*vfl-headless-fehler*`),
|
||||
statt auf eine Live-Eingabe zu warten. Details zum Ablauf und zu den
|
||||
Journal-Regeln: [variofoerderer.md](variofoerderer.md), Abschnitte 5-8b.
|
||||
|
||||
---
|
||||
|
||||
## 4. Gefaellestrecke (`Gefaellestrecke.lsp`)
|
||||
|
||||
### `gf-rebuild (deltaL winkel hz-winkel as-seite es-seite startpunkt as-winkel es-winkel geruest-einzelmodul geruest-typ)`
|
||||
|
||||
Der bequemste skriptfaehige Einstieg fuer Modus 1/2: setzt die AS-/ES-Masse,
|
||||
berechnet die Staustrecke
|
||||
`L_stau = (deltaL - aus-dx - ein-dx - separator_breite * cos(w)) / cos(w)`
|
||||
und ruft `gefaellestrecke-einfuegen`. Ohne Zusammenfassung und Rueckfrage
|
||||
(eigentlich fuer `GEFAELLESTRECKE_EDIT` gedacht).
|
||||
|
||||
| Parameter | Bedeutung |
|
||||
|---|---|
|
||||
| `deltaL` | horizontale Gesamtlaenge AS + Staustrecke + Separator + ES |
|
||||
| `winkel` | Neigung der Staustrecke in Grad (Default im Dialog 3.0) |
|
||||
| `hz-winkel` | Fahrtrichtung |
|
||||
| `as-seite`, `es-seite` | `"links"`/`"rechts"` |
|
||||
| `startpunkt` | **KS_EIN des AS-Elements**, Z = Einbauhoehe oben |
|
||||
| `as-winkel`, `es-winkel` | `"90"`/`"30"` als STRING (nil = `"90"`) |
|
||||
| `geruest-einzelmodul`, `geruest-typ` | wie beim VF |
|
||||
|
||||
Rueckgabe: `(ename deltaH deltaL)` oder nil (Staustrecke <= 0.1 mm -> `alert`).
|
||||
|
||||
### `gefaellestrecke-einfuegen (L_stau winkel startpunkt as-seite es-seite hz deltaL-total as-winkel es-winkel geruest-einzelmodul geruest-typ)`
|
||||
|
||||
Eigentlicher Bau: AS-Element, skalierte Staustrecke, Separator, ES-Element,
|
||||
Block `GF_n` mit Attributen, XDATA `SSG_GF_EDIT` und ID. Erwartet die
|
||||
fertige Staustreckenlaenge `L_stau` und passend gesetzte AS-/ES-Masse
|
||||
(`vf-set-as-masse`/`vf-set-es-masse`). Rueckgabe wie `gf-rebuild`.
|
||||
|
||||
### Weitere
|
||||
|
||||
| Funktion | Zweck |
|
||||
|---|---|
|
||||
| `gf-modus12-abschluss (... dialog-bestaetigt ...)` | Abschluss Modus 1/2 mit Zusammenfassung; fragt ohne `dialog-bestaetigt` = T per Konsole nach |
|
||||
| `gf-init-bibliothek ()` | AS-/ES-Masse fuer die GF lesen |
|
||||
| `gf-linienzug-modus ()` | Modus 3, interaktiv (Auswahl vorhandener LINE/ARC) |
|
||||
| `gf-linienzug-einfuegen (segmente grade startframe)` | Bau-Kern von Modus 3, erwartet die von `gf-analysiere-kette` aufbereiteten Segmente |
|
||||
|
||||
**Falle `*lib-initialized*`**: `gefaellestrecke-einfuegen` initialisiert die
|
||||
GF-Masse nur, wenn `*lib-initialized*` nil ist - dasselbe Flag setzt
|
||||
`init-bibliothek` des VarioFoerderers. Wer in einem Lauf erst VF und dann GF
|
||||
baut, muss `gf-init-bibliothek` einmal selbst erzwingen (so
|
||||
`mubea:ensure-gf-init` in `tests/test_mubea.lsp`), sonst rechnet die GF mit
|
||||
den Vario-Massen und landet auf falscher Hoehe.
|
||||
|
||||
---
|
||||
|
||||
## 5. Einzelbloecke: Separator, Scanner, BTMT, Eingang/Ausgang
|
||||
|
||||
| Funktion | Zweck |
|
||||
|---|---|
|
||||
| `ils-insert-sensor (fname)` | Befehls-Kern Separator/Scanner: fuegt in einer Schleife ein, Punkt per `getpoint`, Drehung per `pause` - **nicht skriptfaehig** |
|
||||
| `ils-insert-station (rohname)` | dasselbe fuer BTMT-Beladung, SC_Entladung, Eingang, Ausgang; setzt zusaetzlich den Layer aus dem `LAYER`-Attribut |
|
||||
| `ssg-ils-block-laden (blockname)` | Blockdefinition `data/ils/<blockname>_<DIM>.dwg` einmal je Zeichnung laden; Rueckgabe: effektiver Blockname mit Suffix oder nil |
|
||||
| `ssg-ils-block-datei (blockname)` | nur den Dateipfad aufloesen (3D-Fallback) |
|
||||
| `ssg-block-layer-vorgabe` | `LAYER`-Attribut eines eingefuegten Blocks als Ziel-Layer anwenden |
|
||||
| `ssg-id-generate (ent)` | eindeutige `ID` vergeben (nur wenn der Block ein ID-Attribut hat) |
|
||||
|
||||
Skriptfaehig bauen (Muster aus `hundm05:bau-sensor`):
|
||||
|
||||
```lisp
|
||||
(setq eff (ssg-ils-block-laden "Scanner")) ; nicht per (and ...) verketten!
|
||||
(command "_.INSERT" eff (list x y z) "" "" rotation)
|
||||
(while (and (> (getvar "CMDACTIVE") 0) (< n 5)) (command "") (setq n (1+ n)))
|
||||
(ssg-id-generate (entlast))
|
||||
```
|
||||
|
||||
`ATTREQ`/`ATTDIA` vorher auf 0 setzen. Restliche Prompts gezaehlt mit Enter
|
||||
beantworten, nicht ungebremst: eine Rueckfrage, die Enter ablehnt, haelt
|
||||
`CMDACTIVE` sonst dauerhaft > 0.
|
||||
|
||||
---
|
||||
|
||||
## 6. Omniflo (`OmniModulInsert.lsp`)
|
||||
|
||||
| Funktion | Zweck |
|
||||
|---|---|
|
||||
| `omni:insert-dxf (sivasnr-str hoehe drehung)` | `%DXFM_OMNIFLO%/<sivasnr>.dxf` einfuegen, `HOEHE`/`DREHUNG` setzen, Layer. **Einfuegepunkt per Maus** (`pause`); Rueckgabe: Einfuegepunkt oder nil |
|
||||
| `omni:insert-from-entry (dlg-result)` | Dialog-Ergebnis von Bogen/Weiche -> `omni:insert-dxf` |
|
||||
| `omni:make-gerade (blockname pt pt2 srcAttribs textHeight textGap textEnt)` | **skriptfaehig**: Aluprofil-Gerade `"AP60"`/`"AP110"`/`"APG110"` von `pt` nach `pt2` als Compound-Block mit Text. `srcAttribs` per `omni:read-src-attribs`, `textEnt` nil. Kein `ssg-start` - Aufrufer setzt OSMODE/ATTREQ/ATTDIA = 0. Rueckgabe: Entity |
|
||||
| `omni:insert-block (blockname laengemax)` | Befehls-Kern der Geraden (fragt `pt`/`pt2` per `getpoint`) |
|
||||
| `omni:ladeschleifen-dialog (profiltyp init-hoehe)` | Dialog Ladeschleife, danach `omni:insert-dxf` |
|
||||
|
||||
Skriptfaehig fuer Boegen/Weichen: `_.INSERT` der DXF direkt mit Punkt
|
||||
`(x y hoehe)` und Drehung, danach `ssg-attrib-set-on` mit `HOEHE`/`DREHUNG`
|
||||
(`omni:test-insert` in `tests/test_omniflo.lsp`). Die festen TEF-/Zubehoer-
|
||||
Befehle (`OMNI_TEF_*`, `OMNI_STOPPER` ...) rufen `omni:insert-dxf` mit fester
|
||||
Sivas-Nummer. `OMNI_TV_*` und `OMNI_APBW_*` sind Platzhalter ohne Bau-Logik.
|
||||
|
||||
---
|
||||
|
||||
## 7. TEF-Foerderer-Linie (`TEFInsert.lsp`)
|
||||
|
||||
| Funktion | Zweck |
|
||||
|---|---|
|
||||
| `c:TEF_FOERDERER_LINIE` | Start-/Endpunkt abfragen, Linie zeichnen, 1000-mm-TEF-Geraden (`0_B10030.dxf`) aneinanderreihen; das letzte Stueck wird zurueckversetzt, damit der Foerderer genau am Linienende endet |
|
||||
| `tefl-insert-element (start richtung-einheit s hz winkel)` | ein Element an Position `s` (mm ab `start`) entlang der Linie, Rz(hz)*Ry(winkel) |
|
||||
| `tefl-ensure-block-loaded (dxf-pfad)` | Blockdefinition einmal laden |
|
||||
|
||||
---
|
||||
|
||||
## 8. Geruest (`GeruestInsert.lsp`)
|
||||
|
||||
| Funktion | Zweck |
|
||||
|---|---|
|
||||
| `geruest-einfuegen (bg wahl)` | Befehls-Kern Saeulen/Rohrabhaenger/Wandbefestigung: baut aus der Dialog-Auswahl `wahl` = `(variante-index oben unten laenge farbe)` die Werte (ARTINR, BEZEICHNUNG, TEILEART, LAENGE, TEILEFARBE), fragt dann den Punkt per `getpoint` |
|
||||
| `geruest-block-bauen (bg variante werte pt teile-dwgs)` | **skriptfaehiger Kern**: Dummy-DWG + Teile-DWGs bei `pt`, Block `GR_<id>_<ts>`. `bg` = Baugruppe aus `geruest.json`, `werte` = Attribut-Alist, `teile-dwgs` aus `geruest-teile-dwgs` |
|
||||
| `geruest-traeger-einfuegen (bg wahl)` | Befehls-Kern Traeger: Schleife Startpunkt -> Endpunkt oder Laenge |
|
||||
| `geruest-traeger-block-bauen (bg layer netto strebe strebe-pfad muffe-pfad werte pt winkel)` | **skriptfaehiger Kern** Traeger: LINE (0,0,0)-(netto,0,0), Streben, Muffe, Block bei `pt` mit `winkel` (Radiant). Rueckgabe: `(blockname . entity)` |
|
||||
| `geruest-traeger-laenge`, `-start`, `-streben`, `-pruefen` | reine Berechnung (Netto-Laenge nach Abzuegen, Startpunkt, Strebenverteilung, min/max) - in `tests/test_unit.lsp` getestet |
|
||||
| `geruest-traeger-beschriften (blockEnt)` | Beschriftungstext aus dem fertigen Block |
|
||||
| `geruest-block-abschliessen (bg attribs werte lastEnt pt rot)` | gemeinsamer Schluss aller Geruest-Bloecke (ATTDEFs, Block bilden, einfuegen, ID) |
|
||||
|
||||
Fuer Geruest gibt es noch keinen JSON-Treiber.
|
||||
|
||||
---
|
||||
|
||||
## 9. Einfuegeprimitiven (`ssg_ks_insert.lsp`, `vf_etage.lsp`)
|
||||
|
||||
Grundbausteine, auf denen VF, GF und Linienzug aufsetzen. Alle legen **KS_EIN**
|
||||
des Blocks (nicht den Block-Ursprung) auf den Startpunkt und geben den
|
||||
Weltpunkt von **KS_AUS** zurueck - damit lassen sich Bausteine verketten.
|
||||
|
||||
| Funktion | Zweck |
|
||||
|---|---|
|
||||
| `ensure-block-loaded (name)` | Block einmal ins Dokument laden |
|
||||
| `extract-ks-from-block (block-obj)` | KS_EIN/KS_AUS eines eingefuegten Blocks (VLA-Objekt) lesen, Cache `*ks-cache*` je Blockname |
|
||||
| `insert-block-by-ks (blockname einfuegepunkt hz)` | Block nur um Z gedreht (AS/ES-Elemente, Stationen) |
|
||||
| `insert-inclined-scaled-block (blockname startpunkt laenge winkel hz)` | Block in X auf `laenge` skaliert und um `winkel` geneigt, Rz(hz)*Ry(winkel) (Staustrecken) |
|
||||
| `insert-rotated-block-with-ks (blockname startpunkt winkel block-dx block-dz hz)` | Block gedreht, `block-dx`/`block-dz` nur als Fallback ohne KS_AUS (Boegen) |
|
||||
| `insert-hz-scaled-block-by-ks (blockname startpunkt laenge hz-winkel vert-winkel)` | waagrechter, auf `laenge` skalierter Block (`Staustrecke_SP_1000_mm`, Massstab `laenge/1000`); Kandidat fuer die noch fehlende waagrechte Foerderstrecke. Bricht bei fehlender Blockdatei mit `(exit)` ab - vorher mit `ssg-ils-block-laden` pruefen |
|
||||
| `ssg-rot-matrix-zy (chz shz cv sv)` | 4x4-Rotationsmatrix Rz(hz)*Ry(vert) aus Cosinus/Sinus beider Winkel (`ssg_core.lsp`) |
|
||||
|
||||
---
|
||||
|
||||
## 10. Gemeinsame Regeln fuer eigene Treiber
|
||||
|
||||
- Systemvariablen ueber `ssg-start`/`ssg-end` sichern; `OSMODE` 0,
|
||||
`ATTREQ` 0, `ATTDIA` 0 setzen, sonst fragt `_.INSERT` nach Attributen.
|
||||
- Module vorher laden: `(ssg-ensure "KreiselInsert")`, `"VarioFoerderer"`,
|
||||
`"Gefaellestrecke"`, `"SSG_LIB_Commands"`.
|
||||
- Die Dimension folgt `ssg-ils-dim-aktuell`; fuer einen festen Lauf
|
||||
`*ssg-ils-dim*` (bzw. `*vsp-dim-override*` beim Spec-Bau) setzen und danach
|
||||
zuruecksetzen.
|
||||
- Rueckgaben nicht mit `and`/`or` verketten - die liefern in AutoLISP nur
|
||||
T/nil (siehe `CLAUDE.md`, Konventionen).
|
||||
- Interaktive GUI abschalten: `ssg-gui-aus` bzw. `vsp-headless-an`.
|
||||
- Vorbilder: `tests/test_mubea.lsp` (Kreisel, VF Standard/Etage, GF,
|
||||
Einzelbloecke), `tests/test_hundm05.lsp` (Spec-Ketten, Kreisel,
|
||||
Einzelbloecke), `tests/test_omniflo_strecke.lsp` (Omniflo).
|
||||
+20
-2
@@ -1003,13 +1003,14 @@
|
||||
"gr-fehler-baugruppe": "\nGeruest: Baugruppe '%1' steht nicht in der Datendatei.",
|
||||
"gr-fehler-keine-varianten": "\nGeruest: Baugruppe '%1' hat keine Geometrie-Varianten.",
|
||||
"gr-fehler-dummy": "\nGeruest: Dummy-Baugruppe nicht gefunden: %1",
|
||||
"gr-fehler-dummy-variante": "\nGeruest: Dummy der Variante nicht gefunden: %1 - verwende Dummy der Baugruppe (%2)",
|
||||
"gr-fehler-dcl": "Dialog geruest.dcl konnte nicht geladen werden.",
|
||||
"gr-dlg-kopf": "%1 konfigurieren",
|
||||
"gr-alert-laenge": "Laenge ungueltig: '%1' mm. Erlaubt: %2 bis %3 mm.",
|
||||
"gr-prompt-einfuegepunkt": "\nEinfuegepunkt waehlen: ",
|
||||
"gr-abgebrochen": "\nAbgebrochen.",
|
||||
"gr-fertig": "\nGeruest-Baugruppe '%1' eingefuegt (Block %2).",
|
||||
"gr-alert-menge": "Ungueltige Stueckzahl. Erlaubt ist eine ganze Zahl ab 1; ein leeres Feld uebernimmt den Vorgabewert.",
|
||||
"gr-alert-menge": "Ungueltige Anzahl. Erlaubt ist eine ganze Zahl ab 1; ein leeres Feld uebernimmt den Vorgabewert.",
|
||||
"gr-position-oben": "oben",
|
||||
"gr-position-unten": "unten",
|
||||
"gr-konfig-keine": "<keine>",
|
||||
@@ -1022,6 +1023,23 @@
|
||||
"gr-konfig-teil-unbekannt": "\nGeruest: Anbauteil '%1' aus Konfiguration '%2' ist bei dieser Baugruppe unbekannt - uebersprungen.",
|
||||
"gr-konfig-variante-unbekannt": "\nGeruest: Variante '%1' aus Konfiguration '%2' ist bei dieser Baugruppe unbekannt - Auswahl unveraendert.",
|
||||
"gr-fehler-schreiben": "\nGeruest: Datei konnte nicht geschrieben werden: %1",
|
||||
"gr-fehler-keine-baugruppen": "\nGeruest: Die Datendatei enthaelt keine Baugruppen."
|
||||
"gr-fehler-keine-baugruppen": "\nGeruest: Die Datendatei enthaelt keine Baugruppen.",
|
||||
"gr-tr-fehler-dcl": "Dialog %1 konnte nicht geladen werden.",
|
||||
"gr-tr-hinweis": "Die Laenge wird nach OK in der Zeichnung bestimmt.",
|
||||
"gr-tr-alert-abzug": "Laengenabzug ungueltig. Erlaubt ist eine Zahl ab 0 (mm); ein leeres Feld gilt als 0.",
|
||||
"gr-tr-prompt-start": "\nStartpunkt des Traegers waehlen <Ende>: ",
|
||||
"gr-tr-prompt-ende": "\nEndpunkt waehlen oder Laenge (mm) eingeben: ",
|
||||
"gr-tr-prompt-richtung": "\nRichtung angeben <0>: ",
|
||||
"gr-tr-eingabe-ungueltig": "\nEingabe '%1' ist weder Punkt noch Laenge.",
|
||||
"gr-tr-laenge-null": "\nStrecke %1 mm ist nicht laenger als die Abzuege (%2 mm) - kein Traeger eingefuegt.",
|
||||
"gr-tr-laenge-bereich": "\nTraegerlaenge %1 mm ausserhalb des erlaubten Bereichs %2 bis %3 mm - kein Traeger eingefuegt.",
|
||||
"gr-tr-fertig": "\nTraeger %1 mm eingefuegt (Block %2).",
|
||||
"gr-tr-ende": "\n%1 Traeger eingefuegt.",
|
||||
"gr-tr-bez-abzug-anfang": "Abzug Anfang %1 mm",
|
||||
"gr-tr-bez-abzug-ende": "Abzug Ende %1 mm",
|
||||
"gr-tr-beschr-stil-fehlt": "\nTextstil %1 fehlt in der Zeichnung - Beschriftung mit aktuellem Stil %2.",
|
||||
"gr-tr-beschr-ausrichtung": "\nUnbekannte Ausrichtung %1 fuer die Traeger-Beschriftung - verwende BC.",
|
||||
"gr-tr-beschr-ergebnis": "\n%1 Traeger beschriftet (davon %2 ohne bekannte Variante), %3 nicht beschriftbar, %4 verwaiste Beschriftungen entfernt.",
|
||||
"gr-tr-beschr-keine": "\nKeine Rohr-Geruest-Traeger in der Zeichnung."
|
||||
}
|
||||
}
|
||||
|
||||
+19
-1
@@ -1003,6 +1003,7 @@
|
||||
"gr-fehler-baugruppe": "\nScaffold: assembly '%1' is not in the data file.",
|
||||
"gr-fehler-keine-varianten": "\nScaffold: assembly '%1' has no geometry variants.",
|
||||
"gr-fehler-dummy": "\nScaffold: dummy assembly not found: %1",
|
||||
"gr-fehler-dummy-variante": "\nScaffold: dummy of the variant not found: %1 - using dummy of the assembly (%2)",
|
||||
"gr-fehler-dcl": "Dialog geruest.dcl could not be loaded.",
|
||||
"gr-dlg-kopf": "Configure %1",
|
||||
"gr-alert-laenge": "Invalid length: '%1' mm. Allowed: %2 to %3 mm.",
|
||||
@@ -1022,6 +1023,23 @@
|
||||
"gr-konfig-teil-unbekannt": "\nScaffold: add-on part '%1' from configuration '%2' is unknown for this assembly - skipped.",
|
||||
"gr-konfig-variante-unbekannt": "\nScaffold: variant '%1' from configuration '%2' is unknown for this assembly - selection unchanged.",
|
||||
"gr-fehler-schreiben": "\nScaffold: could not write file: %1",
|
||||
"gr-fehler-keine-baugruppen": "\nScaffold: the data file contains no assemblies."
|
||||
"gr-fehler-keine-baugruppen": "\nScaffold: the data file contains no assemblies.",
|
||||
"gr-tr-fehler-dcl": "Dialog %1 could not be loaded.",
|
||||
"gr-tr-hinweis": "The length is defined in the drawing after OK.",
|
||||
"gr-tr-alert-abzug": "Invalid length deduction. Allowed is a number from 0 (mm); an empty field counts as 0.",
|
||||
"gr-tr-prompt-start": "\nSelect start point of the beam <exit>: ",
|
||||
"gr-tr-prompt-ende": "\nSelect end point or enter length (mm): ",
|
||||
"gr-tr-prompt-richtung": "\nSpecify direction <0>: ",
|
||||
"gr-tr-eingabe-ungueltig": "\nInput '%1' is neither a point nor a length.",
|
||||
"gr-tr-laenge-null": "\nDistance %1 mm is not longer than the deductions (%2 mm) - no beam inserted.",
|
||||
"gr-tr-laenge-bereich": "\nBeam length %1 mm outside the allowed range %2 to %3 mm - no beam inserted.",
|
||||
"gr-tr-fertig": "\nBeam %1 mm inserted (block %2).",
|
||||
"gr-tr-ende": "\n%1 beam(s) inserted.",
|
||||
"gr-tr-bez-abzug-anfang": "Deduction start %1 mm",
|
||||
"gr-tr-bez-abzug-ende": "Deduction end %1 mm",
|
||||
"gr-tr-beschr-stil-fehlt": "\nText style %1 missing in drawing - labelling with current style %2.",
|
||||
"gr-tr-beschr-ausrichtung": "\nUnknown justification %1 for beam label - using BC.",
|
||||
"gr-tr-beschr-ergebnis": "\n%1 beam(s) labelled (%2 without known variant), %3 not labellable, %4 orphaned label(s) removed.",
|
||||
"gr-tr-beschr-keine": "\nNo pipe scaffold beams in the drawing."
|
||||
}
|
||||
}
|
||||
|
||||
+149
-27
@@ -44,6 +44,7 @@ import struct
|
||||
import sys
|
||||
|
||||
from ezdxf.lldxf.types import BINARY_DATA, INT16, INT32, INT64, DOUBLE, BYTES
|
||||
from ezdxf.lldxf.types import cast_tag_value
|
||||
from ezdxf.math import Matrix44, OCS
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
@@ -62,6 +63,10 @@ MAX_PAAR_ABSTAND = 60000.0
|
||||
# 10 mm deckt Rundungs- und Zeichenungenauigkeiten der Fremdzeichnung ab.
|
||||
GERADE_MAX_DELTA_H = 10.0
|
||||
|
||||
# Projektkennung in den erzeugten IDs (Kreisel_<PROJEKT>_01 ...); main()
|
||||
# setzt sie aus --projekt bzw. dem Namen der DXF-Datei.
|
||||
PROJEKT = "HundM05"
|
||||
|
||||
# Toleranz fuer die Dedup-Rundung (Nachkommastellen).
|
||||
RUND = 2
|
||||
|
||||
@@ -190,6 +195,48 @@ def iter_binary_tags(mm):
|
||||
yield code, value
|
||||
|
||||
|
||||
def iter_ascii_tags(mm):
|
||||
"""Streamt (code, value)-Tags aus einem ASCII-DXF.
|
||||
|
||||
Gegenstueck zu iter_binary_tags fuer Zeichnungen, die als Text-DXF
|
||||
gespeichert wurden (z.B. Dematic_arvato.dxf). Die Werte werden ueber die
|
||||
ezdxf-Typtabelle in float/int gewandelt, damit lese_inserts dieselben
|
||||
Typen sieht wie beim binaeren Lesen.
|
||||
"""
|
||||
i = 0
|
||||
n = len(mm)
|
||||
while i < n:
|
||||
end = mm.find(b"\n", i)
|
||||
if end < 0:
|
||||
break
|
||||
code_raw = mm[i:end].strip()
|
||||
i = end + 1
|
||||
end = mm.find(b"\n", i)
|
||||
if end < 0:
|
||||
end = n
|
||||
value_raw = mm[i:end].rstrip(b"\r")
|
||||
i = end + 1
|
||||
if not code_raw:
|
||||
continue
|
||||
code = int(code_raw)
|
||||
value = decode_str(value_raw)
|
||||
if code == 0:
|
||||
value = value.strip()
|
||||
else:
|
||||
try:
|
||||
value = cast_tag_value(code, value)
|
||||
except ValueError:
|
||||
pass
|
||||
yield code, value
|
||||
|
||||
|
||||
def iter_tags(mm):
|
||||
"""Binaer- oder ASCII-DXF anhand der Kopfzeile erkennen."""
|
||||
if mm[:22] == b"AutoCAD Binary DXF\r\n\x1a\x00":
|
||||
return iter_binary_tags(mm)
|
||||
return iter_ascii_tags(mm)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Familien-Erkennung (Blockname -> Bauteilfamilie)
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -197,8 +244,8 @@ def iter_binary_tags(mm):
|
||||
# mit Wildcards - die Blocknamen der Fremdzeichnungen enthalten Umlaute und
|
||||
# Sonderzeichen (z.B. "3D_Schraegfoerderer_Antrieb", "TEF_Bogen_90Grad_...").
|
||||
FAMILIEN = [
|
||||
("kreisel_an", ["AN8", "AN8_*"]),
|
||||
("kreisel_sp", ["SP8", "SP8_*"]),
|
||||
("kreisel_an", ["AN8", "AN8_*", "AN8 Pinband*"]),
|
||||
("kreisel_sp", ["SP8", "SP8_*", "SP8 Pinband*"]),
|
||||
("foerderer_antrieb", ["3D_TEF_Antrieb*", "3D_FF_Antrieb*",
|
||||
"3D_Schr*rderer_Antrieb*", "Antrieb FF"]),
|
||||
("foerderer_umlenk", ["3D_TEF_Umlenk*", "3D_FF_Umlenk*",
|
||||
@@ -443,7 +490,7 @@ def lese_inserts(dxf_path):
|
||||
fh.close()
|
||||
raise
|
||||
try:
|
||||
for code, value in iter_binary_tags(mm):
|
||||
for code, value in iter_tags(mm):
|
||||
if code == 0:
|
||||
# Ein ATTRIB endet immer am naechsten 0-Tag. Erst hier steht
|
||||
# sicher fest, dass Tag UND Wert gelesen sind - in einem ATTRIB
|
||||
@@ -496,6 +543,19 @@ def lese_inserts(dxf_path):
|
||||
block_merken(aktueller_block)["kinder"].add(value)
|
||||
elif aktuell == "ATTRIB":
|
||||
attrib_tag = value
|
||||
elif aktuell == "CIRCLE" and aktueller_block and code in (10, 20, 30):
|
||||
# Mittelpunkt des ERSTEN Kreises der Blockdefinition merken -
|
||||
# bei AN8/SP8 ist das das Rad. Die Pinband-Varianten in
|
||||
# Dematic_arvato.dxf haben ihr Rad ~15 m neben dem
|
||||
# Einfuegepunkt; ohne diesen Wert laege der Kreisel dort.
|
||||
# Ein zweiter Kreis beginnt mit Code 10, waehrend "kreis" schon
|
||||
# existiert - ab da ist der erste fertig (Code 30 ist optional).
|
||||
info = block_merken(aktueller_block)
|
||||
if code == 10 and "kreis" in info:
|
||||
info["kreis_fertig"] = True
|
||||
if not info.get("kreis_fertig"):
|
||||
kreis = info.setdefault("kreis", [0.0, 0.0, 0.0])
|
||||
kreis[{10: 0, 20: 1, 30: 2}[code]] = value
|
||||
elif aktuell == "BLOCK" and aktueller_block and code in (10, 20, 30):
|
||||
block_base[aktueller_block][{10: 0, 20: 1, 30: 2}[code]] = value
|
||||
elif aktuell == "INSERT" and rec is not None:
|
||||
@@ -630,6 +690,13 @@ def sammle_vorkommen(ms_inserts, block_inserts, block_base, max_tiefe=12,
|
||||
xachse = mat.transform((1.0, 0.0, 0.0)) - ursprung
|
||||
rot = math.degrees(math.atan2(xachse.y, xachse.x)) % 360.0
|
||||
fam = familie_von(rec["name"])
|
||||
# Kreisel-Stationen: Position = Radmitte, nicht Einfuegepunkt
|
||||
# (siehe "kreis" in lese_inserts). Die Rotation oben bleibt die
|
||||
# des Inserts.
|
||||
kreis = ((block_info or {}).get(rec["name"], {}).get("kreis")
|
||||
if fam in ("kreisel_an", "kreisel_sp") else None)
|
||||
if kreis:
|
||||
ursprung = mat.transform(tuple(kreis))
|
||||
if fam:
|
||||
treffer.append({
|
||||
"familie": fam,
|
||||
@@ -866,6 +933,48 @@ def zwillinge_zusammenfuehren(treffer):
|
||||
# Paarbildung und Schema-Abbildung
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# Querversatz (mm), bis zu dem AN8 und SP8 noch auf derselben Kreisel-Achse
|
||||
# liegen. Beide Stationen sitzen auf der Mittellinie des Kreisels; in
|
||||
# Dematic_arvato.dxf liegen echte Paare auf 0,2 mm genau auf einer Achse.
|
||||
KREISEL_MAX_QUER = 100.0
|
||||
|
||||
|
||||
def kreisel_paare_bilden(an_liste, sp_liste):
|
||||
"""AN8 und SP8 zu Kreiseln paaren.
|
||||
|
||||
Global nach Abstand (kuerzestes Paar zuerst) statt AN8 fuer AN8 in
|
||||
X-Reihenfolge: dort griff sich ein frueh sortierter AN8 die naechste noch
|
||||
freie SP8 eines Nachbar-Kreisels, und alle folgenden Paare rutschten mit
|
||||
(Dematic_arvato: ein 33,5-m-Kreisel wurde mit der SP8 eines 3,6-m-Kreisels
|
||||
19 m daneben gepaart). Zusaetzlich muessen beide auf einer gemeinsamen
|
||||
Achse liegen (Querversatz <= KREISEL_MAX_QUER).
|
||||
|
||||
Rueckgabe: (paare [(an, sp, abstand)] nach AN-Position sortiert,
|
||||
AN8 ohne Partner, SP8 ohne Partner)
|
||||
"""
|
||||
kandidaten = []
|
||||
for ia, an in enumerate(an_liste):
|
||||
for isp, sp in enumerate(sp_liste):
|
||||
dx = abs(sp["x"] - an["x"])
|
||||
dy = abs(sp["y"] - an["y"])
|
||||
if min(dx, dy) > KREISEL_MAX_QUER:
|
||||
continue
|
||||
kandidaten.append((math.hypot(dx, dy), ia, isp))
|
||||
kandidaten.sort()
|
||||
an_frei = set(range(len(an_liste)))
|
||||
sp_frei = set(range(len(sp_liste)))
|
||||
paare = []
|
||||
for dist, ia, isp in kandidaten:
|
||||
if ia in an_frei and isp in sp_frei:
|
||||
an_frei.discard(ia)
|
||||
sp_frei.discard(isp)
|
||||
paare.append((an_liste[ia], sp_liste[isp], dist))
|
||||
paare.sort(key=lambda p: (p[0]["x"], p[0]["y"]))
|
||||
return (paare,
|
||||
[an_liste[i] for i in sorted(an_frei)],
|
||||
[sp_liste[i] for i in sorted(sp_frei)])
|
||||
|
||||
|
||||
def paare_bilden(antriebe, umlenkungen):
|
||||
"""Gegenseitig naechste Nachbarn paaren.
|
||||
|
||||
@@ -978,7 +1087,7 @@ def foerderer_eintrag(a, u, dist_xy, nummer, gf_winkel_min):
|
||||
# Die echte Hoehe liefert der 3D-Zwilling (siehe Zusammenfuehrung).
|
||||
if a.get("darstellung") == "2D":
|
||||
return {
|
||||
"test_id": "GERADE_HundM05_%02d" % nummer,
|
||||
"test_id": "GERADE_%s_%02d" % (PROJEKT, nummer),
|
||||
"typ": "gerade",
|
||||
"darstellung": "2D",
|
||||
"laenge": round(dist_xy, RUND),
|
||||
@@ -993,7 +1102,7 @@ def foerderer_eintrag(a, u, dist_xy, nummer, gf_winkel_min):
|
||||
|
||||
if abs(dz) < GERADE_MAX_DELTA_H:
|
||||
return {
|
||||
"test_id": "GERADE_HundM05_%02d" % nummer,
|
||||
"test_id": "GERADE_%s_%02d" % (PROJEKT, nummer),
|
||||
"typ": "gerade",
|
||||
"darstellung": a.get("darstellung", "?"),
|
||||
"laenge": round(dist_xy, RUND),
|
||||
@@ -1008,7 +1117,7 @@ def foerderer_eintrag(a, u, dist_xy, nummer, gf_winkel_min):
|
||||
|
||||
if dz < 0 and neigung >= gf_winkel_min:
|
||||
return {
|
||||
"test_id": "GF_HundM05_%02d" % nummer,
|
||||
"test_id": "GF_%s_%02d" % (PROJEKT, nummer),
|
||||
"modus": 1,
|
||||
"darstellung": a.get("darstellung", "?"),
|
||||
"deltaL_mm": round(dist_xy, RUND),
|
||||
@@ -1025,7 +1134,7 @@ def foerderer_eintrag(a, u, dist_xy, nummer, gf_winkel_min):
|
||||
}
|
||||
|
||||
return {
|
||||
"test_id": "VF_HundM05_%02d" % nummer,
|
||||
"test_id": "VF_%s_%02d" % (PROJEKT, nummer),
|
||||
"typ": "standard",
|
||||
"darstellung": a.get("darstellung", "?"),
|
||||
"richtung": "Auf" if dz > 0 else "Ab",
|
||||
@@ -1116,16 +1225,12 @@ def baue_eintraege(treffer, defaults, boegen, weichen,
|
||||
|
||||
# --- Kreisel: AN8 (Antriebsstation) + SP8 (Spannstation) --------------
|
||||
durchmesser = defaults.get("kreisel", {}).get("durchmesser", 800.0)
|
||||
an_liste = sorted(nach_familie.get("kreisel_an", []), key=lambda t: (t["x"], t["y"]))
|
||||
sp_liste = list(nach_familie.get("kreisel_sp", []))
|
||||
for i, an in enumerate(an_liste, start=1):
|
||||
if not sp_liste:
|
||||
kreisel_paare, an_rest, sp_liste = kreisel_paare_bilden(
|
||||
nach_familie.get("kreisel_an", []), nach_familie.get("kreisel_sp", []))
|
||||
for an in an_rest:
|
||||
hinweise.append("AN8 bei (%.2f, %.2f) ohne SP8-Partner" % (an["x"], an["y"]))
|
||||
eintraege.append(sensor_eintrag(an, bekannte_bloecke, hinweise, treffer))
|
||||
continue
|
||||
sp = min(sp_liste, key=lambda s: math.hypot(s["x"] - an["x"], s["y"] - an["y"]))
|
||||
sp_liste.remove(sp)
|
||||
dist = math.hypot(sp["x"] - an["x"], sp["y"] - an["y"])
|
||||
for i, (an, sp, dist) in enumerate(kreisel_paare, start=1):
|
||||
rotation = math.degrees(math.atan2(sp["y"] - an["y"], sp["x"] - an["x"])) % 360.0
|
||||
# AN8/SP8 sind flache 2D-Symbole auf Z=0 - die Einbauhoehe steht nicht
|
||||
# im DXF. Sie wird aus den 3D-Modellen in der Umgebung abgeleitet
|
||||
@@ -1144,19 +1249,31 @@ def baue_eintraege(treffer, defaults, boegen, weichen,
|
||||
hoehe_hinweis = (" ACHTUNG hoehe=%.1f ist NICHT belegt: "
|
||||
"AN8/SP8 sind flache 2D-Symbole auf Z=0 und "
|
||||
"%s." % (hoehe, grund))
|
||||
# an/sp sind Radmitten (siehe "kreis" in lese_inserts). draw-module
|
||||
# (KreiselInsert.lsp) legt AN8 bei (radius, 0) und SP8 bei
|
||||
# (radius + abstand, 0) in den Block: abstand ist also der
|
||||
# Mittenabstand, und der Einfuegepunkt liegt einen Radius VOR der
|
||||
# AN8-Mitte. Die fruehere "connect"-Ausgabe uebergab die Radmitten an
|
||||
# kreisel-connect-script, das Aussenkanten erwartet - der Kreisel
|
||||
# wurde dadurch an beiden Enden um einen Radius zu kurz.
|
||||
radius = durchmesser / 2.0
|
||||
richtung = math.radians(rotation)
|
||||
eintraege.append({
|
||||
"id": "Kreisel_HundM05_%02d" % i,
|
||||
"function": "connect",
|
||||
"start_x": an["x"], "start_y": an["y"], "start_z": an["z"],
|
||||
"end_x": sp["x"], "end_y": sp["y"], "end_z": sp["z"],
|
||||
"id": "Kreisel_%s_%02d" % (PROJEKT, i),
|
||||
"function": "insert",
|
||||
"x": round(an["x"] - radius * math.cos(richtung), RUND) + 0.0,
|
||||
"y": round(an["y"] - radius * math.sin(richtung), RUND) + 0.0,
|
||||
"z": hoehe,
|
||||
"abstand": round(dist, RUND),
|
||||
"rotation": round(rotation, RUND) + 0.0,
|
||||
"typ": "STANDARD",
|
||||
"darstellung": an.get("darstellung", "?"),
|
||||
"hoehe": hoehe,
|
||||
"comment": ("aus DXF: AN8 (Layer %s) -> SP8 (Layer %s), Abstand "
|
||||
"%.2f; daraus folgt produktionsseitig abstand = %.2f - "
|
||||
"%.1f = %.2f und rotation = %.2f Grad."
|
||||
% (an["layer"], sp["layer"], dist, dist, durchmesser,
|
||||
dist - durchmesser, rotation)) + hoehe_hinweis,
|
||||
"comment": ("aus DXF: Radmitte %s (Layer %s) (%.2f, %.2f) -> "
|
||||
"%s (Layer %s) (%.2f, %.2f), Mittenabstand %.2f, "
|
||||
"rotation %.2f Grad; x/y = AN8-Mitte minus Radius."
|
||||
% (an["block"], an["layer"], an["x"], an["y"],
|
||||
sp["block"], sp["layer"], sp["x"], sp["y"], dist,
|
||||
rotation)) + hoehe_hinweis,
|
||||
})
|
||||
for sp in sp_liste:
|
||||
hinweise.append("SP8 bei (%.2f, %.2f) ohne AN8-Partner" % (sp["x"], sp["y"]))
|
||||
@@ -1188,7 +1305,7 @@ def baue_eintraege(treffer, defaults, boegen, weichen,
|
||||
hinweise.append("Omniflo %s ohne Sivasnr: '%s' (%s)"
|
||||
% (typ, t["block"], grund))
|
||||
eintraege.append({
|
||||
"id": sivasnr or ("%s_HundM05_%02d" % (typ.upper(), i)),
|
||||
"id": sivasnr or ("%s_%s_%02d" % (typ.upper(), PROJEKT, i)),
|
||||
"type": typ,
|
||||
"sivasnr": sivasnr,
|
||||
"x": t["x"], "y": t["y"], "z": t["z"],
|
||||
@@ -1346,7 +1463,7 @@ def main():
|
||||
description="Erkennt ILS-/Omniflo-Komponenten in einem fremden DXF "
|
||||
"und schreibt sie im JSON-Schema aus "
|
||||
"tests/testdata/object_data.md.")
|
||||
parser.add_argument("dxf", help="Quellzeichnung (binaeres DXF)")
|
||||
parser.add_argument("dxf", help="Quellzeichnung (binaeres oder ASCII-DXF)")
|
||||
parser.add_argument("data_dir", help="Datenverzeichnis mit json/")
|
||||
parser.add_argument("output", help="Ziel-JSON")
|
||||
parser.add_argument("--fenster", nargs=4, type=float,
|
||||
@@ -1354,8 +1471,13 @@ def main():
|
||||
help="Nur Bauteile in diesem XY-Fenster (mm) "
|
||||
"ausgeben - fuer den Nachbau eines einzelnen "
|
||||
"Anlagenabschnitts statt der ganzen Zeichnung")
|
||||
parser.add_argument("--projekt",
|
||||
help="Projektkennung in den erzeugten IDs "
|
||||
"(Default: Name der DXF-Datei ohne Endung)")
|
||||
args = parser.parse_args()
|
||||
dxf_path, data_dir, output_path = args.dxf, args.data_dir, args.output
|
||||
global PROJEKT
|
||||
PROJEKT = args.projekt or os.path.splitext(os.path.basename(dxf_path))[0]
|
||||
fenster = None
|
||||
if args.fenster:
|
||||
x0, y0, x1, y1 = args.fenster
|
||||
|
||||
+14
-5
@@ -319,16 +319,25 @@ def build_geruest_merkmale(block):
|
||||
pattern_geruest in cfg/export.cfg, GeruestInsert.lsp *geruest-attrib-defs*).
|
||||
|
||||
ARTINR/LAENGE/BEZEICHNUNG wandern in feste CSV-Spalten (teileid/
|
||||
bezeichnung ueben in process_blocks unten), TEILEART/FARBE/LAYER bleiben
|
||||
als Rest-Attribute in der Merkmale-JSON-Spalte - so wie bei Separator/
|
||||
Scanner/BTMT bereits ueblich."""
|
||||
bezeichnung ueben in process_blocks unten), TEILEART/TEILEFARBE/LAYER
|
||||
bleiben als Rest-Attribute in der Merkmale-JSON-Spalte - so wie bei
|
||||
Separator/Scanner/BTMT bereits ueblich.
|
||||
|
||||
Die Laengenabzuege gibt es nur beim Rohr-Geruest-Traeger
|
||||
(*geruest-traeger-attrib-defs*) und erscheinen darum nur, wenn der Block
|
||||
sie traegt - die Merkmale der anderen GR_-Bloecke bleiben unveraendert."""
|
||||
attribs = block.get("attribs", {})
|
||||
return {
|
||||
merkmale = {
|
||||
"TeileArt": attribs.get("TEILEART", ""),
|
||||
"Farbe": attribs.get("FARBE", ""),
|
||||
"Farbe": attribs.get("TEILEFARBE", ""),
|
||||
"Laenge": attribs.get("LAENGE", ""),
|
||||
"Layer": attribs.get("LAYER", ""),
|
||||
}
|
||||
for tag, name in (("LAENGENABZUGANFANG", "LaengenabzugAnfang"),
|
||||
("LAENGENABZUGENDE", "LaengenabzugEnde")):
|
||||
if tag in attribs:
|
||||
merkmale[name] = attribs[tag]
|
||||
return merkmale
|
||||
|
||||
|
||||
def format_sensor_id(prefix, n):
|
||||
|
||||
+131
-97
@@ -539,7 +539,7 @@
|
||||
<MenuMacro UID="MM_00115">
|
||||
<Macro>
|
||||
<Name>Rohr-Geruest-Traeger</Name>
|
||||
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST</Command>
|
||||
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST_TRAEGER</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00116">
|
||||
@@ -560,211 +560,229 @@
|
||||
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST_WANDBEFESTIGUNG</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00122">
|
||||
<MenuMacro UID="MM_00119">
|
||||
<Macro>
|
||||
<Name>Gattertraeger</Name>
|
||||
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00121">
|
||||
<Macro>
|
||||
<Name>Traeger beschriften</Name>
|
||||
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST_TRAEGER_BESCHRIFTEN</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00124">
|
||||
<Macro>
|
||||
<Name>Marker einfuegen</Name>
|
||||
<Command>^C^C(ssg-ensure "Tro_Edit") TRO_INSERT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00123">
|
||||
<MenuMacro UID="MM_00125">
|
||||
<Macro>
|
||||
<Name>Marker bearbeiten</Name>
|
||||
<Command>^C^C(ssg-ensure "Tro_Edit") TRO_EDIT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00124">
|
||||
<MenuMacro UID="MM_00126">
|
||||
<Macro>
|
||||
<Name>Bearbeiten (Auto)</Name>
|
||||
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00126">
|
||||
<MenuMacro UID="MM_00128">
|
||||
<Macro>
|
||||
<Name>Verbindung einfuegen</Name>
|
||||
<Command>^C^C(ssg-ensure "Connection_Edit") CONNECTION_INSERT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00127">
|
||||
<MenuMacro UID="MM_00129">
|
||||
<Macro>
|
||||
<Name>Verbindung bearbeiten</Name>
|
||||
<Command>^C^C(ssg-ensure "Connection_Edit") CONNECTION_EDIT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00129">
|
||||
<MenuMacro UID="MM_00131">
|
||||
<Macro>
|
||||
<Name>Eingang</Name>
|
||||
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") ILS_EINGANG_INSERT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00130">
|
||||
<MenuMacro UID="MM_00132">
|
||||
<Macro>
|
||||
<Name>Ausgang</Name>
|
||||
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") ILS_AUSGANG_INSERT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00131">
|
||||
<MenuMacro UID="MM_00133">
|
||||
<Macro>
|
||||
<Name>SPS Schliessen</Name>
|
||||
<Command>^C^C</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00133">
|
||||
<MenuMacro UID="MM_00135">
|
||||
<Macro>
|
||||
<Name>Export Sivas</Name>
|
||||
<Command>^C^C(ssg-ensure "export") EXPORTSIVAS</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00134">
|
||||
<MenuMacro UID="MM_00136">
|
||||
<Macro>
|
||||
<Name>Export CSV</Name>
|
||||
<Command>^C^C(ssg-ensure "export") EXPORTCSV</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00136">
|
||||
<MenuMacro UID="MM_00138">
|
||||
<Macro>
|
||||
<Name>Umschalten 2D und 3D</Name>
|
||||
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_SWITCH</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00137">
|
||||
<MenuMacro UID="MM_00139">
|
||||
<Macro>
|
||||
<Name>Alle Bloecke auf 2D</Name>
|
||||
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_ALL_2D</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00138">
|
||||
<MenuMacro UID="MM_00140">
|
||||
<Macro>
|
||||
<Name>Alle Bloecke auf 3D</Name>
|
||||
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_ALL_3D</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00139">
|
||||
<MenuMacro UID="MM_00141">
|
||||
<Macro>
|
||||
<Name>Sprache</Name>
|
||||
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_SPRACHE</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00140">
|
||||
<MenuMacro UID="MM_00142">
|
||||
<Macro>
|
||||
<Name>Planquadrate an/aus</Name>
|
||||
<Command>^C^C(ssg-ensure "DrawPlanquadrate") PLANQUADRATE_TOGGLE</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00141">
|
||||
<MenuMacro UID="MM_00143">
|
||||
<Macro>
|
||||
<Name>CSV-Export</Name>
|
||||
<Command>^C^C(ssg-ensure "export") CSV_EXPORT_KONFIG</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00143">
|
||||
<MenuMacro UID="MM_00145">
|
||||
<Macro>
|
||||
<Name>alle Tests ausfuehren und exportieren</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) (c:SSG_RUN_ALL_TESTS_EXPORT)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00144">
|
||||
<MenuMacro UID="MM_00146">
|
||||
<Macro>
|
||||
<Name>Tests ausfuehren und stehen lassen</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) (c:SSG_RUN_ALL_TESTS_OFFEN)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00145">
|
||||
<MenuMacro UID="MM_00147">
|
||||
<Macro>
|
||||
<Name>Export CSV/Sivas ALL</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_export_all.lsp")) (c:TEST_EXPORT_ALL)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00147">
|
||||
<MenuMacro UID="MM_00149">
|
||||
<Macro>
|
||||
<Name>Kreisel</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_kreisel.lsp")) (c:TEST_KREISEL)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00148">
|
||||
<MenuMacro UID="MM_00150">
|
||||
<Macro>
|
||||
<Name>Foerderer</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_foerderer.lsp")) (c:TEST_FOERDERER)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00149">
|
||||
<MenuMacro UID="MM_00151">
|
||||
<Macro>
|
||||
<Name>Foerderer-Linienzug</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_linienzug.lsp")) (c:TEST_LINIENZUG) (c:TEST_LINIENZUG_STUFE2)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00150">
|
||||
<MenuMacro UID="MM_00152">
|
||||
<Macro>
|
||||
<Name>Omniflo</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_omniflo.lsp")) (c:TEST_OMNIFLO)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00151">
|
||||
<MenuMacro UID="MM_00153">
|
||||
<Macro>
|
||||
<Name>Omniflo Strecke</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_omniflo_strecke.lsp")) (c:TEST_OMNIFLO_STRECKE)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00152">
|
||||
<MenuMacro UID="MM_00154">
|
||||
<Macro>
|
||||
<Name>Gefaellestrecke</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_gefaellestrecke.lsp")) (c:TEST_GEFAELLESTRECKE)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00153">
|
||||
<MenuMacro UID="MM_00155">
|
||||
<Macro>
|
||||
<Name>Mubea Gesamtmodell</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_mubea.lsp")) (c:TEST_MUBEA)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00154">
|
||||
<MenuMacro UID="MM_00156">
|
||||
<Macro>
|
||||
<Name>HundM05 Kreisel-Abschnitt</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_hundm05.lsp")) (c:TEST_HUNDM05)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00155">
|
||||
<MenuMacro UID="MM_00177">
|
||||
<Macro>
|
||||
<Name>Dematic/Arvato Flowpuffer (Vorlage)</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_dematic_arvato.lsp")) (c:TEST_DEMATIC_ARVATO)</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00157">
|
||||
<Macro>
|
||||
<Name>KS 2D/3D pruefen (CSV)</Name>
|
||||
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/Lisp/ks_pruefung.lsp")) KS_PRUEFEN</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00167">
|
||||
<MenuMacro UID="MM_00169">
|
||||
<Macro>
|
||||
<Name>Kreisel bearbeiten</Name>
|
||||
<Command>(ssg-ensure "KreiselInsert") KreiselEdit</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00168">
|
||||
<MenuMacro UID="MM_00170">
|
||||
<Macro>
|
||||
<Name>Omniflo Element bearbeiten</Name>
|
||||
<Command>(ssg-ensure "OmniModulInsert") OMNI_EDIT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00169">
|
||||
<MenuMacro UID="MM_00171">
|
||||
<Macro>
|
||||
<Name>Gefaellestrecke bearbeiten</Name>
|
||||
<Command>(ssg-ensure "Gefaellestrecke") GEFAELLESTRECKE_EDIT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00170">
|
||||
<MenuMacro UID="MM_00172">
|
||||
<Macro>
|
||||
<Name>VarioFoerderer bearbeiten</Name>
|
||||
<Command>(ssg-ensure "VarioFoerderer") VARIOFOERDERER_EDIT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00171">
|
||||
<MenuMacro UID="MM_00173">
|
||||
<Macro>
|
||||
<Name>TRO-Marker bearbeiten</Name>
|
||||
<Command>(ssg-ensure "Tro_Edit") TRO_EDIT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00172">
|
||||
<MenuMacro UID="MM_00174">
|
||||
<Macro>
|
||||
<Name>Verbindung bearbeiten</Name>
|
||||
<Command>(ssg-ensure "Connection_Edit") CONNECTION_EDIT</Command>
|
||||
</Macro>
|
||||
</MenuMacro>
|
||||
<MenuMacro UID="MM_00174">
|
||||
<MenuMacro UID="MM_00176">
|
||||
<Macro>
|
||||
<Name>SSG Bearbeiten (Auto)</Name>
|
||||
<Command>(ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT</Command>
|
||||
@@ -782,10 +800,10 @@
|
||||
<PopMenuRef pUID="PM_00005"/>
|
||||
<PopMenuRef pUID="PM_00031"/>
|
||||
<PopMenuRef pUID="PM_00114"/>
|
||||
<PopMenuRef pUID="PM_00120"/>
|
||||
<PopMenuRef pUID="PM_00132"/>
|
||||
<PopMenuRef pUID="PM_00135"/>
|
||||
<PopMenuRef pUID="PM_00142"/>
|
||||
<PopMenuRef pUID="PM_00122"/>
|
||||
<PopMenuRef pUID="PM_00134"/>
|
||||
<PopMenuRef pUID="PM_00137"/>
|
||||
<PopMenuRef pUID="PM_00144"/>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00005">
|
||||
<Name>ILS</Name>
|
||||
@@ -1413,249 +1431,265 @@
|
||||
<PopMenuItem>
|
||||
<NameRef>Gattertraeger</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00115"/>
|
||||
<MacroRef MenuMacroID="MM_00119"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuRef pUID="PM_00120"/>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00120">
|
||||
<Name>Funktionen</Name>
|
||||
<PopMenuItem>
|
||||
<NameRef>Traeger beschriften</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00121"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00120">
|
||||
<PopMenu UID="PM_00122">
|
||||
<Name>SPS</Name>
|
||||
<PopMenuRef pUID="PM_00121"/>
|
||||
<PopMenuRef pUID="PM_00125"/>
|
||||
<PopMenuRef pUID="PM_00123"/>
|
||||
<PopMenuRef pUID="PM_00127"/>
|
||||
<PopMenuItem>
|
||||
<NameRef>Eingang</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00129"/>
|
||||
<MacroRef MenuMacroID="MM_00131"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Ausgang</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00130"/>
|
||||
<MacroRef MenuMacroID="MM_00132"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>SPS Schliessen</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00131"/>
|
||||
<MacroRef MenuMacroID="MM_00133"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00121">
|
||||
<PopMenu UID="PM_00123">
|
||||
<Name>TRO</Name>
|
||||
<PopMenuItem>
|
||||
<NameRef>Marker einfuegen</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00122"/>
|
||||
<MacroRef MenuMacroID="MM_00124"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Marker bearbeiten</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00123"/>
|
||||
<MacroRef MenuMacroID="MM_00125"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Bearbeiten (Auto)</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00124"/>
|
||||
<MacroRef MenuMacroID="MM_00126"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00125">
|
||||
<PopMenu UID="PM_00127">
|
||||
<Name>Connections</Name>
|
||||
<PopMenuItem>
|
||||
<NameRef>Verbindung einfuegen</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00126"/>
|
||||
<MacroRef MenuMacroID="MM_00128"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Verbindung bearbeiten</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00127"/>
|
||||
<MacroRef MenuMacroID="MM_00129"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Bearbeiten (Auto)</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00124"/>
|
||||
<MacroRef MenuMacroID="MM_00126"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00132">
|
||||
<PopMenu UID="PM_00134">
|
||||
<Name>Export</Name>
|
||||
<PopMenuItem>
|
||||
<NameRef>Export Sivas</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00133"/>
|
||||
<MacroRef MenuMacroID="MM_00135"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Export CSV</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00134"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00135">
|
||||
<Name>Konfiguration</Name>
|
||||
<PopMenuItem>
|
||||
<NameRef>Umschalten 2D und 3D</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00136"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00137">
|
||||
<Name>Konfiguration</Name>
|
||||
<PopMenuItem>
|
||||
<NameRef>Alle Bloecke auf 2D</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00137"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Alle Bloecke auf 3D</NameRef>
|
||||
<NameRef>Umschalten 2D und 3D</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00138"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Sprache</NameRef>
|
||||
<NameRef>Alle Bloecke auf 2D</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00139"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Planquadrate an/aus</NameRef>
|
||||
<NameRef>Alle Bloecke auf 3D</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00140"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>CSV-Export</NameRef>
|
||||
<NameRef>Sprache</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00141"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Planquadrate an/aus</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00142"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>CSV-Export</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00143"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00142">
|
||||
<PopMenu UID="PM_00144">
|
||||
<Name>Tests</Name>
|
||||
<PopMenuItem>
|
||||
<NameRef>alle Tests ausfuehren und exportieren</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00143"/>
|
||||
<MacroRef MenuMacroID="MM_00145"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Tests ausfuehren und stehen lassen</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00144"/>
|
||||
<MacroRef MenuMacroID="MM_00146"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Export CSV/Sivas ALL</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00145"/>
|
||||
<MacroRef MenuMacroID="MM_00147"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem IsSeparator="true"/>
|
||||
<PopMenuItem>
|
||||
<NameRef>Kreisel</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00147"/>
|
||||
<MacroRef MenuMacroID="MM_00149"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Foerderer</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00148"/>
|
||||
<MacroRef MenuMacroID="MM_00150"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Foerderer-Linienzug</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00149"/>
|
||||
<MacroRef MenuMacroID="MM_00151"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Omniflo</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00150"/>
|
||||
<MacroRef MenuMacroID="MM_00152"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Omniflo Strecke</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00151"/>
|
||||
<MacroRef MenuMacroID="MM_00153"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Gefaellestrecke</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00152"/>
|
||||
<MacroRef MenuMacroID="MM_00154"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Mubea Gesamtmodell</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00153"/>
|
||||
<MacroRef MenuMacroID="MM_00155"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>HundM05 Kreisel-Abschnitt</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00154"/>
|
||||
<MacroRef MenuMacroID="MM_00156"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Dematic/Arvato Flowpuffer (Vorlage)</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00177"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>KS 2D/3D pruefen (CSV)</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00155"/>
|
||||
<MacroRef MenuMacroID="MM_00157"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
</PopMenu>
|
||||
<PopMenu UID="PM_00166">
|
||||
<PopMenu UID="PM_00168">
|
||||
<Alias>POP501</Alias>
|
||||
<Name>SSG_LIB Edit Context</Name>
|
||||
<PopMenuItem>
|
||||
<NameRef>Kreisel bearbeiten</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00167"/>
|
||||
<MacroRef MenuMacroID="MM_00169"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Omniflo Element bearbeiten</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00168"/>
|
||||
<MacroRef MenuMacroID="MM_00170"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Gefaellestrecke bearbeiten</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00169"/>
|
||||
<MacroRef MenuMacroID="MM_00171"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>VarioFoerderer bearbeiten</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00170"/>
|
||||
<MacroRef MenuMacroID="MM_00172"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>TRO-Marker bearbeiten</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00171"/>
|
||||
<MacroRef MenuMacroID="MM_00173"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem>
|
||||
<NameRef>Verbindung bearbeiten</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00172"/>
|
||||
<MacroRef MenuMacroID="MM_00174"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
<PopMenuItem IsSeparator="true"/>
|
||||
<PopMenuItem>
|
||||
<NameRef>SSG Bearbeiten (Auto)</NameRef>
|
||||
<MenuItem>
|
||||
<MacroRef MenuMacroID="MM_00174"/>
|
||||
<MacroRef MenuMacroID="MM_00176"/>
|
||||
</MenuItem>
|
||||
</PopMenuItem>
|
||||
</PopMenu>
|
||||
|
||||
+5
-2
@@ -112,11 +112,13 @@
|
||||
[<-~APBW 110 R550/67,5 58x497]^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_58
|
||||
[<-Element bearbeiten]^C^C(ssg-ensure "OmniModulInsert") OMNI_EDIT
|
||||
[->Geruest]^C^C(ssg-ensure "GeruestInsert") GERUEST
|
||||
[Rohr-Geruest-Traeger]^C^C(ssg-ensure "GeruestInsert") GERUEST
|
||||
[Rohr-Geruest-Traeger]^C^C(ssg-ensure "GeruestInsert") GERUEST_TRAEGER
|
||||
[Saeulen]^C^C(ssg-ensure "GeruestInsert") GERUEST_SAEULEN
|
||||
[Rohrabhaenger]^C^C(ssg-ensure "GeruestInsert") GERUEST_ROHRABHAENGER
|
||||
[Wandbefestigung]^C^C(ssg-ensure "GeruestInsert") GERUEST_WANDBEFESTIGUNG
|
||||
[<-Gattertraeger]^C^C(ssg-ensure "GeruestInsert") GERUEST
|
||||
[Gattertraeger]^C^C(ssg-ensure "GeruestInsert") GERUEST
|
||||
[->Funktionen]
|
||||
[<-<-Traeger beschriften]^C^C(ssg-ensure "GeruestInsert") GERUEST_TRAEGER_BESCHRIFTEN
|
||||
[->SPS]
|
||||
[->TRO]
|
||||
[Marker einfuegen]^C^C(ssg-ensure "Tro_Edit") TRO_INSERT
|
||||
@@ -152,6 +154,7 @@
|
||||
[Gefaellestrecke]^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_gefaellestrecke.lsp")) (c:TEST_GEFAELLESTRECKE)
|
||||
[Mubea Gesamtmodell]^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_mubea.lsp")) (c:TEST_MUBEA)
|
||||
[HundM05 Kreisel-Abschnitt]^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_hundm05.lsp")) (c:TEST_HUNDM05)
|
||||
[Dematic/Arvato Flowpuffer (Vorlage)]^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_dematic_arvato.lsp")) (c:TEST_DEMATIC_ARVATO)
|
||||
[<-KS 2D/3D pruefen (CSV)]^C^C(load (strcat (getenv "DXFMAKRO") "/Lisp/ks_pruefung.lsp")) KS_PRUEFEN
|
||||
|
||||
***DOUBLECLICK
|
||||
|
||||
@@ -10,5 +10,6 @@
|
||||
{ "name": "gefaellestrecke", "save": "dwg", "module": "Gefaellestrecke" },
|
||||
{ "name": "mubea", "save": "dxf", "module": "KreiselInsert" },
|
||||
{ "name": "hundm05", "save": "dxf", "module": "VarioFoerderer" },
|
||||
{ "name": "dematic_arvato", "save": "dxf", "module": "VarioFoerderer", "disabled": true },
|
||||
{ "name": "hm_recformat", "save": "dxf", "module": "VarioFoerderer", "disabled": true }
|
||||
]
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
;; ============================================================
|
||||
;; test_dematic_arvato.lsp - Nachbau des Abschnitts Flowpuffer/Kreisel der
|
||||
;; Anlage Dematic/Arvato aus der Scanner-Vorlage.
|
||||
;;
|
||||
;; Datenquelle: tests/testdata/dematic_arvato.json, erzeugt mit
|
||||
;; python lib/dxf_scan_components.py \
|
||||
;; C:/develop/sps_skel/data/Dematic_arvato.dxf data \
|
||||
;; tests/testdata/dematic_arvato.json --projekt Arvato \
|
||||
;; --fenster -3000 159000 49000 193000
|
||||
;;
|
||||
;; Die Datei ist eine VORLAGE fuer den Nachbau, kein fertiger Testfall:
|
||||
;; Hoehen fehlen (flaches 2D-Schema, alles auf Z=0), Seiten/Winkel einiger
|
||||
;; Bloecke sind geraten (siehe "comment" je Eintrag).
|
||||
;;
|
||||
;; Eintragsarten (Schema von dxf_scan_components.py):
|
||||
;; "function": "insert" ohne "block" -> Kreisel (hundm05:bau-kreisel ->
|
||||
;; kreisel-insert-script; x/y = Einfuegepunkt
|
||||
;; einen Radius vor der AN8-Radmitte, abstand =
|
||||
;; Mittenabstand AN8-SP8)
|
||||
;; "function": "insert" + "block" -> Einzelblock (hundm05:bau-sensor,
|
||||
;; Fallback Separator_SP bei unbekanntem Block)
|
||||
;; "typ": "gerade" -> waagrechter Foerderer Antrieb->Umlenkung -
|
||||
;; dafuer gibt es noch keinen Bau-Pfad, wird
|
||||
;; gemeldet und uebersprungen
|
||||
;;
|
||||
;; Keine eigene Bau-Logik: hundm05:bau-kreisel/-sensor aus
|
||||
;; tests/test_hundm05.lsp wird mitgeladen (die Datei definiert nur Funktionen).
|
||||
;;
|
||||
;; Aufruf in BricsCAD:
|
||||
;; (load (strcat (getenv "DXFMAKRO") "/tests/test_dematic_arvato.lsp"))
|
||||
;; TEST_DEMATIC_ARVATO
|
||||
;; ============================================================
|
||||
|
||||
(if (not (boundp '*dematic-arvato-records*)) (setq *dematic-arvato-records* nil))
|
||||
|
||||
;; Module und die Bau-Funktionen aus test_hundm05.lsp beim LADEN dieser Datei
|
||||
;; holen, nicht erst in c:TEST_DEMATIC_ARVATO: in BricsCAD werden per load
|
||||
;; definierte Funktionen erst nach Rueckkehr zum Top-Level sichtbar (siehe
|
||||
;; tests/test_unit.scr).
|
||||
(ssg-ensure "KreiselInsert")
|
||||
(ssg-ensure "VarioFoerderer")
|
||||
(ssg-ensure "SSG_LIB_Commands")
|
||||
(if (null (car (atoms-family 1 '("HUNDM05:BAU-SENSOR"))))
|
||||
(load (strcat (getenv "DXFMAKRO") "/tests/test_hundm05.lsp")))
|
||||
|
||||
(defun dematic_arvato:datei ()
|
||||
(strcat (getenv "DXFMAKRO") "/tests/testdata/dematic_arvato.json"))
|
||||
|
||||
;; Foerderer "gerade": noch kein Bau-Pfad - nur melden.
|
||||
(defun dematic_arvato:gerade-melden (obj / tid rec)
|
||||
(setq tid (ssg-val obj "test_id"))
|
||||
(princ (strcat "\n [GERADE] " (if tid tid "?")
|
||||
" uebersprungen - waagrechter Foerderer noch nicht unterstuetzt"))
|
||||
(setq rec (vsp-rec-neu (if tid tid "(ohne id)")))
|
||||
(setq rec (vsp-set rec "kind" "gerade"))
|
||||
(vsp-set (vsp-set rec "status" "uebersprungen") "fehler_text"
|
||||
"kein Bau-Pfad fuer typ gerade"))
|
||||
|
||||
(defun dematic_arvato:bau-eintrag (obj / kind res)
|
||||
(cond
|
||||
((and (= (ssg-val obj "function") "insert") (ssg-val obj "block"))
|
||||
(setq kind "sensor")
|
||||
(setq res (vl-catch-all-apply 'hundm05:bau-sensor (list obj))))
|
||||
((= (ssg-val obj "function") "insert")
|
||||
(setq kind "kreisel")
|
||||
(setq res (vl-catch-all-apply 'hundm05:bau-kreisel (list obj))))
|
||||
((= (ssg-val obj "typ") "gerade")
|
||||
(setq kind "gerade")
|
||||
(setq res (dematic_arvato:gerade-melden obj)))
|
||||
(T
|
||||
(setq kind "unbekannt")
|
||||
(princ "\n WARNUNG: unbekannter Eintrag uebersprungen")
|
||||
(setq res (vsp-set (vsp-rec-neu "(unbekannt)") "status" "uebersprungen"))))
|
||||
(if (vl-catch-all-error-p res)
|
||||
(progn
|
||||
(princ (strcat "\n [" (strcase kind) "] Ausnahme: "
|
||||
(vl-catch-all-error-message res)))
|
||||
(vsp-set (vsp-set (vsp-set (vsp-rec-neu (cond ((ssg-val obj "id"))
|
||||
((ssg-val obj "block"))
|
||||
("?")))
|
||||
"kind" kind) "status" "abbruch")
|
||||
"fehler_text" (vl-catch-all-error-message res)))
|
||||
res))
|
||||
|
||||
(defun c:TEST_DEMATIC_ARVATO ( / datei daten out zaehler st)
|
||||
(setq datei (dematic_arvato:datei))
|
||||
(princ "\n\n================================================================")
|
||||
(princ "\n TEST_DEMATIC_ARVATO - Abschnitt Flowpuffer/Kreisel (Vorlage)")
|
||||
(princ (strcat "\n " datei))
|
||||
(princ "\n================================================================")
|
||||
(cond
|
||||
((null (car (atoms-family 1 '("VSP-REC-NEU"))))
|
||||
(princ "\n[TEST_DEMATIC_ARVATO] FEHLER: vf_spec.lsp nicht geladen"
|
||||
" (VarioFoerderer laden).")
|
||||
(setq *dematic-arvato-records* nil))
|
||||
((null (findfile datei))
|
||||
(princ (strcat "\n[TEST_DEMATIC_ARVATO] FEHLER: " datei " nicht gefunden!"))
|
||||
(setq *dematic-arvato-records* nil))
|
||||
(T
|
||||
(setq daten (ssg-json-laden datei))
|
||||
(princ (strcat "\n " (itoa (length daten)) " Eintraege geladen"))
|
||||
(ssg-start "TEST_DEMATIC_ARVATO"
|
||||
'(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
|
||||
(setvar "OSMODE" 0)
|
||||
(setvar "ATTREQ" 0)
|
||||
(setvar "ATTDIA" 0)
|
||||
(setq out '())
|
||||
(foreach obj daten
|
||||
(setq out (cons (dematic_arvato:bau-eintrag obj) out)))
|
||||
(ssg-end)
|
||||
(setq *dematic-arvato-records* (reverse out))
|
||||
;; Zusammenfassung je Status
|
||||
(setq zaehler '())
|
||||
(foreach r *dematic-arvato-records*
|
||||
(setq st (cond ((ssg-val r "status")) ("?")))
|
||||
(if (assoc st zaehler)
|
||||
(setq zaehler (subst (cons st (1+ (cdr (assoc st zaehler))))
|
||||
(assoc st zaehler) zaehler))
|
||||
(setq zaehler (cons (cons st 1) zaehler))))
|
||||
(princ "\n================================================================")
|
||||
(foreach z (reverse zaehler)
|
||||
(princ (strcat "\n " (car z) ": " (itoa (cdr z)))))
|
||||
(princ "\n================================================================")
|
||||
(command "_.ZOOM" "_E")))
|
||||
(princ))
|
||||
|
||||
;; Ergebnis-Export (Konvention <name>:export-results fuer test_run_all.lsp)
|
||||
(defun dematic_arvato:export-results (out-dir / pfad)
|
||||
(if (null *dematic-arvato-records*)
|
||||
(princ "\n Keine Dematic/Arvato-Ergebnisse vorhanden.")
|
||||
(progn
|
||||
(vl-mkdir out-dir)
|
||||
(setq pfad (strcat out-dir "/dematic_arvato_results.json"))
|
||||
(vsp-results-schreiben *dematic-arvato-records* pfad)))
|
||||
(princ))
|
||||
|
||||
(princ "\nTEST_DEMATIC_ARVATO geladen. Aufruf: TEST_DEMATIC_ARVATO")
|
||||
(princ)
|
||||
@@ -138,6 +138,10 @@
|
||||
(defun hundm05:bau-sensor (obj / id blockname x y z rotation pt eff n vorher ent ed attribs rec)
|
||||
(setq id (ssg-val obj "id"))
|
||||
(setq blockname (ssg-val obj "block"))
|
||||
;; Eintraege aus lib/dxf_scan_components.py haben kein "id" - die
|
||||
;; Meldungen unten setzen id per strcat zusammen und brachen dann mit
|
||||
;; "bad argument type <NIL>" ab.
|
||||
(if (null id) (setq id (cond (blockname) ("(ohne id)"))))
|
||||
(setq x (ssg-val obj "x")
|
||||
y (ssg-val obj "y")
|
||||
z (ssg-val obj "z")
|
||||
|
||||
+313
-25
@@ -755,7 +755,7 @@
|
||||
(progn
|
||||
(setq _daten (ssg-json-laden _datei))
|
||||
;; Drei Bereiche: Rohrabhaenger, Saeulen (1 und 2 Zoll zusammengefuehrt),
|
||||
;; Wandbefestigung
|
||||
;; Wandbefestigung. Die Traeger liegen in geruest_traeger.json.
|
||||
(tu-eq "json/geruest-baugruppen" 3 (length _daten))
|
||||
;; Baugruppe ueber das ASCII-Feld "id" finden (aeusserer Schluessel
|
||||
;; traegt Umlaute bzw. Anfuehrungszeichen)
|
||||
@@ -768,16 +768,21 @@
|
||||
(progn
|
||||
(setq _var (ssg-json-get _bg "geometrie_varianten"))
|
||||
(setq _anb (ssg-json-get _bg "anbaugruppen"))
|
||||
(tu-eq "json/geruest-varianten" 3 (length _var))
|
||||
(tu-eq "json/geruest-varianten" 4 (length _var))
|
||||
(tu-eq "json/geruest-teileart" "Geruest Rohrabhaenger"
|
||||
(ssg-json-get _bg "teileart"))
|
||||
(tu-eq "json/geruest-dummy" "Rohrabhaenger_dummy.dwg"
|
||||
(ssg-json-get _bg "dummy"))
|
||||
;; Sivas-ID als Zahl geparst, Laengengrenze aus dem attribute-Block
|
||||
;; Sivas-ID als Zahl geparst, Laengengrenze aus dem attribute-Block.
|
||||
;; Die Keys unter "attribute" sind die Block-Attribut-Tags und darum
|
||||
;; GROSS geschrieben (ssg-json-get unterscheidet Gross/Klein).
|
||||
(tu-eq "json/geruest-sivas" 821006026
|
||||
(ssg-json-get (car (ssg-json-get (car _var) "teile")) "sivas_id"))
|
||||
(tu-eq "json/geruest-max" 6000
|
||||
(ssg-json-get (ssg-json-get (ssg-json-get _bg "attribute") "Laenge") "max"))
|
||||
(ssg-json-get (ssg-json-get (ssg-json-get _bg "attribute") "LAENGE") "max"))
|
||||
(tu-eq "json/geruest-farboptionen" '("RAL7035" "RAL7030")
|
||||
(ssg-json-get (ssg-json-get (ssg-json-get _bg "attribute") "TEILEFARBE")
|
||||
"optionen"))
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -819,24 +824,24 @@
|
||||
(tu-eq "geruest-id-string/str" "0_B10071" (geruest-id-string "0_B10071"))
|
||||
(tu-eq "geruest-id-string/nil" nil (geruest-id-string nil))
|
||||
|
||||
;; Einzelteil mit menge 2 -> Artikelnummer zweimal (ARTINR-Regel)
|
||||
;; Einzelteil mit stueckzahl 2 -> Artikelnummer zweimal (ARTINR-Regel)
|
||||
(setq _eintrag (ssg-json-parse
|
||||
"{\"artikel\": \"X\", \"sivas_id\": 825002019, \"menge\": 2}"))
|
||||
(tu-eq "geruest-artnr/menge2" '("825002019" "825002019")
|
||||
"{\"artikel\": \"X\", \"sivas_id\": 825002019, \"stueckzahl\": 2}"))
|
||||
(tu-eq "geruest-artnr/stueckzahl2" '("825002019" "825002019")
|
||||
(geruest-artikelnummern _eintrag))
|
||||
(tu-eq "geruest-name/artikel" "X" (geruest-eintrag-name _eintrag))
|
||||
|
||||
;; Benannte Gruppe -> teile rekursiv aufloesen, Mengen beachten
|
||||
(setq _gruppe (ssg-json-parse
|
||||
(strcat "{\"name\": \"Schraubenset\", \"teile\": ["
|
||||
"{\"artikel\": \"A\", \"sivas_id\": 111, \"menge\": 1},"
|
||||
"{\"artikel\": \"B\", \"sivas_id\": 222, \"menge\": 2}]}")))
|
||||
"{\"artikel\": \"A\", \"sivas_id\": 111, \"stueckzahl\": 1},"
|
||||
"{\"artikel\": \"B\", \"sivas_id\": 222, \"stueckzahl\": 2}]}")))
|
||||
(tu-eq "geruest-artnr/gruppe" '("111" "222" "222")
|
||||
(geruest-artikelnummern _gruppe))
|
||||
(tu-eq "geruest-name/gruppe" "Schraubenset" (geruest-eintrag-name _gruppe))
|
||||
|
||||
;; Fehlendes menge-Feld -> 1
|
||||
(tu-eq "geruest-artnr/ohne-menge" '("333")
|
||||
;; Fehlendes stueckzahl-Feld -> 1
|
||||
(tu-eq "geruest-artnr/ohne-stueckzahl" '("333")
|
||||
(geruest-artikelnummern
|
||||
(ssg-json-parse "{\"artikel\": \"C\", \"sivas_id\": 333}")))
|
||||
|
||||
@@ -854,21 +859,62 @@
|
||||
(tu-eq "geruest-teile-dwgs/vorhanden" (list _pfad)
|
||||
(geruest-teile-dwgs '("825002019" "999999999" "825002019")))
|
||||
)
|
||||
;; --- Anzahl-Vorgabe (Dialogfeld) vs. stueckzahl (wirklich geschrieben) ---
|
||||
(tu-eq "geruest-anzahl-vorgabe/gruppe" 2
|
||||
(geruest-anzahl-vorgabe (ssg-json-parse
|
||||
"{\"name\": \"G\", \"anzahl_vorgabe\": 2, \"teile\": [{\"sivas_id\": 1, \"stueckzahl\": 1}]}")))
|
||||
;; stueckzahl ist KEINE Vorgabe fuer das Dialogfeld
|
||||
(tu-eq "geruest-anzahl-vorgabe/stueckzahl-zaehlt-nicht" 1
|
||||
(geruest-anzahl-vorgabe (ssg-json-parse "{\"sivas_id\": 1, \"stueckzahl\": 3}")))
|
||||
(tu-eq "geruest-anzahl-vorgabe/ohne" 1
|
||||
(geruest-anzahl-vorgabe (ssg-json-parse "{\"name\": \"G\", \"teile\": []}")))
|
||||
;; anzahl_vorgabe bestimmt nur die Vorbelegung, nicht den Satzinhalt:
|
||||
;; 3 Saetze a (1 Schraube + 1 Duebel) = 6 Nummern
|
||||
(tu-eq "geruest-artikelnummern-n/anzahl-vorgabe" '("1" "2" "1" "2" "1" "2")
|
||||
(geruest-artikelnummern-n (ssg-json-parse
|
||||
"{\"name\": \"G\", \"anzahl_vorgabe\": 2, \"teile\": [{\"sivas_id\": 1, \"stueckzahl\": 1}, {\"sivas_id\": 2, \"stueckzahl\": 1}]}")
|
||||
3))
|
||||
;; Einzelteil-Anbauteil: Anzahl x stueckzahl
|
||||
(tu-eq "geruest-artikelnummern-n/einzelteil-stueckzahl" '("7" "7" "7" "7")
|
||||
(geruest-artikelnummern-n (ssg-json-parse
|
||||
"{\"artikel\": \"X\", \"sivas_id\": 7, \"stueckzahl\": 2, \"anzahl_vorgabe\": 5}")
|
||||
2))
|
||||
;; Dummy, der zugleich Teile-DWG ist, faellt aus der Teileliste
|
||||
(tu-eq "geruest-ohne-pfad/entfernt" '("b/2.dwg")
|
||||
(geruest-ohne-pfad "A/1.DWG" '("a/1.dwg" "b/2.dwg")))
|
||||
(tu-eq "geruest-ohne-pfad/nil" '("a/1.dwg")
|
||||
(geruest-ohne-pfad nil '("a/1.dwg")))
|
||||
;; Dummy-Wahl: Variante gewinnt, fehlende Varianten-DWG -> Baugruppe
|
||||
(setq _pfad (geruest-dummy-pfad "821006036.dwg"))
|
||||
(if (and _pfad (findfile _pfad))
|
||||
(tu-eq "geruest-dummy-wahl/variante" "821006036.dwg"
|
||||
(car (geruest-dummy-wahl
|
||||
(ssg-json-parse "{\"dummy\": \"821006036.dwg\"}")
|
||||
(ssg-json-parse "{\"dummy\": \"basis.dwg\"}"))))
|
||||
)
|
||||
(tu-eq "geruest-dummy-wahl/fehlt" "basis.dwg"
|
||||
(car (geruest-dummy-wahl
|
||||
(ssg-json-parse "{\"dummy\": \"gibtsnicht_999.dwg\"}")
|
||||
(ssg-json-parse "{\"dummy\": \"basis.dwg\"}"))))
|
||||
(tu-eq "geruest-dummy-wahl/ohne" "basis.dwg"
|
||||
(car (geruest-dummy-wahl
|
||||
(ssg-json-parse "{\"name\": \"X\"}")
|
||||
(ssg-json-parse "{\"dummy\": \"basis.dwg\"}"))))
|
||||
|
||||
;; --- Mengenfeld ---
|
||||
(tu-eq "geruest-zahl-p/ziffern" T (geruest-zahl-p "12"))
|
||||
(tu-eq "geruest-zahl-p/text" nil (geruest-zahl-p "1a"))
|
||||
(tu-eq "geruest-zahl-p/leer" nil (geruest-zahl-p ""))
|
||||
;; Leeres Feld uebernimmt die JSON-Vorgabe, ungueltiges liefert nil
|
||||
(tu-eq "geruest-menge-wert/leer" 2 (geruest-menge-wert "" 2))
|
||||
(tu-eq "geruest-menge-wert/zahl" 5 (geruest-menge-wert "5" 2))
|
||||
(tu-eq "geruest-menge-wert/null" nil (geruest-menge-wert "0" 2))
|
||||
(tu-eq "geruest-menge-wert/text" nil (geruest-menge-wert "abc" 2))
|
||||
(tu-eq "geruest-menge-wert/negativ" nil (geruest-menge-wert "-3" 2))
|
||||
(tu-eq "geruest-anzahl-wert/leer" 2 (geruest-anzahl-wert "" 2))
|
||||
(tu-eq "geruest-anzahl-wert/zahl" 5 (geruest-anzahl-wert "5" 2))
|
||||
(tu-eq "geruest-anzahl-wert/null" nil (geruest-anzahl-wert "0" 2))
|
||||
(tu-eq "geruest-anzahl-wert/text" nil (geruest-anzahl-wert "abc" 2))
|
||||
(tu-eq "geruest-anzahl-wert/negativ" nil (geruest-anzahl-wert "-3" 2))
|
||||
|
||||
;; --- Stueckzahl ersetzt die JSON-Menge (Einzelteil) ---
|
||||
(tu-eq "geruest-artnr-n/einzelteil" '("825002019" "825002019" "825002019")
|
||||
(geruest-artikelnummern-n _eintrag 3))
|
||||
;; --- Einzelteil: Anzahl (Dialog) x stueckzahl (JSON, hier 2) ---
|
||||
(tu-eq "geruest-artnr-n/einzelteil" 6
|
||||
(length (geruest-artikelnummern-n _eintrag 3)))
|
||||
;; --- Gruppe: ganzes Set n-mal, Mengen INNERHALB bleiben erhalten ---
|
||||
(tu-eq "geruest-artnr-n/gruppe" '("111" "222" "222" "111" "222" "222")
|
||||
(geruest-artikelnummern-n _gruppe 2))
|
||||
@@ -889,7 +935,7 @@
|
||||
(setq _teile (ssg-json-parse
|
||||
(strcat "{\"name\": \"Set\", \"farbig\": true, \"teile\": ["
|
||||
"{\"artikel\": \"A\", \"sivas_id\": 111},"
|
||||
"{\"artikel\": \"B\", \"sivas_id\": 222, \"menge\": 2}]}")))
|
||||
"{\"artikel\": \"B\", \"sivas_id\": 222, \"stueckzahl\": 2}]}")))
|
||||
(tu-eq "geruest-paare/gruppe-erbt" '(("111" . T) ("222" . T) ("222" . T))
|
||||
(geruest-teile-paare _teile nil))
|
||||
(tu-eq "geruest-paare-n/gruppe" 6 (length (geruest-teile-paare-n _teile 2)))
|
||||
@@ -929,8 +975,8 @@
|
||||
;; die ganze Konfiguration verworfen)
|
||||
(setq _konfig (ssg-json-parse
|
||||
(strcat "{\"name\": \"K1\", \"oben\": ["
|
||||
"{\"artikel\": \"Schraubenset\", \"menge\": 3},"
|
||||
"{\"artikel\": \"unbekannt\", \"menge\": 1}]}")))
|
||||
"{\"artikel\": \"Schraubenset\", \"anzahl\": 3},"
|
||||
"{\"artikel\": \"unbekannt\", \"anzahl\": 1}]}")))
|
||||
(tu-eq "geruest-konfig-position" '(nil 3)
|
||||
(geruest-konfig-position _konfig "oben" _teile))
|
||||
|
||||
@@ -978,6 +1024,248 @@
|
||||
(geruest-variante-wert
|
||||
(nth _rec (ssg-json-get _saeulen "geometrie_varianten"))
|
||||
_saeulen "teileart")))
|
||||
;; Attribut-Keys GROSS - sonst findet geruest-dialog min/max und
|
||||
;; Farben nicht (Laengenfeld ohne Pruefung, leere Farbliste).
|
||||
(tu-eq "geruest/saeulen-laenge-max" 6000
|
||||
(geruest-attr-feld nil _saeulen "LAENGE" "max"))
|
||||
(tu-true "geruest/saeulen-farboptionen"
|
||||
(geruest-attr-feld nil _saeulen "TEILEFARBE" "optionen"))
|
||||
)
|
||||
)
|
||||
|
||||
;; --- Rohr-Geruest-Traeger: reine Berechnung ---
|
||||
;; Netto-Laenge = Strecke minus beide Abzuege, nil wenn nichts uebrig
|
||||
(tu-eqf "geruest-traeger-laenge/ende" 965.0 (geruest-traeger-laenge 1000.0 0.0 35.0))
|
||||
(tu-eqf "geruest-traeger-laenge/beide" 945.0 (geruest-traeger-laenge 1000.0 20.0 35.0))
|
||||
(tu-eqf "geruest-traeger-laenge/ohne" 1000.0 (geruest-traeger-laenge 1000.0 nil nil))
|
||||
(tu-nil "geruest-traeger-laenge/zu-kurz" (geruest-traeger-laenge 50.0 30.0 30.0))
|
||||
(tu-nil "geruest-traeger-laenge/genau-null" (geruest-traeger-laenge 60.0 30.0 30.0))
|
||||
;; Startpunkt wird um den Anfangsabzug entlang der Richtung eingerueckt,
|
||||
;; Z bleibt die des Startklicks
|
||||
(tu-eqf "geruest-traeger-start/0grad" '(20.0 0.0 500.0)
|
||||
(geruest-traeger-start '(0.0 0.0 500.0) 0.0 20.0))
|
||||
(tu-eqf "geruest-traeger-start/90grad" '(100.0 220.0 0.0)
|
||||
(geruest-traeger-start '(100.0 200.0 0.0) (/ pi 2.0) 20.0))
|
||||
(tu-eqf "geruest-traeger-start/2d-punkt" '(5.0 0.0 0.0)
|
||||
(geruest-traeger-start '(5.0 0.0) 0.0 0.0))
|
||||
;; Querstreben: Abstand max. 500, Rand 100..250 beidseitig gleich,
|
||||
;; so wenige wie moeglich
|
||||
;; Abstand genau 500, solange der Rand in 100..250 bleibt
|
||||
(tu-eqf "geruest-traeger-streben/1200" '(100.0 600.0 1100.0)
|
||||
(geruest-traeger-streben 1200.0 500.0 100.0 250.0))
|
||||
(tu-eqf "geruest-traeger-streben/1300" '(150.0 650.0 1150.0)
|
||||
(geruest-traeger-streben 1300.0 500.0 100.0 250.0))
|
||||
;; 1100 geht mit genau 500 nicht auf -> Rand 100, Abstand 450
|
||||
(tu-eqf "geruest-traeger-streben/1100" '(100.0 550.0 1000.0)
|
||||
(geruest-traeger-streben 1100.0 500.0 100.0 250.0))
|
||||
(tu-eqf "geruest-traeger-streben/1500" '(250.0 750.0 1250.0)
|
||||
(geruest-traeger-streben 1500.0 500.0 100.0 250.0))
|
||||
(tu-eqf "geruest-traeger-streben/1000" '(250.0 750.0)
|
||||
(geruest-traeger-streben 1000.0 500.0 100.0 250.0))
|
||||
(tu-eqf "geruest-traeger-streben/eine" '(200.0)
|
||||
(geruest-traeger-streben 400.0 500.0 100.0 250.0))
|
||||
(tu-eqf "geruest-traeger-streben/grenze-500" '(250.0)
|
||||
(geruest-traeger-streben 500.0 500.0 100.0 250.0))
|
||||
(tu-eqf "geruest-traeger-streben/501" '(100.0 401.0)
|
||||
(geruest-traeger-streben 501.0 500.0 100.0 250.0))
|
||||
(tu-nil "geruest-traeger-streben/zu-kurz"
|
||||
(geruest-traeger-streben 150.0 500.0 100.0 250.0))
|
||||
(tu-eqf "geruest-traeger-streben/min-200" '(100.0)
|
||||
(geruest-traeger-streben 200.0 500.0 100.0 250.0))
|
||||
;; 6000 mm: 11 Felder a 500 -> 12 Streben, letzte bei 5750
|
||||
(setq _rec (geruest-traeger-streben 6000.0 500.0 100.0 250.0))
|
||||
(tu-eq "geruest-traeger-streben/6000-anzahl" 12 (length _rec))
|
||||
(tu-eqf "geruest-traeger-streben/6000-letzte" 5750.0 (last _rec))
|
||||
;; Konfiguration: fehlende Felder -> Standard, ohne querstrebe -> nil
|
||||
;; Ergebnis (dummy laenge querlinie abstand-max rand-min rand-max)
|
||||
(tu-eqf "geruest-traeger-strebe-cfg/standard" '(nil 30.0 25.0 500.0 100.0 250.0)
|
||||
(geruest-traeger-strebe-cfg nil
|
||||
(ssg-json-parse "{\"querstrebe\": {\"rand_min\": 100}}")))
|
||||
(tu-eqf "geruest-traeger-strebe-cfg/dummy" '("s.dwg" 30.0 25.0 500.0 100.0 250.0)
|
||||
(geruest-traeger-strebe-cfg nil
|
||||
(ssg-json-parse "{\"querstrebe\": {\"dummy\": \"s.dwg\"}}")))
|
||||
(tu-eqf "geruest-traeger-strebe-cfg/wert" '(nil 30.0 25.0 400.0 100.0 250.0)
|
||||
(geruest-traeger-strebe-cfg nil
|
||||
(ssg-json-parse "{\"querstrebe\": {\"abstand_max\": 400}}")))
|
||||
;; Querlinien an Anfang und Ende der 30 mm langen Strebe
|
||||
(tu-eqf "geruest-traeger-strebe-enden" '(235.0 265.0)
|
||||
(geruest-traeger-strebe-enden 250.0 30.0))
|
||||
(tu-nil "geruest-traeger-strebe-cfg/ohne"
|
||||
(geruest-traeger-strebe-cfg nil (ssg-json-parse "{\"id\": \"X\"}")))
|
||||
;; Muffe nur bei "mit_muffe": true; Variante darf eigene Muffe mitbringen
|
||||
(setq _bgtest (ssg-json-parse "{\"muffe\": {\"dummy\": \"m.dwg\"}}"))
|
||||
(tu-eq "geruest-traeger-muffe-dummy/flag" "m.dwg"
|
||||
(geruest-traeger-muffe-dummy
|
||||
(ssg-json-parse "{\"name\": \"A\", \"mit_muffe\": true}") _bgtest))
|
||||
(tu-nil "geruest-traeger-muffe-dummy/ohne-flag"
|
||||
(geruest-traeger-muffe-dummy
|
||||
(ssg-json-parse "{\"name\": \"Rohr mit Muffe\"}") _bgtest))
|
||||
(tu-eq "geruest-traeger-muffe-dummy/variante" "m2.dwg"
|
||||
(geruest-traeger-muffe-dummy
|
||||
(ssg-json-parse
|
||||
"{\"mit_muffe\": true, \"muffe\": {\"dummy\": \"m2.dwg\"}}")
|
||||
_bgtest))
|
||||
(tu-nil "geruest-traeger-muffe-dummy/ohne-variante"
|
||||
(geruest-traeger-muffe-dummy nil _bgtest))
|
||||
|
||||
;; --- Traeger-Beschriftung: reine Berechnung ---
|
||||
;; Textwinkel entlang des Traegers, DIN: 90 < w <= 270 wird gedreht
|
||||
(tu-eqf "geruest-text-winkel/0" 0.0 (geruest-text-winkel 0.0))
|
||||
(tu-eqf "geruest-text-winkel/45" (/ pi 4.0) (geruest-text-winkel (/ pi 4.0)))
|
||||
(tu-eqf "geruest-text-winkel/90" (/ pi 2.0) (geruest-text-winkel (/ pi 2.0)))
|
||||
(tu-eqf "geruest-text-winkel/91" (* 271 (/ pi 180.0))
|
||||
(geruest-text-winkel (* 91 (/ pi 180.0))))
|
||||
(tu-eqf "geruest-text-winkel/180" 0.0 (geruest-text-winkel pi))
|
||||
(tu-eqf "geruest-text-winkel/270" (/ pi 2.0) (geruest-text-winkel (* 1.5 pi)))
|
||||
(tu-eqf "geruest-text-winkel/271" (* 271 (/ pi 180.0))
|
||||
(geruest-text-winkel (* 271 (/ pi 180.0))))
|
||||
;; -90 = 270 -> gedreht auf 90 (von unten nach oben lesbar)
|
||||
(tu-eqf "geruest-text-winkel/-90" (/ pi 2.0) (geruest-text-winkel (- (/ pi 2.0))))
|
||||
;; Ausrichtungs-Codes wie TEXT "Ausrichten" -> (dxf72 dxf73)
|
||||
(tu-eq "geruest-ausrichtung/TL" '(0 3) (geruest-ausrichtung-codes "TL"))
|
||||
(tu-eq "geruest-ausrichtung/TC" '(1 3) (geruest-ausrichtung-codes "TC"))
|
||||
(tu-eq "geruest-ausrichtung/TR" '(2 3) (geruest-ausrichtung-codes "TR"))
|
||||
(tu-eq "geruest-ausrichtung/ML" '(0 2) (geruest-ausrichtung-codes "ML"))
|
||||
(tu-eq "geruest-ausrichtung/MC" '(1 2) (geruest-ausrichtung-codes "MC"))
|
||||
(tu-eq "geruest-ausrichtung/MR" '(2 2) (geruest-ausrichtung-codes "MR"))
|
||||
(tu-eq "geruest-ausrichtung/BL" '(0 1) (geruest-ausrichtung-codes "BL"))
|
||||
(tu-eq "geruest-ausrichtung/BC" '(1 1) (geruest-ausrichtung-codes "BC"))
|
||||
(tu-eq "geruest-ausrichtung/BR" '(2 1) (geruest-ausrichtung-codes "BR"))
|
||||
(tu-eq "geruest-ausrichtung/klein" '(1 1) (geruest-ausrichtung-codes "bc"))
|
||||
(tu-nil "geruest-ausrichtung/unbekannt" (geruest-ausrichtung-codes "XY"))
|
||||
(tu-nil "geruest-ausrichtung/nil" (geruest-ausrichtung-codes nil))
|
||||
;; Textlage: Bezugspunkt auf der Linie, "links" in Leserichtung
|
||||
(tu-eqf "geruest-text-lage/0-BC" '((1000.0 0.0 0.0) 0.0 1 1)
|
||||
(geruest-traeger-text-lage '(0.0 0.0 0.0) 0.0 2000.0 "BC"))
|
||||
(tu-eqf "geruest-text-lage/0-BL" '((0.0 0.0 0.0) 0.0 0 1)
|
||||
(geruest-traeger-text-lage '(0.0 0.0 0.0) 0.0 2000.0 "BL"))
|
||||
(tu-eqf "geruest-text-lage/0-BR" '((2000.0 0.0 0.0) 0.0 2 1)
|
||||
(geruest-traeger-text-lage '(0.0 0.0 0.0) 0.0 2000.0 "BR"))
|
||||
;; Traeger nach links (180): Text gedreht auf 0, links = Linienende
|
||||
(tu-eqf "geruest-text-lage/180-BL" '((-2000.0 0.0 0.0) 0.0 0 1)
|
||||
(geruest-traeger-text-lage '(0.0 0.0 0.0) pi 2000.0 "BL"))
|
||||
(tu-eqf "geruest-text-lage/180-BR" '((0.0 0.0 0.0) 0.0 2 1)
|
||||
(geruest-traeger-text-lage '(0.0 0.0 0.0) pi 2000.0 "BR"))
|
||||
(tu-eqf "geruest-text-lage/180-BC" '((-1000.0 0.0 0.0) 0.0 1 1)
|
||||
(geruest-traeger-text-lage '(0.0 0.0 0.0) pi 2000.0 "BC"))
|
||||
;; Unbekannter Code -> BC
|
||||
(tu-eqf "geruest-text-lage/ersatz" '((1000.0 0.0 0.0) 0.0 1 1)
|
||||
(geruest-traeger-text-lage '(0.0 0.0 0.0) 0.0 2000.0 "XY"))
|
||||
;; Text: %1 = Variantentext, %2 = Laenge auf ganze mm
|
||||
(tu-eq "geruest-text-string/beispiel" "RT 80/80 L=2650"
|
||||
(geruest-traeger-text-string "%1 L=%2" "RT 80/80" 2649.5))
|
||||
(tu-eq "geruest-text-string/abrunden" "L=965 RT"
|
||||
(geruest-traeger-text-string "L=%2 %1" "RT" 965.4))
|
||||
(tu-eq "geruest-text-string/mehrfach" "A A 10"
|
||||
(geruest-traeger-text-string "%1 %1 %2" "A" 10.0))
|
||||
;; Konfiguration je Feld: Variante vor Baugruppe vor Code-Standard
|
||||
(setq _bgtest (ssg-json-parse
|
||||
(strcat "{\"beschriftung\": {\"format\": \"%1 L=%2\", \"stil\": \"S1\","
|
||||
" \"ausrichtung\": \"BC\", \"hoehe\": 50, \"layer\": \"D-5-BEM\"}}")))
|
||||
(setq _rec (geruest-traeger-beschr-cfg
|
||||
(ssg-json-parse
|
||||
"{\"name\": \"RT 80/80 1 Zoll\", \"beschriftung\": {\"text\": \"RT 80/80\", \"layer\": \"D-6-BEM\"}}")
|
||||
_bgtest "ERSATZ"))
|
||||
(tu-eq "geruest-beschr-cfg/text" "RT 80/80" (cdr (assoc "text" _rec)))
|
||||
(tu-eq "geruest-beschr-cfg/layer" "D-6-BEM" (cdr (assoc "layer" _rec)))
|
||||
(tu-eq "geruest-beschr-cfg/stil" "S1" (cdr (assoc "stil" _rec)))
|
||||
(tu-eqf "geruest-beschr-cfg/hoehe" 50.0 (cdr (assoc "hoehe" _rec)))
|
||||
(setq _rec (geruest-traeger-beschr-cfg
|
||||
(ssg-json-parse "{\"name\": \"Ohne Text\"}") _bgtest "ERSATZ"))
|
||||
(tu-eq "geruest-beschr-cfg/text-name" "Ohne Text" (cdr (assoc "text" _rec)))
|
||||
(tu-eq "geruest-beschr-cfg/layer-bg" "D-5-BEM" (cdr (assoc "layer" _rec)))
|
||||
(setq _rec (geruest-traeger-beschr-cfg nil (ssg-json-parse "{\"id\": \"X\"}") "ERSATZ"))
|
||||
(tu-eq "geruest-beschr-cfg/ersatz" "ERSATZ" (cdr (assoc "text" _rec)))
|
||||
(tu-eq "geruest-beschr-cfg/std-format" "%1 L=%2" (cdr (assoc "format" _rec)))
|
||||
(tu-eq "geruest-beschr-cfg/std-ausr" "BC" (cdr (assoc "ausrichtung" _rec)))
|
||||
(tu-eqf "geruest-beschr-cfg/std-hoehe" 50.0 (cdr (assoc "hoehe" _rec)))
|
||||
(tu-nil "geruest-beschr-cfg/std-layer" (cdr (assoc "layer" _rec)))
|
||||
;; Bereichspruefung auf der Netto-Laenge
|
||||
(tu-true "geruest-traeger-pruefen/innen" (geruest-traeger-pruefen 965.0 0 6000))
|
||||
(tu-nil "geruest-traeger-pruefen/ueber" (geruest-traeger-pruefen 6001.0 0 6000))
|
||||
(tu-true "geruest-traeger-pruefen/grenze" (geruest-traeger-pruefen 6000.0 0 6000))
|
||||
(tu-true "geruest-traeger-pruefen/ohne" (geruest-traeger-pruefen 99999.0 nil nil))
|
||||
(tu-nil "geruest-traeger-pruefen/nil" (geruest-traeger-pruefen nil 0 6000))
|
||||
;; Eingaben in mm: Komma wie Punkt, negativ/Text ungueltig
|
||||
(tu-eqf "geruest-mm-zahl/ganz" 35.0 (geruest-mm-zahl "35"))
|
||||
(tu-eqf "geruest-mm-zahl/komma" 17.5 (geruest-mm-zahl "17,5"))
|
||||
(tu-nil "geruest-mm-zahl/text" (geruest-mm-zahl "abc"))
|
||||
(tu-nil "geruest-mm-zahl/negativ" (geruest-mm-zahl "-5"))
|
||||
(tu-nil "geruest-mm-zahl/leer" (geruest-mm-zahl ""))
|
||||
(tu-eqf "geruest-abzug-wert/leer" 0.0 (geruest-abzug-wert ""))
|
||||
(tu-nil "geruest-abzug-wert/text" (geruest-abzug-wert "x"))
|
||||
(tu-eqf "geruest-tr-abzug/inaktiv" 0.0 (geruest-tr-abzug "0" "x"))
|
||||
(tu-eqf "geruest-tr-abzug/aktiv" 35.0 (geruest-tr-abzug "1" "35"))
|
||||
(tu-eq "geruest-mm-string/ganz" "965" (geruest-mm-string 965.0))
|
||||
(tu-eq "geruest-mm-string/dezimal" "17.5" (geruest-mm-string 17.5))
|
||||
;; Variante darf Attribut-Felder ueberschreiben - auch mit false
|
||||
(setq _bgtest (ssg-json-parse
|
||||
"{\"attribute\": {\"LAENGENABZUGENDE\": {\"vorgabe\": 35, \"aktiv\": true}}}"))
|
||||
(tu-eq "geruest-attr-feld/baugruppe" 35
|
||||
(geruest-attr-feld nil _bgtest "LAENGENABZUGENDE" "vorgabe"))
|
||||
(tu-eq "geruest-attr-feld/variante" 50
|
||||
(geruest-attr-feld
|
||||
(ssg-json-parse "{\"attribute\": {\"LAENGENABZUGENDE\": {\"vorgabe\": 50}}}")
|
||||
_bgtest "LAENGENABZUGENDE" "vorgabe"))
|
||||
(tu-nil "geruest-attr-feld/variante-false"
|
||||
(geruest-attr-feld
|
||||
(ssg-json-parse "{\"attribute\": {\"LAENGENABZUGENDE\": {\"aktiv\": false}}}")
|
||||
_bgtest "LAENGENABZUGENDE" "aktiv"))
|
||||
|
||||
;; --- Rohr-Geruest-Traeger in der echten Datendatei ---
|
||||
;; Eigene Datei data/json/geruest_traeger.json: im Bereichs-Dropdown von
|
||||
;; GERUEST darf er nicht auftauchen, ueber geruest-traeger-daten muss er
|
||||
;; auffindbar sein.
|
||||
(setq _rec nil)
|
||||
(foreach _e (geruest-baugruppen-liste)
|
||||
(if (equal (car _e) "Traeger") (setq _rec T)))
|
||||
(tu-nil "geruest/traeger-nicht-im-dropdown" _rec)
|
||||
(tu-true "geruest/traeger-datei"
|
||||
(findfile (geruest-json-pfad "geruest_traeger.json")))
|
||||
(setq _traeger (geruest-baugruppe "Traeger" (geruest-traeger-daten)))
|
||||
(tu-true "geruest/traeger-vorhanden" _traeger)
|
||||
(tu-nil "geruest/traeger-nicht-in-geruest-json"
|
||||
(geruest-baugruppe "Traeger" (geruest-daten)))
|
||||
(if _traeger
|
||||
(progn
|
||||
(tu-eq "geruest/traeger-varianten-artikel" 0
|
||||
(tu-geruest-artikel-unvollstaendig
|
||||
(ssg-json-get _traeger "geometrie_varianten")))
|
||||
(tu-true "geruest/traeger-layer"
|
||||
(geruest-variante-wert
|
||||
(car (ssg-json-get _traeger "geometrie_varianten"))
|
||||
_traeger "layer"))
|
||||
(tu-eq "geruest/traeger-max" 6000
|
||||
(geruest-attr-feld nil _traeger "LAENGE" "max"))
|
||||
(tu-eqf "geruest/traeger-querstrebe"
|
||||
'("dummy_Strebe_30x4.dwg" 30.0 25.0 500.0 100.0 250.0)
|
||||
(geruest-traeger-strebe-cfg nil _traeger))
|
||||
;; Muffen-Flag ausdruecklich je Variante: genau die "mit (2) Muffe(n)"
|
||||
(setq _rec 0)
|
||||
(foreach _v (ssg-json-get _traeger "geometrie_varianten")
|
||||
(if (geruest-traeger-muffe-dummy _v _traeger) (setq _rec (1+ _rec))))
|
||||
(tu-eq "geruest/traeger-muffen-varianten" 4 _rec)
|
||||
;; Jede Variante definiert Beschriftungstext UND -layer selbst - der
|
||||
;; Layer ist je Traegervariante verschieden, eine Vorgabe der
|
||||
;; Baugruppe gibt es dafuer bewusst nicht.
|
||||
(setq _rec 0)
|
||||
(foreach _v (ssg-json-get _traeger "geometrie_varianten")
|
||||
(setq _cfg (geruest-traeger-beschr-cfg _v _traeger ""))
|
||||
(if (and (geruest-obj-feld _v _traeger '("beschriftung") "text")
|
||||
(/= (cdr (assoc "text" _cfg)) "")
|
||||
(geruest-json-pfad-get _v '("beschriftung" "layer"))
|
||||
(geruest-ausrichtung-codes (cdr (assoc "ausrichtung" _cfg))))
|
||||
(setq _rec (1+ _rec))))
|
||||
(tu-eq "geruest/traeger-beschriftung-varianten"
|
||||
(length (ssg-json-get _traeger "geometrie_varianten")) _rec)
|
||||
;; VARIANTE gehoert zum Traeger-Schema (Grundlage fuer das Neubeschriften)
|
||||
(tu-true "geruest/traeger-attrib-variante"
|
||||
(assoc "VARIANTE" *geruest-traeger-attrib-defs*))
|
||||
;; Beide Dummy-DWGs liegen unter data/geruest
|
||||
(tu-true "geruest/traeger-strebe-dwg"
|
||||
(findfile (geruest-dummy-pfad "dummy_Strebe_30x4.dwg")))
|
||||
(tu-true "geruest/traeger-muffe-dwg"
|
||||
(findfile (geruest-dummy-pfad "dummy_Muffe_1zoll.dwg")))
|
||||
)
|
||||
)
|
||||
|
||||
@@ -992,7 +1280,7 @@
|
||||
(cons "laenge" "2000")
|
||||
(cons "teilefarbe" "RAL 7035 Lichtgrau")
|
||||
(cons "oben" (list (list (cons "artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL")
|
||||
(cons "menge" 2))))
|
||||
(cons "anzahl" 2))))
|
||||
(cons "unten" nil)))
|
||||
(setq _pfad (vl-filename-mktemp "grtest" nil ".json"))
|
||||
(setq _f (open _pfad "w"))
|
||||
@@ -1012,8 +1300,8 @@
|
||||
(ssg-json-get _zurueck "teilefarbe"))
|
||||
(tu-eq "geruest-schreiber/oben-artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL"
|
||||
(ssg-json-get (car (ssg-json-get _zurueck "oben")) "artikel"))
|
||||
(tu-eq "geruest-schreiber/oben-menge" 2
|
||||
(ssg-json-get (car (ssg-json-get _zurueck "oben")) "menge"))
|
||||
(tu-eq "geruest-schreiber/oben-anzahl" 2
|
||||
(ssg-json-get (car (ssg-json-get _zurueck "oben")) "anzahl"))
|
||||
(tu-eq "geruest-schreiber/unten-leer" nil
|
||||
(ssg-json-get _zurueck "unten"))
|
||||
)
|
||||
|
||||
Vendored
+1381
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user