- correzioni alla conversione da .NET a LUA
- aggiunte alla gestione della storia - aggiunte alla gestione della terna - correzioni varie.
This commit is contained in:
+179
-122
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user