From 22c74c3252b3130f50fea8f542dc0961fb2a90ae Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Mon, 8 Jan 2024 16:55:31 +0100 Subject: [PATCH] - in headcut e split varie correzioni a tagli aggiuntivi per trave larga; rimangono da implementare per BigSection - test annotations @param, #return in funzione GetFaceHvRefDim del BeamLib --- LuaLibs/BeamLib.lua | 7 ++++++ LuaLibs/ProcessHeadCut.lua | 46 ++++++++++++++++++++++++++++++---- LuaLibs/ProcessSplit.lua | 51 +++++++++++++++++++++++++++++--------- 3 files changed, 87 insertions(+), 17 deletions(-) diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index dc21b9a..b181c7d 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -676,6 +676,13 @@ function BeamLib.GetFaceWithMostAdj( Proc, nPartId, bCompare3Fc, dCosSideAng) end --------------------------------------------------------------------- +--- ritorna il riferimento di tipo OCS della faccia *nFacet* della trimesh *nSurfId* e le dimensioni orizzontale e verticale, eventualmente limitate dal grezzo *b3Raw* +---@param nSurfId integer Id della trimesh +---@param nFacet integer Indice 0-based della faccia della trimesh di cui restituire le informazioni +---@param b3Raw? BBox3d Eventuale box del grezzo per limitare le dimensioni +---@return Frame3d frHv riferimento faccia OCS +---@return number dDimH dimensione orizzontale OCS +---@return number dDmiV dimensione verticale OCS function BeamLib.GetFaceHvRefDim( nSurfId, nFacet, b3Raw) -- recupero centro e normale della faccia local ptC, vtN = EgtSurfTmFacetCenter( nSurfId, nFacet, GDB_ID.ROOT) diff --git a/LuaLibs/ProcessHeadCut.lua b/LuaLibs/ProcessHeadCut.lua index dcfd8ff..d0639a3 100644 --- a/LuaLibs/ProcessHeadCut.lua +++ b/LuaLibs/ProcessHeadCut.lua @@ -151,6 +151,31 @@ local function MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmHead) return true, nil end +--------------------------------------------------------------------- +-- tagli verticali aggiuntivi +local function AddVerticalPreCuts( Proc, sCutting, dCutXOffset, b3Raw ) + local _, dimH = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) + local nVerticalCuts = ceil( dimH / ( 2 * BD.MAX_DIM_DICE)) - 1 + local dVerticalSliceHeight = dimH / ( nVerticalCuts + 1) + -- recupero il diametro dell'utensile + local dSawDiam = 400 + if EgtMdbSetCurrMachining( sCutting) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dSawDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam + end + end + local bOk, sErr + -- tagli orizzontali + for j = nVerticalCuts, 1, -1 do + local nFaceUse = MCH_MILL_FU.PARAL_FRONT + local dVerticalCutOffset = dVerticalSliceHeight * -j + bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nFaceUse, nil, -0.1 -dCutXOffset, BD.CUT_SIC, dVerticalCutOffset, 0, 0, '', b3Raw) + if not bOk then return bOk, sErr end + end + return bOk, sErr +end + --------------------------------------------------------------------- -- Applicazione della lavorazione function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut) @@ -162,6 +187,8 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut local bOkc, sErrC = MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmHead) if not bOkc then return bOkc, sErrC end end + -- eventuali informazioni sul tipo di finitura + local nQ05 = EgtGetInfo( nOriId or GDB_ID.NULL, 'Q05', 'i') or 0 -- recupero la lavorazione local sCutting = ML.FindCutting( 'HeadSide') if not sCutting then @@ -212,12 +239,13 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut -- determino se più tagli con offset local nCuts = max( ceil( dOvmHead / (( BD.MAX_LEN_SCRAP_START or BD.MAX_LEN_SCRAP) + 0.5)), 1) local dOffsL = dOvmHead / nCuts + local _, dimH, dimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) + local dMinOvmHeadForAddeddCuts = 10.123 -- se taglio per sezioni alte e larghe if bBigSectionCut then if dOvmHead > 0 then - local nQ05 = EgtGetInfo( nOriId or GDB_ID.NULL, 'Q05', 'i') or 0 -- se finitura con lama - if nQ05 == 1 or nQ05 == 0 then + if nQ05 < 2 then local dSawThickCheck = dSawThick if dSawThick2 > 0 and bDoubleHorizCut then dSawThickCheck = min( dSawThick, dSawThick2) @@ -228,6 +256,11 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut else dMaxElev = Proc.Box:getMax():getX() - b3Raw:getMin():getX() end + -- se trave larga effettuo tagli verticali aggiuntivi + if ( dimH > BD.MAX_LEN_DICE) and ( dOvmHead > dMinOvmHeadForAddeddCuts - 10 * GEO.EPS_SMALL) then + local bOk, sErr = AddVerticalPreCuts( Proc, sCutting, 0, b3Raw) + if not bOk then return bOk, sErr end + end -- controllo se è necessario un taglio con dicing o si deve proseguire ai casi standard if dMaxElev > dSawThickCheck then local bOk, sErr = Cut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, nil, false, true, nil, nil, dCurrOvmT) @@ -286,9 +319,7 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut end -- per travi alte faccio dei tagli orizzontali aggiuntivi - local _, _, dimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) - local dMinOvmHeadForHorizontalCuts = 10.123 - local bAreHorizontalCutsNeeded = ( dimV > BD.MAX_LEN_DICE) and not bBigSectionCut and ( dOvmHead > dMinOvmHeadForHorizontalCuts - 10 * GEO.EPS_SMALL) + local bAreHorizontalCutsNeeded = ( dimV > BD.MAX_LEN_DICE) and not bBigSectionCut and ( dOvmHead > dMinOvmHeadForAddeddCuts - 10 * GEO.EPS_SMALL) if bAreHorizontalCutsNeeded then local nHorizontalCuts = ceil( dimV / BD.MAX_DIM_DICE) - 1 local dHorizontalSliceHeight = dimV / ( nHorizontalCuts + 1) @@ -328,6 +359,11 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut -- eseguo i tagli necessari for i = nCuts, 1, -1 do local dCutOffset = ( i - 1) * dOffsL + -- se trave larga effettuo tagli verticali aggiuntivi + if ( dimH > BD.MAX_LEN_DICE) and ( dOvmHead > dMinOvmHeadForAddeddCuts - 10 * GEO.EPS_SMALL) then + local bOk, sErr = AddVerticalPreCuts( Proc, sCutting, dCutOffset, b3Raw) + if not bOk then return bOk, sErr end + end local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, dAccEnd, '', b3Raw) if not bOk then return false, sErr end end diff --git a/LuaLibs/ProcessSplit.lua b/LuaLibs/ProcessSplit.lua index b40c9a4..f5f69cb 100644 --- a/LuaLibs/ProcessSplit.lua +++ b/LuaLibs/ProcessSplit.lua @@ -241,6 +241,31 @@ local function MakeSplitByChainSaw( nSurfId, nFaceUse, dDepth, sNotes, dOffs) return true, sName, nMchFId end +--------------------------------------------------------------------- +-- tagli verticali aggiuntivi +local function AddVerticalPreCuts( Proc, sCutting, dCutXOffset, b3Raw ) + local _, dimH = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) + local nVerticalCuts = ceil( dimH / ( 2 * BD.MAX_DIM_DICE)) - 1 + local dVerticalSliceHeight = dimH / ( nVerticalCuts + 1) + -- recupero il diametro dell'utensile + local dSawDiam = 400 + if EgtMdbSetCurrMachining( sCutting) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dSawDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dSawDiam + end + end + local bOk, sErr + -- tagli orizzontali + for j = nVerticalCuts, 1, -1 do + local nFaceUse = MCH_MILL_FU.PARAL_FRONT + local dVerticalCutOffset = dVerticalSliceHeight * -j + bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nFaceUse, nil, -0.1 -dCutXOffset, BD.CUT_SIC, dVerticalCutOffset, 0, 0, '', b3Raw) + if not bOk then return bOk, sErr end + end + return bOk, sErr +end + --------------------------------------------------------------------- -- Applicazione della lavorazione function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrStd, bPreMove, vtMove, dOvmTail) @@ -307,6 +332,8 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt local dLenEndRaw = dOvmTail local nCuts = 1 local dOffsL = 0 + local _, dimH, dimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) + local dMinTailScrapForAdditionalCuts = 10.123 if not bSplit then -- cerco grezzo successivo che sia nella fase if nNextRawId and EgtVerifyRawPartPhase( nNextRawId, nPhase) then @@ -348,15 +375,7 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt end end - ---@alias SplitType - ---| '"single horizontal"' # taglio con motosega da sopra - ---| '"single vertical"' # taglio con motosega da davanti - ---| '"double vertical"' # taglio doppio con motosega davanti e dietro - ---| '"double horizontal"' # taglio doppio con motosega da sopra e lama da sotto - - ---@type ( SplitType) local bigSectionSplitType - -- se pezzo non troppo alto, taglio singolo da sopra if b3Raw:getDimZ() + BD.CUT_EXTRA_MIN < dChainSawMaxMat + 10 * GEO.EPS_SMALL then bigSectionSplitType = "single horizontal" @@ -464,7 +483,7 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt dMaxElev = Proc.Box:getMax():getX() - b3Raw:getMin():getX() end -- se finitura con lama - if nQ05 == 1 or nQ05 == 0 or ( not bSplit and dMaxElev > dSawThickCheck) then + if nQ05 < 2 or ( not bSplit and dMaxElev > dSawThickCheck) then -- controllo se è necessario un taglio con dicing o si deve proseguire ai casi standard if bSplit or dMaxElev > dSawThickCheck then local bOk, sErr = Cut.Make( Proc, nNewPhase, nRawId, nPartId, dMaxElev, nil, false, true, b3Raw, sNotes, dCurrOvmT) @@ -539,9 +558,7 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt end -- per travi alte faccio faccio dei tagli orizzontali aggiuntivi - local _, _, dimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) - local dMinTailScrapForHorizontalCuts = 10.123 - local bAreHorizontalCutsNeeded = not bSplit and ( dimV > BD.MAX_LEN_DICE) and not bBigSectionCut and ( dLenEndRaw > dMinTailScrapForHorizontalCuts - 10 * GEO.EPS_SMALL) + local bAreHorizontalCutsNeeded = not bSplit and ( dimV > BD.MAX_LEN_DICE) and not bBigSectionCut and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL) if bAreHorizontalCutsNeeded then local nHorizontalCuts = ceil ( dimV / BD.MAX_DIM_DICE) - 1 local dHorizontalSliceHeight = dimV / ( nHorizontalCuts + 1) @@ -584,6 +601,11 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt -- eseguo i tagli necessari for i = nCuts, 1, -1 do local dCutOffset = ( i - 1) * dOffsL + -- se trave larga effettuo tagli verticali aggiuntivi + if not bSplit and ( dimH > BD.MAX_LEN_DICE) and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL) then + local bOk, sErr = AddVerticalPreCuts( Proc, sCutting, dCutOffset, b3Raw) + if not bOk then return bOk, sErr end + end local sNotes if bSplit then sNotes = EgtIf( i == 1, 'Split;', 'Presplit;') @@ -630,6 +652,11 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt -- eseguo i tagli da sopra necessari for i = nCuts, 1, -1 do local dCutOffset = ( i - 1) * dOffsL + -- se trave larga effettuo tagli verticali aggiuntivi + if not bSplit and ( dimH > BD.MAX_LEN_DICE) and ( dLenEndRaw > dMinTailScrapForAdditionalCuts - 10 * GEO.EPS_SMALL) then + local bOk, sErr = AddVerticalPreCuts( Proc, sCutting, dCutOffset, b3Raw) + if not bOk then return bOk, sErr end + end local sNotes if bSplit then sNotes = EgtIf( i == 1, 'Split;', 'Presplit;')