diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 8676b0f..28abade 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -343,6 +343,8 @@ local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT) Proc.Box = EgtGetBBoxGlob( ProcId, GDB_BB.STANDARD) if b3Raw then local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( PartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) + -- id della feature btl + Proc.FeatureId = EgtGetInfo( Proc.Id, 'PRID', 's') -- recupero l'elenco delle facce della parte interessate dalla feature Proc.AffectedFaces = BL.GetProcessAffectedFaces( Proc) -- recupero informazioni sulle facce della feature diff --git a/LuaLibs/FeatureTopology.lua b/LuaLibs/FeatureTopology.lua index 5426c5d..ef9e1cc 100644 --- a/LuaLibs/FeatureTopology.lua +++ b/LuaLibs/FeatureTopology.lua @@ -249,6 +249,7 @@ function FeatureTopology.Classify( Proc, b3Raw) Proc.IsThrough = bIsThrough Proc.AllRightAngles = bAllRightAngles Proc.IsParallel = bIsParallel + Proc.vAdj = vAdj return true else Proc.Topology = 'OTHER' diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index 08040d7..629d1ef 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -172,6 +172,7 @@ local function AssignQIdent( Proc) Q_ANTISPLINT_TYPE = '' Q_MAX_ELEVATION = 'Q10' Q_STAIRCASE = '' + Q_SAW_PLUS_CHAIN = '' if ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 16 then Q_FORCE_BLADE = 'Q01' -- i @@ -4580,6 +4581,153 @@ local function MakeTunnelByChainSaw( Proc, sSawing, nLundIdFace, vtOrtho, dWorkD return true end +--------------------------------------------------------------------- +local function MakeBySawPlusChain( Proc, sTopologyLongName, b3Raw) + + if sTopologyLongName == 'Pocket-Blind-RightAngles-Parallel-5' then + + -- se tasca su faccia sotto la strategia non è applicabile (la sega a catena in generale non può lavorare da sotto) + if Proc.AffectedFaces.Bottom then + local sErr = 'Feature '.. Proc.FeatureId .. ': Strategy not applicable - pocket on bottom face' + return false, sErr + end + + -- faccia da lavorare, la stessa per lama e motosega + do + Proc.Pocket = {} + -- faccia di fondo + local vBottomFace = Topology.GetFacesWithGivenAdjacencyNumber( Proc, Proc.vAdj, 4) + Proc.Pocket.BottomFace = {} + Proc.Pocket.BottomFace.Id = vBottomFace[1] + Proc.Pocket.BottomFace.Width = Proc.Face[ Proc.Pocket.BottomFace.Id + 1].Width + Proc.Pocket.BottomFace.Height = Proc.Face[ Proc.Pocket.BottomFace.Id + 1].Height + Proc.Pocket.BottomFace.Elevation = Proc.Face[ Proc.Pocket.BottomFace.Id + 1].Elevation + Proc.Pocket.BottomFace.vtN = Proc.Face[ Proc.Pocket.BottomFace.Id + 1].VtN + if Proc.Pocket.BottomFace.Height > Proc.Pocket.BottomFace.Width then + Proc.Pocket.BottomFace.Width, Proc.Pocket.BottomFace.Height = Proc.Pocket.BottomFace.Height, Proc.Pocket.BottomFace.Width + end + -- facce adiacenti a quella di fondo + local vFacesAdjacentToBottom = EgtSurfTmFacetAdjacencies( Proc.Id, Proc.Pocket.BottomFace.Id)[1] + -- si cerca la faccia adiacente a quella di fondo sul lato lungo + local dMaxLen = 0 + for i = 1, #vFacesAdjacentToBottom do + local _, ptP1, ptP2 = EgtSurfTmFacetsContact( Proc.Id, Proc.Pocket.BottomFace.Id, vFacesAdjacentToBottom[i], GDB_ID.ROOT) + local dLen = dist( ptP1, ptP2) + if dLen > dMaxLen then + Proc.Pocket.FaceToMachine = vFacesAdjacentToBottom[i] + dMaxLen = dLen + end + end + end + + -- caratteristiche della tasca + Proc.Pocket.Width = Proc.Pocket.BottomFace.Width + Proc.Pocket.Height = Proc.Pocket.BottomFace.Height + Proc.Pocket.Depth = Proc.Pocket.BottomFace.Elevation + Proc.Pocket.Direction = Proc.Pocket.BottomFace.vtN + + -- lavorazione di lama e relativi dati + local Cutting = {} + Cutting.Tool = {} + Cutting.Name, Cutting.IsDownHead = ML.FindCutting( 'HeadSide') + Cutting.Tool.Diameter = 0 + Cutting.Tool.Thickness = 0 + Cutting.Tool.MaxDepth = 0 + if EgtMdbSetCurrMachining( Cutting.Name) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + Cutting.Tool.Diameter = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or Cutting.Tool.Diameter + Cutting.Tool.Thickness = EgtTdbGetCurrToolParam(MCH_TP.THICK) or Cutting.Tool.Thickness + Cutting.Tool.MaxDepth = EgtTdbGetCurrToolMaxDepth() or Cutting.Tool.MaxDepth + end + end + + -- lavorazione di sega a catena e relativi dati + local Chainsawing = {} + Chainsawing.Tool = {} + Chainsawing.Name, Chainsawing.IsDownHead = ML.FindSawing( 'Sawing') + Chainsawing.Tool.Length = 0 + Chainsawing.Tool.Width = 0 + Chainsawing.Tool.MaxMat = 0 + Chainsawing.Tool.Thickness = 0 + Chainsawing.Tool.CornerRadius = 0 + if EgtMdbSetCurrMachining( Chainsawing.Name) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + Chainsawing.Tool.Length = EgtTdbGetCurrToolParam( MCH_TP.LEN) or Chainsawing.Tool.Length + Chainsawing.Tool.MaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or Chainsawing.Tool.MaxMat + Chainsawing.Tool.Width = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or Chainsawing.Tool.Width + Chainsawing.Tool.Thickness = EgtTdbGetCurrToolParam( MCH_TP.THICK) or Chainsawing.Tool.Thickness + Chainsawing.Tool.CornerRadius = EgtTdbGetCurrToolParam( MCH_TP.CORNRAD) or Chainsawing.Tool.CornerRadius + end + end + + -- se tasca più stretta della lama la strategia non è applicabile + if Cutting.Tool.Diameter > Proc.Pocket.Width - 10 * GEO.EPS_SMALL then + local sErr = 'Feature '.. Proc.FeatureId .. ': Strategy not applicable - pocket too narrow for saw blade diameter' + return false, sErr + end + + -- se tasca più stretta della sega a catena la strategia non è applicabile + if Chainsawing.Tool.Width > Proc.Pocket.Width - 10 * GEO.EPS_SMALL then + local sErr = 'Feature '.. Proc.FeatureId .. ': Strategy not applicable - pocket too narrow for chainsaw width' + return false, sErr + end + + -- se tasca meno spessa della lama la strategia non è applicabile + if Cutting.Tool.Thickness > Proc.Pocket.Height - 10 * GEO.EPS_SMALL then + local sErr = 'Feature '.. Proc.FeatureId .. ': Strategy not applicable - pocket too narrow for saw blade thickness' + return false, sErr + end + + -- se tasca meno spessa della sega a catena la strategia non è applicabile + if Chainsawing.Tool.Thickness > Proc.Pocket.Height - 10 * GEO.EPS_SMALL then + local sErr = 'Feature '.. Proc.FeatureId .. ': Strategy not applicable - pocket too narrow for chainsaw thickness' + return false, sErr + end + + -- parametri della lavorazione con lama + -- profondità e offset radiale + if Cutting.Tool.MaxDepth > Proc.Pocket.Depth - 10 * GEO.EPS_SMALL then + Cutting.Depth = Proc.Pocket.Depth + Cutting.RadialOffset = 0 + else + Cutting.Depth = Cutting.Tool.MaxDepth + Cutting.RadialOffset = Proc.Pocket.Depth - Cutting.Depth + end + -- faceuse + Cutting.Direction = Proc.Pocket.Direction + -- approccio e retrazione + Cutting.LeadIn = {} + Cutting.LeadOut = {} + Cutting.LeadIn.Type = MCH_MILL_LI.LINEAR + Cutting.LeadOut.Type = MCH_MILL_LI.LINEAR + Cutting.LeadIn.StartAddLength = -sqrt( Cutting.Depth * Cutting.Tool.Diameter - Cutting.Depth * Cutting.Depth) + Cutting.LeadOut.StartAddLength = -sqrt( Cutting.Depth * Cutting.Tool.Diameter - Cutting.Depth * Cutting.Depth) + Cutting.LeadIn.TangentDistance = 0 + Cutting.LeadOut.TangentDistance = 0 + Cutting.LeadIn.PerpDistance = 1 + Cutting.LeadOut.PerpDistance = 1 + Cutting.LeadIn.Elevation = 0 + Cutting.LeadOut.Elevation = 0 + Cutting.LeadIn.CompLength = 0 + Cutting.LeadOut.CompLength = 0 + + -- lavorazione con lama + local bOk, sErr = Fbs.MakeOne( Proc.Id, Proc.Pocket.FaceToMachine, Cutting.Name, Cutting.Tool.Diameter, Cutting.Direction, 2, Cutting.RadialOffset, BD.CUT_SIC, 0, -Cutting.LeadIn.StartAddLength, -Cutting.LeadOut.StartAddLength, sNotes, b3Raw) + + return bOk, sErr + + elseif sTopologyLongName == 'Groove-Through-RightAngles-Parallel-3' then + return + elseif sTopologyLongName == 'Groove-Blind-RightAngles-Parallel-4' then + return + else + local sErr = 'Feature '.. Proc.FeatureId .. ' : Strategy not implemented for topology ' .. sTopologyLongName + return false, sErr + end +end + --------------------------------------------------------------------- local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePart, bPrevBhSideMill, bAllWithEndCap) if not BD.MAXDIAM_POCK_CORNER then @@ -4602,6 +4750,24 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa EgtOutLog( sErr) return false, sErr end + + + + + +-- rimuovere true or!!!!!! + if true or EgtGetInfo( Proc.Id, Q_SAW_PLUS_CHAIN, 'i') == 1 then --TEST + local bOk + local sErr + bOk, sErr = MakeBySawPlusChain( Proc, Proc.TopologyLongName, b3Raw) + return bOk, sErr + end + + + + + + local bClosedOrthoFaces local nFacInd, dFacElev, nFacInd2, dFacElev2 local nBottomFace