- b3Raw sostituito da tabella 'Part', che contiene Id e altre info del pezzo

- 'GetUpdateCustomParameters' spostato in BeamLib, da chiamare all'inizio di ogni strategia.
- Aggiornamento strategie a nuovo standard
This commit is contained in:
andrea.villa
2024-05-08 12:12:26 +02:00
parent 3c1814ebdc
commit ecf89edf59
5 changed files with 92 additions and 78 deletions
+44 -61
View File
@@ -453,7 +453,7 @@ local function GetFeatureForcedStrategy( Proc)
end
-------------------------------------------------------------------------------------------------------------
local function CollectFeatures( PartId, b3Raw)
local function CollectFeatures( PartId, Part)
-- recupero le feature
local vProc = {}
local LayerId = {}
@@ -497,7 +497,7 @@ local function CollectFeatures( PartId, b3Raw)
if FeatureData.NeedTopologyFeature( Proc) then
Proc.AdjacencyMatrix = FaceData.GetAdjacencyMatrix( Proc)
Proc.Faces = FaceData.GetFacesInfo( Proc)
Proc.Topology = FeatureData.ClassifyTopology( Proc, b3Raw)
Proc.Topology = FeatureData.ClassifyTopology( Proc, Part)
else
Proc.Topology.Family = 'FEATURE'
Proc.Topology.Name = 'FEATURE'
@@ -539,7 +539,7 @@ local function CollectFeatures( PartId, b3Raw)
end
-------------------------------------------------------------------------------------------------------------
local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw)
local function AreDrillingsMirrored( Proc, ProcMirror, Part)
if Proc.Id == ProcMirror.Id then return false end
-- geometria ausiliaria foro principale
@@ -577,7 +577,7 @@ local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw)
-- centri allineati, equidistanti dalla mezzeria trave, non troppo vicini
local vtDisplacement = ptBC - ptBCMirror
local ptCenRaw = b3Raw:getCenter()
local ptCenRaw = Part.RawBox:getCenter()
if nDouble == 2 then
local dYMinDistance = max( Proc.Box:getMin():getY(), ProcMirror.Box:getMin():getY()) - min( Proc.Box:getMax():getY(), ProcMirror.Box:getMax():getY())
if not ( abs( vtDisplacement:getX()) < 100 * GEO.EPS_SMALL and abs( vtDisplacement:getZ()) < 100 * GEO.EPS_SMALL and
@@ -603,7 +603,7 @@ local function AreDrillingsMirrored( Proc, ProcMirror, b3Raw)
end
-------------------------------------------------------------------------------------------------------------
local function GetFeatureInfoAndDependency( vProcSingleRot, b3Raw)
local function GetFeatureInfoAndDependency( vProcSingleRot, Part)
-- ciclo tutte le feature
for i = 1, #vProcSingleRot do
local Proc = vProcSingleRot[i]
@@ -621,7 +621,7 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, b3Raw)
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, b3Raw) then
if AreDrillingsMirrored( Proc, ProcB, Part) then
Proc.Mirror = ProcB
end
end
@@ -649,21 +649,6 @@ local function RunStrategyLibraries( sStrategyId)
end
end
-------------------------------------------------------------------------------------------------------------
-- sovrascrivo i parametri personalizzati salvati su Proc a quelli di default dalla strategia
local function GetUpdateCustomParameters( CustomStrategyParamList, DefaultStrategyParamList)
if CustomStrategyParamList and #CustomStrategyParamList > 0 then
for i = 1, #DefaultStrategyParamList do
for j = 1, #CustomStrategyParamList do
if DefaultStrategyParamList[i].Name == CustomStrategyParamList[j].Name then
DefaultStrategyParamList[i].Value = CustomStrategyParamList[j].Value
end
end
end
end
return DefaultStrategyParamList
end
-------------------------------------------------------------------------------------------------------------
-- ritorna l'indice della strategia migliore, tra le due passate
local function GetIndexBestStrategyFromComparison( AvailableStrategies, nIndex1, nIndex2)
@@ -711,7 +696,7 @@ end
-------------------------------------------------------------------------------------------------------------
-- funzione che processa tutte le feature sul pezzo e trova la miglior strategia di lavorazione tra quelle disponibili
local function GetBestStrategy( vProcSingleRot, b3Raw)
local function GetBestStrategy( vProcSingleRot, Part)
-- per ogni feature
for i = 1, #vProcSingleRot do
-- processo tutte le feature attive
@@ -721,32 +706,30 @@ local function GetBestStrategy( vProcSingleRot, b3Raw)
if Proc.AvailableStrategies and #Proc.AvailableStrategies > 0 then
local nIndexBestStrategy = 0
-- ciclo tutte le strategie della feature
for j = 1, #Proc.AvailableStrategies do
for nIndexCurrentStrategy = 1, #Proc.AvailableStrategies do
-- eseguo file config con i parametri di default
local CurrentStrategy = {}
CurrentStrategy = RunStrategyLibraries( Proc.AvailableStrategies[j].StrategyId)
CurrentStrategy = RunStrategyLibraries( Proc.AvailableStrategies[nIndexCurrentStrategy].StrategyId)
-- controllo che le librerie siano state effettivamente caricate
if CurrentStrategy.Config and CurrentStrategy.Script then
-- salvo sul proc i parametri di defalt letti da strategia e personalizzati da interfaccia
-- N.B. : I parametri personalizzati non più presenti tra i default della strategia, verranno ignorati. Quelli extra avranno valore di default
Proc.AvailableStrategies[j].Parameters = GetUpdateCustomParameters( Proc.AvailableStrategies[j].Parameters, CurrentStrategy.Config.Parameters)
-- eseguo la strategia solo come calcolo fattibilità e voto. Non si applicano le lavorazioni. Si passa la Proc e i parametri personalizzati
Proc.AvailableStrategies[j].RatingResult = CurrentStrategy.Script.Make( false, Proc, Proc.AvailableStrategies[j].Parameters, b3Raw)
Proc.AvailableStrategies[nIndexCurrentStrategy].RatingResult = CurrentStrategy.Script.Make( false, Proc, Part, Proc.AvailableStrategies[nIndexCurrentStrategy].Parameters)
-- scelgo la migliore strategia tra le due
nIndexBestStrategy = GetIndexBestStrategyFromComparison( Proc.AvailableStrategies, j, nIndexBestStrategy)
nIndexBestStrategy = GetIndexBestStrategyFromComparison( Proc.AvailableStrategies, nIndexCurrentStrategy, nIndexBestStrategy)
-- se scelta strategia standard, esco subito alla prima che trovo completa
if BEAM.GetFirstCompletedStrategy then
break
-- TODO serve paraemtro da Beam&Wall ( oppure da confirgurazione) !!!!!!!!
if BEAM.GetFirstCompletedStrategy and nIndexBestStrategy > 0 then
if Proc.AvailableStrategies[nIndexBestStrategy].RatingResult.Status == 'Complete' then
break
end
end
-- se non trovo i file della strategia, scrivo che non è più disponibile
else
Proc.AvailableStrategies[j].RatingResult = {}
Proc.AvailableStrategies[j].RatingResult.Info = 'Strategy not found'
Proc.AvailableStrategies[nIndexCurrentStrategy].RatingResult = {}
Proc.AvailableStrategies[nIndexCurrentStrategy].RatingResult.Info = 'Strategy not found'
end
end
-- salvo sulla proc la migliore strategia
@@ -761,7 +744,7 @@ end
-------------------------------------------------------------------------------------------------------------
-- esegue le strategie migliori che ha precedentemente scelto
local function ExecPieceFeatures( vProc, b3Raw)
local function ExecPieceFeatures( vProc, Part)
-- applico le strategie scelte
for i = 1, #vProc do
-- processo tutte le feature attive applicando le lavorazioni
@@ -771,15 +754,15 @@ local function ExecPieceFeatures( vProc, b3Raw)
local StrategyScriptName = '\\Strategies\\' .. Proc.ChosenStrategy.StrategyId .. '\\' .. Proc.ChosenStrategy.StrategyId
local StrategyScript = require( StrategyScriptName)
-- eseguo la strategia e si applicano le lavorazioni. Si passa la Proc e i parametri personalizzati
Proc = StrategyScript.Make( true, Proc, Proc.ChosenStrategy.Parameters)
Proc = StrategyScript.Make( true, Proc, Part, Proc.ChosenStrategy.Parameters)
end
end
return vProc
end
-------------------------------------------------------------------------------------------------------------
local function PrintFeatures( vProc, b3Raw)
EgtOutLog( ' RawBox=' .. tostring( b3Raw))
local function PrintFeatures( vProc, Part)
EgtOutLog( ' RawBox=' .. tostring( Part.RawBox))
for i = 1, #vProc do
local Proc = vProc[i]
local sOut = string.format( ' Id=%3d Grp=%1d Prc=%3d TC=%2d/%d Flg=%2d Down=%s Side=%s Head=%s Tail=%s Fcse=%1d,%1d Diam=%.2f Fct=%2d Box=%s TopoName=%s',
@@ -802,11 +785,13 @@ function BeamExec.ProcessFeatures()
local nTotErr = 0
local Stats = {}
local nOrd = 1
local nRawId = EgtGetFirstRawPart()
while nRawId do
local Part = {}
Part.IdRaw = EgtGetFirstRawPart()
while Part.IdRaw do
-- verifico che il grezzo contenga pezzi oppure sia abbastanza lungo da essere scaricato coi carrelli
local nPartId = EgtGetFirstPartInRawPart( nRawId)
if not nPartId and EgtGetRawPartBBox( nRawId):getDimX() < BeamData.MinRaw then break end
local nPartId = EgtGetFirstPartInRawPart( Part.IdRaw)
Part.RawBox = EgtGetRawPartBBox( Part.IdRaw)
if not nPartId and Part.RawBox:getDimX() < BeamData.MinRaw then break end
-- per ogni rotazione, calcolo come lavorare le feature per decidere posizionamento iniziale e in che rotazione verranno lavorate le singole feature
local vProcRot = {}
@@ -820,30 +805,30 @@ function BeamExec.ProcessFeatures()
-- TODO Il numero di rotazioni da calcolare deve dipendere dalle impostazionei del cliente. Per adesso si calcolano tutte e 4, ma può essere ottimizzato
for dRotIndex = 1, 4 do
-- ingombro del grezzo
local b3Raw = EgtGetRawPartBBox( nRawId)
-- recupero le feature di lavorazione della trave
table.insert( vProcRot, CollectFeatures( nPartId, b3Raw))
table.insert( vProcRot, CollectFeatures( nPartId, Part))
-- recupero informazioni ausiliarie feature e dipendenze tra feature stesse
-- TODO le dipendenze cambiano in base alla rotazione del pezzo? probabilmente no
vProcRot[dRotIndex] = GetFeatureInfoAndDependency( vProcRot[dRotIndex], b3Raw)
vProcRot[dRotIndex] = GetFeatureInfoAndDependency( vProcRot[dRotIndex], Part)
-- sceglie la strategia migliore tra quelle disponibili ( presenti nella tabella vProcRot[dRotIndex].AvailableStrategies)
vProcRot[dRotIndex] = GetBestStrategy( vProcRot[dRotIndex], b3Raw)
vProcRot[dRotIndex] = GetBestStrategy( vProcRot[dRotIndex], Part)
-- ruoto il grezzo per calcolare la fattibilità delle lavorazioni nella prossima rotazione
-- vettore movimento grezzi per rotazione di 90deg ogni step
local dDeltaYZ = EgtGetRawPartBBox( nRawId):getDimY() - EgtGetRawPartBBox( nRawId):getDimZ()
local dDeltaYZ = Part.RawBox:getDimY() - Part.RawBox:getDimZ()
local vtMove = Vector3d( 0, dDeltaYZ / 2 * EgtIf( BeamData.RIGHT_LOAD, -1, 1), dDeltaYZ / 2)
local bPreMove = ( dDeltaYZ < 0)
-- ruoto le travi della fase corrente
if bPreMove then
EgtMoveRawPart( nRawId, vtMove)
EgtMoveRawPart( Part.IdRaw, vtMove)
end
EgtRotateRawPart( nRawId, X_AX(), EgtIf( BeamData.RIGHT_LOAD, -90, 90))
EgtRotateRawPart( Part.IdRaw, X_AX(), EgtIf( BeamData.RIGHT_LOAD, -90, 90))
if not bPreMove then
EgtMoveRawPart( nRawId, vtMove)
EgtMoveRawPart( Part.IdRaw, vtMove)
end
-- aggiorno info pezzo
Part.RawBox = EgtGetRawPartBBox( Part.IdRaw)
end
-- TODO da rimuovere o lasciare solo per debug
@@ -859,41 +844,39 @@ function BeamExec.ProcessFeatures()
if nOrd == 1 then
EgtSetCurrPhase( 1)
else
BeamLib.AddPhaseWithRawParts( nRawId, BeamData.OriXR, BeamData.PosXR, 0)
BeamLib.AddPhaseWithRawParts( Part, BeamData.OriXR, BeamData.PosXR, 0)
end
local nPhase = EgtGetCurrPhase()
local nDispId = EgtGetPhaseDisposition( nPhase)
EgtSetInfo( nDispId, 'TYPE', EgtIf( nPartId, 'START', 'REST'))
EgtSetInfo( nDispId, 'ORD', nOrd)
EgtOutLog( ' *** Phase=' .. tostring( nPhase) .. ' Raw=' .. tostring( nRawId) .. ' Part=' .. tostring( nPartId) .. ' ***', 1)
-- ingombro del grezzo
local b3Raw = EgtGetRawPartBBox( nRawId)
EgtOutLog( ' *** Phase=' .. tostring( nPhase) .. ' Raw=' .. tostring( Part.IdRaw) .. ' Part=' .. tostring( nPartId) .. ' ***', 1)
-- debug
if EgtGetDebugLevel() >= 1 then
PrintFeatures( vProc, b3Raw)
PrintFeatures( vProc, Part)
end
EgtOutLog( ' *** AddMachinings ***', 1)
-- TODO ordinare feature e decidere spezzoni
-- ordino le features
-- OrderFeatures( vProc, b3Raw)
-- OrderFeatures( vProc, Part)
-- TODO da fare
-- esegue le strategie migliori che ha precedentemente scelto
ExecPieceFeatures( vProc, b3Raw)
ExecPieceFeatures( vProc, Part)
-- TODO riordinare lavorazioni ottimizzando cambio utensile/spezzone ecc..., mantenendo dipendenze definite prima
-- ordino le lavorazioni
-- OrderMachining( vProc, b3Raw)
-- OrderMachining( vProc, Part)
EgtOutLog( ' *** End AddMachinings ***', 1)
-- passo al grezzo successivo
nOrd = nOrd + 1
nRawId = EgtGetNextRawPart( nRawId)
Part.IdRaw = EgtGetNextRawPart( Part.IdRaw)
end
return ( nTotErr == 0), Stats