Prima bozza (non funzionante) applicazione lavorazioni nella relativa rotazione

This commit is contained in:
andrea.villa
2024-11-05 16:37:50 +01:00
parent 7c80c4d3d8
commit 2b9113347a
2 changed files with 196 additions and 135 deletions
+71 -23
View File
@@ -864,7 +864,7 @@ local function CalculateMachinings( vProc, Part)
bAreAllApplyOk, _ = StrategyScript.Make( true, Proc, Part, Proc.ChosenStrategy.Parameters)
end
end
return vProc
return MACHININGS
end
-------------------------------------------------------------------------------------------------------------
@@ -929,7 +929,7 @@ local function IsCombinationAvailable( sCombination, nUnloadPos)
-- TODO scelta combinazione forzato DA RIMUOVERE!! Serve modifica al BEAM.
BEAM.BeamWall = true
BEAM.Rotation = {}
BEAM.Rotation.bStandard = true
BEAM.Rotation.bBasic = true
-- BASIC : posizione di scarico come posizionamento iniziale
if not BEAM.BeamWall or BEAM.Rotation.bBasic then
@@ -1044,9 +1044,13 @@ end
-- funzione che decide le combinazioni di rotazione per lavorare la trave
local function GetProcessingListFromCombination( BestCombination)
local vProc = {}
local bSomeFeatureDown = false
local bSomeFeatureSide = false
local nStartPosition = BestCombination.nIndexRotation
-- aggiungo processing da fare in fase ribaltata
if #BestCombination.Rot180 > 0 then
bSomeFeatureDown = true
for i = 1, #BestCombination.Rot180 do
BestCombination.Rot180[i].bDown = true
table.insert( vProc, BestCombination.Rot180[i])
@@ -1055,6 +1059,7 @@ local function GetProcessingListFromCombination( BestCombination)
-- aggiungo processing da fare in fase ruotata
if #BestCombination.Rot90 > 0 then
bSomeFeatureSide = true
for i = 1, #BestCombination.Rot90 do
BestCombination.Rot90[i].bSide = true
table.insert( vProc, BestCombination.Rot90[i])
@@ -1068,7 +1073,7 @@ local function GetProcessingListFromCombination( BestCombination)
end
end
return vProc
return vProc, nStartPosition, bSomeFeatureDown, bSomeFeatureSide
end
-------------------------------------------------------------------------------------------------------------
@@ -1247,8 +1252,9 @@ local function GetBestResultFromCombinationsMatrix( ProcessingsOnPart)
SingleCombination.nComplete = SingleCombination.nComplete + EgtIf( Data.bComplete, 1, 0)
SingleCombination.nNotComplete = SingleCombination.nNotComplete + EgtIf( Data.bNotComplete, 1, 0)
SingleCombination.nNotExecute = SingleCombination.nNotExecute + EgtIf( Data.bNotExecute, 1, 0)
SingleCombination.nIndexRotation = Data.nIndexRotation
else
SingleCombination.nNotExecute = SingleCombination.nNotExecute + 1
SingleCombination.nIndexRotation = SingleCombination.nNotExecute + 1
end
end
-- aggiungo rotazioni
@@ -1270,9 +1276,9 @@ local function GetBestResultFromCombinationsMatrix( ProcessingsOnPart)
WriteCombinationLog( CombinationsList, BestCombination)
end
local vFinalProc = GetProcessingListFromCombination( BestCombination)
local vFinalProc, nStartPosition, bSomeFeatureDown, bSomeFeatureSide = GetProcessingListFromCombination( BestCombination)
return vFinalProc
return vFinalProc, nStartPosition, bSomeFeatureDown, bSomeFeatureSide
end
-------------------------------------------------------------------------------------------------------------
@@ -1314,7 +1320,26 @@ function BeamExec.ProcessMachinings( PROCESSINGS, PARTS)
PROCESSINGS[nPart].Rotation[dRotIndex] = GetBestStrategy( PROCESSINGS[nPart].Rotation[dRotIndex])
end
-- si calcola la combinazione di lavorazione migliore
local vProc = GetBestResultFromCombinationsMatrix( PROCESSINGS[nPart])
local vProc, nStartPosition, bSomeFeatureDown, bSomeFeatureSide = GetBestResultFromCombinationsMatrix( PROCESSINGS[nPart])
-- debug
if EgtGetDebugLevel() >= 1 then
PrintFeatures( vProc, PARTS[nPart])
end
EgtOutLog( ' *** AddMachinings ***', 1)
-- ordino le features
vProc = OrderFeatures( vProc)
-- esegue le strategie migliori che ha precedentemente scelto e salva le lavorazioni nella lista globale
MACHININGS = CalculateMachinings( vProc, PARTS[nPart])
-- TODO riordinare lavorazioni ottimizzando cambio utensile/spezzone ecc..., mantenendo dipendenze definite prima
-- ordino le lavorazioni
-- MACHININGS = OrderMachining( MACHININGS, PARTS[nPart])
-- ruoto il pezzo in caso di cambio di fase finale
-- TODO se la posizioen di partenza cambia, devo ruotare il pezzo
-- aggiungo la fase, se non è la prima
if nOrd == 1 then
@@ -1328,24 +1353,47 @@ function BeamExec.ProcessMachinings( PROCESSINGS, PARTS)
EgtSetInfo( nDispId, 'ORD', nOrd)
EgtOutLog( ' *** Phase=' .. tostring( nPhase) .. ' Raw=' .. tostring( PARTS[nPart].idRaw) .. ' Part=' .. tostring( PARTS[nPart].id) .. ' ***', 1)
-- debug
if EgtGetDebugLevel() >= 1 then
PrintFeatures( vProc, PARTS[nPart])
-- creazione effettiva delle lavorazioni
-- se c'è almeno una lavorazione in posizionamento con trave ribaltata
if bSomeFeatureDown then
-- ribalto le travi della fase corrente
local nRId = PARTS[nPart].idRaw
while nRId do
EgtRotateRawPart( nRId, X_AX(), 180)
nRId = EgtGetNextRawPart( nRId)
end
EgtSetInfo( nDispId, 'ROT', -2)
MachiningLib.AddOperations( MACHININGS, PARTS[nPart], 'DOWN')
end
EgtOutLog( ' *** AddMachinings ***', 1)
-- se c'è almeno una lavorazione in posizionamento con trave ribaltata
if bSomeFeatureSide then
-- TODO se bSomeFeatureDown = true, allora devo creare altra fase. Altrimenti già creata da prima
-- devo sapere se c'è stata separazione, perchè devo scrivere MID o MID2, ritorno info da MachiningLib.AddOperations?
-- vettore movimento grezzi per rotazione di 90deg
-- TODO rivedere i calcoli. Non son sicuro che serve il bPreMove
local dDeltaYZ = EgtGetRawPartBBox( PARTS[nPart].idRaw):getDimY() - EgtGetRawPartBBox( PARTS[nPart].idRaw):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
local nRId = PARTS[nPart].idRaw
while nRId do
if bPreMove then EgtMoveRawPart( nRId, vtMove) end
EgtRotateRawPart( nRId, X_AX(), EgtIf( BeamData.RIGHT_LOAD, -90, 90))
if not bPreMove then EgtMoveRawPart( nRId, vtMove) end
nRId = EgtGetNextRawPart( nRId)
end
EgtSetInfo( nDispId, 'ROT', -1)
MachiningLib.AddOperations( MACHININGS, PARTS[nPart], 'SIDE')
end
-- TODO se bSomeFeatureDown or bSomeFeatureSide = true, allora devo creare altra fase. Altrimenti già creata da prima
-- devo sapere se c'è stata separazione, perchè devo scrivere END o END2, ritorno info da MachiningLib.AddOperations?
BeamLib.AddPhaseWithRawParts( PARTS[nPart].idRaw, BeamData.ptOriXR, BeamData.dPosXR, 0)
-- ordino le features
vProc = OrderFeatures( vProc)
-- esegue le strategie migliori che ha precedentemente scelto e salva le lavorazioni nella lista globale
CalculateMachinings( vProc, PARTS[nPart])
-- TODO riordinare lavorazioni ottimizzando cambio utensile/spezzone ecc..., mantenendo dipendenze definite prima
-- ordino le lavorazioni
-- OrderMachining( vProc, PARTS[nPart])
-- aggiunge effettivamente le lavorazioni
MachiningLib.AddOperations( vProc, PARTS[nPart])
-- aggiunta lavorazioni in ultima fase
MachiningLib.AddOperations( MACHININGS, PARTS[nPart], 'STD')
EgtOutLog( ' *** End AddMachinings ***', 1)
-- azzero lavorazioni per pezzo successivo