From 0d9381b6aeec3fe45170651a18ad27eaa5578e43 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 18 Mar 2025 11:33:34 +0100 Subject: [PATCH 1/9] - modifiche commenti --- Strategies/Standard/STR0005/STR0005.lua | 7 ++----- Strategies/Standard/STR0005/STR0005Config.lua | 2 +- Strategies/Strategies.ini | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Strategies/Standard/STR0005/STR0005.lua b/Strategies/Standard/STR0005/STR0005.lua index ca2f060..3c8c5d6 100644 --- a/Strategies/Standard/STR0005/STR0005.lua +++ b/Strategies/Standard/STR0005/STR0005.lua @@ -1,7 +1,7 @@ -- Strategia: STR0005 -- Descrizione --- lama per taglio facce con cubetti se necessario --- Feature: tagli singoli con eventuali cubetti +-- lama per taglio facce lasciando codolo o con cubetti +-- Feature: cut, longcut, ridgelap, ... -- carico librerie local BeamLib = require( 'BeamLib') @@ -19,9 +19,6 @@ local Blade = {} Blade.Result = {} ------------------------------------------------------------------------------------------------------------- - - - function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) -- carico parametri da default e li aggiorno con quelli passati dal chiamante (potrebbero non essere congruenti) local StrategyLib = {} diff --git a/Strategies/Standard/STR0005/STR0005Config.lua b/Strategies/Standard/STR0005/STR0005Config.lua index 80970e5..c825ed3 100644 --- a/Strategies/Standard/STR0005/STR0005Config.lua +++ b/Strategies/Standard/STR0005/STR0005Config.lua @@ -1,4 +1,4 @@ --- Parametri configurabili da cliente per strategia: STR0004 +-- Parametri configurabili da cliente per strategia: STR0005 -- TODO - sostituire dMaxWasteVolume con dMaxWasteWeight? Dove prendere la densità del materiale? diff --git a/Strategies/Strategies.ini b/Strategies/Strategies.ini index f1a4f58..303ca3b 100644 --- a/Strategies/Strategies.ini +++ b/Strategies/Strategies.ini @@ -4,7 +4,7 @@ STR0001 = Tenone a coda di rondine. Lama + fresa a coda di rondine STR0002 = Topologia tipo LapJoint. Svuotatura con fresa STR0003 = Topologia tipo LapJoint. Lama + motosega STR0004 = Topologia tipo LapJoint. Motosega -STR0005 = Faccia singola o doppia. Lama, se necessario cubetti. +STR0005 = 1, 2 o 3 facce. Lama con taglio singolo o cubetti. Se richiesto o necessario codolo. [Strategies] ; Processing , Gruppo , Topologia , Strategie From 6e45be2538ba42fef50a4063e840ff81f9db21fe Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 18 Mar 2025 15:29:29 +0100 Subject: [PATCH 2/9] - In FeatureLib.GetProcFromTrimesh si permette di passare una Proc da cui copiare i dati - in STR0005 gestito caso 3 facce tipo RidgeLap (da testare) - in BLADEKEEPWASTE gestito caso 2 facce --- LuaLibs/FeatureLib.lua | 11 ++++-- Strategies/Standard/STR0005/STR0005.lua | 46 ++++++++++++++++++++++++- StrategyLibs/BLADEKEEPWASTE.lua | 43 +++++++++++++++++++---- 3 files changed, 91 insertions(+), 9 deletions(-) diff --git a/LuaLibs/FeatureLib.lua b/LuaLibs/FeatureLib.lua index 48d6738..6a61837 100644 --- a/LuaLibs/FeatureLib.lua +++ b/LuaLibs/FeatureLib.lua @@ -16,18 +16,25 @@ local ID = require( 'Identity') ------------------------------------------------------------------------------------------------------------- -function FeatureLib.GetProcFromTrimesh( idTrimesh, Part) +function FeatureLib.GetProcFromTrimesh( idTrimesh, Part, ProcToCopyFrom) local Proc = {} + -- eventuale copia dati da ProcToCopyFrom in arrivo + if type( ProcToCopyFrom) == "table" then + Proc = BeamLib.TableCopyDeep( ProcToCopyFrom) + end + + -- dati specifici della Proc Proc.id = idTrimesh Proc.nFct = EgtSurfTmFacetCount( Proc.id) or 0 Proc.b3Box = EgtGetBBoxGlob( idTrimesh or GDB_ID.NULL, GDB_BB.STANDARD) Proc.AffectedFaces = BeamLib.GetAffectedFaces( Proc, Part) Proc.AdjacencyMatrix = FaceData.GetAdjacencyMatrix( Proc) Proc.Faces = FaceData.GetFacesInfo( Proc, Part) + -- TODO servono anche altri dati raccolti nel collect?? return Proc - end +end --------------------------------------------------------------------- -- recupero topologia della feature diff --git a/Strategies/Standard/STR0005/STR0005.lua b/Strategies/Standard/STR0005/STR0005.lua index 3c8c5d6..df4c646 100644 --- a/Strategies/Standard/STR0005/STR0005.lua +++ b/Strategies/Standard/STR0005/STR0005.lua @@ -37,6 +37,27 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) dExtendAfterTail = 10000 end + -- disambiguazione caso 3 facce tipo RidgeLap + local idAddedTmFace + local nAddedFace + if Proc.nFct == 3 and not Proc.Topology.sName == 'Groove-3-Through' then + if Proc.AdjacencyMatrix[1][2] > 10 * GEO.EPS_ANG_SMALL and Proc.AdjacencyMatrix[2][3] < 10 * GEO.EPS_ANG_SMALL then + nAddedFace = 1 - 1 + elseif Proc.AdjacencyMatrix[2][3] > 10 * GEO.EPS_ANG_SMALL and Proc.AdjacencyMatrix[3][1] < 10 * GEO.EPS_ANG_SMALL then + nAddedFace = 2 - 1 + else + nAddedFace = 3 - 1 + end + -- recupero gruppo per geometria addizionale + local nAddGrpId = BeamLib.GetAddGroup( Part.id) + -- faccia aggiuntiva da lavorare + idAddedTmFace = EgtCopySurfTmFacet( Proc.id, nAddedFace, nAddGrpId) + -- rimozione della terza faccia dalla Proc + local idNewProc = EgtCopyGlob( Proc.id, nAddGrpId) + EgtSurfTmRemoveFacet( idNewProc, nAddedFace) + Proc = FeatureLib.GetProcFromTrimesh( idNewProc, Part, Proc) + end + -- considerazioni necessarie a determinare se lavorare con codolo oppure no local bKeepWasteAttached = ( Strategy.Parameters.sCuttingStrategy == 'KEEP_WASTE_ATTACHED') local bDropWaste = ( Strategy.Parameters.sCuttingStrategy == 'DROP_WASTE') @@ -53,7 +74,7 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) end -- lavorazione a cubetti / taglio singolo - if #Blade.Result == 0 and not bKeepWasteAttached then + if Proc.nFct < 3 and #Blade.Result == 0 and not bKeepWasteAttached then local dMinZTopBlade local dMaxNyTopBlade local BladeToWasteResult @@ -75,6 +96,29 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) dCompletionPercentage = BladeToWasteResult.dCompletionPercentage end + -- lavorazione eventuale terza faccia tipo RidgeLap + if idAddedTmFace then + local dMinZTopBlade + local dMaxNyTopBlade + local BladeToWasteResult + if Strategy.Parameters.dMinZAngleTopBlade then + dMinZTopBlade = sin( Strategy.Parameters.dMinZAngleTopBlade) + end + if Strategy.Parameters.dMaxYAngleTopBlade then + dMaxNyTopBlade = sin( Strategy.Parameters.dMaxYAngleTopBlade) + end + local OptionalParameters = { dMaxWasteVolume = Strategy.Parameters.dMaxWasteVolume, + dMaxWasteLength = Strategy.Parameters.dMaxWasteLength, + dMinNzTopBlade = dMinZTopBlade, + dMaxNyTopBlade = dMaxNyTopBlade, + bSaveAddedGeometries = bAddMachining, + dExtendAfterTail = dExtendAfterTail + } + Blade.Result.Sorted, BladeToWasteResult = BladeToWaste.Make( idAddedTmFace, Part, OptionalParameters) + dMRRBlade = BladeToWasteResult.dMRR + dCompletionPercentage = BladeToWasteResult.dCompletionPercentage + end + -- aggiunta lavorazioni local nIsApplicableCount = 0 local dFinalCompletionPercentage = 100 diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index 66ee228..70596ee 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -9,6 +9,7 @@ require( 'EgtBase') -- Carico i dati globali local FeatureLib = require( 'FeatureLib') +local FaceData = require( 'FaceData') local MachiningLib = require( 'MachiningLib') -- strategie di base local FaceByBlade = require('FACEBYBLADE') @@ -88,14 +89,44 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) local Cutting1 = {} local Cutting2 = {} - -- si trovano i lati da lavorare + -- si trova la faccia da lavorare + local FaceToMachine = {} + if Proc.nFct == 1 then + FaceToMachine = Proc.Faces[1] + elseif Proc.MainFaces then + FaceToMachine = Proc.MainFaces.BottomFaces[1] + else + local BottomFaces = {} + -- la faccia di fondo ha sempre Fct - 1 adiacenze + local FacesByAdjacencyNumber = FaceData.GetFacesByAdjacencyNumber( Proc) + if FacesByAdjacencyNumber then + BottomFaces = FacesByAdjacencyNumber[ Proc.nFct - 1] + -- si rimuovono le facce non adatte ad essere lavorate + local nBottomFaces = #BottomFaces + local nCurrentFace = 1 + while nCurrentFace <= nBottomFaces do + if not BottomFaces[nCurrentFace].bIsOkForMachining then + table.remove( BottomFaces, nCurrentFace) + nBottomFaces = nBottomFaces - 1 + end + nCurrentFace = nCurrentFace + 1 + end + -- la BottomFace 1 è sempre quella con minor elevazione + table.sort( BottomFaces, function (a, b) return a.dElevation < b.dElevation end) + end + FaceToMachine = BottomFaces[1] + end + + -- si trova il lato da lavorare + local EdgeToMachine = {} local EdgesSorted = {} - for i = 1, #Proc.Faces[1].Edges do - table.insert( EdgesSorted, Proc.Faces[1].Edges[i]) + for i = 1, #FaceToMachine.Edges do + table.insert( EdgesSorted, FaceToMachine.Edges[i]) end table.sort( EdgesSorted, CompareEdges) + EdgeToMachine = EdgesSorted[1] - local dDepthToMachine = EdgesSorted[1].dElevation / 2 - OptionalParameters.dStripWidth / 2 + local dDepthToMachine = EdgeToMachine.dElevation / 2 - OptionalParameters.dStripWidth / 2 -- eventuali punti di spezzatura local FeatureSplittingPoints = FeatureLib.GetFeatureSplittingPoints( Proc, Part) @@ -107,11 +138,11 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- calcolo lavorazioni -- primo lato local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine, bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = OptionalParameters.dExtendAfterTail} - Cutting1 = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgesSorted[1], OptionalParametersFaceByBlade) + Cutting1 = FaceByBlade.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) table.insert( Blade.Result, Cutting1) -- secondo lato OptionalParametersFaceByBlade.bOppositeToolDirection = true - Cutting2 = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgesSorted[1], OptionalParametersFaceByBlade) + Cutting2 = FaceByBlade.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) table.insert( Blade.Result, Cutting2) -- lavorazioni raggruppate in unica lista From 26dff3961986f664dbf3d297b4eb99c4f323113a Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 18 Mar 2025 15:40:39 +0100 Subject: [PATCH 3/9] in BLADEKEEPWASTE aggiunti controlli preventivi --- StrategyLibs/BLADEKEEPWASTE.lua | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index 70596ee..5e84652 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -89,6 +89,25 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) local Cutting1 = {} local Cutting2 = {} + -- controlli preventivi + if Proc.nFct > 3 then + error( 'BladeKeepWaste : max 3 faces supported') + elseif Proc.nFct == 2 then + if Proc.AdjacencyMatrix[1][2] > 10 * GEO.EPS_SMALL or Proc.AdjacencyMatrix[1][2] < -91 then + error( 'BladeKeepWaste : angle between faces must be concave and >= 90deg') + end + elseif Proc.nFct == 3 then + if Proc.AdjacencyMatrix[1][2] > 10 * GEO.EPS_SMALL or Proc.AdjacencyMatrix[1][2] < -91 then + error( 'BladeKeepWaste : angle between faces must be concave and >= 90deg') + end + if Proc.AdjacencyMatrix[1][3] > 10 * GEO.EPS_SMALL or Proc.AdjacencyMatrix[1][3] < -91 then + error( 'BladeKeepWaste : angle between faces must be concave and >= 90deg') + end + if Proc.AdjacencyMatrix[2][3] > 10 * GEO.EPS_SMALL or Proc.AdjacencyMatrix[2][3] < -91 then + error( 'BladeKeepWaste : angle between faces must be concave and >= 90deg') + end + end + -- si trova la faccia da lavorare local FaceToMachine = {} if Proc.nFct == 1 then From a0140dae553324e2bed3432a3d1c2756c7c9e3c0 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 18 Mar 2025 18:08:40 +0100 Subject: [PATCH 4/9] - in MachiningLib piccole modifiche a ordinamento - in BLADETOWASTE si settano i centri delle facce dei cubetti per l'ordinamento --- LuaLibs/MachiningLib.lua | 4 ++-- StrategyLibs/BLADETOWASTE.lua | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index b0cf96f..f32a638 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -997,9 +997,9 @@ local SortingComparisonRules = { -- lato di lavoro -- TODO questo, insieme all'ordinamento X, andrà sostituito dallo shortest path pesato sulla quantità di rotazione della testa function( MachiningA, MachiningB) - if MachiningA.Machining.vtToolDirection:getY() < 10 * GEO.EPS_SMALL and MachiningB.Machining.vtToolDirection:getY() >= 10 * GEO.EPS_SMALL then + if MachiningA.Machining.vtToolDirection:getY() < -0.174 and MachiningB.Machining.vtToolDirection:getY() >= 0.174 then return 1 - elseif MachiningA.Machining.vtToolDirection:getY() >= 10 * GEO.EPS_SMALL and MachiningB.Machining.vtToolDirection:getY() < 10 * GEO.EPS_SMALL then + elseif MachiningA.Machining.vtToolDirection:getY() >= 0.174 and MachiningB.Machining.vtToolDirection:getY() < -0.174 then return -1 else return 0 diff --git a/StrategyLibs/BLADETOWASTE.lua b/StrategyLibs/BLADETOWASTE.lua index c6a74dd..58a3cc2 100644 --- a/StrategyLibs/BLADETOWASTE.lua +++ b/StrategyLibs/BLADETOWASTE.lua @@ -480,6 +480,7 @@ function BLADETOWASTE.Make( ProcOrId, Part, OptionalParameters) dExtendAfterTail = dExtendAfterTail } Cutting = FaceByBlade.Make( ProcTrimesh, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) + Cutting.ptCenter = Point3d( ProcTrimesh.Faces[1].ptCenter:getX(), 0, 0) if Cutting.bIsApplicable then table.insert( Machinings, Cutting) else @@ -519,6 +520,7 @@ function BLADETOWASTE.Make( ProcOrId, Part, OptionalParameters) dExtendAfterTail = dExtendAfterTail } Cutting = FaceByBlade.Make( ProcTrimesh, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) + Cutting.ptCenter = Point3d( ProcTrimesh.Faces[1].ptCenter:getX(), 0, 0) if Cutting.bIsApplicable then table.insert( Machinings, Cutting) else From e7a08b330bf04a04713a4595f2ec1ee1f5f67e4e Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 18 Mar 2025 18:33:49 +0100 Subject: [PATCH 5/9] - per LongCut L010 abilitata STR0005 - in FACEBYBLADE corretti attacchi --- LuaLibs/BasicCustomerStrategies.lua | 1 + Strategies/Strategies.ini | 2 +- StrategyLibs/FACEBYBLADE.lua | 5 ++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/LuaLibs/BasicCustomerStrategies.lua b/LuaLibs/BasicCustomerStrategies.lua index 87ce699..753cca7 100644 --- a/LuaLibs/BasicCustomerStrategies.lua +++ b/LuaLibs/BasicCustomerStrategies.lua @@ -53,6 +53,7 @@ local function GetStrategies_Egalware( Proc) --------------------------------------------------------------------- -- Feature : Longitudinal Cut elseif ID.IsLongitudinalCut( Proc) then + Strategies = { { sStrategyId = 'STR0005'}} --------------------------------------------------------------------- -- Feature : Double Cut elseif ID.IsDoubleCut( Proc) then diff --git a/Strategies/Strategies.ini b/Strategies/Strategies.ini index 303ca3b..8a5a908 100644 --- a/Strategies/Strategies.ini +++ b/Strategies/Strategies.ini @@ -11,7 +11,7 @@ STR0005 = 1, 2 o 3 facce. Lama con taglio singolo o cubetti. Se richiesto o nece ;Feature : Cut 10,1,Feature,STR0005 ;Feature : Longitudinal Cut -10,0,Feature, +10,0,Feature,STR0005 ;Feature : Double Cut 11,1,Feature, ; Feature : Ridge or Valley Cut diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index 3820d80..e00397e 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -80,9 +80,8 @@ local function CalculateLeadInOut( Machining, EdgeToMachine, Part) LeadIn.dTangentDistance = 0 LeadOut.dTangentDistance = 0 -- TODO da rimuovere controllo numero step quando si sistema la funzione che crea i cloni - if AreSameOrOppositeVectorApprox( Machining.vtToolDirection, X_AX()) - or AreSameOrOppositeVectorApprox( Machining.vtToolDirection, Y_AX()) - or AreSameOrOppositeVectorApprox( Machining.vtToolDirection, Z_AX()) + if Machining.bIsStartClosed + or Machining.bIsEndClosed or Machining.CloneStepsHorizontal.nCount > 1 then Machining.sLeadInOutType = 'Perpendicular' From c06c2378ce1ed3b3d4c7e04f1fc09e3872ba66de Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 18 Mar 2025 19:31:55 +0100 Subject: [PATCH 6/9] - in BLADEKEEPWASTE aggiunta lavorazione eventuali facce di chiusura --- LuaLibs/BeamExec.lua | 1 + StrategyLibs/BLADEKEEPWASTE.lua | 35 +++++++++++++-------------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 2f2af28..08b9d21 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1459,6 +1459,7 @@ function BeamExec.ProcessMachinings( PARTS) MACHININGS = MachiningLib.PrepareMachiningsForSorting( PARTS[nPart]) -- TODO completare ordinamento. Mancano le dipendenze. MACHININGS = BeamLib.StableSort( MACHININGS, MachiningLib.CompareMachinings) + -- TODO qui bisogna inserire qualcosa per ripristinare l'ordine interno se rovinato -- finiti i calcoli di applicazione delle lavorazioni, si riporta il pezzo nello zero della fase nRawId = PARTS[nPart].idRaw diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index 5e84652..6adf197 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -108,33 +108,19 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) end end - -- si trova la faccia da lavorare + -- si trovano le facce da lavorare local FaceToMachine = {} + local LongFaces = {} if Proc.nFct == 1 then FaceToMachine = Proc.Faces[1] - elseif Proc.MainFaces then - FaceToMachine = Proc.MainFaces.BottomFaces[1] else - local BottomFaces = {} - -- la faccia di fondo ha sempre Fct - 1 adiacenze - local FacesByAdjacencyNumber = FaceData.GetFacesByAdjacencyNumber( Proc) - if FacesByAdjacencyNumber then - BottomFaces = FacesByAdjacencyNumber[ Proc.nFct - 1] - -- si rimuovono le facce non adatte ad essere lavorate - local nBottomFaces = #BottomFaces - local nCurrentFace = 1 - while nCurrentFace <= nBottomFaces do - if not BottomFaces[nCurrentFace].bIsOkForMachining then - table.remove( BottomFaces, nCurrentFace) - nBottomFaces = nBottomFaces - 1 - end - nCurrentFace = nCurrentFace + 1 - end - -- la BottomFace 1 è sempre quella con minor elevazione - table.sort( BottomFaces, function (a, b) return a.dElevation < b.dElevation end) + if not Proc.MainFaces then + Proc.MainFaces = FaceData.GetMainFaces( Proc, Part) end - FaceToMachine = BottomFaces[1] + FaceToMachine = Proc.MainFaces.BottomFaces[1] + LongFaces = Proc.MainFaces.LongFaces end + -- si trova il lato da lavorare local EdgeToMachine = {} @@ -163,6 +149,13 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) OptionalParametersFaceByBlade.bOppositeToolDirection = true Cutting2 = FaceByBlade.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade) table.insert( Blade.Result, Cutting2) + -- eventuali facce di chiusura + for i = 1, #LongFaces do + local CuttingLongFace = {} + OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine, bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = OptionalParameters.dExtendAfterTail} + CuttingLongFace = FaceByBlade.Make( Proc, Part, Proc.MainFaces.LongFaces[i], Proc.MainFaces.LongFaces[i].MainEdges.BottomEdge, OptionalParametersFaceByBlade) + table.insert( Blade.Result, CuttingLongFace) + end -- lavorazioni raggruppate in unica lista local Machinings = {} From 81270c324feb9615e804fde93ac04d216832ad9e Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Wed, 19 Mar 2025 16:13:18 +0100 Subject: [PATCH 7/9] =?UTF-8?q?-=20in=20FeatureLib.CalculateFeatureNotClam?= =?UTF-8?q?pableLengths=20si=20ritorna=200=20se=203=20facce=20-=20in=20STR?= =?UTF-8?q?0005=20aggiunto=20controllo=20numero=20massimo=20di=20facce=20-?= =?UTF-8?q?=20in=20STR0005=20modifiche=20per=20conemplare=20pi=C3=B9=20di?= =?UTF-8?q?=20una=20faccia=20-=20in=20BLADETOWASTE=20piccola=20correzione?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/FeatureLib.lua | 103 ++++++++++++------------ Strategies/Standard/STR0005/STR0005.lua | 48 ++++++++--- StrategyLibs/BLADEKEEPWASTE.lua | 2 +- 3 files changed, 90 insertions(+), 63 deletions(-) diff --git a/LuaLibs/FeatureLib.lua b/LuaLibs/FeatureLib.lua index 6a61837..2de301a 100644 --- a/LuaLibs/FeatureLib.lua +++ b/LuaLibs/FeatureLib.lua @@ -532,62 +532,61 @@ end -- TODO funzione copiata direttamente da automatismo vecchio, da migliorare / completare function FeatureLib.CalculateFeatureNotClampableLengths( Proc, Part) local NotClampableLength = {} - - -- verifico siano una o due facce - if Proc.nFct > 2 then return end - - -- eventuale segnalazione ingombro di testa o coda - local dMinHIng = min( 0.5 * BeamData.VICE_MINH, 0.5 * Part.b3Raw:getDimZ()) - local dMinZ = max( BeamData.MIN_HEIGHT, 0.35 * Part.b3Raw:getDimZ()) - -- calcolo punto massimo in Z fino a dove considerare il pinzaggio. Minimo tra pinzaggio massimo e altezza pezzo - local dMaxHZ = Part.b3Raw:getMin():getZ() + min( BeamData.VICE_MAXH or BeamData.MAX_HEIGHT, Part.b3Raw:getDimZ()) - -- punto massimo in Z considerando anche la Z della feature - local dMaxHZFeat = min( dMaxHZ, Proc.b3Box:getMax():getZ()) - -- dimensione Z del pinzaggio (differenza massima Z pinzabile e box feature) - local dDeltaZClamp = ( ( dMaxHZ - Part.b3Raw:getMin():getZ()) - max( 0, dMaxHZFeat - Proc.b3Box:getMin():getZ())) - -- se pinzaggio minimo è come il massimo (oppure come l'altezza massima del pezzo) significa che è verticale - local bIsVertClamps = BeamData.VICE_MINH > BeamData.MAX_HEIGHT - 100 * GEO.EPS_SMALL - - -- condizioni per limitare pinzaggio testa/coda - local bUpdateIng = true - -- se dimensione del box della feature maggiore di metà pinzaggio minimo o metà spessore pezzo - bUpdateIng = bUpdateIng and Proc.b3Box:getDimZ() > dMinHIng - -- se la feature si trova più in basso del minimo pinzabile in Z o il 35% dello spessore pezzo - bUpdateIng = bUpdateIng and Proc.b3Box:getMin():getZ() < Part.b3Raw:getMin():getZ() + dMinZ - -- se feature è al di sotto del pinzaggio massimo - bUpdateIng = bUpdateIng and Proc.b3Box:getMin():getZ() < dMaxHZ - -- se ho le morse verticali, o se la feature è in centro o verso alto, controllo se non prendo abbastanza. - if bIsVertClamps or ( Proc.b3Box:getMin():getZ() - Part.b3Raw:getMin():getZ()) > BeamData.MIN_HEIGHT then - bUpdateIng = bUpdateIng and dDeltaZClamp < BeamData.VICE_MINH - end - local dNotClampableLengthHead = 0 local dNotClampableLengthTail = 0 - if bUpdateIng then - if Proc.AffectedFaces.bRight then - local dOffs = Part.b3Part:getMax():getX() - Proc.b3Box:getMin():getX() - -- se pinze a 45° e pinza abbastanza materiale, compenso comunque, ma solo inclinazione morse - if not bIsVertClamps and dDeltaZClamp > BeamData.VICE_MINH and BeamData.VICE_MAXH then - dOffs = min( dOffs, BeamData.VICE_MAXH - BeamData.VICE_MINH) + -- TODO al momento con meno di 3 facce si restituisce 0 + if Proc.nFct < 3 then + -- eventuale segnalazione ingombro di testa o coda + local dMinHIng = min( 0.5 * BeamData.VICE_MINH, 0.5 * Part.b3Raw:getDimZ()) + local dMinZ = max( BeamData.MIN_HEIGHT, 0.35 * Part.b3Raw:getDimZ()) + -- calcolo punto massimo in Z fino a dove considerare il pinzaggio. Minimo tra pinzaggio massimo e altezza pezzo + local dMaxHZ = Part.b3Raw:getMin():getZ() + min( BeamData.VICE_MAXH or BeamData.MAX_HEIGHT, Part.b3Raw:getDimZ()) + -- punto massimo in Z considerando anche la Z della feature + local dMaxHZFeat = min( dMaxHZ, Proc.b3Box:getMax():getZ()) + -- dimensione Z del pinzaggio (differenza massima Z pinzabile e box feature) + local dDeltaZClamp = ( ( dMaxHZ - Part.b3Raw:getMin():getZ()) - max( 0, dMaxHZFeat - Proc.b3Box:getMin():getZ())) + -- se pinzaggio minimo è come il massimo (oppure come l'altezza massima del pezzo) significa che è verticale + local bIsVertClamps = BeamData.VICE_MINH > BeamData.MAX_HEIGHT - 100 * GEO.EPS_SMALL + + -- condizioni per limitare pinzaggio testa/coda + local bUpdateIng = true + -- se dimensione del box della feature maggiore di metà pinzaggio minimo o metà spessore pezzo + bUpdateIng = bUpdateIng and Proc.b3Box:getDimZ() > dMinHIng + -- se la feature si trova più in basso del minimo pinzabile in Z o il 35% dello spessore pezzo + bUpdateIng = bUpdateIng and Proc.b3Box:getMin():getZ() < Part.b3Raw:getMin():getZ() + dMinZ + -- se feature è al di sotto del pinzaggio massimo + bUpdateIng = bUpdateIng and Proc.b3Box:getMin():getZ() < dMaxHZ + -- se ho le morse verticali, o se la feature è in centro o verso alto, controllo se non prendo abbastanza. + if bIsVertClamps or ( Proc.b3Box:getMin():getZ() - Part.b3Raw:getMin():getZ()) > BeamData.MIN_HEIGHT then + bUpdateIng = bUpdateIng and dDeltaZClamp < BeamData.VICE_MINH + end + + if bUpdateIng then + if Proc.AffectedFaces.bRight then + local dOffs = Part.b3Part:getMax():getX() - Proc.b3Box:getMin():getX() + -- se pinze a 45° e pinza abbastanza materiale, compenso comunque, ma solo inclinazione morse + if not bIsVertClamps and dDeltaZClamp > BeamData.VICE_MINH and BeamData.VICE_MAXH then + dOffs = min( dOffs, BeamData.VICE_MAXH - BeamData.VICE_MINH) + end + dNotClampableLengthHead = dOffs + elseif Proc.AffectedFaces.bLeft then + local dOffs = Proc.b3Box:getMax():getX() - Part.b3Part:getMin():getX() + -- se pinze a 45° e pinza abbastanza materiale, compenso comunque, ma solo inclinazione morse + if not bIsVertClamps and dDeltaZClamp > BeamData.VICE_MINH and BeamData.VICE_MAXH then + dOffs = min( dOffs, BeamData.VICE_MAXH - BeamData.VICE_MINH) + end + dNotClampableLengthTail = dOffs + elseif Proc.b3Box:getCenter():getX() > Part.b3Part:getCenter():getX() then + local dOffs = Part.b3Part:getMax():getX() - Proc.b3Box:getMin():getX() + local dDist = Part.b3Part:getMax():getX() - Proc.b3Box:getMax():getX() + -- se pinze a 45° e pinza abbastanza materiale, compenso comunque, ma solo inclinazione morse + if not bIsVertClamps and dDeltaZClamp > BeamData.VICE_MINH and BeamData.VICE_MAXH then + dOffs = min( dOffs, BeamData.VICE_MAXH - BeamData.VICE_MINH) + end + -- dDist serve?? + dNotClampableLengthHead = dOffs end - dNotClampableLengthHead = dOffs - elseif Proc.AffectedFaces.bLeft then - local dOffs = Proc.b3Box:getMax():getX() - Part.b3Part:getMin():getX() - -- se pinze a 45° e pinza abbastanza materiale, compenso comunque, ma solo inclinazione morse - if not bIsVertClamps and dDeltaZClamp > BeamData.VICE_MINH and BeamData.VICE_MAXH then - dOffs = min( dOffs, BeamData.VICE_MAXH - BeamData.VICE_MINH) - end - dNotClampableLengthTail = dOffs - elseif Proc.b3Box:getCenter():getX() > Part.b3Part:getCenter():getX() then - local dOffs = Part.b3Part:getMax():getX() - Proc.b3Box:getMin():getX() - local dDist = Part.b3Part:getMax():getX() - Proc.b3Box:getMax():getX() - -- se pinze a 45° e pinza abbastanza materiale, compenso comunque, ma solo inclinazione morse - if not bIsVertClamps and dDeltaZClamp > BeamData.VICE_MINH and BeamData.VICE_MAXH then - dOffs = min( dOffs, BeamData.VICE_MAXH - BeamData.VICE_MINH) - end - -- dDist serve?? - dNotClampableLengthHead = dOffs end end diff --git a/Strategies/Standard/STR0005/STR0005.lua b/Strategies/Standard/STR0005/STR0005.lua index df4c646..38fd177 100644 --- a/Strategies/Standard/STR0005/STR0005.lua +++ b/Strategies/Standard/STR0005/STR0005.lua @@ -30,6 +30,17 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) Blade.Result = {} local dMRRBlade = 0 local dCompletionPercentage = 0 + local dMRRBladeAddedFace = 0 + local dCompletionPercentageAddedFace = 0 + + -- più di 3 facce non supportate + if Proc.nFct > 3 then + Strategy.Result.sStatus = 'Not-Applicable' + Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( 0) + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Strategy.Result.dMRR = dMRRBlade + Strategy.Result.sInfo = 'More than 3 faces not supported' + end -- estensione oltre la coda local dExtendAfterTail = Strategy.Parameters.dExtendAfterTail or max( Part.dDistanceToNextPiece - BeamData.CUT_EXTRA, 0) @@ -63,12 +74,16 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) local bDropWaste = ( Strategy.Parameters.sCuttingStrategy == 'DROP_WASTE') local dFeatureMaxNotClampableLengthHead, dFeatureMaxNotClampableLengthTail = FeatureLib.GetFeatureMaxNotClampableLengths( Proc, Part) local bFeatureHindersClamping = FeatureLib.IsMachiningLong( max( dFeatureMaxNotClampableLengthHead, dFeatureMaxNotClampableLengthTail), Part, { dMaxSegmentLength = BeamData.LONGCUT_ENDLEN}) + local bIsFeatureLong = FeatureLib.IsMachiningLong( Proc.b3Box:getDimX(), Part, { dMaxSegmentLength = BeamData.LONGCUT_ENDLEN}) -- lavorazione con codolo - if ( not bDropWaste and bFeatureHindersClamping) or bKeepWasteAttached then + if ( Proc.nFct > 2 and bIsFeatureLong) + or ( bFeatureHindersClamping and not bDropWaste) + or bKeepWasteAttached then + local BladeKeepWasteResult local OptionalParameters = { dExtendAfterTail = dExtendAfterTail, dStripWidth = Strategy.Parameters.dStripWidth} - Blade.Result.Sorted, BladeKeepWasteResult = BladeKeepWaste.Make( Proc, Part, OptionalParameters) + Blade.Result, BladeKeepWasteResult = BladeKeepWaste.Make( Proc, Part, OptionalParameters) dMRRBlade = BladeKeepWasteResult.dMRR dCompletionPercentage = BladeKeepWasteResult.dCompletionPercentage end @@ -91,11 +106,20 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) bSaveAddedGeometries = bAddMachining, dExtendAfterTail = dExtendAfterTail } - Blade.Result.Sorted, BladeToWasteResult = BladeToWaste.Make( Proc, Part, OptionalParameters) + Blade.Result, BladeToWasteResult = BladeToWaste.Make( Proc, Part, OptionalParameters) dMRRBlade = BladeToWasteResult.dMRR dCompletionPercentage = BladeToWasteResult.dCompletionPercentage end + -- se arrivati qui non è stata ancora applicata alcuna lavorazione, si prova la lavorazione con codolo + if #Blade.Result == 0 and not bKeepWasteAttached then + local BladeKeepWasteResult + local OptionalParameters = { dExtendAfterTail = dExtendAfterTail, dStripWidth = Strategy.Parameters.dStripWidth} + Blade.Result, BladeKeepWasteResult = BladeKeepWaste.Make( Proc, Part, OptionalParameters) + dMRRBlade = BladeKeepWasteResult.dMRR + dCompletionPercentage = BladeKeepWasteResult.dCompletionPercentage + end + -- lavorazione eventuale terza faccia tipo RidgeLap if idAddedTmFace then local dMinZTopBlade @@ -114,25 +138,29 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) bSaveAddedGeometries = bAddMachining, dExtendAfterTail = dExtendAfterTail } - Blade.Result.Sorted, BladeToWasteResult = BladeToWaste.Make( idAddedTmFace, Part, OptionalParameters) - dMRRBlade = BladeToWasteResult.dMRR - dCompletionPercentage = BladeToWasteResult.dCompletionPercentage + Blade.Result, BladeToWasteResult = BladeToWaste.Make( idAddedTmFace, Part, OptionalParameters) + dMRRBladeAddedFace = BladeToWasteResult.dMRR + dCompletionPercentageAddedFace = BladeToWasteResult.dCompletionPercentage + + -- la faccia aggiuntiva conta per 1/3 + dMRRBlade = 2/3 * dMRRBlade + 1/3 * dMRRBladeAddedFace + dCompletionPercentage = 2/3 * dCompletionPercentage + 1/3 * dCompletionPercentageAddedFace end -- aggiunta lavorazioni local nIsApplicableCount = 0 local dFinalCompletionPercentage = 100 local bAreAllMachiningsAdded = true - for i = 1, #Blade.Result.Sorted do - if Blade.Result.Sorted[i].bIsApplicable then + for i = 1, #Blade.Result do + if Blade.Result[i].bIsApplicable then nIsApplicableCount = nIsApplicableCount + 1 if bAddMachining then - local bIsMachiningAdded = MachiningLib.AddMachinings( Proc, Blade.Result.Sorted[i]) + local bIsMachiningAdded = MachiningLib.AddMachinings( Proc, Blade.Result[i]) if not bIsMachiningAdded then bAreAllMachiningsAdded = false end end - Strategy.Result.sInfo = Strategy.Result.sInfo .. '\n' .. Blade.Result.Sorted[i].sMessage + Strategy.Result.sInfo = Strategy.Result.sInfo .. '\n' .. Blade.Result[i].sMessage end end -- TODO migliorare calcolo area lavorata; se ho il codolo ha senso l'incompleta? se incompleta con codolo faccio i cubetti?? diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index 6adf197..e333323 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -152,7 +152,7 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- eventuali facce di chiusura for i = 1, #LongFaces do local CuttingLongFace = {} - OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine, bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = OptionalParameters.dExtendAfterTail} + OptionalParametersFaceByBlade = { bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = OptionalParameters.dExtendAfterTail} CuttingLongFace = FaceByBlade.Make( Proc, Part, Proc.MainFaces.LongFaces[i], Proc.MainFaces.LongFaces[i].MainEdges.BottomEdge, OptionalParametersFaceByBlade) table.insert( Blade.Result, CuttingLongFace) end From eff84f5f4d5fed69f06c4cf48d136df054ffac29 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Wed, 19 Mar 2025 19:00:52 +0100 Subject: [PATCH 8/9] - in BeamExec si usa la funzione MachiningLib.FinalizeSorting per ripristinare l'ordine delle lavorazioni interno alla feature, se il sorting l'ha violato --- LuaLibs/BeamExec.lua | 5 +++-- LuaLibs/MachiningLib.lua | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 8758272..c20c039 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1456,10 +1456,11 @@ function BeamExec.ProcessMachinings( PARTS) end -- ordinamento lavorazioni - MACHININGS = MachiningLib.PrepareMachiningsForSorting( PARTS[nPart]) -- TODO completare ordinamento. Mancano le dipendenze. + -- TODO la FinalizeSorting andrebbe rimossa e usato un sorting che non viola le dipendenze + MACHININGS = MachiningLib.PrepareMachiningsForSorting( PARTS[nPart]) MACHININGS = BeamLib.StableSort( MACHININGS, MachiningLib.CompareMachinings) - -- TODO qui bisogna inserire qualcosa per ripristinare l'ordine interno se rovinato + MACHININGS = MachiningLib.FinalizeSorting() -- finiti i calcoli di applicazione delle lavorazioni, si riporta il pezzo nello zero della fase nRawId = PARTS[nPart].idRaw diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index f32a638..f5cd3c3 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -896,6 +896,32 @@ function MachiningLib.PrepareMachiningsForSorting( Part) return MACHININGS end +-- TODO nShifts è solo per debug, si può togliere?? +-- ripristina l'ordine delle lavorazioni interno alla feature, se non rispettato +------------------------------------------------------------------------------------------------------------- +function MachiningLib.FinalizeSorting() + local nShifts = 0 + local nCurrentMachiningIndex = #MACHININGS + + while nCurrentMachiningIndex > 1 do + local nCurrentMachiningIndex2 = nCurrentMachiningIndex - 1 + while nCurrentMachiningIndex2 > 0 do + if MACHININGS[nCurrentMachiningIndex].Proc.id == MACHININGS[nCurrentMachiningIndex2].Proc.id + and MACHININGS[nCurrentMachiningIndex].Machining.nFeatureInternalIndex < MACHININGS[nCurrentMachiningIndex2].Machining.nFeatureInternalIndex then + + local Machining = table.remove( MACHININGS, nCurrentMachiningIndex) + table.insert( MACHININGS, nCurrentMachiningIndex2, Machining) + nShifts = nShifts + 1 + else + nCurrentMachiningIndex2 = nCurrentMachiningIndex2 - 1 + end + end + nCurrentMachiningIndex = nCurrentMachiningIndex - 1 + end + + return MACHININGS, nShifts +end + -- TODO convertire in tabella in cui si chiamano direttamente i nomi delle funzioni, in modo da poter cambiare l'ordine facilmente -- TODO libreria Sorting?? ------------------------------------------------------------------------------------------------------------- From 67ceda8599e8ff8801bb81b30538b9d6dd3605d4 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Thu, 20 Mar 2025 11:38:08 +0100 Subject: [PATCH 9/9] - in MachiningLib migliorata funzione FinalizeSorting --- LuaLibs/MachiningLib.lua | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index f5cd3c3..088f12d 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -901,22 +901,16 @@ end ------------------------------------------------------------------------------------------------------------- function MachiningLib.FinalizeSorting() local nShifts = 0 - local nCurrentMachiningIndex = #MACHININGS - while nCurrentMachiningIndex > 1 do - local nCurrentMachiningIndex2 = nCurrentMachiningIndex - 1 - while nCurrentMachiningIndex2 > 0 do - if MACHININGS[nCurrentMachiningIndex].Proc.id == MACHININGS[nCurrentMachiningIndex2].Proc.id - and MACHININGS[nCurrentMachiningIndex].Machining.nFeatureInternalIndex < MACHININGS[nCurrentMachiningIndex2].Machining.nFeatureInternalIndex then - - local Machining = table.remove( MACHININGS, nCurrentMachiningIndex) - table.insert( MACHININGS, nCurrentMachiningIndex2, Machining) + for i = #MACHININGS, 2, -1 do + for j = i - 1, 1, -1 do + if MACHININGS[i].Proc.id == MACHININGS[j].Proc.id + and MACHININGS[i].Machining.nFeatureInternalIndex < MACHININGS[j].Machining.nFeatureInternalIndex then + + MACHININGS[i], MACHININGS[j] = MACHININGS[j], MACHININGS[i] nShifts = nShifts + 1 - else - nCurrentMachiningIndex2 = nCurrentMachiningIndex2 - 1 end end - nCurrentMachiningIndex = nCurrentMachiningIndex - 1 end return MACHININGS, nShifts