From 3b785a090785ff41f4019230e6ea08955a43d2d3 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Thu, 8 May 2025 17:55:10 +0200 Subject: [PATCH 1/2] - in MachiningLib.GetTimeToMachineAllStepsWithLeadInOut contemplata Pocketing - in STR0002 modifiche per migliorare il calcolo tempi --- LuaLibs/MachiningLib.lua | 15 ++++++++++- Strategies/Standard/STR0002/STR0002.lua | 35 +++++++++++++++++++++---- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 9531b97..4115602 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -871,7 +871,7 @@ function MachiningLib.AddOperations( vProc, Part, sRotation) nErr, sErr = EgtGetLastMachMgrError() EgtSetOperationMode( nOperationId, false) -- update risultati - -- TODO è corretto mettere non applicabile????? + -- TODO è corretto mettere non applicabile????? disattivare e dare un'incompleta gialla? RESULT[MACHININGS[i].Proc.nIndexInResult].ChosenStrategy.sStatus = 'Not-Applicable' RESULT[MACHININGS[i].Proc.nIndexInResult].ChosenStrategy.sApplyInfo = sErr RESULT[MACHININGS[i].Proc.nIndexInResult].ChosenStrategy.nApplyError = nErr @@ -996,6 +996,19 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining) dLengthToMachineAllStepsWithLeadInOut = Machining.CloneStepsLongitudinal.nCount * ( ( 2 * Machining.Steps.nCount - 1) * Machining.dLengthToMachine + 2 * 10 * ( Machining.Steps.nCount - 1) + 2 * ( Machining.dDepthToMachine + ( TOOLS[Machining.nToolIndex].SetupInfo.dZSafeDelta or 60) + EgtMdbGetGeneralParam( MCH_GP.SAFEZ))) dTimeToMachineTotal = Machining.CloneStepsLongitudinal.nCount * ( ( 2 * Machining.Steps.nCount - 1) * dTimeToMachineEdge + 2 * 10 / dToolFeed * ( Machining.Steps.nCount - 1) + dTimeToMachineLeadIn + dTimeToMachineLeadOut) end + elseif Machining.nType == MCH_MY.POCKETING then + local dDepthToMachine = min( Machining.dElevation, ( Machining.dMaxElev or Machining.dElevation)) - ( max( 0, Machining.ToolInfo.dResidualDepth or 0)) + local nSteps = ceil( ( dDepthToMachine - 50 * GEO.EPS_SMALL) / TOOLS[Machining.nToolIndex].dStep) + local _, dLongEdgeDimension, dShortEdgeDimension = EgtSurfTmFacetMinAreaRectangle( Machining.Geometry[1][1], Machining.Geometry[1][2], GDB_ID.ROOT) + -- TODO bisogna calcolare correttamente per lati aperti e chiusi (aperti: aggiungi D/2 - Sidestep, chiusi: sottrai - D/2) + local nOffsets = ceil ( ( dShortEdgeDimension - TOOLS[Machining.nToolIndex].dSideStep) / TOOLS[Machining.nToolIndex].dSideStep) + 1 + for i = 1, floor( nOffsets / 2) do + dLengthToMachineAllStepsWithLeadInOut = dLengthToMachineAllStepsWithLeadInOut + + 2 * ( dShortEdgeDimension - 2 * ( i - 1) * TOOLS[Machining.nToolIndex].dSideStep) + + 2 * ( dLongEdgeDimension - 2 * ( i - 1) * TOOLS[Machining.nToolIndex].dSideStep) + end + dLengthToMachineAllStepsWithLeadInOut = dLengthToMachineAllStepsWithLeadInOut * nSteps + dTimeToMachineTotal = dLengthToMachineAllStepsWithLeadInOut / dToolFeed else error( 'GetTimeToMachineAllStepsWithLeadInOut : unknown machining type') end diff --git a/Strategies/Standard/STR0002/STR0002.lua b/Strategies/Standard/STR0002/STR0002.lua index ef1062c..6e96561 100644 --- a/Strategies/Standard/STR0002/STR0002.lua +++ b/Strategies/Standard/STR0002/STR0002.lua @@ -363,7 +363,7 @@ local function GetBestPocketingStrategy( Proc) end ------------------------------------------------------------------------------------------------------------- -local function GetSplitSurfaces( Proc, Part) +local function GetSplitSurfaces( Proc, Part, bAddMachining) local vAddId = {} local vAddIdTunnel = {} local nAddGrpId = BeamLib.GetAddGroup( Part.id) @@ -378,6 +378,10 @@ local function GetSplitSurfaces( Proc, Part) if #FeatureSplittingPoints == 0 then local nAddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL local nAddIdTunnel = EgtCopyGlob( nOriginalTmIdTunnel, nAddGrpId) or GDB_ID.NULL + if not bAddMachining then + nAddId = EgtSetLevel( nAddId, GDB_LV.TEMP) + nAddIdTunnel = EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) + end table.insert( vAddId, nAddId) table.insert( vAddIdTunnel, nAddIdTunnel) else @@ -399,6 +403,10 @@ local function GetSplitSurfaces( Proc, Part) EgtCutSurfTmPlane( nAddId, ptSplit, X_AX(), true, GDB_RT.GLOB) EgtCutSurfTmPlane( nAddIdTunnel, ptSplit, X_AX(), true, GDB_RT.GLOB) end + if not bAddMachining then + nAddId = EgtSetLevel( nAddId, GDB_LV.TEMP) + nAddIdTunnel = EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) + end table.insert( vAddId, nAddId) table.insert( vAddIdTunnel, nAddIdTunnel) end @@ -408,6 +416,10 @@ local function GetSplitSurfaces( Proc, Part) local ptSplit = FeatureSplittingPoints[#FeatureSplittingPoints] + Vector3d( BeamData.MILL_OVERLAP / 2, 0, 0) EgtCutSurfTmPlane( nAddId, ptSplit, X_AX(), true, GDB_RT.GLOB) EgtCutSurfTmPlane( nAddIdTunnel, ptSplit, X_AX(), true, GDB_RT.GLOB) + if not bAddMachining then + nAddId = EgtSetLevel( nAddId, GDB_LV.TEMP) + nAddIdTunnel = EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) + end table.insert( vAddId, nAddId) table.insert( vAddIdTunnel, nAddIdTunnel) end @@ -424,6 +436,7 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Parameters = BeamLib.LoadCustomParametersInStrategy( Proc, CustomParameters, StrategyLib.Config) Strategy.Machining = {} Strategy.Result = {} + Strategy.Result.dTimeToMachine = 0 if not IsTopologyOk( Proc) then local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. StrategyLib.Config.sStrategyId .. ' not implemented' @@ -438,12 +451,12 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Machining = GetBestPocketingStrategy( Proc) - if bAddMachining and Strategy.Result.sStatus ~= 'Not-Applicable' then + if Strategy.Result.sStatus ~= 'Not-Applicable' then local vAddId = {} local vAddIdTunnel = {} -- recupero superficie, se necessario trimmata sugli spezzoni - vAddId, vAddIdTunnel = GetSplitSurfaces( Proc, Part) + vAddId, vAddIdTunnel = GetSplitSurfaces( Proc, Part, bAddMachining) -- si applicano le lavorazioni for i = 1, #vAddId do @@ -477,7 +490,13 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) if Proc.AffectedFaces.bLeft then Pocketing.sStage = 'AfterTail' end - bAreAllMachiningsAdded = MachiningLib.AddMachinings( Proc, Pocketing) + + Pocketing.dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Pocketing) + Strategy.Result.dTimeToMachine = Strategy.Result.dTimeToMachine + Pocketing.dTimeToMachine + + if bAddMachining then + bAreAllMachiningsAdded = MachiningLib.AddMachinings( Proc, Pocketing) + end else -- TODO controllare parametro danneggiamento ammesso per decidere se spostare dopo taglio seprazione -- se è aperta sulla coda, dico che deve essere fatta dopo la separazione @@ -494,7 +513,13 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) end if vtNSplitFace and AreSameVectorApprox( vtNSplitFace * EgtIf( Pocketing.bToolInvert, -1, 1), Strategy.Machining[j].vtFaceNormal) then Pocketing.Geometry = {{ nIdTm, k - 1}} - bAreAllMachiningsAdded = bAreAllMachiningsAdded and MachiningLib.AddMachinings( Proc, Pocketing) + + Pocketing.dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Pocketing) + Strategy.Result.dTimeToMachine = Strategy.Result.dTimeToMachine + Pocketing.dTimeToMachine + + if bAddMachining then + bAreAllMachiningsAdded = bAreAllMachiningsAdded and MachiningLib.AddMachinings( Proc, Pocketing) + end break end end From e584c90c7175c96d9fd1df4a98c99bb047fb3843 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Thu, 8 May 2025 19:01:15 +0200 Subject: [PATCH 2/2] - in MachiningLib.GetTimeToMachineAllStepsWithLeadInOut migliorato calcolo per svuotature (ancora da milgiorare) - in STR0002 correzioni - in FACEBYBLADE piccola correzione nel calcolo LeadIn/Out --- LuaLibs/MachiningLib.lua | 10 ++++++---- Strategies/Standard/STR0002/STR0002.lua | 21 +++++++++++++-------- StrategyLibs/FACEBYBLADE.lua | 5 +++-- StrategyLibs/FACEBYCHAINSAW.lua | 2 +- StrategyLibs/FACEBYMILL.lua | 2 +- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 4115602..559c41a 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -190,7 +190,7 @@ function MachiningLib.GetSplitMachinings( Machinings, SplittingPoints, Part) end Machinings[nCurrentMachiningIndex].nFeatureSegment = j Machinings[nCurrentMachiningIndex].dLengthToMachine = Machinings[nCurrentMachiningIndex].dEdgeLength + Machinings[nCurrentMachiningIndex].LeadIn.dStartAddLength + Machinings[nCurrentMachiningIndex].LeadOut.dEndAddLength - Machinings[nCurrentMachiningIndex].dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machinings[nCurrentMachiningIndex]) + Machinings[nCurrentMachiningIndex].dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machinings[nCurrentMachiningIndex], Part) end -- anche le lavorazioni non splittate necessitano del segmento assegnato else @@ -220,7 +220,7 @@ function MachiningLib.GetSplitMachinings( Machinings, SplittingPoints, Part) end end Machinings[i].dLengthToMachine = Machinings[i].dEdgeLength + Machinings[i].LeadIn.dStartAddLength + Machinings[i].LeadOut.dEndAddLength - Machinings[i].dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machinings[i]) + Machinings[i].dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machinings[i], Part) end end @@ -947,7 +947,7 @@ function MachiningLib.GetToolMRR( Parameters) end ------------------------------------------------------------------------------------------------------------- -function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining) +function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining, Part) local dLengthToMachineAllStepsWithLeadInOut = 0 local dTimeToMachineTotal = 0 local dToolStartFeed = TOOLS[Machining.nToolIndex].Feeds.dStartFeed @@ -997,7 +997,9 @@ function MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Machining) dTimeToMachineTotal = Machining.CloneStepsLongitudinal.nCount * ( ( 2 * Machining.Steps.nCount - 1) * dTimeToMachineEdge + 2 * 10 / dToolFeed * ( Machining.Steps.nCount - 1) + dTimeToMachineLeadIn + dTimeToMachineLeadOut) end elseif Machining.nType == MCH_MY.POCKETING then - local dDepthToMachine = min( Machining.dElevation, ( Machining.dMaxElev or Machining.dElevation)) - ( max( 0, Machining.ToolInfo.dResidualDepth or 0)) + -- TODO le chiamate alla pocketing vanno unificate e uniformate + local dFaceElevation = EgtSurfTmFacetElevationInBBox( Machining.Geometry[1][1], Machining.Geometry[1][2], Part.b3Part, true, GDB_ID.ROOT) + local dDepthToMachine = min( dFaceElevation, ( Machining.dMaxElev or dFaceElevation)) - ( max( 0, Machining.dResidualDepth or 0)) local nSteps = ceil( ( dDepthToMachine - 50 * GEO.EPS_SMALL) / TOOLS[Machining.nToolIndex].dStep) local _, dLongEdgeDimension, dShortEdgeDimension = EgtSurfTmFacetMinAreaRectangle( Machining.Geometry[1][1], Machining.Geometry[1][2], GDB_ID.ROOT) -- TODO bisogna calcolare correttamente per lati aperti e chiusi (aperti: aggiungi D/2 - Sidestep, chiusi: sottrai - D/2) diff --git a/Strategies/Standard/STR0002/STR0002.lua b/Strategies/Standard/STR0002/STR0002.lua index 6e96561..453037f 100644 --- a/Strategies/Standard/STR0002/STR0002.lua +++ b/Strategies/Standard/STR0002/STR0002.lua @@ -379,8 +379,8 @@ local function GetSplitSurfaces( Proc, Part, bAddMachining) local nAddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL local nAddIdTunnel = EgtCopyGlob( nOriginalTmIdTunnel, nAddGrpId) or GDB_ID.NULL if not bAddMachining then - nAddId = EgtSetLevel( nAddId, GDB_LV.TEMP) - nAddIdTunnel = EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) + EgtSetLevel( nAddId, GDB_LV.TEMP) + EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) end table.insert( vAddId, nAddId) table.insert( vAddIdTunnel, nAddIdTunnel) @@ -404,8 +404,8 @@ local function GetSplitSurfaces( Proc, Part, bAddMachining) EgtCutSurfTmPlane( nAddIdTunnel, ptSplit, X_AX(), true, GDB_RT.GLOB) end if not bAddMachining then - nAddId = EgtSetLevel( nAddId, GDB_LV.TEMP) - nAddIdTunnel = EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) + EgtSetLevel( nAddId, GDB_LV.TEMP) + EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) end table.insert( vAddId, nAddId) table.insert( vAddIdTunnel, nAddIdTunnel) @@ -417,8 +417,8 @@ local function GetSplitSurfaces( Proc, Part, bAddMachining) EgtCutSurfTmPlane( nAddId, ptSplit, X_AX(), true, GDB_RT.GLOB) EgtCutSurfTmPlane( nAddIdTunnel, ptSplit, X_AX(), true, GDB_RT.GLOB) if not bAddMachining then - nAddId = EgtSetLevel( nAddId, GDB_LV.TEMP) - nAddIdTunnel = EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) + EgtSetLevel( nAddId, GDB_LV.TEMP) + EgtSetLevel( nAddIdTunnel, GDB_LV.TEMP) end table.insert( vAddId, nAddId) table.insert( vAddIdTunnel, nAddIdTunnel) @@ -428,6 +428,7 @@ local function GetSplitSurfaces( Proc, Part, bAddMachining) end ------------------------------------------------------------------------------------------------------------- +-- TODO rimuovere il calcolo MRR dove non serve, è fatto tutto alla fine. function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) -- carico parametri de default e li aggiorno con quelli passati dal chiamante (potrebbero non essere congruenti) local StrategyLib = {} @@ -446,6 +447,7 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) end local bAreAllMachiningsAdded = true + local dFeatureVolume = FeatureLib.GetFeatureVolume( Proc, Part) local ToolInfo = {} local Pocketing = {} @@ -474,6 +476,7 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) Pocketing.LeadIn.dTangentDistance = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dDiameter/2 Pocketing.LeadIn.dElevation = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dDiameter/2 Pocketing.sDepth = -Strategy.Machining[j].ToolInfo.dResidualDepth + Pocketing.dResidualDepth = Strategy.Machining[j].ToolInfo.dResidualDepth -- il quarto ciclo è la lavorazione opposta sulla faccia Tunnel if Strategy.Machining[j].bToolInvert then Pocketing.bToolInvert = true @@ -491,7 +494,7 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) Pocketing.sStage = 'AfterTail' end - Pocketing.dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Pocketing) + Pocketing.dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Pocketing, Part) Strategy.Result.dTimeToMachine = Strategy.Result.dTimeToMachine + Pocketing.dTimeToMachine if bAddMachining then @@ -514,7 +517,7 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) if vtNSplitFace and AreSameVectorApprox( vtNSplitFace * EgtIf( Pocketing.bToolInvert, -1, 1), Strategy.Machining[j].vtFaceNormal) then Pocketing.Geometry = {{ nIdTm, k - 1}} - Pocketing.dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Pocketing) + Pocketing.dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Pocketing, Part) Strategy.Result.dTimeToMachine = Strategy.Result.dTimeToMachine + Pocketing.dTimeToMachine if bAddMachining then @@ -527,6 +530,8 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) end end end + -- TODO se incompleta il volume non è corretto, ma conta? L'MRR ha senso nelle incomplete?? + Strategy.Result.dMRR = ( dFeatureVolume / Strategy.Result.dTimeToMachine) / pow( 10, 6) else bAreAllMachiningsAdded = false end diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index 818320e..24af66a 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -80,7 +80,8 @@ local function CalculateLeadInOut( Machining, EdgeToMachine, Part) LeadOut.dTangentDistance = 0 if Machining.bIsStartClosed or Machining.bIsEndClosed - or Machining.CloneStepsRadial.nCount > 1 then + or Machining.CloneStepsRadial.nCount > 1 + or Machining.Steps.nCount > 1 then Machining.sLeadInOutType = 'Perpendicular' if AreSameVectorApprox( Machining.vtToolDirection, EdgeToMachine.vtN) then @@ -378,7 +379,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar Cutting.dLengthToMachine = EdgeToMachine.dLength + Cutting.LeadIn.dStartAddLength + Cutting.LeadOut.dEndAddLength local b3BoxEdge = BBox3d( Cutting.ptEdge1, Cutting.ptEdge2) Cutting.dLengthOnX = b3BoxEdge:getDimX() - Cutting.dTimeToMachine, Cutting.dLengthToMachineAllStepsWithLeadInOut = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Cutting) + Cutting.dTimeToMachine, Cutting.dLengthToMachineAllStepsWithLeadInOut = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Cutting, Part) -- lunghezza impronta lama if Cutting.bIsStartClosed and Cutting.bIsEndClosed then Cutting.dToolMarkLength = abs( min( Cutting.LeadIn.dStartAddLength, Cutting.LeadOut.dEndAddLength)) diff --git a/StrategyLibs/FACEBYCHAINSAW.lua b/StrategyLibs/FACEBYCHAINSAW.lua index c0e1d3a..0646f49 100644 --- a/StrategyLibs/FACEBYCHAINSAW.lua +++ b/StrategyLibs/FACEBYCHAINSAW.lua @@ -215,7 +215,7 @@ function FACEBYCHAINSAW.Make( Proc, Part, FaceToMachine, EdgeToMachine, Optional -- TODO fare funzione EstimatePathLength o simile Mortising.dLengthToMachine = Mortising.dEdgeLength + Mortising.LeadIn.dStartAddLength + Mortising.LeadOut.dEndAddLength Mortising.dLengthOnX = abs( dLengthToMachine * EdgeToMachine.vtN:getY()) - Mortising.dTimeToMachine, Mortising.dLengthToMachineAllStepsWithLeadInOut = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Mortising) + Mortising.dTimeToMachine, Mortising.dLengthToMachineAllStepsWithLeadInOut = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Mortising, Part) -- area lavorata Mortising.dAreaToMachine = min( EdgeToMachine.dElevation, Mortising.dDepthToMachine) * ( min( Mortising.dEdgeLength, Mortising.dLengthToMachine + TOOLS[Mortising.nToolIndex].dDiameter)) -- geometria diff --git a/StrategyLibs/FACEBYMILL.lua b/StrategyLibs/FACEBYMILL.lua index 5c4a018..81540aa 100644 --- a/StrategyLibs/FACEBYMILL.lua +++ b/StrategyLibs/FACEBYMILL.lua @@ -379,7 +379,7 @@ function FACEBYMILL.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPara Milling.dLengthToMachine = EdgeToMachine.dLength + Milling.LeadIn.dStartAddLength + Milling.LeadOut.dEndAddLength local b3BoxEdge = BBox3d( Milling.ptEdge1, Milling.ptEdge2) Milling.dLengthOnX = b3BoxEdge:getDimX() - Milling.dTimeToMachine, Milling.dLengthToMachineAllStepsWithLeadInOut = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Milling) + Milling.dTimeToMachine, Milling.dLengthToMachineAllStepsWithLeadInOut = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Milling, Part) -- lunghezza impronta lama if Milling.bIsStartClosed and Milling.bIsEndClosed then Milling.dToolMarkLength = abs( min( Milling.LeadIn.dStartAddLength, Milling.LeadOut.dEndAddLength))