- PreCollisionLib rivista per testare costruire trimesh da punti e usare funzione EgtTestSurfaceSurface per verificare collisione
This commit is contained in:
+51
-82
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user