diff --git a/Strategies/Standard/STR0013/STR0013.json b/Strategies/Standard/STR0013/STR0013.json new file mode 100644 index 0000000..c411f55 --- /dev/null +++ b/Strategies/Standard/STR0013/STR0013.json @@ -0,0 +1,45 @@ +{ + "sStrategyId": "STR0013", + "sStrategyName": "Hole with Drillbit", + "ParameterList" : [ + { + "sName": "dDiameterTolerance", + "sNameNge": "TOLERANCE", + "sValue": "0", + "sDescriptionShort": "Tolerance on Diameter", + "sDescriptionLong": "Tolerance on Diameter", + "sType": "d", + "sMessageId": " ", + "sMinUserLevel": "1" + }, + { + "sName": "sDrillingMode", + "sNameNge": "DRILLING_MODE", + "sValue": "AUTO", + "sDescriptionShort": "Cutting Strategy", + "sDescriptionLong": "", + "sType": "combo", + "sMinUserLevel": "1", + "Choices": [ + { + "sValue": "AUTO", + "sDescriptionShort": "Automatic", + "sDescriptionLong": "", + "sMessageId": "" + }, + { + "sValue": "PREFER_ONE", + "sDescriptionShort": "Preferred machining from one side only", + "sDescriptionLong": "", + "sMessageId": "" + }, + { + "sValue": "FORCE_TWO", + "sDescriptionShort": "Force machining from two sides", + "sDescriptionLong": "", + "sMessageId": "" + } + ] + } + ] +} \ No newline at end of file diff --git a/Strategies/Standard/STR0013/STR0013.lua b/Strategies/Standard/STR0013/STR0013.lua new file mode 100644 index 0000000..35b7630 --- /dev/null +++ b/Strategies/Standard/STR0013/STR0013.lua @@ -0,0 +1,267 @@ +-- Strategia: STR0013 +-- Descrizione +-- foratura +-- Feature: foro con fresa + +-- carico librerie +local BeamLib = require( 'BeamLib') +local BeamData = require( 'BeamData') +local MachiningLib = require( 'MachiningLib') +local FeatureLib = require( 'FeatureLib') +-- strategie di base + +-- Tabella per definizione modulo +local STR0013 = {} +local Strategy = {} + +-- TODO Da fare completamente gestione foratura doppia con 2 teste + +------------------------------------------------------------------------------------------------------------- +function GetDrillingStrategy( Proc, Part) + local ToolSearchParameters = {} + local Machining = {} + + -- se lavorazione orizzontale + if Proc.FeatureInfo.bIsDrillHorizontal then + local bDouble = false + local Drilling = MachiningLib.InitMachiningParameters( MCH_MY.DRILLING) + Drilling.bIsApplicable = false + ToolSearchParameters = {} + ToolSearchParameters.dElevation = Proc.FeatureInfo.dDrillLen + BeamData.MILL_OVERLAP + ToolSearchParameters.vtToolDirection = Proc.FeatureInfo.vtDrillExtrusion + ToolSearchParameters.dToolDiameter = Proc.FeatureInfo.dDrillDiam + ToolSearchParameters.dDiameterTolerance = Strategy.Parameters.dDiameterTolerance + Drilling.ToolInfo = {} + Drilling.ToolInfo = MachiningLib.FindDrill( Proc, ToolSearchParameters) + if Drilling.ToolInfo.nToolIndex then + Drilling.nType = MCH_MY.DRILLING + Drilling.nToolIndex = Drilling.ToolInfo.nToolIndex + Drilling.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, 0}} + Drilling.dStep = TOOLS[Drilling.ToolInfo.nToolIndex].dStep + -- se lavorazione non completa o se si deve forare dai due lati + if Proc.FeatureInfo.bIsDrillOpen and + ( Drilling.ToolInfo.dResidualDepth > 10 * GEO.EPS_SMALL or Strategy.Parameters.sDrillingMode == 'FORCE_TWO' or Strategy.Parameters.sDrillingMode == 'AUTO') then + bDouble = true + local dHalfDrill = ( Proc.FeatureInfo.dDrillLen + BeamData.MILL_OVERLAP) / 2 + Drilling.sDepth = min( dHalfDrill, Proc.FeatureInfo.dDrillLen - Drilling.ToolInfo.dResidualDepth) + Drilling.vtFaceNormal = Proc.FeatureInfo.vtDrillExtrusion + Drilling.bInvert = false + Drilling.vtToolDirection = Proc.FeatureInfo.vtDrillExtrusion + table.insert( Machining, Drilling) + local Drilling2 = BeamLib.TableCopyDeep( Drilling) + Drilling2.bInvert = true + Drilling2.vtToolDirection = -Proc.FeatureInfo.vtDrillExtrusion + table.insert( Machining, Drilling2) + else + Drilling.sDepth = 'TH' + Drilling.vtFaceNormal = Proc.FeatureInfo.vtDrillExtrusion + Drilling.bInvert = false + Drilling.vtToolDirection = Proc.FeatureInfo.vtDrillExtrusion + table.insert( Machining, Drilling) + end + + -- voto + if Drilling.ToolInfo.dResidualDepth < 0 or ( Proc.FeatureInfo.dDrillLen + BeamData.MILL_OVERLAP) / 2 > Drilling.ToolInfo.dResidualDepth then + Strategy.Result.sStatus = 'Completed' + Strategy.Result.nCompletionIndex = 5 + Strategy.Result.dMRR = MachiningLib.GetToolMRR( Machining[1].ToolInfo or Machining[2].ToolInfo) + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Drill') + Strategy.Result.sInfo = '' + else + Strategy.Result.sStatus = 'Not-Completed' + local dMachinedLen = EgtIf( bDouble, Machining[1].sDepth * 2, Proc.FeatureInfo.dDrillLen) + local dMachinedPrercentage = 100 * ( dMachinedLen / Proc.FeatureInfo.dDrillLen) + Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dMachinedPrercentage) + Strategy.Result.sInfo = 'Machining not complete, left ' .. tostring( 100 - ceil( dMachinedPrercentage)) .. '%' + Strategy.Result.dMRR = MachiningLib.GetToolMRR( Machining[1].ToolInfo or Machining[2].ToolInfo) + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Drill') + end + end + -- se lavorazione verticale + else + -- si cerca utensile 1 + local Drilling = MachiningLib.InitMachiningParameters( MCH_MY.DRILLING) + ToolSearchParameters = {} + ToolSearchParameters.dElevation = Proc.FeatureInfo.dDrillLen + BeamData.MILL_OVERLAP + ToolSearchParameters.vtToolDirection = Proc.FeatureInfo.vtDrillExtrusion + ToolSearchParameters.dToolDiameter = Proc.FeatureInfo.dDrillDiam + ToolSearchParameters.dDiameterTolerance = Strategy.Parameters.dDiameterTolerance + Drilling.ToolInfo = {} + Drilling.ToolInfo = MachiningLib.FindDrill( Proc, ToolSearchParameters) + -- si cerca utensile 2 + local Drilling2 = MachiningLib.InitMachiningParameters( MCH_MY.DRILLING) + Drilling2.ToolInfo = {} + if Proc.FeatureInfo.bIsDrillOpen then + ToolSearchParameters = {} + ToolSearchParameters.dElevation = Proc.FeatureInfo.dDrillLen + BeamData.MILL_OVERLAP + ToolSearchParameters.vtToolDirection = -Proc.FeatureInfo.vtDrillExtrusion + ToolSearchParameters.dDiameterTolerance = Strategy.Parameters.dDiameterTolerance + Drilling2.ToolInfo = MachiningLib.FindDrill( Proc, ToolSearchParameters) + end + + -- se possono lavorare entrambi e si deve fare lavorazione doppia e si riesce a completare + if Drilling.ToolInfo.nToolIndex and Drilling2.ToolInfo.nToolIndex and + ( Strategy.Parameters.sDrillingMode == 'FORCE_TWO' or Strategy.Parameters.sDrillingMode == 'AUTO') and + Drilling.ToolInfo.dResidualDepth + Drilling2.ToolInfo.dResidualDepth < Proc.FeatureInfo.dDrillLen then + + local dExtraDrill = ( Proc.FeatureInfo.dDrillLen - BeamData.MILL_OVERLAP - ( Drilling.ToolInfo.dResidualDepth + Drilling2.ToolInfo.dResidualDepth)) / 2 + Drilling.nType = MCH_MY.DRILLING + Drilling.nToolIndex = Drilling.ToolInfo.nToolIndex + Drilling.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, 0}} + Drilling.vtToolDirection = Proc.FeatureInfo.vtDrillExtrusion + Drilling.sDepth = Proc.FeatureInfo.dDrillLen - Drilling.ToolInfo.dResidualDepth - dExtraDrill + table.insert( Machining, Drilling) + + Drilling2.nType = MCH_MY.DRILLING + Drilling2.nToolIndex = Drilling2.ToolInfo.nToolIndex + Drilling2.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, 0}} + Drilling2.bInvert = true + Drilling2.vtToolDirection = -Proc.FeatureInfo.vtDrillExtrusion + Drilling2.sDepth = Proc.FeatureInfo.dDrillLen - Drilling2.ToolInfo.dResidualDepth - dExtraDrill + table.insert( Machining, Drilling2) + + -- voto + Strategy.Result.sStatus = 'Completed' + Strategy.Result.nCompletionIndex = 5 + Strategy.Result.sInfo = '' + Strategy.Result.dMRR = MachiningLib.GetToolMRR( Machining[1].ToolInfo) + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Drill') + + -- se utensile 1 esegue completamente + elseif Drilling.ToolInfo.nToolIndex and Drilling.ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL and + ( Strategy.Parameters.sDrillingMode == 'PREFER_ONE' or ( not Drilling2.ToolInfo.nToolIndex and Strategy.Parameters.sDrillingMode == 'AUTO') or not Proc.FeatureInfo.bIsDrillOpen) then + Drilling.sDepth = 'TH' + Drilling.nType = MCH_MY.DRILLING + Drilling.nToolIndex = Drilling.ToolInfo.nToolIndex + Drilling.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, 0}} + Drilling.vtToolDirection = Proc.FeatureInfo.vtDrillExtrusion + table.insert( Machining, Drilling) + -- voto + Strategy.Result.sStatus = 'Completed' + Strategy.Result.nCompletionIndex = 5 + Strategy.Result.dMRR = MachiningLib.GetToolMRR( Machining[1].ToolInfo) + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Drill') + Strategy.Result.sInfo = '' + -- se utensile 2 esegue completamente + elseif Drilling2.ToolInfo.nToolIndex and Drilling2.ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL and + ( Strategy.Parameters.sDrillingMode == 'PREFER_ONE' or ( not Drilling.ToolInfo.nToolIndex and Strategy.Parameters.sDrillingMode == 'AUTO')) then + Drilling2.sDepth = 'TH' + Drilling2.nType = MCH_MY.DRILLING + Drilling2.nToolIndex = Drilling2.ToolInfo.nToolIndex + Drilling2.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, 0}} + Drilling2.bInvert = true + Drilling2.vtToolDirection = -Proc.FeatureInfo.vtDrillExtrusion + table.insert( Machining, Drilling2) + -- voto + Strategy.Result.sStatus = 'Completed' + Strategy.Result.nCompletionIndex = 5 + Strategy.Result.dMRR = MachiningLib.GetToolMRR( Machining[1].ToolInfo) + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Drill') + Strategy.Result.sInfo = '' + -- se possono lavorare entrambi + elseif Drilling.ToolInfo.nToolIndex and Drilling2.ToolInfo.nToolIndex then + Drilling.nType = MCH_MY.DRILLING + Drilling.nToolIndex = Drilling.ToolInfo.nToolIndex + Drilling.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, 0}} + Drilling.vtToolDirection = Proc.FeatureInfo.vtDrillExtrusion + Drilling.sDepth = Proc.FeatureInfo.dDrillLen - Drilling.ToolInfo.dResidualDepth + table.insert( Machining, Drilling) + + Drilling2.nType = MCH_MY.DRILLING + Drilling2.nToolIndex = Drilling2.ToolInfo.nToolIndex + Drilling2.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, 0}} + Drilling2.bInvert = true + Drilling2.vtToolDirection = -Proc.FeatureInfo.vtDrillExtrusion + Drilling2.sDepth = Proc.FeatureInfo.dDrillLen - Drilling2.ToolInfo.dResidualDepth + table.insert( Machining, Drilling2) + if Drilling.ToolInfo.dResidualDepth + Drilling2.ToolInfo.dResidualDepth < Proc.FeatureInfo.dDrillLen then + Strategy.Result.sStatus = 'Not-Completed' + local dMachinedLen = Machining[1].sDepth + Machining[2].sDepth + local dMachinedPrercentage = 100 * ( dMachinedLen / Proc.FeatureInfo.dDrillLen) + Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dMachinedPrercentage) + Strategy.Result.sInfo = 'Machining not complete, left ' .. tostring( 100 - ceil( dMachinedPrercentage)) .. '%' + else + Strategy.Result.sStatus = 'Completed' + Strategy.Result.nCompletionIndex = 5 + Strategy.Result.sInfo = '' + end + -- voto + Strategy.Result.dMRR = MachiningLib.GetToolMRR( Machining[1].ToolInfo) + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Drill') + -- se utensile 1 non completo + elseif Drilling.ToolInfo.nToolIndex and ( Strategy.Parameters.sDrillingMode ~= 'FORCE_TWO' or Proc.FeatureInfo.bIsDrillOpen) then + Drilling.sDepth = Proc.FeatureInfo.dDrillLen - Drilling.ToolInfo.dResidualDepth + Drilling.nType = MCH_MY.DRILLING + Drilling.nToolIndex = Drilling.ToolInfo.nToolIndex + Drilling.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, 0}} + Drilling.vtToolDirection = Proc.FeatureInfo.vtDrillExtrusion + Drilling.sDepth = Proc.FeatureInfo.dDrillLen - Drilling.ToolInfo.dResidualDepth + table.insert( Machining, Drilling) + -- voto + Strategy.Result.sStatus = 'Not-Completed' + local dMachinedLen = Machining[1].sDepth + local dMachinedPrercentage = 100 * ( dMachinedLen / Proc.FeatureInfo.dDrillLen) + Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dMachinedPrercentage) + Strategy.Result.sInfo = 'Machining not complete, left ' .. tostring( 100 - ceil( dMachinedPrercentage)) .. '%' + Strategy.Result.dMRR = MachiningLib.GetToolMRR( Machining[1].ToolInfo) + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Drill') + -- se utensile 2 non completo + elseif Drilling2.ToolInfo.nToolIndex and Strategy.Parameters.sDrillingMode ~= 'FORCE_TWO' then + Drilling2.sDepth = Proc.FeatureInfo.dDrillLen - Drilling2.ToolInfo.dResidualDepth + Drilling2.nType = MCH_MY.DRILLING + Drilling2.nToolIndex = Drilling2.ToolInfo.nToolIndex + Drilling2.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, 0}} + Drilling2.bInvert = true + Drilling2.vtToolDirection = -Proc.FeatureInfo.vtDrillExtrusion + Drilling2.sDepth = Proc.FeatureInfo.dDrillLen - Drilling2.ToolInfo.dResidualDepth + table.insert( Machining, Drilling2) + -- voto + Strategy.Result.sStatus = 'Not-Completed' + local dMachinedLen = Machining[1].sDepth + local dMachinedPrercentage = 100 * ( dMachinedLen / Proc.FeatureInfo.dDrillLen) + Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dMachinedPrercentage) + Strategy.Result.sInfo = 'Machining not complete, left ' .. tostring( 100 - ceil( dMachinedPrercentage)) .. '%' + Strategy.Result.dMRR = MachiningLib.GetToolMRR( Machining[1].ToolInfo) + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Drill') + else + local sMessage + -- se non sono state trovate punte + if not Drilling.ToolInfo.nToolIndex and not Drilling2.ToolInfo.nToolIndex then + sMessage = 'Drillbit not found' + -- se son state trovate delle punte, ma non รจ stato possibile forare da entrambe le parti + elseif Strategy.Parameters.sDrillingMode == 'FORCE_TWO' then + sMessage = "Not possible to force machining from both sides. Please change drilling mode to AUTO" + end + Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( sMessage) + end + end + return Machining, Strategy.Result +end + +------------------------------------------------------------------------------------------------------------- +function STR0013.Make( bAddMachining, Proc, Part, CustomParameters) + -- carico parametri da default e li aggiorno con quelli passati dal chiamante (potrebbero non essere congruenti) + local StrategyLib = {} + StrategyLib.Config = STRATEGIES_CONFIG[CustomParameters.sStrategyId] + Strategy.sName = StrategyLib.Config.sStrategyId + Strategy.Parameters = BeamLib.LoadCustomParametersInStrategy( Proc, CustomParameters, StrategyLib.Config) + Strategy.Machinings = {} + Strategy.Result = {} + + local bAreAllMachiningsAdded + + Strategy.Machinings, Strategy.Result = GetDrillingStrategy( Proc, Part) + + if bAddMachining and Strategy.Result.sStatus ~= 'Not-Applicable' then + -- aggiunge lavorazione + for j = 1, #Strategy.Machinings do + bAreAllMachiningsAdded = MachiningLib.AddMachinings( Proc, Strategy.Machinings[j]) + end + end + + return bAreAllMachiningsAdded, Strategy.Result +end + +------------------------------------------------------------------------------------------------------------- + + return STR0013 \ No newline at end of file