Compare commits

...

10 Commits

Author SHA1 Message Date
daniele.nicoli 6ae1e94cd5 In LapJoint - FacesBySaw, nelle Slot di testa con forma a U, forzata lavorazione concorde a discapito della direzione (da sotto a sopra o viceversa) 2026-03-19 17:13:43 +01:00
luca.mazzoleni bbffd69e1e Merge tag '3.1c2' into develop
3.1c2
2026-03-18 15:38:49 +01:00
luca.mazzoleni 30028fecf0 Merge branch 'release/3.1c2' 2026-03-18 15:38:36 +01:00
luca.mazzoleni cf96d7bc90 update log e versione 2026-03-18 15:37:49 +01:00
luca.mazzoleni 89fefbcbad - in LapJoint per antischeggia Q06 contemplato valore 3 per scegliere in automatico la strategia (lama o fresa)
- in LapJoint Q17=0 significa nessun codolo (sempre abbinato a Q02)
2026-03-18 15:37:15 +01:00
luca.mazzoleni 6892759956 - in LapJoint per Q02 solo contorno sono ammessi anche i tunnel; aggiunti messagi in caso di lavorazione incompleta 2026-03-17 13:08:36 +01:00
luca.mazzoleni 78a3e907ce Merge branch 'ContourOnGroove3' into develop 2026-03-17 11:42:16 +01:00
luca.mazzoleni 63133c8813 - in BeamLib.GetToolfromMachining per le frese si leggono anche MaxDepth e StemDiameter. MaxDepth corretta se StemDiameter > Diameter
- in LapJoint correzioni a Q02 per solo contorno
2026-03-17 09:57:48 +01:00
luca.mazzoleni 58e32bdfd0 - in LapJoint aggiunta possibilità di fare solo contorno per tasche groove 3 aperte con Q02, pe L030 2026-03-16 18:23:16 +01:00
luca.mazzoleni 6528e6e77c Merge branch 'Test_Ticket#2842' into develop 2026-03-12 18:43:16 +01:00
5 changed files with 380 additions and 67 deletions
+5
View File
@@ -1393,6 +1393,11 @@ function BeamLib.GetToolFromMachining( sMachiningName)
else
Tool.IsOnAggregate = false
end
Tool.StemDiameter = EgtTdbGetCurrToolParam( MCH_TP.STEMDIAM) or 0
Tool.MaxDepth = EgtTdbGetCurrToolMaxDepth() or 0
if Tool.StemDiameter > Tool.Diameter + GEO.EPS_SMALL then
Tool.MaxDepth = Tool.MaxDepth - BD.COLL_SIC
end
-- altri utensili al momento non previsti
else
error( 'Wrong tool type')
+2 -2
View File
@@ -231,7 +231,7 @@ local function GetEdgeToMachineFromVector( nSurfId, nFacet, vtOrthO)
end
---------------------------------------------------------------------
function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bMaximizeVerticalDepth, bSpecialTangentLeadInOut, sLeadInOutType, Par5Alternative, dActualElevation)
function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDwnUp, dCutExtra, dCutSic, dCutOffset, dAccStart, dAccEnd, sNotes, b3Raw, bForceInvert, bMaximizeVerticalDepth, bSpecialTangentLeadInOut, sLeadInOutType, Par5Alternative, dActualElevation, bForceClimbCut)
-- se lama con asse parallelo alla faccia, passo alla apposita funzione
if ( Par5 == MCH_MILL_FU.PARAL_DOWN or
Par5 == MCH_MILL_FU.PARAL_TOP or
@@ -298,7 +298,7 @@ function FacesBySaw.MakeOne( nSurfId, nFacet, sCutting, dSawDiam, Par5, dVzLimDw
if not BD.TURN or abs( ptP2:getY() - ptP1:getY()) < 250 then
local bIsMachiningDownwards = ( ptP2:getZ() < ptP1:getZ() - 100 * GEO.EPS_SMALL)
local bIsMachiningUpwards = ( ptP2:getZ() > ptP1:getZ() + 100 * GEO.EPS_SMALL)
if ( bIsSawCCW ~= bDownUp) and ( bIsMachiningDownwards or not ( bIsMachiningDownwards or bIsMachiningUpwards)) then
if ( bIsSawCCW ~= bDownUp) and ( bIsMachiningDownwards or not ( bIsMachiningDownwards or bIsMachiningUpwards) or bForceClimbCut) then
bInvert = true
elseif ( ( bIsSawCCW ~= bDownUp) ~= bIsMachiningDownwards) then
if Par5Alternative then
+363 -64
View File
@@ -153,6 +153,7 @@ local Q_CHAINSAW_FROM_SIDE = '' -- i
local Q_CONVENTIONAL_MILLING = '' -- i
local Q_CLEAN_CORNER = '' -- 1
local Q_FLOATING_AGGREGATE = '' -- i
local Q_DIM_STRIP = '' -- d
-- variabile smussi
local bMadeChamfer
@@ -233,6 +234,7 @@ local function AssignQIdent( Proc)
Q_CONVENTIONAL_MILLING = 'Q14' -- i
Q_CLEAN_CORNER = 'Q15' -- i
Q_FLOATING_AGGREGATE = 'Q16' -- i
Q_DIM_STRIP = 'Q17' -- d
elseif ( Proc.Grp == 1 or Proc.Grp == 2) and Proc.Prc == 30 then
Q_BLADE_ON_ALONG_FACE = 'Q04' -- i
elseif ( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 32 then
@@ -2414,6 +2416,229 @@ local function MakeDrillOnCorner( Proc, nPhase, nRawId, nPartId, b3Raw, nFacInd,
return true, sMyWarn
end
---------------------------------------------------------------------
local function MakeContourByMill( Proc, idContourPath, vtTunnelDirection, dTunnelDepth, dDimStrip, nPhase)
local dCollSic = BL.CalcCollisionSafety( vtTunnelDirection)
local bMultipleHeadsAvailble = BD.DOWN_HEAD or BD.TWO_EQUAL_HEADS
local bMillFromBottom = vtTunnelDirection:getZ() < BD.NZ_MINA
local bMillFromBottomOpposite = -vtTunnelDirection:getZ() < BD.NZ_MINA
local sApplyWarning = ''
local bIncomplete = false
-- ricerca lavorazione lato principale
local sMilling = ML.FindMilling( 'SmallToolContour', nil, nil, nil, nil, not bMillFromBottom, bMillFromBottom)
if not sMilling then
local sErr = 'Warning : SmallToolContour not found in library'
EgtOutLog( sErr)
return false, sErr
end
-- dati utensile
local Tool = BL.GetToolFromMachining( sMilling)
-- verifica necessità lavorazione opposta
local bOppositeMillingNeeded
local bMainMillingReachesFullDepth = Tool.MaxDepth > dTunnelDepth + dCollSic - dDimStrip
local bMainMillingReachesHalfDepth = bMainMillingReachesFullDepth or ( Tool.MaxDepth > dTunnelDepth / 2 + dCollSic - dDimStrip / 2)
if bMainMillingReachesFullDepth and not bMultipleHeadsAvailble then
bOppositeMillingNeeded = false
else
bOppositeMillingNeeded = true
end
-- ricera lavorazione lato opposto
local sMillingOpposite = ML.FindMilling( 'SmallToolContour', nil, nil, nil, nil, not bMillFromBottomOpposite, bMillFromBottomOpposite)
if bOppositeMillingNeeded and not sMillingOpposite then
local sErr = 'Warning : Opposite SmallToolContour not found in library'
EgtOutLog( sErr)
return false, sErr
end
-- dati utensile
local ToolOpposite = BL.GetToolFromMachining( sMillingOpposite)
local bOppositMillingReachesHalfDepth = ToolOpposite.MaxDepth > dTunnelDepth / 2 + dCollSic - dDimStrip / 2
-- applicazione lavorazione lato principale
local sName = 'Contour_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
local idMachining = EgtAddMachining( sName, sMilling)
if not idMachining then
local sErr = 'Error : impossible add machining ' .. sName .. '-' .. sMilling
return false, sErr
end
-- geometria
EgtSetMachiningGeometry( {{ idContourPath, -1}})
-- lato di lavoro sinistro
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.LEFT)
-- inversione direzione utensile
EgtSetMachiningParam( MCH_MP.TOOLINVERT, false)
-- SCC
local nSCC = MCH_SCC.NONE
if not BD.C_SIMM then
if AreSameOrOppositeVectorApprox( vtTunnelDirection, Z_AX()) then
nSCC = MCH_SCC.ADIR_YM
elseif abs( vtTunnelDirection:getX()) < 0.1 then
nSCC = EgtIf( BL.IsPartFinalPhase( nPhase), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP)
elseif vtTunnelDirection:getY() < GEO.EPS_SMALL then
nSCC = MCH_SCC.ADIR_YM
else
nSCC = MCH_SCC.ADIR_YP
end
end
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
-- gestione attacco e uscita
if EgtCurveIsClosed( idContourPath) then
-- attacco e uscita a quarto di cerchio senza allungamenti a inizio e fine
EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.TANGENT)
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.AS_LI)
EgtSetMachiningParam( MCH_MP.LITANG, 0)
EgtSetMachiningParam( MCH_MP.LIPERP, 0.5 * Tool.Diameter)
EgtSetMachiningParam( MCH_MP.LIELEV, 0)
EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0)
else
-- nessun attacco e uscita, allungo inizio e fine di raggio utensile + 5mm (per evitare controllo collisioni)
EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.NONE)
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.AS_LI)
EgtSetMachiningParam( MCH_MP.STARTADDLEN, Tool.Diameter / 2 + 5)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, Tool.Diameter / 2 + 5)
end
-- affondamento - la curva è a metà tasca quindi affondamento 0 significa che la lavorazione arriva a metà tasca
local dDepth
-- c'è la lavorazione opposta
if bOppositeMillingNeeded then
-- si arriva a metà tasca
if bMainMillingReachesHalfDepth then
dDepth = -dDimStrip / 2
-- si arriva al massimo raggiungibile
else
dDepth = Tool.MaxDepth - dTunnelDepth / 2 - dCollSic
bIncomplete = true
end
-- non c'è lavorazione opposta
else
-- si arriva fino in fondo
if bMainMillingReachesFullDepth then
dDepth = dTunnelDepth / 2 - dDimStrip
-- si arriva al massimo raggiungibile
else
dDepth = Tool.MaxDepth - dTunnelDepth / 2 - dCollSic
bIncomplete = true
end
end
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
-- Note utente con dichiarazione nessuna generazione sfridi per Vmill e massima elevazione
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dTunnelDepth / 2 + dDepth, 1))
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
-- eseguo
local bMillingOk
if ML.ApplyMachining( true, false) then
_, sApplyWarning = EgtGetMachMgrWarning( 0)
if EgtIsMachiningEmpty() then
EgtSetOperationMode( idMachining, false)
end
bMillingOk = true
-- altrimenti lavorazione non applicata
else
_, sApplyWarning = EgtGetLastMachMgrError()
EgtSetOperationMode( idMachining, false)
bMillingOk = false
end
-- eventuale lavorazione opposta
local bMillingOppositeOk
if bOppositeMillingNeeded then
local sName = 'ContourOppo_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id))
local idMachining = EgtAddMachining( sName, sMillingOpposite)
if not idMachining then
local sErr = 'Error : impossible add machining ' .. sName .. '-' .. sMilling
return false, sErr
end
-- geometria
EgtSetMachiningGeometry( {{ idContourPath, -1}})
-- lato di lavoro sinistro
EgtSetMachiningParam( MCH_MP.WORKSIDE, MCH_MILL_WS.RIGHT)
-- inversione direzione utensile
EgtSetMachiningParam( MCH_MP.TOOLINVERT, true)
-- SCC
local nSCC = MCH_SCC.NONE
if not BD.C_SIMM then
if AreSameOrOppositeVectorApprox( vtTunnelDirection, Z_AX()) then
nSCC = MCH_SCC.ADIR_YM
elseif abs( vtTunnelDirection:getX()) < 0.1 then
nSCC = EgtIf( BL.IsPartFinalPhase( nPhase), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP)
elseif vtTunnelDirection:getY() < GEO.EPS_SMALL then
nSCC = MCH_SCC.ADIR_YM
else
nSCC = MCH_SCC.ADIR_YP
end
end
EgtSetMachiningParam( MCH_MP.SCC, nSCC)
-- gestione attacco e uscita
if EgtCurveIsClosed( idContourPath) then
-- attacco e uscita a quarto di cerchio senza allungamenti a inizio e fine
EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.TANGENT)
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.AS_LI)
EgtSetMachiningParam( MCH_MP.LITANG, 0)
EgtSetMachiningParam( MCH_MP.LIPERP, 0.5 * Tool.Diameter)
EgtSetMachiningParam( MCH_MP.LIELEV, 0)
EgtSetMachiningParam( MCH_MP.STARTADDLEN, 0)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, 0)
else
-- nessun attacco e uscita, allungo inizio e fine di raggio utensile + 5mm (per evitare controllo collisioni)
EgtSetMachiningParam( MCH_MP.LEADINTYPE, MCH_MILL_LI.NONE)
EgtSetMachiningParam( MCH_MP.LEADOUTTYPE, MCH_MILL_LO.AS_LI)
EgtSetMachiningParam( MCH_MP.STARTADDLEN, Tool.Diameter / 2 + 5)
EgtSetMachiningParam( MCH_MP.ENDADDLEN, Tool.Diameter / 2 + 5)
end
-- affondamento - la curva è a metà tasca quindi affondamento 0 significa che la lavorazione arriva a metà tasca
local dDepth
-- si arriva a metà tasca
if bOppositMillingReachesHalfDepth then
dDepth = -dDimStrip / 2
-- si arriva al massimo raggiungibile
else
dDepth = Tool.MaxDepth - dTunnelDepth / 2 - dCollSic
bIncomplete = true
end
EgtSetMachiningParam( MCH_MP.DEPTH, dDepth)
-- Note utente con dichiarazione nessuna generazione sfridi per Vmill e massima elevazione
local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or ''
sUserNotes = EgtSetValInNotes( sUserNotes, 'VMRS', 0)
sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dTunnelDepth / 2 + dDepth, 1))
EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes)
-- eseguo
if ML.ApplyMachining( true, false) then
_, sApplyWarning = EgtGetMachMgrWarning( 0)
if EgtIsMachiningEmpty() then
EgtSetOperationMode( idMachining, false)
end
bMillingOppositeOk = true
-- altrimenti lavorazione non applicata
else
_, sApplyWarning = EgtGetLastMachMgrError()
EgtSetOperationMode( idMachining, false)
bMillingOppositeOk = false
end
end
if bMillingOk or ( bOppositeMillingNeeded and bMillingOppositeOk) then
local sWarning = ''
if bIncomplete then
sWarning = 'Warning : machining incomplete'
end
if #sApplyWarning > 0 then
sWarning = sApplyWarning .. '\n' .. sWarning
end
return true, sWarning
else
local sErr = 'Error : Not applicable'
return false, sErr
end
end
---------------------------------------------------------------------
local function ExtractExternalPaths( nPathInt, nNumIdAux, vtOrtho, b3Solid, nAddGrpId)
local nAuxId1, nAuxId2
@@ -3091,7 +3316,8 @@ local function MakeByChainOrSaw( Proc, nPhase, nRawId, nPartId, nFacInd,
end
for i = 1, nStep do
local dOffs = ( i - 1) * dStep
local bOk, sErr = Fbs.MakeOne( Proc.Id, nFacAdj, sCutting, dSawDiam, nFaceUse, -0.01, 0, BD.CUT_SIC, dOffs, 0, 0, nil, b3Raw)
local bForceClimbCut = true
local bOk, sErr = Fbs.MakeOne( Proc.Id, nFacAdj, sCutting, dSawDiam, nFaceUse, -0.01, 0, BD.CUT_SIC, dOffs, 0, 0, nil, b3Raw, nil, nil, nil, nil, nil, nil, bForceClimbCut)
if not bOk then return bOk, sErr end
end
-- in base all'elevazione calcolo l'impronta della lama
@@ -6672,17 +6898,50 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
if bForceChainsaw then
-- ottengo le dimensioni del tunnel
dDimMin, dDimMax, dDepth, vtOrtho, nLundIdFace = BL.GetTunnelDimension( Proc, nPartId)
-- lavoro fessura con svuotature (singola o doppia contrapposta)
-- se non richiesto solo contorno, lavoro fessura con svuotature (singola o doppia contrapposta)
else
local sMyMchFind = 'Pocket'
local nOk, sErr
nOk, sErr, dDimMin, dDimMax, dDepth, vtOrtho,
nLundIdFace, sErr = MakeByPockets( Proc, nPhase, nRawId, nPartId, nChamfer, dDepthCham, nAddGrpId, sMyMchFind, false, b3Solid, bClosedOrthoFaces)
if nOk < 0 then
return false, sErr
elseif nOk > 0 then
sWarn = sErr
bTryWithBlades = false
local bOnlyContour = ( EgtGetInfo( Proc.Id, Q_ONLY_CONTOUR, 'i') or 0) > 0
if bOnlyContour then
if Proc.TopologyLongName == 'Tunnel-Through-RightAngles-Parallel-4' then
-- direzione e faccia aggiunta del tunnel (la groove-3 passante è uno pseudotunnel)
local _, _, dTunnelDepth, vtTunnelDirection, _, idAddedTunnelTmFace = BL.GetTunnelDimension( Proc, nPartId)
-- si tiene il verso del tunnel dal lato Z positiva
if vtTunnelDirection:getZ() < GEO.EPS_SMALL then
vtTunnelDirection = -vtTunnelDirection
EgtInvertSurf( idAddedTunnelTmFace)
end
-- estrazione del contorno da lavorare
local idContourPath = EgtExtractSurfTmLoops( idAddedTunnelTmFace, nAddGrpId)
EgtModifyCurveExtrusion( idContourPath, vtTunnelDirection, GDB_RT.GLOB)
-- spessore codolo da lasciare
local dDimStrip = EgtGetInfo( Proc.Id, Q_DIM_STRIP, 'd') or 0
-- lavorazione
local bOkContour, sWarn2 = MakeContourByMill( Proc, idContourPath, vtTunnelDirection, dTunnelDepth, dDimStrip, nPhase)
if bOkContour then
return true, sWarn2
else
return false, sWarn2
end
if sWarn2 then
if not sWarn then sWarn = '' end
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
end
else
local sErr2 = 'Error : Cannot use ' .. Q_ONLY_CONTOUR .. ' on this feature'
return false, sErr2
end
-- svuotatura
else
local sMyMchFind = 'Pocket'
local nOk, sErr
nOk, sErr, dDimMin, dDimMax, dDepth, vtOrtho,
nLundIdFace, sErr = MakeByPockets( Proc, nPhase, nRawId, nPartId, nChamfer, dDepthCham, nAddGrpId, sMyMchFind, false, b3Solid, bClosedOrthoFaces)
if nOk < 0 then
return false, sErr
elseif nOk > 0 then
sWarn = sErr
bTryWithBlades = false
end
end
end
-- Se la svuotatura precedente non è stata fatta e chamfer non è mutuamente esclusivo provo con la sega-catena
@@ -7472,7 +7731,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
local bPassEdge = ((( bIsU and Proc.Fct == 3) or ( bIsL and Proc.Fct == 2)) and bSinglePart and Proc.Box:getDimX() < 0.9 * b3Raw:getDimX())
local nFacIndOri = BL.GetFaceWithMostAdj( Proc, nPartId)
local vtNOri = EgtSurfTmFacetNormVersor( Proc.Id, nFacIndOri, GDB_ID.ROOT)
if nChamfer < 2 and nQAntisplintResult == 1 and (( bIsU or bIsL) and ( bPassThrou or bPassEdge)) and ( vtNOri:getZ() > -0.087 or BD.DOWN_HEAD or BD.TURN) then
if nChamfer < 2 and ( nQAntisplintResult == 1 or nQAntisplintResult == 3) and (( bIsU or bIsL) and ( bPassThrou or bPassEdge)) and ( vtNOri:getZ() > -0.087 or BD.DOWN_HEAD or BD.TURN) then
local bOk
local bSawDown = ( bMillDown and not bMillUp)
bMadeASbyBld, bOk, sWarn = ManageAntiSplintBySaw( Proc, b3Raw, b3Solid, bIsU, vtNOri, nFacIndOri, sWarn, bSawDown, true)
@@ -7557,8 +7816,7 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
end
bTryWithBlades = false
-- se ho antischeggia con fresa le inserisco
-- if nChamfer < 2 and nQAntisplintResult == 2 and ( bIsU or bIsL) then
if nChamfer < 2 and nQAntisplintResult == 2 then
if nChamfer < 2 and ( nQAntisplintResult == 2 or ( nQAntisplintResult == 3 and not bMadeASbyBld)) then
local bOk, sWarn2 = ManageAntiSplintByMill( Proc, nPhase, nRawId, nPartId, b3Raw,
nFacInd, nAddGrpId, bMillDown, dDiamTool, nil,
nil, nil, nil, b3Solid, dDepth,
@@ -7582,59 +7840,95 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
end
end
-- in tutti gli altri casi, a meno che non sia forzata sega a catena, lancio la MakeByPockets
-- lavorazione singola o doppia contrapposta, fondo della tasca una faccia fittizia perpendicolare al lato lungo
-- se non richiesto solo contorno, lavorazione singola o doppia contrapposta, fondo della tasca una faccia fittizia perpendicolare al lato lungo
elseif not bForceChainsaw then
-- se 2 facce setto i parametri corretti per la MakeByPockets
if bForceSideMill and Proc.Fct == 2 then
bIs3Faces = false
bOrthoFacesMaster = true
bSetOpenBorders = true
end
nOk, sErr, dDimMin, dDimMax, dDepth, vtOrtho, nLundIdFace, dDiamTool, bDoubleSide, nPathInt, nSurfInt, bOneShot, bMillDown, nFirstMachId,
bOrthoFaces = MakeByPockets( Proc, nPhase, nRawId, nPartId, nChamfer, dDepthCham, nAddGrpId, sMyMchFind, bIs3Faces, b3Solid, bOrthoFacesMaster, bMillDown, bSetOpenBorders, bIsU, bIsL)
if nOk == -3 then
bTryWithBlades = true
elseif nOk == -2 then
if not sMchFind then
sMchFind = sMchFindBackUp
end
sPocketing = ML.FindPocketing( sMchFind, dDiam, nil, nil, not bMillDown, bMillDown)
if not sPocketing then
local sErr2 = 'Error : '..sMchFind..' not found in library'
EgtOutLog( sErr2)
return false, sErr2
end
bTryWithBlades = false
sWarn = sErr
elseif nOk < 0 then
return false, sErr
elseif nOk > 0 then
bTryWithBlades = false
sWarn = sErr
-- se ho antischeggia con fresa le inserisco
-- if nChamfer < 2 and nQAntisplintResult == 2 and ( bIsU or bIsL) then
local nFacIndOri, dFacElevOri = BL.GetFaceWithMostAdj( Proc, nPartId)
if nChamfer < 2 and nQAntisplintResult == 2 then
local bOk, sWarn2 = ManageAntiSplintByMill( Proc, nPhase, nRawId, nPartId, b3Raw,
nFacIndOri, nAddGrpId, bMillDown, dDiamTool, nil,
nil, nil, nil, b3Solid, dFacElevOri,
bOneShot, nFirstMachId)
local bOnlyContour = ( EgtGetInfo( Proc.Id, Q_ONLY_CONTOUR, 'i') or 0) > 0
-- richiesto solo contorno
if bOnlyContour then
if Proc.TopologyLongName == 'Groove-Through-RightAngles-Parallel-3' then
-- direzione e faccia aggiunta del tunnel (la groove-3 passante è uno pseudotunnel)
local _, _, dTunnelDepth, vtTunnelDirection, _, idAddedTunnelTmFace = BL.GetTunnelDimension( Proc, nPartId)
-- si tiene il verso del tunnel dal lato Z positiva
if vtTunnelDirection:getZ() < GEO.EPS_SMALL then
vtTunnelDirection = -vtTunnelDirection
EgtInvertSurf( idAddedTunnelTmFace)
end
-- estrazione del contorno da lavorare
local idContourPath = EgtExtractSurfTmLoops( idAddedTunnelTmFace, nAddGrpId)
EgtModifyCurveExtrusion( idContourPath, vtTunnelDirection, GDB_RT.GLOB)
-- si eliminano i lati aperti
BL.SetOpenSide( idContourPath, b3Solid)
BL.ChangeOrOpenStart( idContourPath, 2)
-- spessore codolo da lasciare
local dDimStrip = EgtGetInfo( Proc.Id, Q_DIM_STRIP, 'd') or 0
-- lavorazione
local bOkContour, sWarn2 = MakeContourByMill( Proc, idContourPath, vtTunnelDirection, dTunnelDepth, dDimStrip, nPhase)
if bOkContour then
return true, sWarn2
else
return false, sWarn2
end
if sWarn2 then
if not sWarn then sWarn = '' end
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
end
else
local sErr2 = 'Error : Cannot use ' .. Q_ONLY_CONTOUR .. ' on this feature'
return false, sErr2
end
-- se abilitato dal parametro Q inserisco pulitura spigoli o contorno con fresa più piccola
local nContourSmallTool = EgtGetInfo( Proc.Id, Q_CONTOUR_SMALL_TOOL, 'i') or 0
if nContourSmallTool > 0 then
local bOk, sWarn2 = MakeRoundCleanCornerOrContour( Proc, nPhase, nRawId, nPartId, b3Raw,
nFacInd, nAddGrpId, dDiamTool, nContourSmallTool, bMillDown,
bDoubleSide, vtOrtho, nPathInt, nSurfInt, b3Solid,
dDepth, bOneShotm)
if not bOk then return false, sWarn2 end
if sWarn2 then
if not sWarn then sWarn = '' end
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
-- svuotatura
else
-- se 2 facce setto i parametri corretti per la MakeByPockets
if bForceSideMill and Proc.Fct == 2 then
bIs3Faces = false
bOrthoFacesMaster = true
bSetOpenBorders = true
end
nOk, sErr, dDimMin, dDimMax, dDepth, vtOrtho, nLundIdFace, dDiamTool, bDoubleSide, nPathInt, nSurfInt, bOneShot, bMillDown, nFirstMachId,
bOrthoFaces = MakeByPockets( Proc, nPhase, nRawId, nPartId, nChamfer, dDepthCham, nAddGrpId, sMyMchFind, bIs3Faces, b3Solid, bOrthoFacesMaster, bMillDown, bSetOpenBorders, bIsU, bIsL)
if nOk == -3 then
bTryWithBlades = true
elseif nOk == -2 then
if not sMchFind then
sMchFind = sMchFindBackUp
end
sPocketing = ML.FindPocketing( sMchFind, dDiam, nil, nil, not bMillDown, bMillDown)
if not sPocketing then
local sErr2 = 'Error : '..sMchFind..' not found in library'
EgtOutLog( sErr2)
return false, sErr2
end
bTryWithBlades = false
sWarn = sErr
elseif nOk < 0 then
return false, sErr
elseif nOk > 0 then
bTryWithBlades = false
sWarn = sErr
-- se ho antischeggia con fresa le inserisco
local nFacIndOri, dFacElevOri = BL.GetFaceWithMostAdj( Proc, nPartId)
if nChamfer < 2 and ( nQAntisplintResult == 2 or ( nQAntisplintResult == 3 and not bMadeASbyBld)) then
local bOk, sWarn2 = ManageAntiSplintByMill( Proc, nPhase, nRawId, nPartId, b3Raw,
nFacIndOri, nAddGrpId, bMillDown, dDiamTool, nil,
nil, nil, nil, b3Solid, dFacElevOri,
bOneShot, nFirstMachId)
if sWarn2 then
if not sWarn then sWarn = '' end
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
end
end
-- se abilitato dal parametro Q inserisco pulitura spigoli o contorno con fresa più piccola
local nContourSmallTool = EgtGetInfo( Proc.Id, Q_CONTOUR_SMALL_TOOL, 'i') or 0
if nContourSmallTool > 0 then
local bOk, sWarn2 = MakeRoundCleanCornerOrContour( Proc, nPhase, nRawId, nPartId, b3Raw,
nFacInd, nAddGrpId, dDiamTool, nContourSmallTool, bMillDown,
bDoubleSide, vtOrtho, nPathInt, nSurfInt, b3Solid,
dDepth, bOneShotm)
if not bOk then return false, sWarn2 end
if sWarn2 then
if not sWarn then sWarn = '' end
sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)
end
end
end
end
@@ -7718,14 +8012,14 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa
local bPassEdge = ((( bIsU and Proc.Fct == 3) or ( bIsL and Proc.Fct == 2)) and bSinglePart and Proc.Box:getDimX() < 0.9 * b3Raw:getDimX())
local nFacIndOri = BL.GetFaceWithMostAdj( Proc, nPartId)
local vtNOri = EgtSurfTmFacetNormVersor( Proc.Id, nFacIndOri, GDB_ID.ROOT)
if nChamfer < 2 and nQAntisplintResult == 1 and (( bIsU or bIsL) and ( bPassThrou or bPassEdge)) and ( vtNOri:getZ() > -0.087 or BD.DOWN_HEAD or BD.TURN) then
if nChamfer < 2 and ( nQAntisplintResult == 1 or nQAntisplintResult == 3) and (( bIsU or bIsL) and ( bPassThrou or bPassEdge)) and ( vtNOri:getZ() > -0.087 or BD.DOWN_HEAD or BD.TURN) then
local bOk
local bSawDown = ( bMillDown and not bMillUp)
bMadeASbyBld, bOk, sWarn = ManageAntiSplintBySaw( Proc, b3Raw, b3Solid, bIsU, vtNOri, nFacIndOri, sWarn, bSawDown)
if not bOk then return false, sWarn end
end
if nChamfer < 2 and nQAntisplintResult == 2 then
local bOk, sWarn2 = ManageAntiSplintByMill( Proc, nPhase, nRawId, nPartId, b3Raw,
if nChamfer < 2 and ( nQAntisplintResult == 2 or ( nQAntisplintResult == 3 and not bMadeASbyBld)) then
local bOk, sWarn2 = ManageAntiSplintByMill( Proc, nPhase, nRawId, nPartId, b3Raw,
nFacInd, nAddGrpId, bMillDown, dDiamTool, nil,
nil, nil, nil, b3Solid)
if not bOk then return false, sWarn2 end
@@ -8356,6 +8650,11 @@ function ProcessLapJoint.Make( Proc, nPhase, nRawId, nPartId, dOvmHead)
if ( Proc.Box:getDimX() > BD.LONGCUT_MAXLEN) or
( Proc.Box:getDimX() > 0.7 * b3Solid:getDimX() and ( Proc.DistanceToNextPart > 1000 or Proc.Box:getDimX() > BD.LONGCUT_ENDLEN)) or
( ( nForceUseBladeOnNotContinueFace and nForceUseBladeOnNotContinueFace > 0) and ( Proc.Box:getDimX() > ( BD.LEN_SHORT_PART or 1000))) then
local bOnlyContour = ( EgtGetInfo( Proc.Id, Q_ONLY_CONTOUR, 'i') or 0) > 0
if bOnlyContour then
local sErr2 = 'Error : Cannot use ' .. Q_ONLY_CONTOUR .. ' on long features'
return false, sErr2
end
-- una faccia
if Proc.Fct == 1 then
if bUseBlade then
+9
View File
@@ -1,4 +1,13 @@
==== Beam Update Log ====
Versione 3.1c2 (18/03/2026)
- Added : in LapJoint (solo L030) aggiunto Q02 per fare solo contorno per forme a "C" e tunnel; Q17 spessore di eventuale codolo
- Modif : per LapJoint e simili il Q06 per antischeggia ora contempla il valore 3 per scegliere la strategia in automatico (lama o fresa)
- Modif : in LapJoint migliorie nella lavorazione delle tasche aperte
- Modif : in LongDoubleCut e LapJoint lunghe migliorata scelta fresa in caso di tasca che guarda verso il basso
- Fixed : in forature in doppio con svuotatura corretto ultimo step
- Fixed : in split correzione in caso di materiale di coda molto sottile e testa sotto
- Fixed : in LongDoubleCut e LapJoint lunghe eliminata passate finale dopo taglio di coda se non è presente un grezzo successivo
Versione 3.1c1 (04/03/2026)
- Fixed : correzione in ordinamento (fori vs tagli)
- Fixed : in drilling rimosso preforo duplicato
+1 -1
View File
@@ -2,5 +2,5 @@
-- Gestione della versione di Beam
NAME = 'Beam'
VERSION = '3.1c1'
VERSION = '3.1c2'
MIN_EXE = '3.1b1'