- in PreCollisionLib refactoring e ottimizzazioni tempo esecuzione

- in Process e simili aggiunto azzeramento PreCollisionLib
This commit is contained in:
luca.mazzoleni
2025-11-26 12:26:37 +01:00
parent 74a12a4a42
commit 86adb74131
3 changed files with 120 additions and 32 deletions
+118 -32
View File
@@ -51,13 +51,59 @@ local function GetRestlengthSurfFrInPlane( Part, vtDirection)
return idRestlengthSurfFr
end
-------------------------------------------------------------------------------------------------------------
-- calcolo pivot in riferimento globale
local function GetGlobalPivot( ptRef, vtHead, vtNEdge, Tool)
-- frame solidale all'utensile (lo stesso in cui vtPivot è definito)
local frTool = Frame3d( ptRef, vtHead, vtNEdge)
-- TODO vtPivotGlob dovrà arrivare da funzione perchè può cambiare con SCC (es: aggregato)
local vtPivotGlob = Vector3d( Tool.SetupInfo.vtPivot)
vtPivotGlob:toGlob( frTool)
local ptPivot = ptRef + vtPivotGlob
return ptPivot
end
-------------------------------------------------------------------------------------------------------------
-- restituisce i punti notevoli della lavorazioni in cui fare il controllo
local function GetMachiningPoints( Edge, dDepthToMachine)
local MachiningPoints = {}
-- punti notevoli
local ptStart = Edge.ptStart + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
local ptEnd = Edge.ptEnd + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
local ptMid = Point3d( ( ptStart + ptEnd) / 2)
-- caso ottimizzato: lato parallelo ad una direzione principale
local vtEdge = Edge.ptEnd - Edge.ptStart
vtEdge:normalize()
local bIsEdgeParallelToMainDirection =
AreSameOrOppositeVectorApprox( vtEdge, X_AX())
or AreSameOrOppositeVectorApprox( vtEdge, Y_AX())
or AreSameOrOppositeVectorApprox( vtEdge, Z_AX())
-- aggiunta punti
-- inizio e fine solo se lato obliquo
if bIsEdgeParallelToMainDirection then
table.insert( MachiningPoints, ptStart)
end
table.insert( MachiningPoints, ptMid)
if bIsEdgeParallelToMainDirection then
table.insert( MachiningPoints, ptEnd)
end
return MachiningPoints
end
-------------------------------------------------------------------------------------------------------------
-- si controlla la collisione con il carro Z nei 3 piani globali X, Y e Z. Se c'è collisione in tutti i piani, il carro sarà in collisione.
function PreCollisionLib.CheckCollisionAxisZ( Edge, vtNFace, vtHead, Part, Tool, dDepthToMachine)
-- se faccia non parallela a direzione testa c'è qualcosa che non va
if not AreSameOrOppositeVectorApprox( vtNFace, vtHead) then
error( 'CheckCollisionAxisZ : invalid directions')
error( 'CheckCollision : invalid directions')
end
-- TODO modificare e rimettere (Hmax pezzo)
@@ -70,11 +116,7 @@ function PreCollisionLib.CheckCollisionAxisZ( Edge, vtNFace, vtHead, Part, Tool,
-- end
-- punti notevoli della lavorazione in cui fare il check
local MachiningPoints = {
Edge.ptStart + Edge.vtN * ( Edge.dElevation - dDepthToMachine),
Point3d( ( Edge.ptStart + Edge.ptEnd) / 2) + Edge.vtN * ( Edge.dElevation - dDepthToMachine),
Edge.ptEnd + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
}
local MachiningPoints = GetMachiningPoints( Edge, dDepthToMachine)
-- punti in centro lama su naso mandrino o aggregato. In base a direzione e punto
local bIsDownUp = AreOppositeVectorApprox( vtNFace, vtHead)
@@ -95,46 +137,90 @@ function PreCollisionLib.CheckCollisionAxisZ( Edge, vtNFace, vtHead, Part, Tool,
local Color = Color3d( math.random(0, 255), math.random(0, 255), math.random(0, 255))
-- TEST
-- per ogni punto in cui controllare si crea una flat region
local CollisionCurves = {}
local bMoveAfterSplit = false
for j = 1, #ToolExitPoints do
-- nel singolo punto notevole si ha collisione se si trova intersezione in tutte le direzioni
-- se almeno in un punto c'è collisione con il pezzo si ritorna collisione
-- se non si trova collisione si ritorna se è necessario separare prima di effettuare la lavorazione (ossia non c'è collisione con il pezzo ma c'è con il grezzo restante)
for i = 1, #ToolExitPoints do
-- calcolo pivot in riferimento globale
local ptRef = ToolExitPoints[j]
local frTool = Frame3d( ptRef, vtHead, Edge.vtN)
-- TODO vtPivotGlob dovrà arrivare da funzione perchè può cambiare con SCC (es: aggregato)
local vtPivotGlob = Vector3d( Tool.SetupInfo.vtPivot)
vtPivotGlob:toGlob( frTool)
local ptPivot = ptRef + vtPivotGlob
-- pivot in globale
local ptRef = ToolExitPoints[i]
local ptPivot = GetGlobalPivot( ptRef, vtHead, Edge.vtN, Tool)
for i = 1, #CheckDirections do
local nCollisionCountPiece = 0
local nCollisionCountRestlength = 0
local vtDirectionX = CheckDirections[i].vtDirectionX
local vtDirectionZ = CheckDirections[i].vtDirectionZ
local sDirectionName = CheckDirections[i].sDirectionName
for j = 1, #CheckDirections do
-- costruzione flat region del pezzo e del grezzo restante nel piano perpendicolare al taglio
local idPartSurfFr = GetPartSurfFrInPlane( Part, vtDirectionZ)
local idRestLengthSurfFr = GetRestlengthSurfFrInPlane( Part, vtDirectionZ)
-- costruzione flat region della curva di collisione nel piano scelto, per tutti i punti notevoli scelti
-- recupero punti da macchina per costruire flat region
local ZAxisPoints = Tool.SetupInfo.GetAxisZPoints( sDirectionName)
-- curva di collisione in riferimento locale
local idCollisionCurve = EgtCurveCompoFromPoints( Part.idTempGroup, ZAxisPoints)
table.insert( CollisionCurves, idCollisionCurve)
local vtDirectionX = CheckDirections[j].vtDirectionX
local vtDirectionZ = CheckDirections[j].vtDirectionZ
local sDirectionName = CheckDirections[j].sDirectionName
-- costruzione flat region della curva di collisione nel piano scelto
-- recupero punti da macchina per costruire flat region
local CollisionCurvePoints = Tool.SetupInfo.GetAxisPoints( 'Z', sDirectionName)
-- curva di collisione in riferimento locale
local idCollisionCurve = EgtCurveCompoFromPoints( Part.idTempGroup, CollisionCurvePoints)
-- TEST
EgtSetColor( idCollisionCurve, Color)
-- TEST
-- curva in riferimento globale
local frReference = Frame3d( ptPivot, vtDirectionZ, vtDirectionX)
EgtTransform( idCollisionCurve, frReference, GDB_RT.GLOB )
-- flat region di collisione
local idCollisionSurfFr = EgtSurfFlatRegion( Part.idTempGroup, idCollisionCurve)
-- check collisione con pezzo (per la collisione deve esserci intersezione su tutti e 3 i piani)
-- si controlla solo se nelle direzioni precedenti è stata trovata collisione col pezzo,
-- altrimenti significa che non si è usciti dal ciclo solamente la collisione con grezzo per restituire bMoveAfterSplit
local bCollisionFoundPiece = false
if nCollisionCountPiece == j - 1 then
local idPartSurfFr = GetPartSurfFrInPlane( Part, vtDirectionZ)
local bIntersectSuccess = EgtSurfFrIntersect( idPartSurfFr, idCollisionSurfFr)
if not bIntersectSuccess then
error( 'CheckCollision : intersect fail')
end
bCollisionFoundPiece = EgtExistsObj( idPartSurfFr)
end
-- check collisione con grezzo restante, se con il pezzo non c'è collisione
local bCollisionFoundRestLength = false
if not bCollisionFoundPiece then
local idRestLengthSurfFr = GetRestlengthSurfFrInPlane( Part, vtDirectionZ)
local bIntersectSuccess = EgtSurfFrIntersect( idRestLengthSurfFr, idCollisionSurfFr)
if not bIntersectSuccess then
error( 'CheckCollision : intersect fail')
end
bCollisionFoundRestLength = EgtExistsObj( idRestLengthSurfFr)
end
-- se non trovata collisione si passa al punto successivo
if not ( bCollisionFoundPiece or bCollisionFoundRestLength) then
nCollisionCountPiece = 0
nCollisionCountRestlength = 0
break
-- altrimenti si aggiorna il numero di collisioni con pezzo e con grezzo restante
elseif bCollisionFoundPiece then
nCollisionCountPiece = nCollisionCountPiece + 1
elseif bCollisionFoundRestLength then
nCollisionCountRestlength = nCollisionCountRestlength + 1
end
end
-- collisione trovata
if nCollisionCountPiece == #CheckDirections then
return true, nil
-- nessuna collisione trovata con pezzo ma serve separazione
elseif nCollisionCountRestlength == #CheckDirections then
bMoveAfterSplit = true
end
end
-- se si arriva qui significa che non è stata trovata alcuna collisione con pezzo
return false, bMoveAfterSplit
end
-------------------------------------------------------------------------------------------------------------