diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 2dcda90..6105dc8 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -1,4 +1,4 @@ --- BeamLib.lua by Egaltech s.r.l. 2022/06/25 +-- BeamLib.lua by Egaltech s.r.l. 2022/07/12 -- 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. @@ -13,6 +13,7 @@ -- 2022/05/03 Ulteriore limitazione a GetNzLimDownUp per FAST. -- 2022/05/18 Correzioni e migliorie a PutStartNearestToEdge. -- 2022/06/25 Rese globali le funzioni GetChainSawBlockedAxis e GetChainSawInitAngs prima in ProcessLapJpoint. +-- 2022/07/12 A GetFaceHvRefDim aggiunta possibilità di confronto e limitazione dimensioni con grezzo/pezzo (conta solo la sezione). -- Tabella per definizione modulo local BeamLib = {} @@ -650,7 +651,7 @@ function BeamLib.GetFaceWithMostAdj( nSurfId, nPartId, bCompare3Fc, dCosSideAng) end --------------------------------------------------------------------- -function BeamLib.GetFaceHvRefDim( nSurfId, nFacet) +function BeamLib.GetFaceHvRefDim( nSurfId, nFacet, b3Raw) -- recupero centro e normale della faccia local ptC, vtN = EgtSurfTmFacetCenter( nSurfId, nFacet, GDB_ID.ROOT) if not ptC or not vtN then return end @@ -661,8 +662,21 @@ function BeamLib.GetFaceHvRefDim( nSurfId, nFacet) end -- determino l'ingombro in questo riferimento local b3HV = EgtSurfTmGetFacetBBoxRef( nSurfId, nFacet, GDB_BB.STANDARD, frHV) + local dDimH = b3HV:getDimX() + local dDimV = b3HV:getDimY() + -- se definito grezzo (o solido), applico eventuali limiti + if b3Raw then + local dCoeffY = abs( frHV:getVersX():getY()) + if dCoeffY > GEO.EPS_SMALL then + dDimH = min( dDimH, b3Raw:getDimY() / dCoeffY) + end + local dCoeffZ = abs( frHV:getVersY():getZ()) + if dCoeffZ > GEO.EPS_SMALL then + dDimV = min( dDimV, b3Raw:getDimZ() / dCoeffZ) + end + end -- restituisco i valori calcolati - return frHV, b3HV:getDimX(), b3HV:getDimY() + return frHV, dDimH, dDimV end ------------------------------------------------------------------------------------------------------------- diff --git a/LuaLibs/ProcessCut.lua b/LuaLibs/ProcessCut.lua index 460eb98..ec9cf13 100644 --- a/LuaLibs/ProcessCut.lua +++ b/LuaLibs/ProcessCut.lua @@ -44,19 +44,21 @@ function ProcessCut.Classify( Proc, b3Raw) -- recupero i dati del taglio local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, 0, GDB_ID.ROOT) if vtN:getZ() <= - 0.5 and abs( vtN:getY()) > 0.1 or ( vtN:getZ() <= - 0.174 and abs( vtN:getY()) > 0.866) then - local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, 0) + -- calcolo le massime estensioni lineari orizzontale e verticale della faccia + local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) + -- confronto queste estensioni con la massima dimensione del DiceCut (impossibile lavorare se entrambe maggiori) if DimH > BD.MAX_DIM_DICE and DimV > BD.MAX_DIM_DICE then return true, true end end - -- verifico se c'è un taglio da sotto e se è nei limiti + -- se è un taglio da sotto, lo verifico local dNzLimDwnUp = BL.GetNzLimDownUp( b3Raw) local bDownCut = ( vtN:getZ() <= dNzLimDwnUp) if bDownCut then + -- calcolo l'ingombro orizzontale della faccia local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, 0) - -- confronto anche qua la distanza maggiore della faccia con la massima distanza del DiceCut - -- e se il rapporto supera il 2 (implica che genera 3 tagli) dichiaro impossibile la lavorazione - if DimH and BD.MAX_DIM_DICE and abs( BD.MAX_DIM_DICE) > 20 * GEO.EPS_SMALL and abs( DimH / BD.MAX_DIM_DICE) > 2 then + -- confronto questo ingombro con il doppio della massima dimensione del DiceCut (impossibile lavorare sotto da sopra se più di 2 tagli) + if DimH > 2 * BD.MAX_DIM_DICE then return true, true end end @@ -309,8 +311,7 @@ local function MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, b end local dMaxVertDepth = dMaxDepth - ( BD.DECR_VERT_CUT or 0) -- determino la direzione di taglio preferenziale - local frFac, dCutH, dCutV = BL.GetFaceHvRefDim( Proc.Id, 0) - dCutH = min( dCutH, b3Raw:getDimY() / abs( frFac:getVersX():getY())) + local frFac, dCutH, dCutV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) local bHorizCut = ( dCutV < dMaxVertDepth - BD.CUT_EXTRA and not bDownCut) local bVertCutOk = ( dCutH < dMaxDepth - BD.CUT_EXTRA) -- recupero gruppo per geometria addizionale @@ -474,7 +475,11 @@ local function MakeFromTop( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead, b elseif Proc.Head then vtOrthoO = EgtIf( vtN:getY() > -0.02, -Y_AX(), Y_AX()) else - vtOrthoO = EgtIf( vtN:getY() > 0.02, Y_AX(), -Y_AX()) + if vtN:getZ() < dVzLimDwnUp then + vtOrthoO = EgtIf( vtN:getY() > -0.02, -Y_AX(), Y_AX()) + else + vtOrthoO = EgtIf( vtN:getY() > 0.02, Y_AX(), -Y_AX()) + end end -- taglio local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, vtOrthoO, dVzLimDwnUp, dCutExtra, BD.CUT_SIC, 0, 0, 0, nil, b3Raw) @@ -511,8 +516,7 @@ local function MakeFromDown( sCutting, Proc, nPhase, nRawId, nPartId, dOvmHead) end local dMaxVertDepth = dMaxDepth -- determino la direzione di taglio preferenziale - local frFac, dCutH, dCutV = BL.GetFaceHvRefDim( Proc.Id, 0) - dCutH = min( dCutH, b3Raw:getDimY() / abs( frFac:getVersX():getY())) + local frFac, dCutH, dCutV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) local bHorizCut = ( dCutV < dMaxVertDepth - BD.CUT_EXTRA) or Proc.AdvTail -- recupero gruppo per geometria addizionale local nAddGrpId = BL.GetAddGroup( nPartId) diff --git a/LuaLibs/ProcessDoubleCut.lua b/LuaLibs/ProcessDoubleCut.lua index 5270304..3a809c1 100644 --- a/LuaLibs/ProcessDoubleCut.lua +++ b/LuaLibs/ProcessDoubleCut.lua @@ -28,31 +28,34 @@ end function ProcessDoubleCut.Classify( Proc, b3Raw) --se una faccia, uso la classificazione dei tagli singoli if Proc.Fct == 1 then return Cut.Classify( Proc, b3Raw) end - -- se PF con testa da sotto, ammessa qualunque orientazione - if BD.C_SIMM and BD.DOWN_HEAD then + -- se PF con testa da sotto o TURN, ammessa qualunque orientazione + if ( BD.C_SIMM and BD.DOWN_HEAD) or BD.TURN then return true end - -- verifico se convesso + -- determino se convesso o concavo local bAdj, _, _, dAng = EgtSurfTmFacetsContact( Proc.Id, 0, 1, GDB_ID.ROOT) local bConvex = ( not bAdj or ( dAng > 0)) + -- se convesso if bConvex then -- recupero i dati di ogni singola faccia for i = 1, 2 do local nFac = i - 1 local vtN = EgtSurfTmFacetNormVersor( Proc.Id, nFac, GDB_ID.ROOT) if ( vtN:getZ() <= - 0.5 and abs( vtN:getY()) > 0.1) or ( vtN:getZ() <= - 0.174 and abs( vtN:getY()) > 0.866) then - local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, nFac) - if DimH > BD.MAX_DIM_DICE then + -- calcolo la massima estensione orizzontale lineare della faccia + local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, nFac, b3Raw) + -- confronto questa estensione con la massima dimensione del DiceCut (impossibile lavorare se maggiore) + if DimH > BD.MAX_DIM_DICE and DimV > BD.MAX_DIM_DICE then return true, true end end local dNzLimDwnUp = BL.GetNzLimDownUp( b3Raw, vtN) local bDownCut = ( vtN:getZ() <= dNzLimDwnUp) if bDownCut then + -- calcolo l'ingombro orizzontale della faccia local _, DimH, DimV = BL.GetFaceHvRefDim( Proc.Id, nFac) - -- confronto anche qua la distanza maggiore della faccia con la massima distanza del DiceCut - -- e se il rapporto supera il 2 (implica che genera 3 tagli) dichiaro impossibile la lavorazione - if DimH and BD.MAX_DIM_DICE and abs( BD.MAX_DIM_DICE) > 20 * GEO.EPS_SMALL and abs( DimH / BD.MAX_DIM_DICE) > 2 then + -- confronto questo ingombro con il doppio della massima dimensione del DiceCut (impossibile lavorare sotto da sopra se più di 2 tagli) + if DimH > 2 * BD.MAX_DIM_DICE then return true, true end end