From 6649842c70b6f1bb228b71eafb7392d4383583d4 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Thu, 21 May 2026 10:49:28 +0200 Subject: [PATCH] - in NestProcess modifiche per nestare pezzi senza alternative --- NestProcess.lua | 119 ++++++++++++++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 45 deletions(-) diff --git a/NestProcess.lua b/NestProcess.lua index 0320427..a6fa8f0 100644 --- a/NestProcess.lua +++ b/NestProcess.lua @@ -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)