From e23dfe1049637f84396c2d47cc70496c5a5a6b36 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 7 Jan 2021 07:57:56 +0000 Subject: [PATCH] DataBeam : - correzioni varie per tagli a cubetti. --- LuaLibs/BeamLib.lua | 18 +++++++++++++----- LuaLibs/DiceCut.lua | 4 ++-- LuaLibs/ProcessCut.lua | 36 +++++++++++++++++++----------------- LuaLibs/ProcessDrill.lua | 2 +- LuaLibs/ProcessLapJoint.lua | 2 +- LuaLibs/ProcessSplit.lua | 4 ++-- 6 files changed, 38 insertions(+), 28 deletions(-) diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index aa44b8e..73144a1 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -1,9 +1,10 @@ --- BeamLib.lua by Egaltech s.r.l. 2020/11/18 +-- BeamLib.lua by Egaltech s.r.l. 2021/01/06 -- Libreria globale per Travi -- 2020/07/28 Corretto calcolo attacchi e uscite di lame per non uscire dalla faccia sotto. -- 2020/08/18 Aggiunto a GetNearestParalOpposite e GetNearestOrthoOpposite parametro opzionale vtNorm. -- 2020/11/03 Aggiunta funzione IsEndOrEnd2Phase. -- 2020/11/18 Correzioni a GetParallelOpposite e a GetFaceElevation. +-- 2021/01/06 Cambiato limite per attacco Tg con lama e CalcLeadInOutGeom rinominata in CalcLeadInOutPerpGeom. -- Tabella per definizione modulo local BeamLib = {} @@ -609,7 +610,7 @@ function BeamLib.GetFaceHvRefDim( nSurfId, nFacet) end --------------------------------------------------------------------- -function BeamLib.CalcLeadInOutGeom( ptP1, ptP2, vtV1, vtV2, vtN, dRad, vtRef, dCutExtra, b3Box) +function BeamLib.CalcLeadInOutPerpGeom( ptP1, ptP2, vtV1, vtV2, vtN, dRad, vtRef, dCutExtra, b3Box) -- Mi assicuro che i vettori ingresso/uscita giacciano nel piano vtV1 = vtV1 - vtV1 * vtN * vtN ; vtV1:normalize() vtV2 = vtV2 - vtV2 * vtN * vtN ; vtV2:normalize() @@ -875,8 +876,8 @@ function BeamLib.MakeOneFaceBySaw( nSurfId, nFacet, sCutting, dSawDiam, Par5, dV local dLiTang, dLiPerp, dLoTang, dLoPerp local ptP1act = ptP1 + vtN * dCutOffset local ptP2act = ptP2 + vtN * dCutOffset - if ( vtV1:getZ() > -0.5 or vtV2:getZ() > -0.5) and ( abs( vtV1:getY()) > 0.707 or abs( vtV2:getY()) > 0.707 or vtN:getZ() < 0.95) then - dLiTang, dLiPerp, dLoTang, dLoPerp = BeamLib.CalcLeadInOutGeom( ptP1act, ptP2act, vtV1, vtV2, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box) + if ( vtV1:getZ() > -0.5 or vtV2:getZ() > -0.5) and ( abs( vtV1:getY()) > 0.707 or abs( vtV2:getY()) > 0.707 or vtN:getZ() < 0.707 or abs( vtTg:getZ()) > 0.5) then + dLiTang, dLiPerp, dLoTang, dLoPerp = BeamLib.CalcLeadInOutPerpGeom( ptP1act, ptP2act, vtV1, vtV2, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box) else dLiTang, dLiPerp, dLoTang, dLoPerp = BeamLib.CalcLeadInOutTangGeom( ptP1act, ptP2act, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box) end @@ -960,10 +961,17 @@ function BeamLib.GetNzLimDownUp( b3Raw) end ------------------------------------------------------------------------------------------------------------- -function BeamLib.IsEndOrEnd2Phase( nPhase) +function BeamLib.IsSplittedPartPhase( nPhase) + local sVal = BeamLib.GetPhaseType( nPhase) + return ( sVal == 'END' or sVal == 'MID2' or sVal == 'END2') +end + +------------------------------------------------------------------------------------------------------------- +function BeamLib.IsPartFinalPhase( nPhase) local sVal = BeamLib.GetPhaseType( nPhase) return ( sVal == 'END' or sVal == 'END2') end + --------------------------------------------------------------------- function BeamLib.GetPhaseType( nPhase) return ( EgtGetInfo( EgtGetPhaseDisposition( nPhase) or GDB_ID.NULL, 'TYPE') or '') diff --git a/LuaLibs/DiceCut.lua b/LuaLibs/DiceCut.lua index 21b5e25..6cc5c93 100644 --- a/LuaLibs/DiceCut.lua +++ b/LuaLibs/DiceCut.lua @@ -1,4 +1,4 @@ --- DiceCut.lua by Egaltech s.r.l. 2020/12/04 +-- DiceCut.lua by Egaltech s.r.l. 2021/01/06 -- Gestione dei piano paralleli nei tagli lunghi: equidistanziamento dei piani paralleli -- Tabella per definizione modulo @@ -468,7 +468,7 @@ function DiceCut.GetDice( nParent, BBoxRawPart, ptCPlanes, vtNPlanes, bGetOrtoPl if vtNInner:getZ() > -0.0175 or vtNInner:getZ() < dNzLimDwnUp or abs( vtNInner:getY()) > 0.8 then vtO:rotate( vtNInner, 90) -- se diretto troppo ortogonalmente all'asse trave e taglio non da sotto, lo ruoto ulteriormente - if abs( vtO:getY()) > 2 * abs( vtO:getX()) and vtNInner:getZ() > dNzLimDwnUp then + if abs( vtO:getY()) > 1.5 * abs( vtO:getX()) and vtNInner:getZ() > dNzLimDwnUp then vtO:rotate( vtNInner, 90) -- se faccia principale verso il basso (almeno -3deg), lo inverto per iniziare da sopra if vtNInner:getZ() < -0.05 then diff --git a/LuaLibs/ProcessCut.lua b/LuaLibs/ProcessCut.lua index bebe79b..b3bb7c5 100644 --- a/LuaLibs/ProcessCut.lua +++ b/LuaLibs/ProcessCut.lua @@ -193,25 +193,27 @@ function ProcessCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bFromBottom) local bDownCut = ( vtN:getZ() <= dNzLimDwnUp) local bFillAreaPiece local bFillTail - -- caso particolare: se faccia quasi piana e componente X negativa, si vuole evitare che i tagli a cubetti sulla faccia non iniziano dalla coda ma dalla testa - -- se non è taglio da sotto verifico se la faccia uccupa tutta l'area del pezzo, - -- cioè componente Z vicina a 1 e box faccia e box pezzo corrispondenti e non sborda sulla faccia inferiore - if not bDownCut and vtN:getZ() > 0.98 then - 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 + -- se pezzo ancora attaccato alla trave, per non rovinare quello successivo + if not BL.IsSplittedPartPhase( nPhase) then + -- se non da sotto e praticamente orizzontale ( inclinazione inferiore a 11.5deg) + if not bDownCut and 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 + end + -- se non da sotto e quasi orizzontale ( inclinazione inferiore a 30) + if not bDownCut and vtN:getZ() > 0.866 then + -- se la faccia termina davanti o dietro la trave e arriva in coda e non interessa la faccia inferiore, forzo il taglio a cubetti a partire dal davanti + if ( abs( Proc.Box:getMin():getY() - b3Solid:getMin():getY()) < 10*GEO.EPS_SMALL or abs( Proc.Box:getMax():getY() - b3Solid:getMax():getY()) < 10*GEO.EPS_SMALL) and + abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX()) < 10*GEO.EPS_SMALL and b3Solid:getMin():getZ() < Proc.Box:getMin():getZ() - 100 * GEO.EPS_SMALL then + bFillTail = true + end end end - -- caso particolare: se non da sotto e quasi piana e finisce sulla coda e non sborda sulla faccia inferiore - -- se non viene fatto il taglio a cubetti, lo si forza a farlo perchè la lama entra nel pezzo successivo - if not bDownCut and vtN:getZ() > 0.866 then - if ( abs( Proc.Box:getMin():getY() - b3Solid:getMin():getY() ) < 10*GEO.EPS_SMALL or abs( Proc.Box:getMax():getY() - b3Solid:getMax():getY() ) < 10*GEO.EPS_SMALL) and - abs( Proc.Box:getMin():getX() - b3Solid:getMin():getX() ) < 10*GEO.EPS_SMALL and b3Solid:getMin():getZ() < Proc.Box:getMin():getZ() - 100 * GEO.EPS_SMALL then - bFillTail = true - end - end - + -- se taglio di testa if Proc.Head then -- se coincide con il taglio di separazione precedente, non va fatto diff --git a/LuaLibs/ProcessDrill.lua b/LuaLibs/ProcessDrill.lua index 4dbfd3b..3008681 100644 --- a/LuaLibs/ProcessDrill.lua +++ b/LuaLibs/ProcessDrill.lua @@ -371,7 +371,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) if AreSameVectorApprox( vtExtr, Z_AX()) then nSCC = MCH_SCC.ADIR_YM elseif abs( vtExtr:getX()) < 0.1 then - nSCC = EgtIf( BL.IsEndOrEnd2Phase( nPhase), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP) + nSCC = EgtIf( BL.IsPartFinalPhase( nPhase), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP) elseif vtExtr:getY() > 0.1 then nSCC = MCH_SCC.ADIR_YP end diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index cc329a9..fe45fc6 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -2334,7 +2334,7 @@ local function MakePocket( Proc, nPartId, ptPs, tvtN, nFaceRef, sMchFind, nUseRo if AreSameVectorApprox( tvtN[2], Z_AX()) then nSCC = MCH_SCC.ADIR_YM elseif abs( tvtN[2]:getX()) < 0.1 then - nSCC = EgtIf( BL.IsEndOrEnd2Phase( EgtGetCurrPhase()), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP) + nSCC = EgtIf( BL.IsPartFinalPhase( EgtGetCurrPhase()), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP) elseif tvtN[2]:getY() > 0.1 then nSCC = MCH_SCC.ADIR_YP end diff --git a/LuaLibs/ProcessSplit.lua b/LuaLibs/ProcessSplit.lua index c0cbb5d..d4a30a4 100644 --- a/LuaLibs/ProcessSplit.lua +++ b/LuaLibs/ProcessSplit.lua @@ -1,4 +1,4 @@ --- ProcessSplit.lua by Egaltech s.r.l. 2020/09/22 +-- ProcessSplit.lua by Egaltech s.r.l. 2021/01/02 -- Gestione calcolo tagli di separazione per Travi -- Tabella per definizione modulo @@ -177,7 +177,7 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId) local nOrthoOpposite = EgtIf( bHorizCut, MCH_MILL_FU.ORTHO_DOWN, MCH_MILL_FU.ORTHO_BACK) -- separazione solo se esiste grezzo successivo con pezzi o scaricabile local nNextRawId = EgtGetNextRawPart( nRawId) - local bSplit = ( nNextRawId and ( EgtGetPartInRawPartCount( nNextRawId) > 0 or EgtGetRawPartBBox( nNextRawId):getDimX() > BD.MinRaw)) + local bSplit = ( nNextRawId and ( EgtGetPartInRawPartCount( nNextRawId) > 0 or EgtGetRawPartBBox( nNextRawId):getDimX() >= BD.MinRaw)) -- determino se più tagli con offset local nCuts = 1 local dOffsL = 0