- in PreSimulationLib ora prima di testare per collisioni si verifica il massimo materiale con l'elevazione reale del lato (rispetto al pezzo). Risolve collisioni non intercettate con flangia

This commit is contained in:
luca.mazzoleni
2026-01-19 18:38:32 +01:00
parent fc7432a97a
commit 518ad5e10a
+28 -5
View File
@@ -413,18 +413,41 @@ function PreSimulationLib.CheckCollision( sBladeEngagement, Parameters, Optional
-- parametri opzionali, in parte da far transitare
OptionalParameters = OptionalParameters or {}
local OptionalParametersCheckCollisionWithAxis = {}
OptionalParametersCheckCollisionWithAxis.bCheckOnlyRestlength = false
OptionalParametersCheckCollisionWithAxis.PointsToCheck = OptionalParameters.PointsToCheck or nil
local bIsDicing = OptionalParameters.bIsDicing or false
local bCheckOnlyRestlengthForAxisABC = false
-- se cubetti in modalità standard (no DownUp) gli assi AB e C si controllano solo con grezzo (ci sarebbe collisione con il materiale già rimosso controllando AB e C con pezzo)
if bIsDicing and ( sBladeEngagement == 'Standard') then
bCheckOnlyRestlengthForAxisABC = true
-- se l'elevazione reale (rispetto al pezzo) è maggiore del massimo materiale è sempre collisione
else
local Edge = Parameters.Edge
local vtNFace = Parameters.vtNFace
local dDepthToMachine = Parameters.dDepthToMachine
-- trimesh rettangolare con un lato corrispondente al lato da lavorare e larghezza come spessore utensile
local idTrimesh = EgtSurfTmRectangle( Parameters.Part.idTempGroup, Edge.ptStart, Edge.ptEnd, Edge.ptEnd + vtNFace * Parameters.Tool.dThickness, GDB_RT.GLOB)
local vtNTrimesh = EgtSurfTmFacetNormVersor( idTrimesh, 0, GDB_ID.ROOT)
-- se trimesh con normale opposta a quella del lato, si inverte (non si sa a priori che verso avrà)
if not AreSameVectorApprox( Edge.vtN, vtNTrimesh) then
EgtInvertSurf( idTrimesh)
end
local dRealElevation = EgtSurfTmFacetElevationInBBox( idTrimesh, 0, Parameters.Part.b3Part, true, GDB_ID.ROOT)
local dRealDepthToMachine = ( dRealElevation - Parameters.Edge.dElevation + Parameters.dDepthToMachine)
if dRealDepthToMachine > Parameters.Tool.dMaxDepth + 10 * GEO.EPS_SMALL then
return true
end
end
-- asse Z si controlla sempre
bCollisionFound, bMoveAfterSplitZ = CheckCollisionWithAxis( 'Z', Parameters, OptionalParametersCheckCollisionWithAxis)
-- se cubetti in modalità standard (no DownUp), gli assi AB e C si controllano solo con grezzo (ci sarebbe collisione con il materiale già rimosso controllando AB e C con pezzo)
if sBladeEngagement == 'Standard' then
OptionalParametersCheckCollisionWithAxis.bCheckOnlyRestlength = OptionalParameters.bIsDicing or false
end
-- assi AB e C: se richiesto si controlla la collisione solo col grezzo
OptionalParametersCheckCollisionWithAxis.bCheckOnlyRestlength = bCheckOnlyRestlengthForAxisABC
if not bCollisionFound then
bCollisionFound, bMoveAfterSplitAB = CheckCollisionWithAxis( 'AB', Parameters, OptionalParametersCheckCollisionWithAxis)