diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 8880959..65ef556 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -318,12 +318,12 @@ local function TestEngagement( sBladeEngagement, Parameters, OptionalParameters) dDepthToMachine = dDepthToMachine } + -- check punti lavorazione -- lavorazione oltre le corse: non fattibile local bOutOfStroke = PreSimulationLib.CheckOutOfStroke() if bOutOfStroke then return false end - -- lavorazione in collisione con il pezzo: non fattibile local bCollisionFound, bMoveAfterSplit = PreSimulationLib.CheckCollision( sBladeEngagement, CheckCollisionParameters, OptionalParameters) if bCollisionFound then @@ -333,43 +333,59 @@ local function TestEngagement( sBladeEngagement, Parameters, OptionalParameters) -- calcolo e check attacchi local LeadInOut = {} - local bNeedTangentLeadInOut = false - LeadInOut.Perpendicular = PreSimulationLib.CalculateLeadInOut + -- attacco perpendicolare + local PerpendicularLeadInOut = PreSimulationLib.CalculateLeadInOut() local bOutOfStrokePerpendicular = PreSimulationLib.CheckOutOfStroke() -- TODO passare punti custom attacco perpendicolare - - -- attacco perpendicolare oltre le corse: si prova attacco tangenziale - if bOutOfStrokePerpendicular then - - local bOutOfStrokeTangent = PreSimulationLib.CheckOutOfStroke() -- TODO passare punti custom attacco tangenziale - - -- entrambi gli attacchi oltre le corse: lavorazione non fattibile - if bOutOfStrokeTangent then - + -- se non è in finecorsa si aggiunge come attacco possibile + if not bOutOfStrokePerpendicular then + LeadInOut.Perpendicular = PerpendicularLeadInOut + LeadInOut.Perpendicular.bMoveAfterSplit = bMoveAfterSplit + end + -- se c'è almeno un lato chiuso l'unico attacco possibile è il perpendicolare + if not ( Edge.bIsStartOpen and Edge.bIsEndOpen) then + if bOutOfStrokePerpendicular then return false - - -- check collisione attacco tangenziale else - local bCollisionFoundTangent, bMoveAfterSplitTangent = PreSimulationLib.CheckCollision( sBladeEngagement, CheckCollisionParameters, OptionalParameters) -- TODO passare punti custom attacco tangenziale - - -- attacco perpendicolare oltre le corse e attacco tangenziale in collisione: lavorazione non fattibile - if bCollisionFoundTangent then - - return false - - -- obbligatorio attacco tangenziale - else - bMoveAfterSplit = bMoveAfterSplit or bMoveAfterSplitTangent - bNeedTangentLeadInOut = true - end + LeadInOut.sChosen = 'Perpendicular' + return true, bMoveAfterSplit, LeadInOut end end - -- arrivati qui la lavorazione è fattibile: si restituisce se è necessario farla dopo separazione e se serve attacco tangenziale - return true, bMoveAfterSplit, bNeedTangentLeadInOut + -- attacco tangenziale + local TangentLeadInOut = PreSimulationLib.CalculateLeadInOut() + local bOutOfStrokeTangent = PreSimulationLib.CheckOutOfStroke() -- TODO passare punti custom attacco tangenziale + -- attacco tangenziale non in finecorsa: si verifica se è in collisione + if not bOutOfStrokeTangent then + local bCollisionFoundTangent, bMoveAfterSplitTangent = PreSimulationLib.CheckCollision( sBladeEngagement, CheckCollisionParameters, OptionalParameters) -- TODO passare punti custom attacco tangenziale + -- attacco tangenziale possibile + if not bCollisionFoundTangent then + LeadInOut.Tangent = TangentLeadInOut + LeadInOut.Tangent.bMoveAfterSplit = bMoveAfterSplitTangent + end + end + + -- se disponibili più attacchi si sceglie il più corto, altrimenti quello possibile + if LeadInOut.Perpendicular and LeadInOut.Tangent then + if LeadInOut.Perpendicular.dTotalLength > LeadInOut.Tangent.dTotalLength + 10 then + LeadInOut.sChosen = 'Tangent' + else + LeadInOut.sChosen = 'Perpendicular' + end + elseif LeadInOut.Perpendicular and not LeadInOut.Tangent then + LeadInOut.sChosen = 'Perpendicular' + elseif LeadInOut.Tangent and not LeadInOut.Perpendicular then + LeadInOut.sChosen = 'Tangent' + -- nessun attacco possibile + -- TODO qui invece di uscire si dovranno provare i due attacchi SpecialTangent e SpecialTangentInverted + else + return false + end + + return true, bMoveAfterSplit, LeadInOut end ------------------------------------------------------------------------------------------------------------- --- ritorna se la faccia e il lato sono lavorabili e, se sì, il modo di lavorare (standard/DownUp) e se è necessario un attacco tangenziale +-- ritorna se la faccia e il lato sono lavorabili e, se sì, il modo di lavorare (standard/DownUp) e i tipi di attacco disponibili -- TODO si dovrà decidere come tagliare anche se pezzo corto (il motore non deve ingombrare con il pinzaggio) -- TODO da gestire riduzione percorso function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) @@ -377,28 +393,26 @@ function MachiningLib.GetBladeEngagement( Parameters, OptionalParameters) local Engagement -- test lavorazione faccia in modo standard (no DownUp) - local bIsEngagementOk, bMoveAfterSplit, bNeedTangentLeadInOut = TestEngagement( 'Standard', Parameters, OptionalParameters) + local bIsEngagementOk, bMoveAfterSplit = TestEngagement( 'Standard', Parameters, OptionalParameters) if bIsEngagementOk then Engagement = { sBladeEngagement = 'Standard', bMoveAfterSplit = bMoveAfterSplit, - bNeedTangentLeadInOut = bNeedTangentLeadInOut, LeadInOut = LeadInOut } return true, Engagement end -- faccia non lavorabile in modo standard: si verifica se il DownUp è fattibile - bIsEngagementOk, bMoveAfterSplit, bNeedTangentLeadInOut = TestEngagement( 'DownUp', Parameters, OptionalParameters) + bIsEngagementOk, bMoveAfterSplit = TestEngagement( 'DownUp', Parameters, OptionalParameters) if bIsEngagementOk then Engagement = { sBladeEngagement = 'DownUp', bMoveAfterSplit = bMoveAfterSplit, - bNeedTangentLeadInOut = bNeedTangentLeadInOut, LeadInOut = LeadInOut } return true, Engagement diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index 4fcbbd1..5733cb1 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -94,14 +94,12 @@ local function CalculateLeadInOut( Machining, EdgeToMachine, bIsSplitFeature) LeadIn.dTangentDistance = 0 LeadOut.dTangentDistance = 0 - -- TODO qui dovrebbe essere sempre perpendicolare tranne se bNeedTangentLeadInOut, che il GetBladeEngagement deve settare sempre correttamente per evitare sia messo in casi impropri - -- il problema è che se non è controllato bene dal GetBladeEngagement, che non ha tutte le informazioni(?), si potrebbe incorrere in scelte errate + -- TODO qua deve arrivare dal BladeEngagement e cambiare solamente se step > 1 if Machining.bIsStartClosed or Machining.bIsEndClosed or Machining.CloneStepsRadial.nCount > 1 or Machining.Steps.nCount > 1 - or bIsSplitFeature - or not Machining.bNeedTangentLeadInOut then + or bIsSplitFeature then Machining.sLeadInOutType = 'Perpendicular' if AreSameVectorApprox( Machining.vtToolDirection, EdgeToMachine.vtN) then @@ -294,7 +292,6 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar if Cutting.bIsApplicable then Cutting.sBladeEngagement = Engagement.sBladeEngagement Cutting.bMoveAfterSplit = Engagement.bMoveAfterSplit - Cutting.bNeedTangentLeadInOut = Engagement.bNeedTangentLeadInOut end -- utensile da cercare: si prende la lama migliore che può effettuare questo taglio, senza particolari analisi @@ -313,7 +310,6 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar if Cutting.nToolIndex then Cutting.sBladeEngagement = ToolInfo.Engagement.sBladeEngagement Cutting.bMoveAfterSplit = ToolInfo.Engagement.bMoveAfterSplit - Cutting.bNeedTangentLeadInOut = ToolInfo.Engagement.bNeedTangentLeadInOut end -- se non trovato utensile, la lavorazione non è applicabile @@ -419,7 +415,6 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar -- il BladeEngagement non deve cambiare, altrimenti è inutile invertire la direzione if ( EngagementOpposite.sBladeEngagement == Cutting.sBladeEngagement) and ( EngagementOpposite.bMoveAfterSplit == Cutting.bMoveAfterSplit) - and ( EngagementOpposite.bNeedTangentLeadInOut == Cutting.bNeedTangentLeadInOut) and ( Cutting.bInvert and Cutting.vtEdgeDirection:getZ() > 100 * GEO.EPS_SMALL) or ( ( not Cutting.bInvert) and Cutting.vtEdgeDirection:getZ() < -100 * GEO.EPS_SMALL) then @@ -434,6 +429,8 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar end end + -- TODO implementare lavorazione in DownUp se non è già DownUp e non si è riusciti a mantenere verso l'alto e concorde (testare solo DownUp)) + -- profondità da lavorare e offset radiale if OptionalParameters.dPocketHeight then if TOOLS[Cutting.nToolIndex].dMaxDepth > dDepthToMachine - 10 * GEO.EPS_SMALL then @@ -502,8 +499,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar TIMER:stopElapsed( 'GetBladeEngagement') -- se non fattibile o cambiano le condizioni BladeEngagement, non si riduce - if not ( bIsApplicable and ( CurrentEngagement.sBladeEngagement == Cutting.sBladeEngagement) and ( CurrentEngagement.bMoveAfterSplit == Cutting.bMoveAfterSplit) - and ( CurrentEngagement.bNeedTangentLeadInOut == Cutting.bNeedTangentLeadInOut)) then + if not ( bIsApplicable and ( CurrentEngagement.sBladeEngagement == Cutting.sBladeEngagement) and ( CurrentEngagement.bMoveAfterSplit == Cutting.bMoveAfterSplit)) then Cutting.sEdgeUsage = 'Standard' dDepthToMachine = Cutting.dDepthToMachine end