#include PRGACNTs /* // +-+-+-+-+-+-+-+-+-+-+-+-+ // + TLM - Verlichting + // +-+-+-+-+-+-+-+-+-+-+-+-+ */ ; Test-commands Do KillAllObjects^%apiOBJ() Set tlm=##class(BL.PR.GA.Verlichting).%New() Do tlm.Initialize() ;Do tmpInitFill(tlm) Quit tmpInitFill(tlm) Do tlm.ResizeTL(2800) Do tlm.SetNewPos(2,"TL",1013, 30,"B") Do tlm.SetNewPos(4,"TL",1035, 620,"B") Do tlm.SetNewPos(6,"TL",1008, 2130,"B") Quit Initialize ; Parameters: geen BuildLookup ; Parameters: .LookupArray SwizzleTL // ========================================================================================================================================= // // Prod.GAData/GAMeta functions // // ========================================================================================================================================= // BTValuesFromProduct ; Parameters: Product,lbNaam BTValuesToProduct ; Parameters: Product BWValuesToProduct ; Parameters: Product,lbNaam CalcTotVermogen() ; Parameters: lbLampIDs NutLengte() ; Parameters: MaxLengte, AftrekLi, AftrekRe // ========================================================================================================================================= // // %this functions // // ========================================================================================================================================= // InitPos ; Parameters: MaxLengte, blnClear(=1) ResizeTL ; Parameters: MaxLengte SetNewPos ; Parameters: pID, objType="TL", objID, Value, PosNode(="B") SetValueAt ; Parameters: pID, Value, PosNode(="B") RecalcPos ; Parameters: pID, blnNear RecalcPosPrevVR ; Parameters: pID AppendPos() ; Parameters: objType, objID, Value, PosNode(="B") InsertPos ; Parameters: pID, [objType, objID, Value, PosNode(="B")] DeletePos ; Parameters: pID ClearPos ; Parameters: pID ShiftPosIDs ; Parameters: pIDFrom, ShiftRel PosListFromArray() ; Parameters: PosNode(="B") LampListFromArray() FillTLPosFromLists ; Parameters: lbLampIDs,lbLampPos,PosNode(="B"),MaxLengte PosBeginFromPrev() ; Parameters: pID, TussenLengte, [objType, objID] PosPrevEindWaarde() ; Parameters: pID CalcSnoerLengte ; Parameters: pID(="*") Quit:($G(pID)="") If (pID="*") Do cslLoopAllPos Else If $G(..TLPos(pID,".TYPE"))="VR" Do cslCalcSinglePos ;Else foutief pID Quit cslLoopAllPos New tmpID Set tmpID=0 For Set tmpID=$O(..TLPos(tmpID)) Quit:(tmpID=$$$MaxTLPos)||(tmpID="") Do:(tmpID'="*") ..CalcSnoerLengte(tmpID) Quit cslCalcSinglePos #define PrevPos $O(..TLPos(pID),-1) #define NextPos $O(..TLPos(pID)) New ExtraLen Set ExtraLen=0 Set ExtraLen=ExtraLen+$G(..TLPos(pID,"LEN")) ; LenVR Set ExtraLen=ExtraLen+$$cslGetExtraLen($$$PrevPos,"E") Set ExtraLen=ExtraLen+$$cslGetExtraLen($$$NextPos,"B") Set ..TLPos(pID,"SNOER","MIN")=ExtraLen ;Set ..TLPos(pID,"SNOER","ID")="SN1500" ;Set ..TLPos(pID,"SNOER","LEN")=1500 Quit cslGetExtraLen(pID,PosNode) #define LengteLiRe Quit:(pID="") 0 New EL,lbData If $G(..TLPos(pID,".TYPE"))="TL" Do . Set lbData=$G(..TLPos(pID,"DATA")) . Set EL=$S(PosNode="B":$LG(lbData,3), PosNode="E":$LG(lbData,4), 1:"") . ;If EL="" Set EL=$$cslGetExtraLenViaObject ; reserve methode . Set EL=+EL Else Do . Set EL=0 Quit EL Quit 0 /* cslGetExtraLenViaObject() ; Als EL leeg is, dan kan de waarde eventueel nog opgezocht worden via het openen van het TLMLAMP-object New TLID,TLobj Set TLID=$G(..TLPos(pID,"ID")) If $L(TLID) Do . Set TLobj=##class(Prod.GAMeta.BT.TLMLamp).%OpenId(TLID) . Set:(TLobj) EL=$S(PosNode="B":TLobj.ExtraSnoerLi, PosNode="E":TLobj.ExtraSnoerRe, 1:"") . Set TLobj="" Quit $G(EL,0) */ TLSchemaText() ; Parameters: lbOpties #define COLS 35 Quit:('$D(..TLPos)) New arOpts,txt,pID,pType,lbData,tmpV,i,iOpt Do tlsGetOptions Set txt="" Do tlsHeader Set txt=txt_"==================================="_$$$CRLF Set pID=0 For Set pID=$O(..TLPos(pID)) Quit:(pID=$$$MaxTLPos)||(pID="") Do . Set pType=..TLPos(pID,".TYPE") . Quit:(pType="") . Do @("tlsType"_pType) Set txt=txt_"="_$$tlsEindPos_"====================="_$$$CRLF ;Set txt=txt_""_$$$CRLF Quit txt tlsGetOptions ; Default Settings Set arOpts("HDR")=0 ; Display Header Set arOpts("ENDP")=1 ; Display EndPos Set arOpts("VR")=1 ; Display Tussenruimtes (VR) ; Settings from Function-call For i=1:1:$LL($G(lbOpties)) Do . Set iOpt=$LG(lbOpties,i) . Set:($L($P(iOpt,":",1))) arOpts($P(iOpt,":",1))=$P(iOpt,":",2) Quit tlsHeader Set txt=txt_$$$CRLF Quit:('$G(arOpts("HDR"))) Set txt=txt_" Lamp begin:einde / center "_$$$CRLF Quit:('$G(arOpts("VR"))) Set txt=txt_" -------------------- "_$$$CRLF Set txt=txt_" tussenruimte "_$$$CRLF Quit tlsTypeTL #define TLDVermogen 1 #define TLDLengte 2 Set lbData=$G(..TLPos(pID,"DATA")) Set txt=txt_" +--------------+ "_$$$CRLF Set txt=txt_" "_$J($LG(lbData,$$$TLDVermogen)_" W ",11)_ " |"_$J($G(..TLPos(pID,"POS","B")),5,0)_" : | "_$$$CRLF Set txt=txt_" "_$J("L="_$LG(lbData,$$$TLDLengte)_" mm",11)_" | : "_$J($G(..TLPos(pID,"POS","C")),5,0)_" | "_$$$CRLF Set txt=txt_" "_ " |"_$J($G(..TLPos(pID,"POS","E")),5,0)_" : | "_$$$CRLF Set txt=txt_" +--------------+ "_$$$CRLF Quit tlsTypeVR Quit:('$G(arOpts("VR"))) Set txt=txt_" "_$J(" "_$G(..TLPos(pID,"LEN")),9)_" "_$$$CRLF Quit tlsEindPos() #define EndPos ..TLPos($$$MaxTLPos,"POS","B") Quit:($G(arOpts("ENDP")))&&($G($$$EndPos)>0) $TR($J("#L:"_(+$J($$$EndPos,0,0))_"§mm#",12)," §#","= -")_"=" ; Result: "=== L:999 mm =" Quit "=============" tlsEindPos2 #define EndPos ..TLPos($$$MaxTLPos,"POS","B") Quit:('$G(arOpts("ENDP"))) Set:($G($$$EndPos)>0) txt=txt_$J("Max="_(+$J($$$EndPos,0,0)),$$$COLS)_$$$CRLF Quit SwapPosIDs ; Parameters: pID1,pID2 // Deze routine is gecompliceerder dan op het eerste zicht gedacht: // de objecten moeten na het wisselen OOK van positie herschikt worden. Hier komt dus meer bij kijken dan // enkel het wisselen van de Nodes! // // DAAROM: in eerste fase (werkt reeds!) moeten de IDs van opeenvolgende objecten zijn !!! // #define IDinRange(%v) ((%v>0)&&(%v<$$$MaxTLPos)) Quit:($G(pID1)="")||($G(pID2)="") Quit:('$$$IDinRange(pID1))||('$$$IDinRange(pID2)) ; Alleen tussen de "UIT"-einde mag gewisseld worden Quit:($G(..TLPos(pID1,".TYPE"))="VR")||($G(..TLPos(pID2,".TYPE"))="VR") If pID1=(pID2+2) Do . Set pID1=pID2 . Set pID2=pID1+2 Else If pID1=(pID2-2) Do . ; OK Else Quit . ; Geen opeenvolgende IDs. AFBREKEN ! New tmpAr,DataP1,DataP2,B1,E2 Set DataP1=$D(..TLPos(pID1)) Set DataP2=$D(..TLPos(pID2)) If DataP1 && DataP2 Do . ; Verwissel TL-obj's . Set B1=$G(..TLPos(pID1,"POS","B")) . Set E2=$G(..TLPos(pID2,"POS","E")) . Merge tmpAr=..TLPos(pID1) . Kill ..TLPos(pID1) . Merge ..TLPos(pID1)=..TLPos(pID2) . Kill ..TLPos(pID2) . Merge ..TLPos(pID2)=tmpAr . Kill tmpAr . ; Verwissel Vrije Ruimtes . Merge tmpAr=..TLPos(pID1+1) . Kill ..TLPos(pID1+1) . Merge ..TLPos(pID1+1)=..TLPos(pID2+1) . Kill ..TLPos(pID2+1) . Merge ..TLPos(pID2+1)=tmpAr . Kill tmpAr . ; Nieuwe posities invullen ==> VR zullen ook berekend worden . Do:(B1'="") ..SetValueAt(pID1,B1,"B") . Do:(E2'="") ..SetValueAt(pID2,E2,"E") Else If (DataP1=0)&&(DataP2=0) Do Quit . ; Geen Data, niets te verwisselen Else Do . Do swpSwapWithEmpty Quit swpSwapWithEmpty New EmptyID,DataID If DataP1 Do . Set DataID=pID1 . Set EmptyID=pID2 Else If DataP2 Do . Set DataID=pID2 . Set EmptyID=pID1 Else Quit ; Verwissel TL-obj Merge ..TLPos(EmptyID)=..TLPos(DataID) Kill ..TLPos(DataID) ; Verwissel Vrije Ruimte Merge ..TLPos(EmptyID+1)=..TLPos(DataID+1) Kill ..TLPos(DataID+1) Quit TLCombiCalc ; Parameters: &arCombi, lbCalcType, NutLengte, TussenAfstand, lbParams New j,blnBothCSand1S,lbAddPrm Do:('$D(..SwizzleTLs)) ..SwizzleTL() Kill arCombi For j=1:1:$LL(lbCalcType) Do . Set blnBothCSand1S=($LG(lbCalcType,j)="CS")&&($LF(lbCalcType,"1S")>0) . Set lbAddPrm=$S(blnBothCSand1S:$LB("Excl.1S=1"), 1:"") . Do TLCombiCalcByType(.arCombi,$LG(lbCalcType,j),.NutLengte,.TussenAfstand,$LG(lbParams,j)_lbAddPrm) ; Standaard Omschrijving toevoegen Do tccCalcOmsAll Quit tccCalcOmsAll New i,TLID,Oms,blnToonLengte Set i="" For Set i=$O(arCombi(i)) Quit:(i="") Do . Do tccCalcOms(i) Quit tccCalcOms(i) #define NextElem(%v) $O(arCombi(i,"TLID",%v)) Set blnToonLengte=($$$NextElem($$$NextElem(""))="") ; bevat slechts één TLID Set (TLID,Oms)="" For Set TLID=$O(arCombi(i,"TLID",TLID),-1) Quit:(TLID="") Do . Set Oms=Oms_" + "_""_arCombi(i,"TLID",TLID)_"x"_$J(..SwizzleTLs(TLID).Vermogen,2)_"W"_$S(blnToonLengte: " | "_$J(..SwizzleTLs(TLID).Lengte,4)_" mm", 1:"") Set:($E(Oms,1,3)=" + ") $E(Oms,1,3)="" Set arCombi(i,"Oms")=Oms Quit TLCombiCalcByType(arCombi,CalcType,MaxLengte,TussenAfstand,lbParams) ; Parameters: &arCombi, CalcType, NutLengte, TussenAfstand, lbParams #define GetLastI ($O(arCombi(""),-1)) Quit:(CalcType="") Quit:(CalcType'?1(1"1S",1"CS")) Quit:($G(MaxLengte)'>0) New arPrm,LL,TL,Cnt,LLtot,NL,TLID,TLobj ; ,SWL,TSL Do tccAnalyseParams Set TL=$G(TussenAfstand,0) Do @("tccCalcType"_CalcType) ; Specifieke routine oproepen Quit tccAnalyseParams Quit:($G(lbParams)="") New j,Val For j=1:1:$LL(lbParams) Do . Set Val=$LG(lbParams,j) . Set:(Val["=") arPrm($P(Val,"=",1))=$P(Val,"=",2) Quit // ------------------------------------------------------- // Algoritme voor Combinaties: Lampen van één bepaald type // ------------------------------------------------------- tccCalcType1S New BeperkCnt,i Set i=$$$GetLastI Set BeperkCnt=$G(arPrm("MaxCnt"),0) Set TLID="" For Set TLID=$O(..SwizzleTLs(TLID)) Quit:(TLID="") Do . Set TLobj=..SwizzleTLs(TLID) . Quit:('TLobj) . Set LL=TLobj.Lengte . Set Cnt=$$tcc1SMaxCntInLengte . Quit:(Cnt'>0) . Set:(BeperkCnt>0)&&(Cnt>BeperkCnt) Cnt=BeperkCnt ; Max Aantal is beperkt . Set i=i+1 . Set arCombi(i,"Key")="1S\"_Cnt_":"_TLID . Set arCombi(i,"TLID",TLID)=Cnt . Set arCombi(i,"Extra","LLtot")=LL*Cnt . Set NL=$$tcc1SNodigeLengte . Set arCombi(i,"Extra","NL")=NL . Set arCombi(i,"Extra","Lrest")=MaxLengte-NL Quit tcc1SMaxCntInLengte() Quit:(LL'>0) 0 Quit (MaxLengte+TL)\(LL+TL) ;Quit:($G(SWZijkant)) (MaxLengte-(SWL+(1*TSL))+(1*TL))\(LL+TL) ;Quit:($G(SWMidden) ) (MaxLengte-(SWL+(2*TSL))+(2*TL))\(LL+TL) Quit 0 tcc1SNodigeLengte() Quit ((LL+TL)*Cnt)-TL ;Quit:($G(SWZijkant)) ((LL+TL)*Cnt)-(1*TL)+(1*TSL)+SWL ; (MaxLengte-(SWL+(1*TSL))+(1*TL))\(LL+TL) ;Quit:($G(SWMidden) ) ((LL+TL)*Cnt)-(2*TL)+(2*TSL)+SWL ; (MaxLengte-(SWL+(2*TSL))+(2*TL))\(LL+TL) Quit 0 // ---------------------------------------------------------- // Algoritme voor Combinaties: Lampen van verschillende types // ---------------------------------------------------------- tccCalcTypeCS ; Do TLCombiCalcPV(MaxLengte,TussenAfstand,MaxSoorten,MaxLamp,arResult) New arLampLU,arResult,MaxSoorten,MaxLamp,i,j,Cnt,LLtot,sKey,CntSoort Kill arResult Set TLID="" For Set TLID=$O(..SwizzleTLs(TLID)) Quit:(TLID="") Do . Set TLobj=..SwizzleTLs(TLID) . Quit:('TLobj) . Set arLampLU(TLID)=TLobj.Lengte Set MaxSoorten=$G(arPrm("MaxS"),99) Set MaxLamp=$G(arPrm("MaxCnt"),99) Set blnExclude1S=''$G(arPrm("Excl.1S")) Do TLCombiCalcRecurs(MaxLengte,TL,MaxSoorten,MaxLamp,.arLampLU,.arResult) ; TL=$G(TussenAfstand,0) ; Parse Result into arCombi Set i=$$$GetLastI Set j="" For Set j=$O(arResult("L",j)) Quit:(j="") Do . Set CntSoort=$G(arResult("L",j,"#S")) . Quit:(blnExclude1S)&&(CntSoort<2) . Set i=i+1 . Merge arCombi(i,"TLID")=arResult("L",j,"TLID") . Set LLtot=0 . Set sKey="" . Set TLID="" . For Set TLID=$O(arCombi(i,"TLID",TLID)) Quit:(TLID="") Do .. Set Cnt=$G(arCombi(i,"TLID",TLID)) .. Quit:(Cnt'>0) .. Set sKey=sKey_"+"_Cnt_":"_TLID .. Set LLtot=LLtot+(arLampLU(TLID)*Cnt) . Set:($E(sKey,1)="+") $E(sKey,1)="" . Set arCombi(i,"Key")=$S(CntSoort=1:"1S", 1:"CS")_"\"_sKey . Set arCombi(i,"Extra","LLtot")=LLtot . Set arCombi(i,"Extra","#S")=CntSoort . Set NL=$$tccCSNodigeLengte . Set arCombi(i,"Extra","NL")=NL . Set arCombi(i,"Extra","Lrest")=MaxLengte-NL . ;Set arCombi(i,"Extra","LrestPV")=$G(arResult("L",j,"REST")) ;d WL^vhDBG($$$ArrayTT("arCombi")) Quit tccCSNodigeLengte() Quit LLtot+(TL*($G(arResult("L",j,"#L"))-1)) TLCombiSort ; Parameters: &arCombi, &arSort New i,tmpAr,BWType,L,OmsStd,OmsTmp Do:('$D(..SwizzleTLs)) ..SwizzleTL() Set i="" For Set i=$O(arCombi(i)) Quit:(i="") Do . Set BWType=$P($G(arCombi(i,"Key")),"\",1) . Set:(BWType="") BWType="?" . Set:(BWType="CS") BWType=BWType_"\"_$G(arCombi(i,"Extra","#S")) . Set tmpAr("C#1",BWType)=$G(tmpAr("C#1",BWType))+1 . If $G(arCombi(i,"Extra","Lrest"))="" Do .. Set tmpAr("C#1",BWType,"F",i)=i ; Fixed: vaste volgorde . Else Do .. Set tmpAr("C#1",BWType,"C#2",arCombi(i,"Extra","Lrest"),"F",i)=i . Do tcsCalcOms(i) Merge tmpAr("~Spec")=tmpAr("Spec") Kill tmpAr("Spec") Kill arSort Set (BWType,i,L)="" ; Sortering op 3 niveaus: BWtype, Lrest, i (derde niveau in geval dat meerdere lengtes "Lrest" gelijk zijn) For Set BWType=$O(tmpAr("C#1",BWType)) Quit:(BWType="") Do . Do tcsAddToSortArray("catg:"_$P(BWType,"\",1)) . ; Sorteren van nodes via Criteria . For Set L=$O(tmpAr("C#1",BWType,"C#2",L)) Quit:(L="") Do .. For Set i=$O(tmpAr("C#1",BWType,"C#2",L,"F",i)) Quit:(i="") Do ... Do tcsAddToSortArray(tmpAr("C#1",BWType,"C#2",L,"F",i)) . ; Sorteren van de overige nodes (criteria kunnen niet toegepast worden) . For Set i=$O(tmpAr("C#1",BWType,"F",i)) Quit:(i="") Do .. Do tcsAddToSortArray(tmpAr("C#1",BWType,"F",i)) Quit tcsCalcOms(i) Quit:($G(arCombi(i,"Extra","Lrest"))="") Set OmsTmp=$J("["_$J(arCombi(i,"Extra","Lrest"),0,0)_"]",23) Set OmsStd=$G(arCombi(i,"Oms")) Set $E(OmsTmp,1,16)=OmsStd_$J("",16-$L(OmsStd)) Set arCombi(i,"Oms","S")=OmsTmp Quit tcsAddToSortArray(Value) Set arSort=$G(arSort)+1 Set arSort(arSort)=Value Quit arSort TLCombiVerdeel ; Parameters: &arCombi, TussenAfstand, AftrekLi, AftrekRe, Align(="L"), lbTLWs ; arCombi bevat meestal slechts 1 hoofdnode, maar kan in principe ook meerdere bevatten. Daarom $ORDER() Quit:('$D(arCombi)) New NutLengte,TL,BeginPos,CurPos,tmpCenter,i,j,TLID,Cnt,CntIDs,lbIDs,lbPos,lbTLs,SomW,TotTLW Do:('$D(..SwizzleTLs)) ..SwizzleTL() Set NutLengte=..NutLengte(,AftrekLi,AftrekRe) Quit:(NutLengte'>0) Set TL=$G(TussenAfstand,0) Set:(TL'>0) TL=0 Set i="" For Set i=$O(arCombi(i)) Quit:(i="") Do . Do tcvVerdeel Quit tcvVerdeel #define NodigeLengte arCombi(i,"Extra","NL") #define TotLampLengte arCombi(i,"Extra","LLtot") Quit:($P($G(arCombi(i,"Key")),"\",1)'?1(1"1S",1"CS")) Kill lbTLs Set lbIDs=$$tcvBuildIDsList Set CntIDs=$LL(lbIDs) If Align="R" Do . Set BeginPos=AftrekLi+$$tcvMax(0, NutLengte-$$$NodigeLengte) Else If Align="C" Do . If (AftrekRe'=AftrekLi) && $G(blnCenterToProf,1) Do .. ; om te Centeren t.o.v. ProfLengte: kleine correctie toevoegen als AftrekRe <> AftrekLi. .. Set AftrekCorr=(AftrekRe-AftrekLi) .. Set tmpCenter=(NutLengte-$ZABS(AftrekCorr)-$$$NodigeLengte)/2 .. If AftrekCorr>0 Set BeginPos=AftrekLi+AftrekCorr+$S((tmpCenter<0):2*tmpCenter, 1:$$tcvMax(0, tmpCenter)) .. Else Set BeginPos=AftrekLi+$$tcvMax(0, tmpCenter) . Else Do .. Set BeginPos=AftrekLi+$$tcvMax(0, (NutLengte-$$$NodigeLengte)/2) Else Do . Set BeginPos=AftrekLi If Align="J" Do . Set lbTLs=$$tcvBuildTLWeightList($G(lbTLWs)) Set lbPos=$$tcvBuildPosList Set arCombi(i,"List","IDs")=lbIDs Set arCombi(i,"List","Pos")=lbPos Quit tcvMax(v1,v2) Quit $S(v1>v2:v1, 1:v2) tcvBuildIDsList() Set lbIDs="" Set TLID="" For Set TLID=$O(arCombi(i,"TLID",TLID)) Quit:(TLID="") Do . For Cnt=1:1:arCombi(i,"TLID",TLID) Set lbIDs=lbIDs_$LB(TLID) Quit lbIDs tcvBuildPosList() ; Als lbTLs niet bestaat, wordt gewoon TL als waarde genomen Set:($G(lbTLs)="")||($LL(lbTLs)=0) lbTLs="" Set lbPos="" Set CurPos=BeginPos+$LG(lbTLs,1,0) For Cnt=1:1:CntIDs Do:($LG(lbIDs)'="") . Set TLID=$LI(lbIDs,Cnt) . Set lbPos=lbPos_$LB($J(CurPos,0,0)) . Set CurPos=CurPos+..SwizzleTLs(TLID).Lengte+$$tcvMax(TL,$LG(lbTLs,Cnt+1,TL)) Quit lbPos tcvBuildTLWeightList(lbTLWs) ; ListBuild gewichten (lbTLWs) ;d WL^vhDBG($$$LCVT(lbTLWs)) If CntIDs=0 Do ; Geen lampen . Set lbTLWs="" Else If CntIDs=1 Do ; Eén lamp . If $LL(lbTLWs)=0 Set lbTLWs=$LB(0,0) . Else Set lbTLWs=$LB($LI(lbTLWs,1),$LI(lbTLWs,-1)) Else If CntIDs+1=$LL(lbTLWs) Do . ; lbTLWs bevat exact het aantal elementen voor TussenLengte (incl. links en rechts) Else Do ; Meerdere lampen . If $LL(lbTLWs)=0 Set lbTLWs=$LB(0,1,0) . Else If $LL(lbTLWs)=1 Set lbTLWs=lbTLWs_lbTLWs_lbTLWs . Else Set lbTLWs=$LB($LI(lbTLWs,1),$LI(lbTLWs,2),$LI(lbTLWs,-1)) . If CntIDs>2 Do .. New tmpLB .. Set tmpLB="" .. For j=2:1:CntIDs Set tmpLB=tmpLB_$LB($LI(lbTLWs,2)) .. Set $LI(lbTLWs,2,2)=tmpLB ;Set TL=$S(CntIDs>1:$$tcvMax(TL, (NutLengte-$$$TotLampLengte)/(CntIDs-1)), 1:0) ; Tussenafstanden : gelijke delen ; Met de gewichten (lbTLWs) de ListBuild TussenLengtes (lbTLs) berekenen Set SomW=0 For j=1:1:$LL(lbTLWs) Set SomW=SomW+$LI(lbTLWs,j) Set:(SomW=0) SomW=1 Set TotTLW=(NutLengte-$$$TotLampLengte)/SomW ; Totale vrije lengte / som van de gewichten Set lbTLs="" For j=1:1:$LL(lbTLWs) Set lbTLs=lbTLs_$LB((TotTLW*$LI(lbTLWs,j))) ;d WL^vhDBG("cvt: "_$$$LCVT(lbTLWs)_" TL:"_$$$LCVT(lbTLs)) Quit lbTLs /* tmpAr(0,".TYPE")=UIT tmpAr(0,"POS","E")=0 tmpAr(1,".TYPE")=VR tmpAr(1,"LEN")=30 tmpAr(2,".TYPE")=TL ; Lamp begin:einde / center tmpAr(2,"CHK2")=2 ; -------------------- tmpAr(2,"ID")=1013 ; tussenruimte tmpAr(2,"LEN")=550 ; =================================== tmpAr(2,"POS","B")=30 ; 30 tmpAr(2,"POS","C")=305 ; +--------------+ tmpAr(2,"POS","E")=580 ; 13 W | 30 : | tmpAr(3,".TYPE")=VR ; L=550 mm | : 305 | tmpAr(3,"LEN")=40 ; | 580 : | tmpAr(4,".TYPE")=TL ; +--------------+ tmpAr(4,"ID")=1035 ; 40 tmpAr(4,"LEN")=1480 ; +--------------+ tmpAr(4,"POS","B")=620 ; 35 W | 620 : | tmpAr(4,"POS","C")=1360 ; L=1480 mm | : 1360 | tmpAr(4,"POS","E")=2100 ; | 2100 : | tmpAr(5,".TYPE")=VR ; +--------------+ tmpAr(5,"LEN")=30 ; 30 tmpAr(6,".TYPE")=TL ; +--------------+ tmpAr(6,"CHK1")=1 ; 8 W | 2130 : | tmpAr(6,"ID")=1008 ; L=320 mm | : 2290 | tmpAr(6,"LEN")=320 ; | 2450 : | tmpAr(6,"POS","B")=2130 ; +--------------+ tmpAr(6,"POS","C")=2290 ; 350 tmpAr(6,"POS","E")=2450 ; ==-L:2800 mm-====================== tmpAr(7,".TYPE")=VR tmpAr(7,"LEN")=350 tmpAr(100,".TYPE")=UIT tmpAr(100,"POS","B")=2800 */ ; Do TLCombiCalcPV^BL.PR.GA.TLM.tmpDev(500,5,3,3,.arTest) zw arTest TLCombiCalcPV(MaxLengte,TussenAfstand,MaxSoorten,MaxLamp,arResult) Kill arResult ; Zelf opbouwen voor test Set Lampen(1008)=320 Set Lampen(1013)=550 Set Lampen(1014)=580 Set Lampen(1021)=880 Set Lampen(1028)=1180 Set Lampen(1035)=1480 Set MaxSoorten=$G(MaxSoorten,99) Set MaxLamp=$G(MaxLamp,99) Do TLCombiCalcRecurs(MaxLengte,TussenAfstand,MaxSoorten,MaxLamp,.Lampen,.arResult) Quit ; Lampen, arResult en arOR via .Local doorgeven TLCombiCalcRecurs(MaxLengte,TussenAfstand,MaxSoorten,MaxLamp,Lampen,arResult,arOR) New TLID,AantalLamp,arTR,LL,MaxLampCalc,AantalLampCalc If ($G(arOR("#L"))'(MaxLamp-$G(arOR("#L"))):MaxLamp-$G(arOR("#L")),1:AantalLampCalc) . For AantalLamp=1:1:MaxLampCalc Do .. Kill arTR .. Merge arTR=arOR ; kopieren voor volgende recursie .. Set arTR("TLID",TLID)=AantalLamp .. Set arTR("REST")=$G(arTR("REST"),MaxLengte)-((LL+TussenAfstand)*AantalLamp)+$S($G(arTR("#L")):0,1:TussenAfstand) ; Bij de eerste lamp de tussenafstand er 1 keer bijtellen .. Set arTR("#L")=$G(arTR("#L"))+AantalLamp .. Set arTR("#S")=$G(arTR("#S"))+1 .. If MaxLampCalc=AantalLamp Do ; Opslag ... Merge arResult("L",$I(arResult))=arTR ... Set arResult("R",arTR("REST"),arTR("#S"),arTR("#L"),arResult)="" ; Sortering op rest minima ... Set arResult("S",arTR("#S"),arTR("REST"),arTR("#L"),arResult)="" ; Sortering op #Soorten ... Set arResult("M",$S(arTR("#S")=1:1,1:2),arTR("REST"),arTR("#S"),arTR("#L"),arResult)="" ; Sortering op 1 en meerdere .. ; Recursie .. Do TLCombiCalcRecurs(MaxLengte,TussenAfstand,MaxSoorten,MaxLamp,.Lampen,.arResult,.arTR)