diff --git a/LuaLibs/FacesBySaw.lua b/LuaLibs/FacesBySaw.lua index 0536a5b..4caccce 100644 --- a/LuaLibs/FacesBySaw.lua +++ b/LuaLibs/FacesBySaw.lua @@ -14,6 +14,7 @@ -- 2022/06/29 DS In MakeTwo modificato controllo facce dirette verso il basso. -- 2022/09/08 In MakeOne aggiunto argomento bForceInvert per poter forzare l'inversione del percorso. -- 2023/02/13 Migliorata la direzione di lavoro della lama in modo da essere tendenzialmente opposta all'avanzamento. +-- 2023/04/20 Alcune modifiche per gestire tagli con faceuse parallelo -- Tabella per definizione modulo local FacesBySaw = {} @@ -30,7 +31,7 @@ local BD = require( 'BeamData') local ML = require( 'MachiningLib') --------------------------------------------------------------------- -function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert) +function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, nForceWorkSide, nForceSCC) -- dati della faccia local ptC, vtN = EgtSurfTmFacetCenter( nSurfId, nFacet, GDB_ID.ROOT) -- risolvo parametro ambiguo @@ -109,7 +110,17 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw local nFaceUse = nOrthoOpposite if bDownUp then nFaceUse = BL.GetOrtupOpposite( nOrthoOpposite) end local bWsRight = ( bInvert ~= bDownUp) - local nWorkSide = EgtIf( bWsRight, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT) + local nWorkSide = nForceWorkSide + if nWorkSide then + -- se il workside viene forzato, setto bWsRight di conseguenza + if nWorkSide == MCH_MILL_WS.LEFT then + bWsRight = false + else + bWsRight = true + end + else + nWorkSide = EgtIf( bWsRight, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT) + end -- Versore di riferimento local vtRef = Vector3d( vtTg) vtRef:rotate( vtN, EgtIf( bInvert, -90, 90)) @@ -136,14 +147,26 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw -- parametri di attacco/uscita local b3Box = BBox3d( b3Raw) b3Box:expand( dCutSic) - local ptP1act = ptP1 + vtN * dCutOffset - local ptP2act = ptP2 + vtN * dCutOffset + local dCutDeltaN, dCutDeltaX = dCutOffset, dCutExtra + -- per lavorazioni parallele, nel calcolo dei lead in e out gli offset vanno invertiti + if ( + nFaceUse == MCH_MILL_FU.PARAL_DOWN or + nFaceUse == MCH_MILL_FU.PARAL_TOP or + nFaceUse == MCH_MILL_FU.PARAL_FRONT or + nFaceUse == MCH_MILL_FU.PARAL_BACK or + nFaceUse == MCH_MILL_FU.PARAL_LEFT or + nFaceUse == MCH_MILL_FU.PARAL_RIGHT + ) then + dCutDeltaN, dCutDeltaX = dCutDeltaX, dCutDeltaN + end + local ptP1act = ptP1 + vtN * dCutDeltaN + local ptP2act = ptP2 + vtN * dCutDeltaN -- attacco perpendicolare - local dLiTang, dLiPerp, dLoTang, dLoPerp, vtLio = FacesBySaw.CalcLeadInOutPerpGeom( ptP1act, ptP2act, vtV1, vtV2, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box) + local dLiTang, dLiPerp, dLoTang, dLoPerp, vtLio = FacesBySaw.CalcLeadInOutPerpGeom( ptP1act, ptP2act, vtV1, vtV2, vtN, dSawDiam/2, vtRef, dCutDeltaX, b3Box) local dLenLi = sqrt( dLiTang * dLiTang + dLiPerp * dLiPerp) local dLenLo = sqrt( dLoTang * dLoTang + dLoPerp * dLoPerp) -- attacco tangente - local dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp = FacesBySaw.CalcLeadInOutTangGeom( ptP1act, ptP2act, vtN, dSawDiam/2, vtRef, dCutExtra, b3Box) + local dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp = FacesBySaw.CalcLeadInOutTangGeom( ptP1act, ptP2act, vtN, dSawDiam/2, vtRef, dCutDeltaX, b3Box) local dLenLi2 = abs( dLi2Tang) local dLenLo2 = abs( dLo2Tang) -- scelgo l'attacco più conveniente (se non taglio praticamente longitudinale) @@ -165,33 +188,36 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw end -- posizione braccio EgtOutLog( 'vtN=' .. tostring( vtN) .. ' vtRef=' .. tostring( vtRef) .. ' vtOut=' .. tostring( vtOut) .. ' vtAux=' .. tostring( vtAux), 3) - local nSCC = MCH_SCC.NONE - if not BD.TURN then - if abs( vtAux:getX()) > abs( vtAux:getY()) - GEO.EPS_SMALL then - nSCC = EgtIf( ( vtAux:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM) - else - nSCC = EgtIf( ( vtAux:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) - end - else - if bTurnTang then - local vtTest = EgtIf( bInvert, vtTg, -vtTg) - if abs( vtTest:getY()) > abs( vtTest:getZ()) then - nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) + local nSCC = nForceSCC + if nSCC == nil then + nSCC = MCH_SCC.NONE + if not BD.TURN then + if abs( vtAux:getX()) > abs( vtAux:getY()) - GEO.EPS_SMALL then + nSCC = EgtIf( ( vtAux:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM) else - nSCC = EgtIf( vtTest:getZ() > 0, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM) + nSCC = EgtIf( ( vtAux:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) end else - local vtTest = vtOut -- vtLio - if abs( vtN:getY()) < 0.174 and abs( vtN:getZ()) < 0.174 then + if bTurnTang then + local vtTest = EgtIf( bInvert, vtTg, -vtTg) if abs( vtTest:getY()) > abs( vtTest:getZ()) then nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) else nSCC = EgtIf( vtTest:getZ() > 0, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM) end - elseif abs( vtN:getZ()) < 0.174 then - nSCC = EgtIf( vtTest:getZ() > -0.017, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM) else - nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) + local vtTest = vtOut -- vtLio + if abs( vtN:getY()) < 0.174 and abs( vtN:getZ()) < 0.174 then + if abs( vtTest:getY()) > abs( vtTest:getZ()) then + nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) + else + nSCC = EgtIf( vtTest:getZ() > 0, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM) + end + elseif abs( vtN:getZ()) < 0.174 then + nSCC = EgtIf( vtTest:getZ() > -0.017, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM) + else + nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) + end end end end diff --git a/LuaLibs/ProcessHeadCut.lua b/LuaLibs/ProcessHeadCut.lua index 51f397b..f0b51b1 100644 --- a/LuaLibs/ProcessHeadCut.lua +++ b/LuaLibs/ProcessHeadCut.lua @@ -6,6 +6,7 @@ -- 2022/09/08 Migliorato verso di lavorazione in caso di DoubleCut -- 2022/11/02 Corretti accorciamenti per DoubleCut -- 2022/11/10 Corrette finiture lama per BigSection con trave alta +-- 2023/04/20 Per travi alte aggiunti tagli orizzontali per ridurre le dimensioni degli scarti -- Tabella per definizione modulo local ProcessHeadCut = {} @@ -119,7 +120,7 @@ local function MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmHead) -- eseguo if not ML.ApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() - EgtSetOperationMode( nMchId, false) + EgtSetOperationMode( nMch1Id, false) return false, sErr end -- Inserisco la lavorazione del lato opposto @@ -142,7 +143,7 @@ local function MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmHead) -- eseguo if not ML.ApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() - EgtSetOperationMode( nMchId, false) + EgtSetOperationMode( nMch1Id, false) return false, sErr end return true, nil @@ -205,7 +206,7 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut -- se non obbligatorio e coincide con inizio grezzo, non va fatto if not bNeedHCut and AreSameVectorApprox( vtN, X_AX()) and abs( ptC:getX() - b3Raw:getMax():getX()) < 10 * GEO.EPS_SMALL then return true - end + end -- determino se più tagli con offset local nCuts = max( ceil( dOvmHead / ( BD.MAX_LEN_SCRAP_START or BD.MAX_LEN_SCRAP)), 1) local dOffsL = dOvmHead / nCuts @@ -269,6 +270,40 @@ function ProcessHeadCut.Make( Proc, nPhase, nRawId, nPartId, dOvmHead, bNeedHCut dAccStart = sqrt( dSawRad * dSawRad - dKL * dKL) end end + + -- per travi alte faccio faccio dei tagli orizzontali aggiuntivi + local _, _, dimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) + local dMinOvmHeadForHorizontalCuts = 10 + local bAreHorizontalCutsNeeded = ( dimV > BD.MAX_LEN_DICE) and not bBigSectionCut and ( dOvmHead > dMinOvmHeadForHorizontalCuts - 10 * GEO.EPS_SMALL) + if bAreHorizontalCutsNeeded then + local nHorizontalCuts = ceil ( dimV / BD.MAX_DIM_DICE) - 1 + local dHorizontalSliceHeight = dimV / ( nHorizontalCuts + 1) + for i = nCuts, 1, -1 do + local dCutXOffset = ( i - 1) * dOffsL + -- tagli orizzontali + for j = nHorizontalCuts, 1, -1 do + local nFaceUse = MCH_MILL_FU.PARAL_DOWN + local dHorizontalCutOffset = dHorizontalSliceHeight * -j + local nForceWorkSide = MCH_MILL_WS.LEFT + local bForceInvert = true + local nForceSCC = MCH_SCC.ADIR_XP + local bOk, sErr = Fbs.MakeOne( Proc.Id, 0 , sCutting, dSawDiam, nFaceUse, nil, -0.1 - dCutXOffset, BD.CUT_SIC, dHorizontalCutOffset, 0, 0, '', b3Raw, bForceInvert, nForceWorkSide, nForceSCC) + if not bOk then return bOk, sErr end + end + -- se necessario taglio verticale doppio, eseguo l'opposto + if bDoubleCut then + -- gli accorciamenti vanno invertiti per il taglio opposto + local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart + local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, MCH_MILL_FU.ORTHO_BACK, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStartDoubleCut, dAccEndDoubleCut, '', b3Raw, true) + if not bOk then return false, sErr end + end + -- taglio verticale + local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStart, dAccEnd, '', b3Raw) + if not bOk then return bOk, sErr end + end + return true, sWarn + end + -- se necessari tagli in doppio, eseguo gli opposti if bDoubleCut then -- gli accorciamenti vanno invertiti per il taglio opposto diff --git a/LuaLibs/ProcessSplit.lua b/LuaLibs/ProcessSplit.lua index a4d14bb..5d7d8fd 100644 --- a/LuaLibs/ProcessSplit.lua +++ b/LuaLibs/ProcessSplit.lua @@ -9,6 +9,7 @@ -- 2022/11/16 Correzioni per travi larghe -- 2022/11/30 Correzione per tagli su grandi sezioni (dopo taglio con sega a catena senza finitura aggiungeva uno split con lama). -- 2023/04/04 Modifiche per travi con sezioni molto grandi e materiale inferiore allo spessore lama. +-- 2023/04/20 Per travi alte aggiunti tagli orizzontali per ridurre le dimensioni degli scarti -- Tabella per definizione modulo local ProcessSplit = {} @@ -122,7 +123,7 @@ local function MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmHead) -- eseguo if not ML.ApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() - EgtSetOperationMode( nMchId, false) + EgtSetOperationMode( nMch1Id, false) return false, sErr end -- Inserisco la lavorazione del lato opposto @@ -145,7 +146,7 @@ local function MakeChamfer( nOriId, Proc, nPhase, nRawId, nPartId, dOvmHead) -- eseguo if not ML.ApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() - EgtSetOperationMode( nMchId, false) + EgtSetOperationMode( nMch1Id, false) return false, sErr end return true, nil @@ -299,13 +300,14 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt local nNextRawId = EgtGetNextRawPart( nRawId) local bSplit = ( nNextRawId and ( EgtGetPartInRawPartCount( nNextRawId) > 0 or EgtGetRawPartBBox( nNextRawId):getDimX() >= BD.MinRaw)) -- determino se più tagli con offset + local dLenEndRaw = dOvmTail local nCuts = 1 local dOffsL = 0 if not bSplit then -- cerco grezzo successivo che sia nella fase if nNextRawId and EgtVerifyRawPartPhase( nNextRawId, nPhase) then local b3NextRaw = EgtGetRawPartBBox( nNextRawId) - local dLenEndRaw = ptC:getX() - b3NextRaw:getMin():getX() + dLenEndRaw = ptC:getX() - b3NextRaw:getMin():getX() nCuts = ceil( dLenEndRaw / BD.MAX_LEN_SCRAP) dOffsL = dLenEndRaw / nCuts -- aggiorno ingombro del grezzo corrente con quello del successivo @@ -412,7 +414,7 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt if nQ05 == 1 or nQ05 == 0 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, dLenEndRaw, nil, false, true, b3Raw, sNotes, dCurrOvmT) + local bOk, sErr = Cut.Make( Proc, nNewPhase, nRawId, nPartId, dMaxElev, nil, false, true, b3Raw, sNotes, dCurrOvmT) if sNotesFinal then EgtSetMachiningParam( MCH_MP.USERNOTES, sNotesFinal) end @@ -470,6 +472,40 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt dAccStart = sqrt( max( dSawRad * dSawRad - dKL * dKL, 0)) end end + + -- per travi alte faccio faccio dei tagli orizzontali aggiuntivi + local _, _, dimV = BL.GetFaceHvRefDim( Proc.Id, 0, b3Raw) + local dMinTailScrapForHorizontalCuts = 10 + local bAreHorizontalCutsNeeded = ( dimV > BD.MAX_LEN_DICE) and not bBigSectionCut and ( dLenEndRaw > dMinTailScrapForHorizontalCuts - 10 * GEO.EPS_SMALL) + if bAreHorizontalCutsNeeded then + local nHorizontalCuts = ceil ( dimV / BD.MAX_DIM_DICE) - 1 + local dHorizontalSliceHeight = dimV / ( nHorizontalCuts + 1) + for i = nCuts, 1, -1 do + local dCutXOffset = ( i - 1) * dOffsL + -- tagli orizzontali + for j = nHorizontalCuts, 1, -1 do + local nFaceUse = MCH_MILL_FU.PARAL_DOWN + local dHorizontalCutOffset = dHorizontalSliceHeight * -j + local nForceWorkSide = MCH_MILL_WS.LEFT + local bForceInvert = true + local nForceSCC = MCH_SCC.ADIR_XM + local bOk, sErr = Fbs.MakeOne( Proc.Id, 0 , sCutting, dSawDiam, nFaceUse, nil, -0.1 - dCutXOffset, BD.CUT_SIC, dHorizontalCutOffset, 0, 0, '', b3Raw, bForceInvert, nForceWorkSide, nForceSCC) + if not bOk then return bOk, sErr end + end + -- se necessario taglio verticale doppio, eseguo l'opposto + if bDoubleCut then + -- gli accorciamenti vanno invertiti per il taglio opposto + local dAccStartDoubleCut, dAccEndDoubleCut = dAccEnd, dAccStart + local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, MCH_MILL_FU.ORTHO_FRONT, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStartDoubleCut, dAccEndDoubleCut, '', b3Raw, true) + if not bOk then return false, sErr end + end + -- taglio verticale + local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutXOffset, dAccStart, dAccEnd, '', b3Raw) + if not bOk then return bOk, sErr end + end + return true, sWarn + end + -- se necessari tagli in doppio, eseguo gli opposti if bDoubleCut then -- gli accorciamenti vanno invertiti per il taglio opposto