diff --git a/Strategies/Standard/STR0003/STR0003.lua b/Strategies/Standard/STR0003/STR0003.lua index b923f09..8d72218 100644 --- a/Strategies/Standard/STR0003/STR0003.lua +++ b/Strategies/Standard/STR0003/STR0003.lua @@ -35,12 +35,19 @@ Chainsaw.Result = {} local function IsTopologyOk( Proc) if Proc.Topology.bAllRightAngles and ( Proc.Topology.sName == 'Pocket-5-Blind' or - Proc.Topology.sName == 'Groove-3-Through' or Proc.Topology.sName == 'Groove-4-Blind' or Proc.Topology.sName == 'Tunnel-4-Through') then return true + + -- canale ammesso solo se lati paralleli a 2 a 2 + elseif Proc.Topology.sName == 'Groove-3-Through' + and ( AreOppositeVectorApprox( Proc.MainFaces.BottomFaces[1].MainEdges.LongEdges[1].vtN, Proc.MainFaces.BottomFaces[1].MainEdges.LongEdges[2].vtN)) then + + return true + else + return false end end @@ -195,11 +202,20 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) return false, Strategy.Result end + -- se canale e lati non a 90deg la strategia non è applicabile + -- TODO questo è temporaneo finchè non si gestiscono correttamente i lati obliqui per le groove-3-through + -- la dPocketHeight è già gestita, ma va allungato il percorso dove c'è l'angolo > 90 + if Proc.Topology.sName == 'Groove-3-Through' then + local BottomFace = Proc.MainFaces.BottomFaces[1] + if abs( BottomFace.Edges[1].vtEdge * BottomFace.Edges[2].vtEdge) > 10 * GEO.EPS_SMALL then + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Topology') + return false, Strategy.Result + end + end + -- se tasca su faccia sotto la strategia non è applicabile (la sega a catena in generale non può lavorare da sotto) -- TODO se OnlySaw questo test è da rimuovere ma bisogna considerare anche la lama da sotto if Proc.AffectedFaces.bBottom and ( Proc.nFct > 3 or not Proc.AffectedFaces.bTop) then - local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. Strategy.sName .. ' not applicable - pocket on bottom face' - EgtOutLog( sErr) Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Direction') return false, Strategy.Result end @@ -223,6 +239,11 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) local dPocketHeight = 0 if Proc.Topology.sFamily == 'Tunnel' then dPocketHeight = Proc.MainFaces.SideFaces[1].MainEdges.OppositeEdges[1].dLength + elseif Proc.Topology.sName == 'Groove-3-Through' then + local BottomFace = Proc.MainFaces.BottomFaces[1] + local frFrame = Frame3d( BottomFace.ptCenter, BottomFace.vtN, BottomFace.MainEdges.LongEdges[1].vtEdge) + local b3BottomFace = EgtSurfTmGetFacetBBoxRef( Proc.id, BottomFace.id, GDB_BB.STANDARD, frFrame) + dPocketHeight = b3BottomFace:getDimY() else dPocketHeight = Proc.MainFaces.BottomFaces[1].MainEdges.SideEdges[1].dLength end diff --git a/Strategies/Standard/STR0010/STR0010.lua b/Strategies/Standard/STR0010/STR0010.lua index a8f3a06..63a779f 100644 --- a/Strategies/Standard/STR0010/STR0010.lua +++ b/Strategies/Standard/STR0010/STR0010.lua @@ -299,6 +299,7 @@ function STR0010.Make( bAddMachining, Proc, Part, CustomParameters) end -- fresatura eventuali facce di chiusura (se non già lavorate) + -- TODO funzione if Strategy.Parameters.bFinishWithMill then if Milling1 then @@ -311,7 +312,8 @@ function STR0010.Make( bAddMachining, Proc, Part, CustomParameters) end -- su ognuno si fa la fresatura di pulizia for i = 1, #EdgesClosedNotMachined do - local dDepthToMachine = EdgesClosedNotMachined[i].dElevation - Strategy.Parameters.dMillingOffsetFromSide + local dMillingOffsetFromSide = Strategy.Parameters.bAntiSplintWithBlade and Strategy.Parameters.dMillingOffsetFromSide or 0 + local dDepthToMachine = EdgesClosedNotMachined[i].dElevation - dMillingOffsetFromSide local dToolMarkLength = Milling1.dToolMarkLength or 0 local OptionalParameters = { bIsSplitFeature = bIsSplitFeature, @@ -336,7 +338,8 @@ function STR0010.Make( bAddMachining, Proc, Part, CustomParameters) end -- su ognuno si fa la fresatura di pulizia for i = 1, #EdgesClosedNotMachined do - local dDepthToMachine = EdgesClosedNotMachined[i].dElevation - Strategy.Parameters.dMillingOffsetFromSide + local dMillingOffsetFromSide = Strategy.Parameters.bAntiSplintWithBlade and Strategy.Parameters.dMillingOffsetFromSide or 0 + local dDepthToMachine = EdgesClosedNotMachined[i].dElevation - dMillingOffsetFromSide local dToolMarkLength = Milling2.dToolMarkLength or 0 local OptionalParameters = { bIsSplitFeature = bIsSplitFeature, diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index 784df03..6ee9291 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -156,7 +156,7 @@ local function MakeBottomFace( Proc, Part, BottomFace, EdgeToMachine, Parameters if EdgeToMachineOpposite.bIsOpen then Cutting1 = FaceByBlade.Make( Proc, Part, BottomFace, EdgeToMachine, OptionalParametersFaceByBlade1) end - Cutting1.nInternalSortingPriority = 3 + Cutting1.nInternalSortingPriority = 2 Cutting1.dResultWeight = 0.3 -- secondo lato @@ -165,7 +165,7 @@ local function MakeBottomFace( Proc, Part, BottomFace, EdgeToMachine, Parameters if EdgeToMachine.bIsOpen then Cutting2 = FaceByBlade.Make( Proc, Part, BottomFace, EdgeToMachine, OptionalParametersFaceByBlade2) end - Cutting2.nInternalSortingPriority = 3 + Cutting2.nInternalSortingPriority = 2 Cutting2.dResultWeight = 0.3 -- se uno dei due lati non è riuscito, si estende il più possibile il lato rimasto @@ -179,7 +179,7 @@ local function MakeBottomFace( Proc, Part, BottomFace, EdgeToMachine, Parameters OptionalParametersFaceByBlade2.dDepthToMachine = dDepthToMachine Cutting2 = FaceByBlade.Make( Proc, Part, BottomFace, EdgeToMachine, OptionalParametersFaceByBlade2) - Cutting2.nInternalSortingPriority = 3 + Cutting2.nInternalSortingPriority = 2 Cutting2.dResultWeight = 0.3 table.insert( Cuttings, Cutting2) @@ -193,7 +193,7 @@ local function MakeBottomFace( Proc, Part, BottomFace, EdgeToMachine, Parameters OptionalParametersFaceByBlade1.dDepthToMachine = dDepthToMachine Cutting1 = FaceByBlade.Make( Proc, Part, BottomFace, EdgeToMachine, OptionalParametersFaceByBlade1) - Cutting1.nInternalSortingPriority = 3 + Cutting1.nInternalSortingPriority = 2 Cutting1.dResultWeight = 0.3 table.insert( Cuttings, Cutting1) @@ -286,6 +286,10 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- calcolo lavorazioni faccia principale -- ricerca lato da lavorare local BottomEdgeToMachine1 = GetLongEdgeToMachine( BottomFace1, { bTop = true}) + if not BottomEdgeToMachine1 then + Result = FeatureLib.GetStrategyResultNotApplicable() + return Machinings, Result + end -- calcolo lavorazione local Parameters1 = { bIsSplitFeature = bIsSplitFeature, @@ -302,16 +306,19 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- calcolo lavorazioni faccia secondaria, solo se lato convesso; se concavo, sarà lavorato come antisplint local Cuttings2 + local BottomEdgeToMachine2 if BottomFace2 then if bConvexAngle then -- ricerca lato da lavorare - local BottomEdgeToMachine2 = GetLongEdgeToMachine( BottomFace2, { bTop = true}) - -- calcolo lavorazione - local Parameters2 = BeamLib.TableCopyDeep( Parameters1) - Parameters2.OtherBottomFace = BottomFace1 - Cuttings2 = MakeBottomFace( Proc, Part, BottomFace2, BottomEdgeToMachine2, Parameters2) - for i = 1, #Cuttings2 do - table.insert( CalculatedMachinings, Cuttings2[i]) + BottomEdgeToMachine2 = GetLongEdgeToMachine( BottomFace2, { bTop = true}) + if BottomEdgeToMachine2 then + -- calcolo lavorazione + local Parameters2 = BeamLib.TableCopyDeep( Parameters1) + Parameters2.OtherBottomFace = BottomFace1 + Cuttings2 = MakeBottomFace( Proc, Part, BottomFace2, BottomEdgeToMachine2, Parameters2) + for i = 1, #Cuttings2 do + table.insert( CalculatedMachinings, Cuttings2[i]) + end end end end @@ -336,22 +343,71 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) end end - -- -- fresatura eventuali facce di chiusura - -- if bFinishWithMill then - -- for i = 1, #LongFaces do - -- if BottomEdgeToMachine.idAdjacentFace ~= LongFaces[i].id then - -- local dDepthToMachineMill = BottomFace1.MainEdges.LongEdges[i].dElevation - dMillingOffsetFromSide - -- local dToolMarkLength = max( Cutting1.dToolMarkLength or 0, Cutting2.dToolMarkLength or 0) - -- local OptionalParametersFaceByMill = { bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, - -- dRadialStepSpan = dToolMarkLength, dDepthToMachine = dDepthToMachineMill - -- } - -- local Milling = FaceByMill.Make( Proc, Part, BottomFace1, BottomFace1.MainEdges.LongEdges[i], OptionalParametersFaceByMill) - -- Milling.nInternalSortingPriority = 2 - -- Milling.dResultWeight = 0.05 - -- table.insert( CalculatedMachinings, Milling) - -- end - -- end - -- end + -- pulitura con fresa dei lati chiusi non lavorati + -- TODO funzione + if bFinishWithMill then + + if Cuttings1 then + -- si recuperano i lati chiusi non lavorati + local EdgesClosedNotMachined = {} + for i = 1, #BottomFace1.Edges do + if not( ( BottomFace1.Edges[i].id == BottomEdgeToMachine1.id) or BottomFace1.Edges[i].bIsOpen) then + table.insert( EdgesClosedNotMachined, BottomFace1.Edges[i]) + end + end + -- su ognuno si fa la fresatura di pulizia + for i = 1, #EdgesClosedNotMachined do + local dDepthToMachine = EdgesClosedNotMachined[i].dElevation - dMillingOffsetFromSide + local dToolMarkLength = 0 + -- si prende l'impronta dell'utensile più grande + for j = 1, #Cuttings1 do + if Cuttings1[j].dToolMarkLength > dToolMarkLength + 10 * GEO.EPS_SMALL then + dToolMarkLength = Cuttings1[j].dToolMarkLength + end + end + local OptionalParametersMilling = { + bIsSplitFeature = bIsSplitFeature, + dExtendAfterTail = dExtendAfterTail, + dRadialStepSpan = dToolMarkLength, + dDepthToMachine = dDepthToMachine + } + local Milling = FaceByMill.Make( Proc, Part, BottomFace1, EdgesClosedNotMachined[i], OptionalParametersMilling) + Milling.nInternalSortingPriority = 3 + Milling.dResultWeight = 0.05 + table.insert( CalculatedMachinings, Milling) + end + end + if Cuttings2 and BottomEdgeToMachine2 then + -- si recuperano i lati chiusi non lavorati + local EdgesClosedNotMachined = {} + for i = 1, #BottomFace2.Edges do + if not( ( BottomFace2.Edges[i].id == BottomEdgeToMachine2.id) or BottomFace2.Edges[i].bIsOpen) then + table.insert( EdgesClosedNotMachined, BottomFace2.Edges[i]) + end + end + -- su ognuno si fa la fresatura di pulizia + for i = 1, #EdgesClosedNotMachined do + local dDepthToMachine = EdgesClosedNotMachined[i].dElevation - dMillingOffsetFromSide + local dToolMarkLength = 0 + -- si prende l'impronta dell'utensile più grande + for j = 1, #Cuttings2 do + if Cuttings2[j].dToolMarkLength > dToolMarkLength + 10 * GEO.EPS_SMALL then + dToolMarkLength = Cuttings2[j].dToolMarkLength + end + end + local OptionalParametersMilling = { + bIsSplitFeature = bIsSplitFeature, + dExtendAfterTail = dExtendAfterTail, + dRadialStepSpan = dToolMarkLength, + dDepthToMachine = dDepthToMachine + } + local Milling = FaceByMill.Make( Proc, Part, BottomFace2, EdgesClosedNotMachined[i], OptionalParametersMilling) + Milling.nInternalSortingPriority = 3 + Milling.dResultWeight = 0.05 + table.insert( CalculatedMachinings, Milling) + end + end + end -- lavorazioni da applicare spostate in lista finale for i = 1, #CalculatedMachinings do