diff --git a/LuaLibs/FaceData.lua b/LuaLibs/FaceData.lua index 13d9b1c..34ca9c4 100644 --- a/LuaLibs/FaceData.lua +++ b/LuaLibs/FaceData.lua @@ -142,6 +142,13 @@ function FaceData.GetEdgesInfo( ProcOrId, idFace ) CurrentEdge.sType = 'Standard' CurrentEdge.id = i - 1 + -- se nella Proc ci sono le adiacenze e il lato ha adiacenza, si salva l'angolo con la faccia adiacente + if Proc.AdjacencyMatrix then + if CurrentEdge.idAdjacentFace > -1 then + CurrentEdge.dAdjacencyAngle = Proc.AdjacencyMatrix[idFace + 1][CurrentEdge.idAdjacentFace + 1] + end + end + table.insert( Edges, CurrentEdge) end diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index 4997299..eac7f35 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -137,11 +137,6 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) Result = FeatureLib.GetStrategyResultNotApplicable( 'BladeKeepWaste : angle between faces must be concave and >= 90deg') return Machinings, Result end - -- Rabbet lungo X non gestito - if Proc.Topology.sName == 'Rabbet-2-Through' and Proc.AffectedFaces.bLeft and Proc.AffectedFaces.bRight then - Result = FeatureLib.GetStrategyResultNotApplicable( 'BladeKeepWaste : Rabbet along X not managed') - return Machinings, Result - end elseif Proc.nFct == 3 then -- caso speciale RidgeLap - per angolo tra le facce >= 90deg (feature convessa) non applicabile if Proc.AdjacencyMatrix[1][2] > 10 * GEO.EPS_SMALL or Proc.AdjacencyMatrix[1][2] < -91 then @@ -209,27 +204,38 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- calcolo lavorazioni -- taglio eventuali facce di chiusura - for i = 1, #LongFaces do - local Cutting = {} - local OptionalParametersFaceByBlade = { bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, nToolIndex = nToolIndex} - Cutting = FaceByBlade.Make( Proc, Part, LongFaces[i], LongFaces[i].MainEdges.BottomEdge, OptionalParametersFaceByBlade) - Cutting.nInternalSortingPriority = 1 - Cutting.dResultWeight = 0.15 - table.insert( CalculatedMachinings, Cutting) + if #Proc.MainFaces.BottomFaces == 1 then + for i = 1, #LongFaces do + local Cutting = {} + local OptionalParametersFaceByBlade = { bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, nToolIndex = nToolIndex} + Cutting = FaceByBlade.Make( Proc, Part, LongFaces[i], LongFaces[i].MainEdges.BottomEdge, OptionalParametersFaceByBlade) + Cutting.nInternalSortingPriority = 1 + Cutting.dResultWeight = 0.15 + table.insert( CalculatedMachinings, Cutting) + end end - -- taglio con codolo faccia di fondo + -- taglio con codolo faccia di fondo; si provano solo i lati a cui si può accedere (lato opposto aperto) + -- TODO il check del lato opposto aperto andrà messo nella FaceByBlade + -- TODO vanno lavorate tutte le BottomFaces, con accorciamento se angolo tra le due < 90 (basta guardare dAdjacentAngle dell'Edge) local dDepthToMachine = BottomEdgeToMachine.dElevation / 2 - dStripWidth / 2 + + local OptionalParametersFaceByBlade1 = { dDepthToMachine = dDepthToMachine, bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, nToolIndex = nToolIndex} + local BottomEdgeToMachineOpposite = BeamLib.FindEdgeBestOrientedAsDirection( BottomFace.Edges, -BottomEdgeToMachine.vtN) -- primo lato - Cutting1 = FaceByBlade.Make( Proc, Part, BottomFace, BottomEdgeToMachine, OptionalParametersFaceByBlade1) + if BottomEdgeToMachineOpposite.bIsOpen then + Cutting1 = FaceByBlade.Make( Proc, Part, BottomFace, BottomEdgeToMachine, OptionalParametersFaceByBlade1) + end Cutting1.nInternalSortingPriority = 3 Cutting1.dResultWeight = 0.3 -- secondo lato local OptionalParametersFaceByBlade2 = BeamLib.TableCopyDeep( OptionalParametersFaceByBlade1) OptionalParametersFaceByBlade2.OppositeToolDirectionMode = 'Enabled' - Cutting2 = FaceByBlade.Make( Proc, Part, BottomFace, BottomEdgeToMachine, OptionalParametersFaceByBlade2) + if BottomEdgeToMachine.bIsOpen then + Cutting2 = FaceByBlade.Make( Proc, Part, BottomFace, BottomEdgeToMachine, OptionalParametersFaceByBlade2) + end Cutting2.nInternalSortingPriority = 3 Cutting2.dResultWeight = 0.3 @@ -258,12 +264,14 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) table.insert( CalculatedMachinings, Cutting1) table.insert( CalculatedMachinings, Cutting2) end + + -- fresatura eventuali facce di chiusura - if bFinishWithMill then + if ( abs( BottomEdgeToMachine.vtEdge:getX()) > abs( BottomEdgeToMachine.vtEdge:getY())) and bFinishWithMill then for i = 1, #LongFaces do local dDepthToMachineMill = BottomFace.MainEdges.LongEdges[i].dElevation - dMillingOffsetFromSide - local dToolMarkLength = max( Cutting1.dToolMarkLength, Cutting2.dToolMarkLength) + local dToolMarkLength = max( Cutting1.dToolMarkLength or 0, Cutting2.dToolMarkLength or 0) local OptionalParametersFaceByMill = { bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, dRadialStepSpan = dToolMarkLength, dDepthToMachine = dDepthToMachineMill } diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index cdb0c98..613af4c 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -46,6 +46,7 @@ local function GetLeadInOut( Machining, EdgeToMachine, bIsSplitFeature) -- se senso di percorrenza invertito si invertono anche gli attacchi if Machining.bInvert then + Machining.bIsStartClosed, Machining.bIsEndClosed = Machining.bIsEndClosed, Machining.bIsStartClosed LeadIn, LeadOut = LeadInOutLib.InvertLeadInOut( LeadIn, LeadOut) end @@ -367,7 +368,13 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar Cutting.vtToolDirection = EdgeToMachineOpposite.vtN Cutting.ptEdge1, Cutting.ptEdge2 = EdgeToMachineOpposite.ptStart, EdgeToMachineOpposite.ptEnd Cutting.bInvert = not Cutting.bInvert - Cutting.LeadInOut = EngagementOpposite.LeadInOut + -- TODO da migliorare!!!!!!!!! + if not EngagementOpposite.LeadInOut.Perpendicular then + Cutting.LeadInOut.Perpendicular = nil + end + if not EngagementOpposite.LeadInOut.Tangent then + Cutting.LeadInOut.Tangent = nil + end end end