- 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)
This commit is contained in:
andrea.villa
2025-03-27 15:07:09 +01:00
parent ed9dde9bec
commit 68a6c7d897
4 changed files with 108 additions and 44 deletions
+61 -1
View File
@@ -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
+34 -16
View File
@@ -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
+12 -26
View File
@@ -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