diff --git a/BatchProcess.lua b/BatchProcess.lua index 9948bb7..f666518 100644 --- a/BatchProcess.lua +++ b/BatchProcess.lua @@ -1,4 +1,4 @@ --- BatchProcess.lua by Egaltech s.r.l. 2022/04/28 +-- BatchProcess.lua by Egaltech s.r.l. 2022/05/10 -- Gestione calcolo batch disposizione e lavorazioni per Travi -- 2019/07/11 Aggiunta gestione stato rotazione di feature per TS3. -- 2019/07/16 Aggiunta gestione modalità oltre 10 per impostazione macchina e uscita. @@ -24,6 +24,7 @@ -- 2021/08/04 Direzione vista simulazione da BD.SIMUL_VIEW_DIR se esiste. -- 2022/04/28 In info generazione aggiunta indicazione se 64bit. -- 2023/05/03 Tolleranza su sezione portata a 0.1 mm (100 * GEO.EPS_SMALL). +-- 2022/05/10 Dopo aver fatto rotazioni e inversioni dei pezzi cambio chiave Info relative. -- Intestazioni require( 'EgtBase') @@ -267,22 +268,26 @@ if bToProcess then vBeam[i].PosX = PosX end - -- Eseguo eventuali rotazioni e inversioni testa-coda + -- Se non già eseguite, applico eventuali rotazioni e inversioni testa-coda for i = 1, #vBeam do local b3Solid = vBeam[i].Box -- rotazione - local dRotAng = EgtGetInfo( vBeam[i].Id, 'ROTATED', 'd') - if dRotAng and abs( dRotAng) > GEO.EPS_ANG_SMALL then + local dRotAng = EgtGetInfo( vBeam[i].Id, 'ROTATED', 'd') or 0 + if abs( dRotAng) > GEO.EPS_ANG_SMALL then local ptRotCen = b3Solid:getCenter() EgtRotate( vBeam[i].Id, ptRotCen, X_AX(), dRotAng, GDB_RT.GLOB) b3Solid:rotate( ptRotCen, X_AX(), dRotAng) end + EgtRemoveInfo( vBeam[i].Id, 'ROTATED') + EgtSetInfo( vBeam[i].Id, 'ROTATED_OK', dRotAng) -- inversione local dInvAng = 180 - ( EgtGetInfo( vBeam[i].Id, 'INVERTED', 'd') or 0) if abs( dInvAng) > GEO.EPS_ANG_SMALL then local ptInvCen = b3Solid:getCenter() EgtRotate( vBeam[i].Id, ptInvCen, Z_AX(), dInvAng, GDB_RT.GLOB) end + EgtRemoveInfo( vBeam[i].Id, 'INVERTED') + EgtSetInfo( vBeam[i].Id, 'INVERTED_OK', 180 - dInvAng) end -- Ne verifico le dimensioni diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index c741973..68b8251 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1395,16 +1395,14 @@ end ------------------------------------------------------------------------------------------------------------- -- Controlla se la feature ProcMirror è la specchiata di Proc, per feature di tipo tasca o simile local function CheckMirrorPocket( Proc, ProcMirror, b3Raw, AuxId) - + -- recupero i dati geometrici della curva Proc local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) local ptBC = EgtGP( AuxId, GDB_RT.GLOB) local rfDtMrt = EgtSurfTmFacetMinAreaRectangle( Proc.Id, 0, GDB_RT.GLOB) local b3DtMrt = EgtGetBBoxRef( Proc.Id, GDB_BB.STANDARD, rfDtMrt) local b3Proc = EgtGetBBoxGlob( Proc.Id, GDB_BB.STANDARD) - -- determino l'asse della curva Proc - local vtAx = EgtEV( AuxId, GDB_RT.GLOB) - EgtSV( AuxId, GDB_RT.GLOB) - + -- recupero e verifico l'entità curva ProcMirror local AuxIdMirror = EgtGetInfo( ProcMirror.Id, 'AUXID', 'i') if AuxIdMirror then AuxIdMirror = AuxIdMirror + ProcMirror.Id end @@ -1420,35 +1418,49 @@ local function CheckMirrorPocket( Proc, ProcMirror, b3Raw, AuxId) local ptBCMirror = EgtGP( AuxIdMirror, GDB_RT.GLOB) local b3DtMrtMirror = EgtGetBBoxRef( ProcMirror.Id, GDB_BB.STANDARD, rfDtMrt) local b3ProcMirror = EgtGetBBoxGlob( ProcMirror.Id, GDB_BB.STANDARD) - -- determino l'asse della curva ProcMirror - local vtAxMirror = EgtEV( AuxIdMirror, GDB_RT.GLOB) - EgtSV( AuxIdMirror, GDB_RT.GLOB) - - -- verifico se le mortase sono specchiate - local bIsMirror = true + + -- verifico se le mortase sono specchiate : + -- devono avere estrusioni opposte + if not AreOppositeVectorApprox( vtExtr, vtExtrMirror) then + return false + end + -- se di tipo Dt, devono avere l'asse allineato + if DtMortise.SideIdentify( Proc) or DtMortise.SideIdentify( ProcMirror) then + local vtAx = EgtEV( AuxId, GDB_RT.GLOB) - EgtSV( AuxId, GDB_RT.GLOB) + local vtAxMirror = EgtEV( AuxIdMirror, GDB_RT.GLOB) - EgtSV( AuxIdMirror, GDB_RT.GLOB) + if not AreSameVectorApprox( vtAx, vtAxMirror) then + return false + end + end + -- devono avere il centro allineato, essere equidistanti dalla mezzaria trave e non essere troppo vicine local vtDisplacement = ptBC - ptBCMirror local ptCenRaw = b3Raw:getCenter() - local dYMinDistance = EgtIf( ptBC:getY() > ptBCMirror:getY(), abs( b3ProcMirror:getMax():getY() - b3Proc:getMin():getY()), abs( b3Proc:getMax():getY() - b3ProcMirror:getMin():getY())) - local dZMinDistance = EgtIf( ptBC:getZ() > ptBCMirror:getZ(), abs( b3ProcMirror:getMax():getZ() - b3Proc:getMin():getZ()), abs( b3Proc:getMax():getZ() - b3ProcMirror:getMin():getZ())) local dMinimumDistanceMirroredFeatures = 50 - -- controllo che il centro delle due mortase sia allineato, che queste siano equidistanti dalla mezzeria della trave - -- e che queste non siano troppo vicine if AreSameOrOppositeVectorApprox( vtExtr, Y_AX()) then - bIsMirror = abs( vtDisplacement:getX()) < 500 * GEO.EPS_SMALL and abs( vtDisplacement:getZ()) < 500 * GEO.EPS_SMALL and - ( abs( ptBC:getY() - ptCenRaw:getY()) - abs( ptBCMirror:getY() - ptCenRaw:getY())) < 500 * GEO.EPS_SMALL and - dYMinDistance - dMinimumDistanceMirroredFeatures > 10 * GEO.EPS_SMALL + local dYMinDistance = max( b3Proc:getMin():getY(), b3ProcMirror:getMin():getY()) - min( b3Proc:getMax():getY(), b3ProcMirror:getMax():getY()) + if not ( abs( vtDisplacement:getX()) < 500 * GEO.EPS_SMALL and abs( vtDisplacement:getZ()) < 500 * GEO.EPS_SMALL and + ( abs( ptBC:getY() - ptCenRaw:getY()) - abs( ptBCMirror:getY() - ptCenRaw:getY())) < 500 * GEO.EPS_SMALL and + dYMinDistance > dMinimumDistanceMirroredFeatures + 10 * GEO.EPS_SMALL) then + return false + end elseif AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then - bIsMirror = abs( vtDisplacement:getX()) < 500 * GEO.EPS_SMALL and abs( vtDisplacement:getY()) < 500 * GEO.EPS_SMALL and - ( abs( ptBC:getZ() - ptCenRaw:getZ()) - abs( ptBCMirror:getZ() - ptCenRaw:getZ())) < 500 * GEO.EPS_SMALL and - dZMinDistance - dMinimumDistanceMirroredFeatures > 10 * GEO.EPS_SMALL + local dZMinDistance = max( b3Proc:getMin():getZ(), b3ProcMirror:getMin():getZ()) - min( b3Proc:getMax():getZ(), b3ProcMirror:getMax():getZ()) + if not ( abs( vtDisplacement:getX()) < 500 * GEO.EPS_SMALL and abs( vtDisplacement:getY()) < 500 * GEO.EPS_SMALL and + ( abs( ptBC:getZ() - ptCenRaw:getZ()) - abs( ptBCMirror:getZ() - ptCenRaw:getZ())) < 500 * GEO.EPS_SMALL and + dZMinDistance > dMinimumDistanceMirroredFeatures + 10 * GEO.EPS_SMALL) then + return false + end + else + return false + end + -- devono avere box con le stesse dimensioni + if not ( abs( b3DtMrt:getDimX() - b3DtMrtMirror:getDimX()) < 500 * GEO.EPS_SMALL and + abs( b3DtMrt:getDimY() - b3DtMrtMirror:getDimY()) < 500 * GEO.EPS_SMALL and + abs( b3DtMrt:getDimZ() - b3DtMrtMirror:getDimZ()) < 500 * GEO.EPS_SMALL) then + return false end - -- controllo che le dimensioni dei due box siano le stesse - bIsMirror = bIsMirror and abs( b3DtMrt:getDimX() - b3DtMrtMirror:getDimX()) < 500 * GEO.EPS_SMALL and - abs( b3DtMrt:getDimY() - b3DtMrtMirror:getDimY()) < 500 * GEO.EPS_SMALL and - abs( b3DtMrt:getDimZ() - b3DtMrtMirror:getDimZ()) < 500 * GEO.EPS_SMALL - -- controllo che l'asse delle due mortase sia allineato - bIsMirror = bIsMirror and AreSameVectorApprox( vtAx, vtAxMirror) - return bIsMirror + return true end ------------------------------------------------------------------------------------------------------------- @@ -1833,11 +1845,15 @@ function BeamExec.ProcessFeatures() nRId = EgtGetNextRawPart( nRId) end EgtSetInfo( nDispId, 'ROT', -2) + -- flag feature precedente in doppio + local nPrevDouble = 0 -- inserisco le lavorazioni da lavorare ribaltate for i = 1, #vProc do -- creo la lavorazione local Proc = vProc[i] if Proc.Flg ~= 0 and Proc.Down then + Proc.PrevDouble = nPrevDouble + nPrevDouble = Proc.Double local bOk, sMsg, nNewPhase = AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bNeedHCut, b3Raw, nOrd, sDownOrSideOrStd, nil, nil, dCurrOvmT) if not bOk then nTotErr = nTotErr + 1 @@ -1905,12 +1921,16 @@ function BeamExec.ProcessFeatures() nRId = EgtGetNextRawPart( nRId) end EgtSetInfo( nDispId, 'ROT', -1) + -- flag feature precedente in doppio + local nPrevDouble = 0 -- inserisco le lavorazioni da lavorare ruotate local nSideMchOk = 0 for i = 1, #vProc do -- creo la lavorazione local Proc = vProc[i] if Proc.Flg ~= 0 and Proc.Side then + Proc.PrevDouble = nPrevDouble + nPrevDouble = Proc.Double local bOk, sMsg, nNewPhase = AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, false, b3Raw, nOrd, sDownOrSideOrStd, bPreMove, vtMove, dCurrOvmT) if not bOk then nTotErr = nTotErr + 1 @@ -1967,11 +1987,15 @@ function BeamExec.ProcessFeatures() EgtSetInfo( nDispId, 'ORD', nOrd) end sDownOrSideOrStd = 'STD' + -- flag feature precedente in doppio + local nPrevDouble = 0 -- inserisco le lavorazioni non ribaltate della trave for i = 1, #vProc do -- creo la lavorazione local Proc = vProc[i] if Proc.Flg ~= 0 and ( not ( Proc.Down or Proc.Side) or BD.DOWN_HEAD or BD.TURN) then + Proc.PrevDouble = nPrevDouble + nPrevDouble = Proc.Double local bOk, sMsg, nNewPhase = AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, false, b3Raw, nOrd, sDownOrSideOrStd, nil, nil, dCurrOvmT) if not bOk then nTotErr = nTotErr + 1 diff --git a/LuaLibs/FacesBySaw.lua b/LuaLibs/FacesBySaw.lua index 4caccce..cb94c89 100644 --- a/LuaLibs/FacesBySaw.lua +++ b/LuaLibs/FacesBySaw.lua @@ -1,4 +1,4 @@ --- FacesBySaw.lua by Egaltech s.r.l. 2022/09/24 +-- FacesBySaw.lua by Egaltech s.r.l. 2023/05/18 -- Gestione taglio con lama di feature con una o due facce -- 2021/01/06 Cambiato limite per attacco Tg con lama e CalcLeadInOutGeom rinominata in CalcLeadInOutPerpGeom. -- 2021/02/03 In taglio lama si accettano anche due lati con deviazione minore di 20deg. @@ -14,7 +14,8 @@ -- 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 +-- 2023/04/20 Alcune modifiche per gestire tagli con faceuse parallelo. +-- 2023/05/18 Imposto in ogni caso dVzLimDwnUp prima anche di bDownHead. -- Tabella per definizione modulo local FacesBySaw = {} @@ -44,8 +45,10 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw nOrthoOpposite = Par5 vtOrthO = BL.GetVersRef( Par5) end - -- verifico se testa da sotto + -- verifico se testa da sotto oppure se lavorazione sotto con testa da sopra + if not dVzLimDwnUp then dVzLimDwnUp = BL.GetNzLimDownUp( b3Raw, vtN, vtOrthO) end local bDownHead = ( dVzLimDwnUp and dVzLimDwnUp < - 1.5) + local bDownUp = ( vtN:getZ() < dVzLimDwnUp) -- linea o bilinea di lavorazione (qui uso nOrthoOpposite per ripetere esattamente il calcolo del Mach) local ptP1, ptPm, ptP2, vtV1, vtV2, dLen, dWidth = EgtSurfTmFacetOppositeSide( nSurfId, nFacet, BL.GetVersRef( nOrthoOpposite), GDB_ID.ROOT) if not dLen or dLen < 1.1 or not dWidth or dWidth < 1.1 then @@ -54,24 +57,24 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw return true, '' end vtV1 = - vtV1 - -- verifico se lavorazione con lama sotto e testa sopra - if not dVzLimDwnUp then dVzLimDwnUp = BL.GetNzLimDownUp( b3Raw, vtN, vtOrthO) end - local bDownUp = ( vtN:getZ() < dVzLimDwnUp) -- verifico se la lama ruota in senso antiorario if not EgtMdbSetCurrMachining( sCutting) then return false end - local bIsSawCCW = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0 + local bIsSawCCW = ( EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0) local bInvert = bForceInvert -- se la lama ruota in senso antiorario inverto la direzione di lavorazione, per avere rotazione lama opposta a avanzamento - if bInvert == nil and bIsSawCCW and not bDownUp then - if ( ptP2:getZ() > ptP1:getZ() + 100 * GEO.EPS_SMALL) then - bInvert = false + if bInvert == nil then + if not BD.TURN then + if bIsSawCCW and not bDownUp then + bInvert = ( ptP2:getZ() < ptP1:getZ() + 100 * GEO.EPS_SMALL) + else + bInvert = ( ptP2:getZ() < ptP1:getZ() - 100 * GEO.EPS_SMALL) + end else - bInvert = true + local vtTmp = ptP2 - ptP1 ; vtTmp:normalize() + bInvert = ( ( vtOrthO:getX() > 0.1 and vtTmp:getX() < -0.1) or ( vtOrthO:getX() < -0.1 and vtTmp:getX() > 0.1)) end - elseif bInvert == nil then - bInvert = ( ptP2:getZ() < ptP1:getZ() - 100 * GEO.EPS_SMALL) end if bInvert then ptP1, ptP2 = ptP2, ptP1 @@ -148,15 +151,13 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw local b3Box = BBox3d( b3Raw) b3Box:expand( dCutSic) 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 + -- 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 @@ -170,7 +171,7 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw local dLenLi2 = abs( dLi2Tang) local dLenLo2 = abs( dLo2Tang) -- scelgo l'attacco più conveniente (se non taglio praticamente longitudinale) - local bTurnTang + local bLioTang local Ktp = 1.1 if BD.KIOTP then Ktp = BD.KIOTP end if ( not bDownUp or abs( vtTg:getY()) > 0.5) and @@ -179,10 +180,11 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw ( ( abs( vtTg:getZ()) < 0.17 and ( vtV1:getZ() < -0.5 or vtV2:getZ() < -0.5) and not bDownHead) or ( abs( vtTg:getZ()) < 0.51 and b3Box:getDimZ() > 300 and BD.C_SIMM and BD.MAX_HEIGHT > 450 and b3Box:getDimX() > BD.LEN_SHORT_PART) or ( abs( vtTg:getZ()) < 0.51 and ( dLenLi2 + dLenLo2) < ( dLenLi + dLenLo)) or Ktp * ( dLenLi2 + dLenLo2) < ( dLenLi + dLenLo)) then + bLioTang = true dLiTang, dLiPerp, dLoTang, dLoPerp = dLi2Tang, dLi2Perp, dLo2Tang, dLo2Perp if BD.TURN then - bTurnTang = true - dLoTang = -( dLiTang + dAllStart - dAccStart + dAllEnd - dAccEnd + dLen) + local dMove = dist( ptP1, ptP2) + dLoTang = -( dLiTang + dAllStart - dAccStart + dAllEnd - dAccEnd + dMove) dLoPerp = BD.COLL_SIC end end @@ -198,8 +200,9 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw 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 bLioTang then + --local vtTest = EgtIf( bInvert, vtTg, -vtTg) + local vtTest = -vtTg if abs( vtTest:getY()) > abs( vtTest:getZ()) then nSCC = EgtIf( vtTest:getY() > 0, MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) else @@ -246,7 +249,7 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw -- imposto attacco/uscita EgtSetMachiningParam( MCH_MP.LITANG, dLiTang) EgtSetMachiningParam( MCH_MP.LIPERP, dLiPerp) - if bTurnTang then EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.PERP_TG) end + if BD.TURN and bLioTang then EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.PERP_TG) end EgtSetMachiningParam( MCH_MP.LOTANG, dLoTang) EgtSetMachiningParam( MCH_MP.LOPERP, dLoPerp) -- imposto allungamenti iniziale e finale @@ -332,7 +335,7 @@ function FacesBySaw.MakeTwo( Proc, nPhase, nRawId, nPartId, dOvmHead, sCutType, local nOtInd = 3 - nUpInd -- metto in relazione la scelta facce con il confronto del versore Z con la scelta in base alla grandezza faccia -- se la faccia più grande è messa secondaria e il suo versore Z non è troppo negativo - if nOtInd == nBigInd and vtN[nBigInd]:getZ() > -0.5 and vtN[nSmaInd]:getZ() < 0.966 then + if nOtInd == nBigInd and (( vtN[nBigInd]:getZ() > -0.5 and vtN[nSmaInd]:getZ() < 0.966) or bDownHead) then nUpInd = nBigInd nOtInd = nSmaInd end diff --git a/LuaLibs/ProcessDrill.lua b/LuaLibs/ProcessDrill.lua index 22eadcc..0a45da4 100644 --- a/LuaLibs/ProcessDrill.lua +++ b/LuaLibs/ProcessDrill.lua @@ -1,4 +1,4 @@ --- ProcessDrill.lua by Egaltech s.r.l. 2022/11/30 +-- ProcessDrill.lua by Egaltech s.r.l. 2023/05/11 -- Gestione calcolo forature per Travi -- 2021/04/14 DS Corretta gestione Invert con testa da sotto. Migliorato calcolo ingombro portautensile. -- 2021/05/03 DS Su macchina con testa da sotto aggiunta possibilità di fare fori verticali metà sopra e l'altra sotto. @@ -16,6 +16,7 @@ -- 2022/10/25 Nella funzione Split aggiunto il controllo che le facce di ingresso e uscita siano differenti (potrebbe succedere per fori molto corti). Modifica importatore in futuro. -- 2022/11/23 Aggiunta la gestione dei fori con angolo < 30 gradi, per i quali si usa la testa della macchina per accorciare l'utile di lavoro. -- 2022/12/28 Implementata gestione forature in doppio +-- 2023/05/11 Se lavorazione in doppio e precedente no oppure di tipo diverso, forzo risalita a Zmax. -- Tabella per definizione modulo local ProcessDrill = {} @@ -494,6 +495,9 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) -- se lavorazione in doppio if Proc.Double and Proc.Double > 0 then sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double) + if Proc.Double ~= Proc.PrevDouble then + sUserNotes = EgtSetValInNotes( sUserNotes, 'StartZmax', 2) + end end EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- eseguo diff --git a/LuaLibs/ProcessDtMortise.lua b/LuaLibs/ProcessDtMortise.lua index 1af80b6..870af05 100644 --- a/LuaLibs/ProcessDtMortise.lua +++ b/LuaLibs/ProcessDtMortise.lua @@ -1,4 +1,4 @@ --- ProcessDtMortise.lua by Egaltech s.r.l. 2023/03/28 +-- ProcessDtMortise.lua by Egaltech s.r.l. 2023/05/11 -- Gestione calcolo mortase a coda di rondine per Travi -- 2021/04/08 Aggiunto controllo massimo materiale lavorabile dalla fresa. -- 2021/04/08 Miglioria scelta lavorazione in presenza di testa da sotto. @@ -11,6 +11,7 @@ -- 2022/12/28 Aggiunta gestione lavorazione in doppio. -- 2023/03/06 Aggiunta forzatura ingresso fuori dal grezzo con pocket. -- 2023/03/28 Corretto calcolo larghezza mortasa quando più larga che lunga. +-- 2023/05/11 Se lavorazione in doppio e precedente no oppure di tipo diverso, forzo risalita a Zmax. -- Tabella per definizione modulo local ProcessDtMortise = {} @@ -289,7 +290,7 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) EgtOutLog( sErr) return false, sErr end - -- se con tasca, la lavoro + -- se con tasca, la lavoro (mai in doppio) if bPocket then -- recupero il contorno della tasca (seconda curva ausiliaria) local sVal = EgtGetInfo( Proc.Id, 'AUXID') @@ -350,6 +351,8 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) nSCC = EgtIf( vtAx:getZ() > 0, MCH_SCC.ADIR_ZP, MCH_SCC.ADIR_ZM) end end + -- flag di mirror precedente aggiornabile localmente + local nMyPrevDouble = Proc.PrevDouble -- se parametro interno abilitato e il percorso non è chiuso, aggiungo percorso e lavorazione antischeggia if bMakeAntiSplitPath and not EgtCurveIsClosed( AuxId) then -- recupero gruppo per geometria addizionale @@ -431,6 +434,10 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) -- se lavorazione in doppio if Proc.Double and Proc.Double > 0 then sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double) + if Proc.Double ~= nMyPrevDouble then + nMyPrevDouble = Proc.Double + sUserNotes = EgtSetValInNotes( sUserNotes, 'StartZmax', 2) + end end EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- eseguo @@ -516,6 +523,10 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) -- se lavorazione in doppio if Proc.Double and Proc.Double > 0 then sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double) + if Proc.Double ~= nMyPrevDouble then + nMyPrevDouble = Proc.Double + sUserNotes = EgtSetValInNotes( sUserNotes, 'StartZmax', 2) + end end EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- eseguo diff --git a/LuaLibs/ProcessLongCut.lua b/LuaLibs/ProcessLongCut.lua index 6219672..e6cd8b7 100644 --- a/LuaLibs/ProcessLongCut.lua +++ b/LuaLibs/ProcessLongCut.lua @@ -1,4 +1,4 @@ --- ProcessLongCut.lua by Egaltech s.r.l. 2023/05/03 +-- ProcessLongCut.lua by Egaltech s.r.l. 2023/05/19 -- Gestione calcolo taglio longitudinale per Travi -- 2021/02/03 Corretto FaceUse con fresa orizzontale su taglio orizzontale. -- 2021/05/18 Possibile taglio con lama anche di fianco su macchina con testa da sotto. @@ -27,6 +27,7 @@ -- 2023/03/22 Correzione a SCC lama a seguito di modifiche alle direzioni dei tagli. -- 2023/04/17 Gestione unificata SCC tramite funzione apposita GetSCC -- 2023/05/03 Corretto SCC in caso di asse utensile allineato con Z. +-- 2023/05/19 Migliorato calcolo e verifica affondamento per lavorazione con lama con codolo in mezzo. -- Tabella per definizione modulo local ProcessLongCut = {} @@ -725,11 +726,12 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade, nCus local dToolDiam = 0 local dThick = 0 local dMaxDepth = 0 + local dMaxVertDepth = 0 local sCuttingDn local dToolDiamDn = 0 local dThickDn = 0 local dMaxDepthDn = 0 - -- recupero la lavorazione + -- recupero eventuale lavorazione con lama su testa da sotto if bCanUseUnderBlade then sCuttingDn = ML.FindCutting( 'HeadSide_H2', false, true) if not sCuttingDn then @@ -747,6 +749,7 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade, nCus end end end + -- recupero eventuale lavorazione con lama if bCanUseBlade then local sCutType = EgtIf( BD.USE_LONGCUT, 'LongCut', 'HeadSide') sCutting = ML.FindCutting( sCutType) @@ -762,6 +765,7 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade, nCus dToolDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dToolDiam dThick = EgtTdbGetCurrToolParam( MCH_TP.THICK) or dThick dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth + dMaxVertDepth = dMaxDepth - ( BD.DECR_VERT_CUT or 0) end end end @@ -916,25 +920,23 @@ function ProcessLongCut.Make( Proc, nPhase, nRawId, nPartId, bCustUseBlade, nCus end -- si percorrono i lati alto e basso della faccia -- calcolo quanto è l'affondamento del taglio - local dOffsetTopBlade = ( dWidth + dDimStrip) / 2 - local dOffsetDownBlade = ( dWidth + dDimStrip) / 2 - if bFinishWithChainSaw then - dOffsetTopBlade = dWidth / 2 - dOffsetDownBlade = dWidth / 2 - end + local dMainMaxDepth = EgtIf( abs( vtN:getY()) < 1e-6, dMaxDepth, dMaxVertDepth) + local dOtherMaxDept = EgtIf( bCanUseUnderBlade, dMaxDepthDn, dMainMaxDepth) + local dCoeff = min( ( dWidth - dDimStrip) / ( dMainMaxDepth + dOtherMaxDept), 1) + local dOffsetTopBlade = dWidth - dCoeff * dMainMaxDepth + local dOffsetDownBlade = dWidth - dCoeff * dOtherMaxDept local nStepDownBlade = 1 - local dStepDownBlade = dWidth - dOffsetDownBlade + local dStepDownBlade = dOtherMaxDept -- se lama da sotto verifico se la componente Y della profondità di taglio supera la capacità della lama - if ( nSide == -1 or abs(nSide) == 2) and bCanUseUnderBlade and (( dWidth - dDimStrip) / 2) > dMaxDepthDn then + if ( nSide == -1 or abs(nSide) == 2) and bCanUseUnderBlade and ( dOffsetTopBlade - dDimStrip) > dOtherMaxDept then if bFinishWithChainSaw then - dOffsetTopBlade = max( dWidth - dMaxDepth + ( BD.DECR_VERT_CUT or 0), dOffsetTopBlade) - dOffsetDownBlade = max( dWidth - dMaxDepthDn, dOffsetDownBlade) local dHCutDownBlade = dWidth - dOffsetDownBlade - local dMaxStepDownBlade = 64 + local dMaxStepDownBlade = 80 nStepDownBlade = ceil( dHCutDownBlade / dMaxStepDownBlade) dStepDownBlade = dHCutDownBlade / nStepDownBlade else - local sErr = 'Error : side depth is bigger than underneath blade cut depth' + local dDelta = dWidth - dDimStrip - ( dMainMaxDepth + dOtherMaxDept) + local sErr = 'Error : side depth is bigger than total cut depth (Diff=' .. EgtNumToString( dDelta)..')' EgtOutLog( sErr) return false, sErr end diff --git a/LuaLibs/ProcessLongDoubleCut.lua b/LuaLibs/ProcessLongDoubleCut.lua index a433879..797720a 100644 --- a/LuaLibs/ProcessLongDoubleCut.lua +++ b/LuaLibs/ProcessLongDoubleCut.lua @@ -125,9 +125,9 @@ function ProcessLong2Cut.GetLongFacesCount( Proc) end --------------------------------------------------------------------- -local function MakeSideFace( nId, nFac, nSideLimitingFace, sMilling, dToolDiam, nL2CSide, bIsAnyFaceUpsideDown) - if ( not BD.DOWN_HEAD or not BD.TURN) and bIsAnyFaceUpsideDown then - EgtOutLog( 'Long2Cut : side face finishing skipped , down head required') +local function MakeSideFace( nId, nFac, nSideLimitingFace, nInd, sMilling, dToolDiam, nL2CSide, bIsAnyFaceUpsideDown) + if ( not BD.DOWN_HEAD and not BD.TURN) and bIsAnyFaceUpsideDown then + EgtOutLog( 'Long2Cut : side face finishing skipped, down head required') return true end -- inserisco la lavorazione @@ -141,8 +141,15 @@ local function MakeSideFace( nId, nFac, nSideLimitingFace, sMilling, dToolDiam, -- aggiungo geometria EgtSetMachiningGeometry( {{ nId, nFac}}) -- lato di lavoro e inversione - EgtSetMachiningParam( MCH_MP.INVERT, false) - EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT) + if BD.TURN and + ( ( nSideLimitingFace == 1 and nInd == EgtIf( nL2CSide ~= -1, 2, 1)) or + ( nSideLimitingFace == -1 and nInd == EgtIf( nL2CSide ~= -1, 1, 2))) then + EgtSetMachiningParam( MCH_MP.INVERT, true) + EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT) + else + EgtSetMachiningParam( MCH_MP.INVERT, false) + EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT) + end -- uso della faccia local nFaceUse = EgtIf( nSideLimitingFace == 1, MCH_MILL_FU.ORTHO_RIGHT, MCH_MILL_FU.ORTHO_LEFT) EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse) @@ -151,8 +158,11 @@ local function MakeSideFace( nId, nFac, nSideLimitingFace, sMilling, dToolDiam, -- attacco e uscita EgtSetMachiningParam( MCH_MP.LIPERP, 0) EgtSetMachiningParam( MCH_MP.LITANG, dToolDiam / 2 + 30) - EgtSetMachiningParam( MCH_MP.LOPERP, 2) + EgtSetMachiningParam( MCH_MP.LOPERP, 5) EgtSetMachiningParam( MCH_MP.LOTANG, 10) + if BD.TURN then + EgtSetMachiningParam( MCH_MP.LOELEV, 10) + end -- se faccia di fianco e testa da sotto, aumento la sicurezza if nL2CSide == 0 and BD.DOWN_HEAD then EgtSetMachiningParam( MCH_MP.STARTPOS, 80) @@ -1095,6 +1105,9 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster local nPos = EgtIf( i == 1, j, nC - j + 1) local dSal = EgtIf( nPos == 1, - EgtIf( i == nIni, dStartDist, dEndDist), - EgtIf( i == nIni, dStartAccDist, dEndAccDist) - ( nPos - 2) * dC + EgtIf( bSide, dOverLapExtend, 0)) local dEal = EgtIf( nPos == nC, - EgtIf( i == nIni, dEndDist, dStartDist), - EgtIf( i == nIni, dEndAccDist, dStartAccDist) - ( nC - nPos - 1) * dC + EgtIf( bSide, dOverLapExtend, 0)) + if nSide == -1 then + dSal, dEal = dEal, dSal + end -- Posizione braccio portatesta local nSCC = MCH_SCC.NONE if not BD.C_SIMM then @@ -1178,11 +1191,11 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster end -- se facce principali convesse, eventuale lavorazione della faccia limitante l'inizio (a destra) if bConvex and j == 1 and not bStartFixed then - MakeSideFace( Proc.Id, tFaceLong[vOrd[i]], 1, sMilling, dToolDiam, nSide, bIsAnyFaceUpsideDown) + MakeSideFace( Proc.Id, tFaceLong[vOrd[i]], 1, i, sMilling, dToolDiam, nSide, bIsAnyFaceUpsideDown) end -- se facce principali convesse, eventuale lavorazione della faccia limitante la fine (a sinistra) if bConvex and j == nC and not bEndFixed then - MakeSideFace( Proc.Id, tFaceLong[vOrd[i]], -1, sMilling, dToolDiam, nSide, bIsAnyFaceUpsideDown) + MakeSideFace( Proc.Id, tFaceLong[vOrd[i]], -1, i, sMilling, dToolDiam, nSide, bIsAnyFaceUpsideDown) end end end @@ -1620,11 +1633,11 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster end -- se facce principali convesse, eventuale lavorazione della faccia limitante l'inizio (a destra) if bConvex and j == 1 and not bStartFixed and bRemoveToolRadius then - MakeSideFace( Proc.Id, tFaceLong[vOrd[i]], 1, sMilling, dToolDiam) + MakeSideFace( Proc.Id, tFaceLong[vOrd[i]], 1, i, sMilling, dToolDiam) end -- se facce principali convesse, eventuale lavorazione della faccia limitante la fine (a sinistra) if bConvex and j == nC and not bEndFixed and bRemoveToolRadius then - MakeSideFace( Proc.Id, tFaceLong[vOrd[i]], -1, sMilling, dToolDiam) + MakeSideFace( Proc.Id, tFaceLong[vOrd[i]], -1, i, sMilling, dToolDiam) end end end diff --git a/LuaLibs/ProcessMortise.lua b/LuaLibs/ProcessMortise.lua index 5309722..52edc08 100644 --- a/LuaLibs/ProcessMortise.lua +++ b/LuaLibs/ProcessMortise.lua @@ -1,4 +1,4 @@ --- ProcessMortise.lua by Egaltech s.r.l. 2022/12/12 +-- ProcessMortise.lua by Egaltech s.r.l. 2023/05/11 -- Gestione calcolo mortase per Travi -- 2021/07/20 Aggiunta gestione rinvio angolare su FAST. -- 2021/12/01 Se frontale aggiungo taglio con Grp e Proc di vero taglio (per aggiornare ingombro di testa /coda). @@ -9,6 +9,7 @@ -- 2022/12/12 Migliorato controllo necessità CleanCorners. -- 2023/01/31 Aggiunta gestione lavorazione in doppio. -- 2023/01/31 Creata la funzione ConvertToClosedCurve (parte della ProcessMortise.Make) e spostata in BeamLib. +-- 2023/05/11 Se lavorazione in doppio e precedente no oppure di tipo diverso, forzo risalita a Zmax. -- Tabella per definizione modulo local ProcessMortise = {} @@ -506,6 +507,9 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) -- se lavorazione in doppio if Proc.Double and Proc.Double > 0 then sUserNotes = EgtSetValInNotes( sUserNotes, 'DOUBLE', Proc.Double) + if Proc.Double ~= Proc.PrevDouble then + sUserNotes = EgtSetValInNotes( sUserNotes, 'StartZmax', 2) + end end EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- eseguo diff --git a/LuaLibs/ProcessRidgeLap.lua b/LuaLibs/ProcessRidgeLap.lua index 0e5a666..0a42616 100644 --- a/LuaLibs/ProcessRidgeLap.lua +++ b/LuaLibs/ProcessRidgeLap.lua @@ -1,4 +1,4 @@ --- ProcessRidgeLap.lua by Egaltech s.r.l. 2021/09/10 +-- ProcessRidgeLap.lua by Egaltech s.r.l. 2023/05/18 -- Gestione calcolo mezzolegno di testa per Travi -- Tabella per definizione modulo @@ -26,8 +26,8 @@ end --------------------------------------------------------------------- -- Classificazione della feature function ProcessRidgeLap.Classify( Proc, b3Raw) - -- se PF con testa da sotto, ammessa qualunque orientazione - if BD.C_SIMM and BD.DOWN_HEAD then + -- se PF con testa da sotto oppure TURN, ammessa qualunque orientazione + if ( BD.C_SIMM and BD.DOWN_HEAD) or BD.TURN then return true, false end -- Se più corta del limite si può fare anche da sotto diff --git a/LuaLibs/ProcessRoundArch.lua b/LuaLibs/ProcessRoundArch.lua index 31477a5..5b4efe0 100644 --- a/LuaLibs/ProcessRoundArch.lua +++ b/LuaLibs/ProcessRoundArch.lua @@ -1,4 +1,4 @@ --- ProcessRoundArch.lua by Egaltech s.r.l. 2021/01/29 +-- ProcessRoundArch.lua by Egaltech s.r.l. 2023/05/18 -- Gestione calcolo archi per Travi -- Tabella per definizione modulo @@ -93,6 +93,8 @@ function ProcessRoundArch.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) EgtOutLog( sErr) return false, sErr end + -- normale alla superficie nel mezzo + local vtN = EgtSurfTmFacetNormVersor( Proc.Id, Proc.Fct // 2, GDB_RT.GLOB) -- recupero e verifico l'entità curva local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') if AuxId then AuxId = AuxId + Proc.Id end @@ -222,13 +224,27 @@ function ProcessRoundArch.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT) end -- posizione braccio porta testa - if Proc.Head then - EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_XP) - elseif Proc.Tail then - EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_XM) - elseif AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then - EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YP) + local nSCC = MCH_SCC.NONE + if not BD.C_SIMM and not BD.TURN then + if Proc.Head then + nSCC = MCH_SCC.ADIR_XP + elseif Proc.Tail then + nSCC = MCH_SCC.ADIR_XM + elseif AreSameOrOppositeVectorApprox( vtExtr, Z_AX()) then + nSCC = MCH_SCC.ADIR_YP + end + elseif BD.TURN then + if vtN:getZ() > 0.707 then + nSCC = MCH_SCC.ADIR_ZP + elseif vtN:getZ() < -0.707 then + nSCC = MCH_SCC.ADIR_ZM + elseif vtN:getY() > 0.707 then + nSCC = MCH_SCC.ADIR_YP + elseif vtN:getY() < -0.707 then + nSCC = MCH_SCC.ADIR_YM + end end + EgtSetMachiningParam( MCH_MP.SCC, nSCC) -- eseguo if not ML.ApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() diff --git a/LuaLibs/ProcessSplit.lua b/LuaLibs/ProcessSplit.lua index b7527f1..8b7432c 100644 --- a/LuaLibs/ProcessSplit.lua +++ b/LuaLibs/ProcessSplit.lua @@ -1,4 +1,4 @@ --- ProcessSplit.lua by Egaltech s.r.l. 2023/04/04 +-- ProcessSplit.lua by Egaltech s.r.l. 2023/05/09 -- Gestione calcolo tagli di separazione per Travi -- 2022/05/31 Aggiunta gestione sezioni alte e larghe con taglio con sega a catena seguito da rifinitura con lama (aggiunta funzione MakeSplitByChainSaw); gestione eventuale creazione nuova fase dall'interno della Make. -- 2022/06/10 Per sezioni alte e larghe aggiunta gestione finitura in base a sovramateriale e a parametro Q05 dell' eventuale lavorazione sostituita. @@ -9,7 +9,8 @@ -- 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 +-- 2023/04/20 Per travi alte aggiunti tagli orizzontali per ridurre le dimensioni degli scarti. +-- 2023/05/09 Aggiunta richiesta risalita preliminare a Zmax per tagli da sopra su macchine PF e ONE. -- Tabella per definizione modulo local ProcessSplit = {} @@ -526,6 +527,10 @@ function ProcessSplit.Make( Proc, nPhase, nRawId, nPartId, nOrd, sDownOrSideOrSt else sNotes = EgtIf( i == 1, 'Cut;', 'Precut;') end + -- se primo taglio da sopra e PF o ONE richiedo risalita preliminare a Zmax + if i == nCuts and bHorizCut and BD.C_SIMM and not BD.DOWN_HEAD then + sNotes = EgtSetValInNotes( sNotes, 'StartZmax', 2) + end local bOk, sErr = Fbs.MakeOne( Proc.Id, 0, sCutting, dSawDiam, nOrthoOpposite, nil, dCutExtra, BD.CUT_SIC, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw) if not bOk then return false, sErr end end diff --git a/Version.lua b/Version.lua index 29ad806..abf9560 100644 --- a/Version.lua +++ b/Version.lua @@ -1,6 +1,6 @@ --- Version.lua by Egaltech s.r.l. 2023/04/05 +-- Version.lua by Egaltech s.r.l. 2023/05/18 -- Gestione della versione di Beam NAME = 'Beam' -VERSION = '2.5e2' +VERSION = '2.5e4' MIN_EXE = '2.5c1'