From fb68dd28a0f88fdd6cac5b9c7e8fa30cf6863b8c Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Fri, 28 Mar 2025 18:47:21 +0100 Subject: [PATCH] =?UTF-8?q?-=20creata=20funzione=20GetStrategyResult=20per?= =?UTF-8?q?=20restituzione=20risultati=20e=20varie=20modifiche=20relative?= =?UTF-8?q?=20-=20uniformata=20la=20restituzione=20dei=20risultati=20in=20?= =?UTF-8?q?caso=20di=20strategia=20non=20applicabile=20(FeatureLib.GetStra?= =?UTF-8?q?tegyResultNotApplicable,=20a=20cui=20si=20pu=C3=B2=20passare=20?= =?UTF-8?q?il=20messaggio=20da=20ritornare)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/BeamExec.lua | 7 +- LuaLibs/FeatureLib.lua | 17 ++++ Strategies/Standard/HEADCUT/HEADCUT.lua | 14 +-- Strategies/Standard/STR0001/STR0001.lua | 9 +- Strategies/Standard/STR0002/STR0002.lua | 13 +-- Strategies/Standard/STR0003/STR0003.lua | 11 +-- Strategies/Standard/STR0004/STR0004.lua | 8 +- Strategies/Standard/STR0005/STR0005.lua | 16 ++-- Strategies/Standard/STR0006/STR0006.lua | 7 +- Strategies/Standard/STR0007/STR0007.lua | 7 +- Strategies/Standard/STR0008/STR0008.lua | 15 +-- Strategies/Standard/TAILCUT/TAILCUT.lua | 1 + StrategyLibs/BLADEKEEPWASTE.lua | 121 ++++++++++++++++++------ StrategyLibs/BLADETOWASTE.lua | 15 ++- StrategyLibs/FACEBYBLADE.lua | 2 +- StrategyLibs/FACEBYCHAINSAW.lua | 2 +- StrategyLibs/FACEBYMILL.lua | 2 +- StrategyLibs/SPLITCUT.lua | 14 +-- 18 files changed, 169 insertions(+), 112 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 9e83768..2863a84 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -133,6 +133,7 @@ function BeamExec.GetToolsFromDB() if not Tool.SetupInfo.dMaxMatDecrease then Tool.SetupInfo.dMaxMatDecrease = 0 end + Tool.nQuality = 1 Tool.sUUID = EgtTdbGetCurrToolParam( MCH_TP.UUID) Tool.sUserNotes = EgtTdbGetCurrToolParam( MCH_TP.USERNOTES) Tool.dMaxDepth = EgtTdbGetCurrToolMaxDepth() or Tool.dMaxMaterial @@ -161,13 +162,15 @@ function BeamExec.GetToolsFromDB() Tool.dSideStep = EgtGetValInNotes( Tool.sUserNotes, 'SIDESTEP', 'd') or floor( Tool.dDiameter / 3) -- se non settato nell'utensile, considero un terzo del diametro Tool.bIsPen = abs( Tool.dSpeed) < 5 Tool.dPerformanceIndex = ( Tool.dDiameter * Tool.dMaxMaterial) / Tool.dLength + Tool.nQuality = 4 -- recupero parametri propri delle lame elseif sToolFamily == 'SAWBLADE' then Tool.bIsUsedForLongCut = EgtGetValInNotes( Tool.sUserNotes, 'LONGCUT') == 1 or false -- false come valore di default Tool.dStep = EgtGetValInNotes( Tool.sUserNotes, 'STEP', 'd') or Tool.dThickness -- se non settato nell'utensile, considero lo spessore lama Tool.dSideStep = EgtGetValInNotes( Tool.sUserNotes, 'SIDESTEP', 'd') or Tool.dMaxMaterial -- se non settato nell'utensile, considero un quarto del diametro Tool.dPerformanceIndex = 1 / ( Tool.dDiameter * Tool.dLength) - -- recupero parametri propri delle motoseghe + Tool.nQuality = 5 + -- recupero parametri propri delle motoseghe elseif sToolFamily == 'MORTISE' then Tool.dDistance = EgtTdbGetCurrToolParam( MCH_TP.DIST) or 90 -- 90mm dimensione standard aggregato catena Tool.bIsMortise = EgtGetValInNotes( Tool.sUserNotes, 'MORTISE') == 1 @@ -177,10 +180,12 @@ function BeamExec.GetToolsFromDB() Tool.dCornerRadius = EgtTdbGetCurrToolParam( MCH_TP.CORNRAD) Tool.dWidth = Tool.dDiameter Tool.dPerformanceIndex = 1 / Tool.dLength + Tool.nQuality = 2 end -- drillbit else Tool.dPerformanceIndex = Tool.dDiameter / Tool.dLength + Tool.nQuality = 4 end -- se tutti i dati necessari sono disponibili, inserisco utensile nella lista globale degli utensili disponibili diff --git a/LuaLibs/FeatureLib.lua b/LuaLibs/FeatureLib.lua index 4c7693e..0339f08 100644 --- a/LuaLibs/FeatureLib.lua +++ b/LuaLibs/FeatureLib.lua @@ -489,6 +489,23 @@ function FeatureLib.GetFeatureQuality( sTypeTools) return nQuality end +------------------------------------------------------------------------------------------------------------- +function FeatureLib.GetStrategyResultNotApplicable( sInfo) + local Result = {} + if not type( sInfo) == "string" then + sInfo = '' + end + + Result.dMRR = 0 + Result.dCompletionPercentage = 0 + Result.sStatus = 'Not-Applicable' + Result.nCompletionIndex = 0 + Result.nQuality = 0 + Result.sInfo = sInfo + + return Result +end + ------------------------------------------------------------------------------------------------------------- -- TODO rivedere affidabilità del calcolo del composite rating -- funzione che calcola il 'CompositeRating' di ogni strategia diff --git a/Strategies/Standard/HEADCUT/HEADCUT.lua b/Strategies/Standard/HEADCUT/HEADCUT.lua index 416e93e..f3fc1be 100644 --- a/Strategies/Standard/HEADCUT/HEADCUT.lua +++ b/Strategies/Standard/HEADCUT/HEADCUT.lua @@ -164,7 +164,7 @@ local function GetSplitStrategy( Proc, Part) -- TODO considerare di tagliare con il massimo materiale possibile per non salire troppo in Z (macchine tipo PF), oppure non scendere troppo (tipo Kairos) -- BladeSideSingle (taglio di lama singolo di fianco) if Machining[1].bIsApplicable and ( dMaxMatBladeSideSingle - BeamData.CUT_EXTRA) > Part.dWidth + 10 * GEO.EPS_SMALL then - Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Strategy.Result.nQuality = TOOLS[Splitting.ToolInfo.nToolIndex].nQuality Machining.sTypeMachining = 'BladeSideSingle' Machining[2].bIsApplicable = false Machining[3].bIsApplicable = false @@ -173,7 +173,7 @@ local function GetSplitStrategy( Proc, Part) -- TODO considerare di tagliare con il massimo materiale possibile per non salire troppo in Z (macchine tipo PF), oppure non scendere troppo (tipo Kairos) -- BladeSideDouble (taglio di lama doppio di fianco) elseif Machining[1].bIsApplicable and ( dMaxMatBladeSideDouble - BeamData.CUT_EXTRA) > Part.dWidth + 10 * GEO.EPS_SMALL then - Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Strategy.Result.nQuality = TOOLS[Splitting.ToolInfo.nToolIndex].nQuality Strategy.Result.dMRR = Strategy.Result.dMRR/2 Machining.sTypeMachining = 'BladeSideDouble' Machining[2].bIsApplicable = false @@ -182,7 +182,7 @@ local function GetSplitStrategy( Proc, Part) return Machining -- BladeHorizontalSingle (taglio di lama singolo orizzontale) elseif Machining[1].bIsApplicable and ( dMaxMatBladeHorizontalSingle - BeamData.CUT_EXTRA) > Part.dHeight + 10 * GEO.EPS_SMALL then - Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Strategy.Result.nQuality = TOOLS[Splitting.ToolInfo.nToolIndex].nQuality Machining.sTypeMachining = 'BladeHorizontalSingle' Machining[2].bIsApplicable = false Machining[3].bIsApplicable = false @@ -191,7 +191,7 @@ local function GetSplitStrategy( Proc, Part) -- BladeHorizontalDouble (taglio di lama doppio orizzontale) elseif Machining[1].bIsApplicable and Machining[2].bIsApplicable and ( dMaxMatBladeHorizontalSingle + dMaxMatBladeHorizontalDouble - BeamData.CUT_EXTRA) > Part.dHeight + 10 * GEO.EPS_SMALL then - Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Strategy.Result.nQuality = TOOLS[Splitting.ToolInfo.nToolIndex].nQuality Strategy.Result.dMRR = Strategy.Result.dMRR/2 Machining.sTypeMachining = 'BladeHorizontalDouble' Machining[1].ToolInfo.dMaxMatBladeFromTop = dMaxMatBladeHorizontalSingle @@ -210,11 +210,7 @@ local function GetSplitStrategy( Proc, Part) -- se non ho trovato neanche una lavorazione completa, non posso separare if Machining.sTypeMachining == 'None' then - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.nCompletionIndex = 0 - Strategy.Result.dMRR = 0 - Strategy.Result.nQuality = 0 - Strategy.Result.sInfo = 'Split not possible' + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Split not possible') end return Machining diff --git a/Strategies/Standard/STR0001/STR0001.lua b/Strategies/Standard/STR0001/STR0001.lua index 731b750..634d9bc 100644 --- a/Strategies/Standard/STR0001/STR0001.lua +++ b/Strategies/Standard/STR0001/STR0001.lua @@ -129,7 +129,7 @@ function GetTenonStrategy( Proc, Part) else Result.Pocketing.sStatus = 'Not-Completed' Result.Pocketing.sInfo = 'Tenon not complete, left ' .. ceil( Machining.Pocketing.ToolInfo.dResidualDepth) .. 'mm' - Result.Pocketing.dCompletionPercentage = ( Machining.Pocketing.ToolInfo.dResidualDepth * 100) / Proc.dDTLength + Result.Pocketing.dCompletionPercentage = ( 1 - Machining.Pocketing.ToolInfo.dResidualDepth / Proc.dDTLength) * 100 end end end @@ -165,6 +165,7 @@ function GetFeatureRotationIndex( Proc) end ------------------------------------------------------------------------------------------------------------- +-- TODO vedere se leggere direttamente la quality dell'utensile e mediarle nel caso di utensile doppio function GetTenonMachiningResult( Proc, Result) local TotalResult = {} -- setto il risultato in base agli utensili trovati @@ -185,11 +186,7 @@ function GetTenonMachiningResult( Proc, Result) TotalResult.sInfo = 'Tenon not completed' -- strategia non applicabile, manca il taglio di lama sulla lunghezza del tenone else - TotalResult.sStatus = 'Not-Applicable' - TotalResult.nCompletionIndex = 0 - TotalResult.dMRR = 0 - TotalResult.nQuality = 0 - TotalResult.sInfo = 'Error on Tenon cutting' + TotalResult = FeatureLib.GetStrategyResultNotApplicable( 'Error on Tenon cutting') end return TotalResult end diff --git a/Strategies/Standard/STR0002/STR0002.lua b/Strategies/Standard/STR0002/STR0002.lua index bdd506e..1dcfd8e 100644 --- a/Strategies/Standard/STR0002/STR0002.lua +++ b/Strategies/Standard/STR0002/STR0002.lua @@ -80,6 +80,7 @@ local function CalcMachinedPercentage( Proc, Machining) end ------------------------------------------------------------------------------------------------------------- +-- TODO vedere se sostituire GetFeatureQuality con valore da utensile; MillOnAggregate che qualità ha? da gestire in info utensile local function GetBestPocketingStrategy( Proc) -- imposto parametri di ricerca utensile in base a topologia local Machining = {} @@ -338,11 +339,7 @@ local function GetBestPocketingStrategy( Proc) -- se non ho trovato neanche una lavorazione if Machining.sTypeMachining == 'None' then - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.nCompletionIndex = 0 - Strategy.Result.dMRR = 0 - Strategy.Result.nQuality = 0 - Strategy.Result.sInfo = 'Mill not found' + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Mill not found') end return Machining @@ -414,11 +411,7 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters) if not IsTopologyOk( Proc) then local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. StrategyLib.Config.sStrategyId .. ' not implemented' EgtOutLog( sErr) - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.nCompletionIndex = 0 - Strategy.Result.dMRR = 0 - Strategy.Result.nQuality = 0 - Strategy.Result.sInfo = sErr + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( sErr) return false, Strategy.Result end diff --git a/Strategies/Standard/STR0003/STR0003.lua b/Strategies/Standard/STR0003/STR0003.lua index c38e384..12a1abe 100644 --- a/Strategies/Standard/STR0003/STR0003.lua +++ b/Strategies/Standard/STR0003/STR0003.lua @@ -207,8 +207,7 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) if not IsTopologyOk( Proc) then local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. Strategy.sName .. ' not implemented' EgtOutLog( sErr) - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.sInfo = 'Topology' + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Topology') return false, Strategy.Result end @@ -217,8 +216,7 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) if Proc.AffectedFaces.bBottom and ( Proc.nFct > 3 or not Proc.AffectedFaces.bTop) then local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. Strategy.sName .. ' not applicable - pocket on bottom face' EgtOutLog( sErr) - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.sInfo = 'Direction' + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Direction') return false, Strategy.Result end @@ -316,7 +314,7 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Parameters.bFinishWithChainSaw = false end Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dFinalCompletionPercentage) - Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Strategy.Result.nQuality = TOOLS[Cutting.nToolIndex].nQuality local MRRParametersBlade = { dStep = TOOLS[Cutting.nToolIndex].dThickness, dSideStep = min( TOOLS[Cutting.nToolIndex].dSideStep, Proc.MainFaces.LongFaces[1].MainEdges.SideEdges[1].dLength), @@ -519,7 +517,8 @@ function STR0003.Make( bAddMachining, Proc, Part, CustomParameters) end -- calcolo risultati Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dFinalCompletionPercentage) - Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Chainsaw') + -- TODO è giusto così? bisogna tenere solo la qualità peggiore? + Strategy.Result.nQuality = 0.5 * TOOLS[Cutting.nToolIndex].nQuality + 0.5 * TOOLS[Mortising.nToolIndex].nQuality local MRRParametersBlade = { dStep = TOOLS[Cutting.nToolIndex].dThickness, dSideStep = min( TOOLS[Cutting.nToolIndex].dSideStep, Proc.MainFaces.LongFaces[1].MainEdges.SideEdges[1].dLength), diff --git a/Strategies/Standard/STR0004/STR0004.lua b/Strategies/Standard/STR0004/STR0004.lua index 72e8842..d4adf5c 100644 --- a/Strategies/Standard/STR0004/STR0004.lua +++ b/Strategies/Standard/STR0004/STR0004.lua @@ -126,8 +126,7 @@ function STR0004.Make( bAddMachining, Proc, Part, CustomParameters) if not IsTopologyOk( Proc) then local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. Strategy.sName .. ' not implemented' EgtOutLog( sErr) - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.sInfo = 'Topology' + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Topology') return false, Strategy.Result end @@ -135,8 +134,7 @@ function STR0004.Make( bAddMachining, Proc, Part, CustomParameters) if Proc.AffectedFaces.bBottom and ( Proc.nFct > 3 or not Proc.AffectedFaces.bTop) then local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. Strategy.sName .. ' not applicable - pocket on bottom face' EgtOutLog( sErr) - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.sInfo = 'Direction' + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Direction') return false, Strategy.Result end @@ -276,7 +274,7 @@ function STR0004.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Result.sStatus = 'Not-Applicable' end Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dFinalCompletionPercentage) - Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Chainsaw') + Strategy.Result.nQuality = TOOLS[Mortising.nToolIndex].nQuality local MRRParametersChainsaw = { dStep = min( TOOLS[Mortising.nToolIndex].dStep, Proc.MainFaces.LongFaces[1].MainEdges.SideEdges[1].dLength), dSideStep = TOOLS[Mortising.nToolIndex].dThickness, diff --git a/Strategies/Standard/STR0005/STR0005.lua b/Strategies/Standard/STR0005/STR0005.lua index 874f36b..15eeca1 100644 --- a/Strategies/Standard/STR0005/STR0005.lua +++ b/Strategies/Standard/STR0005/STR0005.lua @@ -30,16 +30,14 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) Blade.Result = {} local dMRRBlade = 0 local dCompletionPercentage = 0 + local nQuality = 0 local dMRRBladeAddedFace = 0 local dCompletionPercentageAddedFace = 0 + local nQualityAddedFace = 0 -- più di 3 facce non supportate if Proc.nFct > 3 then - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( 0) - Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') - Strategy.Result.dMRR = dMRRBlade - Strategy.Result.sInfo = 'More than 3 faces not supported' + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'More than 3 faces not supported') end -- estensione oltre la coda @@ -86,6 +84,7 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) Blade.Result, BladeKeepWasteResult = BladeKeepWaste.Make( Proc, Part, OptionalParameters) dMRRBlade = BladeKeepWasteResult.dMRR dCompletionPercentage = BladeKeepWasteResult.dCompletionPercentage + nQuality = BladeKeepWasteResult.nQuality end -- lavorazione a cubetti / taglio singolo @@ -109,6 +108,7 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) Blade.Result, BladeToWasteResult = BladeToWaste.Make( Proc, Part, OptionalParameters) dMRRBlade = BladeToWasteResult.dMRR dCompletionPercentage = BladeToWasteResult.dCompletionPercentage + nQuality = BladeToWasteResult.nQuality end -- se arrivati qui non è stata ancora applicata alcuna lavorazione, si prova la lavorazione con codolo @@ -120,9 +120,11 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) Blade.Result, BladeKeepWasteResult = BladeKeepWaste.Make( Proc, Part, OptionalParameters) dMRRBlade = BladeKeepWasteResult.dMRR dCompletionPercentage = BladeKeepWasteResult.dCompletionPercentage + nQuality = BladeKeepWasteResult.nQuality end -- lavorazione eventuale terza faccia tipo RidgeLap + -- TODO va messa per prima???????? if idAddedTmFace then local dMinZTopBlade local dMaxNyTopBlade @@ -143,10 +145,12 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) Blade.Result, BladeToWasteResult = BladeToWaste.Make( idAddedTmFace, Part, OptionalParameters) dMRRBladeAddedFace = BladeToWasteResult.dMRR dCompletionPercentageAddedFace = BladeToWasteResult.dCompletionPercentage + nQualityAddedFace = BladeToWasteResult.nQuality -- la faccia aggiuntiva conta per 1/3 dMRRBlade = 2/3 * dMRRBlade + 1/3 * dMRRBladeAddedFace dCompletionPercentage = 2/3 * dCompletionPercentage + 1/3 * dCompletionPercentageAddedFace + nQuality = 2/3 * nQuality + 1/3 * nQualityAddedFace end -- aggiunta lavorazioni @@ -179,7 +183,7 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Result.sStatus = 'Not-Applicable' end Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dFinalCompletionPercentage) - Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Strategy.Result.nQuality = nQuality Strategy.Result.dMRR = dMRRBlade return bAreAllMachiningsAdded, Strategy.Result diff --git a/Strategies/Standard/STR0006/STR0006.lua b/Strategies/Standard/STR0006/STR0006.lua index 7f97803..2d80493 100644 --- a/Strategies/Standard/STR0006/STR0006.lua +++ b/Strategies/Standard/STR0006/STR0006.lua @@ -130,6 +130,7 @@ function GetFeatureRotationIndex( Proc) return nVoteIndex end ------------------------------------------------------------------------------------------------------------- +-- TODO vedere se leggere direttamente la quality dell'utensile e mediarle nel caso di utensile doppio function GetTenonMachiningResult( Proc, Result) local TotalResult = {} -- setto il risultato in base agli utensili trovati @@ -150,11 +151,7 @@ function GetTenonMachiningResult( Proc, Result) TotalResult.sInfo = 'Tenon not completed' -- strategia non applicabile, manca il taglio di lama sulla lunghezza del tenone else - TotalResult.sStatus = 'Not-Applicable' - TotalResult.nCompletionIndex = 0 - TotalResult.dMRR = 0 - TotalResult.nQuality = 0 - TotalResult.sInfo = 'Error on Tenon cutting' + TotalResult = FeatureLib.GetStrategyResultNotApplicable( 'Error on Tenon cutting') end return TotalResult end diff --git a/Strategies/Standard/STR0007/STR0007.lua b/Strategies/Standard/STR0007/STR0007.lua index c440a2f..3ed1d56 100644 --- a/Strategies/Standard/STR0007/STR0007.lua +++ b/Strategies/Standard/STR0007/STR0007.lua @@ -142,6 +142,7 @@ function GetFeatureRotationIndex( Proc) end ------------------------------------------------------------------------------------------------------------- +-- TODO vedere se leggere direttamente la quality dell'utensile e mediarle nel caso di utensile doppio function GetMortiseMachiningResult( Proc, Result) local TotalResult = {} -- setto il risultato in base agli utensili trovati @@ -171,11 +172,7 @@ function GetMortiseMachiningResult( Proc, Result) TotalResult.sInfo = 'Tenon not completed' -- strategia non applicabile, manca il taglio di lama sulla lunghezza del tenone else - TotalResult.sStatus = 'Not-Applicable' - TotalResult.nCompletionIndex = 0 - TotalResult.dMRR = 0 - TotalResult.nQuality = 0 - TotalResult.sInfo = 'Error on Tenon cutting' + TotalResult = FeatureLib.GetStrategyResultNotApplicable( 'Error on Tenon cutting') end return TotalResult end diff --git a/Strategies/Standard/STR0008/STR0008.lua b/Strategies/Standard/STR0008/STR0008.lua index 7b96d39..f820b2f 100644 --- a/Strategies/Standard/STR0008/STR0008.lua +++ b/Strategies/Standard/STR0008/STR0008.lua @@ -29,6 +29,7 @@ local function IsTopologyOk( Proc) end ------------------------------------------------------------------------------------------------------------- +-- TODO vedere se leggere direttamente la quality dell'utensile e mediarle nel caso di utensile doppio local function GetBestPocketingStrategy( Proc, Part) local Machining = { Cutting = {}, Pocketing = {}} local Result = { Cutting = {}, Pocketing = {}} @@ -123,7 +124,7 @@ local function GetBestPocketingStrategy( Proc, Part) else Strategy.Result.sStatus = 'Not-Completed' Strategy.Result.sInfo = 'Mortise not complete, left ' .. ceil( Milling.ToolInfo.dResidualDepth) .. 'mm' - Strategy.Result.dCompletionPercentage = ( Milling.ToolInfo.dResidualDepth * 100) / Proc.FeatureInfo.dMortiseDepth + Strategy.Result.dCompletionPercentage = ( 1 - Milling.ToolInfo.dResidualDepth / Proc.FeatureInfo.dMortiseDepth) * 100 end Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( Strategy.Result.dCompletionPercentage) table.insert( Machining.Pocketing, Milling) @@ -136,11 +137,7 @@ local function GetBestPocketingStrategy( Proc, Part) -- se non ho trovato neanche una lavorazione, oppure se taglio fatto di fresa e non può essere fatto dopo separazione if Machining.sTypeMachining == 'None' or ( Machining.bCuttingWithMill and ( Proc.AffectedFaces.bLeft and not Strategy.bCanMoveAfterSplit)) then - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.nCompletionIndex = 0 - Strategy.Result.dMRR = 0 - Strategy.Result.nQuality = 0 - Strategy.Result.sInfo = 'Mill not found' + Strategy.Result = 'Mill not found' end return Machining @@ -159,11 +156,7 @@ function STR0008.Make( bAddMachining, Proc, Part, CustomParameters) if not IsTopologyOk( Proc) then local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. StrategyLib.Config.sStrategyId .. ' not implemented' EgtOutLog( sErr) - Strategy.Result.sStatus = 'Not-Applicable' - Strategy.Result.nCompletionIndex = 0 - Strategy.Result.dMRR = 0 - Strategy.Result.nQuality = 0 - Strategy.Result.sInfo = sErr + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( sErr) return false, Strategy.Result end diff --git a/Strategies/Standard/TAILCUT/TAILCUT.lua b/Strategies/Standard/TAILCUT/TAILCUT.lua index b20ff5c..555d8da 100644 --- a/Strategies/Standard/TAILCUT/TAILCUT.lua +++ b/Strategies/Standard/TAILCUT/TAILCUT.lua @@ -49,6 +49,7 @@ function TAILCUT.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Result.sStatus = 'Completed' Strategy.Result.nCompletionIndex = 5 Strategy.Result.dMRR = 1 + -- TODO di quale utensile si deve impostare la qualità qui? Strategy.Result.nQuality = 5 Strategy.Result.sInfo = 'Split not possible' end diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index 11a94bf..650c08b 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -15,8 +15,8 @@ local MachiningLib = require( 'MachiningLib') local FaceByBlade = require('FACEBYBLADE') local FaceByMill = require('FACEBYMILL') --- tabella per definizione modulo -local Machinings = {} +-- tabelle per definizione modulo + ------------------------------------------------------------------------------------------------------------- local function CompareEdges( EdgeA, EdgeB) -- prima i lati orientati lungo X @@ -86,14 +86,64 @@ local function SortMachiningsBySegment( MachiningA, MachiningB) end +local function GetStrategyResult( Machinings, dFeatureVolume) + local Result = {} + + local dCompletionPercentageNumerator = 0 + local dCompletionPercentageDenominator = 0 + local dQualityNumerator = 0 + local dQualityDenominator = 0 + local dTimeToMachine = 0 + local nWeightsCount = 0 + for i = 1, #Machinings do + local Machining = Machinings[i] + local dWeight = Machining.dResultWeight + if not dWeight then + dWeight = 1 + else + nWeightsCount = nWeightsCount + 1 + end + -- il peso deve essere settato in tutte le lavorazioni o in nessuna + if ( nWeightsCount ~= 0) or ( nWeightsCount ~= i) then + error( 'GetStrategyResult : inconsistent weights') + end + local dWeightedCompletionPercentage = Machining.dCompletionPercentage * dWeight + local dWeightedQuality = FeatureLib.GetFeatureQuality( TOOLS[Machining.nToolIndex].MachiningQuality) * dWeight + if not Machining.bIsApplicable then + dWeightedCompletionPercentage = 0 + end + dCompletionPercentageNumerator = dCompletionPercentageNumerator + dWeightedCompletionPercentage + dCompletionPercentageDenominator = dCompletionPercentageDenominator + dWeight + dQualityNumerator = dQualityNumerator + dWeightedQuality + dQualityDenominator = dQualityDenominator + dWeight + dTimeToMachine = dTimeToMachine + ( Machining.dLengthToMachine / TOOLS[Machining.nToolIndex].Feeds.dFeed) + end + + Result.dCompletionPercentage = dCompletionPercentageNumerator / dCompletionPercentageDenominator + if Result.dCompletionPercentage > 100 - 10 * GEO.EPS_SMALL then + Result.sStatus = 'Completed' + elseif Result.dCompletionPercentage > 10 * GEO.EPS_SMALL then + Result.sStatus = 'Not-Completed' + else + Result.sStatus = 'Not-Applicable' + end + Result.dMRR = dFeatureVolume / dTimeToMachine + Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( Result.dCompletionPercentage) + -- TODO arrontondare all'intero più vicino? + Result.nQuality = dQualityNumerator / dQualityDenominator + + return Result +end + + function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- TODO verificare funzionamento con lama da sotto -- attenzione perchè se l'inclinazione della faccia la fa finire oltre lo spigolo questo riduce il massimo (come calcolare????) -- il FindBlade dovrà restituire di utilizzare sempre la lama sopra se l'angolo lo permette, ma avendo un'altezza massima (da macchina) oltre cui il DownUp non sarà fattibile (evita collisioni tra asse e pezzo) local Result = {} - Machinings = {} - local CreatedMachinings = {} + local Machinings = {} + local CalculatedMachinings = {} local Cutting1 = {} local Cutting2 = {} @@ -130,6 +180,9 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) end local dMillingOffsetFromSide = OptionalParameters.dMillingOffsetFromSide or 1 + -- volume della feature + local dFeatureVolume = FeatureLib.GetFeatureVolume( Proc, Part) + -- si trovano le facce da lavorare local BottomFace = {} local LongFaces = {} @@ -144,16 +197,14 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) end - -- si trova il lato da lavorare - local EdgeToMachine = {} - local EdgesSorted = {} + -- si trova il lato della faccia di fondo da lavorare + local BottomEdgeToMachine = {} + local BottomEdgesSorted = {} for i = 1, #BottomFace.Edges do - table.insert( EdgesSorted, BottomFace.Edges[i]) + table.insert( BottomEdgesSorted, BottomFace.Edges[i]) end - table.sort( EdgesSorted, CompareEdges) - EdgeToMachine = EdgesSorted[1] - - local dDepthToMachine = EdgeToMachine.dElevation / 2 - OptionalParameters.dStripWidth / 2 + table.sort( BottomEdgesSorted, CompareEdges) + BottomEdgeToMachine = BottomEdgesSorted[1] -- eventuali punti di spezzatura local FeatureSplittingPoints = FeatureLib.GetFeatureSplittingPoints( Proc, Part) @@ -167,22 +218,26 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) for i = 1, #LongFaces do local Cutting = {} local OptionalParametersFaceByBlade = { bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, nToolIndex = nToolIndex} - Cutting = FaceByBlade.Make( Proc, Part, Proc.MainFaces.LongFaces[i], Proc.MainFaces.LongFaces[i].MainEdges.BottomEdge, OptionalParametersFaceByBlade) + Cutting = FaceByBlade.Make( Proc, Part, LongFaces[i], LongFaces[i].MainEdges.BottomEdge, OptionalParametersFaceByBlade) Cutting.nInternalSortingPriority = 1 - table.insert( CreatedMachinings, Cutting) + Cutting.dResultWeight = 0.15 + table.insert( CalculatedMachinings, Cutting) end - -- faccia di fondo - -- primo lato + -- taglio con codolo faccia di fondo + local dDepthToMachine = BottomEdgeToMachine.dElevation / 2 - OptionalParameters.dStripWidth / 2 local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine, bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, nToolIndex = nToolIndex} - Cutting1 = FaceByBlade.Make( Proc, Part, BottomFace, EdgeToMachine, OptionalParametersFaceByBlade) + -- primo lato + Cutting1 = FaceByBlade.Make( Proc, Part, BottomFace, BottomEdgeToMachine, OptionalParametersFaceByBlade) Cutting1.nInternalSortingPriority = 3 - table.insert( CreatedMachinings, Cutting1) + Cutting1.dResultWeight = 0.3 + table.insert( CalculatedMachinings, Cutting1) -- secondo lato OptionalParametersFaceByBlade.bOppositeToolDirection = true - Cutting2 = FaceByBlade.Make( Proc, Part, BottomFace, EdgeToMachine, OptionalParametersFaceByBlade) + Cutting2 = FaceByBlade.Make( Proc, Part, BottomFace, BottomEdgeToMachine, OptionalParametersFaceByBlade) Cutting2.nInternalSortingPriority = 3 - table.insert( CreatedMachinings, Cutting2) - -- eventuale pulitura raggio lama + Cutting2.dResultWeight = 0.3 + table.insert( CalculatedMachinings, Cutting2) + -- fresatura eventuali facce di chiusura if bFinishWithMill then for i = 1, #LongFaces do local dDepthToMachineMill = BottomFace.MainEdges.LongEdges[i].dElevation - dMillingOffsetFromSide @@ -192,14 +247,15 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) } local Milling = FaceByMill.Make( Proc, Part, BottomFace, BottomFace.MainEdges.LongEdges[i], OptionalParametersFaceByMill) Milling.nInternalSortingPriority = 2 - table.insert( CreatedMachinings, Milling) + Milling.dResultWeight = 0.05 + table.insert( CalculatedMachinings, Milling) end end - -- lavorazioni raggruppate in unica lista - for i = 1, #CreatedMachinings do - if CreatedMachinings[i].bIsApplicable then - table.insert( Machinings, CreatedMachinings[i]) + -- lavorazioni da applicare spostate in lista finale + for i = 1, #CalculatedMachinings do + if CalculatedMachinings[i].bIsApplicable then + table.insert( Machinings, CalculatedMachinings[i]) end end @@ -211,6 +267,13 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- ordinamento table.sort( Machinings, SortMachiningsBySegment) + -- calcolo risultati + if Cutting1.bIsApplicable or Cutting2.bIsApplicable then + Result = GetStrategyResult( CalculatedMachinings, dFeatureVolume) + else + Result = FeatureLib.GetStrategyResultNotApplicable() + end + -- calcolo parametri per la stima della velocità di asportazione -- TODO non è corretto: come si stima la velocità di asportazione con il codolo? è come se avesse rimosso tutto il volume feature nel tempo di percorrenza if Cutting1.bIsApplicable or Cutting2.bIsApplicable then @@ -236,11 +299,7 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( Result.dCompletionPercentage) Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') else - Result.dMRR = 0 - Result.dCompletionPercentage = 0 - Result.sStatus = 'Not-Applicable' - Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( Result.dCompletionPercentage) - Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + end return Machinings, Result diff --git a/StrategyLibs/BLADETOWASTE.lua b/StrategyLibs/BLADETOWASTE.lua index ca4c7d7..6590438 100644 --- a/StrategyLibs/BLADETOWASTE.lua +++ b/StrategyLibs/BLADETOWASTE.lua @@ -261,8 +261,7 @@ local function CutWholeWaste( Proc, Part, OptionalParameters) -- utensile non trovato if not nToolIndex then - Result.sStatus = 'Not-Applicable' - Result.dCompletionPercentage = 0 + Result = FeatureLib.GetStrategyResultNotApplicable( 'Blade not found') return Machinings, Result end @@ -361,6 +360,7 @@ function BLADETOWASTE.Make( ProcOrId, Part, OptionalParameters) end end + -- TODO la lavorazione con cubetti va messa in una funzione -- lavorazione con cubetti -- scelta faccia da lavorare -- se due facce, la faccia principale Face1 è la più grande @@ -402,6 +402,12 @@ function BLADETOWASTE.Make( ProcOrId, Part, OptionalParameters) OptionalParametersDiceCut.dMinNzDownUp = dMinNzDownUp local vCuts = DiceCut.GetDice( Part, Face1, Face2, OptionalParametersDiceCut) + -- se nessun cubetto trovato, si richiama il taglio singolo + if #vCuts == 0 then + Machinings, Result = CutWholeWaste( Proc, Part, OptionalParameters) + return Machinings, Result + end + -- lavorazione cubetti local bIsDicingOk = true local bMoveAfterSplit = false @@ -546,10 +552,9 @@ function BLADETOWASTE.Make( ProcOrId, Part, OptionalParameters) Result.sStatus = 'Completed' Result.dCompletionPercentage = 100 else - Result.sStatus = 'Not-Applicable' - Result.dCompletionPercentage = 0 + Result = FeatureLib.GetStrategyResultNotApplicable() end - Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Result.nQuality = TOOLS[nToolIndex].nQuality local dMRR = FeatureInfo.dFeatureVolume / ( dDiceDimension / TOOLS[nToolIndex].Feeds.dFeed) Result.dMRR = dMRR / pow( 10, 6) diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index a6cae4d..612ce8d 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -307,7 +307,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar end end -- completamento - Cutting.dCompletionPercentage = 100 - Cutting.dResidualDepth / Cutting.dDepthToMachine + Cutting.dCompletionPercentage = ( 1 - Cutting.dResidualDepth / Cutting.dDepthToMachine) * 100 -- step verticale e offset longitudinale Cutting.Steps = MachiningLib.GetMachiningSteps( dPocketHeight, TOOLS[Cutting.nToolIndex].dThickness) Cutting.Steps.nStepType = MCH_MILL_ST.ONEWAY diff --git a/StrategyLibs/FACEBYCHAINSAW.lua b/StrategyLibs/FACEBYCHAINSAW.lua index 02272d7..806767d 100644 --- a/StrategyLibs/FACEBYCHAINSAW.lua +++ b/StrategyLibs/FACEBYCHAINSAW.lua @@ -176,7 +176,7 @@ function FACEBYCHAINSAW.Make( Proc, Part, FaceToMachine, EdgeToMachine, Optional EgtOutLog( Mortising.sMessage) end -- completamento - Mortising.dCompletionPercentage = 100 - Mortising.dResidualDepth / Mortising.dDepthToMachine + Mortising.dCompletionPercentage = ( 1 - Mortising.dResidualDepth / Mortising.dDepthToMachine) * 100 -- massima elevazione if dCustomMaxElev < Mortising.dDepthToMachine - 10 * GEO.EPS_SMALL then Mortising.dMaxElev = max( dCustomMaxElev, dCustomMaxElev - Mortising.dLongitudinalOffset) diff --git a/StrategyLibs/FACEBYMILL.lua b/StrategyLibs/FACEBYMILL.lua index 39f1d61..cd8f6b7 100644 --- a/StrategyLibs/FACEBYMILL.lua +++ b/StrategyLibs/FACEBYMILL.lua @@ -307,7 +307,7 @@ function FACEBYMILL.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPara end end -- completamento - Milling.dCompletionPercentage = 100 - Milling.dResidualDepth / Milling.dDepthToMachine + Milling.dCompletionPercentage = ( 1 - Milling.dResidualDepth / Milling.dDepthToMachine) * 100 -- step verticale e offset longitudinale if OptionalParameters.dPocketHeight then Milling.Steps = MachiningLib.GetMachiningSteps( dPocketHeight, TOOLS[Milling.nToolIndex].dMaxMaterial) diff --git a/StrategyLibs/SPLITCUT.lua b/StrategyLibs/SPLITCUT.lua index 1bfb09f..730e70d 100644 --- a/StrategyLibs/SPLITCUT.lua +++ b/StrategyLibs/SPLITCUT.lua @@ -125,7 +125,7 @@ function SPLITCUT.GetStrategy( Proc, Part, OptionalParameters) -- TODO considerare di tagliare con il massimo materiale possibile per non salire troppo in Z (macchine tipo PF), oppure non scendere troppo (tipo Kairos) -- BladeSideSingle (taglio di lama singolo di fianco) if Machining[1].bIsApplicable and ( dMaxMatBladeSideSingle - BeamData.CUT_EXTRA) > Part.dWidth + 10 * GEO.EPS_SMALL then - Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Result.nQuality = TOOLS[Splitting.ToolInfo.nToolIndex].nQuality Machining.sTypeMachining = 'BladeSideSingle' Machining[2].bIsApplicable = false Machining[3].bIsApplicable = false @@ -134,7 +134,7 @@ function SPLITCUT.GetStrategy( Proc, Part, OptionalParameters) -- TODO considerare di tagliare con il massimo materiale possibile per non salire troppo in Z (macchine tipo PF), oppure non scendere troppo (tipo Kairos) -- BladeSideDouble (taglio di lama doppio di fianco) elseif Machining[1].bIsApplicable and ( dMaxMatBladeSideDouble - BeamData.CUT_EXTRA) > Part.dWidth + 10 * GEO.EPS_SMALL then - Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Result.nQuality = TOOLS[Splitting.ToolInfo.nToolIndex].nQuality Result.dMRR = Result.dMRR/2 Machining.sTypeMachining = 'BladeSideDouble' Machining[2].bIsApplicable = false @@ -143,7 +143,7 @@ function SPLITCUT.GetStrategy( Proc, Part, OptionalParameters) return Machining, Result -- BladeHorizontalSingle (taglio di lama singolo orizzontale) elseif Machining[1].bIsApplicable and ( dMaxMatBladeHorizontalSingle - BeamData.CUT_EXTRA) > Part.dHeight + 10 * GEO.EPS_SMALL then - Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Result.nQuality = TOOLS[Splitting.ToolInfo.nToolIndex].nQuality Machining.sTypeMachining = 'BladeHorizontalSingle' Machining[2].bIsApplicable = false Machining[3].bIsApplicable = false @@ -152,7 +152,7 @@ function SPLITCUT.GetStrategy( Proc, Part, OptionalParameters) -- BladeHorizontalDouble (taglio di lama doppio orizzontale) elseif Machining[1].bIsApplicable and Machining[2].bIsApplicable and ( dMaxMatBladeHorizontalSingle + dMaxMatBladeHorizontalDouble - BeamData.CUT_EXTRA) > Part.dHeight + 10 * GEO.EPS_SMALL then - Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') + Result.nQuality = TOOLS[Splitting.ToolInfo.nToolIndex].nQuality Result.dMRR = Result.dMRR/2 Machining.sTypeMachining = 'BladeHorizontalDouble' Machining[1].ToolInfo.dMaxMatBladeFromTop = dMaxMatBladeHorizontalSingle @@ -171,11 +171,7 @@ function SPLITCUT.GetStrategy( Proc, Part, OptionalParameters) -- se non ho trovato neanche una lavorazione completa, non posso separare if Machining.sTypeMachining == 'None' then - Result.sStatus = 'Not-Applicable' - Result.nCompletionIndex = 0 - Result.dMRR = 0 - Result.nQuality = 0 - Result.sInfo = 'Split not possible' + Result = FeatureLib.GetStrategyResultNotApplicable( 'Split not possible') end return Machining, Result