- in BeamExec e NestProcess correzioni varie per Nesting obliquo
- in NestProcess aggiunto dump in/out per debug
This commit is contained in:
+107
-5
@@ -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
|
||||
Reference in New Issue
Block a user