- in BeamExec e NestProcess correzioni varie per Nesting obliquo

- in NestProcess aggiunto dump in/out per debug
This commit is contained in:
luca.mazzoleni
2026-07-16 11:12:21 +02:00
parent 35dc783c10
commit 1a25ebff1a
3 changed files with 144 additions and 37 deletions
+107 -5
View File
@@ -538,6 +538,102 @@ local function CommitBestMove( BestMove)
Job.bNested = true
end
----------------------------------------------------------------------------------------------------------
-- Dump diagnostico Input/Output
function RawInventory:DumpNestingData()
EgtOutLog("\n##########################################################################################")
EgtOutLog("### EGALWARE NESTING - DIAGNOSTIC DUMP ###")
EgtOutLog("##########################################################################################\n")
-- 1. AMBIENTE & CONFIGURAZIONE
EgtOutLog("--- [1. NESTING ENVIRONMENT & PARAMETERS] ---")
EgtOutLog(string.format("NEST.STARTOFFSET = %s", tostring(NEST.STARTOFFSET)))
EgtOutLog(string.format("NEST.MATERIAL = %s", tostring(NEST.MATERIAL)))
EgtOutLog(string.format("NEST.MACHINE = %s", tostring(NEST.MACHINE)))
for k, v in pairs(CONFIG) do
EgtOutLog(string.format("CONFIG.%s = %s", tostring(k), tostring(v)))
end
-- 2. MATERIALE DISPONIBILE (STOCK)
EgtOutLog("\n--- [2. RAW STOCK INVENTORY INPUTS] ---")
for i = 1, #self.Stock do
EgtOutLog(string.format("Stock Index %d: Length = %.4f mm | Qty Available = %d", i, self.Stock[i].dLength, self.Stock[i].nCount))
end
-- 3. COMMESSA PEZZI RICHIESTI (DEMANDED PARTS)
EgtOutLog("\n--- [3. DEMANDED PARTS (PART TABLE)] ---")
for id, count in pairs(PART) do
local sInitialPos = tostring(EgtGetInfo(id, 'INITIALPOSITION', 'i') or 0)
local sManualRot = tostring(EgtGetInfo(id, 'MANUALROT', 'i') or 0)
local sManualFlip = tostring(EgtGetInfo(id, 'MANUALFLIP', 'i') or 0)
EgtOutLog(string.format("Part ID: %5s | Demand Count: %d | CAD Base Length: %.4f mm | InitialPos: %s | ManualRot: %s | ManualFlip: %s",
tostring(id), count, EgtGetInfo(id, 'L', 'd') or 0, sInitialPos, sManualRot, sManualFlip))
end
-- 4. DATABASE GEOMETRICO COMPLETO (PART TEMPLATES)
EgtOutLog("\n--- [4. DETAILED GEOMETRIC TEMPLATES (ALL READABLE STATES)] ---")
for id, Template in pairs(PartTemplates) do
if type(Template) == "table" and Template.dLength then
EgtOutLog(string.format("\nPART ID: %s | Math Length: %.4f | MaxGlobalTailRecess: %.4f", tostring(id), Template.dLength, Template.dMaxGlobalTailRecess))
for sState, State in pairs(Template.States) do
EgtOutLog(string.format(" -> State [%s]:", sState))
-- Stringhe Grezze lette dal CAD
EgtOutLog(string.format(" Raw ALT_H String: %s", tostring(EgtGetInfo(id, 'ALT'..sState..'_H'))))
EgtOutLog(string.format(" Raw ALT_T String: %s", tostring(EgtGetInfo(id, 'ALT'..sState..'_T'))))
-- Valori matematici interpretati dal Nesting
local hOX = table.concat(State.Head.OffsetX, ", ")
local tOX = table.concat(State.Tail.OffsetX, ", ")
EgtOutLog(string.format(" HEAD Math -> OffsetX: [%s] | vtN: [X:%.6f, Y:%.6f, Z:%.6f] | vtNXabs: %.6f | dMaxHeadRecess: %.4f",
hOX, State.Head.vtN:getX(), State.Head.vtN:getY(), State.Head.vtN:getZ(), State.Head.vtNXabs, State.dMaxHeadRecess))
EgtOutLog(string.format(" TAIL Math -> OffsetX: [%s] | vtN: [X:%.6f, Y:%.6f, Z:%.6f] | vtNXabs: %.6f | dMaxTailRecess: %.4f",
tOX, State.Tail.vtN:getX(), State.Tail.vtN:getY(), State.Tail.vtN:getZ(), State.Tail.vtNXabs, State.dMaxTailRecess))
end
end
end
-- 5. ANALISI DETTAGLIATA DELL'OUTPUT FINALE SULLE BARRE (ACTIVE BEAMS)
EgtOutLog("\n--- [5. FINAL NESTING SOLUTIONS AND SPATIAL COORDS] ---")
for i = 1, #self.ActiveBeams do
local Beam = self.ActiveBeams[i]
local dStartOffset = NEST.STARTOFFSET or 0
EgtOutLog(string.format("\n=========================================================================================="))
EgtOutLog(string.format("ACTIVE BEAM [%d] -> Total Length: %.4f mm | Nesting Residual Space: %.4f mm",
i, Beam.dTotalLength, Beam.dResidualLength))
EgtOutLog(string.format("=========================================================================================="))
-- Ordine di Nesting (dall'ultimo appoggio a destra fino a sinistra)
EgtOutLog(" A. Array Storage Order (Nesting Logic - from Right to Left):")
for j = 1, #Beam.NestedParts do
local Part = Beam.NestedParts[j]
EgtOutLog(string.format(" [%d] ID: %5s | State: %12s | Length: %9.4f | Math PosX: %9.4f | Overlap: %9.4f | SharedCut: %s",
j, tostring(Part.id), tostring(Part.sState), Part.dLength, Part.dPosX, Part.dSafeOverlap, tostring(Part.bSharedCut)))
end
-- Ordine di posizionamento sul Gruppo Macchina (da Sinistra X=0 a Destra)
EgtOutLog(" B. CAD Positioning Order (Output Macro - from Left X=0 to Right):")
local nIndex = 1
for j = #Beam.NestedParts, 1, -1 do
local Part = Beam.NestedParts[j]
local dPosX = Part.dPosX - Beam.dResidualLength + dStartOffset
-- Distanza dal pezzo precedente a sinistra (se esiste)
local sPrevDist = "N/A (First Part on Left)"
if j < #Beam.NestedParts then
local PrevPart = Beam.NestedParts[j+1]
local dPrevPosX = PrevPart.dPosX - Beam.dResidualLength + dStartOffset
sPrevDist = string.format("%.4f mm", dPosX - dPrevPosX)
end
EgtOutLog(string.format(" PART%d -> ID: %5s | Chosen State: %12s | CAD Target PosX: %9.4f mm | Gap from left: %s",
nIndex, tostring(Part.id), tostring(Part.sState), dPosX, sPrevDist))
nIndex = nIndex + 1
end
end
EgtOutLog("\n##########################################################################################")
EgtOutLog("### END OF DUMP ###")
EgtOutLog("##########################################################################################\n")
end
----------------------------------------------------------------------------------------------------------
-- script principale
@@ -633,7 +729,6 @@ for i = 1, #RawInventory.ActiveBeams do
for j = #Beam.NestedParts, 1, -1 do
local Part = Beam.NestedParts[j]
local nInitialPosition = EgtGetInfo( Part.id, 'INITIALPOSITION', 'i')
-- spostamento verso la testa della barra
local dPosX = Part.dPosX - Beam.dResidualLength + dStartOffset
@@ -647,8 +742,8 @@ for i = 1, #RawInventory.ActiveBeams do
end
-- eventuale rotazione
if ( EgtStartsWith( Part.sState, '0010') and nInitialPosition == 1)
or ( EgtStartsWith( Part.sState, '1000') and nInitialPosition == 3) then
local bIsRotationNeeded = EgtStartsWith( Part.sState, '0010')
if bIsRotationNeeded then
local idSurfTmBoxDuplo = EgtGetFirstNameInGroup( idDuplo, "Box")
local b3Duplo = EgtGetBBoxGlob( idSurfTmBoxDuplo, GDB_BB.STANDARD)
EgtRotate( idDuplo, b3Duplo:getCenter(), X_AX(), 180, GDB_RT.GLOB)
@@ -656,7 +751,9 @@ for i = 1, #RawInventory.ActiveBeams do
end
-- eventuale inversione
if EgtEndsWith( Part.sState, 'INV') then
-- TODO conta anche l'ordine rotazione-inversione?
local bIsInversionNeeded = EgtEndsWith( Part.sState, 'INV')
if bIsInversionNeeded then
local idSurfTmBoxDuplo = EgtGetFirstNameInGroup( idDuplo, "Box")
local b3Duplo = EgtGetBBoxGlob( idSurfTmBoxDuplo, GDB_BB.STANDARD)
EgtRotate( idDuplo, b3Duplo:getCenter(), Z_AX(), 180, GDB_RT.GLOB)
@@ -706,4 +803,9 @@ EgtResetCurrMachGroup()
NEST.ERR = 0
-- calcolo bontà soluzione
RawInventory:PrintDiagnosticReport()
RawInventory:PrintDiagnosticReport()
-- Dump diagnostico - solo per debug
if EgtGetDebugLevel() >= 3 then
RawInventory:DumpNestingData()
end