diff --git a/LuaLibs/FeatureLib.lua b/LuaLibs/FeatureLib.lua index 579c30d..51e3b5f 100644 --- a/LuaLibs/FeatureLib.lua +++ b/LuaLibs/FeatureLib.lua @@ -524,6 +524,40 @@ function FeatureLib.GetFeatureQuality( sTypeTools) return nQuality end +------------------------------------------------------------------------------------------------------------- +function FeatureLib.GetStrategyQuality( Machinings) + local nQuality = 0 + + local dQualityNumerator = 0 + local dQualityDenominator = 0 + for i = 1, #Machinings do + local Machining = Machinings[i] + local dWeightedQuality = TOOLS[Machining.nToolIndex].nQuality * Machining.dLengthToMachine + if Machining.bIsApplicable then + dQualityNumerator = dQualityNumerator + dWeightedQuality + dQualityDenominator = dQualityDenominator + Machining.dLengthToMachine + end + end + + nQuality = dQualityNumerator / dQualityDenominator + + return nQuality +end + +------------------------------------------------------------------------------------------------------------- +function FeatureLib.GetStrategyTimeToMachine( Machinings) + local dTimeToMachine = 0 + + for i = 1, #Machinings do + local Machining = Machinings[i] + if Machining.bIsApplicable then + dTimeToMachine = dTimeToMachine + ( Machining.dLengthToMachineAllStepsWithLeadInOut / TOOLS[Machining.nToolIndex].Feeds.dFeed) + end + end + + return dTimeToMachine +end + ------------------------------------------------------------------------------------------------------------- function FeatureLib.GetStrategyResultNotApplicable( sInfo) local Result = {} @@ -531,6 +565,7 @@ function FeatureLib.GetStrategyResultNotApplicable( sInfo) sInfo = '' end + Result.dTimeToMachine = 0 Result.dMRR = 0 Result.dCompletionPercentage = 0 Result.sStatus = 'Not-Applicable' diff --git a/Strategies/Standard/STR0005/STR0005.lua b/Strategies/Standard/STR0005/STR0005.lua index 15eeca1..0593231 100644 --- a/Strategies/Standard/STR0005/STR0005.lua +++ b/Strategies/Standard/STR0005/STR0005.lua @@ -176,13 +176,11 @@ function STR0005.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Result.sStatus = 'Completed' else Strategy.Result.sStatus = 'Not-Completed' - -- TODO al momento si assume che la percentuale di completamento dell'ultima lavorazione sia quella rilevante - dFinalCompletionPercentage = dCompletionPercentage end else Strategy.Result.sStatus = 'Not-Applicable' end - Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dFinalCompletionPercentage) + Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dCompletionPercentage) Strategy.Result.nQuality = nQuality Strategy.Result.dMRR = dMRRBlade diff --git a/StrategyLibs/BLADEKEEPWASTE.lua b/StrategyLibs/BLADEKEEPWASTE.lua index 9259b76..592168c 100644 --- a/StrategyLibs/BLADEKEEPWASTE.lua +++ b/StrategyLibs/BLADEKEEPWASTE.lua @@ -86,14 +86,11 @@ local function SortMachiningsBySegment( MachiningA, MachiningB) end -local function GetStrategyResult( Machinings, dFeatureVolume) - local Result = {} +local function GetStrategyCompletionPercentage( Machinings) + local dCompletionPercentage = 0 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] @@ -105,33 +102,18 @@ local function GetStrategyResult( Machinings, dFeatureVolume) end -- il peso deve essere settato in tutte le lavorazioni o in nessuna if ( nWeightsCount == 0) or ( nWeightsCount ~= i) then - error( 'GetStrategyResult : inconsistent weights') + error( 'GetWeightedCompletionPercentage : inconsistent weights') end local dWeightedCompletionPercentage = Machining.dCompletionPercentage / 100 * dWeight - local dWeightedQuality = TOOLS[Machining.nToolIndex].nQuality * Machining.dLengthToMachine if Machining.bIsApplicable then dCompletionPercentageNumerator = dCompletionPercentageNumerator + dWeightedCompletionPercentage - dQualityNumerator = dQualityNumerator + dWeightedQuality - dQualityDenominator = dQualityDenominator + Machining.dLengthToMachine end dCompletionPercentageDenominator = dCompletionPercentageDenominator + dWeight - dTimeToMachine = dTimeToMachine + ( Machining.dLengthToMachineAllStepsWithLeadInOut / TOOLS[Machining.nToolIndex].Feeds.dFeed) end - Result.dCompletionPercentage = 100 * 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.dTimeToMachine = dTimeToMachine - Result.dMRR = ( dFeatureVolume / dTimeToMachine) / pow( 10, 6) - Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( Result.dCompletionPercentage) - Result.nQuality = dQualityNumerator / dQualityDenominator + dCompletionPercentage = min( 100 * dCompletionPercentageNumerator / dCompletionPercentageDenominator, 100) - return Result + return dCompletionPercentage end @@ -222,6 +204,7 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) Cutting.dResultWeight = 0.15 table.insert( CalculatedMachinings, Cutting) end + -- taglio con codolo faccia di fondo local dDepthToMachine = BottomEdgeToMachine.dElevation / 2 - OptionalParameters.dStripWidth / 2 local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine, bIsSplitFeature = bIsSplitFeature, dExtendAfterTail = dExtendAfterTail, nToolIndex = nToolIndex} @@ -236,6 +219,7 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) Cutting2.nInternalSortingPriority = 3 Cutting2.dResultWeight = 0.3 table.insert( CalculatedMachinings, Cutting2) + -- fresatura eventuali facce di chiusura if bFinishWithMill then for i = 1, #LongFaces do @@ -258,6 +242,12 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) end end + -- calcolo qualità e completamento + Result.nQuality = FeatureLib.GetStrategyQuality( Machinings) + -- per il completamento serve la lista di lavorazioni che comprende le non applicabili + Result.dCompletionPercentage = GetStrategyCompletionPercentage( CalculatedMachinings) + Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( Result.dCompletionPercentage) + -- aggiunta eventuali lavorazioni splittate if bIsSplitFeature then Machinings = MachiningLib.GetSplitMachinings( Machinings, FeatureSplittingPoints, Part) @@ -268,37 +258,15 @@ function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters) -- 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 - MRRParameters1 = { - dStep = TOOLS[Cutting1.nToolIndex].dThickness, - dSideStep = min( TOOLS[Cutting1.nToolIndex].dSideStep, dDepthToMachine), - dFeed = TOOLS[Cutting1.nToolIndex].Feeds.dFeed} - - MRRParameters2 = { - dStep = TOOLS[Cutting2.nToolIndex].dThickness, - dSideStep = min( TOOLS[Cutting2.nToolIndex].dSideStep, dDepthToMachine), - dFeed = TOOLS[Cutting2.nToolIndex].Feeds.dFeed} - - local dMRRBlade1 = MachiningLib.GetToolMRR( MRRParameters1) - local dMRRBlade2 = MachiningLib.GetToolMRR( MRRParameters2) - Result.dMRR = ( dMRRBlade1 + dMRRBlade2) / 2 - Result.dCompletionPercentage = 0.5 * Cutting1.dCompletionPercentage + 0.5 * Cutting2.dCompletionPercentage + local dTimeToMachine = FeatureLib.GetStrategyTimeToMachine( Machinings) + Result.dMRR = ( dFeatureVolume / dTimeToMachine) / pow( 10, 6) if Result.dCompletionPercentage > 100 - 10 * GEO.EPS_SMALL then Result.sStatus = 'Completed' else Result.sStatus = 'Not-Completed' end - Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( Result.dCompletionPercentage) - Result.nQuality = FeatureLib.GetFeatureQuality( 'Blade') else - + Result = FeatureLib.GetStrategyResultNotApplicable() end return Machinings, Result diff --git a/StrategyLibs/FACEBYBLADE.lua b/StrategyLibs/FACEBYBLADE.lua index 95e5bee..0040a91 100644 --- a/StrategyLibs/FACEBYBLADE.lua +++ b/StrategyLibs/FACEBYBLADE.lua @@ -175,6 +175,7 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar Cutting.sMessage = '' Cutting.idProc = Proc.id Cutting.dResidualDepth = EdgeToMachine.dElevation + Cutting.dCompletionPercentage = 0 Cutting.dBladeMarkLength = 0 Cutting.sEdgeType = EdgeToMachine.sType Cutting.nFeatureSegment = 1 @@ -322,6 +323,8 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar end -- completamento Cutting.dCompletionPercentage = ( 1 - Cutting.dResidualDepth / Cutting.dDepthToMachine) * 100 + -- area lavorata + Cutting.dAreaToMachine = Cutting.dDepthToMachine * Cutting.dEdgeLength -- 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 714659b..98d07b5 100644 --- a/StrategyLibs/FACEBYCHAINSAW.lua +++ b/StrategyLibs/FACEBYCHAINSAW.lua @@ -52,6 +52,7 @@ function FACEBYCHAINSAW.Make( Proc, Part, FaceToMachine, EdgeToMachine, Optional Mortising.bIsApplicable = true Mortising.dDepthToMachine = 0 Mortising.dResidualDepth = EdgeToMachine.dElevation + Mortising.dCompletionPercentage = 0 Mortising.sMessage = '' Mortising.idProc = Proc.id Mortising.sEdgeType = EdgeToMachine.sType @@ -160,6 +161,8 @@ function FACEBYCHAINSAW.Make( Proc, Part, FaceToMachine, EdgeToMachine, Optional end -- completamento Mortising.dCompletionPercentage = ( 1 - Mortising.dResidualDepth / Mortising.dDepthToMachine) * 100 + -- area lavorata + Mortising.dAreaToMachine = Mortising.dDepthToMachine * dLengthToMachine -- 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 06c43b6..cc170c0 100644 --- a/StrategyLibs/FACEBYMILL.lua +++ b/StrategyLibs/FACEBYMILL.lua @@ -173,6 +173,7 @@ function FACEBYMILL.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPara Milling.sMessage = '' Milling.idProc = Proc.id Milling.dResidualDepth = EdgeToMachine.dElevation + Milling.dCompletionPercentage = 0 Milling.dBladeMarkLength = 0 Milling.sEdgeType = EdgeToMachine.sType Milling.nFeatureSegment = 1 @@ -323,6 +324,8 @@ function FACEBYMILL.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPara end -- completamento Milling.dCompletionPercentage = ( 1 - Milling.dResidualDepth / Milling.dDepthToMachine) * 100 + -- area lavorata + Milling.dAreaToMachine = Milling.dDepthToMachine * Milling.dEdgeLength -- step verticale e offset longitudinale if OptionalParameters.dPocketHeight then Milling.Steps = MachiningLib.GetMachiningSteps( dPocketHeight, TOOLS[Milling.nToolIndex].dMaxMaterial)