- in NestProcess modifiche per nestare pezzi senza alternative

This commit is contained in:
luca.mazzoleni
2026-05-21 10:49:28 +02:00
parent 27475763a2
commit 6649842c70
+74 -45
View File
@@ -188,7 +188,7 @@ end
-- JobPool (lista di tutti i singoli pezzi, multipli compresi, da nestare)
local PartTemplates = {}
function PartTemplates:GetInfoFromPart( id, sStateWithSide)
function PartTemplates:GetStateInfoFromPart( id, sStateWithSide)
local OffsetX = {}
local vtN
@@ -219,58 +219,84 @@ function PartTemplates:AddPart( id)
dMaxJobLength = self[id].dLength
end
local States = { '1000', '0010', '1000_INV', '0010_INV' }
-- info eventuali rotazioni / inversioni custom e forzature manuali
local bIsManualFlipRot = ( ( EgtGetInfo( id, 'MANUALROT', 'i') or 0) == 1) or ( ( EgtGetInfo( id, 'MANUALFLIP', 'i') or 0) == 1)
for _, sState in ipairs(States) do
local OffsetXHead, vtNHead = self:GetInfoFromPart( id, 'ALT' .. sState .. '_H')
local OffsetXTail, vtNTail = self:GetInfoFromPart( id, 'ALT' .. sState .. '_T')
if not bIsManualFlipRot then
if OffsetXHead or OffsetXTail then
local States = { '1000', '0010', '1000_INV', '0010_INV' }
if not OffsetXHead then
OffsetXHead = { 0, 0, 0, 0}
vtNHead = Vector3d( 1, 0, 0)
end
if not OffsetXTail then
OffsetXTail = { 0, 0, 0, 0}
vtNTail = Vector3d( -1, 0, 0)
end
for _, sState in ipairs(States) do
local OffsetXHead, vtNHead = self:GetStateInfoFromPart( id, 'ALT' .. sState .. '_H')
local OffsetXTail, vtNTail = self:GetStateInfoFromPart( id, 'ALT' .. sState .. '_T')
self[id].States[sState] = {}
local State = self[id].States[sState]
if OffsetXHead or OffsetXTail then
State.Head = {
OffsetX = OffsetXHead,
vtN = vtNHead,
vtNXabs = abs( vtNHead:getX())
}
State.Tail = {
OffsetX = OffsetXTail,
vtN = vtNTail,
vtNXabs = abs( vtNTail:getX())
}
-- overlap massimi in testa e in coda per questo pezzo
local dMaxHeadRecess = 0
for i = 1, 4 do
if State.Head.OffsetX[i] > dMaxHeadRecess + 10 * GEO.EPS_SMALL then
dMaxHeadRecess = State.Head.OffsetX[i]
if not OffsetXHead then
OffsetXHead = { 0, 0, 0, 0}
vtNHead = Vector3d( 1, 0, 0)
end
end
State.dMaxHeadRecess = dMaxHeadRecess
local dMaxTailRecess = 0
for i = 1, 4 do
if abs( State.Tail.OffsetX[i]) > dMaxTailRecess + 10 * GEO.EPS_SMALL then
dMaxTailRecess = abs( State.Tail.OffsetX[i])
if not OffsetXTail then
OffsetXTail = { 0, 0, 0, 0}
vtNTail = Vector3d( -1, 0, 0)
end
self[id].States[sState] = {}
local State = self[id].States[sState]
State.Head = {
OffsetX = OffsetXHead,
vtN = vtNHead,
vtNXabs = abs( vtNHead:getX())
}
State.Tail = {
OffsetX = OffsetXTail,
vtN = vtNTail,
vtNXabs = abs( vtNTail:getX())
}
-- overlap massimi in testa e in coda per questo pezzo
local dMaxHeadRecess = 0
for i = 1, 4 do
if State.Head.OffsetX[i] > dMaxHeadRecess + 10 * GEO.EPS_SMALL then
dMaxHeadRecess = State.Head.OffsetX[i]
end
end
State.dMaxHeadRecess = dMaxHeadRecess
local dMaxTailRecess = 0
for i = 1, 4 do
if abs( State.Tail.OffsetX[i]) > dMaxTailRecess + 10 * GEO.EPS_SMALL then
dMaxTailRecess = abs( State.Tail.OffsetX[i])
end
end
State.dMaxTailRecess = dMaxTailRecess
if dMaxTailRecess > self[id].dMaxGlobalTailRecess + 10 * GEO.EPS_SMALL then
self[id].dMaxGlobalTailRecess = dMaxTailRecess
end
end
State.dMaxTailRecess = dMaxTailRecess
if dMaxTailRecess > self[id].dMaxGlobalTailRecess + 10 * GEO.EPS_SMALL then
self[id].dMaxGlobalTailRecess = dMaxTailRecess
end
end
end
-- se nessuna alternativa stato fisso
if not next( self[id].States) then
self[id].States['FIXED'] = {}
local State = self[id].States['FIXED']
State.Head = {
OffsetX = { 0, 0, 0, 0},
vtN = Vector3d( 1, 0, 0),
vtNXabs = 1
}
State.Tail = {
OffsetX = { 0, 0, 0, 0},
vtN = Vector3d( -1, 0, 0),
vtNXabs = 1
}
State.dMaxHeadRecess = 0
State.dMaxTailRecess = 0
end
end
-- ordinamento JobPool per lunghezza decrescente dei pezzi
@@ -318,8 +344,11 @@ local function CalculateMove( Beam, dPartLength, sState, State)
end
end
-- il massimo overlap va ridotto dello spessore lama
local dProjectedBlade = CONFIG.BLADE_THICKNESS / min( Beam.vtNXabs, State.Tail.vtNXabs)
-- Il massimo overlap va ridotto dello spessore lama solo se ci sono già altri pezzi sulla barra
local dProjectedBlade = 0
if #Beam.NestedParts > 0 then
dProjectedBlade = CONFIG.BLADE_THICKNESS / min( Beam.vtNXabs, State.Tail.vtNXabs)
end
dSafeOverlap = dSafeOverlap - dProjectedBlade
-- lunghezza barra rimasta (se negativo non ci sta)