From c8431a45849f142a4ab7055cf9af4f52ad779406 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Wed, 15 Oct 2025 19:01:04 +0200 Subject: [PATCH 1/7] - in BLADEKEEPWASTE codolo solo da un lato --- StrategyLibs/BLADEKEEPWASTE.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index b39a87d..db42288 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -217,7 +217,7 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) end -- taglio con codolo faccia di fondo - local dDepthToMachine = BottomEdgeToMachine.dElevation / 2 - OptionalParameters.dStripWidth / 2 + local dDepthToMachine = BottomEdgeToMachine.dElevation - OptionalParameters.dStripWidth local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine, bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, nToolIndex = nToolIndex} -- primo lato Cutting1 = FaceByBlade.Make( Proc, Part, BottomFace, BottomEdgeToMachine, OptionalParametersFaceByBlade) @@ -229,7 +229,7 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) Cutting2 = FaceByBlade.Make( Proc, Part, BottomFace, BottomEdgeToMachine, OptionalParametersFaceByBlade) Cutting2.nInternalSortingPriority = 3 Cutting2.dResultWeight = 0.3 - table.insert( CalculatedMachinings, Cutting2) + --table.insert( CalculatedMachinings, Cutting2) -- fresatura eventuali facce di chiusura if bFinishWithMill then From fac9fd8877a40d4c39e4df71999ea5bb301f5eaa Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Fri, 24 Oct 2025 11:46:41 +0200 Subject: [PATCH 2/7] Piccole modifiche per demo --- LuaLibs/FeatureLib.lua | 8 +-- LuaLibs/MachiningLib.lua | 34 ++++++------ Strategies/GeneralParameters.json | 2 +- Strategies/Standard/STR0012/STR0012.lua | 70 ++++++++++++++++--------- StrategyLibs/BLADEKEEPWASTE.lua | 2 +- 5 files changed, 69 insertions(+), 47 deletions(-) diff --git a/LuaLibs/FeatureLib.lua b/LuaLibs/FeatureLib.lua index 54c0855..a955bef 100644 --- a/LuaLibs/FeatureLib.lua +++ b/LuaLibs/FeatureLib.lua @@ -32,6 +32,8 @@ function FeatureLib.GetProcFromTrimesh( idTrimesh, Part, ProcToCopyFrom) Proc.AffectedFaces = BeamLib.GetAffectedFaces( Proc, Part) Proc.AdjacencyMatrix = FaceData.GetAdjacencyMatrix( Proc) Proc.Faces = FaceData.GetFacesInfo( Proc, Part) + Proc.NotClampableLength = FeatureLib.CalculateFeatureNotClampableLengths( Proc, Part) + Proc.bHindersLaserMeasure = FeatureLib.CalculateFeatureHindersLaserMeasure( Proc, Part) -- TODO servono anche altri dati raccolti nel collect?? return Proc @@ -85,9 +87,9 @@ function FeatureLib.NeedTopologyFeature( Proc, Part) elseif ID.IsStepJointNotch( Proc) then -- (0-80) return true -- feature con calcolo topologia da geometria SOLO se rispettano certe condizioni, altrimenti riconoscimento specifico - elseif ID.IsSawCut( Proc) and Proc.nFct == 1 - and ( IsFeatureCuttingEntireSection( Proc.b3Box, Part) - or IsFeatureCuttingEntireLength( Proc.b3Box, Part)) then -- (0-13) + elseif ID.IsSawCut( Proc) and Proc.nFct == 1 then + --and ( IsFeatureCuttingEntireSection( Proc.b3Box, Part) + --or IsFeatureCuttingEntireLength( Proc.b3Box, Part)) then -- (0-13) return true elseif ID.IsHipValleyRafterNotch( Proc) and Proc.nFct < 4 then -- (0-25) return true diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index e584400..514b9dc 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -865,41 +865,41 @@ end -- TODO funziona solo con attacco perpendicolare - da aggiungere gestione in caso di attacco tangenziale function MachiningLib.AddMachinings( Proc, Machining, AuxiliaryData) local bMachiningAdded = false + local NewAuxiliaryData = {} + + -- se esistono i dati ausiliari li copio in locale perchè il parametro è una tabella per riferimento + if AuxiliaryData then + NewAuxiliaryData = BeamLib.TableCopyDeep( AuxiliaryData) + end if Machining.CloneStepsRadial and Machining.CloneStepsRadial.nCount > 1 then - if not AuxiliaryData then - AuxiliaryData = {} - end - AuxiliaryData.Clones = {} + NewAuxiliaryData.Clones = {} local dOriginalRadialOffset = Machining.dRadialOffset local dOriginalLeadInPerpDistance = Machining.LeadIn.dPerpDistance local dOriginalLeadOutPerpDistance = Machining.LeadOut.dPerpDistance for i = 1, Machining.CloneStepsRadial.nCount do - AuxiliaryData.Clones[i] = {} - AuxiliaryData.Clones[i].dRadialOffset = dOriginalRadialOffset + Machining.CloneStepsRadial.dStep * ( Machining.CloneStepsRadial.nCount - i) + NewAuxiliaryData.Clones[i] = {} + NewAuxiliaryData.Clones[i].dRadialOffset = dOriginalRadialOffset + Machining.CloneStepsRadial.dStep * ( Machining.CloneStepsRadial.nCount - i) -- update distanza perpendicolare attacco per contemplare l'offset applicato if abs( dOriginalLeadInPerpDistance) > 10 * GEO.EPS_SMALL and abs( dOriginalLeadOutPerpDistance) > 10 * GEO.EPS_SMALL then - AuxiliaryData.Clones[i].LeadIn = {} - AuxiliaryData.Clones[i].LeadOut = {} - AuxiliaryData.Clones[i].LeadIn.dPerpDistance = dOriginalLeadInPerpDistance - AuxiliaryData.Clones[i].dRadialOffset + dOriginalRadialOffset - AuxiliaryData.Clones[i].LeadOut.dPerpDistance = dOriginalLeadOutPerpDistance - AuxiliaryData.Clones[i].dRadialOffset + dOriginalRadialOffset + NewAuxiliaryData.Clones[i].LeadIn = {} + NewAuxiliaryData.Clones[i].LeadOut = {} + NewAuxiliaryData.Clones[i].LeadIn.dPerpDistance = dOriginalLeadInPerpDistance - NewAuxiliaryData.Clones[i].dRadialOffset + dOriginalRadialOffset + NewAuxiliaryData.Clones[i].LeadOut.dPerpDistance = dOriginalLeadOutPerpDistance - NewAuxiliaryData.Clones[i].dRadialOffset + dOriginalRadialOffset end end elseif Machining.CloneStepsLongitudinal and Machining.CloneStepsLongitudinal.nCount > 1 then - if not AuxiliaryData then - AuxiliaryData = {} - end - AuxiliaryData.Clones = {} + NewAuxiliaryData.Clones = {} local dOriginalRadialOffset = Machining.dRadialOffset for i = Machining.CloneStepsLongitudinal.nCount, 1, -1 do - AuxiliaryData.Clones[i] = {} - AuxiliaryData.Clones[i].dRadialOffset = dOriginalRadialOffset + Machining.CloneStepsLongitudinal.dStep * ( i - 1) + NewAuxiliaryData.Clones[i] = {} + NewAuxiliaryData.Clones[i].dRadialOffset = dOriginalRadialOffset + Machining.CloneStepsLongitudinal.dStep * ( i - 1) end end - bMachiningAdded = AddNewMachining( Proc, Machining, AuxiliaryData) + bMachiningAdded = AddNewMachining( Proc, Machining, NewAuxiliaryData) return bMachiningAdded end diff --git a/Strategies/GeneralParameters.json b/Strategies/GeneralParameters.json index eee8c9e..1ecab86 100644 --- a/Strategies/GeneralParameters.json +++ b/Strategies/GeneralParameters.json @@ -94,7 +94,7 @@ "nGroup": "MACHINING STRATEGY", "sName": "GEN_bReduceBladePath", "sNameNge": "REDUCE_BLADE_PATH", - "sValue": "false", + "sValue": "true", "sDescriptionShort": "Use entire blade diameter to shorten path", "sDescriptionLong": "", "sType": "b", diff --git a/Strategies/Standard/STR0012/STR0012.lua b/Strategies/Standard/STR0012/STR0012.lua index 8894984..f1b933e 100644 --- a/Strategies/Standard/STR0012/STR0012.lua +++ b/Strategies/Standard/STR0012/STR0012.lua @@ -10,6 +10,7 @@ local MachiningLib = require( 'MachiningLib') local FeatureLib = require( 'FeatureLib') -- strategie di base local BladeToWaste = require( 'BLADETOWASTE') +local BladeKeepWaste =require ( 'BLADEKEEPWASTE') -- Tabella per definizione modulo local STR0012 = {} @@ -42,6 +43,7 @@ function STR0012.Make( bAddMachining, Proc, Part, CustomParameters) local dMRRBladeAddedFace = 0 local dCompletionPercentageAddedFace = 0 local dQualityAddedFace = 0 + local AuxiliaryData = { bIgnoreNotClampableLength = false} -- gestito solo RidgeLap 3 facce if Proc.nFct ~= 3 then @@ -78,39 +80,57 @@ function STR0012.Make( bAddMachining, Proc, Part, CustomParameters) -- rimozione della terza faccia dalla Proc local idNewProc = EgtCopyGlob( Proc.id, nAddGrpId) EgtSurfTmRemoveFacet( idNewProc, nAddedFace) - Proc = FeatureLib.GetProcFromTrimesh( idNewProc, Part, Proc) + local NewProc = FeatureLib.GetProcFromTrimesh( idNewProc, Part, Proc) + NewProc.Topology = FeatureLib.ClassifyTopology( NewProc, Part) -- TODO rimuovere??? codolo da implementare o no?? -- 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') - local dFeatureMaxNotClampableLengthHead, dFeatureMaxNotClampableLengthTail = FeatureLib.GetFeatureMaxNotClampableLengths( Proc, Part) + local dFeatureMaxNotClampableLengthHead, dFeatureMaxNotClampableLengthTail = FeatureLib.GetFeatureMaxNotClampableLengths( NewProc, 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}) + local bIsFeatureLong = FeatureLib.IsMachiningLong( NewProc.b3Box:getDimX(), Part, { dMaxSegmentLength = BeamData.LONGCUT_ENDLEN}) + + -- lavorazione con codolo + if ( bIsFeatureLong) + or ( bFeatureHindersClamping and not bDropWaste) + or bKeepWasteAttached then + + local BladeKeepWasteResult + local OptionalParameters = { dExtendAfterTail = dExtendAfterTail, dStripWidth = 5, bFinishWithMill = false} + AuxiliaryData.bIgnoreNotClampableLength = true + TwoFaces.Result, BladeKeepWasteResult = BladeKeepWaste.Make( NewProc, Part, OptionalParameters) + dTimeToMachine = BladeKeepWasteResult.dTimeToMachine + dMRRBlade = BladeKeepWasteResult.dMRR + dCompletionPercentage = BladeKeepWasteResult.dCompletionPercentage + dQuality = BladeKeepWasteResult.dQuality -- lavorazione a cubetti facce concave - local dMinZTopBlade - local dMaxNyTopBlade - local BladeToWasteResult - if Strategy.Parameters.dMinZAngleTopBlade then - dMinZTopBlade = sin( Strategy.Parameters.dMinZAngleTopBlade) + else + 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, + bReduceBladePath = Strategy.Parameters.bReduceBladePath + } + AuxiliaryData.bIgnoreNotClampableLength = false + TwoFaces.Result, BladeToWasteResult = BladeToWaste.Make( NewProc, Part, OptionalParameters) + dTimeToMachine = BladeToWasteResult.dTimeToMachine + dMRRBlade = BladeToWasteResult.dMRR + dCompletionPercentage = BladeToWasteResult.dCompletionPercentage + dQuality = BladeToWasteResult.dQuality 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, - bReduceBladePath = Strategy.Parameters.bReduceBladePath - } - TwoFaces.Result, BladeToWasteResult = BladeToWaste.Make( Proc, Part, OptionalParameters) - dTimeToMachine = BladeToWasteResult.dTimeToMachine - dMRRBlade = BladeToWasteResult.dMRR - dCompletionPercentage = BladeToWasteResult.dCompletionPercentage - dQuality = BladeToWasteResult.dQuality -- lavorazione terza faccia -- TODO da completare @@ -162,7 +182,7 @@ function STR0012.Make( bAddMachining, Proc, Part, CustomParameters) if RidgeLap.Result[i].bIsApplicable then nIsApplicableCount = nIsApplicableCount + 1 if bAddMachining then - local bIsMachiningAdded = MachiningLib.AddMachinings( OriginalProc, RidgeLap.Result[i]) + local bIsMachiningAdded = MachiningLib.AddMachinings( OriginalProc, RidgeLap.Result[i], AuxiliaryData) if not bIsMachiningAdded then bAreAllMachiningsAdded = false end diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index db42288..ba3da2f 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -209,7 +209,7 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- taglio eventuali facce di chiusura for i = 1, #LongFaces do local Cutting = {} - local OptionalParametersFaceByBlade = { bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, nToolIndex = nToolIndex} + local OptionalParametersFaceByBlade = { bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = 9999, nToolIndex = nToolIndex} Cutting = FaceByBlade.Make( Proc, Part, LongFaces[i], LongFaces[i].MainEdges.BottomEdge, OptionalParametersFaceByBlade) Cutting.nInternalSortingPriority = 1 Cutting.dResultWeight = 0.15 From 746eb9efe9b6c2803aaa5ed8a8c6c24d3e1704bc Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Fri, 24 Oct 2025 17:10:22 +0200 Subject: [PATCH 3/7] - Creazione gruppo temporaneo (da riportare) - Riconoscimento Topologico SawCut se attraversa la trave (da riportare) - Dati di pinzaggio feature spostato in STR0012 --- BatchProcessNew.lua | 19 +++++++++-- LuaLibs/BasicCustomerStrategies.lua | 3 ++ LuaLibs/BeamLib.lua | 13 ++++++++ LuaLibs/FeatureLib.lua | 44 ++++++++++++++++++++++--- Process.lua | 8 +++++ Strategies/AvailableStrategyList.json | 6 +++- Strategies/Standard/STR0012/STR0012.lua | 2 ++ 7 files changed, 87 insertions(+), 8 deletions(-) diff --git a/BatchProcessNew.lua b/BatchProcessNew.lua index 45b5c4b..fec450d 100644 --- a/BatchProcessNew.lua +++ b/BatchProcessNew.lua @@ -230,10 +230,13 @@ if BEAM.FLAG == 0 then -- TODO valutare se fare script separato elseif BEAM.FLAG == 9 then if type( BEAM.FEATUREID) == 'number' then + -- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella + local idTempGroup = BeamLib.CreateTempGroup() + local Part = {} Part.id = EgtGetParent( EgtGetParent( BEAM.FEATUREID)) Part.b3Part = EgtGetBBoxGlob( EgtGetFirstNameInGroup( Part.id, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) - + local Proc = FeatureLib.GetProcFromTrimesh( BEAM.FEATUREID, Part) Proc.nGrp = EgtGetInfo( Proc.id, 'GRP', 'i') Proc.nPrc = EgtGetInfo( Proc.id, 'PRC', 'i') @@ -251,8 +254,10 @@ elseif BEAM.FLAG == 9 then else BEAM.TOPOLOGY = 'NOT_IMPLEMENTED' end + + -- si cancella gruppo temporaneo contenente entità da cancellare + EgtErase( idTempGroup) end - return end @@ -372,6 +377,9 @@ if bToProcess then -- Altrimenti, opero sul progetto corrente else + -- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella + BeamLib.CreateTempGroup() + -- Recupero l'identificativo del gruppo di lavoro corrente local nMGrpId = EgtGetCurrMachGroup() -- Barra da creare @@ -416,6 +424,9 @@ if bToProcess then end end + -- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella + BeamLib.CreateTempGroup() + -- recupero parametri generali da progetto BeamExec.GetGeneralParameters() @@ -701,6 +712,10 @@ if bToProcess then end end + -- si cancella gruppo temporaneo contenente entità da cancellare + local idTempGroup = BeamLib.GetTempGroup() + EgtErase( idTempGroup) + -- Salvo il progetto EgtSaveFile( sNgeFile) -- copio come originale (per dichiarare progetto ricalcolato) diff --git a/LuaLibs/BasicCustomerStrategies.lua b/LuaLibs/BasicCustomerStrategies.lua index c68aec4..05bef53 100644 --- a/LuaLibs/BasicCustomerStrategies.lua +++ b/LuaLibs/BasicCustomerStrategies.lua @@ -101,6 +101,9 @@ local function GetStrategies_Essetre( Proc) --------------------------------------------------------------------- -- Feature : Saw Cut (0-13) elseif ID.IsSawCut( Proc) then + if Proc.Topology.sName == 'Cut-1-Through' or Proc.Topology.sName == 'Bevel-1-Through' then + Strategies = { { sStrategyId = 'STR0002'}, { sStrategyId = 'STR0005'}, { sStrategyId = 'STR0010'}} + end --------------------------------------------------------------------- -- Feature : Slot (0-16) elseif ID.IsSlot( Proc) then diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index d6a312d..f4a83b7 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -292,6 +292,19 @@ function BeamLib.CreateOrEmptyAddGroup( PartId) return true end +------------------------------------------------------------------------------------------------------------- +function BeamLib.CreateTempGroup() + local idTempGroup = EgtGroup( GDB_ID.ROOT) + EgtSetName( idTempGroup, "#TEMP_GROUP#") + return idTempGroup +end + +------------------------------------------------------------------------------------------------------------- +function BeamLib.GetTempGroup() + local idTempGroup = EgtGetFirstNameInGroup( GDB_ID.ROOT, "#TEMP_GROUP#") or nil + return idTempGroup +end + ------------------------------------------------------------------------------------------------------------- function BeamLib.GetAddGroup( PartId) -- recupero il nome del gruppo di lavoro corrente diff --git a/LuaLibs/FeatureLib.lua b/LuaLibs/FeatureLib.lua index a955bef..28a9c4c 100644 --- a/LuaLibs/FeatureLib.lua +++ b/LuaLibs/FeatureLib.lua @@ -32,8 +32,6 @@ function FeatureLib.GetProcFromTrimesh( idTrimesh, Part, ProcToCopyFrom) Proc.AffectedFaces = BeamLib.GetAffectedFaces( Proc, Part) Proc.AdjacencyMatrix = FaceData.GetAdjacencyMatrix( Proc) Proc.Faces = FaceData.GetFacesInfo( Proc, Part) - Proc.NotClampableLength = FeatureLib.CalculateFeatureNotClampableLengths( Proc, Part) - Proc.bHindersLaserMeasure = FeatureLib.CalculateFeatureHindersLaserMeasure( Proc, Part) -- TODO servono anche altri dati raccolti nel collect?? return Proc @@ -52,6 +50,39 @@ local function IsFeatureCuttingEntireLength( b3Proc, Part) ( b3Proc:getDimZ() > ( Part.b3Part:getDimZ() - 500 * GEO.EPS_SMALL) and b3Proc:getDimX() > ( Part.b3Part:getDimX() - 500 * GEO.EPS_SMALL))) end +------------------------------------------------------------------------------------------------------------- +-- restituisce vero se tutti i lati della faccia passata si trovano sul grezzo +local function AreAllFaceEdgesOnRaw( Part, Proc, idFace) + local bEdgeOnRaw = true + local idTempGroup = BeamLib.GetTempGroup() + local nLoopId, nLoopCnt = EgtExtractSurfTmFacetLoops( Proc.id, idFace, idTempGroup) + if nLoopCnt > 1 then + error( 'AreAllFaceEdgesOnRaw : too many loops') + end + + if nLoopId then + local dUmin, dUmax = EgtCurveDomain( nLoopId) + for dU = dUmin, dUmax-1 do + local ptMid = ( EgtUP( nLoopId, dU, GDB_ID.ROOT) + EgtUP( nLoopId, dU+1, GDB_ID.ROOT)) / 2 + -- se punto medio dell'entita NON si trova su faccia testa o coda + if ptMid:getX() < Part.b3Part:getMin():getX() + 100 * GEO.EPS_SMALL or ptMid:getX() > Part.b3Part:getMax():getX() - 100 * GEO.EPS_SMALL or + ptMid:getY() < Part.b3Part:getMin():getY() + 100 * GEO.EPS_SMALL or ptMid:getY() > Part.b3Part:getMax():getY() - 100 * GEO.EPS_SMALL or + ptMid:getZ() < Part.b3Part:getMin():getZ() + 100 * GEO.EPS_SMALL or ptMid:getZ() > Part.b3Part:getMax():getZ() - 100 * GEO.EPS_SMALL then + bEdgeOnRaw = true + else + bEdgeOnRaw = false + break + end + end + --for j = 1, nLoopCnt do + -- EgtErase( nLoopId + j - 1) + --end + end + return bEdgeOnRaw +end + + + --------------------------------------------------------------------- -- recupero topologia della feature function FeatureLib.NeedTopologyFeature( Proc, Part) @@ -87,9 +118,7 @@ function FeatureLib.NeedTopologyFeature( Proc, Part) elseif ID.IsStepJointNotch( Proc) then -- (0-80) return true -- feature con calcolo topologia da geometria SOLO se rispettano certe condizioni, altrimenti riconoscimento specifico - elseif ID.IsSawCut( Proc) and Proc.nFct == 1 then - --and ( IsFeatureCuttingEntireSection( Proc.b3Box, Part) - --or IsFeatureCuttingEntireLength( Proc.b3Box, Part)) then -- (0-13) + elseif ID.IsSawCut( Proc) and Proc.nFct == 1 and AreAllFaceEdgesOnRaw( Part, Proc, 0) then return true elseif ID.IsHipValleyRafterNotch( Proc) and Proc.nFct < 4 then -- (0-25) return true @@ -910,6 +939,11 @@ function FeatureLib.CalculateFeatureNotClampableLengths( Proc, Part) local dNotClampableLengthHead = 0 local dNotClampableLengthTail = 0 + -- se il grezzo non è definito, prendo il box del pezzo + if not Part.b3Raw then + Part.b3Raw = Part.b3Part + end + -- TODO se la feature ha più di 3 facce non viene mai calcolato!! Es. Tenone ecc.... if Proc.nFct < 3 then -- eventuale segnalazione ingombro di testa o coda diff --git a/Process.lua b/Process.lua index 0cab548..b67d4d9 100644 --- a/Process.lua +++ b/Process.lua @@ -79,6 +79,7 @@ PARTS = {} -- tabella contenente tutte le informazioni di ogni pezzo local BeamData = require( 'BeamData') -- carico librerie local BeamExec = require( 'BeamExec') +local BeamLib = require( 'BeamLib') -- Variabili di modulo local dRawW @@ -299,6 +300,9 @@ end -- *** Inserimento delle lavorazioni nelle travi *** ------------------------------------------------------------------------------------------------------------- local function MyProcessFeatures() + -- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella + local idTempGroup = BeamLib.CreateTempGroup() + BeamExec.GetProcessings( PARTS, bCalcBestPieceUnloadPosition) BeamExec.GetCombinationMatrix( PARTS, bCalcBestPieceUnloadPosition) BeamExec.ProcessMachinings( PARTS) @@ -342,6 +346,10 @@ local function MyProcessFeatures() end end end + + -- cancello gruppo temporaneo + EgtErase( idTempGroup) + if #sOutput > 0 then EgtOutLog( sOutput) end if nErrCnt > 0 then EgtOutBox( sOutput, 'Lavora Travi', 'ERRORS') diff --git a/Strategies/AvailableStrategyList.json b/Strategies/AvailableStrategyList.json index 52198bb..db173d1 100644 --- a/Strategies/AvailableStrategyList.json +++ b/Strategies/AvailableStrategyList.json @@ -61,7 +61,11 @@ "nPrc": 13, "nGrp": 0, "TopologyList" : [ - { "sName": "Feature", + { "sName": "Cut-1-Through", + "sImage": "ConfigStrategy\\Cut-1-Through.png", + "StrategyList" : [ { "sStrategyId": "STR0002" }, { "sStrategyId": "STR0005" }, { "sStrategyId": "STR0010" } ] + }, + { "sName": "Bevel-1-Through", "sImage": "ConfigStrategy\\Cut-1-Through.png", "StrategyList" : [ { "sStrategyId": "STR0002" }, { "sStrategyId": "STR0005" }, { "sStrategyId": "STR0010" } ] } diff --git a/Strategies/Standard/STR0012/STR0012.lua b/Strategies/Standard/STR0012/STR0012.lua index f1b933e..d0d06d4 100644 --- a/Strategies/Standard/STR0012/STR0012.lua +++ b/Strategies/Standard/STR0012/STR0012.lua @@ -82,6 +82,8 @@ function STR0012.Make( bAddMachining, Proc, Part, CustomParameters) EgtSurfTmRemoveFacet( idNewProc, nAddedFace) local NewProc = FeatureLib.GetProcFromTrimesh( idNewProc, Part, Proc) NewProc.Topology = FeatureLib.ClassifyTopology( NewProc, Part) + NewProc.NotClampableLength = FeatureLib.CalculateFeatureNotClampableLengths( NewProc, Part) + NewProc.bHindersLaserMeasure = FeatureLib.CalculateFeatureHindersLaserMeasure( NewProc, Part) -- TODO rimuovere??? codolo da implementare o no?? -- considerazioni necessarie a determinare se lavorare con codolo oppure no From ee54c32918ac8aef2a7c17865aa05db678814a0e Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Mon, 27 Oct 2025 16:39:28 +0100 Subject: [PATCH 4/7] Migliorata gestione del gruppo temporaneo. DA RIVEDERE! --- BatchProcessNew.lua | 3 --- LuaLibs/BeamLib.lua | 8 ++++++-- NestProcess.lua | 4 ++++ Strategies/Standard/HEADCUT/HEADCUT.json | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/BatchProcessNew.lua b/BatchProcessNew.lua index fec450d..68786ef 100644 --- a/BatchProcessNew.lua +++ b/BatchProcessNew.lua @@ -377,9 +377,6 @@ if bToProcess then -- Altrimenti, opero sul progetto corrente else - -- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella - BeamLib.CreateTempGroup() - -- Recupero l'identificativo del gruppo di lavoro corrente local nMGrpId = EgtGetCurrMachGroup() -- Barra da creare diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index f4a83b7..5adef12 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -294,8 +294,12 @@ end ------------------------------------------------------------------------------------------------------------- function BeamLib.CreateTempGroup() - local idTempGroup = EgtGroup( GDB_ID.ROOT) - EgtSetName( idTempGroup, "#TEMP_GROUP#") + local idTempGroup = BeamLib.GetTempGroup() + -- se non esiste, lo creo + if not idTempGroup then + idTempGroup = EgtGroup( GDB_ID.ROOT) + EgtSetName( idTempGroup, "#TEMP_GROUP#") + end return idTempGroup end diff --git a/NestProcess.lua b/NestProcess.lua index d3fd807..72f9c6f 100644 --- a/NestProcess.lua +++ b/NestProcess.lua @@ -472,6 +472,10 @@ while nMachGroup do nMachGroup = nNextMachGroup end +-- si cancella gruppo temporaneo contenente entità da cancellare +local idTempGroup = EgtGetFirstNameInGroup( GDB_ID.ROOT, "#TEMP_GROUP#") or nil +EgtErase( idTempGroup) + EgtResetCurrMachGroup() NEST.ERR = 0 diff --git a/Strategies/Standard/HEADCUT/HEADCUT.json b/Strategies/Standard/HEADCUT/HEADCUT.json index 1c49971..a6b28c7 100644 --- a/Strategies/Standard/HEADCUT/HEADCUT.json +++ b/Strategies/Standard/HEADCUT/HEADCUT.json @@ -25,7 +25,7 @@ { "sName": "bExecutePreCut", "sNameNge": "EXEC_PRECUT", - "sValue": "true", + "sValue": "false", "sDescriptionShort": "Force to add PreCuts", "sDescriptionLong": "Autocam will apply a machining on the theoretical zero, to avoid collision if the theoretical piece length doesn't correspond to the real length", "sType": "b", From dd0b39df71d3bf5811a34484766d6bb40c67ba5e Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Mon, 27 Oct 2025 16:55:32 +0100 Subject: [PATCH 5/7] Settato il gruppo temporaneo come effettivamente temporaneo per evitare che venga salvato --- BatchProcessNew.lua | 16 +++++++++------- LuaLibs/BeamLib.lua | 1 + NestProcess.lua | 4 ---- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/BatchProcessNew.lua b/BatchProcessNew.lua index 68786ef..80cb774 100644 --- a/BatchProcessNew.lua +++ b/BatchProcessNew.lua @@ -421,9 +421,6 @@ if bToProcess then end end - -- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella - BeamLib.CreateTempGroup() - -- recupero parametri generali da progetto BeamExec.GetGeneralParameters() @@ -642,9 +639,18 @@ if bToProcess then -- Lavoro le features if not GetDataConfig() then return end + + -- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella + BeamLib.CreateTempGroup() + BeamExec.GetProcessings( PARTS, bCalcBestPieceUnloadPosition) BeamExec.GetCombinationMatrix( PARTS, bCalcBestPieceUnloadPosition) BeamExec.ProcessMachinings( PARTS) + + -- si cancella gruppo temporaneo contenente entità da cancellare + local idTempGroup = BeamLib.GetTempGroup() + EgtErase( idTempGroup) + local sOutput = '' -- Scrittura json risultati @@ -709,10 +715,6 @@ if bToProcess then end end - -- si cancella gruppo temporaneo contenente entità da cancellare - local idTempGroup = BeamLib.GetTempGroup() - EgtErase( idTempGroup) - -- Salvo il progetto EgtSaveFile( sNgeFile) -- copio come originale (per dichiarare progetto ricalcolato) diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 5adef12..a83402c 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -299,6 +299,7 @@ function BeamLib.CreateTempGroup() if not idTempGroup then idTempGroup = EgtGroup( GDB_ID.ROOT) EgtSetName( idTempGroup, "#TEMP_GROUP#") + EgtSetLevel( idTempGroup, GDB_LV.TEMP) end return idTempGroup end diff --git a/NestProcess.lua b/NestProcess.lua index 72f9c6f..d3fd807 100644 --- a/NestProcess.lua +++ b/NestProcess.lua @@ -472,10 +472,6 @@ while nMachGroup do nMachGroup = nNextMachGroup end --- si cancella gruppo temporaneo contenente entità da cancellare -local idTempGroup = EgtGetFirstNameInGroup( GDB_ID.ROOT, "#TEMP_GROUP#") or nil -EgtErase( idTempGroup) - EgtResetCurrMachGroup() NEST.ERR = 0 From fa36c51de0bc8f9369c7344f294bc4a0adeeea32 Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Wed, 29 Oct 2025 13:11:53 +0100 Subject: [PATCH 6/7] =?UTF-8?q?-=20Corretto=20ID=20strategia=20STR0015=20-?= =?UTF-8?q?=20Paramtri=20generali=20sono=20pre-processati=20quindi=20si=20?= =?UTF-8?q?deve=20controllare=20che=20non=20siano=20nil,=20perch=C3=A8=20p?= =?UTF-8?q?otrebbero=20esserci,=20ma=20essere=20falsi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BatchProcessNew.lua | 5 +---- LuaLibs/BeamExec.lua | 7 ++----- LuaLibs/BeamLib.lua | 12 ++++++------ Strategies/Standard/STR0015/STR0015.json | 2 +- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/BatchProcessNew.lua b/BatchProcessNew.lua index 80cb774..d65bd4c 100644 --- a/BatchProcessNew.lua +++ b/BatchProcessNew.lua @@ -583,10 +583,7 @@ if bToProcess then PARTS[i].NotClampableLength = { STD = { dHead = 0, dTail = 0}, SIDE = { dHead = 0, dTail = 0}, DOWN = { dHead = 0, dTail = 0}} PARTS[i].sBTLInfo = EgtGetInfo( PARTS[i].id, 'PROJ', 's') or nil - -- TODO LE INFO BTL ci devono sempre essere!! ripristinare dopo aver sistemato lettura da BtlInfo - --PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo].sAISetupConfig or GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil - PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil - + PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo].sAISetupConfig or GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil -- si carica configurazione lavorazioni BeamExec.GetStrategiesFromJSONinBD( PARTS[i].sAISetupConfig) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 8501abc..9881823 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -482,12 +482,9 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, PARTS, b PARTS[i].SplittingPoints = BeamLib.GetPartSplittingPoints( PARTS[i]) PARTS[i].NotClampableLength = { STD = { dHead = 0, dTail = 0}, SIDE = { dHead = 0, dTail = 0}, DOWN = { dHead = 0, dTail = 0}} PARTS[i].dHeadOverMaterial = dDeltaS - PARTS[i].sBTLInfo = EgtGetInfo( PARTS[i].id, 'PROJECT', 's') or nil - - -- TODO LE INFO BTL ci devono sempre essere!! ripristinare dopo aver sistemato lettura da BtlInfo - --PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo].sAISetupConfig or GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil - PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil + PARTS[i].sBTLInfo = EgtGetInfo( PARTS[i].id, 'PROJ', 's') or nil + PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo].sAISetupConfig or GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil -- si carica configurazione lavorazioni BeamExec.GetStrategiesFromJSONinBD( PARTS[i].sAISetupConfig) diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index a83402c..5719ac6 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -500,7 +500,7 @@ function BeamLib.GetPieceGeneralParameters( Part, DefaultGeneralParamList) GeneralParameters[DefaultGeneralParamList[i].sName] = xParameterValue end else - if GENERAL_PARAMETERS.BTL and GENERAL_PARAMETERS.BTL[Part.sBTLInfo] and GENERAL_PARAMETERS.BTL[Part.sBTLInfo][DefaultGeneralParamList[i].sName] then + if GENERAL_PARAMETERS.BTL and GENERAL_PARAMETERS.BTL[Part.sBTLInfo] and GENERAL_PARAMETERS.BTL[Part.sBTLInfo][DefaultGeneralParamList[i].sName] ~= nil then GeneralParameters[DefaultGeneralParamList[i].sName] = GENERAL_PARAMETERS.BTL[Part.sBTLInfo][DefaultGeneralParamList[i].sName] elseif GENERAL_PARAMETERS.PROJECT[DefaultGeneralParamList[i].sName] then GeneralParameters[DefaultGeneralParamList[i].sName] = GENERAL_PARAMETERS.PROJECT[DefaultGeneralParamList[i].sName] @@ -515,11 +515,11 @@ end local function GetInheritedParameter( Part, sSourceParamName) local sValue = nil if sSourceParamName and #sSourceParamName > 0 then - if Part.GeneralParameters[sSourceParamName] then + if Part.GeneralParameters[sSourceParamName] ~= nil then sValue = Part.GeneralParameters[sSourceParamName] - elseif GENERAL_PARAMETERS.BTL and GENERAL_PARAMETERS.BTL[Part.sBTLInfo] and GENERAL_PARAMETERS.BTL[Part.sBTLInfo][sSourceParamName] then + elseif GENERAL_PARAMETERS.BTL and GENERAL_PARAMETERS.BTL[Part.sBTLInfo] and GENERAL_PARAMETERS.BTL[Part.sBTLInfo][sSourceParamName] ~= nil then sValue = GENERAL_PARAMETERS.BTL[Part.sBTLInfo][sSourceParamName] - elseif GENERAL_PARAMETERS.PROJECT[sSourceParamName] then + elseif GENERAL_PARAMETERS.PROJECT[sSourceParamName] ~= nil then sValue = GENERAL_PARAMETERS.PROJECT[sSourceParamName] end end @@ -611,13 +611,13 @@ function BeamLib.LoadGeneralParametersInList( DefaultGeneralParamList) -- aggiornamento parametri BTL local BTLInfo = EgtGetNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL for j = 1, #BTLInfo do - local BTLName = EgtGetInfo( BTLInfo[j], 'PROJECT', 's') + local BTLName = EgtGetInfo( BTLInfo[j], 'PROJ', 's') if BTLName then UpdatedParameters.BTL[BTLName] = {} UpdatedParameters.BTL[BTLName].sAISetupConfig = EgtGetInfo( BTLInfo[j], 'AISETUP', 's') or nil for i = 1, #DefaultGeneralParamList do local sParamNameNGE = DefaultGeneralParamList[i].sNameNge - local xParameterValue = EgtGetInfo( BTLInfo[j], sParamNameNGE, 's') or DefaultGeneralParamList[i].sValue + local xParameterValue = EgtGetInfo( BTLInfo[j], sParamNameNGE, 's') -- salvataggio dato su lista con accesso diretto if DefaultGeneralParamList[i].sType == 'b' then UpdatedParameters.BTL[BTLName][DefaultGeneralParamList[i].sName] = xParameterValue == 'true' or xParameterValue == '1' or xParameterValue == true diff --git a/Strategies/Standard/STR0015/STR0015.json b/Strategies/Standard/STR0015/STR0015.json index 2fadde9..d9532ef 100644 --- a/Strategies/Standard/STR0015/STR0015.json +++ b/Strategies/Standard/STR0015/STR0015.json @@ -1,5 +1,5 @@ { - "sStrategyId": "STR0009", + "sStrategyId": "STR0015", "sStrategyName": "Mill Heading", "ParameterList" : [ { From 6ce4af988406135812be2fee9cc2eefb74a54838 Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Wed, 29 Oct 2025 14:58:37 +0100 Subject: [PATCH 7/7] =?UTF-8?q?I=20parametri=20generici=20BTL=20non=20?= =?UTF-8?q?=C3=A8=20detto=20che=20ci=20siano,=20quindi=20bisogna=20control?= =?UTF-8?q?lare=20se=20effettivamente=20siano=20stati=20impostati?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BatchProcessNew.lua | 4 +++- LuaLibs/BeamExec.lua | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/BatchProcessNew.lua b/BatchProcessNew.lua index d65bd4c..7d16ded 100644 --- a/BatchProcessNew.lua +++ b/BatchProcessNew.lua @@ -583,7 +583,9 @@ if bToProcess then PARTS[i].NotClampableLength = { STD = { dHead = 0, dTail = 0}, SIDE = { dHead = 0, dTail = 0}, DOWN = { dHead = 0, dTail = 0}} PARTS[i].sBTLInfo = EgtGetInfo( PARTS[i].id, 'PROJ', 's') or nil - PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo].sAISetupConfig or GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil + PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or + ( GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo] and GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo].sAISetupConfig) or -- i parametri BTL potrebbero non esistere + GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil -- si carica configurazione lavorazioni BeamExec.GetStrategiesFromJSONinBD( PARTS[i].sAISetupConfig) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 9881823..27b073c 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -484,7 +484,9 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, PARTS, b PARTS[i].dHeadOverMaterial = dDeltaS PARTS[i].sBTLInfo = EgtGetInfo( PARTS[i].id, 'PROJ', 's') or nil - PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo].sAISetupConfig or GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil + PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or + ( GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo] and GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo].sAISetupConfig) or -- i parametri BTL potrebbero non esistere + GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil -- si carica configurazione lavorazioni BeamExec.GetStrategiesFromJSONinBD( PARTS[i].sAISetupConfig)