diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 85a0666..674a259 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1,4 +1,4 @@ --- BeamExec.lua by Egaltech s.r.l. 2022/06/25 +-- BeamExec.lua by Egaltech s.r.l. 2022/07/27 -- Libreria esecuzione lavorazioni per Travi -- 2019/07/11 Aggiunta gestione stato rotazione di feature per TS3. -- 2019/09/04 Corretto controllo feature di testa e coda con sovramateriale di testa elevato. @@ -86,7 +86,7 @@ _G.package.loaded.ProcessTyroleanDovetail = nil _G.package.loaded.ProcessDovetail = nil _G.package.loaded.ProcessFreeContour = nil _G.package.loaded.ProcessDecor = nil -local BM = require( 'MachiningLib') +local ML = require( 'MachiningLib') local BL = require( 'BeamLib') local DC = require( 'DiceCut') local Fbs = require( 'FacesBySaw') @@ -387,6 +387,23 @@ end ------------------------------------------------------------------------------------------------------------- -- *** Inserimento delle travi nel grezzo *** +------------------------------------------------------------------------------------------------------------- +local function VerifyBigSectionCut( dRawW, dRawH) + local sCutting = ML.FindCutting( 'TailSide') + local dMaxDepth = 50 + if EgtMdbSetCurrMachining( sCutting or '') then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid or '') or '') then + dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth + end + end + local dMaxVertDepth = dMaxDepth - ( BD.DECR_VERT_CUT or 0) + local dDimYRef = EgtIf( dRawH < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL, dMaxDepth, abs( BD.MAX_DIM_HTCUT_HBEAM)) + local bBigSectionCut = ( dRawW > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) and + ( dRawH > EgtIf( BD.DOWN_HEAD or BD.TURN, 2, 1) * dMaxVertDepth - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) + return bBigSectionCut +end + ------------------------------------------------------------------------------------------------------------- function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, vBeam, bMachGroupOk) @@ -426,11 +443,8 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, vBeam, bMachGroup local DeltaS = dOvmHead local DeltaSMin = 0 local DeltaE = BD.OVM_MID - -- controllo sezione larga e alta per considerare taglio con sega - local bBigSectionCut = false - if BD.MAX_DIM_HTCUT and BD.CUT_EXTRA_MIN and ( dRawW > 2 * BD.MAX_DIM_HTCUT - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) and ( dRawH > 2 * BD.MAX_DIM_HTCUT - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) then - bBigSectionCut = true - end + -- controllo sezione larga e alta per considerare taglio con sega a catena + local bBigSectionCut = VerifyBigSectionCut( dRawW, dRawH) for i = 1, #vBeam do -- assegno identificativo pezzo local Pz = vBeam[i].Id diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 6105dc8..3eec184 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -369,17 +369,17 @@ end --------------------------------------------------------------------- function BeamLib.GetVersRef( nOrthoOpposite) - if nOrthoOpposite == MCH_MILL_FU.ORTHO_LEFT then + if nOrthoOpposite == MCH_MILL_FU.ORTHO_LEFT or nOrthoOpposite == MCH_MILL_FU.ORTUP_LEFT or nOrthoOpposite == MCH_MILL_FU.PARAL_LEFT then return X_AX() - elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_RIGHT then + elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_RIGHT or nOrthoOpposite == MCH_MILL_FU.ORTUP_RIGHT or nOrthoOpposite == MCH_MILL_FU.PARAL_RIGHT then return -X_AX() - elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_FRONT then + elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_FRONT or nOrthoOpposite == MCH_MILL_FU.ORTUP_FRONT or nOrthoOpposite == MCH_MILL_FU.PARAL_FRONT then return Y_AX() - elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_BACK then + elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_BACK or nOrthoOpposite == MCH_MILL_FU.ORTUP_BACK or nOrthoOpposite == MCH_MILL_FU.PARAL_BACK then return -Y_AX() - elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_DOWN then + elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_DOWN or nOrthoOpposite == MCH_MILL_FU.ORTUP_DOWN or nOrthoOpposite == MCH_MILL_FU.PARAL_DOWN then return Z_AX() - elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_TOP then + elseif nOrthoOpposite == MCH_MILL_FU.ORTHO_TOP or nOrthoOpposite == MCH_MILL_FU.ORTUP_TOP or nOrthoOpposite == MCH_MILL_FU.PARAL_TOP then return -Z_AX() end return nil diff --git a/LuaLibs/ProcessHeadCut.lua b/LuaLibs/ProcessHeadCut.lua index 4fd7316..966c6ed 100644 --- a/LuaLibs/ProcessHeadCut.lua +++ b/LuaLibs/ProcessHeadCut.lua @@ -1,4 +1,4 @@ --- ProcessSplit.lua by Egaltech s.r.l. 2022/06/07 +-- ProcessSplit.lua by Egaltech s.r.l. 2022/07/25 -- Gestione calcolo tagli di testa per Travi -- 2022/05/31 Aggiunta gestione sezioni alte e larghe con taglio di tipo diceCut. -- 2022/06/10 Per sezioni alte e larghe aggiunta gestione finitura in base a sovramateriale e a parametro Q05 dell' eventuale lavorazione sostituita. @@ -174,8 +174,9 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut end local dMaxVertDepth = dMaxDepth - ( BD.DECR_VERT_CUT or 0) -- caratteristiche taglio - local dDimYRef = EgtIf( b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL, dMaxDepth, BD.MAX_DIM_HTCUT_HBEAM) - local bBigSectionCut = ( b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) and ( b3Raw:getDimZ() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) + local dDimYRef = EgtIf( b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL, dMaxDepth, abs( BD.MAX_DIM_HTCUT_HBEAM)) + local bBigSectionCut = ( b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) and + ( b3Raw:getDimZ() > EgtIf( BD.DOWN_HEAD or BD.TURN, 2, 1) * dMaxVertDepth - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) local bHorizCut = ( not bBigSectionCut and ( b3Raw:getDimY() > b3Raw:getDimZ() + 10 * GEO.EPS_SMALL or BD.TURN) and b3Raw:getDimZ() < dMaxVertDepth - BD.CUT_EXTRA) local bDoubleHorizCut = ( ( BD.DOWN_HEAD or BD.TURN) and not bBigSectionCut and not bHorizCut and b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) local bDoubleCut = ( not bBigSectionCut and not bHorizCut and not bDoubleHorizCut and b3Raw:getDimY() > dDimYRef - BD.CUT_EXTRA + 10 * GEO.EPS_SMALL) diff --git a/LuaLibs/ProcessSplit.lua b/LuaLibs/ProcessSplit.lua index 75cf220..5683299 100644 --- a/LuaLibs/ProcessSplit.lua +++ b/LuaLibs/ProcessSplit.lua @@ -1,4 +1,4 @@ --- ProcessSplit.lua by Egaltech s.r.l. 2022/06/07 +-- ProcessSplit.lua by Egaltech s.r.l. 2022/07/26 -- Gestione calcolo tagli di separazione per Travi -- 2022/05/31 Aggiunta gestione sezioni alte e larghe con taglio con sega a catena seguito da rifinitura con lama (aggiunta funzione MakeSplitByChainSaw); gestione eventuale creazione nuova fase dall'interno della Make. -- 2022/06/10 Per sezioni alte e larghe aggiunta gestione finitura in base a sovramateriale e a parametro Q05 dell' eventuale lavorazione sostituita. @@ -148,7 +148,7 @@ end -- lavorazione con sega a catena per sezioni alte e larghe local function MakeSplitByChainSaw( nSurfId, nFaceUse, dDepth, sNotes, dOffs) -- Recupero i dati dell'utensile - local sSawing = ML.FindSawing('Sawing') + local sSawing = ML.FindSawing( 'Sawing') local dMaxMat = 0 local dSawCornerRad = 0 local dSawThick = 0 @@ -182,10 +182,10 @@ local function MakeSplitByChainSaw( nSurfId, nFaceUse, dDepth, sNotes, dOffs) -- imposto uso del lato faccia EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse) -- imposto angolo 3° asse rot - EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, BL.GetChainSawBlockedAxis( 2)) + EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, BL.GetChainSawBlockedAxis( 1)) local _, vtN = EgtSurfTmFacetCenter( nSurfId, 0, GDB_ID.ROOT) - vtOrthO = BL.GetVersRef( nFaceUse) - EgtSetMachiningParam( MCH_MP.INITANGS, BL.GetChainSawInitAngs( vtN, vtOrtho, 2)) + local vtOrtho = BL.GetVersRef( nFaceUse) + EgtSetMachiningParam( MCH_MP.INITANGS, BL.GetChainSawInitAngs( vtN, vtOrtho, 1)) -- imposto offset radiale per mantenere il materiale in coda per la finitura EgtSetMachiningParam( MCH_MP.OFFSR, dOffs) -- imposto allungamento percorso iniziale e finale a zero @@ -212,8 +212,8 @@ local function MakeSplitByChainSaw( nSurfId, nFaceUse, dDepth, sNotes, dOffs) return false, sErr end -- impostazione alternativa angolo 3° asse rot - EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, BL.GetChainSawBlockedAxis( 1)) - EgtSetMachiningParam( MCH_MP.INITANGS, BL.GetChainSawInitAngs( vtN, vtOrtho, 1)) + EgtSetMachiningParam( MCH_MP.BLOCKEDAXIS, BL.GetChainSawBlockedAxis( 2)) + EgtSetMachiningParam( MCH_MP.INITANGS, BL.GetChainSawInitAngs( vtN, vtOrtho, 2)) if not ML.ApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() EgtSetOperationMode( nMchFId, false) @@ -232,9 +232,9 @@ end --------------------------------------------------------------------- -- Applicazione della lavorazione function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrStd, bPreMove, vtMove, dOvmTail) - if not BD.OVM_CHAIN_HBEAM then - BD.OVM_CHAIN_HBEAM = 8 - end + -- impostazione default a variabili aggiunte + if not BD.OVM_CHAIN_HBEAM then BD.OVM_CHAIN_HBEAM = 8 end + if not BD.C_SIMM_ENC then BD.C_SIMM_ENC = 180 end -- ingombro del grezzo local b3Raw = EgtGetRawPartBBox( nRawId) -- inserimento smussi @@ -262,8 +262,9 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt end local dMaxVertDepth = dMaxDepth - ( BD.DECR_VERT_CUT or 0) -- caratteristiche taglio - local dDimYRef = EgtIf( b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL, dMaxDepth, BD.MAX_DIM_HTCUT_HBEAM) - local bBigSectionCut = ( b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) and ( b3Raw:getDimZ() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) + local dDimYRef = EgtIf( b3Raw:getDimZ() < BD.MIN_DIM_HBEAM + 10 * GEO.EPS_SMALL, dMaxDepth, abs( BD.MAX_DIM_HTCUT_HBEAM)) + local bBigSectionCut = ( b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) and + ( b3Raw:getDimZ() > EgtIf( BD.DOWN_HEAD or BD.TURN, 2, 1) * dMaxVertDepth - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) local bHorizCut = ( not bBigSectionCut and ( b3Raw:getDimY() > b3Raw:getDimZ() + 10 * GEO.EPS_SMALL or BD.TURN) and ( b3Raw:getDimZ() < dMaxVertDepth - BD.CUT_EXTRA)) local bDoubleHorizCut = ( ( BD.DOWN_HEAD or BD.TURN) and not bBigSectionCut and not bHorizCut and b3Raw:getDimY() > 2 * dDimYRef - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL) local bDoubleCut = ( not bBigSectionCut and not bHorizCut and not bDoubleHorizCut and b3Raw:getDimY() > dDimYRef - BD.CUT_EXTRA + 10 * GEO.EPS_SMALL) @@ -293,43 +294,70 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt if bBigSectionCut then local bFinishingNeeded = false if bSplit then - --taglio sega a catena - local cutDepth = 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN - local sNotesSplit = 'Presplit;' + -- recupero lunghezza massima di lavoro della sega a catena + local sSawing = ML.FindSawing( 'Sawing') + local dMaxMat = 0 + local dTlen = 0 + if EgtMdbSetCurrMachining( sSawing or '') then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dMaxMat + dTLen = EgtTdbGetCurrToolParam( MCH_TP.LEN) or dTLen + end + end + -- assegno offset in lunghezza local dOffs = 0 if dOvmTail > BD.OVM_CHAIN_HBEAM then dOffs = dOvmTail - BD.OVM_CHAIN_HBEAM bFinishingNeeded = true end - local bOk, sErr = MakeSplitByChainSaw( Proc.Id, MCH_MILL_FU.PARAL_BACK, cutDepth, sNotesSplit, dOffs) - if not bOk then return bOk, sErr, nNewPhase end - sNotesSplit = 'Split;' - bOk, sErr = MakeSplitByChainSaw( Proc.Id, MCH_MILL_FU.PARAL_FRONT, cutDepth, sNotesSplit, dOffs) - if not bOk then return bOk, sErr, nNewPhase end - -- creo nuova fase per successiva finitura - BL.AddPhaseWithRawParts( nRawId, BD.OriXR, BD.PosXR, BD.RAW_OFFSET) - nNewPhase = EgtGetCurrPhase() - nDispId = EgtGetPhaseDisposition( nNewPhase) - if sDownOrSideOrStd == 'down' then - EgtRotateRawPart( nRawId, X_AX(), 180) - EgtSetInfo( nDispId, 'TYPE', 'MID2') - EgtSetInfo( nDispId, 'ROT', -2) - elseif sDownOrSideOrStd == 'side' then - if bPreMove then EgtMoveRawPart( nRawId, vtMove) end - EgtRotateRawPart( nRawId, X_AX(), EgtIf( BD.RIGHT_LOAD, -90, 90)) - if not bPreMove then EgtMoveRawPart( nRawId, vtMove) end - EgtSetInfo( nDispId, 'TYPE', 'MID2') - EgtSetInfo( nDispId, 'ROT', -1) + -- se pezzo non troppo alto, taglio singolo da sopra + if b3Raw:getDimZ() < dMaxMat - BD.CUT_EXTRA_MIN + 10 * GEO.EPS_SMALL then + local cutDepth = b3Raw:getDimZ() + BD.CUT_EXTRA_MIN + sNotesSplit = 'Split;' + bOk, sErr = MakeSplitByChainSaw( Proc.Id, MCH_MILL_FU.PARAL_TOP, cutDepth, sNotesSplit, dOffs) + if not bOk then return bOk, sErr, nNewPhase end + -- se pezzo non troppo largo, taglio singolo da davanti + elseif b3Raw:getDimY() + BD.CUT_EXTRA_MIN < min( dMaxMat, dTLen - BD.C_SIMM_ENC) + 10 * GEO.EPS_SMALL then + local cutDepth = b3Raw:getDimY() + BD.CUT_EXTRA_MIN + sNotesSplit = 'Split;' + bOk, sErr = MakeSplitByChainSaw( Proc.Id, MCH_MILL_FU.PARAL_FRONT, cutDepth, sNotesSplit, dOffs) + if not bOk then return bOk, sErr, nNewPhase end + -- altrimenti tagli dai due fianchi (dietro e davanti) else - EgtSetInfo( nDispId, 'TYPE', 'END') + local cutDepth = 0.5 * b3Raw:getDimY() + BD.CUT_EXTRA_MIN + local sNotesSplit = 'Presplit;' + local bOk, sErr = MakeSplitByChainSaw( Proc.Id, MCH_MILL_FU.PARAL_BACK, cutDepth, sNotesSplit, dOffs) + if not bOk then return bOk, sErr, nNewPhase end + sNotesSplit = 'Split;' + bOk, sErr = MakeSplitByChainSaw( Proc.Id, MCH_MILL_FU.PARAL_FRONT, cutDepth, sNotesSplit, dOffs) + if not bOk then return bOk, sErr, nNewPhase end + end + -- se necessaria finitura, creo nuova fase + if bFinishingNeeded then + BL.AddPhaseWithRawParts( nRawId, BD.OriXR, BD.PosXR, BD.RAW_OFFSET) + nNewPhase = EgtGetCurrPhase() + nDispId = EgtGetPhaseDisposition( nNewPhase) + if sDownOrSideOrStd == 'down' then + EgtRotateRawPart( nRawId, X_AX(), 180) + EgtSetInfo( nDispId, 'TYPE', 'MID2') + EgtSetInfo( nDispId, 'ROT', -2) + elseif sDownOrSideOrStd == 'side' then + if bPreMove then EgtMoveRawPart( nRawId, vtMove) end + EgtRotateRawPart( nRawId, X_AX(), EgtIf( BD.RIGHT_LOAD, -90, 90)) + if not bPreMove then EgtMoveRawPart( nRawId, vtMove) end + EgtSetInfo( nDispId, 'TYPE', 'MID2') + EgtSetInfo( nDispId, 'ROT', -1) + else + EgtSetInfo( nDispId, 'TYPE', 'END') + end + EgtSetInfo( nDispId, 'ORD', nOrd) + -- se grezzo successivo senza pezzi e finale, va tolto + local nNextRawId = EgtGetNextRawPart( nRawId) + if nNextRawId and EgtGetPartInRawPartCount( nNextRawId) == 0 and EgtGetRawPartBBox( nNextRawId):getDimX() < BD.MinRaw then + EgtRemoveRawPartFromCurrPhase( nNextRawId) + end end - EgtSetInfo( nDispId, 'ORD', nOrd) - -- se grezzo successivo senza pezzi e finale, va tolto - local nNextRawId = EgtGetNextRawPart( nRawId) - if nNextRawId and EgtGetPartInRawPartCount( nNextRawId) == 0 and EgtGetRawPartBBox( nNextRawId):getDimX() < BD.MinRaw then - EgtRemoveRawPartFromCurrPhase( nNextRawId) - end - -- fine creazione nuova fase end -- se è necessaria la finitura if bFinishingNeeded or not bSplit then