From dc23a5f1a02121a4ea80b0be5d4dec46bee93f20 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Tue, 28 Jul 2026 16:27:36 +0200 Subject: [PATCH] fix --- Lisp/export.lsp | 9 +++++ cfg/export.cfg | 14 ++++++++ data/ils/Separator_SP_3D.dwg | Bin 21798 -> 25702 bytes lib/export_csv.py | 63 +++++++++++++++++++++++++++++++++++ lib/export_sivas.py | 15 +++++++++ 5 files changed, 101 insertions(+) diff --git a/Lisp/export.lsp b/Lisp/export.lsp index 0455cdb..8f55ae6 100644 --- a/Lisp/export.lsp +++ b/Lisp/export.lsp @@ -384,6 +384,13 @@ ;; Omniflo Boegen/Weichen = rein numerische Blocknamen (SivasNr) ;; Vario* = VarioFoerderer-Bloecke ;; GF_* = Gefaellestrecke Compound-Bloecke +;; Separator_SP*/S-LP*, Scanner* = eigenstaendige Sensor-Bloecke (siehe +;; pattern_separator/pattern_scanner in cfg/export.cfg). Landen in +;; export_raw.json fuer BEIDE Exporte (EXPORTCSV/EXPORTSIVAS teilen sich +;; diese Sammlung) - export_csv.py gibt ihnen eigene TeileArt-Zeilen, +;; export_sivas.py schliesst sie bewusst wieder aus (siehe dort), da ihre +;; Anzahl schon ueber ANZAHL_SEPARATOR/ANZAHL_SCANNER an Kreisel/GF/VF +;; gezaehlt wird. ;; Gibt Auswahlsatz zurueck oder nil. (defun csv:collect-export-blocks ( / ss-all ss-out i ename ed bname) (setq ss-all (ssget "X" (list (cons 0 "INSERT")))) @@ -399,6 +406,8 @@ (wcmatch (strcase bname) (export:pattern "pattern_gerade" "AP110*,AP_110*")) (wcmatch bname (export:pattern "pattern_strecke" "Vario*,Staustrecke*,AUS_Element*,EIN_Element*,VF_*,GF_*")) + (wcmatch bname (export:pattern "pattern_separator" "Separator_SP*,S-LP*")) + (wcmatch bname (export:pattern "pattern_scanner" "Scanner*")) ;; Rein numerische Namen = Omniflo SivasNr (Boegen/Weichen) ;; Rein LISP-intern (Python klassifiziert Omniflo stattdessen ;; ueber exakten Katalog-Match), daher fest im Code statt in diff --git a/cfg/export.cfg b/cfg/export.cfg index 12c27ee..2ff5962 100644 --- a/cfg/export.cfg +++ b/cfg/export.cfg @@ -16,6 +16,18 @@ # pattern_strecke_module-Keys sind Teilmengen davon fuer die feinere # TeileArt-KLASSIFIKATION in Python (eigene Zeile je Teileart) - # Aenderungen an Blocknamen bitte in beiden Stellen nachziehen. +# +# pattern_separator/pattern_scanner: eigenstaendige Sensor-Bloecke +# (Separator_SP/S-LP, Scanner - siehe ils-insert-sensor/mubea:build-separator-one). +# Werden von Lisp's Block-SAMMLUNG mitgesammelt (siehe export.lsp) und von +# export_csv.py als eigene TeileArt-Zeilen mit einer beim Export erzeugten +# laufenden ID ausgegeben (die Bloecke selbst haben KEIN ID-Attribut - anders +# als Kreisel/GF/VF -, daher keine ssg-id-generate-Persistenz). export_sivas.py +# schliesst dieselben Bloecke bewusst aus (siehe SEP_SCANNER_PATTERNS dort): +# ihre Stueckzahl wird im Sivas-Export bereits ueber die ANZAHL_SEPARATOR/ +# ANZAHL_SCANNER-Attribute der zugehoerigen Kreisel/Gefaellestrecke/ +# VarioFoerderer-Bloecke gezaehlt - ein zusaetzlicher eigener Eintrag wuerde +# doppelt zaehlen. # ============================================================ [blockpattern] @@ -26,6 +38,8 @@ pattern_strecke= Vario*, Staustrecke*, AUS_Element*, EIN_Element*, VF_ pattern_variofoerderer= VF_* pattern_gefaellestrecke= GF_* pattern_strecke_module= Vario*, Staustrecke*, AUS_Element*, EIN_Element* +pattern_separator= Separator_SP*, S-LP* +pattern_scanner= Scanner* pattern_ks_subblocks= KS_EIN, KS_AUS, K1, K2, K3, K4 [Planquadrate] diff --git a/data/ils/Separator_SP_3D.dwg b/data/ils/Separator_SP_3D.dwg index bf83297383efcd2903c3e22fc83e6294beaec18b..caa221a6d87dc6015c66925818888bde8e2ac089 100644 GIT binary patch delta 16586 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 B{^$Sz delta 12589 zcmcJ02{cvT+weKpb=?egN#^0Y_mVQtGUS@c9Fh>3r;xFv?oCJ`bSg4rj7ViJDnm)e zkRfDDMCLMNez)KM|E_O+-}=_K-u15cJIAxnx%-^`>}NlF?`J%wn&7-bI6)MZiBA;2 zPT%Y$$Zyxvx-FW8NILUzI3ITH^lFfNrJ|fgm?9*mkH_#2G9NhSlsG4f)wX8YJblhs z4Z*`~hXNpR$Q^Qle4qfx335lYVSe=DCq7i7x+0PZV^tXpoz+DEw4VMK6kiLi)x2^B z%`bS7u18*2INhp6EnN#I63GWaDEKD~L8cG{VH8jhMBqbU@zaO`ij4w&!h#BD%sng` zTn_l@SqDH6!{L2^p_DWZ2;%M0*HX8*JUE~3>wVbm@u!TDprGzMdUqWZCWLonhF5rw z{t}y2v?Tcw^DUbMUbbu;)Q-IT;1rtItn&1%(RuYXqbB_~&8N%j9v#X2P)$D0dhFZC zCV{={@B0mL0!1i0iOKaKmqaA-126MKvU6^C#kyl*e#c4q&uy25N|42$v|QXB8L_Ih zi+{p0es1hMo|&5?0aE4pJHE4lD;mImzo7hg8sqo7{GTZ(|5Y?#`XK0kzStlC{}U^A zzu*5qMO|pX1m$Kx5PxvWH>vgZAT?I7P$9!8J54{S>SUU8mxcEywuoi3B00vC0ir_Q z)t!eR2uC$y-C^E@Asi&T4QNME|5Y2u{(q^3BCbQA<^5|by3=$J8R}f3+aHdG8U%jG zpI@Q;tGb2Hj5Xux!ikGlJv{U+Eq9nG>bNxH{H*Thq4XNjAI6^+6^Sn0aC__^xB+~5cA1{gxPd#BV(!omQQ(Nz;V$ZyF>kz+dnYGGg&`XgnE+R3J zdGmKuA~7H!AXK9^s(Xfqhe!6(h{bV=oU-!PWJXxpIwdtFrMkMBp3fnH@x|sr{U@h& zd4d>5fMMXt@nJM3`jrn&^{MHZE_O}1b%y>labEMVX+uPZG zVfc-L6*O18_3r%3ue0+4s@ELtM;`j$_FEdOUszbMd?Ok>;a_DdZlz1n)rBK5fXY~A zM$AA`w(zNY4V!$y-*$*Z;6MvoL4T=nKSh??Bt&234tV>H#yyf5Yn4K3 zYN{M8*|lWy$J&85UoYc(Ssx61M!2{fX!!&_xS%YRa`bU5~VVT}^<5 z!)|A9rXRIel^+F5F2_@BmC{)tJT!R=kG(-5Q+4*Ls!kX|Sb?qGiPvnF z^JL53s;Vl$rVqCcb&rrGIYcknIPu111}dp4D)tW#8`a`#N7YWAybE6dScD2*zI4-U zTb=zn)4H}6yoIK=)IE}MJIJS^rwoVVi?+^++{zZV$exo450q9?Iz>yxeGgO;*k68z z8mW7fh=llSHxHe+zw{Fe67IB!d7UYM`FW35PO{RXsK1y_bdi-zL$p&_frhzgyk2XO;c_P@m zu;ho?m$k;P_ICJxR>TA{6VlPeH3=q5fYNqw9Xk%mPz<~8}h?kdF{s0w^t#?S^{Sy1p@d+iY zyKfl#dn2rzJ^QvxL0l4`R(Q431Y59G9I&{x*sb8^>e}DoTxK1d+cmK~ZK7goW>(^v zS2j2}c=20h$wUVif*?=AX1%4u&%Cqi?d`RB<#W-)WBg1Oy zdsxS}gtW(x^Z4C8Jh~(x@uXH;N?w^B>GY-y*SutS+pze>E)1VGm{knd?qF+Pp3tWK z@@19vKXc*G%daALvY#)6ak^9dAy`G`Xl93+#Kf%_i( zrXW?c)!)U%Wu#i<5T8osw;N;!M@NnPuZgL{q6%9!qHKuEl}neTQroX@)KmHr^Q1R7 zPY|EJdX;40ob;?U;$aycrczN>akKj@+t=>KNfkg9(;o5?(mzC?qjFH@K-~F*2Rlr^K=m(#&6u9+~A(vAQtywLkEwY z4_nq&VmXXO^Ql~R2#Gogkv9%dKWE!{FH2ZIU)*Sf5hYxe*kLv5| zBO@7HHkFGzv7uZ}PEMAVmMfxmc6P0;t;rBQgsvlhu)is``$YH--}>l$aCcxk;HtlW zsounS%igRkflxz=MpK8ql8lD&!->T@AEL08Yq?Li31!pV`3AROwI>CiC_3yUWiV6=;}Uth?S~?oeFAOb26In-FBw0BO^Y|r+N&9K2&&KJ854@?ty=$JlOu(8G{oueA7kd{=jYIc z8yi=051<@wV#$eFYOjK7gJ#c&P5ua}`ID|3vY>a5w6oS(yFE7@Q#%kZzN{jJ**5uw%6{eriAVq9})O5;Fi&z zN<&;P=KA?LeQW#>MQ;(ZS@HsQ#^K5#MoMOs;-&8mFYHFIhrF!at$rSq3PYkDfx*Fp zf$jmplyPF3vclj1Cn2J|qQY!_?5M}$SIwY@_Iq`8kkM+6%$0#8wXMJ5e}qyc&iy=P zwI<wzj{X+L)epx89D`(b36-fj|;{cta%} z+8RG?k8($my5(;lE?H!(E@> zFS6d<4OJ0Q$ANkKFfMsbmsLCcNgo8I8bkeT@3LNy7sM4#Dz3AS22pTdT)MR@%ga0G zo166qxjQqI!ezp@uT!KSiN2Na+7-U@yNj~7sa^WanW9iw__@73C?tgcWLWYV=8k9u z*yUp=vf&AhIq|{P!b+jk@3kMsGyjYpzKu>j*<|_)`x!g<%GVygm0R+D(RZag>8Nqq z<=^CxYz(Q7j<#h%lz-aiu$IxuAh$S4QZQj{Pt8w z{&cIm>^Ys;TU9=B-7{LJ_`$Akbj}RKVETEQ2Bk%UOCDtPFsCuEluO$bZ4g_fzX$*i zDH1Z}EcPpOmwG+yvu{bsD%>>ScNPvpyP;Rt*49>6OZX`Xq}%Bm0l#_*es97jcn+>j zwzSam9S7)z-k@ehXn;!hDVumCBO_x0p>9yG!%cGGK=rzF+v6feM$T`J1G0k6XMl0n zUejozl5 zfWpC8I-GP?H0mflge62x?;9FJdyNy9Qm#F%sIWBg#M8T>JvIci%yQ{S5oxMd z`#O7lzE#Gxf7ThlS6{MNd}Z>nj<&Y;$cNINzCQ3oEadsnj~}GR!hoDJEp;g#Pws{U2S03_CF3Qfq_QYAL^sMl;{NU(l|P90nwO>(Hx})$DJc+b^Js=+T&ui@UHC-5BVUP%|r+rj$x&MF8gJiN3T5%(e#NW9=K-{TK9f4b?+>bY&~ z#u5^-52^bzS|Z}`j8RrWp?iL2X69|i1$K1u+0_7M>D&ahf{BqwZW0>q{${$mnzFl37P$08&5cN{RXCSSl(Z zF8+QE2HT@gx^rzyp5f59{{E(#9*^+a)jk`Y)*3fy&R~6YshQocikxXA{VdbyKE0=f zg()d18Y^_5*+FSP%HE=@m?4Ip5o0trxxV%3)2BF0J>4O`&iQYze3M#LJDjC~uB~@4 zHJ5nK+LlPvEjpgh2pp>EC!Q^(&VGQ%&EHC0)`G51ng54ohe><;r1@-LSo{%p)XL}( zWAVq@$F4Fs?cHNnRiti88Lg>s0=S(UF48eVkl3rXjuB4=Na%ZKx z{S3Vn(oAAGkiyh6ySf>6k`w{(73W!4S*gv}=8p1heyG>iXad9XTrB348u)InLu60o zzKc6;Z(rL;gegL$H>O5z5IA{xUAooR|IxNblmfOYaYOM5}cDzi09YxIXo{R3>MUd@lzxsx({vp3} z50bf47wPUB3IYFe`r6XgPLjCY`!D<4exmpBIfdOP%h=h@m5#Z9*gFq3=fgNbRDt(dF;@7XwuIvBY+YP<sdp9DQx?1 ziHC^_SDd`8tot`$i0QlxyK-fqbLI>w{uth*58%IMPUT9&96@jSnBjYt6T zhr=q}1J)0N^mKG}V+QR0)DIM7FV^mzyx7Rq?&}n4f9pe6XXjY(8{QGOSH2s}SFg;l zv+M;dn7pvBeNlUCxUaAAuEFfvL-G7-!1`ohV2E^EHn^7?Q1$Ym@dQ{WrJ}R7*Vh>2 z&Yh2Xx0hx5bSeF|PEJ%`(erAF5Vu$%N@FJFbyo@J=EOj$3&S^>?uEVg@8554tDFv` z#tqOEqk}&}8=E^7DitJs-*>BQUYaF9$4M;T12Uq)u>|Oh)V{MGH#FbGGO&xEEls&0 z^tHS3X-?PlWNQ-B2@T*&sd?;8e;wE z`E4mJv!PnbUbhBiB<50;ZGpwFAI%8I0~klmKYeL7QZ9Ng9KW)@K1-nvNDcx6eBEho zeam;W=Hitl;QIsrKI&~^Ddqf`zTRG!TRY#EFTWozuDX7nLfKndk_7f44sP;VWpn6w ztU6b;aara3*au3#vVPRBKA}yKJJPDEJ0>r8es^52u)BJaR^3l2{WFdI&T2-@C${5~ zD;#C2QTbxG*tAPPNaM+q$e@H(=hb6#XAJI=vXu->FNpr3Q?xLEJb zm306I{Z)CnmT%EoMW_m2pF?1k?at1Q-XOia(;;fiZlYf9Qt8X2j>WX?G0BqZze_i0 z=w45oh|7`PtHSHYfFCCKHAnbPwlIjk3|ZeP z^3RF8k>5R2P;jj8B?Uw$l!NCaW!oTPbYr0SX8!4dcr_pf0%dLvy39!t1M{70dNO>meV7 zi;`e3oMowE)#l{mb5&La&Tn^j_a^tMWVr0em7lz8E~0Fd?rv<8YZ(ajxY(#&U0;ZV zs754+FaB0K=dsq`4Gj^y!>i8syFGS`jl9#lGNQViKHcS2yPj5424=FR=A@Ueh4drm z?rQ6xvzC@sF{4!hZsTK5+6|wuo1fR|jAUT%7ae%Wp$-u4=mhFeTKfCXIyvP8>;DsJ z@Ul5X0m3i)M{rtu+|5TKav#3zD-f07x#X-?K$SPMxN=LvfPzYLyK7FD@PlzOzSwj7 zyMNn*MCS6+()X^-l?_ljD&3`Hno@KE1RR`3 zu5VrZEMHOl&O6YdZYHo)!e|!9E}L$gZ>g`aJ~!}T!P z|IP9X4|l8YS77qaP=d9!BR@;h6Qhqzr7HLm9AGS2;PnlAZ8PJ?DjwZc?p9-6>w9@* zuG=8mVcq+>hO$@l*(5k9NUCy6xa%S>{|WyF5Qth!-elMKfOWJ!cTS@Yg`;XbKj$+R z;_Te8Fu4fgt7qQY3&%x#mhB3?yfg+6S9(^SG?3*ItGM!=k~)C>e(L(enQV6mK1+Ok zV>Bx(OZwEUEu+(4f;7zTA3kb)-$C%DE%9mW!?GzZ^=Ekl!Wen6U^v!QnGQ#lrgHy{ z)5&p>9UT}S{nsC|tef8qS zQ_=3CPeHSNVgYpe`Q2&HYB0CMU-=B5dd07H-FuLOZ9T>OjuzSxhFm50%Fq@g-r5{uNZ zznj}xE>Dubb)f%*zdX<-kBqPTUc4yB?m6JibXzOC>AbP@BX3X7><|eYHf&=uNnWh% z`@IXv#=1^}Sm50X47+}voVj6F*(mNtk-2k%I1My^AbV1)pgxN&9)j^Cw=pZXY>H}J zLt~@Pj#Nr&QM!WoCr2syti7I|`(4IVl73N-wY2}$-#_##X)lgSi^yj@IrAbnxyIlH zv$GzgWfrK&qqJwJjypT!7+)r@lMwu7S{%&HdlCVHn`D-3a&Oji%5A2eJ4wliznJ`U zr)_A6XN!Yd?5;2tHQVL2`dD;Xupc8=;&w0l!?;6GwV#x6fKF%O8xRLv+ntrT(m1&+ z?r*Jsp6K5DuHX4Hh;sXs9VA1ic-3*h=j;!Ox^*i?MTniKk(Kb6LrkBAJC?p-QpW9b zr|GjJ?y5k(Jq~^yFaosj$-%SWj&h{ zt5OSYJ$l3$3^z12>5bEt08a{e0V)i96y4A><2?oD-Z4jUSm5T|y?gh?p#B4r$JZBj zY!5Hf;HW{aKvjDimPn3%0LI6+Z{KE+f{)W@Mdf8=%79uWCXw_(07FbnY$)K!Z7q7; zS6y9Z`IPSF^I?iSXIKUK;zz54VjgR>c5e)Ny_}3Xp!`sAKkTZ56Uc3<{xi4(JZxL) zLzjW~`l4yfx%o5g9*tvT4unKKA;iGIz+y_Q4(LR`I9wOymWoRySBaYhqCsBTiO#{P^hG+_|%>{-)(nTC!zA|On1J7U3JgU zP|?p%IXlzQ|33Q7J$gVVJtwUcPRwn zlgOr+`qM$)!OrUTp3dqF0KCBcKKyDpS4`V4S8}L@34*wwCom&K_SD3pk2at)L6Th; znIcXR9r#SIK*a!e5U7daYDAdyeu zaU>>4^&q6~N!CLX8VR&fgv|PsG7Cv76fBDrNvr4^LGMtEWZhp0kA~LZkiSh(dp=>x$34x>89oBrZwuOP3fjjk&YkD>`n1e()op_DWX9h z%dj)PO}X@n)$prb3feFgsh1(3v`mpn897$(coYsM!HRk-Xj7OKR)h_;dXeL@LLBN( z44q9;tS}iWH*A5)sHdo6W{7D~4vCTFJzy#VLy$FDFAyn_^uYqo41Wss zaPxQ{q&p7U@nYd0Fjng!?OQk&E<%Mtr?EFxFJV0suqa750{&s!NX0?|mOQrXbDb&ENSk*V<{!B7?P_&B&o{tW8Zb)kMkCUpB(Rf+#9P zW9sVa7U5tfaTvrpuY03WptM$WML~&|VM939A(kcuMrj427*JZ6yu4f{TJ;txj?6*) z%K|a*QaQ9MMYIenqp|}J*mtj z97a-m%~Tt%GhD?aU`*-ow32jWVXRJ&{ zOZBoMZ3-SJi@%7Xq9BYz&MOLtE0U+615I!_n5<&>DJq;JoI`^zo9}cC0g|GpYX5LN zAYiDy5Mj88NdT`PFBJt)7F$TS;(IO#CUaA97I+MfP7<(65-q3)-!~LQ6~jp338H8M z0Vd-j@P%$RH6+jirl5IE;Y`g#V5u15(XU|!L$J6A7*^!(37!)l*vLFoEdous zBxVUyr*{H{2dt&4KOfU$qcuef3WKHDX-FhIz^mxV(UEp$WY_ z#|W~DXhpDvRbWG+vmzlv7GYK0q_n^=)q&;^8t+VOUL}626RA7|iNWOf1^gs85L@-ao+)cJ7q zG_U~;^@=XG|Aal6(F%<`ROd&VF+gXLN_8RB5)m0uU(l-)p(kUHJD{+rCX_HL0Ugar zyP?DY9f8Su&KFUq2+-9JJ~g^T`xrp2EFR}mbK2YUpsv$ddRp+Tn)47OLohr^Ok+ko zHOWW&L?MX8D2Clo!!Vc~IoWjGr0)8{K^nqS-2G^@qQn>k(Lj>r%E%YZFFq$sc zfd)ZqNpK&qVo9hR1H2f+n9>qQaC8oYZeffmz32}S#84|x424B|qwb1U&t^9Vpg0E} zJ$m#o1Lvm6NK5jDfpio=$wknh(3d3P`$w_IktHnwex764`*0hSi&8fybJr0w#b8L0 z`ZQV_Jxxy!y?ld6YB%e6%hG8M)$u|+RPH)1;(IanI$eu8o;pI2E&~^tlgbRalcGt~ zmbhQu@&u9)p2nX>m|ixJ1}#kkG#)2}Kj}wvVoU*1(-A~%pFmu7h_np~qAF_0T^$9K zyE5`ghaZL2My7T6xluRp!t^K-HwOWaSFokSi&oQM^oZN%2$lwjfbMxzf-!PKR~i*| z8mZ95qdIMnuezel(KJ}B#y@J=4ScdjXgZ6q=ozB^+9M8n+_VYK$8((!s-7g1o;yME z0_+c#tq|;rywl@iL5Orsti;6=dW_*j7j2l(1Oz%*q@Z4`v@>DOxSf7od9mOcL zA^CXH2GQfTA+acy;2lp__|$=(o@(lkM25A+j4^aBP)95QEQED)azN1z4At^W!VUY$Hd3cQ`_OEb1j zl4L2vb~IU30C`zZA!B5r`;2y_^TAQEpFj0d&?A#e=C z3hSZNt?HN|LisQqj!aK|DyAoREeojr9Umm9QD;ZOKoUG?41p>vHZ3+5 z^70DSSuqB>oq%&@CWMI+i~5jA6Cq~zY7`flr;b~X0nH6@0R@6on+U=@$e0N$CYYJ{ z$?!DNWq#t+Un~T&0LO?m5#!!{FHR@uFH5q~K};;p>e&Eh0Wka<-b0N!*c9bC`=!Bg%K_T@)1j5I-jzqe?jyr2 z&*5H6nk71X*(p>eCm>h?eM23_zlLEo1%6ltoZNs@YT$eUqq=Np6OO>Sbcqv4oB3sp z66ilyg&zwYq{rs0-gekoJqCaQxZj5-VH5G&enwjm9GBJbx}o6j$GV{v`=1?^cRDbT zBNT`vTX=Gu6fxVTIV8!+cIxRKd@GqTM$iI+HQO)j}fTmHqON&HUQ&6X& zdp5ix#k_RTZBA!(696$B0QRo{k`Hpe#nRv7KDZYG3qT5B*&RU)&PibQKMGz_L8#|4 z@x?rJ&>heO;RBu+fPb2U-!{%?cZVE97!k4!39d$5Z1mWamp@Sp!_{v%U`ZToAaw*W zLJ+Y7`Cvolfbq=5^opgkFJc7Su;BYESJ!i40rZlrW&E~dFlCifGGc59CGhD?=FKGC zl6!5LeIxC!b}M$PmnRo_WvoLUG!@Pj|NJ}1dvCnpS7+~!^{S=f^~(8IF^w@Rqh+_- zOX9!O;z)+7!4`N&VLzpd$29TAM2cz(>tkL=3(>$cmPR7M3SL%Trxnx21_q-Rsa#=J z9%knpFh;3|?=4eWVIeB!DePhQV}@Gfmvu zju^>Z`17&%^{wWf*v8Jq^1HoH*JEd>i|qwC(NMLkbk`+a!pwY4vEEijR$iiUKe9i* znO|!U=hl4qdmxH3-k(?Zwf)BOx0e{-{wIe|5$k^7juv9!WP#>BR7SyRQU1uctj z_;rasq0$O*-^xA~{*Ha}@q5qP_XY2(`0lT^_dJ;?+1hCx38!rIEKr-nx$!z!54EJ- z+;Yuii-klhI%c5n2(U42t&EpHUluDWDj$iL7`rR|~bM(uN zp6STlt-E98ksY@;@>Z)ONtbazKll;^S^rZK?CS?*$Vt7N7J~YLIkz8CaJs6agalr= ztWm%h2A}7y<9o+Vf0;In8*S?E671m;5{y-|ou;B}xouT#VLRwREUmW! z+C1pu#S8vd@P}h*Y*}m(VMj3nkFp<)E$1*d9YA7k%8NE}^mK6w42Y)1V>uzrsajbc zB*al4&OquNIkmQ9IqYa)Q~14GUZ5G?7 zwnT4kjC#;zJ(mm4F8&s1JQE{C7{)a;Ga`5=PM8Bxaw3qG4?3y)fid|5*dLo3#Kd-xB?;+HA_ diff --git a/lib/export_csv.py b/lib/export_csv.py index 0622f5d..8efd884 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -188,6 +188,33 @@ def build_gerade_merkmale(block): } +def build_sensor_merkmale(block): + """Merkmale-Dict fuer einen eigenstaendigen Separator_SP/S-LP- oder + Scanner-Block (siehe pattern_separator/pattern_scanner in cfg/export.cfg). + Diese Bloecke haben (anders als Kreisel/GF/VF) kein ID-Attribut - + ZUORDNUNG/ARTINR/LAYER sind die einzigen ATTDEFs (siehe ils-insert-sensor/ + mubea:build-separator-one).""" + attribs = block.get("attribs", {}) + return { + "Zuordnung": attribs.get("ZUORDNUNG", ""), + "ARTINR": attribs.get("ARTINR", ""), + "Höhe": get_hoehe(block), + "Drehung": get_drehung(block), + } + + +def format_sensor_id(prefix, n): + """Erzeugt eine laufende TeileId fuer Separator/Scanner-Zeilen im CSV-Export. + + Diese Bloecke haben KEIN persistiertes ID-Attribut in der Zeichnung + (anders als Kreisel/GF/VF, deren "ID" von ssg-id-generate/ssg-id-check-all + beim Insert bzw. vor jedem Export vergeben wird) - der Praefix macht das + sichtbar: eine rein fuer diesen Exportlauf erzeugte, NICHT ueber mehrere + Exportlaeufe hinweg stabile laufende Nummer, keine echte Block-ID. + """ + return f"{prefix}-{n:04d}" + + # --------------------------------------------------------------------------- # Omniflo Sum-Zeile (Anzahl Boegen/Weichentypen, Gesamtlaenge AP110/AP60) # --------------------------------------------------------------------------- @@ -329,6 +356,8 @@ def process_blocks(blocks, lookup, dbg=None): vf_count = 0 gf_count = 0 strecke_modul_count = 0 + separator_count = 0 + scanner_count = 0 # Zaehlung fuer die Omniflo-Sum-Zeile (nur Bogen/Weiche/Gerade) cnt_wk = cnt_einzel = cnt_delta = cnt_doppel = cnt_stern = 0 @@ -479,6 +508,40 @@ def process_blocks(blocks, lookup, dbg=None): }) continue + # Separator (Separator_SP/S-LP) - eigene TeileArt-Zeile mit laufender + # ID (siehe format_sensor_id; kein echtes ID-Attribut am Block, anders + # als Kreisel/GF/VF). EXPORTSIVAS schliesst denselben Blockpattern + # bewusst aus (siehe export_sivas.py) - dort zaehlt bereits + # ANZAHL_SEPARATOR am zugehoerigen Kreisel/GF/VF. + if matches_any(bname, BLOCKPATTERNS.get("pattern_separator", [])): + elem_nr += 1 + separator_count += 1 + items.append({ + "nr": elem_nr, + "teileart": "ILS 2.0 Separator", + "teileid": format_sensor_id("SEP", separator_count), + "bezeichnung": f"Separator :{separator_count}", + "planquadrat": planquadrat_column(block, planquadrat_cfg), + "merkmale": build_sensor_merkmale(block), + **bbox_columns(block), + }) + continue + + # Scanner - eigene TeileArt-Zeile, sonst analog zu Separator oben. + if matches_any(bname, BLOCKPATTERNS.get("pattern_scanner", [])): + elem_nr += 1 + scanner_count += 1 + items.append({ + "nr": elem_nr, + "teileart": "ILS 2.0 Scanner", + "teileid": format_sensor_id("SCN", scanner_count), + "bezeichnung": f"Scanner :{scanner_count}", + "planquadrat": planquadrat_column(block, planquadrat_cfg), + "merkmale": build_sensor_merkmale(block), + **bbox_columns(block), + }) + continue + if has_omniflo: elem_nr += 1 items.append({ diff --git a/lib/export_sivas.py b/lib/export_sivas.py index 1d77046..8973be4 100644 --- a/lib/export_sivas.py +++ b/lib/export_sivas.py @@ -255,6 +255,17 @@ def build_eckrad_details(block): # --- Bekannte Bloecke ignorieren --- SKIP_BLOCKS = set(BLOCKPATTERNS.get("pattern_ks_subblocks", ["K1", "K2", "K3", "K4", "KS_EIN", "KS_AUS"])) +# Eigenstaendige Separator_SP/S-LP- und Scanner-Bloecke werden von der Lisp- +# Sammlung (csv:collect-export-blocks) zwar mit in export_raw.json geschrieben +# (export_csv.py gibt ihnen dort eigene TeileArt-Zeilen), aber HIER bewusst +# NICHT in eine eigene Sivas-Zeile uebernommen: ihre Stueckzahl wird bereits +# ueber die ANZAHL_SEPARATOR/ANZAHL_SCANNER-Attribute des zugehoerigen +# Kreisel/GF/VF-Blocks gezaehlt (siehe kreisel_signature/build_*_details +# oben) - ein zusaetzlicher eigener Eintrag wuerde doppelt zaehlen. +SEP_SCANNER_PATTERNS = ( + BLOCKPATTERNS.get("pattern_separator", []) + BLOCKPATTERNS.get("pattern_scanner", []) +) + # Sivas-Nummern und Bezeichnungen je ILS-Elementtyp # Hinweis: "ils_kurve", sind aktuell nur # Typnamen-Platzhalter - die zugehoerigen Menuebefehle sind noch Dummies @@ -330,6 +341,10 @@ def process_blocks(blocks, lookup): if bname in SKIP_BLOCKS: continue + # Separator/Scanner: siehe Kommentar bei SEP_SCANNER_PATTERNS oben. + if matches_any(bname, SEP_SCANNER_PATTERNS): + continue + # --- Omniflo Bogen oder Weiche (erkannt via Katalog) --- if bname in lookup: typ, eintrag = lookup[bname]