diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 65a6e7b..c2a9d3c 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -579,6 +579,7 @@ end ------------------------------------------------------------------------------------------------------------- -- funzione per cercare utensile tipo LAMA con certe caratteristiche -- TODO da rivedere/completare +-- TODO per Engagement serviranno (opzionali) sBlockedAxis e vtAux function MachiningLib.FindBlade( Proc, ToolSearchParameters) local ToolInfo = {} diff --git a/LuaLibs/PreSimulationLib.lua b/LuaLibs/PreSimulationLib.lua index db1f448..247cac2 100644 --- a/LuaLibs/PreSimulationLib.lua +++ b/LuaLibs/PreSimulationLib.lua @@ -113,7 +113,7 @@ local function GetToolExitPoint( ptMachining, vtNEdge, vtHead, Tool, bIsDownUp) end ------------------------------------------------------------------------------------------------------------- --- calcolo pivot in riferimento globale, datipunto sull'uscita utensile e direzioni +-- calcolo pivot in riferimento globale, dati punto sull'uscita utensile e direzioni local function GetGlobalPivot( ptToolExit, vtC, vtHead, vtMovePivot) -- frame solidale all'utensile (lo stesso in cui vtMovePivot è definito) @@ -269,32 +269,68 @@ function PreSimulationLib.CheckOutOfStrokeFromGeometry( idGeometry, vtHead, nSCC end ------------------------------------------------------------------------------------------------------------- -local function CheckCollisionPoint( ptToolExitToCheck, vtC, vtHead, PreCollisionData, Part, bCannotSplitRestLength, sRestLengthSideForPreSimulation, bCheckOnlyRestlength) +local function MoveMachineAxesToPosition( ptOnToolTipCenter, vtHead, vtAux) - local ptPivot = GetGlobalPivot( ptToolExitToCheck, vtC, vtHead, PreCollisionData.vtMovePivot) + -- calcolo assi rotativi + local bOkAngles, nSolutionsAngles, RotativeAxesValues = EgtGetCalcAnglesEx( vtHead, vtAux) + local dRotative1 = RotativeAxesValues[1] + local dRotative2 = RotativeAxesValues[2] + local dRotative3 = RotativeAxesValues[3] - -- orientamento del riferimento locale - local vtDirectionX = PreCollisionData.Directions.vtDirectionX - local vtDirectionY = PreCollisionData.Directions.vtDirectionY - local vtDirectionZ = PreCollisionData.Directions.vtDirectionZ + if not bOkAngles then + error( ' MoveMachineAxesToPosition : error') + end - -- 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) + -- calcolo assi lineari + local bOkPositions, _, dLinear1, dLinear2, dLinear3 = EgtGetCalcPositions( ptOnToolTipCenter, dRotative1, dRotative2, dRotative3) + + if not bOkPositions then + + error( ' MoveMachineAxesToPosition : error') + end + + local AxesNames = EgtGetAllCurrAxesNames() + local dTHome = EgtGetAxisHomePos( AxesNames[1]) + + -- spostamento assi in posizione (la T non si sposta perchè si sposta il pezzo) + EgtSetAxisPos( AxesNames[2], dLinear2) + EgtSetAxisPos( AxesNames[3], dLinear3) + EgtSetAxisPos( AxesNames[4], dRotative1) + EgtSetAxisPos( AxesNames[5], dRotative2) + if dRotative3 then + EgtSetAxisPos( AxesNames[6], dRotative3) + end + + return dTHome - dLinear1, AxesNames +end + +------------------------------------------------------------------------------------------------------------- +local function CheckCollisionPoint( sAxis, ptOnToolTipCenter, vtHead, vtAux, Part, bCannotSplitRestLength, sRestLengthSideForPreSimulation, bCheckOnlyRestlength) + + -- spostamento assi macchina in posizione + local dDeltaXBeamOffset = MoveMachineAxesToPosition( ptOnToolTipCenter, vtHead, vtAux) + -- spostamento trave in posizione macchina (è da riportare in posizione originale prima di return) + EgtMove( Part.idRaw, Vector3d( dDeltaXBeamOffset, 0, 0), GDB_RT.GLOB) + + -- si recuperano gli id delle geometrie dell'asse con cui controllare la collisione + local idCollisionGroup = EgtGetFirstNameInGroup( EgtGetAxisId( sAxis), 'COLLISION') + local idCollisionGroupOther = EgtGetFirstNameInGroup( EgtGetAxisId( sAxis), 'OTHER_COLLISION') or GDB_ID.NULL + local CollisionGroupEntitiesId = EgtGetAllInGroup( idCollisionGroup) + local CollisionGroupOtherEntitiesId = EgtGetAllInGroup( idCollisionGroupOther) + -- si tengono solo gli elementi trimesh + local CollisionSurfTmId = {} + for i = 1, #CollisionGroupEntitiesId do + if EgtGetType( CollisionGroupEntitiesId[i]) == GDB_TY.SRF_MESH then + table.insert( CollisionSurfTmId, CollisionGroupEntitiesId[i]) + end + end + -- se presenti geometrie nel gruppo other si aggiungono anche quelle + if CollisionGroupOtherEntitiesId and #CollisionGroupOtherEntitiesId > 0 then + for i = 1, #CollisionGroupEntitiesId do + if EgtGetType( CollisionGroupEntitiesId[i]) == GDB_TY.SRF_MESH then + table.insert( CollisionSurfTmId, CollisionGroupEntitiesId[i]) + end + end end -- check collisione con pezzo @@ -306,16 +342,24 @@ local function CheckCollisionPoint( ptToolExitToCheck, vtC, vtHead, PreCollision local b3CheckCollision = BeamLib.GetPartBoxWithHeadTail( Part, sRestLengthSideForPreSimulation) idCheckCollisionTm = EgtSurfTmBBox( Part.idTempGroup, b3CheckCollision, false, GDB_RT.GLOB) end - bCollisionFoundPiece = EgtCDeSolidSolid( idCheckCollisionTm, idCollisionSurfTm, BeamData.COLL_SIC) - if not type( bCollisionFoundPiece) == "boolean" then - error( 'Presimulation fail') - end - if EgtGetDebugLevel() >= 3 and bCollisionFoundPiece then - EgtSetColor( idCollisionSurfTm, RED()) + for i = 1, #CollisionSurfTmId do + bCollisionFoundPiece = EgtCDeSolidSolid( idCheckCollisionTm, CollisionSurfTmId[i], BeamData.COLL_SIC) + if not type( bCollisionFoundPiece) == "boolean" then + error( 'Presimulation fail') + end + if EgtGetDebugLevel() >= 3 and bCollisionFoundPiece then + EgtSetColor( CollisionSurfTmId[i], RED()) + end + if bCollisionFoundPiece then + break + end end -- se trovata collisione con pezzo è inutile procedere con il grezzo if bCollisionFoundPiece then + -- si riporta la trave in posizione originale + EgtMove( Part.idRaw, Vector3d( -dDeltaXBeamOffset, 0, 0), GDB_RT.GLOB) + return true end end @@ -325,16 +369,21 @@ local function CheckCollisionPoint( ptToolExitToCheck, vtC, vtHead, PreCollision if not ( bCollisionFoundPiece or bCannotSplitRestLength) then local idRestLengthSurfFr = GetRestlengthSurfTm( Part, sRestLengthSideForPreSimulation) if idRestLengthSurfFr then - bCollisionFoundRestLength = EgtCDeSolidSolid( idRestLengthSurfFr, idCollisionSurfTm, BeamData.COLL_SIC) - if not type( bCollisionFoundRestLength) == "boolean" then - error( 'Presimulation fail') - end - if EgtGetDebugLevel() >= 3 and bCollisionFoundRestLength then - EgtSetColor( idCollisionSurfTm, ORANGE()) + for i = 1, #CollisionSurfTmId do + bCollisionFoundRestLength = EgtCDeSolidSolid( idRestLengthSurfFr, CollisionSurfTmId[i], BeamData.COLL_SIC) + if not type( bCollisionFoundRestLength) == "boolean" then + error( 'Presimulation fail') + end + if EgtGetDebugLevel() >= 3 and bCollisionFoundRestLength then + EgtSetColor( CollisionSurfTmId[i], ORANGE()) + end end end end + -- si riporta la trave in posizione originale + EgtMove( Part.idRaw, Vector3d( -dDeltaXBeamOffset, 0, 0), GDB_RT.GLOB) + return false, bCollisionFoundRestLength end @@ -355,43 +404,29 @@ local function CheckCollisionWithAxis( sAxis, MachiningParameters, OptionalParam local bCheckOnlyRestlength = OptionalParameters.bCheckOnlyRestlength or false local sRestLengthSideForPreSimulation = OptionalParameters.sRestLengthSideForPreSimulation or 'Tail' local bCannotSplitRestLength = OptionalParameters.bCannotSplitRestLength or false + local vtAux = OptionalParameters.vtAux -- se normale faccia non parallela a direzione testa c'è qualcosa che non va if not AreSameOrOppositeVectorApprox( vtNFace, vtHead) then error( 'CheckCollisionWithAxis : invalid directions') end - + -- punti notevoli della lavorazione in cui fare il check local PointsToCheck = OptionalParameters.PointsToCheck or GetCollisionPointsToCheck( Edge, dDepthToMachine) - -- punti in centro lama su naso mandrino o aggregato. In base a direzione e punto - local bIsDownUp = AreOppositeVectorApprox( vtNFace, vtHead) - local ToolExitPoints = {} + -- punti sul tip dell'utensile, in centro + local PointsOnToolTipCenter = {} for i = 1, #PointsToCheck do - ToolExitPoints[i] = GetToolExitPoint( PointsToCheck[i], Edge.vtN, vtHead, Tool, bIsDownUp) + PointsOnToolTipCenter[i] = PreSimulationLib.GetPointOnToolTipCenter( PointsToCheck[i], vtHead, vtNFace, Edge.vtN, Tool) end - -- vtC punta sempre verso il corpo dell'asse C o verso l'aggregato - local nSCC = Tool.SetupInfo.GetSCC( Edge.vtN, Edge.vtEdge, vtNFace) - local vtSCC = BeamLib.GetDirectionFromSCC( nSCC) - local vtC = vtHead ^ Tool.SetupInfo.vtRotationAxisC - vtC:normalize() - if vtC:isSmall() then - vtC = vtSCC - elseif vtC * vtSCC < GEO.EPS_SMALL then - vtC = -vtC - end - - -- punti curva collisione e direzioni check da macchina - local PreCollisionData = Tool.SetupInfo.GetPreCollisionData( sAxis, vtC, vtHead) - local bMoveAfterSplit = false -- 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 + for i = 1, #PointsOnToolTipCenter do - local bCollisionFoundPiece, bCollisionFoundRestLength = CheckCollisionPoint( ToolExitPoints[i], vtC, vtHead, PreCollisionData, Part, bCannotSplitRestLength, sRestLengthSideForPreSimulation, bCheckOnlyRestlength) + local bCollisionFoundPiece, bCollisionFoundRestLength = CheckCollisionPoint( sAxis, PointsOnToolTipCenter[i], vtHead, vtAux, Part, bCannotSplitRestLength, sRestLengthSideForPreSimulation, bCheckOnlyRestlength) -- se trovata collisione con pezzo è inutile controllare gli altri punti if bCollisionFoundPiece then @@ -415,6 +450,11 @@ function PreSimulationLib.CheckCollision( sBladeEngagement, Parameters, Optional local bCollisionFound local bMoveAfterSplitZ, bMoveAfterSplitC, bMoveAfterSplitAB + -- parametri obbligatori + local Edge = Parameters.Edge + local vtNFace = Parameters.vtNFace + local Tool = Parameters.Tool + -- parametri opzionali, in parte da far transitare OptionalParameters = OptionalParameters or {} @@ -423,7 +463,10 @@ function PreSimulationLib.CheckCollision( sBladeEngagement, Parameters, Optional OptionalParametersCheckCollisionWithAxis.PointsToCheck = OptionalParameters.PointsToCheck or nil OptionalParametersCheckCollisionWithAxis.sRestLengthSideForPreSimulation = OptionalParameters.sRestLengthSideForPreSimulation or 'Tail' OptionalParametersCheckCollisionWithAxis.bCannotSplitRestLength = OptionalParameters.bCannotSplitRestLength or false + OptionalParametersCheckCollisionWithAxis.sBlockedAxis = OptionalParameters.sBlockedAxis + OptionalParametersCheckCollisionWithAxis.vtAux = OptionalParameters.vtAux + local sBlockedAxis = OptionalParameters.sBlockedAxis local bIsDicing = OptionalParameters.bIsDicing or false local bCheckOnlyRestlengthForAxisABC = false @@ -455,18 +498,43 @@ function PreSimulationLib.CheckCollision( sBladeEngagement, Parameters, Optional end end - -- asse Z si controlla sempre - bCollisionFound, bMoveAfterSplitZ = CheckCollisionWithAxis( 'Z', Parameters, OptionalParametersCheckCollisionWithAxis) + -- SCC + local nSCC = Tool.SetupInfo.GetSCC( Edge.vtN, Edge.vtEdge, vtNFace) - -- assi AB e C: se richiesto si controlla la collisione solo col grezzo + -- si settano utensile, SCC e asse bloccato per il controllo collisione + local bOkTool = EgtSetCalcTool( Tool.sName, Tool.sHead, Tool.nExit) + if not bOkTool then + error( 'CheckCollisionWithAxis : cannot set calc tool') + end + EgtSetCalcSolCh( nSCC) + if sBlockedAxis and type( sBlockedAxis) == "string" then + local BlockedAxis = EgtSplitString( sBlockedAxis, '=') + EgtSetRotAxisBlock( BlockedAxis[1], tonumber( BlockedAxis[2])) + end + + -- nomi degli assi con cui controllare la collisione + local AxesNames = EgtGetAllCurrAxesNames() + local sL3 = AxesNames[3] + local sR3 = AxesNames[6] + local sR2 = AxesNames[5] + local sR1 = AxesNames[4] + + -- ultimo asse lineare prima dei rotativi (solitamente Z) si controlla sempre + bCollisionFound, bMoveAfterSplitZ = CheckCollisionWithAxis( sL3, Parameters, OptionalParametersCheckCollisionWithAxis) + + -- assi rotativi: se richiesto si controlla la collisione solo col grezzo OptionalParametersCheckCollisionWithAxis.bCheckOnlyRestlength = bCheckOnlyRestlengthForAxisABC - if not bCollisionFound then - bCollisionFound, bMoveAfterSplitAB = CheckCollisionWithAxis( 'AB', Parameters, OptionalParametersCheckCollisionWithAxis) + if sR3 and not bCollisionFound then + bCollisionFound, bMoveAfterSplitAB = CheckCollisionWithAxis( sR3, Parameters, OptionalParametersCheckCollisionWithAxis) end if not bCollisionFound then - bCollisionFound, bMoveAfterSplitC = CheckCollisionWithAxis( 'C', Parameters, OptionalParametersCheckCollisionWithAxis) + bCollisionFound, bMoveAfterSplitAB = CheckCollisionWithAxis( sR2, Parameters, OptionalParametersCheckCollisionWithAxis) + end + + if not bCollisionFound then + bCollisionFound, bMoveAfterSplitC = CheckCollisionWithAxis( sR1, Parameters, OptionalParametersCheckCollisionWithAxis) end local bMoveAfterSplit = bMoveAfterSplitZ or bMoveAfterSplitC or bMoveAfterSplitAB