diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 28abade..85bc4f5 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -60,6 +60,8 @@ -- 2024/03/04 Creata funzione calcolo dipendenze tra feature con calcolo topologia. -- 2024/03/07 Implementate le lavorazioni in doppio per fori specchiati non passanti e DrillPocket. -- 2024/03/11 In CollectFeatures si scrive ora Width e Height della faccia sia trimmate con il grezzo che intere. +-- 2024/03/13 In CollectFeatures si scrive lunghezza foro su Proc e si controla se serve Predrill +-- In OrderFeature, preforo sempre prima del foro -- Tabella per definizione modulo local BeamExec = {} @@ -371,14 +373,21 @@ local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT) end end end - if Proc.Box and not Proc.Box:isEmpty() then + if Proc.Box and not Proc.Box:isEmpty() then Proc.Head = IsHeadFeature( Proc, b3Raw, dCurrOvmH) Proc.Tail, Proc.AdvTail = IsTailFeature( Proc, b3Raw, dCurrOvmH, dCurrOvmT) table.insert( vProc, Proc) -- se foro if Drill.Identify( Proc) then -- assegno diametro e facce di ingresso e uscita (dati tabelle sempre per riferimento) - Proc.Diam, Proc.Fcs, Proc.Fce = Drill.GetData( Proc, b3Raw) + Proc.Diam, Proc.Len, Proc.Fcs, Proc.Fce = Drill.GetData( Proc, b3Raw) + -- verifico se devo inserire i prefori + if Drill.IsPredrillNeeded( Proc) then + local bAddProc, PredrillProc= Drill.AddPredrillFromDrillProc( Proc) + if bAddProc then + table.insert( vProc, PredrillProc) + end + end -- verifico se necessaria seconda lavorazione da parte opposta per foro più lungo della punta if Drill.Split( Proc, b3Raw) then -- aggiorno flags prima parte foro (dati tabelle sempre per riferimento) @@ -395,6 +404,7 @@ local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT) Proc2.Box = BBox3d( Proc.Box) Proc2.Fct = Proc.Fct Proc2.Diam = Proc.Diam + Proc2.Len = Proc.Len Proc2.Head = Drill.IsHeadFeature( Proc2, b3Raw, dCurrOvmH) Proc2.Tail = Drill.IsTailFeature( Proc2, b3Raw, dCurrOvmH) Proc2.Fcs = Proc.Fce @@ -404,6 +414,13 @@ local function CollectFeatures( PartId, b3Raw, dCurrOvmH, dCurrOvmT) Proc2.AdjId = Proc.AdjId Proc2.MainId = Proc.MainId table.insert( vProc, Proc2) + -- verifico se devo inserire i prefori + if Drill.IsPredrillNeeded( Proc2) then + local bAddProc, PredrillProc= Drill.AddPredrillFromDrillProc( Proc2) + if bAddProc then + table.insert( vProc, PredrillProc) + end + end end -- se BlockHaus HalfLap elseif Proc.Prc == 37 then @@ -924,7 +941,11 @@ local function OrderFeatures( vProc, b3Raw) end -- se entrambi fori con posizione praticamente uguale ordino secondo diametro e faccia di inizio (Fcs) if B1.Prc == 40 and B2.Prc == 40 and abs( B1.Box:getCenter():getX() - B2.Box:getCenter():getX()) < dSmallDrillRange then - if abs( B1.Diam - B2.Diam) < 1.0 then + if B1.IsPredrill and not B2.IsPredrill then + return true + elseif not B1.IsPredrill and B2.IsPredrill then + return false + elseif abs( B1.Diam - B2.Diam) < 1.0 then if B1.Fcs == B2.Fcs then if abs( B1.Box:getCenter():getX() - B2.Box:getCenter():getX()) < 1.0 then if abs( B1.Box:getCenter():getY() - B2.Box:getCenter():getY()) < 1.0 then @@ -1972,6 +1993,11 @@ local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw) end end + -- fori della stessa profondità + if abs( Proc.Len - ProcMirror.Len) > 10 * GEO.EPS_SMALL then + return false + end + return true end @@ -2049,7 +2075,7 @@ function BeamExec.ProcessFeatures() -- verifica presenza forature influenzate da lavorazioni di testa o coda if BD.IMPROVE_HEAD_TAIL_DRILLINGS then - vMachBeforeIntersDrillings = CalcHeadTailMachBeforeIntersDrillings( vProc, b3Raw) + local vMachBeforeIntersDrillings = CalcHeadTailMachBeforeIntersDrillings( vProc, b3Raw) SetDrillingsToMachineAfterHeadOrTailCut( vProc, vMachBeforeIntersDrillings) end -- verifica presenza di feature specchiate per eventuali lavorazioni simultanee diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 89c9b1c..f013fe2 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -13,6 +13,7 @@ -- 2024/01/23 Nella GetMachinings vengono ora raccolti i parametri utensile necessari per i VerifyTool, scritti direttamente nella tabella Machining.Tool. -- Le lavorazioni possono essere ora ordinate per dimensioni utensile (Longest, Shortest, Biggest, Smallest) se passato l'apposito parametro SortingCriterion in FindMachining. Al momento implementato solo per FindSawing. -- 2024/03/01 In VerifyPocketing implementato l'ordinamento per dimensioni utensile. +-- 2024/03/13 Aggiunta gestione Predrill -- Tabella per definizione modulo local MachiningLib = {} @@ -169,7 +170,7 @@ end --------------------------------------------------------------------- function VerifyTool( Machining, MachiningType, Params, bH2) if MachiningType == MCH_MY.DRILLING then - if Machining.SubType == 'Drill' or Machining.SubType == 'AngleDrill' then + if Machining.SubType == 'Drill' or Machining.SubType == 'AngleDrill' or Machining.SubType == 'Predrill' then return VerifyDrill( Machining, Params.Diam, Params.Depth, bH2) elseif Machining.SubType == 'DrillPocket' then return VerifyDrillPocket( Machining, Params.Diam, Params.Depth, bH2) @@ -225,6 +226,8 @@ function GetMachinings( MachiningType, sType) Machining.SubType = 'AngleDrill' elseif EgtStartsWith( Machining.Type, 'Pocket') then Machining.SubType = 'DrillPocket' + elseif EgtStartsWith( Machining.Type, 'Predrill') then + Machining.SubType = 'Predrill' end end Machining.Tool.Diameter = EgtTdbGetCurrToolParam( MCH_TP.DIAM) @@ -300,7 +303,7 @@ end function ReturnParams( MachiningType, MachiningName, sType, ToolParams) if MachiningType == MCH_MY.DRILLING then local _, sOrigType = EgtEndsWith( sType, '_H2') - return MachiningName, sType, EgtIf( sOrigType == 'Drill' or sOrigType == 'Drill_AT' or sOrigType == 'AngleDrill' , ToolParams.TMaxMat, ToolParams.TMaxDepth), ToolParams.MaxToolLength, ToolParams.ToolDiam, ToolParams.DiamTh, ToolParams.FreeLen + return MachiningName, sType, EgtIf( sOrigType == 'Drill' or sOrigType == 'Drill_AT' or sOrigType == 'AngleDrill' or sOrigType == 'Predrill' , ToolParams.TMaxMat, ToolParams.TMaxDepth), ToolParams.MaxToolLength, ToolParams.ToolDiam, ToolParams.DiamTh, ToolParams.FreeLen elseif MachiningType == MCH_MY.SAWING then return MachiningName, ToolParams.H2 elseif MachiningType == MCH_MY.MILLING then @@ -467,8 +470,15 @@ function MachiningLib.FindCutting( sType, bTopHead, bDownHead) end --------------------------------------------------------------------- -function MachiningLib.FindDrilling( dDiam, dDepth, bTopHead, bDownHead, bExcludeH2, bAngleTransmission) - local MachiningName, MachiningType, Param1, Param2, Param3, Param4, Param5 = FindMachining( MCH_MY.DRILLING, EgtIf( bAngleTransmission, 'Drill_AT', 'Drill'), { Diam = dDiam, Depth = dDepth}, bTopHead, bDownHead, bExcludeH2) +function MachiningLib.FindDrilling( dDiam, dDepth, bTopHead, bDownHead, bExcludeH2, bAngleTransmission, bIsPredrill) + local MachiningName, MachiningType, Param1, Param2, Param3, Param4, Param5, sTypeMach + -- se il foro è un predrill, cerco solo punte abilitate al Predrill + if bIsPredrill then + sTypeMach = 'Predrill' + else + sTypeMach = EgtIf( bAngleTransmission, 'Drill_AT', 'Drill') + end + MachiningName, MachiningType, Param1, Param2, Param3, Param4, Param5 = FindMachining( MCH_MY.DRILLING, sTypeMach, { Diam = dDiam, Depth = dDepth}, bTopHead, bDownHead, bExcludeH2) if ( not MachiningName or MachiningName == '') then MachiningName, MachiningType, Param1, Param2, Param3, Param4, Param5 = FindMachining( MCH_MY.DRILLING, EgtIf( bAngleTransmission, 'Pocket_AT', 'Pocket'), { Diam = dDiam, Depth = dDepth}, bTopHead, bDownHead) end diff --git a/LuaLibs/ProcessDrill.lua b/LuaLibs/ProcessDrill.lua index 2eb3f9b..d79395b 100644 --- a/LuaLibs/ProcessDrill.lua +++ b/LuaLibs/ProcessDrill.lua @@ -20,6 +20,8 @@ -- 2023/07/28 Aggiunta gestione rinvio 90deg solo per forature da sotto esattamente verticali. -- 2023/09/26 Se errore in applicazione lavorazione si inverte e riprova solo se foratura singola su foro aperto. -- 2023/11/06 Migliorata gestione dei fori con AngularTransmission. +-- 2024/03/13 Aggiunta gestione Predrill +-- 2024/03/18 Per Predrill corretta direzione estrusione per fori con direzione verso il basso -- Tabella per definizione modulo local ProcessDrill = {} @@ -96,20 +98,21 @@ end --------------------------------------------------------------------- -- Recupero dati foro e adattamento se speciale function ProcessDrill.GetData( Proc, b3Raw) + local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') -- verifico se foro da adattare if EgtExistsInfo( Proc.Id, 'DiamUser') then - local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') if AuxId then AuxId = AuxId + Proc.Id end if AuxId and EgtGetType( AuxId) == GDB_TY.CRV_ARC and BD.USER_HOLE_DIAM and BD.USER_HOLE_DIAM > 1 then EgtModifyArcRadius( AuxId, BD.USER_HOLE_DIAM / 2) end end - -- recupero diametro + -- recupero diametro e lunghezza local dDiam = EgtGetInfo( Proc.Id, 'P12', 'd') or 0 + local dLen = abs( EgtCurveThickness( Proc.Id + AuxId)) or 0 -- recupero faccia di entrata e uscita local nFcs = EgtGetInfo( Proc.Id, 'FCS', 'i') or 0 local nFce = EgtGetInfo( Proc.Id, 'FCE', 'i') or 0 - return dDiam, nFcs, nFce + return dDiam, dLen, nFcs, nFce end --------------------------------------------------------------------- @@ -139,6 +142,75 @@ function ProcessDrill.Split( Proc, b3Raw) return ( bOpen and ( bHoriz or BD.ROT90 or BD.DOWN_HEAD or BD.TURN or bAngTransm) and not bSlant) end +--------------------------------------------------------------------- +-- Verifica se bisogna aggiungere un preforo +function ProcessDrill.IsPredrillNeeded( Proc) + local dDepthPredrill = EgtGetInfo( Proc.Id, 'Q03', 'i') + -- se non c'è la Q oppure se zero, allora non è da fare + if not dDepthPredrill or dDepthPredrill <= 0 then + return false + -- altrimenti Predrill da fare + else + return true + end +end + +--------------------------------------------------------------------- +-- Aggiunge il preforo alla feature passata +function ProcessDrill.AddPredrillFromDrillProc( Proc) + local dDepthPredrill = EgtGetInfo( Proc.Id, 'Q03', 'i') + -- foro più corto del preforo, allora è il foro che diventa il preforo stesso + if Proc.Len <= dDepthPredrill then + Proc.IsPredrill = true + Proc.IsPredrillOf = Proc.Id + return false + -- altrimenti creo un nuovo process + else + -- recupero gruppo per geometria aggiuntiva + local nAddGrpId = BL.GetAddGroup( Proc.PartId) + -- recupero e verifico l'entità foro + local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') or 0 + local ptCen = EgtCP( Proc.Id + AuxId, GDB_RT.GLOB) + local vtExtr = EgtCurveExtrusion( Proc.Id + AuxId, GDB_RT.GLOB) + + -- copio foro originale + local nPreHoleId = EgtCopyGlob( Proc.Id, nAddGrpId) + local nPreHoleAux = EgtCopyGlob( Proc.Id + AuxId, nAddGrpId) + + -- se foro invertito sposto geometria dall'altro lato del foro e inverto direzione estrusione + if Proc.Flg == -2 then + local vsExtr = -vtExtr * Proc.Len + EgtMove( nPreHoleAux, vsExtr, GDB_RT.GLOB) + EgtModifyCurveExtrusion( nPreHoleAux, -vtExtr, GDB_RT.GLOB) + end + EgtModifyCurveThickness( nPreHoleAux, -dDepthPredrill) + + local PredrillProc = {} + -- definisco dati seconda parte + PredrillProc.PartId = Proc.PartId + PredrillProc.Id = nPreHoleId + PredrillProc.Grp = Proc.Grp + PredrillProc.Prc = Proc.Prc + PredrillProc.Flg = 1 + PredrillProc.Box = Proc.Box + PredrillProc.Fct = Proc.Fct + PredrillProc.Diam = Proc.Diam + PredrillProc.Len = dDepthPredrill + PredrillProc.Head = Proc.Head + PredrillProc.Tail = Proc.Tail + PredrillProc.Fcs = Proc.Fcs + PredrillProc.Fce = 0 -- il preforo è sempre chiuso, non ha faccia di uscita + PredrillProc.CutId = Proc.CutId + PredrillProc.TaskId = Proc.TaskId + PredrillProc.AdjId = Proc.AdjId + PredrillProc.MainId = Proc.MainId + PredrillProc.IsPredrill = true + PredrillProc.IsPredrillOf = Proc.Id + + return true, PredrillProc + end +end + --------------------------------------------------------------------- -- Classificazione della feature function ProcessDrill.Classify( Proc, b3Raw) @@ -289,15 +361,15 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) local bDrillUp = ( bDownDrill and vtExtr:getZ() > -0.421) local bExcludeH2 = false if Proc.Double and Proc.Double > 0 then - bMillUp = true + -- bMillUp = true bDrillDown = false bExcludeH2 = true end -- primo gruppo di controlli con lunghezza utensile pari a metà foro se passante -- recupero la lavorazione - local sDrilling, sType, dMaxDepth, dMaxToolLength, dToolDiam, dDiamTh, dToolFreeLen = ML.FindDrilling( dDiam, dCheckDepth, bDrillUp, bDrillDown, bExcludeH2, bDrillAngTrasm) + local sDrilling, sType, dMaxDepth, dMaxToolLength, dToolDiam, dDiamTh, dToolFreeLen = ML.FindDrilling( dDiam, dCheckDepth, bDrillUp, bDrillDown, bExcludeH2, bDrillAngTrasm, Proc.IsPredrill) if not sDrilling and dCheckDepth then - sDrilling, sType, dMaxDepth, dMaxToolLength, dToolDiam, dDiamTh, dToolFreeLen = ML.FindDrilling( dDiam, 0, bDrillUp, bDrillDown, bExcludeH2, bDrillAngTrasm) + sDrilling, sType, dMaxDepth, dMaxToolLength, dToolDiam, dDiamTh, dToolFreeLen = ML.FindDrilling( dDiam, 0, bDrillUp, bDrillDown, bExcludeH2, bDrillAngTrasm, Proc.IsPredrill) if sDrilling then dCheckDepth = nil end end if not sDrilling then @@ -454,7 +526,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) dMaxElev = dMaxDepth end -- inserisco la lavorazione - local sName = 'Drill_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) + local sName = EgtIf( EgtStartsWith( sType, 'Predrill'), 'Predrill_', 'Drill_') .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) local nMchId = EgtAddMachining( sName, sDrilling) if not nMchId then local sErr = 'Error adding machining ' .. sName .. '-' .. sDrilling @@ -464,7 +536,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) -- aggiungo geometria EgtSetMachiningGeometry( {{ AuxId, -1}}) -- eventuale inversione - if sType == 'Drill' or sType == 'Drill_H2' or sType == 'Drill_AT' or sType == 'AngleDrill' then + if sType == 'Drill' or sType == 'Drill_H2' or sType == 'Drill_AT' or sType == 'AngleDrill' or sType == 'Predrill' then EgtSetMachiningParam( MCH_MP.INVERT, bToInvert) else EgtSetMachiningParam( MCH_MP.TOOLINVERT, bToInvert) diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index 629d1ef..6464ccf 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -1,4 +1,4 @@ --- ProcessLapJoint.lua by Egaltech s.r.l. 2023/09/26 +-- ProcessLapJoint.lua by Egaltech s.r.l. 2024/03/15 -- Gestione calcolo mezzo-legno per Travi -- 2019/10/08 Agg. gestione OpenPocket. -- 2021/01/24 Con sega a catena ora sempre impostato asse A. @@ -99,6 +99,7 @@ -- 2024/02/29 In lapjoint 2 facce (TestTwoFacesDownHead) migliorata la scelta della lama da sotto. -- 2024/03/01 Migliorata VerifyPocket. -- 2024/03/04 Implementato attacco esterno se tasca 4 facce sulla coda ma nessun pezzo successivo. +-- 2024/03/15 Correzione a calcolo ingombro per feature basse e lunghe dalla testa. -- Tabella per definizione modulo local ProcessLapJoint = {} @@ -662,8 +663,10 @@ local function UpdateEncumbrance( Proc, nRawId, b3Raw, b3Solid) elseif Proc.Box:getCenter():getX() > b3Solid:getCenter():getX() then local dOffs = b3Solid:getMax():getX() - Proc.Box:getMin():getX() local dDist = b3Solid:getMax():getX() - Proc.Box:getMax():getX() - -- se concavo aumento la distanza (rimane una punta...) - --if dAngT < 0 then dDist = dDist + 10 end + -- se pinze a 45° e pinza abbastanza materiale, compenso comunque, ma solo inclinazione morse + if not bIsVertClamps and dDeltaZClamp > BD.VICE_MINH and BD.VICE_MAXH then + dOffs = min( dOffs, BD.VICE_MAXH - BD.VICE_MINH) + end BL.UpdateHCING( nRawId, dOffs, dDist) end end diff --git a/LuaLibs/ProcessMortise.lua b/LuaLibs/ProcessMortise.lua index 05cbddd..fecdfe7 100644 --- a/LuaLibs/ProcessMortise.lua +++ b/LuaLibs/ProcessMortise.lua @@ -442,7 +442,7 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) -- recupero i dati della curva e del profilo local dDepth = dMorH local bDownHead = ( BD.DOWN_HEAD and vtExtr:getZ() < 0.1) - local bToolInv = ( not bDownHead and vtExtr:getZ() < -0.1 and b3Aux:getDimZ() > b3Raw:getDimZ() - 5) + local bToolInv = ( not bDownHead and vtExtr:getZ() < -0.1 and Proc.Box:getDimZ() > b3Solid:getDimZ() - 5) local dExtra = 2 -- verifico se servono gli smussi. Se lavorazione principale di svuotatura significa che è solo da un lato diff --git a/UpdateLog.txt b/UpdateLog.txt index 3482c7c..70d6380 100644 --- a/UpdateLog.txt +++ b/UpdateLog.txt @@ -1,5 +1,12 @@ ==== Beam Update Log ==== +Versione 2.6c4 (18/03/2024) +- Fixed : correzioni a gestione prefori. + +Versione 2.6c3 (15/03/2024) +- Added : Aggiunta gestione prefori +- Fixed : in LapJoint correzione a calcolo ingombro per feature basse e lunghe dalla testa. + Versione 2.6c2 (12/03/2024) - Added : in Mortase Aggiunta possibilità di inserire lavorazione di smusso - Added : in FreeContour aggiunto smusso se lav. di svuotatura diff --git a/Version.lua b/Version.lua index 1bfb520..198380a 100644 --- a/Version.lua +++ b/Version.lua @@ -2,5 +2,5 @@ -- Gestione della versione di Beam NAME = 'Beam' -VERSION = '2.6c2' +VERSION = '2.6c4' MIN_EXE = '2.6a1'