- correzioni alla conversione da .NET a LUA

- aggiunte alla gestione della storia
- aggiunte alla gestione della terna
- correzioni varie.
This commit is contained in:
Daniele Bariletti
2024-10-22 16:20:12 +02:00
parent 622cafcfc8
commit 10f293b549
+179 -122
View File
@@ -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")