From 771a56d8328b153af184a56999b4ed2b18be17e2 Mon Sep 17 00:00:00 2001 From: "daniele.nicoli" Date: Wed, 8 Jul 2026 16:56:25 +0200 Subject: [PATCH] - BeamLib - aumentati parametri che salva la funzione Edges - LapJoint - Modifiche LeadInOut per SawPlusChain - LapJoint - Aggiunto casi CleanCorner --- LuaLibs/BeamLib.lua | 41 +++-- LuaLibs/ProcessLapJoint.lua | 301 +++++++++++++++++++++++++----------- 2 files changed, 239 insertions(+), 103 deletions(-) diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index cf52d70..92dceda 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -1307,29 +1307,46 @@ function BeamLib.GetFacetsInfo( Proc, b3Raw) end --------------------------------------------------------------------- -function BeamLib.GetEdgesInfo( Proc, Face) +function BeamLib.GetEdgesInfo( ProcOrId, FaceId) + + -- disambiguazione feature vs id trimesh + local Proc = {} + if type( ProcOrId) == "table" then + Proc = ProcOrId + elseif type( ProcOrId) == "number" then + Proc.Id = ProcOrId + else + error( 'GetEdgesInfo : Only feature or trimesh supported') + end + local Edges = {} - local nFaceType, vEdges = EgtSurfTmGetFacetOutlineInfo( Proc.Id, Face.Id, GDB_ID.ROOT) + local nFaceType, vEdges = EgtSurfTmGetFacetOutlineInfo( Proc.Id, FaceId, GDB_ID.ROOT) if nFaceType < 1 then - for j = 1, #vEdges do - local nPreviousEdgeIndex = j - 1 - if j == 1 then + for i = 1, #vEdges do + local nPreviousEdgeIndex = i - 1 + if i == 1 then nPreviousEdgeIndex = #vEdges end - local nNextEdgeIndex = j + 1 - if j == #vEdges then + local nNextEdgeIndex = i + 1 + if i == #vEdges then nNextEdgeIndex = 1 end local CurrentEdge = {} - CurrentEdge.AdjacentFaceId = vEdges[j].Adj - CurrentEdge.ToolDirection = Vector3d( vEdges[j].Norm) - CurrentEdge.Length = vEdges[j].Len - CurrentEdge.Elevation = vEdges[j].Elev - CurrentEdge.IsOpen = vEdges[j].Open + CurrentEdge.AdjacentFaceId = vEdges[i].Adj + CurrentEdge.ToolDirection = Vector3d( vEdges[i].Norm) + CurrentEdge.Length = vEdges[i].Len + CurrentEdge.Elevation = vEdges[i].Elev + CurrentEdge.IsOpen = vEdges[i].Open CurrentEdge.IsStartOpen = ( vEdges[nPreviousEdgeIndex].Open) CurrentEdge.IsEndOpen = ( vEdges[nNextEdgeIndex].Open) + CurrentEdge.ptStart = Point3d( vEdges[i].Start) + CurrentEdge.ptEnd = Point3d( vEdges[nNextEdgeIndex].Start) + CurrentEdge.vtEdge = CurrentEdge.ptEnd - CurrentEdge.ptStart ; CurrentEdge.vtEdge:normalize() + CurrentEdge.Id = i - 1 + CurrentEdge.PreviousEdgeIndex = nPreviousEdgeIndex + CurrentEdge.NextEdgeIndex = nNextEdgeIndex table.insert( Edges, CurrentEdge) end diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index f507527..92c709b 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -3570,7 +3570,7 @@ local function MakeByChainOrSaw( Proc, nPhase, nRawId, nPartId, nFacInd, -- se necessario, avverto limitazione dell'affondamento if dElev > dMaxDepth + 10 * GEO.EPS_SMALL then if Proc.Fct == 3 and Proc.Topology == 'Groove' and Proc.IsThrough and (Proc.AffectedFaces.Left or Proc.AffectedFaces.Right) and not Proc.IsParallel then - local Edges = BL.GetEdgesInfo( Proc, Proc.Face[nFacAdj+1]) + local Edges = BL.GetEdgesInfo( Proc, Proc.Face[nFacAdj+1].Id) local dWorkEdgeWidth for i = 1, #Edges do if Edges[i].AdjacentFaceId == nFacInd then @@ -3701,7 +3701,7 @@ local function MakeByChainOrSaw( Proc, nPhase, nRawId, nPartId, nFacInd, EgtSetMachiningParam( MCH_MP.DEPTH, dMachiningDepth) -- si decidono lato di lavoro, inversione e estensione in base al lato aperto local nEdgeIndex = BL.GetEdgeToMachineFromVector( Proc.Id, nFacAdj, vtRef) - local EdgesEgt = BL.GetEdgesInfo( Proc, Proc.Face[nFacAdj+1]) + local EdgesEgt = BL.GetEdgesInfo( Proc, Proc.Face[nFacAdj+1].Id) local CurrentEdge = EdgesEgt[nEdgeIndex+1] local dStartAddLen = 0 local dEndAddLen = 0 @@ -4052,7 +4052,7 @@ local function MachineByMill( Proc, nPhase, nRawId, nPartId, b3Solid, tvtN, nBas -- faccia principale e quindi la componente X del versore della faccia potrebbe dare un valore non coerente local dDiffFromSqAng = dAng + 90 -- informazioni sul lato da lavorare - local Edges = BL.GetEdgesInfo( Proc, Proc.Face[nSideFace + 1]) + local Edges = BL.GetEdgesInfo( Proc, Proc.Face[nSideFace + 1].Id) local EdgeToMachine = {} for i = 1, #Edges do local CurrentEdge = Edges[i] @@ -4823,7 +4823,7 @@ local function ManageAntiSplintBySaw( Proc, b3Raw, b3Solid, bIsU, vtN, nFacInd, local dMaxDepth = 200 local bAdj, dAng, dExtraOffs, sWarn2, nIdMach -- Se faccia sulla quale cerca di applicare l'antisplint è chiusa e limitata da altre facce non lo applica - local FacetEdge = BL.GetEdgesInfo( Proc, Proc.Face[nFacet+1]) + local FacetEdge = BL.GetEdgesInfo( Proc, Proc.Face[nFacet+1].Id) for nEdge = 1, #FacetEdge do if AreSameVectorApprox( FacetEdge[nEdge].ToolDirection, vtN) and ( not FacetEdge[nEdge].IsStartOpen or not FacetEdge[nEdge].IsEndOpen) and not FacetEdge[nEdge].IsOpen then sWarn2 = 'Warning : antisplint not applicable on closed face' @@ -5555,25 +5555,31 @@ function SawPlusChain.GetBottomFaceEdges( Proc, Face) local nFaceType, vEdges = EgtSurfTmGetFacetOutlineInfo( Proc.Id, Face.Id, GDB_ID.ROOT) if nFaceType < 1 then - for j = 1, #vEdges do - local nPreviousEdgeIndex = j - 1 - if j == 1 then + for i = 1, #vEdges do + local nPreviousEdgeIndex = i - 1 + if i == 1 then nPreviousEdgeIndex = #vEdges end - local nNextEdgeIndex = j + 1 - if j == #vEdges then + local nNextEdgeIndex = i + 1 + if i == #vEdges then nNextEdgeIndex = 1 end local CurrentEdge = {} - CurrentEdge.AdjacentFaceId = vEdges[j].Adj - CurrentEdge.ToolDirection = Vector3d( vEdges[j].Norm) - CurrentEdge.Length = vEdges[j].Len - CurrentEdge.Elevation = vEdges[j].Elev - CurrentEdge.IsOpen = vEdges[j].Open + CurrentEdge.AdjacentFaceId = vEdges[i].Adj + CurrentEdge.ToolDirection = Vector3d( vEdges[i].Norm) + CurrentEdge.Length = vEdges[i].Len + CurrentEdge.Elevation = vEdges[i].Elev + CurrentEdge.IsOpen = vEdges[i].Open CurrentEdge.IsStartOpen = ( vEdges[nPreviousEdgeIndex].Open) CurrentEdge.IsEndOpen = ( vEdges[nNextEdgeIndex].Open) - CurrentEdge.Id = j - 1 + CurrentEdge.Id = i - 1 + CurrentEdge.ptStart = Point3d( vEdges[i].Start) + CurrentEdge.ptEnd = Point3d( vEdges[nNextEdgeIndex].Start) + CurrentEdge.vtEdge = CurrentEdge.ptEnd - CurrentEdge.ptStart ; CurrentEdge.vtEdge:normalize() + CurrentEdge.Id = i - 1 + CurrentEdge.PreviousEdgeIndex = nPreviousEdgeIndex + CurrentEdge.NextEdgeIndex = nNextEdgeIndex if CurrentEdge.AdjacentFaceId == Proc.MainFaces.LongFace.Id then table.insert( Edges.LongEdges, CurrentEdge) @@ -5601,25 +5607,30 @@ function SawPlusChain.GetLongFaceEdges( Proc, Face) local nFaceType, vEdges = EgtSurfTmGetFacetOutlineInfo( Proc.Id, Face.Id, GDB_ID.ROOT) if nFaceType < 1 then - for j = 1, #vEdges do - local nPreviousEdgeIndex = j - 1 - if j == 1 then + for i = 1, #vEdges do + local nPreviousEdgeIndex = i - 1 + if i == 1 then nPreviousEdgeIndex = #vEdges end - local nNextEdgeIndex = j + 1 - if j == #vEdges then + local nNextEdgeIndex = i + 1 + if i == #vEdges then nNextEdgeIndex = 1 end local CurrentEdge = {} - CurrentEdge.AdjacentFaceId = vEdges[j].Adj - CurrentEdge.ToolDirection = Vector3d( vEdges[j].Norm) - CurrentEdge.Length = vEdges[j].Len - CurrentEdge.Elevation = vEdges[j].Elev - CurrentEdge.IsOpen = vEdges[j].Open + CurrentEdge.AdjacentFaceId = vEdges[i].Adj + CurrentEdge.ToolDirection = Vector3d( vEdges[i].Norm) + CurrentEdge.Length = vEdges[i].Len + CurrentEdge.Elevation = vEdges[i].Elev + CurrentEdge.IsOpen = vEdges[i].Open CurrentEdge.IsStartOpen = ( vEdges[nPreviousEdgeIndex].Open) CurrentEdge.IsEndOpen = ( vEdges[nNextEdgeIndex].Open) - CurrentEdge.Id = j - 1 + CurrentEdge.ptStart = Point3d( vEdges[i].Start) + CurrentEdge.ptEnd = Point3d( vEdges[nNextEdgeIndex].Start) + CurrentEdge.vtEdge = CurrentEdge.ptEnd - CurrentEdge.ptStart ; CurrentEdge.vtEdge:normalize() + CurrentEdge.Id = i - 1 + CurrentEdge.PreviousEdgeIndex = nPreviousEdgeIndex + CurrentEdge.NextEdgeIndex = nNextEdgeIndex if Proc.Topology == 'Tunnel' then if CurrentEdge.AdjacentFaceId > -1 then @@ -5651,7 +5662,7 @@ function SawPlusChain.GetLongFaceEdges( Proc, Face) end -function SawPlusChain.CalculateLeadInOut( Machining, EdgeToMachine) +function SawPlusChain.CalculateLeadInOut( Machining, EdgeToMachine, FaceToMachine, b3Raw) -- TODO implementare le funzioni di Tool Collision Avoidance (vedi wiki e FacesBysaw -> CalcLeadInOutPerpGeom) -- si determina l'eventuale riduzione da applicare in caso di inizio o fine chiusi @@ -5702,6 +5713,37 @@ function SawPlusChain.CalculateLeadInOut( Machining, EdgeToMachine) LeadIn.StartAddLength = BD.CUT_EXTRA LeadOut.EndAddLength = BD.CUT_EXTRA end + local vtN = Vector3d( FaceToMachine.VtN) + local vtOrthO + if EdgeToMachine.Elevation > - 10 * GEO.EPS_SMALL then + vtOrthO = Vector3d( EdgeToMachine.ToolDirection) + else + vtOrthO = -Vector3d( EdgeToMachine.ToolDirection) + end + local ptP1 = Point3d( FaceToMachine.Edges.BottomEdge.ptStart) + local ptP2 = Point3d( FaceToMachine.Edges.BottomEdge.ptEnd) + local vtV1 = -Vector3d( FaceToMachine.Edges.SideEdges.StartEdge.vtEdge) + local vtV2 = Vector3d( FaceToMachine.Edges.SideEdges.EndEdge.vtEdge) + + local bInvert = Machining.Invert + if bInvert then + ptP1, ptP2 = ptP2, ptP1 + vtV1, vtV2 = vtV2, vtV1 + end + local vtTg = ptP2 - ptP1 ; vtTg:normalize() + Machining.vtTg = vtTg + Machining.vtV = vtV1 + + -- Versore di riferimento + local vtRef = Vector3d( vtTg) + vtRef:rotate( vtN, EgtIf( bInvert, -90, 90)) + + local b3Box = BBox3d( b3Raw) + b3Box:expand( BD.CUT_SIC) + local ptPa1 = ptP1 + LeadIn.StartAddLength * -vtTg + local ptPa2 = ptP2 + LeadOut.EndAddLength * vtTg + + LeadIn.TangentDistance, LeadIn.PerpDistance, LeadOut.TangentDistance, LeadOut.PerpDistance = Fbs.CalcLeadInOutPerpGeom( ptPa1, ptPa2, vtV1, vtV2, vtN, ( Machining.Tool.Diameter / 2), vtRef, -Machining.RadialOffset, b3Box) else if Machining.IsStartClosed then LeadIn.StartAddLength = -dAddLengthToReduce @@ -5835,11 +5877,12 @@ function SawPlusChain.Saw.GetSCC( vtMachiningDirection) end -function SawPlusChain.Saw.CalculateMachiningParameters( Proc, FaceToMachine, EdgeToMachine) +function SawPlusChain.Saw.CalculateMachiningParameters( Proc, FaceToMachine, EdgeToMachine, b3Raw) local Cutting = {} Cutting.CanApply = true Cutting.Message = '' Cutting.ProcId = Proc.Id + EdgeToMachine.FaceId = FaceToMachine.Id local dPocketHeight = 0 if Proc.Topology == 'Tunnel' then @@ -5959,7 +6002,7 @@ function SawPlusChain.Saw.CalculateMachiningParameters( Proc, FaceToMachine, Edg Cutting.BlockedAxis.VtN = FaceToMachine.VtN Cutting.BlockedAxis.VtOut = EgtIf( FaceToMachine.VtN:getX() > 0, X_AX(), -X_AX()) -- approccio e retrazione - Cutting.LeadIn, Cutting.LeadOut = SawPlusChain.CalculateLeadInOut( Cutting, EdgeToMachine) + Cutting.LeadIn, Cutting.LeadOut = SawPlusChain.CalculateLeadInOut( Cutting, EdgeToMachine, FaceToMachine, b3Raw) -- eventuale step orizzontale Cutting.HorizontalSteps = {} if Cutting.Tool.SideStep then @@ -5993,15 +6036,25 @@ function SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw) local bIsCuttingOk = false local sCuttingOriginalMessage = Cutting.Message or '' local sCuttingApplyMessage = '' - + local vtTg = Cutting.vtTg + local bInvert = Cutting.Invert local dOriginalRadialOffset = Cutting.RadialOffset local dOriginalLeadInPerpDistance = Cutting.LeadIn.PerpDistance + local dOriginalLeadInTangDistance = Cutting.LeadIn.TangentDistance local dOriginalLeadOutPerpDistance = Cutting.LeadOut.PerpDistance + local dOriginalLeadOutTangDistance = Cutting.LeadOut.TangentDistance + for i = Cutting.HorizontalSteps.Count, 1, -1 do Cutting.RadialOffset = dOriginalRadialOffset + Cutting.HorizontalSteps.StepLength * ( i - 1) + local dOrthoOffsetStep = ( Cutting.RadialOffset * ( Cutting.vtV * vtTg)) -- update distanza perpendicolare attacco per contemplare l'offset applicato Cutting.LeadIn.PerpDistance = dOriginalLeadInPerpDistance - Cutting.RadialOffset + Cutting.LeadIn.TangentDistance = dOriginalLeadInTangDistance + dOrthoOffsetStep + Cutting.LeadIn.StartAddLength Cutting.LeadOut.PerpDistance = dOriginalLeadOutPerpDistance - Cutting.RadialOffset + Cutting.LeadOut.TangentDistance = dOriginalLeadOutTangDistance - dOrthoOffsetStep - Cutting.LeadOut.EndAddLength + + Cutting.LeadIn.StartAddLength = Cutting.LeadIn.StartAddLength - dOrthoOffsetStep - Cutting.LeadIn.StartAddLength + Cutting.LeadOut.EndAddLength = Cutting.LeadOut.EndAddLength + dOrthoOffsetStep + Cutting.LeadOut.EndAddLength -- applicazione lavorazione bIsCuttingOk, sCuttingApplyMessage = SawPlusChain.ApplyMachining( Cutting, b3Raw) -- update messaggi @@ -6243,9 +6296,9 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId) -- lavorazione di lama - fondo della tasca o fino a massimo materiale se tunnel local Cutting = {} if Proc.Topology == 'Tunnel' then - Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.OppositeEdges[1]) + Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.OppositeEdges[1], b3Raw) else - Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.BottomEdge) + Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.BottomEdge, b3Raw) end local bIsCuttingOk = false if Cutting.CanApply then @@ -6257,7 +6310,7 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId) local dBottomDepthToMachine = Cutting.RadialOffset -- lato opposto del tunnel if Proc.Topology == 'Tunnel' then - Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.OppositeEdges[2]) + Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.OppositeEdges[2], b3Raw) bIsCuttingOk = false if Cutting.CanApply then bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw) @@ -6270,7 +6323,7 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId) if Cutting.CanApply and Cutting.RadialOffset > 10 * GEO.EPS_SMALL then -- eventuale lavorazione di lama - lato della tasca da cui inizia la lavorazione if Proc.MainFaces.LongFace.Edges.BottomEdge.IsStartOpen then - Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.SideEdges.StartEdge) + Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.SideEdges.StartEdge, b3Raw) bIsCuttingOk = false if Cutting.CanApply then bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw) @@ -6281,7 +6334,7 @@ function SawPlusChain.Make( bOnlySaw, Proc, nRawId) end -- eventuale lavorazione di lama - lato della tasca in cui finisce la lavorazione if Proc.MainFaces.LongFace.Edges.BottomEdge.IsEndOpen then - Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.SideEdges.EndEdge) + Cutting = SawPlusChain.Saw.CalculateMachiningParameters( Proc, Proc.MainFaces.LongFace, Proc.MainFaces.LongFace.Edges.SideEdges.EndEdge, b3Raw) bIsCuttingOk = false if Cutting.CanApply then bIsCuttingOk, Cutting.Message = SawPlusChain.Saw.ApplyAllSteps( Cutting, b3Raw) @@ -6710,60 +6763,66 @@ local function AddMillCorner( vFace, Proc, dToolDiam, nAddGrpId, nMasterNewProc, -- aggiungo geometria local j = EgtIf( i < #vFace, i + 1, EgtIf( bClosed, 1, nil)) if not j then return true end - local nFace2 = vFace[j].Fac - -- punto in comune tra le due facce (punto precedente della faccia [j]) - ptLoc1 = vFace[j].PPrev - -- punto precedente (punto precedente della faccia [i]) - if vFace[i].PPrev then - ptLoc3 = vFace[i].PPrev - else - if abs( vtN:getZ()) > abs( vtN:getY()) then - ptLoc3 = Point3d( vFace[i].Cen:getX(), vFace[i].Cen:getY(), ptLoc1:getZ()) + if vFace[j].PPrev then + local nFace2 = vFace[j].Fac + -- punto in comune tra le due facce (punto precedente della faccia [j]) + ptLoc1 = vFace[j].PPrev + -- punto precedente (punto precedente della faccia [i]) + if vFace[i].PPrev then + ptLoc3 = vFace[i].PPrev + elseif vFace[i].PNoPrev then + ptLoc3 = vFace[i].PNoPrev else - ptLoc3 = Point3d( vFace[i].Cen:getX(), ptLoc1:getY(), vFace[i].Cen:getZ()) + if abs( vtN:getZ()) > abs( vtN:getY()) then + ptLoc3 = Point3d( vFace[i].Cen:getX(), vFace[i].Cen:getY(), ptLoc1:getZ()) + else + ptLoc3 = Point3d( vFace[i].Cen:getX(), ptLoc1:getY(), vFace[i].Cen:getZ()) + end end - end - -- punto successivo ( precedente della faccia successiva) - local k = EgtIf( j < #vFace, j + 1, EgtIf( bClosed, 1, nil)) - -- se è un percorso aperto prendo il punto medio della seconda faccia come punto locale 2 - if not k then - if abs( vtN:getZ()) > abs( vtN:getY()) then - ptLoc2 = Point3d( vFace[j].Cen:getX(), vFace[j].Cen:getY(), ptLoc1:getZ()) + -- punto successivo ( precedente della faccia successiva) + local k = EgtIf( j < #vFace, j + 1, 1) + -- se è un percorso aperto prendo il punto medio della seconda faccia come punto locale 2 + if not bClosed then + if vFace[j].PNoSucc then + ptLoc2 = vFace[j].PNoSucc + elseif abs( vtN:getZ()) > abs( vtN:getY()) then + ptLoc2 = Point3d( vFace[j].Cen:getX(), vFace[j].Cen:getY(), ptLoc1:getZ()) + else + ptLoc2 = Point3d( vFace[j].Cen:getX(), ptLoc1:getY(), vFace[j].Cen:getZ()) + end else - ptLoc2 = Point3d( vFace[j].Cen:getX(), ptLoc1:getY(), vFace[j].Cen:getZ()) + ptLoc2 = vFace[k].PPrev end - else - ptLoc2 = vFace[k].PPrev - end - -- ricavo i punti e l'angolo interno - local _, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( nNewProc.Id, nFace1, nFace2, GDB_ID.ROOT) - -- se punti validi e angolo è interno e non è quasi piatto e >= 90 creo istanza - local tFacAdj = {} - if ptP1 and ptP2 and dAng < 0 and dAng < -6 and dAng > -( 90 + 10 * GEO.EPS_SMALL) then - local dLen = dist( ptP1, ptP2) - tFacAdj = { nFace1, nFace2, dLen, ptP1, ptP2, dAng, ptLoc1, ptLoc2, ptLoc3} - end - -- se ho un elemento creo percorso o percorsi in base al tipo di cono e all'apertura dall'angolo rispetto ai 90° - -- con una tolleranza di 2 gradi - if #tFacAdj > 0 then - if (dAng + 90) > 2 then - local dAngOffs = (dAng + 90) / 2 - -- primo taglio - local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nAddGrpId, - dToolDiam, sMilling, -dAngOffs, - ToolData, bMakeLocSurf, vFace, vtN) - if not bOk then return bOk, sErr end - -- secondo taglio - bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nAddGrpId, - dToolDiam, sMilling, dAngOffs, - ToolData, bMakeLocSurf, vFace, vtN) - if not bOk then return bOk, sErr end - -- altrimenti ho un solo percorso - else - local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nAddGrpId, - dToolDiam, sMilling, 0, - ToolData, bMakeLocSurf, vFace, vtN) - if not bOk then return bOk, sErr end + -- ricavo i punti e l'angolo interno + local _, ptP1, ptP2, dAng = EgtSurfTmFacetsContact( nNewProc.Id, nFace1, nFace2, GDB_ID.ROOT) + -- se punti validi e angolo è interno e non è quasi piatto e >= 90 creo istanza + local tFacAdj = {} + if ptP1 and ptP2 and dAng < 0 and dAng < -6 and dAng > -( 90 + 10 * GEO.EPS_SMALL) then + local dLen = dist( ptP1, ptP2) + tFacAdj = { nFace1, nFace2, dLen, ptP1, ptP2, dAng, ptLoc1, ptLoc2, ptLoc3} + end + -- se ho un elemento creo percorso o percorsi in base al tipo di cono e all'apertura dall'angolo rispetto ai 90° + -- con una tolleranza di 2 gradi + if #tFacAdj > 0 then + if (dAng + 90) > 2 then + local dAngOffs = (dAng + 90) / 2 + -- primo taglio + local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nAddGrpId, + dToolDiam, sMilling, -dAngOffs, + ToolData, bMakeLocSurf, vFace, vtN) + if not bOk then return bOk, sErr end + -- secondo taglio + bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nAddGrpId, + dToolDiam, sMilling, dAngOffs, + ToolData, bMakeLocSurf, vFace, vtN) + if not bOk then return bOk, sErr end + -- altrimenti ho un solo percorso + else + local bOk, sErr = AddMillCornerMachining( Proc.PartId, nNewProc, nFacInd, tFacAdj, nAddGrpId, + dToolDiam, sMilling, 0, + ToolData, bMakeLocSurf, vFace, vtN) + if not bOk then return bOk, sErr end + end end end end @@ -6799,7 +6858,60 @@ local function GetOtherRegions( nPartId) end --------------------------------------------------------------------- -local function GetFacesData( nNewProc, dToolDiam, dToolMaxDepth, dToolThick, nAddGrpId, nPartId, vtNBottom) +local function GetCleanCornerFacesData( nNewProc, dToolDiam, dToolMaxDepth, dToolThick, nAddGrpId, nPartId, vtNBottom, Proc) + + local function GetCleanCornerPointIfNoAdj( nNewProc, Proc, nFac, vFace, ptAdjP1, ptAdjP2) + local ptPNoPrev + local bAdj, ptLocP1, ptLocP2, dAng + if not ptAdjP1 and not ptAdjP2 then + bAdj, ptLocP1, ptLocP2, dAng = EgtSurfTmFacetsContact( nNewProc, nFac+1, nFac, GDB_ID.ROOT) + else + bAdj = true + ptLocP1 = ptAdjP1 + ptLocP2 = ptAdjP2 + end + if bAdj then + local vEdges = BL.GetEdgesInfo( nNewProc, nFac) + for j = 1, #vEdges do + if #vEdges == 4 and ( not AreSamePointApprox( vEdges[j].ptStart, ptLocP1) and not AreSamePointApprox( vEdges[j].ptStart, ptLocP2)) and + ( not AreSamePointApprox( vEdges[j].ptEnd, ptLocP1) and not AreSamePointApprox( vEdges[j].ptEnd, ptLocP2)) then + -- se rivolto verso Z + if abs( vtNBottom:getZ()) > abs( vtNBottom:getY()) then + if vEdges[j].ptStart:getZ() < vEdges[j].ptEnd:getZ() then + ptPNoPrev = vEdges[j].ptStart + break + else + ptPNoPrev = vEdges[j].ptEnd + break + end + else + if vtNBottom:getY() > 0 then + ptPNoPrev = EgtIf( vEdges[j].ptStart:getY() < vEdges[j].ptEnd:getY(), vEdges[j].ptStart, vEdges[j].ptEnd) + break + else + ptPNoPrev = EgtIf( vEdges[j].ptStart:getY() > vEdges[j].ptEnd:getY(), vEdges[j].ptStart, vEdges[j].ptEnd) + break + end + end + elseif #vEdges == 3 then + if not AreSamePointApprox( vEdges[j].ptStart, ptLocP1) then + ptPNoPrev = vEdges[j].ptStart + break + elseif not AreSamePointApprox( vEdges[j].ptStart, ptLocP2) then + ptPNoPrev = vEdges[j].ptStart + break + elseif not AreSamePointApprox( vEdges[j].ptEnd, ptLocP1) then + ptPNoPrev = vEdges[j].ptEnd + break + elseif not AreSamePointApprox( vEdges[j].ptEnd, ptLocP2) then + ptPNoPrev = vEdges[j].ptEnd + break + end + end + end + end + return ptPNoPrev + end local nNumFacet = EgtSurfTmFacetCount( nNewProc) local vFace = {} @@ -6816,14 +6928,17 @@ local function GetFacesData( nNewProc, dToolDiam, dToolMaxDepth, dToolThick, nAd local _, dLen, dWidth = BL.GetFaceHvRefDim( nNewProc, nFac) -- recupero l'angolo con la faccia precedente local bAdj, ptLocP1, ptLocP2, dAng = EgtSurfTmFacetsContact( nNewProc, nPrecFac, nFac, GDB_ID.ROOT) + -- salvo i dati + vFace[i] = { Fac = nFac, Cen = ptCen, Norm = vtN, Len = dLen, Width = dWidth, AngPrev = EgtIf( bAdj, dAng, 0)} + if not bAdj then + vFace[i].PNoPrev = GetCleanCornerPointIfNoAdj( nNewProc, Proc, nFac, vFace[i], nil, nil) + end -- verifico che l'adiacenza sia veramente con il precedente (percorro con normale a destra) if bAdj then if ( vtN ^ ( ptLocP1 - ptCen)) * vtNBottom > 0 then bAdj = false end end - -- salvo i dati - vFace[i] = { Fac = nFac, Cen = ptCen, Norm = vtN, Len = dLen, Width = dWidth, AngPrev = EgtIf( bAdj, dAng, 0)} if bAdj then -- se rivolto verso Z if abs( vtNBottom:getZ()) > abs( vtNBottom:getY()) then @@ -6839,6 +6954,10 @@ local function GetFacesData( nNewProc, dToolDiam, dToolMaxDepth, dToolThick, nAd vFace[i].PPrev = EgtIf( ptLocP1:getY() > ptLocP2:getY(), ptLocP1, ptLocP2) end end + local bAdj_2, ptLocP1_2, ptLocP2_2, dAng_2 = EgtSurfTmFacetsContact( nNewProc, nFac, nFac+1, GDB_ID.ROOT) + if not bAdj_2 then + vFace[i].PNoSucc = GetCleanCornerPointIfNoAdj( nNewProc, Proc, nFac, vFace[i], ptLocP1, ptLocP2) + end end end -- analizzo le facce @@ -7545,7 +7664,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa if sPocketing then nChoosenFacInd = nFacInd dChoosenFacElev = dFacElev - local Edges = BL.GetEdgesInfo( Proc, Proc.Face[nFacInd+1]) + local Edges = BL.GetEdgesInfo( Proc, Proc.Face[nFacInd+1].Id) local nSideInd for i = 1, #Edges do if Edges[i].AdjacentFaceId == nFacInd2 then @@ -8185,7 +8304,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa -- normale della lavorazione clean corner vtN = vtSpec end - local vFace, dDepth = GetFacesData( nNewProc, dDiamTool, dMaxToolMaterial, ( dDiamTool/2), nAddGrpId, Proc.PartId, vtN) + local vFace, dDepth = GetCleanCornerFacesData( nNewProc, dDiamTool, dMaxToolMaterial, ( dDiamTool/2), nAddGrpId, Proc.PartId, vtN, Proc) local bCleanCornerOk, sCleanCornerWarn = AddMillCorner( vFace, Proc, dDiamTool, nAddGrpId, nNewProc, vtN) if not bCleanCornerOk then return false, sCleanCornerWarn end if sCleanCornerWarn then @@ -8428,7 +8547,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa -- normale della lavorazione clean corner vtN = vtSpec end - local vFace, dDepth = GetFacesData( nNewProc, dToolDiameter, dMaxToolMaterial, ( dToolDiameter/2), nAddGrpId, Proc.PartId, vtN) + local vFace, dDepth = GetCleanCornerFacesData( nNewProc, dToolDiameter, dMaxToolMaterial, ( dToolDiameter/2), nAddGrpId, Proc.PartId, vtN, Proc) local bCleanCornerOk, sCleanCornerWarn = AddMillCorner( vFace, Proc, dToolDiameter, nAddGrpId, nNewProc, vtN) if not bCleanCornerOk then return false, sCleanCornerWarn end if sCleanCornerWarn then