diff --git a/LuaLibs/BasicCustomerStrategies.lua b/LuaLibs/BasicCustomerStrategies.lua index 8d71b07..8a933f3 100644 --- a/LuaLibs/BasicCustomerStrategies.lua +++ b/LuaLibs/BasicCustomerStrategies.lua @@ -218,10 +218,27 @@ local function GetStrategies_Egalware( Proc) Strategies = { { sStrategyId = 'STR0002'}} elseif Proc.Topology.sName == 'Rabbet-2-Through' then Strategies = { { sStrategyId = 'STR0002'}} + elseif Proc.Topology.sName == 'Pocket-Round' or Proc.Topology.sName == 'Pocket-Round-Front' or Proc.Topology.sName == 'Pocket-Round-Through' then + Strategies = { { sStrategyId = 'STR0008'}} end --------------------------------------------------------------------- -- Feature : Front Mortise (0-51) elseif ID.IsFrontMortise( Proc) then + if Proc.Topology.sName == 'Pocket-5-Blind' then + Strategies = { { sStrategyId = 'STR0002'}, { sStrategyId = 'STR0003'}, { sStrategyId = 'STR0004'}} + elseif Proc.Topology.sName == 'Groove-4-Blind' then + Strategies = { { sStrategyId = 'STR0002'}, { sStrategyId = 'STR0003'}, { sStrategyId = 'STR0004'}} + elseif Proc.Topology.sName == 'Groove-3-Through' then + Strategies = { { sStrategyId = 'STR0002'}, { sStrategyId = 'STR0003'}, { sStrategyId = 'STR0004'}} + elseif Proc.Topology.sName == 'Tunnel-4-Through' then + Strategies = { { sStrategyId = 'STR0002'}, { sStrategyId = 'STR0003'}, { sStrategyId = 'STR0004'}} + elseif Proc.Topology.sName == 'Groove-3-Blind' then + Strategies = { { sStrategyId = 'STR0002'}} + elseif Proc.Topology.sName == 'Rabbet-2-Through' then + Strategies = { { sStrategyId = 'STR0002'}} + elseif Proc.Topology.sName == 'Pocket-Round' or Proc.Topology.sName == 'Pocket-Round-Front' or Proc.Topology.sName == 'Pocket-Round-Through' then + Strategies = { { sStrategyId = 'STR0008'}} + end --------------------------------------------------------------------- -- Feature : House (1-52) elseif ID.IsHouse( Proc) then @@ -493,10 +510,27 @@ local function GetStrategies_Essetre( Proc) Strategies = { { sStrategyId = 'STR0002'}} elseif Proc.Topology.sName == 'Rabbet-2-Through' then Strategies = { { sStrategyId = 'STR0002'}} + elseif Proc.Topology.sName == 'Pocket-Round' or Proc.Topology.sName == 'Pocket-Round-Front' or Proc.Topology.sName == 'Pocket-Round-Through' then + Strategies = { { sStrategyId = 'STR0008'}} end --------------------------------------------------------------------- -- Feature : Front Mortise (0-51) elseif ID.IsFrontMortise( Proc) then + if Proc.Topology.sName == 'Pocket-5-Blind' then + Strategies = { { sStrategyId = 'STR0002'}, { sStrategyId = 'STR0003'}, { sStrategyId = 'STR0004'}} + elseif Proc.Topology.sName == 'Groove-4-Blind' then + Strategies = { { sStrategyId = 'STR0002'}, { sStrategyId = 'STR0003'}, { sStrategyId = 'STR0004'}} + elseif Proc.Topology.sName == 'Groove-3-Through' then + Strategies = { { sStrategyId = 'STR0002'}, { sStrategyId = 'STR0003'}, { sStrategyId = 'STR0004'}} + elseif Proc.Topology.sName == 'Tunnel-4-Through' then + Strategies = { { sStrategyId = 'STR0002'}, { sStrategyId = 'STR0003'}, { sStrategyId = 'STR0004'}} + elseif Proc.Topology.sName == 'Groove-3-Blind' then + Strategies = { { sStrategyId = 'STR0002'}} + elseif Proc.Topology.sName == 'Rabbet-2-Through' then + Strategies = { { sStrategyId = 'STR0002'}} + elseif Proc.Topology.sName == 'Pocket-Round' or Proc.Topology.sName == 'Pocket-Round-Front' or Proc.Topology.sName == 'Pocket-Round-Through' then + Strategies = { { sStrategyId = 'STR0008'}} + end --------------------------------------------------------------------- -- Feature : House (1-52) elseif ID.IsHouse( Proc) then diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 85bc6f3..eb2ffde 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -634,8 +634,8 @@ local function CollectFeatures( Part) Proc.Faces = FaceData.GetFacesInfo( Proc, Part) Proc.Topology = FeatureLib.ClassifyTopology( Proc, Part) else - Proc.Topology = FeatureLib.ClassifyFeature( Proc, Part) Proc = FeatureLib.GetAdditionalInfo( Proc, Part) + Proc.Topology = FeatureLib.ClassifyFeature( Proc, Part) end -- se topologia feature riconosciuta, oppure da non calcolare perchè il riconoscimento topologico è basato sulla feature stessa if Proc.Topology.sName ~= 'NOT_IMPLEMENTED' then diff --git a/LuaLibs/FeatureLib.lua b/LuaLibs/FeatureLib.lua index 934c55b..2da8c8e 100644 --- a/LuaLibs/FeatureLib.lua +++ b/LuaLibs/FeatureLib.lua @@ -234,14 +234,16 @@ end -- recupera classificazione feature (da info BTL, non geometrica) function FeatureLib.ClassifyFeature( Proc, Part) local Topology = {} - + Topology.sFamily = 'FEATURE' - -- setto topologia da info BTL se raggiata - if ID.IsMortise( Proc) then - Topology.sName = 'Pocket-5-Round' - -- setto topologia da info BTL se raggiata - elseif ID.IsFrontMortise( Proc) then - Topology.sName = 'Pocket-5-Round-Front' + -- per feature 'Mortasa' si setta topologia da info BTL se raggiata + if ID.IsMortise( Proc) or ID.IsFrontMortise( Proc) then + Topology.sName = 'Pocket-Round' + if Proc.FeatureInfo.bIsFrontMortise then + Topology.sName = Topology.sName .. '-Front' + elseif Proc.FeatureInfo.bIsMortiseThrough then + Topology.sName = Topology.sName .. '-Through' + end else Topology.sName = 'FEATURE' end @@ -260,6 +262,9 @@ function FeatureLib.GetAdditionalInfo( Proc, Part) -- se mortasa a coda di rondine o mortasa frontale a coda di rondine elseif ID.IsDovetailMortise( Proc) or ID.IsFrontDovetailMortise( Proc) then Proc.FeatureInfo = FeatureLib.GetDTMortiseData( Proc) + -- se mortasa a coda di rondine o mortasa frontale a coda di rondine + elseif ID.IsMortise( Proc) or ID.IsFrontMortise( Proc) then + Proc.FeatureInfo = FeatureLib.GetMortiseData( Proc) end return Proc @@ -343,7 +348,7 @@ function FeatureLib.GetTenonData( Proc) end ------------------------------------------------------------------------------------------------------------- --- Recupero dati foro e adattamento se speciale +-- Recupero dati fmortasa a coda di rondine function FeatureLib.GetDTMortiseData( Proc) local FeatureExtraInfo = {} @@ -389,6 +394,47 @@ function FeatureLib.GetDTMortiseData( Proc) return FeatureExtraInfo end +------------------------------------------------------------------------------------------------------------- +-- Recupero dati mortasa +function FeatureLib.GetMortiseData( Proc) + local FeatureExtraInfo = {} + + local idAux = EgtGetInfo( Proc.id, 'AUXID', 'i') + if idAux then idAux = idAux + Proc.id end + local vtMortiseN = EgtCurveExtrusion( idAux, GDB_RT.GLOB) + + -- recupero i dati della faccia di fondo + local frMortise, dMortiseLength, dMortiseWidth = EgtSurfTmFacetMinAreaRectangle( Proc.id, 0, GDB_ID.ROOT) + local ptC = frMortise:getOrigin() + local vtN = frMortise:getVersZ() + -- determino altezza della mortasa + local b3Mortise = EgtGetBBoxRef( Proc.id, GDB_BB.STANDARD, frMortise) + local dMortiseDepth = b3Mortise:getDimZ() + -- Confronto le direzioni dei 2 versori : se diverse la faccia 0 non è il fondo => mortasa passante + local bMortiseThrough = not AreSameVectorApprox( vtMortiseN, vtN) + + -- recupero il raggio minimo della mortasa + local dMortiseMinRadius = 1000 + local nSt, nEnd = EgtCurveDomain( idAux) + for i = nSt, nEnd - 1 do + local dRad = EgtCurveCompoRadius( idAux, i) + if dRad > 0 and dRad < dMortiseMinRadius then + dMortiseMinRadius = dRad + end + end + + FeatureExtraInfo.bIsFrontMortise = Proc.nPrc == 51 + FeatureExtraInfo.bIsMortiseThrough = bMortiseThrough + FeatureExtraInfo.dMortiseLength = dMortiseLength + FeatureExtraInfo.dMortiseWidth = dMortiseWidth + FeatureExtraInfo.dMortiseDepth = dMortiseDepth + FeatureExtraInfo.dMortiseMinRadius = dMortiseMinRadius + FeatureExtraInfo.vtMortiseN = vtMortiseN + FeatureExtraInfo.idAddAuxGeom = idAux + + return FeatureExtraInfo +end + ------------------------------------------------------------------------------------------------------------- -- funzione che restituisce indice di completamento in base alla percentuale di volume lavorato function FeatureLib.GetFeatureCompletionIndex( dCompletionPercentage) diff --git a/Strategies/Standard/STR0008/STR0008.lua b/Strategies/Standard/STR0008/STR0008.lua new file mode 100644 index 0000000..411d718 --- /dev/null +++ b/Strategies/Standard/STR0008/STR0008.lua @@ -0,0 +1,153 @@ +-- Strategia: STR0008 +-- Descrizione +-- Svuotatura tasca +-- Feature tipo Mortise (con raggio) + + +-- carico librerie +local BeamLib = require( 'BeamLib') +local BeamData = require( 'BeamData') +local MachiningLib = require( 'MachiningLib') +local FeatureLib = require( 'FeatureLib') + +-- Tabella per definizione modulo +local STR0008 = {} +local Strategy = {} + +------------------------------------------------------------------------------------------------------------- +local function IsTopologyOk( Proc) + if Proc.Topology.sName == 'Pocket-Round' or + Proc.Topology.sName == 'Pocket-Round-Through' or + Proc.Topology.sName == 'Pocket-Round-Front' then + + return true + else + return false + end +end + +------------------------------------------------------------------------------------------------------------- +local function GetBestPocketingStrategy( Proc) + -- imposto parametri di ricerca utensile in base a topologia + local Machining = {} + local Milling = {} + local ToolSearchParameters = {} + ToolSearchParameters.sMillShape = 'STANDARD' + ToolSearchParameters.dMaxToolDiameter = Proc.FeatureInfo.dMortiseMinRadius * 2 + Machining.sTypeMachining = 'None' -- Bottom\ Side1\ Side2\ Side1-Side2\ None + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Mill') + + -- ===== RICERCA UTENSILE ===== + -- cerco utensile per lavorare faccia Bottom + Milling.bIsApplicable = false + if Proc.Topology.sName == 'Pocket-Round' or Proc.Topology.sName == 'Pocket-Round-Front' then + ToolSearchParameters.dElevation = Proc.FeatureInfo.dMortiseDepth + ToolSearchParameters.vtToolDirection = Proc.FeatureInfo.vtMortiseN + Milling.idFaceToMachine = 0 -- ATTENZIONE: Per convenzione, la faccia di fondo della mortasa ha sempre indice 0 + Milling.idProc = Proc.id + Milling.vtFaceNormal = Proc.FeatureInfo.vtMortiseN + Milling.dElevation = Proc.FeatureInfo.dMortiseDepth + Milling.ToolInfo = {} + Milling.ToolInfo = MachiningLib.FindMill( Proc, ToolSearchParameters) + if Milling.ToolInfo.nToolIndex then + -- se utensile scelto è su aggregato, ricalcolo la qualità + if TOOLS[Milling.ToolInfo.nToolIndex].SetupInfo.bToolOnAggregate then + Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'MillOnAggregate') + end + Milling.bIsApplicable = true + local ParametersMRR = {} + ParametersMRR.nToolIndex = Milling.ToolInfo.nToolIndex + Strategy.Result.dMRR = MachiningLib.GetToolMRR( ParametersMRR) + Machining.sTypeMachining = 'Bottom' + if Milling.ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL then + Strategy.Result.sStatus = 'Completed' + Strategy.Result.dCompletionPercentage = 100 + else + Strategy.Result.sStatus = 'Not-Completed' + Strategy.Result.sInfo = 'Mortise not complete, left ' .. ceil( Machining.Pocketing.ToolInfo.dResidualDepth) .. 'mm' + Strategy.Result.dCompletionPercentage = ( Milling.ToolInfo.dResidualDepth * 100) / Proc.FeatureInfo.dMortiseDepth + end + Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( Strategy.Result.dCompletionPercentage) + table.insert( Machining, Milling) + end + -- si lavora faccia di mezzo + elseif 'Pocket-Round-Through' then + -- TODO aggiungere faccia di mezzo tipo tunnel e decidere da che parte lavorare + end + + -- 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' + end + + return Machining +end + +------------------------------------------------------------------------------------------------------------- +function STR0008.Make( bAddMachining, Proc, Part, CustomParameters) + -- carico parametri de default e li aggiorno con quelli passati dal chiamante (potrebbero non essere congruenti) + local StrategyLib = {} + StrategyLib.Config = require( 'STR0008\\STR0008Config') + Strategy.sName = StrategyLib.Config.sStrategyId + Strategy.Parameters = BeamLib.LoadCustomParametersInStrategy( Proc, CustomParameters, StrategyLib.Config) + Strategy.Machining = {} + Strategy.Result = {} + + 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 + return false, Strategy.Result + end + + local bAreAllMachiningsAdded = true + local Pocketing = {} + + Strategy.Machining = GetBestPocketingStrategy( Proc) + + if bAddMachining and Strategy.Result.sStatus ~= 'Not-Applicable' then + -- si applicano le lavorazioni + for j = 1, #Strategy.Machining do + if Strategy.Machining[j].bIsApplicable then + Pocketing = {} + Pocketing.Steps = {} + Pocketing.LeadIn = {} + Pocketing.nType = MCH_OY.POCKETING + Pocketing.nSubType = MCH_POCK_SUB.SPIRALOUT + Pocketing.LeadIn.nType = MCH_POCK_LI.ZIGZAG + Pocketing.Steps.dStep = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dStep + Pocketing.Steps.dSideStep = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dSideStep + Pocketing.nToolIndex = Strategy.Machining[j].ToolInfo.nToolIndex + Pocketing.LeadIn.dTangentDistance = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dDiameter/2 + Pocketing.LeadIn.dElevation = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dDiameter/2 + Pocketing.sDepth = min( 0, -Strategy.Machining[j].ToolInfo.dResidualDepth) + + Pocketing.Geometry = {{ Strategy.Machining[j].idProc, Strategy.Machining[j].idFaceToMachine}} + Pocketing.vtToolDirection = Strategy.Machining[j].vtFaceNormal + + -- TODO controllare parametro danneggiamento ammesso per decidere se spostare dopo taglio seprazione + -- se è aperta sulla coda, dico che deve essere fatta dopo la separazione + if Proc.AffectedFaces.bLeft then + Pocketing.sStage = 'AfterTail' + end + bAreAllMachiningsAdded = MachiningLib.AddMachinings( Proc, Pocketing) + end + end + else + bAreAllMachiningsAdded = false + end + + return bAreAllMachiningsAdded, Strategy.Result +end + +------------------------------------------------------------------------------------------------------------- + + return STR0008 \ No newline at end of file diff --git a/Strategies/Standard/STR0008/STR0008Config.lua b/Strategies/Standard/STR0008/STR0008Config.lua new file mode 100644 index 0000000..b27d775 --- /dev/null +++ b/Strategies/Standard/STR0008/STR0008Config.lua @@ -0,0 +1,9 @@ +-- Parametri configurabili da cliente per strategia: STR0008 + +local STR0008Data = { + sStrategyId = 'STR0008', + Parameters = { + } +} + +return STR0008Data \ No newline at end of file