diff --git a/LuaLibs/FaceData.lua b/LuaLibs/FaceData.lua index 39c49f7..56e969f 100644 --- a/LuaLibs/FaceData.lua +++ b/LuaLibs/FaceData.lua @@ -255,28 +255,6 @@ function FaceData.IsFaceParallelogram( Face) return bIsRhomboid end -------------------------------------------------------------------------------------------------------------- --- calcola l'elevazione di un lato rispetto al box passato -function FaceData.GetEdgeElevationInBBox( Face, Edge, b3Box ) - -- recupero gruppo per geometrie temporanee - local idTempGroup = BeamLib.GetTempGroup() - - -- TODO sostituire EgtSurfTmFacetOppositeSide con punti direttamente in Edge - local ptEdge1, _, ptEdge2 = EgtSurfTmFacetOppositeSide( Face.idTrimesh, Face.id, -Edge.vtN, GDB_ID.ROOT) - -- ptMid è traslato leggermente all'interno per assicurare l'intersezione con il box - local dExtraLength = 500 * GEO.EPS_SMALL - local ptMid = ( ptEdge1 + ptEdge2) / 2 + Edge.vtN * dExtraLength - local idEdgeTrimesh - - -- piano di taglio del box orientato come la normale del lato e passante da ptMid - idEdgeTrimesh = EgtSurfTmPlaneInBBox( idTempGroup, ptMid, Edge.vtN, b3Box, GDB_RT.GLOB) - - -- al calcolo dell'elevazione devo aggiungere la lunghezza di cui avevo traslato il ptMid - local dElevation = EgtSurfTmFacetElevationInBBox( idEdgeTrimesh, 0, b3Box, true, GDB_ID.ROOT) + dExtraLength - - return dElevation -end - ------------------------------------------------------------------------------------------------------------- local function CompareEdgesBottomFace( EdgeA, EdgeB) -- prima i lati con facce adiacenti diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 9f530b5..0e3f1d7 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -330,14 +330,14 @@ end -- ritorna se la faccia e il lato sono lavorabili e, se sì, il modo di lavorare (standard/DownUp) -- TODO si dovrà decidere come tagliare anche in base a lavorazione di coda (spostare dopo separazione?) o pezzo corto (il motore non deve ingombrare con il pinzaggio) -- valutare se restituire, se disponibili, entrambe le soluzioni e demandare la decisione alla FaceByBlade -function MachiningLib.GetBladeEngagement( Face, Edge, Part, Tool, dDepthToMachine, bAvoidCollisionCheckForStandardCut) +function MachiningLib.GetBladeEngagement( Face, Edge, Part, Tool, dDepthToMachine, bCollisionCheckForDownUpOnly) local sBladeEngagement = 'Standard' -- la normale della faccia permette di lavorare in modo standard, ma potrebbero esserci altre condizioni che fanno fallire il taglio if not IsFaceZOutOfRange( Face.vtN, Tool) then -- TODO verifica collisione carro Z, collisione traversa PF, collisione 'C' Fast... La riduzione percorso cambia questo test? - if bAvoidCollisionCheckForStandardCut or not Check2DBladeCollision( Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) then + if bCollisionCheckForDownUpOnly or not Check2DBladeCollision( Edge, Face.vtN, Face.vtN, Part, Tool, dDepthToMachine) then return true, sBladeEngagement end @@ -514,7 +514,7 @@ function MachiningLib.FindBlade( Proc, ToolSearchParameters) local bForceLongcutBlade = ToolSearchParameters.bForceLongcutBlade or false local EdgeToMachine = ToolSearchParameters.EdgeToMachine local Part = ToolSearchParameters.Part - local bAvoidCollisionCheckForStandardCut = ToolSearchParameters.bAvoidCollisionCheckForStandardCut or false + local bCollisionCheckForDownUpOnly = ToolSearchParameters.bCollisionCheckForDownUpOnly or false local nBestToolIndex local dBestToolResidualDepth = 0 @@ -534,7 +534,7 @@ function MachiningLib.FindBlade( Proc, ToolSearchParameters) -- se dati sufficienti, si determina se con questo utensile il taglio è fattibile e il modo di lavorare della lama if bIsToolCompatible then if FaceToMachine and EdgeToMachine and Part and dElevation then - local bIsBladeOk = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachine, Part, TOOLS[i], dElevation, bAvoidCollisionCheckForStandardCut) + local bIsBladeOk = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachine, Part, TOOLS[i], dElevation, bCollisionCheckForDownUpOnly) -- orientamento non raggiungibile if not bIsBladeOk then bIsToolCompatible = false diff --git a/Strategies/Standard/STR0005/STR0005.lua b/Strategies/Standard/STR0005/STR0005.lua index 0c5e5ac..405ffe6 100644 --- a/Strategies/Standard/STR0005/STR0005.lua +++ b/Strategies/Standard/STR0005/STR0005.lua @@ -36,7 +36,7 @@ local function IsTwoFacesCommonEdgeTooLong( Proc, Part) end -- se due facce, cubetti troppo lunghi in X non si possono fare - local ptEdge1, _, ptEdge2 = EgtSurfTmFacetOppositeSide( Proc.id, Proc.Faces[1].id, -Proc.Faces[1].Edges[nCommonEdge].vtN, GDB_ID.ROOT) + local ptEdge1, ptEdge2 = Proc.Faces[1].Edges[nCommonEdge].ptStart, Proc.Faces[1].Edges[nCommonEdge].ptEnd local b3BoxEdge = BBox3d( ptEdge1, ptEdge2) local dEdgeLengthOnX = b3BoxEdge:getDimX() if FeatureLib.IsMachiningLong( dEdgeLengthOnX, Part) then diff --git a/StrategyLibs/BLADETOWASTE.lua b/StrategyLibs/BLADETOWASTE.lua index 1989ea3..bfb8e8c 100644 --- a/StrategyLibs/BLADETOWASTE.lua +++ b/StrategyLibs/BLADETOWASTE.lua @@ -433,12 +433,13 @@ local function GetDualSideCutStrategy( Proc, Part, OptionalParameters) Part = Part }) -- ricerca lama testa sotto + -- lavorando dalla direzione opposta, faccio le verifiche come se lavorassi il lato opposto local ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, { bAllowTopHead = false, bAllowBottomHead = true, dElevation = dDepthToMachineBottom, FaceToMachine = FaceToMachine, - EdgeToMachine = EdgeToMachine, + EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( FaceToMachine.Edges, -EdgeToMachine.vtN), Part = Part }) @@ -451,12 +452,13 @@ local function GetDualSideCutStrategy( Proc, Part, OptionalParameters) dDepthToMachineTop = TOOLS[ToolInfoTopBlade.nToolIndex].dMaxMaterial dDepthToMachineBottom = EdgeToMachine.dElevation - dDepthToMachineTop + BeamData.CUT_EXTRA_MIN -- ricerca lama sotto con la nuova depth + -- lavorando dalla direzione opposta, faccio le verifiche come se lavorassi il lato opposto ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, { bAllowTopHead = false, bAllowBottomHead = true, dElevation = dDepthToMachineBottom, FaceToMachine = FaceToMachine, - EdgeToMachine = EdgeToMachine, + EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( FaceToMachine.Edges, -EdgeToMachine.vtN), Part = Part }) bIsBottomLimited = ToolInfoBottomBlade.dResidualDepth > 10 * GEO.EPS_SMALL @@ -819,7 +821,7 @@ local function CutWithDicing( Proc, Part, OptionalParameters) nToolIndex = nToolIndex, dRadialStepSpan = 0, dExtendAfterTail = dExtendAfterTail, - bAvoidCollisionCheckForStandardCut = true + bCollisionCheckForDownUpOnly = true } Cutting = FaceByBlade.Make( ProcTrimesh, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) Cutting.ptCenter = Point3d( ProcTrimesh.Faces[1].ptCenter:getX(), 0, 0) @@ -921,7 +923,7 @@ function BLADETOWASTE.Make( ProcOrId, Part, OptionalParameters) end end -- se due facce, cubetti troppo lunghi in X non si possono fare - local ptEdge1, _, ptEdge2 = EgtSurfTmFacetOppositeSide( Proc.id, Proc.Faces[1].id, -Proc.Faces[1].Edges[nCommonEdge].vtN, GDB_ID.ROOT) + local ptEdge1, ptEdge2 = Proc.Faces[1].Edges[nCommonEdge].ptStart, Proc.Faces[1].Edges[nCommonEdge].ptEnd local b3BoxEdge = BBox3d( ptEdge1, ptEdge2) local dEdgeLengthOnX = b3BoxEdge:getDimX() if FeatureLib.IsMachiningLong( dEdgeLengthOnX, Part) then diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index 30bd196..621a2c2 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -260,7 +260,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar end local dRadialStepSpan = OptionalParameters.dRadialStepSpan local sUserNotes = OptionalParameters.sUserNotes or '' - local bAvoidCollisionCheckForStandardCut = OptionalParameters.bAvoidCollisionCheckForStandardCut or false + local bCollisionCheckForDownUpOnly = OptionalParameters.bCollisionCheckForDownUpOnly or false -- lunghezze, direzioni e punti caratteristici della lavorazione e del lato lavorato Cutting.dEdgeLength = EdgeToMachine.dLength @@ -270,25 +270,15 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar Cutting.vtToolDirection = EdgeToMachine.vtN end Cutting.vtEdgeDirection = EdgeToMachine.vtN ^ FaceToMachine.vtN - -- TODO conviene spostare questi calcoli nel FaceData? - Cutting.ptEdge1, _, Cutting.ptEdge2 = EgtSurfTmFacetOppositeSide( Proc.id, FaceToMachine.id, -Cutting.vtToolDirection, GDB_ID.ROOT) + Cutting.ptEdge1, Cutting.ptEdge2 = EdgeToMachine.ptStart, EdgeToMachine.ptEnd - -- ricerca utensile + -- l'utensile arriva da fuori: si determina se il taglio è fattibile e il modo di lavorare della lama if nToolIndex then + Cutting.nToolIndex = nToolIndex + Cutting.bIsApplicable, Cutting.sBladeEngagement = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachine, Part, TOOLS[nToolIndex], dDepthToMachine, bCollisionCheckForDownUpOnly) - -- si determina se il taglio è fattibile e il modo di lavorare della lama - Cutting.bIsApplicable, Cutting.sBladeEngagement = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachine, Part, TOOLS[nToolIndex], dDepthToMachine, bAvoidCollisionCheckForStandardCut) - - -- orientamento non raggiungibile o elevazione eccessiva per DownUp: non applicabile - if not Cutting.bIsApplicable then - - Cutting.sMessage = 'Orientation not reachable' - EgtOutLog( Cutting.sMessage) - return Cutting, EdgeToMachine.dElevation - end - - -- si prende la lama migliore che può effettuare questo taglio, senza particolari analisi + -- utensile da cercare: si prende la lama migliore che può effettuare questo taglio, senza particolari analisi else local ToolSearchParameters = {} ToolSearchParameters.dElevation = dDepthToMachine @@ -302,8 +292,30 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar local ToolInfo = MachiningLib.FindBlade( Proc, ToolSearchParameters) Cutting.nToolIndex = ToolInfo.nToolIndex Cutting.sBladeEngagement = ToolInfo.sBladeEngagement + + -- se non trovato utensile, la lavorazione non è applicabile + if not Cutting.nToolIndex then + Cutting.bIsApplicable = false + end end - if not TOOLS[Cutting.nToolIndex] then + + -- in caso di OppositeToolDirectionMode abilitata si analizza anche il lato opposto + if OppositeToolDirectionMode ~= 'Disabled' then + + local EdgeToMachineOpposite = BeamLib.FindEdgeBestOrientedAsDirection( FaceToMachine.Edges, -Cutting.vtToolDirection) + local bIsApplicableOpposite = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachineOpposite, Part, TOOLS[nToolIndex], dDepthToMachine, bCollisionCheckForDownUpOnly) + + if not bIsApplicableOpposite then + if OppositeToolDirectionMode == 'Enabled' then + Cutting.bIsApplicable = false + elseif OppositeToolDirectionMode == 'Optimized' then + OppositeToolDirectionMode = 'Disabled' + end + end + end + + -- orientamento non raggiungibile o lama non trovata: non applicabile + if not Cutting.bIsApplicable then Cutting.sMessage = 'Blade not found' Cutting.bIsApplicable = false EgtOutLog( Cutting.sMessage) @@ -357,14 +369,14 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar -- si attiva OppositeToolDirection solo se il taglio è fattibile anche in direzione opposta local EdgeToMachineOpposite = BeamLib.FindEdgeBestOrientedAsDirection( FaceToMachine.Edges, -Cutting.vtToolDirection) - local bIsApplicableOpposite, sBladeEngagementOpposite = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachineOpposite, Part, TOOLS[nToolIndex], dDepthToMachine, bAvoidCollisionCheckForStandardCut) + local bIsApplicableOpposite, sBladeEngagementOpposite = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachineOpposite, Part, TOOLS[nToolIndex], dDepthToMachine, bCollisionCheckForDownUpOnly) if bIsApplicableOpposite and ( sBladeEngagementOpposite == Cutting.sBladeEngagement) then OppositeToolDirectionMode = 'Enabled' Cutting.sBladeEngagement = sBladeEngagementOpposite Cutting.vtToolDirection = -EdgeToMachine.vtN - Cutting.ptEdge1, _, Cutting.ptEdge2 = EgtSurfTmFacetOppositeSide( Proc.id, FaceToMachine.id, -Cutting.vtToolDirection, GDB_ID.ROOT) + Cutting.ptEdge1, Cutting.ptEdge2 = EdgeToMachineOpposite.ptStart, EdgeToMachineOpposite.ptEnd Cutting.bInvert = not Cutting.bInvert -- se non possibile taglio opposto, si setta per tagliare verso l'alto diff --git a/StrategyLibs/FACEBYCHAINSAW.lua b/StrategyLibs/FACEBYCHAINSAW.lua index 521c2dc..5f044fc 100644 --- a/StrategyLibs/FACEBYCHAINSAW.lua +++ b/StrategyLibs/FACEBYCHAINSAW.lua @@ -83,7 +83,7 @@ function FACEBYCHAINSAW.Make( Proc, Part, FaceToMachine, EdgeToMachine, Optional Mortising.vtToolDirection = EdgeToMachine.vtN end Mortising.vtEdgeDirection = EdgeToMachine.vtN ^ FaceToMachine.vtN - Mortising.ptEdge1, _, Mortising.ptEdge2 = EgtSurfTmFacetOppositeSide( Proc.id, FaceToMachine.id, -Mortising.vtToolDirection, GDB_ID.ROOT) + Mortising.ptEdge1, Mortising.ptEdge2 = EdgeToMachine.ptStart, EdgeToMachine.ptEnd -- ricerca utensile local ToolSearchParameters = {} diff --git a/StrategyLibs/FACEBYMILL.lua b/StrategyLibs/FACEBYMILL.lua index fd5ed3d..ff40437 100644 --- a/StrategyLibs/FACEBYMILL.lua +++ b/StrategyLibs/FACEBYMILL.lua @@ -204,8 +204,7 @@ function FACEBYMILL.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPara Milling.vtToolDirection = EdgeToMachine.vtN end Milling.vtEdgeDirection = EdgeToMachine.vtN ^ FaceToMachine.vtN - -- TODO conviene spostare questi calcoli nel FaceData? - Milling.ptEdge1, _, Milling.ptEdge2 = EgtSurfTmFacetOppositeSide( Proc.id, FaceToMachine.id, -Milling.vtToolDirection, GDB_ID.ROOT) + Milling.ptEdge1, Milling.ptEdge2 = EdgeToMachine.ptStart, EdgeToMachine.ptEnd -- se si conosce il limite downUp (utensile forzato o downUp forzato) si decide se invertire (ToolInvert) if nToolIndex and not dMinNzDownUp then