diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index bb38e0b..a095279 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1508,7 +1508,7 @@ local function AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bN -- se foratura ( 3/4-040-X) elseif Drill.Identify( Proc) then -- esecuzione foratura - bOk, sErr = Drill.Make( Proc, nPhase, nRawId, nPartId) + bOk, sErr = Drill.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) -- se giunzione francese ( 1/2-035-X) elseif FrenchRidgeLap.Identify( Proc) then -- esecuzione giunzione francese @@ -1980,10 +1980,7 @@ local function VerifyDrillMirrored( Proc, vProc, b3Raw) sDrilling, sType, dMaxDepth = ML.FindDrilling( dDiam, 0, true, false, true) dMachiningDepth = dMaxDepth or dMachiningDepth end - if not sDrilling - or ( sType ~= 'Drill' and ( sType ~= 'Pocket'or ( Proc.Fcs ~= 0 and Proc.Fce ~= 0))) - or not EgtMdbSetCurrMachining( sDrilling) then - + if not sDrilling or not EgtMdbSetCurrMachining( sDrilling) then return end local dDrillingStep = EgtMdbGetCurrMachiningParam( MCH_MP.STEP) diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index ee66572..282c3e1 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -1403,5 +1403,39 @@ function BeamLib.GetToolFromMachining( sMachiningName) return Tool end +------------------------------------------------------------------------------------------------------------- +--- copia una tabella lua in modo ricorsivo, ossia mantiene indipendenti anche tutte le sottotabelle +--- ATTENZIONE: in caso di modifiche vanno gestiti anche i tipi custom; sarebbe meglio metterla nel LuaLibs +function BeamLib.TableCopyDeep( OriginalTable) + -- controllo se oggetto passato è valido, altrimenti errore. Non deve mai succedere + if not OriginalTable then + error( "TableCopyDeep : can't copy nil object") + end + local CopiedTable = {} + for key, value in pairs( OriginalTable) do + if type( value) == "table" then + if isBBox3d( value) then + CopiedTable[ key] = BBox3d( value) + elseif isColor3d( value) then + CopiedTable[ key] = Color3d( value) + elseif isFrame3d( value) then + CopiedTable[ key] = Frame3d( value) + elseif isPoint3d( value) then + CopiedTable[ key] = Point3d( value) + elseif isQuaternion( value) then + CopiedTable[ key] = Quaternion( value) + elseif isVector3d( value) then + CopiedTable[ key] = Vector3d( value) + else + CopiedTable[ key] = BeamLib.TableCopyDeep( value) + end + else + CopiedTable[ key] = value + end + end + + return CopiedTable +end + ------------------------------------------------------------------------------------------------------------- return BeamLib \ No newline at end of file diff --git a/LuaLibs/ProcessDrill.lua b/LuaLibs/ProcessDrill.lua index 198c5a5..624bdc6 100644 --- a/LuaLibs/ProcessDrill.lua +++ b/LuaLibs/ProcessDrill.lua @@ -134,7 +134,8 @@ function ProcessDrill.Split( Proc, b3Raw) local bOpen = ( Proc.Fce ~= 0) and ( Proc.Fce ~= Proc.Fcs) -- recupero flag abilitazione split (0=auto,1=no) local bTrySplit = ( EgtGetInfo( Proc.Id, 'Q02', 'i') ~= 1) - if not bTrySplit then + local bOnlyContour = ( EgtGetInfo( Proc.Id, 'Q04', 'i') == 1) + if ( not bTrySplit) or bOnlyContour then return false end -- restituisco se va fatto in doppio (solo fori orizzontali) @@ -313,9 +314,41 @@ local function GetHoleStartData( ptCen, vtExtr, b3Solid) return nFac, CosB, vFaces end +--------------------------------------------------------------------- +local function GetSCC( Proc, vtExtr, b3Solid, bDrillAngTrasm, nPhase) + local nSCC = MCH_SCC.NONE + + if bDrillAngTrasm then + nSCC = MCH_SCC.ADIR_NEAR + elseif BD.TURN == 2 then + nSCC = MCH_SCC.ADIR_ZP + elseif not BD.C_SIMM and not BD.TURN then + nSCC = MCH_SCC.ADIR_YM + if AreSameVectorApprox( vtExtr, Z_AX()) then + nSCC = MCH_SCC.ADIR_YM + elseif abs( vtExtr:getX()) < 0.1 then + local bNearTail = ( Proc.Box:getCenter():getX() < b3Solid:getCenter():getX() and Proc.Box:getCenter():getX() - b3Solid:getMin():getX() < 1000) + local bVeryShortPart = ( BD.LEN_VERY_SHORT_PART and b3Solid:getDimX() < BD.LEN_VERY_SHORT_PART) + nSCC = EgtIf( BL.IsPartFinalPhase( nPhase) or ( bNearTail and not bVeryShortPart), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP) + elseif vtExtr:getY() > 0.1 then + nSCC = MCH_SCC.ADIR_YP + end + else + nSCC = MCH_SCC.NONE + end + + return nSCC +end + --------------------------------------------------------------------- -- Applicazione della lavorazione -function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) +function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) + -- Se forzato contorno foro forzo richiamo a FreeContour e uscita dalla funzione + if EgtGetInfo( Proc.Id, 'Q04', 'i') == 1 then + _G.package.loaded.ProcessFreeContour = nil + local FreeContour = require( 'ProcessFreeContour') + return FreeContour.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) + end -- default per costanti BD.DRILL_VX_MAX_ANGLEDRILL = ( BD.DRILL_VX_MAX_ANGLEDRILL or 0.928) -- ingombro del pezzo @@ -588,6 +621,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) dDepth = dMaxDepth dMaxElev = dMaxDepth end + -- inserisco la lavorazione local sName = EgtIf( EgtStartsWith( sType, 'Predrill'), 'Predrill_', 'Drill_') .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) local nMchId = EgtAddMachining( sName, sDrilling) @@ -598,6 +632,8 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) end -- aggiungo geometria EgtSetMachiningGeometry( {{ AuxId, -1}}) + -- eventuali note utente + local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or '' -- eventuale inversione if sType == 'Drill' or sType == 'Drill_H2' or sType == 'Drill_AT' or sType == 'AngleDrill' or sType == 'Predrill' then EgtSetMachiningParam( MCH_MP.INVERT, bToInvert) @@ -605,31 +641,25 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) EgtSetMachiningParam( MCH_MP.TOOLINVERT, bToInvert) end -- imposto posizione braccio porta testa - local nSCC = MCH_SCC.NONE - if bDrillAngTrasm then - nSCC = MCH_SCC.ADIR_NEAR - elseif BD.TURN == 2 then - nSCC = MCH_SCC.ADIR_ZP - elseif not BD.C_SIMM and not BD.TURN then - nSCC = MCH_SCC.ADIR_YM - if AreSameVectorApprox( vtExtr, Z_AX()) then - nSCC = MCH_SCC.ADIR_YM - elseif abs( vtExtr:getX()) < 0.1 then - local bNearTail = ( Proc.Box:getCenter():getX() < b3Solid:getCenter():getX() and Proc.Box:getCenter():getX() - b3Solid:getMin():getX() < 1000) - local bVeryShortPart = ( BD.LEN_VERY_SHORT_PART and b3Solid:getDimX() < BD.LEN_VERY_SHORT_PART) - nSCC = EgtIf( BL.IsPartFinalPhase( nPhase) or ( bNearTail and not bVeryShortPart), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP) - elseif vtExtr:getY() > 0.1 then - nSCC = MCH_SCC.ADIR_YP - end - else - nSCC = MCH_SCC.NONE - end + local nSCC = GetSCC( Proc, vtExtr, b3Solid, bDrillAngTrasm, nPhase) EgtSetMachiningParam( MCH_MP.SCC, nSCC) -- imposto affondamento - if Proc.Double and Proc.Double > 0 and dDepth > Proc.MachDepthDouble + 10 * GEO.EPS_SMALL then - sMyWarn = 'Warning in double head drilling : depth (' .. EgtNumToString( dDepth, 1) .. ') reduced to (' .. EgtNumToString( Proc.MachDepthDouble, 1) .. ') to match H2 max tool depth' - dDepth = Proc.MachDepthDouble - dMaxElev = Proc.MachDepthDouble + local dLastStepDepth + if Proc.Double and Proc.Double > 0 then + if ( sType == 'Pocket_AT' or sType == 'Pocket') then + if bOpen then + local dReduceDepth = MIRROR_POCKETS_MIN_DISTANCE / 2 + 10 + dLastStepDepth = dDepth + dReduceDepth + dDepth = dDepth - dReduceDepth + end + else + sUserNotes = EgtSetValInNotes( sUserNotes, 'LastStep', MIRROR_DRILLINGS_MIN_DISTANCE / 2 + 15) + end + if dDepth > Proc.MachDepthDouble + 10 * GEO.EPS_SMALL then + sMyWarn = 'Warning in double head drilling : depth (' .. EgtNumToString( dDepth, 1) .. ') reduced to (' .. EgtNumToString( Proc.MachDepthDouble, 1) .. ') to match H2 max tool depth' + dDepth = Proc.MachDepthDouble + dMaxElev = Proc.MachDepthDouble + end end EgtSetMachiningParam( MCH_MP.DEPTH, dDepth) -- imposto il valore della distanza di sicurezza per l'attacco. Se il valore del db utensili è troppo basso lo alzo a 10. @@ -637,12 +667,19 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) local dMinStartPos = 10 local dStartPos = max( dMinStartPos, dToolDbStartPos) EgtSetMachiningParam( MCH_MP.STARTPOS, dStartPos) - -- Note utente con dichiarazione nessuna generazione sfridi per Vmill - local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or '' + -- dichiarazione nessuna generazione sfridi per Vmill sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0) -- aggiungo alle note massima elevazione (coincide con affondamento) - if dMaxElev then - sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxElev, 1)) + local dCustomMaxElev + if Proc.dCustomMaxElev and type( Proc.dCustomMaxElev) == "number" and Proc.dCustomMaxElev > 10 * GEO.EPS_SMALL then + dCustomMaxElev = Proc.dCustomMaxElev + end + if dMaxElev or dCustomMaxElev then + if dCustomMaxElev then + sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dCustomMaxElev, 1)) + else + sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxElev, 1)) + end end -- se foro passante, aggiungo questa qualifica alle note if ( sType == 'Drill' or sType == 'Drill_H2' or sType == 'AngleDrill') and bOpen then @@ -668,7 +705,7 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) end if not bOk then local _, sErr = EgtGetLastMachMgrError() - EgtSetOperationMode( nMchId, false) + EgtSetOperationMode( nMchId, false) return false, sErr else local _, sWarn = EgtGetMachMgrWarning( 0) @@ -676,6 +713,27 @@ function ProcessDrill.Make( Proc, nPhase, nRawId, nPartId) EgtSetOperationMode( nMchId, false) return false, sWarn else + -- se DrillPocket passante in doppio si fa lavorazione aggiuntiva dell'ultimo step + if Proc.Double and Proc.Double > 0 and ( sType == 'Pocket_AT' or sType == 'Pocket') and bOpen then + local nAddGrpId = BL.GetAddGroup( Proc.PartId) + local idProcLastStep = EgtCopyGlob( Proc.Id, nAddGrpId) + local idAuxIdLastStep = EgtCopyGlob( AuxId, nAddGrpId) + EgtModifyCurveThickness( idAuxIdLastStep, -dLastStepDepth) + local ProcLastStep = BL.TableCopyDeep( Proc) + ProcLastStep.Id = idProcLastStep + ProcLastStep.Flg = 1 + ProcLastStep.Double = 0 + ProcLastStep.dCustomMaxElev = dLastStepDepth - dDepth + local bOkLastStep, sWarnLastStep = ProcessDrill.Make( ProcLastStep, nPhase, nRawId, nPartId) + if not bOkLastStep then + sWarnLastStep = 'Drillpocket double : incomplete, last step missing' + end + local sPreviousWarn = sMyWarn or sWarn + if sWarnLastStep then + if not sPreviousWarn then sPreviousWarn = '' end + sMyWarn = EgtIf( #sPreviousWarn > 0, sPreviousWarn .. '\n' .. sWarnLastStep, sWarnLastStep) + end + end return true, ( sMyWarn or sWarn) end end diff --git a/LuaLibs/ProcessDtMortise.lua b/LuaLibs/ProcessDtMortise.lua index f46e00b..8dd4887 100644 --- a/LuaLibs/ProcessDtMortise.lua +++ b/LuaLibs/ProcessDtMortise.lua @@ -638,20 +638,44 @@ function ProcessDtMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) -- sistemo il lato e la direzione di lavoro EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( bCW, MCH_MILL_WS.LEFT, MCH_MILL_WS.RIGHT)) EgtSetMachiningParam( MCH_MP.INVERT, EgtIf( bCW, false, true)) + local ptS = EgtSP( AuxId, GDB_ID.ROOT) + local ptE = EgtEP( AuxId, GDB_ID.ROOT) -- in presenza di pocket imposto dati ingresso e uscita if bPocket then + -- recupero il contorno della tasca (seconda curva ausiliaria) + local vAuxId = EgtGetInfo( Proc.Id, 'AUXID', 'vi') + -- si prende il centro del percorso da svuotare ( non si controlla che sia presente perchè già verificata in precedenza) + local ptPocketCenter = EgtGP( Proc.Id + vAuxId[2], GDB_ID.ROOT) + -- calcolo componente tangente e lineare di ingresso + local vtS = EgtSV( Proc.Id + vAuxId[1], GDB_ID.ROOT) -- vettore entrante percorso + local vtOffS = EgtSV( Proc.Id + vAuxId[1], GDB_ID.ROOT) ; vtOffS:rotate( vtExtr, 90) -- vettore da punto iniziale a centro utensile + local vtStartToCenter = ptPocketCenter - ( ptS + ( vtOffS * ( dToolDiam/2))) -- vettore da centro utensilenel punto iniziale e centro del percorso da svuotare + local dLenStartToCenter = vtStartToCenter:len() -- distanza da centro utensile a centro del percorso da svuotare + local dStartTangComp = abs( vtStartToCenter * vtS) -- prodotto scalare tra vettore entrante e vettore tra centro utensilee percordo da svuotare (componente tangente) + local dStartPerpComp = sqrt( dLenStartToCenter^2 - dStartTangComp^2) -- pitagora tra componente tangente e la lunghezza tra i due centri + -- calcolo componente tangente e lineare di uscita + local vtE = EgtEV( Proc.Id + vAuxId[1], GDB_ID.ROOT) + local vtOffE = EgtEV( Proc.Id + vAuxId[1], GDB_ID.ROOT) ; vtOffE:rotate( vtExtr, 90) + local vtEndToCenter = ptPocketCenter - ( ptE + ( vtOffE * ( dToolDiam/2))) + local dLenEndToCenter = vtEndToCenter:len() + local dEndTangComp = abs( vtEndToCenter * vtE) + local dEndPerpComp = sqrt( dLenEndToCenter^2 - dEndTangComp^2) + EgtSetMachiningParam( MCH_MP.STARTPOS, 5) EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.TANGENT) - EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.AS_LI) - EgtSetMachiningParam( MCH_MP.STARTADDLEN, 5) - EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) - EgtSetMachiningParam( MCH_MP.LITANG, dToolDiam / 2) - EgtSetMachiningParam( MCH_MP.LIPERP, 5) + EgtSetMachiningParam( MCH_MP.LITANG, dStartTangComp) + EgtSetMachiningParam( MCH_MP.LIPERP, dStartPerpComp) EgtSetMachiningParam( MCH_MP.LIELEV, 0) + + EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LI.TANGENT) + EgtSetMachiningParam( MCH_MP.LOTANG, dEndTangComp) + EgtSetMachiningParam( MCH_MP.LOPERP, dEndPerpComp) + EgtSetMachiningParam( MCH_MP.LOELEV, 0) + + EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0) + EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0) -- altrimenti verifico se sono bilanciati ingresso e uscita, per evitare inizio o fine nel legno else - local ptS = EgtSP( AuxId, GDB_ID.ROOT) - local ptE = EgtEP( AuxId, GDB_ID.ROOT) local dDistS = abs( ( ptS - rfDtMrt:getOrigin()) * rfDtMrt:getVersX()) local dDistE = abs( ( ptE - rfDtMrt:getOrigin()) * rfDtMrt:getVersX()) local dIni, dFin = EgtCurveDomain( AuxId) diff --git a/LuaLibs/ProcessFreeContour.lua b/LuaLibs/ProcessFreeContour.lua index ea0a8c7..9888a57 100644 --- a/LuaLibs/ProcessFreeContour.lua +++ b/LuaLibs/ProcessFreeContour.lua @@ -29,11 +29,13 @@ local ML = require( 'MachiningLib') local Q_DIM_STRIP = 'Q01' -- d local Q_DEPTH_CHAMFER = 'Q02' -- d local Q_OVERMAT_FOR_FINISH = 'Q03' -- d +local Q_ONLY_CONTOUR = 'Q04' -- i, valido solo per drill local Q_ONLY_CHAMFER = 'Q00' -- i local Q_RADIAL_OFFSET = 'Q06' -- d, valido solo per pocket local Q_IGNORE_LASER_PROBLEMS = 'Q07' local Q_FORCE_CLAMPABLE_AREA = 'Q08' local Q_INVERT_LAST_PATH = 'Q09' +local Q_MAX_ELEVATION = 'Q10' -- d --------------------------------------------------------------------- -- Riconoscimento della feature @@ -184,6 +186,8 @@ local function VerifyChamfer( Proc, AuxId, nRawId, bMakeVertCham, bDownHead) EgtOutLog( sErr) return -1, 0, sErr end + else + sMilling = '' end return nChamfer, dDepth, sMilling @@ -235,6 +239,7 @@ end local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead) -- recupero l'ingombro del grezzo di appartenenza local b3Raw = EgtGetRawPartBBox( nRawId) + local bContourFromDrill = EgtGetInfo( Proc.Id, Q_ONLY_CONTOUR, 'i') == 1 -- ingombro del pezzo local Ls = EgtGetFirstNameInGroup( nPartId, 'Box') local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD) @@ -259,7 +264,7 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead) -- verifico se in testa o coda local bHead = Proc.Head -- verifico i parametri Q per profondità smusso e per eseguirlo in esclusiva - local nChamfer, dDepthCham, sChamfer = VerifyChamfer( Proc, AuxId, nRawId, true) + local nChamfer, dDepthCham, sChamfer = VerifyChamfer( Proc, AuxId, nRawId, true, nil) -- recupero la lavorazione local bTopHead = ( BD.DOWN_HEAD and vtExtr:getZ() > -0.1) local bDownHead = ( BD.DOWN_HEAD and vtExtr:getZ() < 0.1) @@ -631,6 +636,14 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead) EgtOutLog( sErr) return false, sErr end + -- eventuale elevazione forzata + local dCustomMaxElev = EgtGetInfo( Proc.Id, Q_MAX_ELEVATION, 'd') + if dCustomMaxElev and dCustomMaxElev < 1 then dCustomMaxElev = nil end + if dCustomMaxElev then + local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or '' + sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dCustomMaxElev, 1)) + EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) + end -- assegno affondamento EgtSetMachiningParam( MCH_MP.DEPTH, dDepth) end @@ -663,7 +676,9 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead) end -- assegno lato di lavoro - if Proc.Grp == 0 then + if bContourFromDrill then + dWorkSide = MCH_MILL_WS.LEFT + elseif Proc.Grp == 0 then dWorkSide = MCH_MILL_WS.CENTER elseif ( Proc.Grp == 3 and not bToolInv) or ( Proc.Grp == 4 and bToolInv) or ( Proc.Grp == 1 and bToolInv) or ( Proc.Grp == 2 and bToolInv) then dWorkSide = MCH_MILL_WS.LEFT @@ -695,6 +710,14 @@ local function MakeByMill( Proc, nPhase, nRawId, nPartId, dOvmHead) EgtSetMachiningParam( MCH_MP.TOOLINVERT, bToolInvert) EgtSetMachiningParam( MCH_MP.INVERT, bInvert) EgtSetMachiningParam( MCH_MP.WORKSIDE, dWorkSide) + -- setto valori specifici se lavorazione nel pieno del solo contorno di un foro + if bContourFromDrill then + local dWorkStep = max( ( EgtGetMachiningParam( MCH_MP.STEP) or 0) * 0.75, dToolDiam) + EgtSetMachiningParam( MCH_MP.STEP, dWorkStep) + EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.GLIDE) + EgtSetMachiningParam( MCH_MP.LIELEV, dWorkStep) + EgtSetMachiningParam( MCH_MP.LITANG, dWorkStep) + end -- posizione braccio porta testa @@ -995,6 +1018,10 @@ function ProcessFreeContour.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) Q_DEPTH_CHAMFER = 'Q01' Q_DIM_STRIP = 'Q02' end + if Proc.Prc == 40 then + Q_DIM_STRIP = '' + Q_OVERMAT_FOR_FINISH = '' + end -- recupero la tipologia local bPocket = ( EgtGetInfo( Proc.Id, 'PCKT', 'i') == 1) -- se svuotatura diff --git a/LuaLibs/ProcessHeadCut.lua b/LuaLibs/ProcessHeadCut.lua index d38e615..b6671f4 100644 --- a/LuaLibs/ProcessHeadCut.lua +++ b/LuaLibs/ProcessHeadCut.lua @@ -196,7 +196,11 @@ local function MakeHeadChamfer( idProc, nPartId) EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.RIGHT)) local dQ09Value = EgtGetInfo( idProc, 'Q09', 'd') + if not dQ09Value then + dQ09Value = 0.1 + end local bChamferedEdge = dQ09Value > 0 + dQ09Value = EgtIf( bChamferedEdge, max( dQ09Value, 0.1), min( dQ09Value, -0.1)) local nIdFirstEntity, nEntityCnt = EgtExplodeCurveCompo( nLoopId) local p3MidPoint = EgtMP( nIdFirstEntity, GDB_ID.GRID) @@ -232,6 +236,9 @@ local function MakeHeadChamfer( idProc, nPartId) end EgtChangeClosedCurveStartPoint( idGeom, p3MidPoint, GDB_RT.GRID) + -- reimposto la griglia + EgtSetGridFrame() + -- Inserisco la lavorazione del lato standard local dExtra = 2 local sName1 = 'HeadCham_' .. ( EgtGetName( idProc) or tostring( idProc)) diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index f1d9629..3d7ad1d 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -150,7 +150,7 @@ local Q_MAX_ELEVATION = '' -- d local Q_SAW_PLUS_CHAIN = '' -- i local Q_FORCE_CHAINSAW = '' -- i local Q_CHAINSAW_FROM_SIDE = '' -- i -local Q_MILL_AS_BLADE_CONVENTIONAL = '' -- i +local Q_CONVENTIONAL_MILLING = '' -- i local Q_CLEAN_CORNER = '' -- 1 local Q_FLOATING_AGGREGATE = '' -- i @@ -201,7 +201,7 @@ local function AssignQIdent( Proc) Q_FORCE_CHAINSAW = 'Q12' -- TODO da riportare a Q13 quando è sistemata la gestione del movimento in macchina nell'attacco laterale Q_CHAINSAW_FROM_SIDE = 'Q999' - Q_MILL_AS_BLADE_CONVENTIONAL = '' + Q_CONVENTIONAL_MILLING = '' Q_CLEAN_CORNER = '' Q_FLOATING_AGGREGATE = '' @@ -209,7 +209,7 @@ local function AssignQIdent( Proc) Q_FORCE_BLADE = 'Q01' -- i Q_DEPTH_CHAMFER = 'Q04' -- d Q_ONLY_CHAMFER = 'Q05' -- i - Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i + Q_CONVENTIONAL_MILLING = 'Q14' -- i elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 17 then Q_DEPTH_CHAMFER = 'Q01' -- d Q_ONLY_CHAMFER = 'Q02' -- i @@ -230,7 +230,7 @@ local function AssignQIdent( Proc) Q_BLADE_ON_ALONG_FACE = 'Q04' -- i Q_ANTISPLINT_TYPE = 'Q06' -- i Q_DEPTH_CHAMFER = 'Q07' -- d - Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i + Q_CONVENTIONAL_MILLING = 'Q14' -- i Q_CLEAN_CORNER = 'Q15' -- i Q_FLOATING_AGGREGATE = 'Q16' -- i elseif ( Proc.Grp == 1 or Proc.Grp == 2) and Proc.Prc == 30 then @@ -239,25 +239,26 @@ local function AssignQIdent( Proc) Q_SIDE_ROUGH_TOOL = 'Q01' -- i Q_CONTOUR_SMALL_TOOL = 'Q02' -- i Q_ANTISPLINT_TYPE = 'Q06' -- i + Q_CONVENTIONAL_MILLING = 'Q14' -- i elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 33 then Q_ANTISPLINT_TYPE = 'Q06' -- i - Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i + Q_CONVENTIONAL_MILLING = 'Q14' -- i elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 34 then Q_CONTOUR_SMALL_TOOL = 'Q01' -- i Q_USE_MILL = 'Q02' -- i Q_ANTISPLINT_TYPE = 'Q06' -- i elseif ( Proc.Grp == 4) and Proc.Prc == 37 then Q_ANTISPLINT_TYPE = 'Q06' -- i - Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i + Q_CONVENTIONAL_MILLING = 'Q14' -- i elseif ( Proc.Grp == 4) and Proc.Prc == 39 then Q_CONTOUR_SMALL_TOOL = 'Q01' -- i Q_USE_MILL = 'Q02' -- i Q_ANTISPLINT_TYPE = 'Q06' -- i - Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i + Q_CONVENTIONAL_MILLING = 'Q14' -- i elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 90 then Q_ANTISPLINT_TYPE = 'Q03' -- i Q_SIDE_ROUGH_TOOL = 'Q04' -- i - Q_MILL_AS_BLADE_CONVENTIONAL = 'Q14' -- i + Q_CONVENTIONAL_MILLING = 'Q14' -- i end -- le altre features gestite non hanno parametri Q end @@ -2886,7 +2887,7 @@ local function MakeByMillAsSaw( Proc, nPhase, nRawId, nPartId, nFacInd, local dOffs = ( i - 1) * dStep if vtN:getZ() < dVzLimDwnUp then dOffs = dOffs + dSawThick end -- forzatura lavorazione discorde in base a parametro Q su feature - local nQ14Param = EgtGetInfo( Proc.Id, Q_MILL_AS_BLADE_CONVENTIONAL, 'd') or 0 + local nQ14Param = EgtGetInfo( Proc.Id, Q_CONVENTIONAL_MILLING, 'd') or 0 local bForceInvert = nQ14Param == 1 or ( nQ14Param == 2 and vtN:getX() < 0.1 and Proc.AffectedFaces.Bottom) if bForceInvert and i == 1 then dStartDist, dEndDist = dEndDist, dStartDist @@ -3535,8 +3536,12 @@ local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFin EgtOutLog( sErr) return false, sErr end - -- aggiungo geometria - EgtSetMachiningGeometry( {{ Proc.Id, (nFaceRef)}}) + -- aggiungo geometria (se presente curva si lavora quella) + if Proc.LoopIdFacInd then + EgtSetMachiningGeometry( { Proc.LoopIdFacInd}) + else + EgtSetMachiningGeometry( {{ Proc.Id, (nFaceRef)}}) + end -- imposto uso faccia EgtSetMachiningParam( MCH_MP.FACEUSE, MCH_MILL_FU.ORTHO_CONT) -- imposto posizione braccio porta testa @@ -3563,14 +3568,13 @@ local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFin end EgtSetMachiningParam( MCH_MP.SCC, nSCC) -- se tasca aperta e non lavorata col truciolatore, imposto opportuno attacco - if sMchFind == 'OpenPocket' and nUseRoughTool == 0 then + if ( sMchFind == 'OpenPocket' or sMchFind == 'OpenPocket_H2') and nUseRoughTool == 0 then EgtSetMachiningParam( MCH_MP.SUBTYPE, MCH_POCK_SUB.SPIRALIN) end if sMchFind == 'OpenPocket' and dDiamTool < 90 then local _, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFaceRef, GDB_ID.ROOT) local bL = ( Proc.Fct < 4 or TestElleShape4( Proc) == 2) if bL and min( dH, dV) < 1.5 * dDiamTool then - EgtSetMachiningParam( MCH_MP.SUBTYPE, MCH_POCK_SUB.ZIGZAG) EgtSetMachiningParam( MCH_MP.INVERT, false) if not bTipMill then EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_POCK_LI.HELIX) @@ -3596,6 +3600,15 @@ local function MakePocket( Proc, nPartId, b3Solid, ptPs, tvtN, nFaceRef, sMchFin local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or '' sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dElev, 1)) sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0) + -- Se forzato lato aperto lavorazione da curva forzo OpenOutRaw + if( Proc.LoopIdFacInd and ( EgtGetInfo( Proc.LoopIdFacInd, 'OPEN', 'i') or -1) > -1) then + local _, dH, dV = EgtSurfTmFacetMinAreaRectangle( Proc.Id, nFaceRef, GDB_ID.ROOT) + -- Se larghezza tasca uguale a larghezza utensile non permetto Invert + if abs( min( dH, dV) - dDiamTool) < 50 * GEO.EPS_SMALL then + EgtSetMachiningParam( MCH_MP.INVERT, false) + end + bOpenOutRaw = true + end if bOpenOutRaw then sUserNotes = EgtSetValInNotes( sUserNotes, 'OpenOutRaw', 1) end @@ -6650,7 +6663,8 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa end -- eventuale forzatura sega a catena local bForceChainsaw = ( EgtGetInfo( Proc.Id, Q_FORCE_CHAINSAW, 'i') or 0) > 0 - -- se è un tunnel provo a vedere se è possibile lavorarlo con la svuotatura o con la sega catena + + -- TUNNEL: svuotatura o sega a catena if bClosedOrthoFaces then local bTryWithBlades = true local dDimMin, dDimMax, dDepth, vtOrtho, nLundIdFace @@ -6740,7 +6754,8 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa end end end - -- altrimenti non è una fessura + + -- NO TUNNEL: tutti gli altri casi else -- dati della faccia local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd, GDB_ID.ROOT) @@ -6776,6 +6791,8 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa if bPrevBhSideMill == nil then bPrevBhSideMill = bMakeBySideMill end + + -- SIDEMILL (tipo BLOCKHAUS) if bMakeBySideMill then -- se smusso non è esclusivo if nChamfer < 2 then @@ -6910,7 +6927,8 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa end end end - -- altrimenti lavoro con svuotatura + + -- TASCA GENERICA: si cerca il modo migliore di lavorare in base alla forma else local bSpecial3faces = false -- verifico se lavorando la faccia principale rimane esclusa molta sezione trasversale complessiva della feature (da box) @@ -6940,7 +6958,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa end end - -- se posso in effetti fare fresatura con aggregato flottante + -- FRESATURA SPECIALE CON AGGREGATO FLOTTANTE if bPocketFloatingAggregate then -- inserisco la lavorazione di svuotatura local sName = 'Float_Mill_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) @@ -6963,7 +6981,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa -- imposto uso faccia local nFaceUse = BL.GetNearestParalOpposite( vtN) EgtSetMachiningParam( MCH_MP.FACEUSE, nFaceUse) - -- piccolo offser radiale per essere sicuri di lavorare anche con tasca larga come diametro fresa + -- piccolo offset radiale per essere sicuri di lavorare anche con tasca larga come diametro fresa EgtSetMachiningParam( MCH_MP.OFFSR, -0.01) -- imposto posizione braccio porta testa @@ -6988,7 +7006,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa return false, sErr end - -- se riconosciuta gestione 3 facce (limitatamente per ora alla feature 20) + -- CASO SPECIALE 3 FACCE (se rimane esclusa molta sezione trasversale complessiva della feature, solo per feature 20) elseif bSpecial3faces and Proc.Prc == 20 then -- se smusso non è esclusivo if nChamfer < 2 then @@ -7114,7 +7132,8 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa if not bOk then return false, sWarn end end end - -- altrimenti lavorazione di svuotatura o contornatura + + -- SVUOTATURA O FRESATURA: si valuta se si può fare svuotatura o se provare altro else local bUseOtherFace local bLapJointAngTrasm = false @@ -7228,6 +7247,11 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa nUseRoughTool = 1 end end + -- se presente curva da lavorare con lato aperto + if Proc.LoopIdFacInd and ( EgtGetInfo( Proc.LoopIdFacInd, 'OPEN', 'i') or -1) > -1 then + sMchFind = 'OpenPocket' + nUseRoughTool = 0 + end -- se abilitato rinvio da sotto if bLapJointAngTrasm then if not EgtEndsWith( sMchFind, '_AT') then @@ -7272,7 +7296,8 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa EgtErase( nSurfPartId) end end - -- ricerca lavorazione + + -- ricerca lavorazione di svuotatura local sPocketing local _, sMyPocketing, dMyTMaxDepth, dMyTDiam = VerifyPocket( Proc, dDiam, dFacElev + dCollSic, dMaxTotLen, sMchFind, bMillUp, bMillDown) if not sMyPocketing and bMillUp then @@ -7289,6 +7314,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa if ( dMyTMaxDepth > dFacElev + dCollSic - 10 * GEO.EPS_SMALL or ( dMyTMaxDepth > 0.8 * dFacElev + dCollSic and not bIsU) or ( bIsL and nUseRoughTool == 0) or ( bIsL and Proc.Prc == 20) or + ( bIsL and not bSinglePart) or ( Proc.Prc == 25 and not bIsU and not bIsL)) or ( dCustomMaxElev and dCustomMaxElev > 10 * GEO.EPS_SMALL) then sPocketing = sMyPocketing @@ -7318,7 +7344,8 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa local nQAntisplintResult = EgtGetInfo( Proc.Id, Q_ANTISPLINT_TYPE, 'i') or 0 -- se lavorazione fresa come lama disabilito eventuale antischeggia if bSpecialMillOnSide then nQAntisplintResult = 0 end - -- se non trovata una svuotatura adatta + + -- NO SVUOTATURA (si deve provare altro) if not sPocketing then -- se forma a L provo con contornatura if bIsL and not bSpecialMillOnSide and not bForceSideMill then @@ -7664,6 +7691,8 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa end end end + + -- SVUOTATURA OK else -- se devo inserire il chamfer if ( ( Proc.Fct == 3 and bIsU) or (Proc.Fct == 2 and bIsL)) and nChamfer > 0 then @@ -7998,6 +8027,21 @@ local function MakeLongMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead) local nFct = EgtSurfTmFacetCount( vAddId[i]) local AddProc = { Id = vAddId[i], Grp = Proc.Grp, Prc = Proc.Prc, Box = b3Box, TotBox = Proc.Box, Fct = nFct, Flg = Proc.Flg, PartId = Proc.PartId, TaskId = Proc.TaskId, FeatureId = Proc.FeatureId, IsSplittedLapJoint = true, AffectedFaces = Proc.AffectedFaces, OkFromBottom = Proc.OkFromBottom} Topology.Classify( AddProc, b3Raw) + -- con specifiche topologie si lavora la curva e si forza il lato aperto dove finisce la lavorazione precedente + if i > 1 and + ( ( Proc.Topology == 'Groove' and Proc.IsThrough and Proc.Fct == 3 and Proc.AffectedFaces.Left and Proc.AffectedFaces.Right) + or ( Proc.Topology == 'Groove' and Proc.Fct == 4 and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right)) + or Proc.Topology == 'Pocket') then + local nFacInd = BL.GetFaceWithMostAdj( AddProc, nPartId) + if type( nFacInd) == "number" and nFacInd >= 0 then + local nLoopId, nLoopCnt = EgtExtractSurfTmFacetLoops( vAddId[i], nFacInd, nAddGrpId) + if nLoopId and nLoopCnt == 1 then + local nEdgeId = BL.GetEdgeToMachineFromVector( vAddId[i], nFacInd, -X_AX()) + EgtSetInfo( nLoopId, 'OPEN', nEdgeId) + AddProc.LoopIdFacInd = nLoopId + end + end + end -- lasciare il false nel sesto parametro (perchè internamente viene verificato se diverso da nil) local bOk, sMyWarn bOk, sMyWarn, bPrevBhSideMill = MakeMoreFaces( AddProc, nPhase, nRawId, nPartId, dOvmHead, bAllWithEndCap, bPrevBhSideMill, bAllWithEndCap) @@ -8334,7 +8378,9 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead) -- leggo i parametri Q per utilizzare la fresa di fianco e/o lama local nUseSideTool = EgtGetInfo( Proc.Id, Q_SIDE_ROUGH_TOOL, 'i') or 0 local bUseBlade = EgtGetInfo( Proc.Id, Q_ANTISPLINT_TYPE, 'i') == 1 - local bOk, sMyWarn, _, AddedIds = Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool) + -- forzatura lavorazione discorde in base a parametro Q su feature + local nQ14Param = EgtGetInfo( Proc.Id, Q_CONVENTIONAL_MILLING, 'd') or 0 + local bOk, sMyWarn, _, AddedIds = Long2Cut.Make( Proc, nPhase, nRawId, nPartId, bUseBlade, nUseSideTool, nQ14Param) -- se non sono riuscito a farlo di lama, riprovo con la fresa if not bOk and bUseBlade then bUseBlade = false diff --git a/LuaLibs/ProcessLongDoubleCut.lua b/LuaLibs/ProcessLongDoubleCut.lua index 3e7adb8..08fbdd2 100644 --- a/LuaLibs/ProcessLongDoubleCut.lua +++ b/LuaLibs/ProcessLongDoubleCut.lua @@ -320,7 +320,7 @@ end --------------------------------------------------------------------- -- Applicazione della lavorazione -function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster, nUseSideToolMaster) +function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster, nUseSideToolMaster, nUseConventionalMilling) -- recupero l'ingombro del grezzo di appartenenza local b3Raw = EgtGetRawPartBBox( nRawId) local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) @@ -1277,26 +1277,28 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster local dLimitAngle = -0.5 - 20 * GEO.EPS_SMALL -- se facce ortogonali (concave), mantengo la lavorazione di testa sulla faccia più grande purchè non superi di 30 gradi il sottosquadra if bOrtho then - if vtN[vOrd[1]]:getZ() > 0.001 and vtN[vOrd[2]]:getZ() > 0.001 then - if vtN[vOrd[1]]:getZ() >= vtN[vOrd[2]]:getZ() then + local vtN1 = vtN[vOrd[1]] + local vtN2 = vtN[vOrd[2]] + if vtN1:getZ() > 0.001 and vtN2:getZ() > 0.001 then + if vtN1:getZ() >= vtN2:getZ() then nFin = 1 else nIni = 2 end else - if vtN[vOrd[1]]:getZ() < dLimitAngle then + if vtN1:getZ() < dLimitAngle then nIni = 2 - elseif vtN[vOrd[2]]:getZ() < dLimitAngle then + elseif vtN2:getZ() < dLimitAngle then nFin = 1 else - if vtN[vOrd[1]]:getZ() >= vtN[vOrd[2]]:getZ() then - if vtN[vOrd[1]]:getZ() < dLimitAngle then + if vtN1:getZ() >= vtN2:getZ() then + if vtN1:getZ() < dLimitAngle then nIni = 2 else nFin = 1 end else - if vtN[vOrd[1]]:getZ() < dLimitAngle then + if vtN1:getZ() < dLimitAngle then nIni = 2 else nFin = 1 @@ -1390,18 +1392,19 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster EgtOutLog( sErr) return false, sErr end + local dMySal, dMyEal = dSal, dEal if bFacesSwapped then - dSal, dEal = dEal, dSal + dMySal, dMyEal = dMyEal, dMySal end -- aggiungo geometria EgtSetMachiningGeometry( {{ Proc.Id, tFaceLong[vOrd[i]]}}) -- limito opportunamente la lavorazione if ( nSide == -1 and BD.DOWN_HEAD) then - EgtSetMachiningParam( MCH_MP.STARTADDLEN, dEal) - EgtSetMachiningParam( MCH_MP.ENDADDLEN, dSal) + EgtSetMachiningParam( MCH_MP.STARTADDLEN, dMyEal) + EgtSetMachiningParam( MCH_MP.ENDADDLEN, dMySal) else - EgtSetMachiningParam( MCH_MP.STARTADDLEN, dSal) - EgtSetMachiningParam( MCH_MP.ENDADDLEN, dEal) + EgtSetMachiningParam( MCH_MP.STARTADDLEN, dMySal) + EgtSetMachiningParam( MCH_MP.ENDADDLEN, dMyEal) end -- imposto posizione braccio porta testa per non ingombrare agli estremi EgtSetMachiningParam( MCH_MP.SCC, nSCC) @@ -1412,6 +1415,28 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster -- imposto lato di lavoro e inversione EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( bIsMachDownUp, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT)) EgtSetMachiningParam( MCH_MP.INVERT, EgtIf( bSide, true, false)) + + -- si aggiusta la direzione di lavoro in base a rotazione utensile e preferenza utente (nUseConventionalMilling da fuori o Q14) + EgtMdbSetCurrMachining( sMilling) + local bIsCurrentToolCCW = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0 + if nUseConventionalMilling == nil then + nUseConventionalMilling = EgtGetInfo( Proc.Id, 'Q14', 'd') or 0 + end + local bUseConventionalMilling = false + if nUseConventionalMilling == 1 or ( nUseConventionalMilling == 2 and vtN[vOrd[i]]:getX() < 0.1 and Proc.AffectedFaces.Bottom) then + bUseConventionalMilling = true + end + if bIsCurrentToolCCW ~= bUseConventionalMilling then + local dCurrStartAddLen = EgtGetMachiningParam( MCH_MP.STARTADDLEN) + local dCurrEndAddLen = EgtGetMachiningParam( MCH_MP.ENDADDLEN) + local bCurrInvert = EgtGetMachiningParam( MCH_MP.INVERT) + local nCurrWorkside = EgtGetMachiningParam( MCH_MP.WORKSIDE) + EgtSetMachiningParam( MCH_MP.STARTADDLEN, dCurrEndAddLen) + EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCurrStartAddLen) + EgtSetMachiningParam( MCH_MP.INVERT, not bCurrInvert) + EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( nCurrWorkside == MCH_MILL_WS.LEFT, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT)) + end + -- imposto offset radiale (nullo se concavo o di lato) local dOffsR = EgtIf( k < nO, ( nO - k) * dStep, EgtIf( bConvex, - BD.CUT_EXTRA, 0)) if bSide then dOffsR = 0 end @@ -1661,6 +1686,11 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster dEndAccDist = 0 end end + if Proc.bMoveAfterSplit then + nC = 1 + dStartDist = Proc.Box:getDimX() - ( dToolDiam / 2 + 5) + dEndDist = - ( dToolDiam / 2 + 5) + end -- ciclo sulle parti local nM = 0 for j = 1, nC do @@ -1862,6 +1892,28 @@ function ProcessLong2Cut.Make( Proc, nPhase, nRawId, nPartId, bForcedBladeMaster -- imposto lato di lavoro e inversione EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( bIsMachDownUp, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT)) EgtSetMachiningParam( MCH_MP.INVERT, true) + + -- si aggiusta la direzione di lavoro in base a rotazione utensile e preferenza utente (nUseConventionalMilling da fuori o Q14) + EgtMdbSetCurrMachining( sMilling) + local bIsCurrentToolCCW = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) < 0 + if nUseConventionalMilling == nil then + nUseConventionalMilling = EgtGetInfo( Proc.Id, 'Q14', 'd') or 0 + end + local bUseConventionalMilling = false + if nUseConventionalMilling == 1 or ( nUseConventionalMilling == 2 and vtN[vOrd[i]]:getX() < 0.1 and Proc.AffectedFaces.Bottom) then + bUseConventionalMilling = true + end + if bIsCurrentToolCCW ~= bUseConventionalMilling then + local dCurrStartAddLen = EgtGetMachiningParam( MCH_MP.STARTADDLEN) + local dCurrEndAddLen = EgtGetMachiningParam( MCH_MP.ENDADDLEN) + local bCurrInvert = EgtGetMachiningParam( MCH_MP.INVERT) + local nCurrWorkside = EgtGetMachiningParam( MCH_MP.WORKSIDE) + EgtSetMachiningParam( MCH_MP.STARTADDLEN, dCurrEndAddLen) + EgtSetMachiningParam( MCH_MP.ENDADDLEN, dCurrStartAddLen) + EgtSetMachiningParam( MCH_MP.INVERT, not bCurrInvert) + EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( nCurrWorkside == MCH_MILL_WS.LEFT, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT)) + end + -- calcolo la componente dNz non in base alla classificazione della feature (sopra, sotto, fianchi) ma alla componente maggiore -- local dNz = EgtIf( nSide == 0, vtN[vOrd[i]]:getY(), vtN[vOrd[i]]:getZ()) -- local dNz = EgtIf( abs(vtN[vOrd[i]]:getY()) >= abs(vtN[vOrd[i]]:getZ()), vtN[vOrd[i]]:getY(), vtN[vOrd[i]]:getZ()) diff --git a/LuaLibs/ProcessSplit.lua b/LuaLibs/ProcessSplit.lua index 62664c4..3a8792f 100644 --- a/LuaLibs/ProcessSplit.lua +++ b/LuaLibs/ProcessSplit.lua @@ -198,7 +198,13 @@ local function MakeTailChamfer( idProc, nPartId, dDepthTailChamfer) EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.LEFT)) local dQ09Value = EgtGetInfo( idProc, 'Q09', 'd') + if not dQ09Value then + dQ09Value = 0.1 + end local bChamferedEdge = dQ09Value > 0 + dQ09Value = EgtIf( bChamferedEdge, max( dQ09Value, 0.1), min( dQ09Value, -0.1)) + + local nIdFirstEntity, nEntityCnt = EgtExplodeCurveCompo( nLoopId) local p3MidPoint = EgtMP( nIdFirstEntity, GDB_ID.GRID) @@ -234,6 +240,9 @@ local function MakeTailChamfer( idProc, nPartId, dDepthTailChamfer) end EgtChangeClosedCurveStartPoint( idGeom, p3MidPoint, GDB_RT.GRID) + -- reimposto la griglia + EgtSetGridFrame() + -- Inserisco la lavorazione del lato standard local dExtra = 2 local sName1 = 'TailCham_' .. ( EgtGetName( idProc) or tostring( idProc)) diff --git a/UpdateLog.txt b/UpdateLog.txt index e8e06e1..d52e489 100644 --- a/UpdateLog.txt +++ b/UpdateLog.txt @@ -1,5 +1,16 @@ ==== Beam Update Log ==== +Versione 3.1b1 (26/02/2026) +- Added : in LapJoint lunghe gestito Q14 per lavorare discorde +- Added : in forature ora sono possibili le DrillPocket in doppio (ultimo step fatto dalla testa principale) +- Added : in FreeContour (contornatura) aggiunta Q10 per forzare massima elevazione +- Modif : in LongDoubleCut e LapJoint lunghe migliorata la scelta della faccia da lavorare e altre migliorie +- Modif : in LapJoint migliorie alle svuotature +- Modif : in LapJoint lunghe, negli spezzoni successivi al primo, le svuotature considerano l'area svuotata precedente +- Fixed : in forature in doppio si garantisce l'ultimo step per evitare collisioni delle punte o finecorsa +- Fixed : in mortasa a coda di rondine tagliata corretti ingresso uscita in caso di svuotatura +- Fixed : in tagli di testa e coda corretti smussi con P08 e P09 + Versione 2.7l3 (23/12/2025) - Modif : nei fori che attraversano un taglio si decide la precedenza in base all'angolo tra foro e taglio stesso - Fixed : corretto precut in caso di sega a catena diff --git a/Version.lua b/Version.lua index 8f921ab..604b3d1 100644 --- a/Version.lua +++ b/Version.lua @@ -2,5 +2,5 @@ -- Gestione della versione di Beam NAME = 'Beam' -VERSION = '3.1a1' -MIN_EXE = '2.7f2' +VERSION = '3.1b1' +MIN_EXE = '3.1b1'