From 68a6c7d897547f97a3a0c46cba4d0ccdf7e4e67f Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Thu, 27 Mar 2025 15:07:09 +0100 Subject: [PATCH] - Nella BasicCustomerStrategies aggiunte funzioni per leggere parametri Q per cliente Essetre - I parametri delle BasicCustomerStrategies vengono letti all'inizio della Make di ogni strategia dalla BeamLib.LoadCustomParametersInStrategy - Se feature taglio compatibile con taglio testa/coda viene saltato ( controllo nella InfoAndDependency) --- LuaLibs/BasicCustomerStrategies.lua | 62 ++++++++++++++++++- LuaLibs/BeamExec.lua | 50 ++++++++++----- LuaLibs/BeamLib.lua | 38 ++++-------- Strategies/Standard/HEADCUT/HEADCUTConfig.lua | 2 +- 4 files changed, 108 insertions(+), 44 deletions(-) diff --git a/LuaLibs/BasicCustomerStrategies.lua b/LuaLibs/BasicCustomerStrategies.lua index 8a933f3..c067550 100644 --- a/LuaLibs/BasicCustomerStrategies.lua +++ b/LuaLibs/BasicCustomerStrategies.lua @@ -32,6 +32,10 @@ local ID = require( 'Identity') -- end -- end +---------------------------------------------------------------------------------- +-- *** STRATEGIE *** +---------------------------------------------------------------------------------- + ---------------------------------------------------------------------------------- -- *** EGALWARE *** ---------------------------------------------------------------------------------- @@ -323,6 +327,11 @@ local function GetStrategies_Egalware( Proc) --------------------------------------------------------------------- end + -- si salva che la strategia è stata presa dallo script + if #Strategies > 0 then + Strategies.bIsBasicStrategy = true + end + return Strategies end @@ -335,7 +344,7 @@ local function GetStrategies_Essetre( Proc) --------------------------------------------------------------------- -- Feature : Cut (1-340) if ID.IsHeadCut( Proc) then - Strategies = { { sStrategyId = 'HEADCUT'}} + Strategies = { { sStrategyId = 'HEADCUT'}} --------------------------------------------------------------------- -- Feature : Cut (2-350) elseif ID.IsTailCut( Proc) then @@ -343,9 +352,11 @@ local function GetStrategies_Essetre( Proc) --------------------------------------------------------------------- -- Feature : Cut (1-10) elseif ID.IsCut( Proc) then + Strategies = { { sStrategyId = 'STR0005'}} --------------------------------------------------------------------- -- Feature : Longitudinal Cut (0-10) elseif ID.IsLongitudinalCut( Proc) then + Strategies = { { sStrategyId = 'STR0005'}} --------------------------------------------------------------------- -- Feature : Double Cut (1-11) elseif ID.IsDoubleCut( Proc) then @@ -615,9 +626,41 @@ local function GetStrategies_Essetre( Proc) --------------------------------------------------------------------- end + -- si salva che la strategia è stata presa dallo script + if #Strategies > 0 then + Strategies.bIsBasicStrategy = true + end + return Strategies end + +---------------------------------------------------------------------------------- +-- *** PARAMETRI *** +---------------------------------------------------------------------------------- +---------------------------------------------------------------------------------- +-- *** ESSETRE *** +---------------------------------------------------------------------------------- +-- funzione che recupera i paraemtri custom della strategia. Per cliente Essetre, vengono salvati dei valori 'Q' sul processing del file NGE per modificare il comportamento delle macro +local function GetParameters_Essetre( Proc, sStrategyIdToGet) + local Parameters = {} + + -- Feature : Cut (1-340) + if ID.IsHeadCut( Proc) then + -- Per Essetre nion esiste il taglio di testa, quindi si leggono le variabili Q sul processing che coincide con il taglio di testa + if sStrategyIdToGet == 'HEADCUT' then + local dDepthChamfer = 0 + -- eventuali informazioni da recuperare sulla feature sostituita + if Proc.SubstitutedProc then + dDepthChamfer = EgtGetInfo( Proc.SubstitutedProc.id or GDB_ID.NULL, 'Q06', 'd') or 0 + end + Parameters = { { sName = 'dDepthChamfer', sValue = dDepthChamfer, sType = 'd'}} + end + end + + return Parameters +end + ---------------------------------------------------------------------------------- -- *** Esecuzione *** ---------------------------------------------------------------------------------- @@ -636,9 +679,26 @@ function BasicCustomerStrategies.GetStrategiesFromBasicCustomerStrategies( Proc) else StrategiesFromScript = nil end + return StrategiesFromScript end +---------------------------------------------------------------------------------- +-- lettura parametri che personalizzano le strategie. I parametri di default sono decisi con cliente +function BasicCustomerStrategies.GetParametersFromBasicCustomerStrategies( Proc, sStrategyIdToGet) + local ParametersFromScript = {} + + -- CLIENTE : ESSETRE + if BeamData.STRATEGIES_SCRIPT == 'Essetre' then + ParametersFromScript = GetParameters_Essetre( Proc, sStrategyIdToGet) + else + ParametersFromScript = nil + end + + return ParametersFromScript +end + + ------------------------------------------------------------------------------------------------------------- return BasicCustomerStrategies \ No newline at end of file diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 9e83768..449dfb7 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -755,22 +755,39 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, Part) -- ciclo tutte le feature for i = 1, #vProcSingleRot do local Proc = vProcSingleRot[i] - -- controllo la feature con tutte le altre per recuperare le dipendenze - for j = 1, #vProcSingleRot do - -- non si controlla la feature con se stessa - if i ~= j then + -- se feature abilitata alla lavorazione + if Proc.nFlg ~= 0 then + -- controllo la feature con tutte le altre per recuperare le dipendenze + for j = 1, #vProcSingleRot do local ProcB = vProcSingleRot[j] - -- verifico se feature tipo LapJoint è attraversata da almeno un foro - if ( Proc.Topology.sFamily == 'Pocket' or Proc.Topology.sFamily == 'Tunnel' or Proc.Topology.sFamily == 'Groove' or ID.IsMortise( Proc)) and - ID.IsDrilling( ProcB) and Overlaps( Proc.b3Box, ProcB.b3Box) then - Proc.bPassedByHole = true - end - -- verifiche per specchiature - if BeamData.DOWN_HEAD or BeamData.TWO_EQUAL_HEADS then - -- forature - if BeamData.DOUBLE_HEAD_DRILLING and ID.IsDrilling( Proc) and ID.IsDrilling( ProcB) and not Proc.Mirror then - if AreDrillingsMirrored( Proc, ProcB, Part) then - Proc.Mirror = ProcB + -- non si controlla la feature con se stessa o se feature disabilitata + if i ~= j and ProcB.nFlg ~= 0 then + -- verifico se il taglio può essere saltato perchè è nella stessa posizione del taglio di testa + if Proc.nPrc == 340 and ProcB.Topology.sFamily == 'Cut' and + AreSameVectorApprox( ProcB.Faces[1].vtN, X_AX()) and abs( ProcB.Faces[1].ptCenter:getX() - Part.b3Part:getMax():getX()) < 10 * GEO.EPS_SMALL then + Proc.SubstitutedProc = ProcB + ProcB.IsSubstitutedBy = Proc + ProcB.nFlg = 0 + end + -- verifico se il taglio può essere saltato perchè è nella stessa posizione del taglio di coda + if Proc.nPrc == 350 and ProcB.Topology.sFamily == 'Cut' and + AreSameVectorApprox( ProcB.Faces[1].vtN, -X_AX()) and abs( ProcB.Faces[1].ptCenter:getX() - Part.b3Part:getMin():getX()) < 10 * GEO.EPS_SMALL then + Proc.SubstitutedProc = ProcB + ProcB.IsSubstitutedBy = Proc + ProcB.nFlg = 0 + end + -- verifico se feature tipo LapJoint è attraversata da almeno un foro + if ( Proc.Topology.sFamily == 'Pocket' or Proc.Topology.sFamily == 'Tunnel' or Proc.Topology.sFamily == 'Groove' or ID.IsMortise( Proc)) and + ID.IsDrilling( ProcB) and Overlaps( Proc.b3Box, ProcB.b3Box) then + Proc.bPassedByHole = true + end + -- verifiche per specchiature + if BeamData.DOWN_HEAD or BeamData.TWO_EQUAL_HEADS then + -- forature + if BeamData.DOUBLE_HEAD_DRILLING and ID.IsDrilling( Proc) and ID.IsDrilling( ProcB) and not Proc.Mirror then + if AreDrillingsMirrored( Proc, ProcB, Part) then + Proc.Mirror = ProcB + end end end end @@ -888,6 +905,7 @@ local function CalculateStrategies( vProcSingleRot, Part) -- eseguo file config con i parametri di default local CurrentStrategy = {} CurrentStrategy = RunStrategyLibraries( Proc.AvailableStrategies[nIndexCurrentStrategy].sStrategyId) + -- TODO in caso di ulteriore ciclo dovuto a errori imprevisti, controllare se questa strategia è quella che ha dato errore e disabilitarla senza calcolare nulla -- controllo che le librerie siano state effettivamente caricate if CurrentStrategy.Config and CurrentStrategy.Script then -- eseguo la strategia solo come calcolo fattibilità e voto. Non si applicano le lavorazioni. Si passa la Proc e i parametri personalizzati @@ -1221,7 +1239,6 @@ end local function GetBestResultFromCombinationsMatrix( ProcessingsOnPart, PartInfo) local BestCombination = {} local CombinationsList = {} - local HeadTailProc = {} -- scrittura nel log della matrice delle rotazioni if EgtGetDebugLevel() >= 3 then @@ -1589,6 +1606,7 @@ function BeamExec.ProcessMachinings( PARTS) -- TODO per il momento non si cicla mai una seconda volta. Controllare anche parametro modalità scelta strategia -- Gestione da fare completamente. La strategia che ha generato una lavorazione con errore deve essere annullata + -- si può salvare una lista delle strategie da non utilizzare e, nella CalculateStrategy, settare quella specifica strategia come non valida -- si fa un reset del MACH e poi si ritorna a inizio ciclo e si rifà tutto -- se i cicli superano il massimo si esce (nell'ultimo ciclo possibile si potrebbe escludere la feature e basta, anche se avesse altre strategie da provare) if true or nCurrLoop > nMaxLoops then diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index b7cdae5..0b17f1a 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -9,6 +9,8 @@ local BeamLib = {} -- Include require( 'EgtBase') local BeamData = require( 'BeamData') +local BCS = require( 'BasicCustomerStrategies') + EgtOutLog( ' BeamLib started', 1) @@ -35,19 +37,6 @@ function BeamLib.AddPartStartFace( PartId, b3Solid) EgtSetName( nStmId, 'StartCut') EgtSetInfo( nStmId, 'GRP', 1) EgtSetInfo( nStmId, 'PRC', 340) - -- verifico se sostituisce un taglio di testa già presente - local nProcId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( PartId, 'Processings') or GDB_ID.NULL) - while nProcId do - local nGrp = EgtGetInfo( nProcId, 'GRP', 'i') or 0 - local nProc = EgtGetInfo( nProcId, 'PRC', 'i') or 0 - if ( nGrp == 1 or nGrp == 2) and nProc == 10 then - local ptC, vtN = EgtSurfTmFacetCenter( nProcId, 0, GDB_ID.ROOT) - if ptC and vtN and AreSameVectorApprox( vtN, X_AX()) and abs( ptC:getX() - b3Solid:getMax():getX()) < 10 * GEO.EPS_SMALL then - EgtSetInfo( nStmId, 'ORI', nProcId) - end - end - nProcId = EgtGetNext( nProcId) - end return true end @@ -73,19 +62,6 @@ function BeamLib.AddPartEndFace( PartId, b3Solid) EgtSetName( nStmId, 'EndCut') EgtSetInfo( nStmId, 'GRP', 2) EgtSetInfo( nStmId, 'PRC', 350) - -- verifico se sostituisce un taglio di coda già presente - local nProcId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( PartId, 'Processings') or GDB_ID.NULL) - while nProcId do - local nGrp = EgtGetInfo( nProcId, 'GRP', 'i') or 0 - local nProc = EgtGetInfo( nProcId, 'PRC', 'i') or 0 - if ( nGrp == 1 or nGrp == 2) and nProc == 10 then - local ptC, vtN = EgtSurfTmFacetCenter( nProcId, 0, GDB_ID.ROOT) - if ptC and vtN and AreSameVectorApprox( vtN, -X_AX()) and abs( ptC:getX() - b3Solid:getMin():getX()) < 10 * GEO.EPS_SMALL then - EgtSetInfo( nStmId, 'ORI', nProcId) - end - end - nProcId = EgtGetNext( nProcId) - end return true end @@ -385,6 +361,15 @@ function BeamLib.LoadCustomParametersInStrategy( Proc, CustomParameters, Default local UpdatedParameters = {} -- TODO serve controllare se campo 'sStrategyId' congruente tra il Config (DefaultStrategyParamList) e i parametri custom (CustomParameters)? if DefaultStrategyParamList and DefaultStrategyParamList.Parameters and #DefaultStrategyParamList.Parameters > 0 then + -- se le strategie disponibili sono le basic, non si possono customizzare valori di default da interfaccia, si leggono allora eventuali parametri di default decisi con cliente + if Proc.AvailableStrategies.bIsBasicStrategy then + -- essendo una strategia basic, la lista dei parametri custom dovrebbe essere sempre vuota. Si leggono ora + if not CustomParameters.Parameters then + CustomParameters.Parameters = BCS.GetParametersFromBasicCustomerStrategies( Proc, CustomParameters.sStrategyId) + end + end + + -- lettura e settaggio parametri finali per la strategia (customizzati o default) for i=1, #DefaultStrategyParamList.Parameters do local xParameterValue = nil -- se strategia forzata, leggo eventuali parametri nelle info @@ -405,6 +390,7 @@ function BeamLib.LoadCustomParametersInStrategy( Proc, CustomParameters, Default end end end + -- se non arriva forzato da strategia, oppure se non è stato configurato da cliente, si prende default if not xParameterValue then xParameterValue = DefaultStrategyParamList.Parameters[i].sValue diff --git a/Strategies/Standard/HEADCUT/HEADCUTConfig.lua b/Strategies/Standard/HEADCUT/HEADCUTConfig.lua index 7098fd2..cc91d2f 100644 --- a/Strategies/Standard/HEADCUT/HEADCUTConfig.lua +++ b/Strategies/Standard/HEADCUT/HEADCUTConfig.lua @@ -3,7 +3,7 @@ local HEADCUTData = { sStrategyId = 'HEADCUT', Parameters = { - { sName = 'bMakeChamfer', sValue = 'false', sDescriptionShort = 'Execute Chamfer', sDescriptionLong = 'Use the V-Mill to execute chamfers on cut-edges', sType = 'b', sMessageId = '', sMinUserLevel = '1'}, + { sName = 'dDepthChamfer', sValue = '0', sDescriptionShort = 'Depth Chamfer', sDescriptionLong = 'Depth of the V-Mill to execute chamfers on cut-edges', sType = 'd', sMessageId = '', sMinUserLevel = '1'}, { sName = 'bForceChainSaw', sValue = 'false', sDescriptionShort = 'Force to use chain saw', sDescriptionLong = 'Force to use chain saw', sType = 'b', sMessageId = '', sMinUserLevel = '1'}, { sName = 'bFinishWithMill', sValue = 'true', sDescriptionShort = 'Finish with mill', sDescriptionLong = 'Use a mill to finish the surface if split with chain saw', sType = 'b', sMessageId = '', sMinUserLevel = '1'} }