diff --git a/LuaLibs/PreSimulationLib.lua b/LuaLibs/PreSimulationLib.lua index 66384e9..3fbf89b 100644 --- a/LuaLibs/PreSimulationLib.lua +++ b/LuaLibs/PreSimulationLib.lua @@ -150,7 +150,7 @@ local function GetCollisionPointsToCheck( Edge, dDepthToMachine) end ------------------------------------------------------------------------------------------------------------- -local function CheckOutOfStrokePoint( ptOnToolTipCenter, vtHead, nSCC, Tool) +local function CheckOutOfStrokePoint( ptOnToolTipCenter, vtHead, nSCC, Tool, vtAux, sBlockedAxis) -- impostazione utensile EgtSetCalcTool( Tool.sName, Tool.sHead, Tool.nExit) @@ -161,6 +161,12 @@ local function CheckOutOfStrokePoint( ptOnToolTipCenter, vtHead, nSCC, Tool) -- assi macchina da calcolare local LinearAxes, RotativeAxes = GetMachineAxes() + -- se presente, settaggio asse bloccato + if sBlockedAxis and type( sBlockedAxis) == "string" then + local BlockedAxis = EgtSplitString( sBlockedAxis, '=') + EgtSetRotAxisBlock( BlockedAxis[1], BlockedAxis[2]) + end + -- se più di 3 assi lineari e 2 assi rotativi, macchina non supportata if #LinearAxes > 3 or #RotativeAxes > 2 then @@ -168,7 +174,7 @@ local function CheckOutOfStrokePoint( ptOnToolTipCenter, vtHead, nSCC, Tool) end -- calcolo assi rotativi - local bOkAngles, nSolutionsAngles, dRot1, dRot2 = EgtGetCalcAngles( vtHead) + local bOkAngles, nSolutionsAngles, dRot1, dRot2 = EgtGetCalcAngles( vtHead, vtAux) RotativeAxes[1].dValue = dRot1 RotativeAxes[2].dValue = dRot2 @@ -230,11 +236,11 @@ end ------------------------------------------------------------------------------------------------------------- -- check extracorsa da punti sul tip dell'utensile -function PreSimulationLib.CheckOutOfStrokeFromPoints( PointsOnToolTipCenter, vtHead, nSCC, Tool) +function PreSimulationLib.CheckOutOfStrokeFromPoints( PointsOnToolTipCenter, vtHead, nSCC, Tool, vtAux, sBlockedAxis) for i = 1, #PointsOnToolTipCenter do - local bOutOfStroke = CheckOutOfStrokePoint( PointsOnToolTipCenter[i], vtHead, nSCC, Tool) + local bOutOfStroke = CheckOutOfStrokePoint( PointsOnToolTipCenter[i], vtHead, nSCC, Tool, vtAux, sBlockedAxis) -- se trovato extracorsa inutile procedere con gli altri punti if bOutOfStroke then @@ -249,7 +255,7 @@ end ------------------------------------------------------------------------------------------------------------- -- check extracorsa da geometria -- TODO da considerare anche gli attacchi -function PreSimulationLib.CheckOutOfStrokeFromGeometry( idGeometry, vtHead, nSCC, Tool) +function PreSimulationLib.CheckOutOfStrokeFromGeometry( idGeometry, vtHead, nSCC, Tool, vtAux, sBlockedAxis) local b3GeomMaxOffset = EgtGetBBoxGlob( idGeometry, GDB_BB.STANDARD) local ptBoxCenter = b3GeomMaxOffset:getCenter() @@ -272,7 +278,7 @@ function PreSimulationLib.CheckOutOfStrokeFromGeometry( idGeometry, vtHead, nSCC -- Z- table.insert( PointsOnToolTipCenter, Point3d( ptBoxCenter - dBoxDimZ / 2 * Z_AX())) - local bOutOfStroke = PreSimulationLib.CheckOutOfStrokeFromPoints( PointsOnToolTipCenter, vtHead, nSCC, Tool) + local bOutOfStroke = PreSimulationLib.CheckOutOfStrokeFromPoints( PointsOnToolTipCenter, vtHead, nSCC, Tool, vtAux, sBlockedAxis) return bOutOfStroke end diff --git a/Strategies/Standard/STR0004/STR0004.lua b/Strategies/Standard/STR0004/STR0004.lua index 2f08ece..fd705a5 100644 --- a/Strategies/Standard/STR0004/STR0004.lua +++ b/Strategies/Standard/STR0004/STR0004.lua @@ -185,13 +185,17 @@ function STR0004.Make( bAddMachining, Proc, Part, CustomParameters) and #Proc.MainFaces.SideFaces == 1 then OptionalParameters.OppositeToolDirectionMode = 'Enabled' + local dLengthAlreadyMachined = 0 + if Chainsaw.Result.Bottom[1].bIsApplicable then + dLengthAlreadyMachined = Chainsaw.Result.Bottom[1].dDepthToMachine + end if BottomEdge.bIsStartOpen then Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge1, OptionalParameters) - Mortising.dAreaToMachine = Mortising.dDepthToMachine * ( Mortising.dEdgeLength - Chainsaw.Result.Bottom[1].dDepthToMachine) + Mortising.dAreaToMachine = Mortising.dDepthToMachine * ( Mortising.dEdgeLength - dLengthAlreadyMachined) elseif BottomEdge.bIsEndOpen then Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, SideEdge2, OptionalParameters) - Mortising.dAreaToMachine = Mortising.dDepthToMachine * ( Mortising.dEdgeLength - Chainsaw.Result.Bottom[1].dDepthToMachine) + Mortising.dAreaToMachine = Mortising.dDepthToMachine * ( Mortising.dEdgeLength - dLengthAlreadyMachined) end Chainsaw.AddResult( Mortising) @@ -248,10 +252,21 @@ function STR0004.Make( bAddMachining, Proc, Part, CustomParameters) Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, OppositeEdge1, OptionalParameters) Chainsaw.AddResult( Mortising) + -- se dal lato OppositeEdge1 non è applicabile (solitamente per finecorsa) si prova dal lato opposto + if not Chainsaw.Result.Opposite[1].bIsApplicable then + OptionalParameters.dDepthToMachine = OppositeEdge2.dElevation + BeamData.CUT_EXTRA + Mortising = FaceByChainsaw.Make( Proc, Part, LongFace, OppositeEdge2, OptionalParameters) + Chainsaw.AddResult( Mortising) + end + -- se lavorando solo da un lato rimane materiale residuo, si lavora da entrambi - if Chainsaw.Result.Opposite[1].dResidualDepth > 10 * GEO.EPS_SMALL then + if Chainsaw.Result.Opposite[1].dResidualDepth > 10 * GEO.EPS_SMALL + or ( Chainsaw.Result.Opposite[2] and Chainsaw.Result.Opposite[2].dResidualDepth > 10 * GEO.EPS_SMALL) then Chainsaw.Result.Opposite[1].bIsApplicable = false + if Chainsaw.Result.Opposite[2] then + Chainsaw.Result.Opposite[2].bIsApplicable = false + end OptionalParameters.dDepthToMachine = OppositeEdge1.dElevation / 2 + BeamData.CUT_EXTRA_MIN diff --git a/StrategyLibs/FACEBYCHAINSAW.lua b/StrategyLibs/FACEBYCHAINSAW.lua index 9bde1d1..0452fe2 100644 --- a/StrategyLibs/FACEBYCHAINSAW.lua +++ b/StrategyLibs/FACEBYCHAINSAW.lua @@ -6,6 +6,7 @@ local BeamLib = require( 'BeamLib') local BeamData = require( 'BeamDataNew') local MachiningLib = require( 'MachiningLib') +local PreSimulationLib = require( 'PreSimulationLib') -- Tabella per definizione modulo local FACEBYCHAINSAW = {} @@ -42,6 +43,10 @@ local function CalculateLeadInOut( Machining, EdgeToMachine, sSideToMachine, dLe LeadOut.dEndAddLength = BeamData.CUT_EXTRA end + -- punti dell'attacco + LeadIn.ptPoint = EdgeToMachine.ptStart - EdgeToMachine.vtEdge * LeadIn.dStartAddLength + EdgeToMachine.vtN * ( EdgeToMachine.dElevation - Machining.dDepthToMachine) + LeadOut.ptPoint = EdgeToMachine.ptEnd + EdgeToMachine.vtEdge * LeadOut.dEndAddLength + EdgeToMachine.vtN * ( EdgeToMachine.dElevation - Machining.dDepthToMachine) + return LeadIn, LeadOut end @@ -199,6 +204,21 @@ function FACEBYCHAINSAW.Make( Proc, Part, FaceToMachine, EdgeToMachine, Optional end -- approccio e retrazione Mortising.LeadIn, Mortising.LeadOut = CalculateLeadInOut( Mortising, EdgeToMachine, sSideToMachine, dLengthToMachine) + -- check finecorsa nei punti di attacco + local PointsOnToolTipCenter = { + Mortising.LeadIn.ptPoint, + Mortising.LeadOut.ptPoint + } + local vtAux = FaceToMachine.vtN + if Mortising.bToolInvert then + vtAux = -FaceToMachine.vtN + end + local bOutOfStroke = PreSimulationLib.CheckOutOfStrokeFromPoints( PointsOnToolTipCenter, Mortising.vtToolDirection, Mortising.nSCC, TOOLS[Mortising.nToolIndex], vtAux, Mortising.sBlockedAxis) + if bOutOfStroke then + Mortising.sMessage = 'Out of stroke' + Mortising.bIsApplicable = false + return Mortising + end -- eventuale step verticale Mortising.CloneStepsLongitudinal = {} if not dLongitudinalStepSpan then