- update versione minima Cam5
- in BeamExec corretto il calcolo di nCycles: ora il calcolo dell'inversione si fa solo se richiesto - in BeamExec rimossa cancellazione entità temporanee: si mette tutto nel gruppo idTemp; adeguate le funzioni che creano geometrie temporanee - in MachiningLib Check2DBladeCollision migliorata e ultimata: da testare
This commit is contained in:
+32
-20
@@ -284,28 +284,44 @@ local function IsFaceZOutOfRange ( vtNFace, Tool)
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
local function Check2DBladeCollision( Edge, vtHead, Part, Tool, dDepthToMachine)
|
||||
-- nel piano perpendicolare alla direzione di taglio, se c'è intersezione tra motore e trave c'è collisione
|
||||
local function Check2DBladeCollision( Edge, vtNFace, vtHead, Part, Tool, dDepthToMachine)
|
||||
local idTempGroup = BeamLib.GetTempGroup()
|
||||
|
||||
-- nel piano perpendicolare alla direzione di taglio, se c'è intersezione tra motore e trave c'è collisione
|
||||
|
||||
-- riferimento perpendicolare al taglio, X nel verso della normale al lato e Y verso il motore
|
||||
local ptMid = Point3d( ( Edge.ptStart + Edge.ptEnd) / 2)
|
||||
local ptMachining = Point3d( ( Edge.ptStart + Edge.ptEnd) / 2) + Edge.vtN * ( Edge.dElevation - dDepthToMachine)
|
||||
local vtEdge = Edge.ptEnd - Edge.ptStart
|
||||
vtEdge:normalize()
|
||||
local frBlade = Frame3d( ptMid, vtEdge, Edge.vtN)
|
||||
|
||||
-- silhouette del pezzo nel riferimento
|
||||
local idFirstCurve, nCurveCount = EgtGetSurfTmSilhouette( Part.idBoxTm, vtEdge, 10 * GEO.EPS_SMALL, idTempGroup)
|
||||
-- costruzione flat region del pezzo nel piano perpendicolare al taglio
|
||||
-- si estrae prima la silhouette nel piano
|
||||
local idFirstCurve, nCurveCount = EgtGetSurfTmSilhouette( Part.idBoxTm, vtEdge, 10 * GEO.EPS_SMALL, idTempGroup, GDB_RT.GLOB)
|
||||
-- se più curve c'è qualcosa che non va: errore
|
||||
if nCurveCount > 1 then
|
||||
error( 'Check2DBladeCollision : error in part box')
|
||||
end
|
||||
|
||||
-- flat region del pezzo nel riferimento
|
||||
-- creazione flat region dalla silhouette
|
||||
local idPartSurfFr = EgtSurfFlatRegion( idTempGroup, idFirstCurve)
|
||||
|
||||
-- flat region del motore nel riferimento
|
||||
-- costruzione flat region approssimata del motore nel piano perpendicolare al taglio
|
||||
-- punto di congiunzione tra motore e lama
|
||||
local ptMaxElev = ptMachining + Edge.vtN * Tool.dMaxMaterial
|
||||
-- se taglio standard (no DownUp) il punto va spostato dello spessore lama
|
||||
if AreSameVectorApprox( vtNFace, vtHead) then
|
||||
ptMaxElev = ptMaxElev + vtNFace * Tool.dThickness
|
||||
end
|
||||
-- TODO qui sostituire con il valore reale letto dal SetupInfo
|
||||
local dHeadDepth = 480
|
||||
local dHeadWidth = 480
|
||||
local ptOpposite = ptMaxElev + Edge.vtN * dHeadWidth
|
||||
local ptCross = ptOpposite + vtHead * dHeadDepth
|
||||
local idHeadRectangle = EgtRectangle3P( idTempGroup, ptMaxElev, ptCross, ptOpposite, GDB_RT.GLOB)
|
||||
-- flat region dal rettangolo
|
||||
local idHeadSurfFr = EgtSurfFlatRegion( idTempGroup, idHeadRectangle)
|
||||
|
||||
-- intersezione
|
||||
--local idTestSurfFr = EgtCopyGlob( idPartSurfFr, idTempGroup)
|
||||
local bCollisionFound = EgtSurfFrIntersect( idPartSurfFr, idHeadSurfFr)
|
||||
|
||||
return false
|
||||
end
|
||||
@@ -321,7 +337,7 @@ function MachiningLib.GetBladeEngagement( Face, Edge, Part, Tool, dDepthToMachin
|
||||
if not IsFaceZOutOfRange( Face.vtN, Tool) then
|
||||
|
||||
-- TODO verifica collisione carro Z, collisione traversa PF, collisione 'C' Fast... La riduzione percorso cambia questo test?
|
||||
if bAvoidCollisionCheckForStandardCut or not Check2DBladeCollision( Edge, Face.vtN, Part, Tool, dDepthToMachine) then
|
||||
if bAvoidCollisionCheckForStandardCut or not Check2DBladeCollision( Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) then
|
||||
|
||||
return true, sBladeEngagement
|
||||
end
|
||||
@@ -345,7 +361,7 @@ function MachiningLib.GetBladeEngagement( Face, Edge, Part, Tool, dDepthToMachin
|
||||
end
|
||||
|
||||
-- orientamento faccia / utensile compatibili con DownUp: lavorabile
|
||||
if not Check2DBladeCollision( Edge, -Face.vtN, Part, Tool, dDepthToMachine) then
|
||||
if not Check2DBladeCollision( Edge, Face.vtN, -Face.vtN, Part, Tool, dDepthToMachine) then
|
||||
|
||||
sBladeEngagement = 'DownUp'
|
||||
|
||||
@@ -1387,9 +1403,9 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining, Part)
|
||||
local ProcTm = FeatureLib.GetProcFromTrimesh( Machining.Geometry[1][1], Part)
|
||||
local dDepthToMachine = min( ProcTm.Faces[Machining.Geometry[1][2] + 1].dElevation, ( Machining.dMaxElev or ProcTm.Faces[Machining.Geometry[1][2] + 1].dElevation)) - ( max( 0, Machining.dResidualDepth or 0))
|
||||
local nSteps = max( ceil( ( dDepthToMachine - 50 * GEO.EPS_SMALL) / TOOLS[Machining.nToolIndex].dStep), 1)
|
||||
local nAddGroupId = BeamLib.GetAddGroup( Part.id)
|
||||
local idTempGroup = BeamLib.GetTempGroup()
|
||||
-- TODO in futuro creare flatregion (se ci fossero isole il calcolo del percorso non sarebbe corretto)
|
||||
local idFaceContour = EgtExtractSurfTmFacetLoops( ProcTm.id, Machining.Geometry[1][2], nAddGroupId)
|
||||
local idFaceContour = EgtExtractSurfTmFacetLoops( ProcTm.id, Machining.Geometry[1][2], idTempGroup)
|
||||
-- si settano i lati aperti della curva derivata dalla superficie
|
||||
for i = 1, #ProcTm.Faces[Machining.Geometry[1][2] + 1].Edges do
|
||||
if ProcTm.Faces[Machining.Geometry[1][2] + 1].Edges[i].bIsOpen then
|
||||
@@ -1397,7 +1413,7 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining, Part)
|
||||
end
|
||||
end
|
||||
-- dal momento che la funzione EgtPocketing non considera il grezzo, nei casi ottimizzati si deve correggere l'offset
|
||||
local idTestCurve = EgtCopyGlob( idFaceContour, nAddGroupId )
|
||||
local idTestCurve = EgtCopyGlob( idFaceContour, idTempGroup )
|
||||
local bIsOptimizedPocketing = ( TOOLS[Machining.nToolIndex].dDiameter > TOOLS[Machining.nToolIndex].dSideStep - 10 * GEO.EPS_SMALL)
|
||||
and EgtOffsetCurve( idTestCurve, -TOOLS[Machining.nToolIndex].dDiameter / 2 - 10 * GEO.EPS_SMALL)
|
||||
if not bIsOptimizedPocketing then
|
||||
@@ -1413,7 +1429,7 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining, Part)
|
||||
end
|
||||
end
|
||||
-- calcolo percorso di svuotatura replicando il calcolo che fa la svuotatura
|
||||
local idPocketingPath = EgtPocketing( idFaceContour, TOOLS[Machining.nToolIndex].dDiameter / 2, TOOLS[Machining.nToolIndex].dSideStep, 0, Machining.nSubType, true, nAddGroupId)
|
||||
local idPocketingPath = EgtPocketing( idFaceContour, TOOLS[Machining.nToolIndex].dDiameter / 2, TOOLS[Machining.nToolIndex].dSideStep, 0, Machining.nSubType, true, idTempGroup)
|
||||
local dPocketingPathLength = EgtCurveLength( idPocketingPath)
|
||||
-- calcolo lunghezze e tempi totali
|
||||
if dPocketingPathLength then
|
||||
@@ -1425,10 +1441,6 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining, Part)
|
||||
dLengthToMachineAllStepsWithLeadInOut = 99999 * nSteps
|
||||
dTimeToMachineTotal = dLengthToMachineAllStepsWithLeadInOut / dToolFeed
|
||||
end
|
||||
-- le geometrie create si settano da cancellare
|
||||
EgtSetLevel( idFaceContour, GDB_LV.TEMP)
|
||||
EgtSetLevel( idPocketingPath, GDB_LV.TEMP)
|
||||
EgtSetLevel( idTestCurve, GDB_LV.TEMP)
|
||||
else
|
||||
error( 'GetTimeToMachineAllStepsWithLeadInOut : unknown machining type')
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user