dxf Erzeugung aus den .json Skeletons ermöglicht, um anzuzeigen welche Elemente zusammengehören

This commit is contained in:
2026-07-07 09:54:25 +02:00
parent cbed41da66
commit 2957e24a5f
4 changed files with 4378 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
@echo off
REM ================================================================
REM HundM_Fortna - DXF-Uebersicht der TROs erzeugen
REM
REM Liest die Skeleton-Dateien (%PV_RESULTS%\skeleton_UH0x.json) und
REM erzeugt %PV_RESULTS%\ST500592_TROs.dxf (TRO-Kaesten als Bloecke,
REM Sensoren als Kreise mit Verbindungslinien) fuer AutoCAD/BricsCAD.
REM ================================================================
call "%~dp0setenv.bat"
REM .venv bevorzugen, sonst System-Python
set "PYTHON=python"
if exist "%PROJECT%\.venv\Scripts\python.exe" (
set "PYTHON=%PROJECT%\.venv\Scripts\python.exe"
)
"%PYTHON%" "%PV_LIB%\create_dxf.py" %*
if errorlevel 1 (
echo FEHLER: create_dxf.py wurde mit Fehler beendet.
exit /b 1
)
+646
View File
@@ -0,0 +1,646 @@
; ============================================================
; connect.ini — Routing / Zusammenhalt der TROs (hmf-connect-v1)
; Quelle: doc/TRO_Graph_UH01-UH05.dot (inhaltsgleich zu connect.json)
;
; [UHxx.nodes] TRO = <FB-Kurztyp> | <Kommentar>
; [UHxx.connections] cNNN = <von> -> <nach> | <JamArea> | <kind>
; kind: normal | dir2 | dir3 | bypass | finger
; (dir2/dir3 = Weichenausgang, Richtung aus FC_Direction)
; [UHxx.externals] eNNN = EXTERN -> <TRO> | <JamArea> (Zulauf)
; eNNN = <TRO> -> EXTERN | <JamArea> (Ablauf)
; JamArea JAxxxx_y entspricht "DB_JamAreaxxxx".stJamxxxx_y
; ============================================================
[UH01.nodes]
TRO100 = 1Sep | TRO 100 (1Sep)
TRO101 = EmptyCarrBuffer | TRO101 (Empty Buffer rechts)
TRO101_IN = 1Sep | TRO 101_IN(1Sep)
TRO102 = EmptyCarrBuffer | TRO102 (Empty Buffer links)
TRO102_IN = 1Sep | TRO 102_IN(1Sep)
TRO103 = 1Sep | TRO 103 (1Sep)
TRO104 = 1Sep | TRO 104 (1Sep)+Scanner
TRO105 = 1Sep_SSCC | TRO 105 (1Sep)+Scanner
TRO106 = 1Sep | TRO 106 (1Sep)
TRO107 = 1Sep1Swi | TRO 107(1Sep1Swi)
TRO108 = 1Sep | TRO 108 (1Sep)
TRO109 = 1Sep | TRO 109 (1Sep)+Scanner
TRO110 = 1Sep_SSCC | TRO 110 (1Sep)+Scanner
TRO111 = 1Sep | TRO 111 (1Sep)
TRO112 = 1Sep1Swi | TRO 112 (1Sep1Swi)
TRO113 = 1Sep | TRO 113 (1Sep)+Scanner
TRO114 = 1Sep1Swi | TRO 114 (1Sep1Switch)+Scanner
TRO115 = Vario | TRO 115 (Vario)
TRO116 = 1Sep | TRO 116 (1Sep)
TRO117 = 1Sep | TRO 117 (1Sep) + Scanner
TRO120 = Vario | TRO 120 (Vario)
TRO121 = Vario | TRO 121(Vario)
TRO122 = 1Sep | TRO 122 (1Sep)
TRO123 = Vario | TRO 123 (Vario)
TRO124 = 1Sep1Swi | TRO 124 (1Sep1Switch)
TRO125 = 1Sep | TRO 125 (1Sep)
TRO126 = Vario | TRO 126 (Vario)
TRO127 = Vario | TRO 127 (Vario)
TRO128 = Vario | TRO 128 (Vario)
TRO129 = 1Sep | TRO 129 (1Sep)
TRO130 = 1Sep | TRO 130 (1Sep)
TRO131 = Vario | TRO 131 (Vario)
TRO133 = Vario | TRO 133 (Vario)
TRO134 = Vario | TRO 134 (Vario)
fbLoadingBoom1 = LoadingBoom_INBOUND | LoadingBoom 1
fbLoadingBoom2 = LoadingBoom_INBOUND | LoadingBoom 2
[UH01.connections]
c001 = TRO128 -> TRO100 | JA0100_1 | finger
c002 = TRO100 -> TRO101_IN | JA0101_1 | normal
c003 = TRO101_IN -> TRO102_IN | JA0101_2 | normal
c004 = TRO102 -> TRO107 | JA0102_1 | normal
c005 = TRO117 -> TRO107 | JA0102_1 | normal
c006 = TRO101 -> TRO112 | JA0102_2 | normal
c007 = TRO106 -> TRO112 | JA0102_2 | normal
c008 = TRO107 -> TRO112 | JA0102_2 | dir2
c009 = TRO111 -> TRO113 | JA0102_3 | normal
c010 = TRO112 -> TRO113 | JA0102_3 | dir2
c011 = TRO113 -> TRO114 | JA0102_4 | normal
c012 = TRO114 -> TRO116 | JA0102_5 | dir2
c013 = TRO116 -> TRO117 | JA0102_6 | normal
c014 = TRO107 -> TRO103 | JA0103_1 | normal
c015 = TRO103 -> TRO104 | JA0104_1 | normal
c016 = TRO104 -> fbLoadingBoom1 | JA0104_2 | normal
c017 = fbLoadingBoom1 -> TRO105 | JA0104_3 | normal
c018 = TRO105 -> TRO106 | JA0106_2 | normal
c019 = TRO112 -> TRO108 | JA0107_1 | normal
c020 = TRO108 -> TRO109 | JA0108_1 | normal
c021 = TRO109 -> fbLoadingBoom2 | JA0108_2 | normal
c022 = fbLoadingBoom2 -> TRO110 | JA0108_3 | normal
c023 = TRO110 -> TRO111 | JA0110_2 | normal
c024 = TRO115 -> TRO120 | JA4103_1 | finger
c025 = TRO125 -> TRO126 | JA4203_1 | normal
c026 = TRO129 -> TRO130 | JA4204_1 | normal
c027 = TRO124 -> TRO125 | JA4204_2 | normal
c028 = TRO133 -> TRO129 | JA4302_2 | finger
c029 = TRO134 -> TRO131 | JA4403_1 | finger
c030 = TRO124 -> TRO127 | JA4501_1 | dir2
c031 = TRO130 -> TRO127 | JA4501_1 | normal
c032 = TRO127 -> TRO128 | JA4501_2 | finger
c033 = TRO122 -> TRO123 | JA4502_1 | normal
c034 = TRO123 -> TRO124 | JA4502_2 | finger
c035 = TRO121 -> TRO122 | JA4503_2 | finger
c036 = TRO101_IN -> TRO101 | JamBuffer101 | normal
c037 = TRO102_IN -> TRO102 | JamBuffer102 | normal
[UH01.externals]
e001 = EXTERN -> TRO115 | JA4104_1
e002 = EXTERN -> TRO133 | JA4302_1
e003 = EXTERN -> TRO134 | JA4402_1
e004 = EXTERN -> TRO121 | JA4503_1
[UH02.nodes]
TRO200 = Vario | TRO 200 (Vario)
TRO201 = 1Sep | TRO 201 (1Sep)
TRO202 = 1Sep1Swi | TRO 202 (1Sep1Switch)+Scanner(BX2103)
TRO203 = 1Sep1Swi | TRO 203 (1Sep1Switch) + Scanner (BX2111)
TRO204 = 1Sep1Swi | TRO 204(1Sep1Switch) + Scanner(BX2112)
TRO205 = 1Sep1Swi | TRO 205 (1Sep1Switch) + Scanner(BX2114)
TRO206 = 1Sep1Swi | TRO 206 (1Sep1Switch)+Scanner(BX2113)
TRO207 = 1Sep | TRO 207(1Sep)
TRO208 = PinStore_Auto | Aufruf: TRO208
TRO209 = Vario | TRO 209 (Vario)
TRO210 = 1Sep | TRO 210 (1Sep)
TRO211 = PinStore_Auto | Aufruf: TRO211
TRO212 = Vario | TRO 212 (Vario)
TRO213 = 1Sep | TRO 213 (1Sep)
TRO214 = PinStore_Auto | Aufruf: TRO214
TRO215 = Vario | TRO 215 (Vario)
TRO216 = 1Sep | TRO 216 (1Sep)
TRO217 = PinStore_Auto | Aufruf: TRO217
TRO218 = Vario | TRO 218 (Vario)
TRO219 = 1Sep | TRO 219(1Sep)
TRO220 = Vario | TRO 220 (Vario)
TRO221 = 1Sep | TRO 221 (1Sep)
TRO222 = 1Sep1Swi | TRO 222 (1Sep1Switch)+Scanner(BX2121)
TRO223 = 1Sep1Swi | TRO 223 (1Sep1Switch)+Scanner(BX2126)
TRO224 = 1Sep1Swi | TRO 224 (1Sep1Switch)+Scanner(BX2127)
TRO225 = 1Sep1Swi | TRO 225(1Sep1Switch)+Scanner(BX2129)
TRO226 = 1Sep1Swi | TRO 226 (1Sep1Switch)+Scanner(BX2128)
TRO227 = 1Sep | TRO 227 (1Sep)
TRO228 = PinStore_Auto | Aufruf: TRO228
TRO229 = Vario | TRO 229 (Vario)
TRO230 = 1Sep | TRO 230 (1Sep)
TRO231 = PinStore_Auto | Aufruf: TRO231
TRO232 = Vario | TRO 232 (Vario)
TRO233 = 1Sep | TRO 233 (1Sep)
TRO234 = PinStore_Auto | Aufruf: TRO234
TRO235 = Vario | TRO 235 (Vario)
TRO236 = 1Sep | TRO 236 (1Sep)
TRO237 = PinStore_Auto | Aufruf: TRO237
TRO238 = Vario | TRO 238 (Vario)
TRO239 = 1Sep | TRO 239 (1Sep)
TRO240 = Vario | TRO 240 (Vario)
TRO241 = 1Sep | TRO 241(1Sep)
TRO242 = 1Sep1Swi | TRO 242 (1Sep1Switch)+Scanner(BX2130)
TRO243 = 1Sep1Swi | TRO 243 (1Sep1Switch)+Scanner(BX3137)
TRO244 = 1Sep1Swi | TRO 244 (1Sep1Switch)+Scanner(BX2136)
TRO245 = 1Sep1Swi | TRO 245 (1Sep1Switch)+Scanner(BX2138)
TRO246 = 1Sep1Swi | TRO 246 (1Sep1Switch)+Scanner(BX2137)
TRO247 = 1Sep | TRO 247(1Sep)
TRO248 = PinStore_Auto | Aufruf: TRO248
TRO249 = Vario | TRO 249 (Vario)
TRO250 = 1Sep | TRO 250 (1Sep)
TRO251 = PinStore_Auto | Aufruf: TRO251
TRO252 = Vario | TRO 252 (Vario)
TRO253 = 1Sep | TRO 253 (1Sep)
TRO254 = PinStore_Auto | Aufruf: TRO254
TRO255 = Vario | TRO 255 (Vario)
TRO256 = 1Sep | TRO 256 (1Sep)
TRO257 = PinStore_Auto | Aufruf: TRO257
TRO258 = Vario | TRO 258 (Vario)
TRO259 = 1Sep | TRO 259 (1Sep)
TRO260 = Vario | TRO 260 (Vario) + Scanner (BX2115)
TRO261 = 1Sep | TRO 261 (1Sep)
TRO262 = Vario | TRO 262 (Vario) + Scanner (BX2109)
TRO263 = 1Sep | TRO 263 (1Sep)
TRO264 = Vario | TRO 264 (Vario) + Scanner (BX2108)
TRO265 = 1Sep | TRO 265 (1Sep)
TRO266 = 1Sep | TRO 266(1Sep)
TRO267 = 1Sep2Swi | TRO 267 (1Sep2Switch)+Scanner(BX2100)
TRO268 = 1Sep2Swi | TRO 268 (1Sep2Switch)+Scanner(BX2101)
TRO269 = 1Sep | TRO 269 (1Sep)+Scanner (BX2102)
TRO270 = Vario | TRO 270 (Vario)
TRO272 = Vario | TRO 272 (Vario)
TRO274 = 1Sep | TRO 274 (1Sep)
TRO275 = 1Sep | TRO 275 (1Sep)
[UH02.connections]
c001 = TRO202 -> TRO211 | JA1101_1 | dir2
c002 = TRO213 -> TRO211 | JA1101_1 | normal
c003 = TRO211 -> TRO208 | JA1101_2 | bypass
c004 = TRO210 -> TRO208 | JA1101_2 | normal
c005 = TRO201 -> TRO202 | JA1102_1 | normal
c006 = TRO202 -> TRO214 | JA1102_2 | normal
c007 = TRO216 -> TRO214 | JA1102_2 | normal
c008 = TRO214 -> TRO217 | JA1102_3 | bypass
c009 = TRO219 -> TRO217 | JA1102_3 | normal
c010 = TRO208 -> TRO203 | JA1103_1 | normal
c011 = TRO211 -> TRO204 | JA1103_2 | normal
c012 = TRO203 -> TRO204 | JA1103_2 | dir2
c013 = TRO217 -> TRO205 | JA1104_1 | normal
c014 = TRO214 -> TRO206 | JA1104_2 | normal
c015 = TRO205 -> TRO206 | JA1104_2 | normal
c016 = TRO204 -> TRO207 | JA1104_3 | dir2
c017 = TRO206 -> TRO207 | JA1104_3 | normal
c018 = TRO203 -> TRO209 | JA1105_1 | normal
c019 = TRO209 -> TRO210 | JA1105_2 | finger
c020 = TRO204 -> TRO212 | JA1106_1 | normal
c021 = TRO212 -> TRO213 | JA1106_2 | finger
c022 = TRO206 -> TRO215 | JA1107_1 | dir2
c023 = TRO215 -> TRO216 | JA1107_2 | finger
c024 = TRO205 -> TRO218 | JA1108_1 | dir2
c025 = TRO218 -> TRO219 | JA1108_2 | finger
c026 = TRO200 -> TRO201 | JA1109_2 | finger
c027 = TRO268 -> TRO269 | JA1110_1 | dir3
c028 = TRO261 -> TRO274 | JA1110_2 | normal
c029 = TRO269 -> TRO274 | JA1110_2 | normal
c030 = TRO263 -> TRO266 | JA1110_3 | normal
c031 = TRO274 -> TRO266 | JA1110_3 | normal
c032 = TRO265 -> TRO267 | JA1110_4 | normal
c033 = TRO266 -> TRO267 | JA1110_4 | normal
c034 = TRO267 -> TRO275 | JA1110_5 | dir3
c035 = TRO275 -> TRO268 | JA1110_6 | normal
c036 = TRO222 -> TRO231 | JA1201_1 | dir2
c037 = TRO233 -> TRO231 | JA1201_1 | normal
c038 = TRO231 -> TRO228 | JA1201_2 | bypass
c039 = TRO230 -> TRO228 | JA1201_2 | normal
c040 = TRO221 -> TRO222 | JA1202_1 | normal
c041 = TRO222 -> TRO234 | JA1202_2 | normal
c042 = TRO236 -> TRO234 | JA1202_2 | normal
c043 = TRO234 -> TRO237 | JA1202_3 | bypass
c044 = TRO239 -> TRO237 | JA1202_3 | normal
c045 = TRO228 -> TRO223 | JA1203_1 | normal
c046 = TRO231 -> TRO224 | JA1203_2 | normal
c047 = TRO223 -> TRO224 | JA1203_2 | dir2
c048 = TRO237 -> TRO225 | JA1204_1 | normal
c049 = TRO234 -> TRO226 | JA1204_2 | normal
c050 = TRO225 -> TRO226 | JA1204_2 | normal
c051 = TRO224 -> TRO227 | JA1204_3 | dir2
c052 = TRO226 -> TRO227 | JA1204_3 | normal
c053 = TRO223 -> TRO229 | JA1205_1 | normal
c054 = TRO229 -> TRO230 | JA1205_2 | finger
c055 = TRO224 -> TRO232 | JA1206_1 | normal
c056 = TRO232 -> TRO233 | JA1206_2 | finger
c057 = TRO226 -> TRO235 | JA1207_1 | dir2
c058 = TRO235 -> TRO236 | JA1207_2 | finger
c059 = TRO225 -> TRO238 | JA1208_1 | dir2
c060 = TRO238 -> TRO239 | JA1208_2 | finger
c061 = TRO220 -> TRO221 | JA1209_2 | finger
c062 = TRO248 -> TRO243 | JA1301_1 | normal
c063 = TRO251 -> TRO244 | JA1301_2 | normal
c064 = TRO243 -> TRO244 | JA1301_2 | normal
c065 = TRO257 -> TRO245 | JA1302_1 | normal
c066 = TRO254 -> TRO246 | JA1302_2 | normal
c067 = TRO245 -> TRO246 | JA1302_2 | dir2
c068 = TRO242 -> TRO251 | JA1303_1 | normal
c069 = TRO253 -> TRO251 | JA1303_1 | normal
c070 = TRO251 -> TRO248 | JA1303_2 | bypass
c071 = TRO250 -> TRO248 | JA1303_2 | normal
c072 = TRO241 -> TRO242 | JA1304_1 | normal
c073 = TRO242 -> TRO254 | JA1304_2 | dir2
c074 = TRO256 -> TRO254 | JA1304_2 | normal
c075 = TRO254 -> TRO257 | JA1304_3 | bypass
c076 = TRO259 -> TRO257 | JA1304_3 | normal
c077 = TRO243 -> TRO249 | JA1305_1 | dir2
c078 = TRO249 -> TRO250 | JA1305_2 | finger
c079 = TRO244 -> TRO252 | JA1306_1 | dir2
c080 = TRO252 -> TRO253 | JA1306_2 | finger
c081 = TRO246 -> TRO255 | JA1307_1 | normal
c082 = TRO255 -> TRO256 | JA1307_2 | finger
c083 = TRO245 -> TRO258 | JA1308_1 | normal
c084 = TRO258 -> TRO259 | JA1308_2 | finger
c085 = TRO240 -> TRO241 | JA1309_2 | finger
c086 = TRO264 -> TRO265 | JA1401_2 | finger
c087 = TRO262 -> TRO263 | JA1501_2 | finger
c088 = TRO260 -> TRO261 | JA1601_2 | finger
[UH02.externals]
e001 = EXTERN -> TRO200 | JA1109_1
e002 = EXTERN -> TRO220 | JA1209_1
e003 = TRO244 -> EXTERN | JA1302_3
e004 = TRO246 -> EXTERN | JA1302_3
e005 = EXTERN -> TRO240 | JA1309_1
e006 = EXTERN -> TRO264 | JA1401_1
e007 = EXTERN -> TRO262 | JA1501_1
e008 = EXTERN -> TRO260 | JA1601_1
e009 = EXTERN -> TRO272 | JA1801_1
e010 = EXTERN -> TRO270 | JA4701_1
e011 = EXTERN -> TRO208 | Storage1.1.1
e012 = EXTERN -> TRO211 | Storage1.1.2
e013 = EXTERN -> TRO214 | Storage1.1.3
e014 = EXTERN -> TRO217 | Storage1.1.4
e015 = EXTERN -> TRO228 | Storage1.2.1
e016 = EXTERN -> TRO231 | Storage1.2.2
e017 = EXTERN -> TRO234 | Storage1.2.3
e018 = EXTERN -> TRO237 | Storage1.2.4
e019 = EXTERN -> TRO248 | Storage1.3.1
e020 = EXTERN -> TRO251 | Storage1.3.2
e021 = EXTERN -> TRO254 | Storage1.3.3
e022 = EXTERN -> TRO257 | Storage1.3.4
e023 = TRO207 -> EXTERN | IO_Device_UH02_TO_UH01.stCARRIER_INFO
e024 = TRO227 -> EXTERN | IO_Device_UH02_TO_UH01.stCARRIER_INFO_1
e025 = TRO247 -> EXTERN | IO_Device_UH02_TO_UH01.stCARRIER_INFO_2
[UH03.nodes]
TRO300 = Vario | TRO 300 (Vario)
TRO301 = 1Sep | TRO 301(1Sep)
TRO302 = Vario | TRO 302 (Vario)
TRO303 = Vario | TRO 303 (Vario)
TRO304 = 1Sep | TRO 304(1Sep)
TRO305 = Vario | TRO 305 (Vario)
TRO306 = Vario | TRO 306 (Vario)
TRO307 = Vario | TRO 307 (Vario)
TRO308 = Vario | TRO 308 (Vario)
TRO309 = 1Sep | TRO 309 (1Sep)
TRO310 = 1Sep | TRO 310 (1Sep)+Scanner (BX3102)
TRO311 = 1Sep | TRO 311 (1Sep)+Scanner(BX3101)
TRO312 = 1Sep | TRO 312 (1Sep)+Scanner(BX3100)
TRO313 = 1Sep1Swi | TRO 313 (1Sep1Switch)+Scanner(BX3103)
TRO314 = 1Sep1Swi | TRO 314 (1Sep1Switch)+Scanner(BX3104)
TRO315 = 1Sep | TRO 315 (1Sep)
TRO316 = 1Sep | TRO 316 (1Sep)
TRO317 = 1Sep1Swi | TRO 317 (1Sep1Switch)+Scanner(BX3105)
TRO318 = 1Sep1Swi | TRO 318 (1Sep1Switch) + Scanner(BX3106)
TRO319 = 1Sep1Swi | TRO 319 (1Sep1Switch) + Scanner (BX3111)
TRO320 = 1Sep1Swi | TRO 320 (1Sep1Switch) + Scanner(BX3112)
TRO321 = 1Sep1Swi | TRO 321 (1Sep1Switch) + Scanner(BX3114)
TRO322 = 1Sep1Swi | TRO 322 (1Sep1Switch)+Scanner(BX3113)
TRO323 = 1Sep | TRO 323 (1Sep)
TRO324 = Vario | TRO 324 (Vario)
TRO325 = 1Sep | TRO 325 (1Sep)
TRO326 = 1Sep | TRO 326 (1Sep)
TRO327 = PinStore_Auto | Aufruf: TRO327
TRO328 = Vario | TRO 328 (Vario)
TRO329 = 1Sep | TRO 329 (1Sep)
TRO330 = PinStore_Auto | Aufruf: TRO330
TRO331 = Vario | TRO 331 (Vario)
TRO332 = 1Sep | TRO 332 (1Sep)
TRO333 = PinStore_Auto | Aufruf: TRO333
TRO334 = Vario | TRO 334 (Vario)
TRO335 = 1Sep | TRO 335 (1Sep)
TRO336 = PinStore_Auto | Aufruf: TRO336
TRO337 = Vario | TRO 337 (Vario)
TRO338 = 1Sep | TRO 338 (1Sep)
TRO339 = 1Sep1Swi | TRO 339 (1Sep1Switch)+Scanner(BX3120)
TRO340 = 1Sep1Swi | TRO 340 (1Sep1Switch)+Scanner(BX3121)
TRO341 = 1Sep1Swi | TRO 341 (1Sep1Switch)+Scanner(BX3126)
TRO342 = 1Sep1Swi | TRO 342 (1Sep1Switch)+Scanner(BX3127)
TRO343 = 1Sep1Swi | TRO 343 (1Sep1Switch)+Scanner(BX3129)
TRO344 = 1Sep1Swi | TRO 344 (1Sep1Switch)+Scanner(BX3128)
TRO345 = 1Sep | TRO 345 (1Sep)
TRO346 = Vario | TRO 346 (Vario)
TRO347 = 1Sep | TRO 347 (1Sep)
TRO348 = 1Sep | TRO 348 (1Sep)
TRO349 = PinStore_Auto | Aufruf: TRO349
TRO350 = Vario | TRO 350 (Vario)
TRO351 = 1Sep | TRO 351 (1Sep)
TRO352 = PinStore_Auto | Aufruf: TRO352
TRO353 = Vario | TRO 353 (Vario)
TRO354 = 1Sep | TRO 354 (1Sep)
TRO355 = PinStore_Auto | Aufruf: TRO355
TRO356 = Vario | TRO 356 (Vario)
TRO357 = 1Sep | TRO 357 (1Sep)
TRO358 = PinStore_Auto | Aufruf: TRO358
TRO359 = Vario | TRO 359 (Vario)
TRO360 = 1Sep | TRO 360 (1Sep)
TRO361 = 1Sep1Swi | TRO 361 (1Sep1Switch)+Scanner(BX3131)
TRO362 = 1Sep1Swi | TRO 362 (1Sep1Switch)+Scanner(BX3132)
TRO363 = 1Sep1Swi | TRO 363 (1Sep1Switch)+Scanner(BX3137)
TRO364 = 1Sep1Swi | TRO 364 (1Sep1Switch)+Scanner(BX3138)
TRO365 = 1Sep1Swi | TRO 365 (1Sep1Switch)+Scanner(BX3140)
TRO366 = 1Sep1Swi | TRO 366 (1Sep1Switch)+Scanner(BX3139)
TRO367 = 1Sep | TRO 367 (1Sep)
TRO368 = Vario | TRO 368 (Vario, from Lvl1)
TRO369 = 1Sep | TRO 369 (1Sep)
TRO370 = 1Sep | TRO 370 (1Sep)
TRO371 = PinStore_Auto | Aufruf: TRO371
TRO372 = Vario | TRO 372 (Vario)
TRO373 = 1Sep | TRO 373 (1Sep)
TRO374 = PinStore_Auto | Aufruf: TRO374
TRO375 = Vario | TRO 375 (Vario)
TRO376 = 1Sep | TRO 376 (1Sep)
TRO377 = PinStore_Auto | Aufruf: TRO377
TRO378 = Vario | TRO 378 (Vario)
TRO379 = 1Sep | TRO 379 (1Sep)
TRO380 = PinStore_Auto | Aufruf: TRO380
TRO381 = Vario | TRO 381 (Vario)
TRO382 = 1Sep | TRO 382 (1Sep)
TRO386 = 1Sep | TRO 386 (1Sep) - kam später dazu
[UH03.connections]
c001 = TRO318 -> TRO330 | JA2101_1 | dir2
c002 = TRO332 -> TRO330 | JA2101_1 | normal
c003 = TRO330 -> TRO327 | JA2101_2 | bypass
c004 = TRO329 -> TRO327 | JA2101_2 | normal
c005 = TRO315 -> TRO317 | JA2102_1 | normal
c006 = TRO317 -> TRO318 | JA2102_2 | normal
c007 = TRO318 -> TRO333 | JA2102_3 | normal
c008 = TRO335 -> TRO333 | JA2102_3 | normal
c009 = TRO333 -> TRO336 | JA2102_4 | bypass
c010 = TRO338 -> TRO336 | JA2102_4 | normal
c011 = TRO327 -> TRO319 | JA2103_1 | normal
c012 = TRO330 -> TRO320 | JA2103_2 | normal
c013 = TRO319 -> TRO320 | JA2103_2 | dir2
c014 = TRO336 -> TRO321 | JA2104_1 | normal
c015 = TRO333 -> TRO322 | JA2104_2 | normal
c016 = TRO321 -> TRO322 | JA2104_2 | normal
c017 = TRO320 -> TRO323 | JA2104_3 | dir2
c018 = TRO322 -> TRO323 | JA2104_3 | normal
c019 = TRO323 -> TRO326 | JA2104_4 | normal
c020 = TRO325 -> TRO326 | JA2104_4 | normal
c021 = TRO319 -> TRO328 | JA2105_1 | normal
c022 = TRO328 -> TRO329 | JA2105_2 | finger
c023 = TRO320 -> TRO331 | JA2106_1 | normal
c024 = TRO331 -> TRO332 | JA2106_2 | finger
c025 = TRO322 -> TRO334 | JA2107_1 | dir2
c026 = TRO334 -> TRO335 | JA2107_2 | finger
c027 = TRO321 -> TRO337 | JA2108_1 | dir2
c028 = TRO337 -> TRO338 | JA2108_2 | finger
c029 = TRO324 -> TRO325 | JA2109_2 | finger
c030 = TRO386 -> TRO310 | JA2110_1 | normal
c031 = TRO310 -> TRO313 | JA2110_2 | normal
c032 = TRO311 -> TRO313 | JA2110_2 | normal
c033 = TRO312 -> TRO313 | JA2110_2 | normal
c034 = TRO313 -> TRO314 | JA2110_3 | dir2
c035 = TRO314 -> TRO315 | JA2110_4 | dir2
c036 = TRO309 -> TRO386 | JA2110_5 | normal
c037 = TRO308 -> TRO309 | JA2111_2 | finger
c038 = TRO313 -> TRO316 | JA2112_1 | normal
c039 = TRO340 -> TRO352 | JA2201_1 | dir2
c040 = TRO354 -> TRO352 | JA2201_1 | normal
c041 = TRO352 -> TRO349 | JA2201_2 | bypass
c042 = TRO351 -> TRO349 | JA2201_2 | normal
c043 = TRO314 -> TRO339 | JA2202_1 | normal
c044 = TRO339 -> TRO340 | JA2202_2 | normal
c045 = TRO340 -> TRO355 | JA2202_3 | normal
c046 = TRO357 -> TRO355 | JA2202_3 | normal
c047 = TRO355 -> TRO358 | JA2202_4 | bypass
c048 = TRO360 -> TRO358 | JA2202_4 | normal
c049 = TRO349 -> TRO341 | JA2203_1 | normal
c050 = TRO352 -> TRO342 | JA2203_2 | normal
c051 = TRO341 -> TRO342 | JA2203_2 | dir2
c052 = TRO358 -> TRO343 | JA2204_1 | normal
c053 = TRO355 -> TRO344 | JA2204_2 | normal
c054 = TRO343 -> TRO344 | JA2204_2 | normal
c055 = TRO342 -> TRO345 | JA2204_3 | dir2
c056 = TRO344 -> TRO345 | JA2204_3 | normal
c057 = TRO345 -> TRO348 | JA2204_4 | normal
c058 = TRO347 -> TRO348 | JA2204_4 | normal
c059 = TRO341 -> TRO350 | JA2205_1 | normal
c060 = TRO350 -> TRO351 | JA2205_2 | finger
c061 = TRO342 -> TRO353 | JA2206_1 | normal
c062 = TRO353 -> TRO354 | JA2206_2 | finger
c063 = TRO344 -> TRO356 | JA2207_1 | dir2
c064 = TRO356 -> TRO357 | JA2207_2 | finger
c065 = TRO343 -> TRO359 | JA2208_1 | dir2
c066 = TRO359 -> TRO360 | JA2208_2 | finger
c067 = TRO346 -> TRO347 | JA2209_2 | finger
c068 = TRO371 -> TRO363 | JA2301_1 | normal
c069 = TRO374 -> TRO364 | JA2301_2 | normal
c070 = TRO363 -> TRO364 | JA2301_2 | normal
c071 = TRO380 -> TRO365 | JA2302_1 | normal
c072 = TRO377 -> TRO366 | JA2302_2 | normal
c073 = TRO365 -> TRO366 | JA2302_2 | dir2
c074 = TRO364 -> TRO367 | JA2302_3 | normal
c075 = TRO366 -> TRO367 | JA2302_3 | dir2
c076 = TRO367 -> TRO370 | JA2302_4 | normal
c077 = TRO369 -> TRO370 | JA2302_4 | normal
c078 = TRO362 -> TRO374 | JA2303_1 | normal
c079 = TRO376 -> TRO374 | JA2303_1 | normal
c080 = TRO374 -> TRO371 | JA2303_2 | bypass
c081 = TRO373 -> TRO371 | JA2303_2 | normal
c082 = TRO316 -> TRO361 | JA2304_1 | normal
c083 = TRO361 -> TRO362 | JA2304_2 | dir2
c084 = TRO362 -> TRO377 | JA2304_3 | dir2
c085 = TRO379 -> TRO377 | JA2304_3 | normal
c086 = TRO377 -> TRO380 | JA2304_4 | bypass
c087 = TRO382 -> TRO380 | JA2304_4 | normal
c088 = TRO363 -> TRO372 | JA2305_1 | dir2
c089 = TRO372 -> TRO373 | JA2305_2 | finger
c090 = TRO364 -> TRO375 | JA2306_1 | dir2
c091 = TRO375 -> TRO376 | JA2306_2 | finger
c092 = TRO366 -> TRO378 | JA2307_1 | normal
c093 = TRO378 -> TRO379 | JA2307_2 | finger
c094 = TRO365 -> TRO381 | JA2308_1 | normal
c095 = TRO381 -> TRO382 | JA2308_2 | finger
c096 = TRO368 -> TRO369 | JA2309_2 | finger
c097 = TRO300 -> TRO302 | JA4101_1 | finger
c098 = TRO301 -> TRO302 | JA4101_1 | normal
c099 = TRO302 -> TRO311 | JA4101_2 | finger
c100 = TRO303 -> TRO305 | JA4201_1 | finger
c101 = TRO304 -> TRO305 | JA4201_1 | normal
c102 = TRO305 -> TRO312 | JA4201_2 | finger
[UH03.externals]
e001 = TRO336 -> EXTERN | JA2102_5
e002 = EXTERN -> TRO324 | JA2109_1
e003 = EXTERN -> TRO308 | JA2111_1
e004 = TRO358 -> EXTERN | JA2202_5
e005 = EXTERN -> TRO346 | JA2209_1
e006 = EXTERN -> TRO368 | JA2309_1
e007 = EXTERN -> TRO300 | JA4102_1
e008 = EXTERN -> TRO301 | JA4102_2
e009 = EXTERN -> TRO303 | JA4202_1
e010 = EXTERN -> TRO304 | JA4202_2
e011 = EXTERN -> TRO306 | JA4301_1
e012 = EXTERN -> TRO307 | JA4401_1
e013 = EXTERN -> TRO327 | Storage2.1.1
e014 = EXTERN -> TRO330 | Storage2.1.2
e015 = EXTERN -> TRO333 | Storage2.1.3
e016 = EXTERN -> TRO336 | Storage2.1.4
e017 = EXTERN -> TRO349 | Storage2.2.1
e018 = EXTERN -> TRO352 | Storage2.2.2
e019 = EXTERN -> TRO355 | Storage2.2.3
e020 = EXTERN -> TRO358 | Storage2.2.4
e021 = EXTERN -> TRO371 | Storage2.3.1
e022 = EXTERN -> TRO374 | Storage2.3.2
e023 = EXTERN -> TRO377 | Storage2.3.3
e024 = EXTERN -> TRO380 | Storage2.3.4
e025 = TRO326 -> EXTERN | IO_Device_UH03_TO_UH01.stCARRIER_INFO
e026 = TRO348 -> EXTERN | IO_Device_UH03_TO_UH01.stCARRIER_INFO_1
e027 = TRO370 -> EXTERN | IO_Device_UH03_TO_UH01.stCARRIER_INFO_2
e028 = TRO317 -> EXTERN | IO_Device_UH03_TO_UH01.stCarrierL2toL1
e029 = TRO339 -> EXTERN | IO_Device_UH03_TO_UH01.stCarrierL2toL1_2
e030 = TRO361 -> EXTERN | IO_Device_UH03_TO_UH01.stCarrierL2toL1_3
[UH04.nodes]
TRO400 = Vario | TRO 400 (Vario)
TRO401 = Vario | TRO 401 (Vario)
TRO402 = 1Sep | TRO 402 (1Sep) (Vor Brandschutztor)
TRO403 = Vario | TRO 403 (Vario)
TRO404 = 1Sep | TRO 404 (1Sep)
TRO405 = 1Sep1Swi | TRO 405 (1Sep1Switch) + Scanner (BX4100) + Behangskontrolle
TRO406 = 1Sep | TRO 406 (1Sep) + Scanner (BX4101)
TRO407 = 1Sep1Swi | TRO 407 (1Sep1Switch) + Scanner (BX4102)
TRO408 = Vario | TRO 408 (Vario)
TRO409 = 1Sep | TRO 409 (1Sep)
TRO410 = 1Sep1Swi | TRO 410 (1Sep1Switch) + Scanner (BX4104)
TRO411 = Vario | TRO 411 (Vario)
TRO412 = 1Sep | TRO 412 (1Sep)
TRO413 = 1Sep1Swi | TRO 413(1Sep1Switch)+Scanner(BX4106)
TRO414 = Vario | TRO 414 (Vario)
TRO415 = 1Sep | TRO 415 (1Sep)
TRO416 = 1Sep | TRO 416 (1Sep) + Beladeprüfung
TRO417 = 1Sep | TRO 417 (1Sep)
TRO418 = Vario | TRO 418 (Vario)
TRO420 = Vario | TRO 420 (Vario)
TRO421 = Vario_workStation | TRO 421 (Vario)
TRO422 = Vario_workStation | TRO 422 (Vario)
TRO423 = Vario_workStation | TRO 423 (Vario)
TRO424 = 1Sep | TRO 424 (1Sep) vor Behangskontrolle
[UH04.connections]
c001 = TRO400 -> TRO401 | JA4001_1 | finger
c002 = TRO401 -> TRO402 | JA4001_2 | finger
c003 = TRO402 -> TRO403 | JA4002_1 | normal
c004 = TRO403 -> TRO404 | JA4002_2 | finger
c005 = TRO424 -> TRO405 | JA4003_1 | normal
c006 = TRO405 -> TRO406 | JA4003_2 | dir2
c007 = TRO406 -> TRO407 | JA4003_3 | normal
c008 = TRO407 -> TRO410 | JA4003_4 | dir2
c009 = TRO409 -> TRO410 | JA4003_4 | normal
c010 = TRO410 -> TRO413 | JA4003_5 | dir2
c011 = TRO412 -> TRO413 | JA4003_5 | normal
c012 = TRO413 -> TRO416 | JA4003_6 | dir2
c013 = TRO415 -> TRO416 | JA4003_6 | normal
c014 = TRO416 -> TRO417 | JA4003_7 | normal
c015 = TRO404 -> TRO424 | JA4003_8 | normal
c016 = TRO417 -> TRO424 | JA4003_8 | normal
c017 = TRO407 -> TRO408 | JA4004_1 | normal
c018 = TRO408 -> TRO421 | JA4004_2 | finger
c019 = TRO410 -> TRO411 | JA4006_1 | normal
c020 = TRO411 -> TRO422 | JA4006_2 | finger
c021 = TRO422 -> TRO412 | JA4007_1 | finger
c022 = TRO413 -> TRO414 | JA4008_1 | normal
c023 = TRO414 -> TRO423 | JA4008_2 | finger
c024 = TRO423 -> TRO415 | JA4009_1 | finger
c025 = TRO418 -> TRO420 | JA4011_1 | finger
[UH04.externals]
e001 = EXTERN -> TRO400 | JA4000_1
e002 = TRO421 -> EXTERN | JA4005_1
e003 = EXTERN -> TRO418 | JA4010_1
[UH05.nodes]
TRO500 = Vario | TRO 500 (Vario) - Stand: Vorbereitet für Umbau!
TRO501 = 1Sep | TRO 501 (1Sep) + Scanner (BX5101)
TRO502 = Vario | TRO 502 (Vario) - Stand: Vorbereitet für Umbau!
TRO503 = 1Sep | TRO 503 (1Sep)+ Scanner (BX5100)
TRO504 = 1Sep | TRO 504 (1Sep)
TRO505 = 1Sep1Swi | TRO 505 (1Sep1Switch) + Scanner (BX5102)
TRO506 = Vario | TRO 506 (Vario)
TRO507 = 1Sep | TRO 507 (1Sep)
TRO508 = Vario | TRO 508 (Vario)+Scanner(BX5103)
TRO509 = 1Sep | TRO 509 (1Sep)
TRO510 = 1Sep1Swi | TRO 510 (1Sep1Switch) + Scanner (BX5104)
TRO511 = 1Sep | TRO 511 (1Sep)
TRO512 = Vario | TRO 512 (Vario)+Scanner(BX5105)
TRO513 = 1Sep | TRO 513 (1Sep)
TRO514 = 1Sep1Swi | TRO 514 (1Sep1Switch) + Scanner (BX5106)
TRO515 = 1Sep | TRO 515 (1Sep)
TRO516 = Vario | TRO 516(Vario)+Scanner(BX5107)
TRO517 = 1Sep | TRO 517 (1Sep)
TRO518 = 1Sep1Swi | TRO 518 (1Sep1Switch) + Scanner (BX5108)
TRO519 = 1Sep | TRO 519 (1Sep)
TRO520 = Vario | TRO 520 (Vario)+Scanner(BX5109)
TRO521 = 1Sep | TRO 521(1Sep)
TRO522 = 1Sep1Swi | TRO 522 (1Sep1Switch) + Scanner (BX5110)
TRO523 = 1Sep | TRO 523 (1Sep)
TRO524 = Vario | TRO 524 (Vario)+Scanner(BX5231)
TRO525 = 1Sep | TRO 525(1Sep)
TRO526 = 1Sep | TRO 526 (1Sep) + Scanner (BX5112)
TRO527 = 1Sep1Swi | TRO 527 (1Sep1Switch)
TRO528 = 1Sep | TRO 528 (1Sep)
TRO529 = 1Sep | TRO 529 (1Sep) + Scanner (BX5113)
TRO530 = Vario | TRO 530 (Vario)
TRO531 = Vario | TRO 531 (Vario)
[UH05.connections]
c001 = TRO502 -> TRO531 | JA5000_2 | finger
c002 = TRO531 -> TRO503 | JA5000_3 | finger
c003 = TRO500 -> TRO530 | JA5001_2 | finger
c004 = TRO530 -> TRO501 | JA5001_3 | finger
c005 = TRO501 -> TRO504 | JA5002_1 | normal
c006 = TRO503 -> TRO504 | JA5002_1 | normal
c007 = TRO529 -> TRO504 | JA5002_1 | normal
c008 = TRO528 -> TRO529 | JA5002_10 | normal
c009 = TRO504 -> TRO505 | JA5002_2 | normal
c010 = TRO505 -> TRO510 | JA5002_3 | dir2
c011 = TRO509 -> TRO510 | JA5002_3 | normal
c012 = TRO510 -> TRO514 | JA5002_4 | dir2
c013 = TRO513 -> TRO514 | JA5002_4 | normal
c014 = TRO514 -> TRO518 | JA5002_5 | dir2
c015 = TRO517 -> TRO518 | JA5002_5 | normal
c016 = TRO518 -> TRO522 | JA5002_6 | dir2
c017 = TRO521 -> TRO522 | JA5002_6 | normal
c018 = TRO522 -> TRO526 | JA5002_7 | dir2
c019 = TRO525 -> TRO526 | JA5002_7 | normal
c020 = TRO526 -> TRO527 | JA5002_8 | normal
c021 = TRO527 -> TRO528 | JA5002_9 | dir2
c022 = TRO505 -> TRO506 | JA5003_1 | normal
c023 = TRO506 -> TRO507 | JA5003_2 | finger
c024 = TRO507 -> TRO508 | JA5004_1 | normal
c025 = TRO510 -> TRO511 | JA5005_1 | normal
c026 = TRO511 -> TRO512 | JA5005_2 | normal
c027 = TRO514 -> TRO515 | JA5006_1 | normal
c028 = TRO515 -> TRO516 | JA5006_2 | normal
c029 = TRO518 -> TRO519 | JA5007_1 | normal
c030 = TRO519 -> TRO520 | JA5007_2 | normal
c031 = TRO522 -> TRO523 | JA5008_1 | normal
c032 = TRO523 -> TRO524 | JA5008_2 | normal
[UH05.externals]
e001 = EXTERN -> TRO502 | JA5000_1
e002 = EXTERN -> TRO500 | JA5001_1
e003 = TRO508 -> EXTERN | JA5004_2
e004 = TRO512 -> EXTERN | JA5005_3
e005 = TRO516 -> EXTERN | JA5006_3
e006 = TRO520 -> EXTERN | JA5007_3
e007 = TRO524 -> EXTERN | JA5008_3
+3451
View File
File diff suppressed because it is too large Load Diff
+259
View File
@@ -0,0 +1,259 @@
# -*- coding: utf-8 -*-
"""create_dxf.py — erzeugt eine DXF-Uebersicht aller TROs mit ihren Sensoren.
Quelle sind die vom Skeleton-Generator erzeugten results/skeleton_UH0x.json
(Sensor-Positionen aus der Positions-JSON, Einheiten mit IO-Zuordnung).
Je TRO-Einheit wird ein Block "TRO_BOX" (Rechteck + eingerahmter Name)
am Schwerpunkt seiner Sensoren eingefuegt; die TRO-Namen entsprechen der
Nummerierung des SCL-Grundgeruests (create_skel.py). Jeder Sensor wird als
Block "SENSOR" (Kreis + Name) an seiner x/y-Position eingefuegt und per
Linie mit seinem TRO verbunden.
Block-Attribute (fuer Identifikation im CAD, teils unsichtbar):
TRO_BOX: NAME, FBTYPE (sichtbar) — UNIT, PLC, AREAS, SENSORS, IO (unsichtbar)
SENSOR: NAME (sichtbar) — ROLE, TRO, PLC (unsichtbar)
Pfade ueber Umgebungsvariablen aus bin\\setenv.bat:
PV_RESULTS Eingabe (skeleton_UH0x.json) und Ausgabe (DXF)
Mit --colors werden die TRO-Kaesten zusaetzlich nach FB-Typ eingefaerbt
(SOLID-Fuellung auf Layer TRO_FUELL, gleiche Palette wie im Topologie-
Graphen doc/TRO_Graph_UH01-UH05.dot); ohne den Schalter bleiben die
Kaesten ungefuellt.
Aufruf: bin\\create_dxf.bat [--uh 1..5] [--out DATEI.dxf] [--colors]
"""
import argparse
import json
import os
import sys
from pathlib import Path
try:
import ezdxf
from ezdxf.enums import TextEntityAlignment
except ImportError:
sys.exit("ezdxf fehlt — bitte bin\\install_py.bat ausfuehren.")
# ============================================================================
# GLOBALE DEFINITIONEN (Geometrie in mm, Layer, Farben)
# ============================================================================
OUT_NAME = "ST500592_TROs.dxf"
BOX_W = 2500 # TRO-Kasten Breite
BOX_H = 1200 # TRO-Kasten Hoehe
BOX_TEXT_H = 380 # Texthoehe TRO-Name
BOX_SUB_H = 220 # Texthoehe FB-Typ
SEN_RADIUS = 120 # Sensor-Kreisradius
SEN_TEXT_H = 150 # Texthoehe Sensorname
ATTR_MAXLEN = 250 # DXF-Attributwerte kuerzen
LAYERS = {
"TRO": 7, # Kaesten (Farbe je PLC am Insert)
"TRO_FUELL": 7, # Kasten-Fuellung (Truecolor je FB-Typ)
"SENSOR": 8, # Sensoren mit TRO-Zuordnung
"SENSOR_FREI": 9, # Sensoren ohne Einheit (nur Position)
"VERBINDUNG": 253, # Linien Sensor -> TRO
}
#: ACI-Farbe je Steuerung
PLC_COLOR = {1: 1, 2: 2, 3: 3, 4: 4, 5: 6} # rot, gelb, gruen, cyan, magenta
#: Fuellfarbe je FB-Typ (Truecolor) — gleiche Palette wie im
#: Topologie-Graphen doc/TRO_Graph_UH01-UH05.dot
TYPE_COLOR = {
"FB_ILS_MTRO_1Sep": 0xD4E8FF, # hellblau
"FB_ILS_MTRO_1Sep_SSCC": 0xFFD4D4, # rot
"FB_ILS_MTRO_1Sep1Swi": 0xFFE4A0, # gelb (Weiche)
"FB_ILS_MTRO_1Sep2Swi": 0xFFC060, # orange (Weiche)
"FB_ILS_MTRO_2Sep1Swi": 0xFFE4A0, # gelb (Weiche)
"FB_ILS_MTRO_Vario": 0xE8D4F0, # violett
"FB_ILS_MTRO_Vario_workStation": 0xC0F0F0, # tuerkis
"FB_ILS_MTRO_PinStore_Auto": 0xD4F0D4, # gruen (Lager)
"FB_EmptyCarrBuffer": 0xD4F0D4, # gruen (Puffer)
"FB_Conveyor": 0xF0F0F0, # grau
}
TYPE_COLOR_DEFAULT = 0xF0F0F0 # grau (Sonstige/UNBEKANNT)
def type_color(fbtype):
for key in sorted(TYPE_COLOR, key=len, reverse=True):
if fbtype.startswith(key):
return TYPE_COLOR[key]
return TYPE_COLOR_DEFAULT
# ============================================================================
def project_paths():
root = Path(os.environ.get("PROJECT", Path(__file__).resolve().parent.parent))
results = Path(os.environ.get("PV_RESULTS", root / "results"))
return results
def build_blocks(doc):
"""Blockdefinitionen TRO_BOX und SENSOR anlegen."""
tro = doc.blocks.new(name="TRO_BOX")
w2, h2 = BOX_W / 2, BOX_H / 2
tro.add_lwpolyline([(-w2, -h2), (w2, -h2), (w2, h2), (-w2, h2)],
close=True)
att = tro.add_attdef("NAME", height=BOX_TEXT_H)
att.set_placement((0, BOX_H * 0.12), align=TextEntityAlignment.MIDDLE_CENTER)
att = tro.add_attdef("FBTYPE", height=BOX_SUB_H)
att.set_placement((0, -BOX_H * 0.28), align=TextEntityAlignment.MIDDLE_CENTER)
for tag in ("UNIT", "PLC", "AREAS", "SENSORS", "IO"):
att = tro.add_attdef(tag, height=BOX_SUB_H)
att.set_placement((0, 0), align=TextEntityAlignment.MIDDLE_CENTER)
att.dxf.invisible = 1
sen = doc.blocks.new(name="SENSOR")
sen.add_circle((0, 0), SEN_RADIUS)
att = sen.add_attdef("NAME", height=SEN_TEXT_H)
att.set_placement((SEN_RADIUS * 1.4, SEN_RADIUS * 1.2),
align=TextEntityAlignment.BOTTOM_LEFT)
for tag in ("ROLE", "TRO", "PLC"):
att = sen.add_attdef(tag, height=SEN_TEXT_H)
att.set_placement((0, 0), align=TextEntityAlignment.MIDDLE_CENTER)
att.dxf.invisible = 1
def instance_names(skel, uh_digit):
"""TRO-Instanznamen je Einheit — identische Nummerierung wie
render_scl() in create_skel.py (Conveyor verbraucht eine lfd. Nummer)."""
names = {}
seq = 0
for u in skel["units"]:
if u["fbType"] == "UNBEKANNT":
names[u["unit"]] = u["unit"] # kein TRO-Name vergeben
continue
seq += 1
if u["fbType"] == "FB_Conveyor":
names[u["unit"]] = f"fbConveyor{u['unit'][1:]}"
else:
names[u["unit"]] = f"TRO{uh_digit}{seq:02d}"
return names
def cut(s):
return s if len(s) <= ATTR_MAXLEN else s[:ATTR_MAXLEN - 3] + "..."
def draw_plc(msp, skel, n, colors=False):
"""Alle Einheiten + Sensoren einer Steuerung zeichnen."""
uh = f"UH0{n}"
color = PLC_COLOR[n]
names = instance_names(skel, str(n))
# Sensoren je Einheit sammeln (nur mit Position)
unit_sensors = {}
free_sensors = []
for s in skel["sensors"]:
if not s.get("pos"):
continue
if s.get("unit"):
unit_sensors.setdefault(s["unit"], []).append(s)
else:
free_sensors.append(s)
boxes = lines = 0
for u in skel["units"]:
sens = unit_sensors.get(u["unit"], [])
if sens: # Schwerpunkt der Sensoren
cx = sum(s["pos"][0] for s in sens) / len(sens)
cy = sum(s["pos"][1] for s in sens) / len(sens)
elif u.get("pos"):
cx, cy = u["pos"][0], u["pos"][1]
else:
print(f" {uh} {u['unit']}: keine Position — uebersprungen")
continue
io_txt = ";".join(f"{role}={','.join(v)}"
for role, v in sorted(u["io"].items()))
if colors:
# Fuellung in FB-Typ-Farbe (vor dem Insert -> liegt dahinter)
w2, h2 = BOX_W / 2, BOX_H / 2
msp.add_solid(
[(cx - w2, cy - h2), (cx + w2, cy - h2),
(cx - w2, cy + h2), (cx + w2, cy + h2)],
dxfattribs={"layer": "TRO_FUELL",
"true_color": type_color(u["fbType"])})
blk = msp.add_blockref("TRO_BOX", (cx, cy),
dxfattribs={"layer": "TRO", "color": color})
blk.add_auto_attribs({
"NAME": names[u["unit"]],
"FBTYPE": u["fbType"].replace("FB_ILS_MTRO_", "").replace("FB_", ""),
"UNIT": u["unit"],
"PLC": uh,
"AREAS": cut(",".join(a["id"] for a in u["areas"])),
"SENSORS": cut(",".join(s["id"] for s in sens)),
"IO": cut(io_txt),
})
boxes += 1
for s in sens:
sx, sy = s["pos"][0], s["pos"][1]
sb = msp.add_blockref("SENSOR", (sx, sy),
dxfattribs={"layer": "SENSOR",
"color": color})
sb.add_auto_attribs({
"NAME": s["id"],
"ROLE": s.get("role") or "",
"TRO": names[u["unit"]],
"PLC": uh,
})
msp.add_line((sx, sy), (cx, cy),
dxfattribs={"layer": "VERBINDUNG"})
lines += 1
for s in free_sensors:
sb = msp.add_blockref("SENSOR", (s["pos"][0], s["pos"][1]),
dxfattribs={"layer": "SENSOR_FREI"})
sb.add_auto_attribs({
"NAME": s["id"],
"ROLE": s.get("role") or "",
"TRO": "",
"PLC": uh,
})
print(f" {uh}: {boxes} TRO-Kaesten, {lines} Sensor-Verbindungen, "
f"{len(free_sensors)} freie Sensoren")
def main():
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("--uh", type=int, choices=range(1, 6),
help="nur diese Steuerung (1..5), sonst alle")
ap.add_argument("--out", default=OUT_NAME,
help=f"Ausgabedatei (Default: {OUT_NAME})")
ap.add_argument("--colors", action="store_true",
help="TRO-Kaesten nach FB-Typ einfaerben "
"(Palette wie doc/TRO_Graph_UH01-UH05.dot)")
args = ap.parse_args()
results = project_paths()
doc = ezdxf.new("R2010", setup=True)
doc.header["$INSUNITS"] = 4 # Millimeter
for name, aci in LAYERS.items():
doc.layers.add(name, color=aci)
build_blocks(doc)
msp = doc.modelspace()
print("Erzeuge DXF aus Skeleton-Dateien:")
for n in ([args.uh] if args.uh else range(1, 6)):
skel_file = results / f"skeleton_UH0{n}.json"
if not skel_file.exists():
sys.exit(f"FEHLER: {skel_file} fehlt — zuerst bin\\create_skel.bat "
f"ausfuehren.")
skel = json.loads(skel_file.read_text(encoding="utf-8"))
draw_plc(msp, skel, n, colors=args.colors)
out = results / args.out
doc.saveas(out)
print(f"DXF geschrieben: {out}")
if __name__ == "__main__":
main()