From a3a29dc5bf160d1c227444d48d7de7c76f31b2ba Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Thu, 23 Oct 2025 10:15:42 +0200 Subject: [PATCH] - Feature taglio di testa e coda rinominate con 'StartCut' e 'EndCut' - Migliorata gestione tagli testa e coda - Log result scrivono indici dettagliati per voto feature - Piccole sistemazioni varie --- LuaLibs/BeamExec.lua | 12 +--- LuaLibs/BeamLib.lua | 4 +- LuaLibs/FaceData.lua | 6 +- LuaLibs/FeatureLib.lua | 1 + LuaLibs/Logs.lua | 79 +++++++------------------ LuaLibs/MachiningLib.lua | 16 +++-- Strategies/Standard/HEADCUT/HEADCUT.lua | 3 + Strategies/Standard/STR0002/STR0002.lua | 1 - Strategies/Standard/STR0011/STR0011.lua | 3 + Strategies/Standard/STR0015/STR0015.lua | 2 +- Strategies/Standard/TAILCUT/TAILCUT.lua | 2 + 11 files changed, 50 insertions(+), 79 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 88c4b9d..8501abc 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -769,7 +769,7 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, Part) -- non si controlla la feature con se stessa o se feature disabilitata if i ~= j and ProcB.nFlg ~= 0 then -- verifico se il taglio aggiunto manualmente può essere saltato perchè nella stessa posizione c'è un altro taglio di testa - if ID.IsHeadCut( Proc) and ( ID.IsHeadCut( ProcB) and EgtGetName( ProcB.id) == 'StartCut') then + if ID.IsHeadCut( Proc) and ( ID.IsHeadCut( ProcB) and EgtGetInfo( ProcB.id, 'HEAD_ADD_CUT', 'i') == 1) then if not Proc.SlaveProcIndexes then Proc.SlaveProcIndexes = {} end @@ -778,7 +778,7 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, Part) ProcB.nFlg = 0 end -- verifico se il taglio aggiunto manualmente può essere saltato perchè nella stessa posizione c'è un altro taglio di coda - if ID.IsTailCut( Proc) and ( ID.IsTailCut( ProcB) and EgtGetName( ProcB.id) == 'EndCut') then + if ID.IsTailCut( Proc) and ( ID.IsTailCut( ProcB) and EgtGetInfo( ProcB.id, 'HEAD_ADD_CUT', 'i') == 1) then if not Proc.SlaveProcIndexes then Proc.SlaveProcIndexes = {} end @@ -948,7 +948,7 @@ local function CalculateStrategies( vProcSingleRot, Part) -- TODO da capire se dare un tempo molto alto oppure se dare errore perchè non deve mai capitare. Per ora si setta tempo alto -- se tempo non calcolato, si setta un tempo molto alto, 99 minuti - if not Proc.AvailableStrategies[nIndexCurrentStrategy].Result.dTimeToMachine then + if not Proc.AvailableStrategies[nIndexCurrentStrategy].Result.dTimeToMachine or Proc.AvailableStrategies[nIndexCurrentStrategy].Result.dTimeToMachine == 0 then Proc.AvailableStrategies[nIndexCurrentStrategy].Result.dTimeToMachine = 99 end @@ -1416,12 +1416,6 @@ local function GetCombinationListFromMatrix( ProcessingsOnPart, PartInfo) local BestCombination = {} local CombinationsList = { dAllCombinationsTotalTime = 0} - -- - -- scrittura nel log della matrice delle rotazioni - --if EgtGetDebugLevel() >= 3 then - -- Logs.WriteMatrixLog( ProcessingsOnPart, PartInfo) - --end - -- calcolo per tutte le combinazioni disponibili precedentemente verificate for i = 1, #PartInfo.CombinationList do local bRot90, bRot180 diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index 350a6e6..79cd6d0 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -33,7 +33,7 @@ function BeamLib.AddPartStartFace( PartId, b3Solid) return false, sErr end -- applico gli opportuni attributi di feature - EgtSetName( nStmId, 'StartCut') + EgtSetInfo( nStmId, 'HEAD_ADD_CUT', 1) EgtSetInfo( nStmId, 'GRP', 1) EgtSetInfo( nStmId, 'PRC', 10) -- ex 340 @@ -58,7 +58,7 @@ function BeamLib.AddPartEndFace( PartId, b3Solid) return false, sErr end -- applico gli opportuni attributi di feature - EgtSetName( nStmId, 'EndCut') + EgtSetInfo( nStmId, 'HEAD_ADD_CUT', 1) EgtSetInfo( nStmId, 'GRP', 2) EgtSetInfo( nStmId, 'PRC', 10) -- ex 350 diff --git a/LuaLibs/FaceData.lua b/LuaLibs/FaceData.lua index 3476b4e..37084a3 100644 --- a/LuaLibs/FaceData.lua +++ b/LuaLibs/FaceData.lua @@ -355,7 +355,9 @@ local function GetBottomFaces( Proc) or Proc.Topology.sFamily == 'Pocket' or Proc.Topology.sFamily == 'Bevel' or Proc.Topology.sFamily == 'DoubleBevel' - or Proc.Topology.sFamily == 'Cut') then + or Proc.Topology.sFamily == 'Cut' + or Proc.Topology.sFamily == 'HeadCut' + or Proc.Topology.sFamily == 'TailCut') then error( 'GetBottomFace : Topology not implemented') end @@ -657,7 +659,7 @@ function FaceData.GetMainFaces( Proc, Part) -- CASO 1 : Feature tipo LapJoint if Proc.Topology.sFamily == 'Rabbet' or Proc.Topology.sFamily == 'VGroove' or Proc.Topology.sFamily == 'Groove' or Proc.Topology.sFamily == 'Pocket' or Proc.Topology.sFamily == 'Tunnel' or Proc.Topology.sFamily == 'Bevel' or - Proc.Topology.sFamily == 'DoubleBevel' or Proc.Topology.sFamily == 'Cut' then + Proc.Topology.sFamily == 'DoubleBevel' or Proc.Topology.sFamily == 'Cut' or Proc.Topology.sFamily == 'HeadCut' or Proc.Topology.sFamily == 'TailCut' then if ( Proc.Topology.bIsThrough and Proc.Topology.bAllRightAngles and Proc.nFct < 5) or ( Proc.nFct == 1) or Proc.Topology.sName == 'Bevel-2-Blind' then diff --git a/LuaLibs/FeatureLib.lua b/LuaLibs/FeatureLib.lua index a1bd117..54c0855 100644 --- a/LuaLibs/FeatureLib.lua +++ b/LuaLibs/FeatureLib.lua @@ -706,6 +706,7 @@ function FeatureLib.CalculateStrategiesCompositeRating( AvailableStrategies, sMa if AvailableStrategies[n].Result and AvailableStrategies[n].Result.dQuality and AvailableStrategies[n].Result.dCompletionIndex and AvailableStrategies[n].Result.dTimeToMachine then -- il tempo è pesato sul totale delle strategie, e riportato nell'intervallo 1-5, dove 5 è il tempo migliore (il più basso) local dIndexWeightTimeToMachine = 5 - ( 4 * ( EgtClamp( AvailableStrategies[n].Result.dTimeToMachine / AvailableStrategies.dAllStrategiesTotalTime, 0, 1))) + AvailableStrategies[n].Result.dTimeIndex = dIndexWeightTimeToMachine -- si calcolano gli indici pesati in base alla configurazione utente. Possibili parametri di configurazione: local dQuality, dCompletion, dTime, dCoeffQuality, dCoeffCompletion, dCoeffTime diff --git a/LuaLibs/Logs.lua b/LuaLibs/Logs.lua index 841f361..1f2c849 100644 --- a/LuaLibs/Logs.lua +++ b/LuaLibs/Logs.lua @@ -22,7 +22,7 @@ function Logs.WriteFeaturesLog( ProcessingsOnPart, PartInfo) EgtOutLog( ' === === === === === === === === === === === === === === === === === === === === === === === === === === ===') EgtOutLog( ' === === === === === === === === FEATURES STRATEGIES PIECE INVERTED === === === === === === === === === ===') end - EgtOutLog( ' Feature ID | BTL POSITION | 90 ROTATION | 180 ROTATION | 270 ROTATION |') + EgtOutLog( ' Feature ID | BTL POSITION | 90 ROTATION | 180 ROTATION | 270 ROTATION |') EgtOutLog( '----------------------------------------------------------------------------------------------------------') local nProcessingsNumber @@ -69,36 +69,44 @@ function Logs.WriteFeaturesLog( ProcessingsOnPart, PartInfo) if ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result then -- leggo lo stato della strategia per aggiungere un suffisso local sStatusStrategy = ' ' + local sIndexes, sRating = '', '' if not ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.sStatus or ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.sStatus == 'Not-Applicable' then sStatusStrategy = 'N' - elseif ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.sStatus == 'Completed' then - sStatusStrategy = 'C' - elseif ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.sStatus == 'Not-Completed' then - sStatusStrategy = 'P' + sRating = '----' + sIndexes = ' (C:---|Q:---|T:---)' + else + if ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.sStatus == 'Completed' then + sStatusStrategy = 'C' + elseif ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.sStatus == 'Not-Completed' then + sStatusStrategy = 'P' + end + sRating = EgtNumToString( ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.dCompositeRating, -1) + sIndexes = ' (C:'.. EgtNumToString( ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.dCompletionIndex, -1).. + '|Q:'.. EgtNumToString( ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.dQuality, -1).. + '|T:'.. EgtNumToString( ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.dTimeIndex, -1)..')' end -- se c'è una chosen strategy, si aggiunge prefisso '*' per indicare nel log qual è la strategia che è stata scelta local nIndexBestStrategy = ProcessingsOnPart.Rotation[nRotLog][ProcLog].nIndexBestStrategy or 0 - local dRating = EgtNumToString( ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].Result.dCompositeRating, -1) - local sLogLineProc = EgtIf( nIndexBestStrategy == nCountStrategies, '*', '') .. dRating ..' (' .. + local sLogLineProc = EgtIf( nIndexBestStrategy == nCountStrategies, '*', '') .. sRating .. sIndexes .. ' (' .. tostring( ProcessingsOnPart.Rotation[nRotLog][ProcLog].AvailableStrategies[nCountStrategies].sStrategyId) .. ')' .. - sStatusStrategy .. ' |' - while string.len( sLogLineProc) <= 20 do + sStatusStrategy .. ' |' + while string.len( sLogLineProc) <= 38 do sLogLineProc = ' ' .. sLogLineProc end sLogLine = sLogLine .. sLogLineProc else - sLogLine = sLogLine .. ' 0 (STR----)- |' + sLogLine = sLogLine .. ' 0 (STR----)- |' end else - sLogLine = sLogLine .. ' |' + sLogLine = sLogLine .. ' |' end -- rotazione non presa in considerazione else if nCountStrategies == 1 then - sLogLine = sLogLine .. ' ---------- |' + sLogLine = sLogLine .. ' ---------- |' else - sLogLine = sLogLine .. ' |' + sLogLine = sLogLine .. ' |' end end end @@ -111,51 +119,6 @@ function Logs.WriteFeaturesLog( ProcessingsOnPart, PartInfo) end end -------------------------------------------------------------------------------------------------------------- -function Logs.WriteMatrixLog( ProcessingsOnPart, PartInfo) - EgtOutLog( ' === === === === === === === === === === ROTATION MATRIX === === === === === === === === === === === === ===') - EgtOutLog( ' Feature ID | BTL POSITION | 90 ROTATION | 180 ROTATION | 270 ROTATION |') - EgtOutLog( '----------------------------------------------------------------------------------------------------------') - - local nProcessingsNumber - local nFirstAvailableRotation - -- ricerco prima rotazione effettivamente calcolata. In genere è sempre la prima - for i = 1, 4 do - if PartInfo.CombinationList.Rotations[i] == 1 then - nProcessingsNumber = #ProcessingsOnPart.Rotation[i] - nFirstAvailableRotation = i - break - end - end - - for ProcLog = 1, nProcessingsNumber do - local sLogLine = ' ' .. tostring( ProcessingsOnPart.Rotation[nFirstAvailableRotation][ProcLog].id) - while string.len( sLogLine) <= 20 do - sLogLine = sLogLine .. ' ' - end - sLogLine = sLogLine .. '|' - for nRotLog = 1, 4 do - if PartInfo.CombinationList.Rotations[nRotLog] == 1 then - if ProcessingsOnPart.Rotation[nRotLog][ProcLog].ChosenStrategy then - local sStatusStrategy = EgtIf( ProcessingsOnPart.Rotation[nRotLog][ProcLog].ChosenStrategy.Result.sStatus == 'Completed', 'C', 'P') - local dRating = EgtNumToString( ProcessingsOnPart.Rotation[nRotLog][ProcLog].ChosenStrategy.Result.dCompositeRating, -1) - local sLogLineProc = dRating .. ' (' .. tostring( ProcessingsOnPart.Rotation[nRotLog][ProcLog].ChosenStrategy.sStrategyId) .. ')' .. sStatusStrategy .. ' |' - while string.len( sLogLineProc) <= 20 do - sLogLineProc = ' ' .. sLogLineProc - end - sLogLine = sLogLine .. sLogLineProc - else - sLogLine = sLogLine .. ' 0 (STR----)- |' - end - else - sLogLine = sLogLine .. ' ---------- |' - end - end - EgtOutLog( sLogLine) - end - EgtOutLog( '----------------------------------------------------------------------------------------------------------') -end - ------------------------------------------------------------------------------------------------------------- function Logs.WriteCombinationLog( CombinationsList, BestCombination) EgtOutLog( ' === === === === === === === === === === COMBINATIONS === === === === === === ') diff --git a/LuaLibs/MachiningLib.lua b/LuaLibs/MachiningLib.lua index 0e32302..e584400 100644 --- a/LuaLibs/MachiningLib.lua +++ b/LuaLibs/MachiningLib.lua @@ -238,8 +238,8 @@ local function GetIndexToolInAvailableToolList( AvailableToolList, sToolName) return nIndex end end - -- se non trovato (dovrebbe essere impossibile dato che è già stato escluso dai controlli iniziali) ritorna un indice altissimo - return 9999 + -- se non trovato + return nil end ------------------------------------------------------------------------------------------------------------- @@ -345,7 +345,8 @@ function MachiningLib.FindMill( Proc, ToolSearchParameters) if dBestToolResidualDepth <= 0 and dCurrentResidualDepth <= 0 then -- se è presente una lista di utensili disponibili, si prende quello che arriva primo in quella lista if ToolSearchParameters.AvailableToolList and ToolSearchParameters.AvailableToolList.bRespectListOrder then - if GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) < + if GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) and + GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) < GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[nBestToolIndex].sName) then nBestToolIndex = i dBestToolResidualDepth = dCurrentResidualDepth @@ -449,7 +450,8 @@ function MachiningLib.FindBlade( Proc, ToolSearchParameters) if dBestToolResidualDepth <= 10 * GEO.EPS_SMALL and dCurrentResidualDepth <= 10 * GEO.EPS_SMALL then -- se è presente una lista di utensili disponibili, si prende quello che arriva primo in quella lista if ToolSearchParameters.AvailableToolList and ToolSearchParameters.AvailableToolList.bRespectListOrder then - if GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) < + if GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) and + GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) < GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[nBestToolIndex].sName) then nBestToolIndex = i dBestToolResidualDepth = dCurrentResidualDepth @@ -560,7 +562,8 @@ function MachiningLib.FindDrill( Proc, ToolSearchParameters) dBestToolResidualDepth = dCurrentResidualDepth -- se è presente una lista di utensili disponibili, si prende quello che arriva primo in quella lista elseif ToolSearchParameters.AvailableToolList and ToolSearchParameters.AvailableToolList.bRespectListOrder then - if GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) < + if GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) and + GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) < GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[nBestToolIndex].sName) then nBestToolIndex = i dBestToolResidualDepth = dCurrentResidualDepth @@ -660,7 +663,8 @@ function MachiningLib.FindChainSaw( Proc, ToolSearchParameters) if dBestToolResidualDepth <= 0 and dCurrentResidualDepth <= 0 then -- se è presente una lista di utensili disponibili, si prende quello che arriva primo in quella lista if ToolSearchParameters.AvailableToolList and ToolSearchParameters.AvailableToolList.bRespectListOrder then - if GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) < + if GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) and + GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[i].sName) < GetIndexToolInAvailableToolList( ToolSearchParameters.AvailableToolList, TOOLS[nBestToolIndex].sName) then nBestToolIndex = i dBestToolResidualDepth = dCurrentResidualDepth diff --git a/Strategies/Standard/HEADCUT/HEADCUT.lua b/Strategies/Standard/HEADCUT/HEADCUT.lua index ef3f568..3524c2c 100644 --- a/Strategies/Standard/HEADCUT/HEADCUT.lua +++ b/Strategies/Standard/HEADCUT/HEADCUT.lua @@ -57,6 +57,9 @@ function HEADCUT.Make( bAddMachining, Proc, Part, CustomParameters) -- se devo applicare le lavorazioni if bAddMachining then + -- si forza il nome della feature + EgtSetName( Proc.id, 'StartCut') + -- inserimento smussi su spigoli del taglio if Strategy.Parameters.bMakeChamfer then MakeChamfer() diff --git a/Strategies/Standard/STR0002/STR0002.lua b/Strategies/Standard/STR0002/STR0002.lua index d47f3a6..e81deb4 100644 --- a/Strategies/Standard/STR0002/STR0002.lua +++ b/Strategies/Standard/STR0002/STR0002.lua @@ -161,7 +161,6 @@ local function GetBestPocketingStrategy( Proc) or Proc.Topology.sName == 'Bevel-1-Through' then ToolSearchParameters.sType = 'MILL_NOTIP' - ToolSearchParameters.dMaxToolDiameter = 9999 else return nil end diff --git a/Strategies/Standard/STR0011/STR0011.lua b/Strategies/Standard/STR0011/STR0011.lua index 310ad98..d845e23 100644 --- a/Strategies/Standard/STR0011/STR0011.lua +++ b/Strategies/Standard/STR0011/STR0011.lua @@ -82,6 +82,9 @@ local function GetDrillingStrategy( Proc, Part) Strategy.Result.dMRR = MachiningLib.GetToolMRR( Machining[1].ToolInfo or Machining[2].ToolInfo) Strategy.Result.dQuality = FeatureLib.GetStrategyQuality( 'FINE') -- se non completo, anche se fosse foro singolo, comunque non esce dall'altra parte, quindi non scheggia end + else + local sMessage = 'Drillbit not found' + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( sMessage) end -- se lavorazione verticale else diff --git a/Strategies/Standard/STR0015/STR0015.lua b/Strategies/Standard/STR0015/STR0015.lua index 2f9432e..c53cff6 100644 --- a/Strategies/Standard/STR0015/STR0015.lua +++ b/Strategies/Standard/STR0015/STR0015.lua @@ -26,7 +26,7 @@ local function GetEdgeToMachine( Proc, idFace, vtEdge) local Edge local dBestEdgeAngle = 999 for i = 1, #Proc.Faces[idFace].Edges do - local dAngle = abs( GetAngle( Proc.Faces[idFace].Edges[i].vtN, vtEdge)) + local dAngle = abs( GetAngle( Proc.Faces[idFace].Edges[i].vtN, vtEdge) or 999) if dAngle < dBestEdgeAngle then dBestEdgeAngle = dAngle Edge = Proc.Faces[idFace].Edges[i] diff --git a/Strategies/Standard/TAILCUT/TAILCUT.lua b/Strategies/Standard/TAILCUT/TAILCUT.lua index 35ad718..7a911d7 100644 --- a/Strategies/Standard/TAILCUT/TAILCUT.lua +++ b/Strategies/Standard/TAILCUT/TAILCUT.lua @@ -74,6 +74,8 @@ function TAILCUT.Make( bAddMachining, Proc, Part, CustomParameters) -- se devo applicare le lavorazioni if bAddMachining then + -- si forza il nome della feature + EgtSetName( Proc.id, 'EndCut') -- inserimento smussi su spigoli del taglio if Strategy.Parameters.bMakeChamfer then