diff --git a/LuaLibs/ProcessCut.lua b/LuaLibs/ProcessCut.lua index b3fe568..23fb214 100644 --- a/LuaLibs/ProcessCut.lua +++ b/LuaLibs/ProcessCut.lua @@ -1,4 +1,4 @@ --- ProcessCut.lua by Egaltech s.r.l. 2021/01/13 +-- ProcessCut.lua by Egaltech s.r.l. 2021/01/15 -- Gestione calcolo singoli tagli di lama per Travi -- Tabella per definizione modulo @@ -177,7 +177,7 @@ end --------------------------------------------------------------------- -- Applicazione della lavorazione -function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom) +function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom, bCustDiceCut) -- ingombro del grezzo local b3Raw = EgtGetRawPartBBox( nRawId) -- ingombro del pezzo @@ -194,26 +194,52 @@ function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom) local bDownCut = ( vtN:getZ() <= dNzLimDwnUp) local bFillAreaPiece local bFillTail + -- se taglio di testa + if Proc.Head then + -- se coincide con il taglio di separazione precedente, non va fatto + if AreSameVectorApprox( vtN, X_AX()) and abs( ptC:getX() - b3Raw:getMax():getX() + dOvmHead) < 10 * GEO.EPS_SMALL then + return true + end + -- altrimenti taglio di coda + else + -- se coincide con taglio di separazione, non va fatto + if AreSameVectorApprox( vtN, - X_AX()) and abs( ptC:getX() - b3Raw:getMin():getX()) < BD.OVM_MID + 10 * GEO.EPS_SMALL then + return true + end + end + -- se coincide con un taglio frontale non va fatto + if Proc.CutFront then + return true + end -- se pezzo ancora attaccato alla trave, per non rovinare quello successivo if not BL.IsSplittedPartPhase( nPhase) then -- se non da sotto if not bDownCut then - -- se praticamente orizzontale ( inclinazione inferiore a 11.5deg) - if vtN:getZ() > 0.98 then - -- se la faccia occupa tutta la trave in X e Y e non interessa la faccia inferiore, si fanno partire i tagli a cubetti dalla testa - if abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL and - abs( Proc.Box:getMin():getY() - b3Solid:getMin():getY()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getY() - b3Solid:getMax():getY()) < 10*GEO.EPS_SMALL and - b3Solid:getMin():getZ() < Proc.Box:getMin():getZ() - 100 * GEO.EPS_SMALL then - bFillAreaPiece = true - end - -- se praticamente verticale di fianco ( inclinazione inferiore a 11.5deg) - elseif abs( vtN:getY()) > 0.98 then - -- se la faccia occupa tutta la trave in X e Z e non interessa la faccia inferiore, do errore - if abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL and - abs( Proc.Box:getMin():getZ() - b3Solid:getMin():getZ()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getZ() - b3Solid:getMax():getZ()) < 10*GEO.EPS_SMALL then - local sErr = 'Error : Impossible to machine by orientation (on side)' - EgtOutLog( sErr) - return false, sErr + bFillAreaPiece = bCustDiceCut + -- se true il controllo è già stato fatto dal modulo che ha chiamato il ProcessCut + if not bFillAreaPiece then + -- se poco inclinata ( inclinazione inferiore a 21.56 deg) + if vtN:getZ() > 0.93 then + -- se la faccia occupa tutta la trave in X e Y o occupa sicuramente la faccia in Y e almeno 3/4 della lunghezza in X e sborda in X e non interessa la faccia inferiore, + -- si possono far partire i tagli a cubetti dalla testa o lasciare il cordoncino centrale + if ( ( abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL) or + ( ( abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL or abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL) and + ( Proc.Box:getDimX() > 0.75 * b3Solid:getDimX() or Proc.Box:getDimX() > 1500.000))) and + abs( Proc.Box:getMin():getY() - b3Solid:getMin():getY()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getY() - b3Solid:getMax():getY()) < 10*GEO.EPS_SMALL and + b3Solid:getMin():getZ() < Proc.Box:getMin():getZ() - 100 * GEO.EPS_SMALL then + bFillAreaPiece = true + end + -- se praticamente verticale di fianco ( inclinazione inferiore a 21.56deg) + elseif abs( vtN:getY()) > 0.93 then + -- se la faccia occupa tutta la trave in X e Z o occupa sicuramente la faccia in Z e almeno 3/4 della faccia in X e sborda in X, + if ( ( abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL) or + ( ( abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL or abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL) and + Proc.Box:getDimX() > 0.75 * b3Solid:getDimX())) and + abs( Proc.Box:getMin():getZ() - b3Solid:getMin():getZ()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getZ() - b3Solid:getMax():getZ()) < 10*GEO.EPS_SMALL then + local sErr = 'Error : Impossible to machine by orientation (on side)' + EgtOutLog( sErr) + return false, sErr + end end end -- se quasi orizzontale ( inclinazione inferiore a 30) @@ -235,26 +261,8 @@ function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom) end end end - - -- se taglio di testa - if Proc.Head then - -- se coincide con il taglio di separazione precedente, non va fatto - if AreSameVectorApprox( vtN, X_AX()) and abs( ptC:getX() - b3Raw:getMax():getX() + dOvmHead) < 10 * GEO.EPS_SMALL then - return true - end - -- altrimenti taglio di coda - else - -- se coincide con taglio di separazione, non va fatto - if AreSameVectorApprox( vtN, - X_AX()) and abs( ptC:getX() - b3Raw:getMin():getX()) < BD.OVM_MID + 10 * GEO.EPS_SMALL then - return true - end - end - -- se coincide con un taglio frontale non va fatto - if Proc.CutFront then - return true - end -- se ho il parametro Q04 = 1 e il taglio copre la lunghezza della trave allora lancio il processo dell'L10 - local nAsLongCut = EgtGetInfo( Proc.Id, 'Q04', 'd') or 0 + local nAsLongCut = EgtGetInfo( Proc.Id, 'Q04', 'i') or 0 if nAsLongCut == 1 and bFillAreaPiece then return LongCut.Make( Proc, nPhase, nRawId, nPartId, true) end @@ -300,10 +308,14 @@ function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom) end vCuts = DC.GetDice( EgtGetParent( Proc.Id), b3Solid, ptC, vtN, bAutoCalcSurf, ptExtra, vtExtra, dMaxDepth - BD.CUT_EXTRA) -- se taglio sborda in coda e non è stato inserito nessun taglio a cubetti, lo rilancio con le dimensioni customizzate - if bFillTail and #vCuts == 0 then + if ( bFillTail or bCustDiceCut) and #vCuts == 0 then vCuts = DC.GetDice( EgtGetParent( Proc.Id), b3Solid, ptC, vtN, bAutoCalcSurf, ptExtra, vtExtra, dMaxDepth - BD.CUT_EXTRA, Proc.Box:getDimY()) end end + -- se il ProcessCut viene lanciato dal ProcessSawCut e non ci sono tagli a cubetti, esco + if bCustDiceCut and #vCuts == 0 then + return false, -1 + end --DC.PrintOrderCut( vCuts) if #vCuts > 0 then -- recupero gruppo per geometria addizionale diff --git a/LuaLibs/ProcessLongCut.lua b/LuaLibs/ProcessLongCut.lua index e7d7483..7265ca9 100644 --- a/LuaLibs/ProcessLongCut.lua +++ b/LuaLibs/ProcessLongCut.lua @@ -1,4 +1,4 @@ --- ProcessLongCut.lua by Egaltech s.r.l. 2021/01/11 +-- ProcessLongCut.lua by Egaltech s.r.l. 2021/01/14 -- Gestione calcolo taglio longitudinale per Travi -- Tabella per definizione modulo @@ -247,7 +247,7 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade) 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) + 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 dLioTang = 0 @@ -279,6 +279,11 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade) EgtSetMachiningParam( MCH_MP.LIPERP, dLioPerp) EgtSetMachiningParam( MCH_MP.LOTANG, dLioTang) EgtSetMachiningParam( MCH_MP.LOPERP, dLioPerp) + -- se il flag uso lama custom abilitato (indica che questo script è lanciato dal ProcessCut) + -- controllo se componente X versore è maggiore di un valore limite cambio la direzione della forcella + if bCustUseBlade and abs(vtN:getX()) > 0.009 + 5*GEO.EPS_SMALL then + nSCC = EgtIf( ( not bFront and k == 1) or ( bFront and k == 2), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) + end -- imposto posizione braccio porta testa per non ingombrare agli estremi EgtSetMachiningParam( MCH_MP.SCC, nSCC) -- imposto uso della faccia diff --git a/LuaLibs/ProcessSawCut.lua b/LuaLibs/ProcessSawCut.lua index 4d7c32e..ca43ccd 100644 --- a/LuaLibs/ProcessSawCut.lua +++ b/LuaLibs/ProcessSawCut.lua @@ -1,4 +1,4 @@ --- ProcessSawCut.lua by Egaltech s.r.l. 2020/06/04 +-- ProcessSawCut.lua by Egaltech s.r.l. 2021/01/15 -- Gestione calcolo taglio di lama per Travi -- Tabella per definizione modulo @@ -8,6 +8,8 @@ local ProcessSawCut = {} require( 'EgtBase') local BL = require( 'BeamLib') local DC = require( 'DiceCut') +local Cut = require( 'ProcessCut') +local LongCut = require( 'ProcessLongCut') EgtOutLog( ' ProcessSawCut started', 1) @@ -97,6 +99,47 @@ function ProcessSawCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) -- determino se lavorazione da davanti o da dietro e se da sotto local bFront = ( vtDir ^ vtN):getX() > 0 local bDownUp = ( vtN:getZ() < -0.259) + local bFillAreaPiece + -- se non da sotto + if not bDownUp then + -- se poco inclinata ( inclinazione inferiore a 21.56 deg) + if vtN:getZ() > 0.93 then + -- verifico se la superfice è prevelentemente orizzontale con Z positiva e occupa tutta la trave o occupa sicuramente la faccia in Y + -- e almeno 3/4 della lunghezza in X e sborda in X e non interessa la faccia inferiore, + -- si possono far partire i tagli a cubetti dalla testa o lasciare il cordoncino centrale + if ( ( abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL) or + ( ( abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL or abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL) and + ( Proc.Box:getDimX() > 0.75 * b3Solid:getDimX() or Proc.Box:getDimX() > 1500.000))) and + abs( Proc.Box:getMin():getY() - b3Solid:getMin():getY()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getY() - b3Solid:getMax():getY()) < 10*GEO.EPS_SMALL and + b3Solid:getMin():getZ() < Proc.Box:getMin():getZ() - 100 * GEO.EPS_SMALL then + bFillAreaPiece = true + end + -- se praticamente verticale di fianco ( inclinazione inferiore a 21.56deg) + elseif abs( vtN:getY()) > 0.93 then + -- se la faccia occupa tutta la trave in X e Z o occupa sicuramente la faccia in Z e almeno 3/4 della faccia in X e sborda in X, + if ( ( abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL) or + ( ( abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL or abs( Proc.Box:getMax():getX() - b3Solid:getMax():getX()) < 10*GEO.EPS_SMALL) and + ( Proc.Box:getDimX() > 0.75 * b3Solid:getDimX() or Proc.Box:getDimX() > 1500.000))) and + abs( Proc.Box:getMin():getZ() - b3Solid:getMin():getZ()) < 10*GEO.EPS_SMALL and abs( Proc.Box:getMax():getZ() - b3Solid:getMax():getZ()) < 10*GEO.EPS_SMALL then + local sErr = 'Error : Impossible to machine by orientation (on side)' + EgtOutLog( sErr) + return false, sErr + end + end + end + -- se ho il parametro Q04 = 1 e il taglio copre la lunghezza della trave allora lancio il processo dell'L10 + local nAsLongCut = EgtGetInfo( Proc.Id, 'Q02', 'i') or 0 + if nAsLongCut == 1 and bFillAreaPiece then + return LongCut.Make( Proc, nPhase, nRawId, nPartId, true) + -- se non ho taglio lungo passo al Cut per taglio a cubetti + elseif bFillAreaPiece and abs(( vtDir ^ vtN):getY()) > 0.866 then + local bOk, sErr = Cut.Make( Proc, nPhase, nRawId, nPartId, 0, false, true) + -- se è andata a buon fine oppure ha fallito esco + -- nel caso non ha fatto i tagli a cubetti (sErr vale -1) continuo + if bOk or ( not bOk and type(sErr) ~= 'number') then + return bOk, sErr + end + end -- determino affondamento e distanza interna da inizio e fine local dDepth = min( dWidth, dMaxDepth - BD.COLL_SIC) local dInsDist = 0