diff --git a/OperationOnSolid.lua b/OperationOnSolid.lua index 06543cd..83937ef 100644 --- a/OperationOnSolid.lua +++ b/OperationOnSolid.lua @@ -20,20 +20,20 @@ ASS.nIdFirstLine = GDB_ID.NULL -- edge del part con cui eseguire l'accoppiame ASS.nIdSecondLine = GDB_ID.NULL -- edge di destinazione dell'accoppiamento ASS.nIdAxs = GDB_ID.NULL -- asse con cui eseguire la rotazione( è una CRV_LINE) ASS.dAng = 0 -- angolo per la rotazione -ASS.vtAx = V_NULL -- asse di rotazione -ASS.ptAx = ORIG -- punto per l'asse di rotazione -ASS.vtMove = V_NULL -- vettore di traslazione -ASS.vtFirstNorm = V_NULL -- normale della superficie del part da accoppiare -ASS.vtSecondNorm = V_NULL -- normale di destinazione dell'accoppiamento +ASS.vtAx = V_NULL() -- asse di rotazione +ASS.ptAx = ORIG() -- punto per l'asse di rotazione +ASS.vtMove = V_NULL() -- vettore di traslazione +ASS.vtFirstNorm = V_NULL() -- normale della superficie del part da accoppiare +ASS.vtSecondNorm = V_NULL() -- normale di destinazione dell'accoppiamento ASS.nVeinCtx = GDB_ID.NULL -- indice del contesto del VeinMatch3D -ASS.bFlipParllel = false -- booleano che indica se eseguire un flip parallelo durante il pairing -ASS.bFlipPerpendicular = false -- booleano che indica se eseguire un flip perpendicolare durante il pairing ASS.nOption = 0 -- intero che indica l'opzione di pairing scelta ASS.nGroup = 0 -- intero che indica il numero del gruppo da aggiornare per il part nPartToPair ASS.nPartToPair = GDB_ID.NULL -- id del part di cui si vogliono aggiornare le info di pairing ASS.sPairList = "" -- lista di accoppiamento ASS.bSaveHist = true -- flag che indica se salvare nella storia l'operazione eseguita ASS.bSaveTemp = false -- flag che indica se salvare nella storia temporanea l'operazione eseguita +ASS.nTempToSave = GDB_ID.NULL -- posizione nel vettore temporaneo della trasformazione da salvare +ASS.nTypeTrf = GDB_ID.NULL -- tipo della trasformazione da aggiungere alla storia -- output ASS.ERR = GDB_ID.NULL @@ -42,8 +42,10 @@ ASS.nTransf = 0 -- numero di operazioni eseguite -- variabili locali local vPaired = {} -local ptPair = ORIG +local ptPair = ORIG() local GroupCounter = 1 -- ogni volta che viene usato va incrementato di 1 +local nTernaId = GDB_ID.NULL +local ptOrigId = ORIG() -- gestione della storia -- tbEvent = { Id, vtDir, ptAx, dAngOrId, bWPaired, lPair} -- solo move e rotate possono essere effettuati su pezzi singoli, anche se accoppiati @@ -65,22 +67,21 @@ function ResetASS() ASS.nIdSecondLine = GDB_ID.NULL ASS.nIdAxs = GDB_ID.NULL ASS.dAng = 0 - ASS.vtAx = V_NULL - ASS.ptAx = ORIG - ASS.vtMove = V_NULL - ASS.vtFirstNorm = V_NULL - ASS.vtSecondNorm = V_NULL + ASS.vtAx = V_NULL() + ASS.ptAx = ORIG() + ASS.vtMove = V_NULL() + ASS.vtFirstNorm = V_NULL() + ASS.vtSecondNorm = V_NULL() ASS.nVeinCtx = GDB_ID.NULL - ASS.bFlipParllel = false - ASS.bFlipPerpendicular = false ASS.nOption = 0 ASS.nGroup = 0 ASS.nPartToPair = GDB_ID.NULL ASS.sPairList = "" + ASS.nTempToSave = GDB_ID.NULL + ASS.nTypeTrf = GDB_ID.NULL -- output ASS.ERR = GDB_ID.NULL ASS.nTransf = 0 - ASS.nTypeTrf = -1 end local function FromStringToINTVECTOR( sIntVectorString) @@ -92,20 +93,8 @@ local function FromStringToINTVECTOR( sIntVectorString) return vInt end -function ASS.AddEvent() - local tbEvent = {} - if nTypeTrf == 0 then -- traslazione - tbEvent = {Id = ASS.nPartId, vtDir = ASS.vtMove, ptAx = ORIG, dAngOrId = 0, bWPaired = true, lPair = {}} - elseif nTypeTrf == 1 then -- rotazione - tbEvent = {Id = ASS.nPartId, vtDir = ASS.vtAx, ptAx = ORIG, dAngOrId = ASS.dAng, bWPaired = true, lPair = {}} - elseif nTypeTrf == 2 then -- accoppiamento - tbEvent = {Id = ASS.nPartId, vtDir = V_NULL, ptAx = ORIG, dAngOrId = ASS.nPartToPair, bWPaired = true, lPair = FromStringToINTVECTOR(ASS.sPairList)} - end - AddEvent( tbEvent) -end - local function AddEvent( tbEvent) - if #tbEvent == 0 then do return end end + if not tbEvent.Id then do return end end -- se ho già raggiunto il massimo della storia salvabile allora elimino il primo elemento if Time == ASS.nMaxStory then table.remove(tbStory,1) end -- se ero avevo già fatto degli undo allora devo cancellare la storia che sto per sovrascrivere @@ -133,12 +122,43 @@ local function AddTempEvent( tbEvent) table.insert( tbTempStory, tbEvent) end +function ASS.AddEvent() + local tbEvent = {} + local a = tbEvent.nId + if ASS.nTypeTrf == 0 then -- traslazione + tbEvent = {Id = ASS.nPartId, vtDir = ASS.vtMove, ptAx = ORIG(), dAngOrId = 0, bWPaired = true, lPair = {}} + elseif ASS.nTypeTrf == 1 then -- rotazione + tbEvent = {Id = ASS.nPartId, vtDir = ASS.vtAx, ptAx = ASS.ptAx, dAngOrId = ASS.dAng, bWPaired = true, lPair = {}} + elseif ASS.nTypeTrf == 2 then -- accoppiamento + tbEvent = {Id = ASS.nPartId, vtDir = V_NULL(), ptAx = ORIG(), dAngOrId = ASS.nPartToPair, bWPaired = true, lPair = FromStringToINTVECTOR(ASS.sPairList)} + else + do return end + end + AddEvent( tbEvent) +end + +function ASS.AddEventFromTemp() + if abs(ASS.nTempToSave) > #tbTempStory then do return end end + if ASS.nTempToSave < 0 then ASS.nTempToSave = #tbTempStory + 1 + ASS.nTempToSave end + AddEvent( tbTempStory[ASS.nTempToSave]) +end + +function ASS.ResetStory() + tbStory = {} + Time = 0 +end + +function ASS.ResetTempStory() + tbTempStory = {} + TempTime = 0 +end + local function ApplyTransf( tbEvent, bForward, bSave, bTemp) -- tbEvent = { Id, vtDir, ptAx, dAngOrId, bWPaired, lPair} ASS.bSaveHist = bSave -- se ho una traslazione o una rotazione applico la trasformazione a tutto l'accoppiato - if tbEvent.dAngOrId == 0 or not AreSameVectorExact(V_NULL, tbEvent.vtDir) then + if tbEvent.dAngOrId == 0 or not AreSameVectorExact(V_NULL(), tbEvent.vtDir) then -- se è un undo allora inverto il vettore if not bForward then tbEvent.vtDir = Vector3d(tbEvent.vtDir) * (-1) end if tbEvent.dAngOrId == 0 then @@ -151,7 +171,7 @@ local function ApplyTransf( tbEvent, bForward, bSave, bTemp) else ASS.MoveSingle() end - elseif not AreSameVectorExact(V_NULL, tbEvent.vtDir) then + elseif not AreSameVectorExact(V_NULL(), tbEvent.vtDir) then ASS.nPartId = tbEvent.Id ASS.vtAx = tbEvent.vtDir ASS.ptAx = tbEvent.ptAx @@ -167,25 +187,28 @@ local function ApplyTransf( tbEvent, bForward, bSave, bTemp) elseif bForward then -- sto applicando un accoppiamento -- aggiorno le info dei due part e di tutti i loro associati - UpdatePairInfo(tbEvent.Id, tbEvent.dAngOrId) + ASS.nPartId = tbEvent.Id + ASS.nPartToPair = tbEvent.dAngOrId + ASS.UpdatePairInfo() else -- sto applicando un disaccoppiamento - if trf.m_PairList == 1 then - Unpair(tbEvent.dAngOrId) + if #tbEvent.lPair == 1 then + ASS.nPartId = tbEvent.dAngOrId + ASS.Unpair() else -- alla lista del part selezionato per essere accoppiato tolgo tutti i part che ho aggiunto( part destinatario e suoi eventuali accoppiati) - for nIdToUnpair in tbEvent.lPair do + for n, nIdToUnpair in pairs(tbEvent.lPair) do -- rimuovo anche le info RemovePairInfo(tbEvent.Id, nIdToUnpair) end local sPairedNew1 = EgtGetInfo( tbEvent.Id, "Paired", "s") local lPairNew1 = EgtGetInfo(tbEvent.Id, "Paired", "vi") -- copio la nuova lista dei paired in tutti gli altri paired - for nIdPaired in lPairNew1 do + for n, nIdPaired in pairs(lPairNew1) do EgtSetInfo(nIdPaired, "Paired", sPairedNew1) end -- alla lista del part destinatario dell'accoppiamento tolgo tutti i part che gli ho aggiunto - for nIdPaired in lPairNew1 do + for n, nIdPaired in pairs(lPairNew1) do RemovePairInfo(tbEvent.dAngOrId, nIdPaired) end -- assegno un nuovo numero di gruppo al gruppo che ho creato @@ -194,7 +217,7 @@ local function ApplyTransf( tbEvent, bForward, bSave, bTemp) local sPairedNew2 = EgtGetInfo( tbEvent.dAngOrId, "Paired", "s") local lPairNew2 = EgtGetInfo( tbEvent.dAngOrId, "Paired", "vi") -- aggiorno la lista dei part che erano già paired con il part selezionato - for nIdPaired in lPairNew2 do + for n, nIdPaired in pairs(lPairNew2) do EgtSetInfo(nIdPaired, "Paired", sPairedNew2) EgtSetInfo(nIdPaired, "GroupCode", nGroupCode) end @@ -204,7 +227,7 @@ end function ASS.Undo() if Time == 0 then do return end end - if Time > ASS.nMaxStory then Time = ASS.nMaxStory end + if Time > #tbStory then Time = #tbStory end ApplyTransf(tbStory[Time], false, false, false) Time = Time - 1 end @@ -230,10 +253,6 @@ function ASS.RedoTemp() TempTime = TempTime + 1 end -local function RetrievePaired() - vPaired = EgtGetInfo( ASS.nPartId, "Paired", "vi") -end - local function RetrieveSurfNorm( nPartId) local nLayR = EgtGetFirstNameInGroup( nPartId, "Region") local nId = EgtGetFirstInGroup(nLayR) @@ -245,23 +264,55 @@ local function RetrieveSurfNorm( nPartId) end nId = EgtGetNext(nId) end - local vtNorm = EgtSurfFrNormVersor(nSurfId, GDB_ID.ROOT) + local vtNorm = EgtSurfFrNormVersor(nSurfId, GDB_RT.GLOB) return vtNorm end local function RetrieveParent( nId) + nId = EgtGetParent(EgtGetParent(nId)) local sName = "" sName = EgtGetName(nId, "s") - nId = EgtGetParent(EgtGetParent(nId)) if sName == "SOLID" then nId = EgtGetInfo(nId, "Parent","i") end return nId end +local function RetrievePart( nId) + local sName = EgtGetName(nId) + local nParent = nId + if sName == "SOLID" then + nParent = EgtGetInfo(nId, "Parent","i") + end + return nParent +end + +local function RetrievePaired() + vPaired = EgtGetInfo( RetrievePart(ASS.nPartId), "Paired", "vi") +end + +local function RetrieveLocAxis() + nTernaId = GDB_ID.NULL + nTernaId = EgtGetInfo( ASS.nPartId, "Terna", "i") + if not nTernaId then + return false + else + return true + end +end + +local function RetrieveLocOrig() + if nTernaId == GDB_ID.NULL then do return end end + local LayOrig = EgtGetFirstNameInGroup(nTernaId, "ORIG") + ptOrigId = EgtGetFirstNameInGroup(LayOrig, "ORIG") +end + function ASS.Move() -- recupero la lista degli accoppiati RetrievePaired() + if RetrieveLocAxis() then + EgtMove(nTernaId, ASS.vtMove) + end -- muovo il pezzo e tutti i suoi accoppiati for n, nId in pairs(vPaired) do EgtMove( nId, ASS.vtMove) @@ -270,7 +321,7 @@ function ASS.Move() end -- se richiesto salvo la storia if ASS.bActiveHist then - local tbEv = {Id = ASS.nPartId, vtDir = ASS.vtMove, ptAx = ORIG, dAngOrId = 0, bWPaired = true, lPair = {}} + local tbEv = {Id = ASS.nPartId, vtDir = ASS.vtMove, ptAx = ORIG(), dAngOrId = 0, bWPaired = true, lPair = {}} if ASS.bSaveHist then AddEvent( tbEv) end if ASS.bSaveTemp then AddTempEvent( tbEv) end end @@ -282,9 +333,12 @@ function ASS.MoveSingle() EgtMove( ASS.nPartId, ASS.vtMove) local nChild = EgtGetInfo( nId, "Child", "i") EgtMove( nChild, ASS.vtMove) + if RetrieveLocAxis() then + EgtMove(nTernaId, ASS.vtMove) + end -- se richiesto salvo la storia if ASS.bActiveHist then - local tbEv = {Id = ASS.nPartId, vtDir = ASS.vtMove, ptAx = ORIG, dAngOrId = 0, bWPaired = false, lPair = {}} + local tbEv = {Id = ASS.nPartId, vtDir = ASS.vtMove, ptAx = ORIG(), dAngOrId = 0, bWPaired = false, lPair = {}} if ASS.bSaveHist then AddEvent( tbEv) end if ASS.bSaveTemp then AddTempEvent( tbEv) end end @@ -294,6 +348,16 @@ end function ASS.Rotate() -- recupero la lista degli accoppiati RetrievePaired() + if RetrieveLocAxis() then + RetrieveLocOrig() + -- muovo la terna + local ptBefore = EgtSP(ptOrigId, GDB_RT.GLOB) + local ptAfterId = EgtCopyGlob(ptOrigId, nTernaId) + EgtRotate( ptAfterId, ASS.ptAx, ASS.vtAx, ASS.dAng, GDB_RT.GLOB) + local vtMove = Point3d(EgtSP( ptAfterId, GDB_RT.GLOB)) - Point3d(ptBefore) + EgtMove( nTernaId, vtMove) + EgtErase(ptAfterId) + end -- ruoto il pezzo e tutti i suoi accoppiati for n, nId in pairs(vPaired) do EgtRotate( nId, ASS.ptAx, ASS.vtAx, ASS.dAng) @@ -310,6 +374,17 @@ function ASS.Rotate() end function ASS.RotateSingle() + if RetrieveLocAxis() then + RetrieveLocOrig() + -- muovo la terna + local ptBefore = EgtSP(ptOrigId, GDB_RT.GLOB) + local ptAfterId = EgtCopy(ptOrigId, nTernaId) + EgtRotate( ptAfterId, ASS.ptAx, ASS.vtAx, ASS.dAng) + local vtMove = Point3d(EgtSP( ptAfterId, GDB_RT.GLOB)) - Point3d(ptBefore) + EgtMove( nTernaId, vtMove) + EgtErase(ptAfterId) + end + -- ruoto il pezzo MA NON i suoi accoppiati EgtRotate( ASS.nPartId, ASS.ptAx, ASS.vtAx, ASS.dAng) local nChild = EgtGetInfo( nId, "Child","i") EgtRotate( nChild, ASS.ptAx, ASS.vtAx, ASS.dAng) @@ -323,29 +398,22 @@ function ASS.RotateSingle() end function ASS.FlipParallel() - local vtNorm = V_NULL - -- recupero la normale della superficie originale - vtNorm = RetrieveSurfNorm( ASS.nPartId) + local vtNorm = V_NULL() + -- recupero la normale della superficie ORIG()inale + vtNorm = RetrieveSurfNorm( RetrievePart(ASS.nPartId)) local ptMid - ptMid = EgtMP(ASS.nIdFirstLine, GDB_ID.ROOT) + ptMid = EgtMP(ASS.nIdFirstLine, GDB_RT.GLOB) ASS.ptAx = ptMid ASS.vtAx = vtNorm ASS.dAng = 180 ASS.Rotate() - -- se richiesto salvo la storia - if ASS.bActiveHist then - local Ev = {Id = ASS.nPartId, vtDir = ASS.vtAx, ptAx = ASS.ptAx, dAngOrId = ASS.dAng, bWPaired = true, lPair = {}} - if ASS.bSaveHist then AddEvent( tbEv) end - if ASS.bSaveTemp then AddTempEvent( tbEv) end - end return true end -function ASS.FlipPependicular() - local nPart2 = EgtGetParent(EgtGetParent(ASS.nIdSecondLine)) +function ASS.FlipPerpendicular() -- recupero la normale della faccia principale del part del secondo part - local vtNorm = V_NULL - vtNorm = RetrieveSurfNorm( nPart2) + local vtNorm = V_NULL() + vtNorm = RetrieveSurfNorm( RetrieveParent(ASS.nIdSecondLine)) local vtStartDir = EgtSV(ASS.nIdSecondLine) local vtAx = vtNorm ^ vtStartDir -- recupero il punto usato per l'accoppiamento @@ -353,12 +421,6 @@ function ASS.FlipPependicular() ASS.vtAx = vtAx ASS.dAng = 180 ASS.Rotate() - -- se richiesto salvo la storia - if ASS.bActiveHist then - local tbEv = {Id = ASS.nPartId, vtDir = ASS.vtAx, ptAx = ASS.ptAx, dAngOrId = ASS.dAng, bWPaired = true, lPair = {}} - if ASS.bSaveHist then AddEvent( tbEv) end - if ASS.bSaveTemp then AddTempEvent( tbEv) end - end return true end @@ -369,21 +431,12 @@ function ASS.FacePair() if ASS.nIdFirstLine == GDB_ID.NULL then return false end if ASS.nIdSecondLine == GDB_ID.NULL then return false end -- recupero gli id dei Part - local nIdToPair = EgtGetParent(EgtGetParent(ASS.nIdSecondLine)) - local sName1 = "" - sName1 = EgtGetName(ASS.nPartId, "s") - if sName1 == "SOLID" then - ASS.nPartId = EgtGetInfo(ASS.nPartId, "Parent","i") - end - local sName2 = "" - sName2 = EgtGetName(nIdToPair, "s") - if sName2 == "SOLID" then - nIdToPair = EgtGetInfo(nIdToPair, "Parent","i") - end - local ptAx = EgtSP(ASS.nIdSecondLine, GDB_ID.ROOT) - local vtAx = Vector3d(EgtSV(ASS.nIdSecondLine, GDB_ID.ROOT)) + local nIdToPair = RetrieveParent(ASS.nIdSecondLine) + ASS.nPartId = RetrievePart(ASS.nPartId) + local ptAx = EgtSP(ASS.nIdSecondLine, GDB_RT.GLOB) + local vtAx = Vector3d(EgtSV(ASS.nIdSecondLine, GDB_RT.GLOB)) local vtNorm1 = Vector3d(ASS.vtFirstNorm):isZero() and Vector3d(RetrieveSurfNorm(ASS.nPartId)) or Vector3d(ASS.vtFirstNorm) - local vtNorm2 = Vector3d(ASS.vtSecondNorm):isZero() and Vector3d(RetrieveSurfNorm( RetrieveParent( ASS.nIdSecondLine))) or Vector3d(ASS.vtSecondNorm) + local vtNorm2 = Vector3d(ASS.vtSecondNorm):isZero() and Vector3d(RetrieveSurfNorm( nIdToPair)) or Vector3d(ASS.vtSecondNorm) local dAng = GetAngle( vtNorm1, vtNorm2) local vtCopy = Vector3d(vtNorm1) vtCopy:rotate(vtAx, 180 - dAng) @@ -400,23 +453,17 @@ function ASS.FacePair() end function ASS.EdgePair() + -- setto e faccio i controlli + -- resetto il conto di operazioni fatto + ASS.nTransf = 1 EgtSetContext(ASS.nVeinCtx) if ASS.nPartId == GDB_ID.NULL then return false end if ASS.nIdFirstLine == GDB_ID.NULL then return false end if ASS.nIdSecondLine == GDB_ID.NULL then return false end -- controllo che i due part non siano già accoppiati -- recupero l'id del secondo part - local nIdToPair = EgtGetParent(EgtGetParent(ASS.nIdSecondLine)) - local sName1 = "" - sName1 = EgtGetName(ASS.nPartId, "s") - if sName1 == "SOLID" then - ASS.nPartId = EgtGetInfo(ASS.nPartId, "Parent","i") - end - local sName2 = "" - sName2 = EgtGetName(nIdToPair, "s") - if sName2 == "SOLID" then - nIdToPair = EgtGetInfo(nIdToPair, "Parent","i") - end + local nIdToPair = RetrieveParent(ASS.nIdSecondLine) + ASS.nPartId = RetrievePart(ASS.nPartId) -- verifico che i due part non siano già accoppiati local nGroup1 = 0 local nGroup2 = 0 @@ -426,16 +473,16 @@ function ASS.EdgePair() -- se i due part non erano già associati allora procedo con l'accoppiamento -- first line local ptStartF, ptEndF, ptMidF, vtDirF - ptStartF = EgtSP(ASS.nIdFirstLine, GDB_ID.ROOT) - ptEndF = EgtEP(ASS.nIdFirstLine, GDB_ID.ROOT) - ptMidF = EgtMP(ASS.nIdFirstLine, GDB_ID.ROOT) - vtDirF = EgtSV(ASS.nIdFirstLine, GDB_ID.ROOT) + ptStartF = EgtSP(ASS.nIdFirstLine, GDB_RT.GLOB) + ptEndF = EgtEP(ASS.nIdFirstLine, GDB_RT.GLOB) + ptMidF = EgtMP(ASS.nIdFirstLine, GDB_RT.GLOB) + vtDirF = EgtSV(ASS.nIdFirstLine, GDB_RT.GLOB) -- second line local ptStartS, ptEndS, ptMidS, vtDirS - ptStartS = EgtSP(ASS.nIdSecondLine, GDB_ID.ROOT) - ptEndS = EgtEP(ASS.nIdSecondLine, GDB_ID.ROOT) - ptMidS = EgtMP(ASS.nIdSecondLine, GDB_ID.ROOT) - vtDirS = EgtSV(ASS.nIdSecondLine, GDB_ID.ROOT) + ptStartS = EgtSP(ASS.nIdSecondLine, GDB_RT.GLOB) + ptEndS = EgtEP(ASS.nIdSecondLine, GDB_RT.GLOB) + ptMidS = EgtMP(ASS.nIdSecondLine, GDB_RT.GLOB) + vtDirS = EgtSV(ASS.nIdSecondLine, GDB_RT.GLOB) local ptIni, ptFin if ASS.nOption == 0 then -- Start-Start @@ -465,43 +512,48 @@ function ASS.EdgePair() ASS.Move() local dTol = 0.001 if dAng < dTol or abs(dAng - 180) < dTol or abs(dAng - 360) < dTol then - if ASS.bFlipParallel then ASS.FlipParallel() end - if ASS.bFlipPerpendicular then ASS.FlipPerpendicular() end EgtDraw() return true end + ASS.nTransf = 2 -- ruoto il solid che sto spostando local vtAx = Vector3d( vtDirF ^ vtDirS) ASS.dAng = dAng ASS.ptAx = ptFin ASS.vtAx = vtAx ASS.Rotate() - if ASS.bFlipParallel then ASS.FlipParallel() end - if ASS.bFlipPerpendicular then ASS.FlipPerpendicular() end + EgtDraw() end function ASS.Unpair() -- rimuovo le info dal PartCurr e da tutti i suoi Pair + ASS.nPartToPair = ASS.nPartId + ASS.RemovePairInfo() + local nPartCurr = ASS.nPartId RetrievePaired() - RemovePairInfo(ASS.nPartId, ASS.nPartId) local sPaired = EgtGetInfo(ASS.nPartId, "Paired") for n, nId in pairs(vPaired) do ASS.nPartId = nId ASS.sPairList = sPaired - ASS.nGroup= GDB_ID.NULL + ASS.nGroup = #vPaired > 1 and GDB_ID.NULL or 0 ASS.UpdatePairInfoSingle() end + -- resetto le info di pairing del part corrente + ASS.nPartId = nPartCurr + ASS.sPairList = EgtNumToString(nPartCurr) + ASS.nGroup = 0 + ASS.UpdatePairInfoSingle() end -function RemovePairInfo() --nId As Integer, nIdToUnpair As Integer +function ASS.RemovePairInfo() --nId As Integer, nIdToUnpair As Integer -- al part nId tolgo l'accoppiamento con nIdToUnpair --aggiorno le info - local sPair = EgtGetInfo(nId, "Paired", sPair) + local sPair = EgtGetInfo(ASS.nPartId, "Paired", sPair) local vsPaired = EgtSplitString(sPair, ",") - local sIdToUnpair = EgtNumToString(nIdToUnpair) + local sIdToUnpair = EgtNumToString(ASS.nPartToPair) -- ricostruisco l'informazione paired senza l'Id che ho disaccoppiato local sNewPaired = "" - for sIdPaired in vsPaired do + for s, sIdPaired in pairs(vsPaired) do if sIdPaired ~= sIdToUnpair then if sNewPaired ~= "" then sNewPaired = sNewPaired .. "," .. sIdPaired @@ -511,8 +563,7 @@ function RemovePairInfo() --nId As Integer, nIdToUnpair As Integer end end -- aggiorno le info - local nGroup = If(#vsPaired > 2, GDB_ID.NULL, 0) - ASS.nPartId = nId + local nGroup = #vsPaired > 2 and GDB_ID.NULL or 0 ASS.sPairList = sNewPaired ASS.nGroup = nGroup ASS.UpdatePairInfoSingle() @@ -526,15 +577,18 @@ function ASS.UpdatePairInfoSingle() end function ASS.UpdatePairInfo() - local nId1 = ASS.nPartId + local nId1 = RetrievePart(ASS.nPartId) + ASS.nPartId = nId1 -- il secondo id lo recupero dal parent del secondo edge, se presente, altrimenti da nPartToPair local nId2 = GDB_ID.NULL if ASS.nIdSecondLine ~= GDB_ID.NULL then nId2 = RetrieveParent(ASS.nIdSecondLine) else - nId2 = ASS.nPartToPair + nId2 = RetrievePart(ASS.nPartToPair) end - + ASS.nPartToPair = nId2 + -- salvo la lista degli attuali accoppiati del part destinatario dell'accoppiamento + local lPairList = EgtGetInfo( ASS.nPartToPair,"Paired", "vi") -- verifico se uno o entrambi dei due part sono già in un gruppo local sPaired1 = "" sPaired1 = EgtGetInfo(nId1, "Paired") @@ -544,21 +598,21 @@ function ASS.UpdatePairInfo() -- se nessuno dei due era in un gruppo creo un nuovo gruppo con questi due part if sPaired1 == EgtNumToString(nId1) and sPaired2 == EgtNumToString(nId2) then sPaired1 = sPaired1 .. "," .. sPaired2 - nGroup = EgtGetInfo(nId1, "GroupCode") + nGroup = EgtGetInfo(nId1, "GroupCode","i") -- se solo il secondo era in un gruppo, al secondo copio gli id del gruppo elseif sPaired1 == EgtNumToString(nId1) and sPaired2 ~= EgtNumToString(nId2) then sPaired2 = sPaired2 .. "," .. EgtNumToString(nId1) sPaired1 = sPaired2 - nGroup = EgtGetInfo(nId2, "GroupCode") + nGroup = EgtGetInfo(nId2, "GroupCode","i") -- se solo il primo era in un gruppo, al secondo copio gli id del gruppo elseif sPaired1 ~= EgtNumToString(nId1) and sPaired2 == EgtNumToString(nId2) then sPaired1 = sPaired1 .. "," .. EgtNumToString(nId2) - nGroup = EgtGetInfo(nId1, "GroupCode") + nGroup = EgtGetInfo(nId1, "GroupCode","i") -- se entrambi erano in un gruppo faccio il merge elseif sPaired1 ~= EgtNumToString(nId1) and sPaired2 ~= EgtNumToString(nId2) then sPaired1 = sPaired1 .. "," .. sPaired2 - local nGroup1 = EgtGetInfo(nId1, "GroupCode") - local nGroup2 = EgtGetInfo(nId2, "GroupCode") + local nGroup1 = EgtGetInfo(nId1, "GroupCode","i") + local nGroup2 = EgtGetInfo(nId2, "GroupCode","i") nGroup = nGroup1 < nGroup2 and nGroup1 or nGroup2 end if nGroup == 0 then @@ -569,17 +623,20 @@ function ASS.UpdatePairInfo() local vPaired_s = EgtSplitString(sPaired1) -- qua devo fare uno split sulle virgole ASS.sPairList = sPaired1 ASS.nGroup = nGroup + local nPartCurr = ASS.nPartId for n, sId in pairs(vPaired_s) do local nId = EgtEvalNumExpr(sId) ASS.nPartId = nId ASS.UpdatePairInfoSingle() end if ASS.bActiveHist then - local lPairList = EgtGetInfo( ASS.nPartId,"Paired", "vi") - local tbEv = {Id = ASS.nPartId, vtDir = V_NULL, ptAx = ORIG, dAngOrId = ASS.nPartToPair, bWPaired = true, lPair = lPairList} + ASS.nPartId = nPartCurr + local tbEv = {Id = ASS.nPartId, vtDir = V_NULL(), ptAx = ORIG(), dAngOrId = ASS.nPartToPair, bWPaired = true, lPair = lPairList} if ASS.bSaveHist then AddEvent( tbEv) end if ASS.bSaveTemp then AddTempEvent( tbEv) end end return true end +--dofile("D:\\Temp\\marmo\\repeat2.lua") +