From d5b4edea14c2da5f74a50a7c604ae0ee63577db7 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Mon, 1 Dec 2025 12:44:23 +0100 Subject: [PATCH] - PreCollisionLib rivista per testare costruire trimesh da punti e usare funzione EgtTestSurfaceSurface per verificare collisione --- LuaLibs/PreCollisionLib.lua | 133 ++++++++++++++---------------------- 1 file changed, 51 insertions(+), 82 deletions(-) diff --git a/LuaLibs/PreCollisionLib.lua b/LuaLibs/PreCollisionLib.lua index 3801ae5..ea17ac8 100644 --- a/LuaLibs/PreCollisionLib.lua +++ b/LuaLibs/PreCollisionLib.lua @@ -7,6 +7,7 @@ local PreCollisionLib = {} -- Include require( 'EgtBase') local BeamLib = require( 'BeamLib') +local BeamData = require( 'BeamData') -- Carico i dati globali @@ -15,24 +16,8 @@ EgtOutLog( ' PreCollisionLib started', 1) ------------------------------------------------------------------------------------------------------------- --- costruzione flat region del pezzo nel piano scelto -local function GetPartSurfFrInPlane( Part, vtDirection) - - -- si estrae prima la silhouette nel piano - local idFirstCurve, nCurveCount = EgtGetSurfTmSilhouette( Part.idBoxTm, vtDirection, 10 * GEO.EPS_SMALL, Part.idTempGroup, GDB_RT.GLOB) - -- se più curve c'è qualcosa che non va: errore - if nCurveCount > 1 then - error( 'GetPartSurfFrInPlane : error in part box') - end - -- creazione flat region dalla silhouette - local idPartSurfFr = EgtSurfFlatRegion( Part.idTempGroup, idFirstCurve) - - return idPartSurfFr -end - -------------------------------------------------------------------------------------------------------------- --- costruzione flat region del grezzo restante nel piano scelto (con leggera sovrapposizione) -local function GetRestlengthSurfFrInPlane( Part, vtDirection) +-- costruzione trimesh del grezzo restante (con leggera sovrapposizione) +local function GetRestlengthSurfTm( Part) -- si costruisce il box in globale local ptRestLengthMax = Point3d( Part.b3Part:getMin()) + X_AX() * 500 * GEO.EPS_SMALL @@ -40,16 +25,8 @@ local function GetRestlengthSurfFrInPlane( Part, vtDirection) local b3RestLength = BBox3d( ptRestLengthMin, ptRestLengthMax) -- si crea la trimesh dal box local idRestLengthBoxTm = EgtSurfTmBBox( Part.idTempGroup, b3RestLength , false, GDB_RT.GLOB) - -- si estrae la silhouette nel piano - local idFirstCurve, nCurveCount = EgtGetSurfTmSilhouette( idRestLengthBoxTm, vtDirection, 10 * GEO.EPS_SMALL, Part.idTempGroup, GDB_RT.GLOB) - -- se più curve c'è qualcosa che non va: errore - if nCurveCount > 1 then - error( 'Error in part box') - end - -- creazione flat region dalla silhouette - local idRestlengthSurfFr = EgtSurfFlatRegion( Part.idTempGroup, idFirstCurve) - return idRestlengthSurfFr + return idRestLengthBoxTm end ------------------------------------------------------------------------------------------------------------- @@ -147,74 +124,66 @@ function PreCollisionLib.CheckCollisionWithAxis( sAxis, Edge, vtNFace, vtHead, P -- 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 - local nCollisionCountPiece = 0 - local nCollisionCountRestlength = 0 + local ptPivot = GetGlobalPivot( ToolExitPoints[i], vtToolSCC, vtHead, PreCollisionData.vtMovePivot) - for j = 1, #PreCollisionData do + -- orientamento del riferimento locale + local vtDirectionX = PreCollisionData.Directions.vtDirectionX + local vtDirectionY = PreCollisionData.Directions.vtDirectionY + local vtDirectionZ = PreCollisionData.Directions.vtDirectionZ + + -- costruzione trimesh a partire dalla curva di collisione + -- recupero punti da macchina per costruire trimesh + local CollisionCurvePoints = PreCollisionData.Points + -- curva di collisione in riferimento locale + local idCollisionCurve = EgtCurveCompoFromPoints( Part.idTempGroup, CollisionCurvePoints) + -- curva in riferimento globale + local frReference = Frame3d( ptPivot, vtDirectionZ, vtDirectionX) + EgtTransform( idCollisionCurve, frReference, GDB_RT.GLOB) + -- trimesh di collisione + local idCollisionSurfTm + if PreCollisionData.bSurfTmByRevolve then + idCollisionSurfTm = EgtSurfTmByRevolve( Part.idTempGroup, idCollisionCurve, ptPivot, vtDirectionY, true, 0.05, GDB_RT.GLOB) + else + local vtPreMove = -vtDirectionZ * ( PreCollisionData.dExtrusionDepth / 2) + EgtMove( idCollisionCurve, vtPreMove, GDB_RT.GLOB) + local vtExtrusion = vtDirectionZ * PreCollisionData.dExtrusionDepth + idCollisionSurfTm = EgtSurfTmByRegionExtrusion( Part.idTempGroup, idCollisionCurve, vtExtrusion, 0.05, GDB_RT.GLOB) + end - -- pivot in globale - local ptPivot = GetGlobalPivot( ToolExitPoints[i], vtToolSCC, vtHead, PreCollisionData[j].vtMovePivot) + -- check collisione con pezzo + local bCollisionFoundPiece = false - -- orientamento del riferimento locale - local vtDirectionX = PreCollisionData[j].Directions.vtDirectionX - local vtDirectionZ = PreCollisionData[j].Directions.vtDirectionZ - - -- costruzione flat region della curva di collisione nel piano scelto - -- recupero punti da macchina per costruire flat region - local CollisionCurvePoints = PreCollisionData[j].Points - -- curva di collisione in riferimento locale - local idCollisionCurve = EgtCurveCompoFromPoints( Part.idTempGroup, CollisionCurvePoints) - -- 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) + bCollisionFoundPiece = EgtTestSurfaceSurface( Part.idBoxTm, idCollisionSurfTm, BeamData.COLL_SIC) + if not type( bCollisionFoundPiece) == "boolean" then + error( 'EgtTestSurfaceSurface fail') + end - -- 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 per la collisione con grezzo per restituire bMoveAfterSplit - local bCollisionFoundPiece = false - if nCollisionCountPiece == j - 1 then - local idPartSurfFr = GetPartSurfFrInPlane( Part, vtDirectionZ) + if EgtGetDebugLevel() >= 3 and bCollisionFoundPiece then + EgtSetColor( idCollisionSurfTm, RED()) + end - bCollisionFoundPiece = not EgtSurfFrTestExternal( idPartSurfFr, idCollisionSurfFr) + -- check collisione con grezzo restante, se con il pezzo non c'è collisione + local bCollisionFoundRestLength = false + if not bCollisionFoundPiece then + local idRestLengthSurfFr = GetRestlengthSurfTm( Part, vtDirectionZ) - if EgtGetDebugLevel() >= 3 and bCollisionFoundPiece then - EgtSetColor( idCollisionSurfFr, RED()) - end + bCollisionFoundRestLength = EgtTestSurfaceSurface( idRestLengthSurfFr, idCollisionSurfTm, BeamData.COLL_SIC) + if not type( bCollisionFoundRestLength) == "boolean" then + error( 'EgtTestSurfaceSurface fail') 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) - - bCollisionFoundRestLength = not EgtSurfFrTestExternal( idRestLengthSurfFr, idCollisionSurfFr) - - if EgtGetDebugLevel() >= 3 and bCollisionFoundRestLength then - EgtSetColor( idCollisionSurfFr, ORANGE()) - end + if EgtGetDebugLevel() >= 3 and bCollisionFoundRestLength then + EgtSetColor( idCollisionSurfTm, ORANGE()) 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 + if bCollisionFoundRestLength then + bMoveAfterSplit = true end end - -- collisione trovata - if nCollisionCountPiece == #PreCollisionData then - return true, nil - -- nessuna collisione trovata con pezzo ma serve separazione - elseif nCollisionCountRestlength == #PreCollisionData then - bMoveAfterSplit = true + -- se trovata collisione con pezzo si esce subito + if bCollisionFoundPiece then + return true end end