From b75d8e71993377065d0b2a39e1338aea37aee873 Mon Sep 17 00:00:00 2001 From: DarioS Date: Tue, 18 May 2021 10:17:36 +0200 Subject: [PATCH] DataBeam : - taglio a cubetti speciale per testa da sotto - taglio con lama sul fianco per macchina con testa da sotto. --- LuaLibs/ProcessCut.lua | 120 ++++++++++++++++--------------- LuaLibs/ProcessLongCut.lua | 11 +-- LuaLibs/ProcessLongDoubleCut.lua | 13 ++-- 3 files changed, 77 insertions(+), 67 deletions(-) diff --git a/LuaLibs/ProcessCut.lua b/LuaLibs/ProcessCut.lua index fd4bc63..b5d7ce9 100644 --- a/LuaLibs/ProcessCut.lua +++ b/LuaLibs/ProcessCut.lua @@ -1,5 +1,6 @@ --- ProcessCut.lua by Egaltech s.r.l. 2021/05/03 +-- ProcessCut.lua by Egaltech s.r.l. 2021/05/18 -- Gestione calcolo singoli tagli di lama per Travi +-- 2021/05/18 I due tagli con testa da sotto di un cubetto sono fatti di seguito. -- Tabella per definizione modulo local ProcessCut = {} @@ -560,69 +561,75 @@ local function MakeFromDown( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead) end end end - -- eseguo - for i = 1, #vCuts do - -- determino il modo di tagliare - local vtOrthoO - local bNoPerpCuts = false - if i % 2 == 1 then - vtOrthoO = Vector3d( vtN) - else - local vtO - if #vCuts[i-1] > 0 then - vtO = EgtSurfTmFacetNormVersor( vCuts[i-1][1], 0, GDB_ID.ROOT) - elseif vCuts[i+1] and #vCuts[i+1] > 0 then - -- lunghezza faccia nell'eventuale direzione ortogonale - local asseX = EgtSurfTmFacetNormVersor( vCuts[i+1][1], 0, GDB_ID.ROOT) - local asseY = asseX ^ vtN - local Frame = Frame3d( ptC, ptC + asseX, ptC + asseY) - local b3Fac = EgtGetBBoxRef( vCuts[i][1], GDB_BB.STANDARD, Frame) - -- se lunghezza inferiore al limite, accetto la direzione - if b3Fac:getDimX() < dMaxDepth - BD.CUT_EXTRA then - vtO = asseX - else - bNoPerpCuts = true - end + -- eseguo (facendo di seguito i due tagli di ogni singolo cubetto) + for i = 1, #vCuts, 2 do + -- determino il modo di tagliare dei perpendicolari + local vtOrthoO_1 = Vector3d( vtN) + -- determino il modo di tagliare dei paralleli + local vtOrthoO_2 + local bNoPerpCuts_2 = false + local vtO + if #vCuts[i] > 0 then + vtO = EgtSurfTmFacetNormVersor( vCuts[i][1], 0, GDB_ID.ROOT) + elseif vCuts[i+2] and #vCuts[i+2] > 0 then + -- lunghezza faccia nell'eventuale direzione ortogonale + local asseX = EgtSurfTmFacetNormVersor( vCuts[i+2][1], 0, GDB_ID.ROOT) + local asseY = asseX ^ vtN + local Frame = Frame3d( ptC, ptC + asseX, ptC + asseY) + local b3Fac = EgtGetBBoxRef( vCuts[i+1][1], GDB_BB.STANDARD, Frame) + -- se lunghezza inferiore al limite, accetto la direzione + if b3Fac:getDimX() < dMaxDepth - BD.CUT_EXTRA then + vtO = asseX else - bNoPerpCuts = true + bNoPerpCuts_2 = true end - if vtO then - vtOrthoO = Vector3d( vtO) * EgtIf( bOrthInv, -1, 1) - else - if bHorizCut then - vtOrthoO = Z_AX() - elseif vtN:getY() > -0.02 then - if not Proc.Head then - vtOrthoO = -Y_AX() - else - vtOrthoO = Y_AX() - end + else + bNoPerpCuts_2 = true + end + if vtO then + vtOrthoO_2 = Vector3d( vtO) * EgtIf( bOrthInv, -1, 1) + else + if bHorizCut then + vtOrthoO_2 = Z_AX() + elseif vtN:getY() > -0.02 then + if not Proc.Head then + vtOrthoO_2 = -Y_AX() else - vtOrthoO = -Y_AX() + vtOrthoO_2 = Y_AX() end + else + vtOrthoO_2 = -Y_AX() end end - -- lavoro la faccia - for j = 1, #vCuts[i] do - -- in generale sta sollevato di pochissimo - local dExtraCut = -0.1 - -- se tagli paralleli - if ( i % 2) == 0 then - -- se non ci sono tagli ortogonali devo affondare - if bNoPerpCuts then - dExtraCut = BD.CUT_EXTRA - -- se altrimenti tagli ortogonali invertiti, devo approfondire dello spessore lama - elseif bOrthInv then - dExtraCut = dSawThick - -- se ultimo taglio, devo affondare - elseif j == #vCuts[i] then - dExtraCut = BD.CUT_EXTRA + -- lavoro le coppie di facce del singolo cubetto + for j = 1, max( #vCuts[i], #vCuts[i+1]) do + -- extra taglio per perpendicolari + local dExtraCut_1 = -0.1 + -- extra taglio per paralleli + local dExtraCut_2 = -0.1 + -- se non ci sono tagli ortogonali devo affondare + if bNoPerpCuts_2 then + dExtraCut_2 = BD.CUT_EXTRA + -- se altrimenti tagli ortogonali invertiti, devo approfondire dello spessore lama + elseif bOrthInv then + dExtraCut_2 = dSawThick + -- se ultimo taglio, devo affondare + elseif j == #vCuts[i] then + dExtraCut_2 = BD.CUT_EXTRA + end + -- taglio perpendicolare (limite Vz Down Up messo a -2 per non farlo mai intervenire) + if vCuts[i][j] then + local bOk, sErr = BL.MakeOneFaceBySaw( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO_1, -2, dExtraCut_1, BD.CUT_SIC, 0, 0, nil, b3Raw) + if not bOk then + return bOk, sErr end end - -- taglio (limite Vz Down Up messo a -2 per non farlo mai intervenire) - local bOk, sErr = BL.MakeOneFaceBySaw( vCuts[i][j], 0, sCutting, dSawDiam, vtOrthoO, -2, dExtraCut, BD.CUT_SIC, 0, 0, nil, b3Raw) - if not bOk then - return bOk, sErr + -- taglio parallelo (limite Vz Down Up messo a -2 per non farlo mai intervenire) + if vCuts[i+1][j] then + local bOk, sErr = BL.MakeOneFaceBySaw( vCuts[i+1][j], 0, sCutting, dSawDiam, vtOrthoO_2, -2, dExtraCut_2, BD.CUT_SIC, 0, 0, nil, b3Raw) + if not bOk then + return bOk, sErr + end end end end @@ -710,6 +717,7 @@ function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom, -- se taglio con testa da sopra if not bDownHead then return MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom, bCustDiceCut) + -- altrimenti taglio con testa da sotto else return MakeFromDown( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom, bCustDiceCut) end diff --git a/LuaLibs/ProcessLongCut.lua b/LuaLibs/ProcessLongCut.lua index 9e4a704..5e77af1 100644 --- a/LuaLibs/ProcessLongCut.lua +++ b/LuaLibs/ProcessLongCut.lua @@ -1,6 +1,7 @@ --- ProcessLongCut.lua by Egaltech s.r.l. 2021/02/04 +-- ProcessLongCut.lua by Egaltech s.r.l. 2021/05/18 -- Gestione calcolo taglio longitudinale per Travi -- 2021/02/03 Corretto FaceUse con fresa orizzontale su taglio orizzontale. +-- 2021/05/18 Possibile taglio con lama anche di fianco su macchina con testa da sotto. -- Tabella per definizione modulo local ProcessLongCut = {} @@ -183,7 +184,6 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade) ---------------------------------------------------------------------------------------------------------------------------------------- -- 2020/09/15 Fabio Squaratti: se sono attivi entrambe i Q05 (lavorare con lama) e Q07 (lavorare con fresa di fianco anche da sopra) -- allora vince il Q7, cioè si utilizza la fresa di fianco ( per i tagli da sopra) - -- 2020/09/17 Fabio Squaratti: se lavorazione con fresa di fianco e se ci sono delle facce laterali, l'utensile deve arrivare -- fino al punto più vicino della faccia laterale (prima l'arretramento era sempre del rggio utensile). -- Questo viene fatto se Q07=1 o fresa da sotto @@ -194,7 +194,7 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade) if nUseMillOnSide > 0 then bUseBlade = false end -- Se non limitato e da sopra e richiesto con doppio taglio di lama e superiore al limite minimo - if not bLimXmin and not bLimXmax and nSide == 1 and bUseBlade and b3Solid:getDimX() > dLimMinPiece - 1 then + if not bLimXmin and not bLimXmax and ( nSide == 1 or ( nSide ~= -1 and BD.DOWN_HEAD)) and bUseBlade and b3Solid:getDimX() > dLimMinPiece - 1 then -- recupero la lavorazione local sCutting = ML.FindCutting( 'HeadSide') if not sCutting then @@ -245,14 +245,15 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade) local nFaceUse = EgtIf( abs( vtN:getY()) > 0.01, MCH_MILL_FU.ORTHO_TOP, EgtIf( bFront, MCH_MILL_FU.ORTHO_BACK, MCH_MILL_FU.ORTHO_FRONT)) local nFaceUse2 = EgtIf( abs( vtN:getY()) > 0.01, MCH_MILL_FU.ORTHO_DOWN, EgtIf( bFront, MCH_MILL_FU.ORTHO_FRONT, MCH_MILL_FU.ORTHO_BACK)) -- si percorrono i lati alto e basso della faccia + local dDimStrip = EgtIf( nSide == 1, BD.DIM_STRIP_SMALL, BD.DIM_STRIP) local nM = 0 for i = 1, nC do -- Posizione braccio portatesta local nSCC = EgtIf( ( BD.C_SIMM or i == 1 or i == nC - 1), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM) -- ciclo sulle passate - local dOffset = ( dWidth + BD.DIM_STRIP_SMALL) / 2 ; + local dOffset = ( dWidth + dDimStrip) / 2 ; local dLioTang = 0 - local dLioPerp = ( dWidth - BD.DIM_STRIP_SMALL) / 2 + BD.CUT_SIC ; + local dLioPerp = ( dWidth - dDimStrip) / 2 + BD.CUT_SIC ; for k = 1, 2 do -- inserisco le parti di lavorazione nM = nM + 1 diff --git a/LuaLibs/ProcessLongDoubleCut.lua b/LuaLibs/ProcessLongDoubleCut.lua index 374efa6..4ac5513 100644 --- a/LuaLibs/ProcessLongDoubleCut.lua +++ b/LuaLibs/ProcessLongDoubleCut.lua @@ -1,5 +1,6 @@ --- ProcessLongDoubleCut.lua by Egaltech s.r.l. 2021/02/06 +-- ProcessLongDoubleCut.lua by Egaltech s.r.l. 2021/05/18 -- Gestione calcolo doppio taglio longitudinale per Travi +-- 2021/05/18 Possibile taglio con lama anche di fianco su macchina con testa da sotto. -- Tabella per definizione modulo local ProcessLong2Cut = {} @@ -264,7 +265,6 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster ---------------------------------------------------------------------------------------------------------------------------------------- -- 2020/09/17 Fabio Squaratti: se sono attivi entrambe i Q01 (lavorare con lama) e Q03 (lavorare con fresa di fianco anche da sopra) -- allora vince il Q3, cioè si utilizza la fresa di fianco ( per i tagli da sopra) - -- 2020/09/17 Fabio Squaratti: se lavorazione con fresa di fianco e se ci sono delle facce laterali, l'utensile deve arrivare -- fino al punto più vicino della faccia laterale (prima l'arretramento era sempre del raggio utensile). -- Questo viene fatto se Q03=1 o fresa da sotto @@ -287,7 +287,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster if nUseMillOnSide > 0 then bUseBlade = false end -- Se senza facce limitanti, da sopra e richiesto con doppio taglio di lama - if nFaceLimit == 0 and nSide == 1 and bUseBlade and b3Solid:getDimX() > dLimMinPiece - 1 then + if nFaceLimit == 0 and ( nSide == 1 or ( nSide == 0 and BD.DOWN_HEAD)) and bUseBlade and b3Solid:getDimX() > dLimMinPiece - 1 then -- recupero la lavorazione local sCutting = ML.FindCutting( 'HeadSide') if not sCutting then @@ -337,6 +337,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster end end + local dDimStrip = EgtIf( nSide ~= 0, BD.DIM_STRIP_SMALL, BD.DIM_STRIP) local nM = 0 -- se convesso lavoro ogni faccia in due metà lasciando attaccata la parte centrale if bConvex then @@ -355,9 +356,9 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster local nFaceUse = EgtIf( abs( vtN[vOrd[j]]:getY()) > 0.01, MCH_MILL_FU.ORTHO_TOP, EgtIf( bFront, MCH_MILL_FU.ORTHO_BACK, MCH_MILL_FU.ORTHO_FRONT)) local nFaceUse2 = EgtIf( abs( vtN[vOrd[j]]:getY()) > 0.01, MCH_MILL_FU.ORTHO_DOWN, EgtIf( bFront, MCH_MILL_FU.ORTHO_FRONT, MCH_MILL_FU.ORTHO_BACK)) -- ciclo sulle passate - local dOffset = ( vWidth[vOrd[j]] + BD.DIM_STRIP_SMALL) / 2 ; + local dOffset = ( vWidth[vOrd[j]] + dDimStrip) / 2 ; local dLioTang = 0 - local dLioPerp = ( vWidth[vOrd[j]] - BD.DIM_STRIP_SMALL) / 2 + BD.CUT_SIC ; + local dLioPerp = ( vWidth[vOrd[j]] - dDimStrip) / 2 + BD.CUT_SIC ; for k = 1, 2 do -- inserisco le parti di lavorazione nM = nM + 1 @@ -426,7 +427,7 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster end dLioPerp = vWidth[vOrd[j]] + BD.CUT_SIC else -- il secondo ridotto della distanza minima e della componente spessore della lama - dOffset = BD.DIM_STRIP_SMALL + ((dToolThick* vtN[vOrd[1]]) - (dToolThick* vtN[vOrd[1]]) * vtN[vOrd[2]] * vtN[vOrd[2]]):len() + dOffset = dDimStrip + ((dToolThick* vtN[vOrd[1]]) - (dToolThick* vtN[vOrd[1]]) * vtN[vOrd[2]] * vtN[vOrd[2]]):len() dLioPerp = vWidth[vOrd[j]] - dOffset + BD.CUT_SIC end local dLioTang = 0