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..d6a312d 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 @@ -518,7 +518,7 @@ function BeamLib.LoadCustomParametersInStrategy( Proc, Part, CustomParameters, D for i = 1, #DefaultStrategyParamList.ParameterList do local xParameterValue = nil -- se strategia forzata, leggo eventuali parametri nelle info - if CustomParameters and CustomParameters.bForcedStrategy then + if CustomParameters and CustomParameters.bForcedStrategy and DefaultStrategyParamList.ParameterList[i].sNameNge then local sParameterToRead = DefaultStrategyParamList.sStrategyId .. '_' .. DefaultStrategyParamList.ParameterList[i].sNameNge local sForcedParameterForProc = EgtGetInfo( Proc.id, sParameterToRead, 's') -- se ho trovato il valore, lo sovrascrivo al default diff --git a/LuaLibs/FaceData.lua b/LuaLibs/FaceData.lua index 679b7e1..2f91b31 100644 --- a/LuaLibs/FaceData.lua +++ b/LuaLibs/FaceData.lua @@ -358,7 +358,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 @@ -660,7 +662,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..3111d12 100644 --- a/LuaLibs/FeatureLib.lua +++ b/LuaLibs/FeatureLib.lua @@ -32,6 +32,8 @@ function FeatureLib.GetProcFromTrimesh( idTrimesh, Part, ProcToCopyFrom) Proc.AffectedFaces = BeamLib.GetAffectedFaces( Proc, Part) Proc.AdjacencyMatrix = FaceData.GetAdjacencyMatrix( Proc) Proc.Faces = FaceData.GetFacesInfo( Proc, Part) + Proc.NotClampableLength = FeatureLib.CalculateFeatureNotClampableLengths( Proc, Part) + Proc.bHindersLaserMeasure = FeatureLib.CalculateFeatureHindersLaserMeasure( Proc, Part) -- TODO servono anche altri dati raccolti nel collect?? return Proc @@ -706,6 +708,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..514b9dc 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 @@ -861,41 +865,41 @@ end -- TODO funziona solo con attacco perpendicolare - da aggiungere gestione in caso di attacco tangenziale function MachiningLib.AddMachinings( Proc, Machining, AuxiliaryData) local bMachiningAdded = false + local NewAuxiliaryData = {} + + -- se esistono i dati ausiliari li copio in locale perchè il parametro è una tabella per riferimento + if AuxiliaryData then + NewAuxiliaryData = BeamLib.TableCopyDeep( AuxiliaryData) + end if Machining.CloneStepsRadial and Machining.CloneStepsRadial.nCount > 1 then - if not AuxiliaryData then - AuxiliaryData = {} - end - AuxiliaryData.Clones = {} + NewAuxiliaryData.Clones = {} local dOriginalRadialOffset = Machining.dRadialOffset local dOriginalLeadInPerpDistance = Machining.LeadIn.dPerpDistance local dOriginalLeadOutPerpDistance = Machining.LeadOut.dPerpDistance for i = 1, Machining.CloneStepsRadial.nCount do - AuxiliaryData.Clones[i] = {} - AuxiliaryData.Clones[i].dRadialOffset = dOriginalRadialOffset + Machining.CloneStepsRadial.dStep * ( Machining.CloneStepsRadial.nCount - i) + NewAuxiliaryData.Clones[i] = {} + NewAuxiliaryData.Clones[i].dRadialOffset = dOriginalRadialOffset + Machining.CloneStepsRadial.dStep * ( Machining.CloneStepsRadial.nCount - i) -- update distanza perpendicolare attacco per contemplare l'offset applicato if abs( dOriginalLeadInPerpDistance) > 10 * GEO.EPS_SMALL and abs( dOriginalLeadOutPerpDistance) > 10 * GEO.EPS_SMALL then - AuxiliaryData.Clones[i].LeadIn = {} - AuxiliaryData.Clones[i].LeadOut = {} - AuxiliaryData.Clones[i].LeadIn.dPerpDistance = dOriginalLeadInPerpDistance - AuxiliaryData.Clones[i].dRadialOffset + dOriginalRadialOffset - AuxiliaryData.Clones[i].LeadOut.dPerpDistance = dOriginalLeadOutPerpDistance - AuxiliaryData.Clones[i].dRadialOffset + dOriginalRadialOffset + NewAuxiliaryData.Clones[i].LeadIn = {} + NewAuxiliaryData.Clones[i].LeadOut = {} + NewAuxiliaryData.Clones[i].LeadIn.dPerpDistance = dOriginalLeadInPerpDistance - NewAuxiliaryData.Clones[i].dRadialOffset + dOriginalRadialOffset + NewAuxiliaryData.Clones[i].LeadOut.dPerpDistance = dOriginalLeadOutPerpDistance - NewAuxiliaryData.Clones[i].dRadialOffset + dOriginalRadialOffset end end elseif Machining.CloneStepsLongitudinal and Machining.CloneStepsLongitudinal.nCount > 1 then - if not AuxiliaryData then - AuxiliaryData = {} - end - AuxiliaryData.Clones = {} + NewAuxiliaryData.Clones = {} local dOriginalRadialOffset = Machining.dRadialOffset for i = Machining.CloneStepsLongitudinal.nCount, 1, -1 do - AuxiliaryData.Clones[i] = {} - AuxiliaryData.Clones[i].dRadialOffset = dOriginalRadialOffset + Machining.CloneStepsLongitudinal.dStep * ( i - 1) + NewAuxiliaryData.Clones[i] = {} + NewAuxiliaryData.Clones[i].dRadialOffset = dOriginalRadialOffset + Machining.CloneStepsLongitudinal.dStep * ( i - 1) end end - bMachiningAdded = AddNewMachining( Proc, Machining, AuxiliaryData) + bMachiningAdded = AddNewMachining( Proc, Machining, NewAuxiliaryData) return bMachiningAdded end diff --git a/Strategies/Standard/HEADCUT/HEADCUT.lua b/Strategies/Standard/HEADCUT/HEADCUT.lua index 216cdb9..30d9383 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/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/STR0012/STR0012.lua b/Strategies/Standard/STR0012/STR0012.lua index 8894984..f1b933e 100644 --- a/Strategies/Standard/STR0012/STR0012.lua +++ b/Strategies/Standard/STR0012/STR0012.lua @@ -10,6 +10,7 @@ local MachiningLib = require( 'MachiningLib') local FeatureLib = require( 'FeatureLib') -- strategie di base local BladeToWaste = require( 'BLADETOWASTE') +local BladeKeepWaste =require ( 'BLADEKEEPWASTE') -- Tabella per definizione modulo local STR0012 = {} @@ -42,6 +43,7 @@ function STR0012.Make( bAddMachining, Proc, Part, CustomParameters) local dMRRBladeAddedFace = 0 local dCompletionPercentageAddedFace = 0 local dQualityAddedFace = 0 + local AuxiliaryData = { bIgnoreNotClampableLength = false} -- gestito solo RidgeLap 3 facce if Proc.nFct ~= 3 then @@ -78,39 +80,57 @@ function STR0012.Make( bAddMachining, Proc, Part, CustomParameters) -- rimozione della terza faccia dalla Proc local idNewProc = EgtCopyGlob( Proc.id, nAddGrpId) EgtSurfTmRemoveFacet( idNewProc, nAddedFace) - Proc = FeatureLib.GetProcFromTrimesh( idNewProc, Part, Proc) + local NewProc = FeatureLib.GetProcFromTrimesh( idNewProc, Part, Proc) + NewProc.Topology = FeatureLib.ClassifyTopology( NewProc, Part) -- TODO rimuovere??? codolo da implementare o no?? -- considerazioni necessarie a determinare se lavorare con codolo oppure no local bKeepWasteAttached = ( Strategy.Parameters.sCuttingStrategy == 'KEEP_WASTE_ATTACHED') local bDropWaste = ( Strategy.Parameters.sCuttingStrategy == 'DROP_WASTE') - local dFeatureMaxNotClampableLengthHead, dFeatureMaxNotClampableLengthTail = FeatureLib.GetFeatureMaxNotClampableLengths( Proc, Part) + local dFeatureMaxNotClampableLengthHead, dFeatureMaxNotClampableLengthTail = FeatureLib.GetFeatureMaxNotClampableLengths( NewProc, Part) local bFeatureHindersClamping = FeatureLib.IsMachiningLong( max( dFeatureMaxNotClampableLengthHead, dFeatureMaxNotClampableLengthTail), Part, { dMaxSegmentLength = BeamData.LONGCUT_ENDLEN}) - local bIsFeatureLong = FeatureLib.IsMachiningLong( Proc.b3Box:getDimX(), Part, { dMaxSegmentLength = BeamData.LONGCUT_ENDLEN}) + local bIsFeatureLong = FeatureLib.IsMachiningLong( NewProc.b3Box:getDimX(), Part, { dMaxSegmentLength = BeamData.LONGCUT_ENDLEN}) + + -- lavorazione con codolo + if ( bIsFeatureLong) + or ( bFeatureHindersClamping and not bDropWaste) + or bKeepWasteAttached then + + local BladeKeepWasteResult + local OptionalParameters = { dExtendAfterTail = dExtendAfterTail, dStripWidth = 5, bFinishWithMill = false} + AuxiliaryData.bIgnoreNotClampableLength = true + TwoFaces.Result, BladeKeepWasteResult = BladeKeepWaste.Make( NewProc, Part, OptionalParameters) + dTimeToMachine = BladeKeepWasteResult.dTimeToMachine + dMRRBlade = BladeKeepWasteResult.dMRR + dCompletionPercentage = BladeKeepWasteResult.dCompletionPercentage + dQuality = BladeKeepWasteResult.dQuality -- lavorazione a cubetti facce concave - local dMinZTopBlade - local dMaxNyTopBlade - local BladeToWasteResult - if Strategy.Parameters.dMinZAngleTopBlade then - dMinZTopBlade = sin( Strategy.Parameters.dMinZAngleTopBlade) + else + local dMinZTopBlade + local dMaxNyTopBlade + local BladeToWasteResult + if Strategy.Parameters.dMinZAngleTopBlade then + dMinZTopBlade = sin( Strategy.Parameters.dMinZAngleTopBlade) + end + if Strategy.Parameters.dMaxYAngleTopBlade then + dMaxNyTopBlade = sin( Strategy.Parameters.dMaxYAngleTopBlade) + end + local OptionalParameters = { dMaxWasteVolume = Strategy.Parameters.dMaxWasteVolume, + dMaxWasteLength = Strategy.Parameters.dMaxWasteLength, + dMinNzTopBlade = dMinZTopBlade, + dMaxNyTopBlade = dMaxNyTopBlade, + bSaveAddedGeometries = bAddMachining, + dExtendAfterTail = dExtendAfterTail, + bReduceBladePath = Strategy.Parameters.bReduceBladePath + } + AuxiliaryData.bIgnoreNotClampableLength = false + TwoFaces.Result, BladeToWasteResult = BladeToWaste.Make( NewProc, Part, OptionalParameters) + dTimeToMachine = BladeToWasteResult.dTimeToMachine + dMRRBlade = BladeToWasteResult.dMRR + dCompletionPercentage = BladeToWasteResult.dCompletionPercentage + dQuality = BladeToWasteResult.dQuality end - if Strategy.Parameters.dMaxYAngleTopBlade then - dMaxNyTopBlade = sin( Strategy.Parameters.dMaxYAngleTopBlade) - end - local OptionalParameters = { dMaxWasteVolume = Strategy.Parameters.dMaxWasteVolume, - dMaxWasteLength = Strategy.Parameters.dMaxWasteLength, - dMinNzTopBlade = dMinZTopBlade, - dMaxNyTopBlade = dMaxNyTopBlade, - bSaveAddedGeometries = bAddMachining, - dExtendAfterTail = dExtendAfterTail, - bReduceBladePath = Strategy.Parameters.bReduceBladePath - } - TwoFaces.Result, BladeToWasteResult = BladeToWaste.Make( Proc, Part, OptionalParameters) - dTimeToMachine = BladeToWasteResult.dTimeToMachine - dMRRBlade = BladeToWasteResult.dMRR - dCompletionPercentage = BladeToWasteResult.dCompletionPercentage - dQuality = BladeToWasteResult.dQuality -- lavorazione terza faccia -- TODO da completare @@ -162,7 +182,7 @@ function STR0012.Make( bAddMachining, Proc, Part, CustomParameters) if RidgeLap.Result[i].bIsApplicable then nIsApplicableCount = nIsApplicableCount + 1 if bAddMachining then - local bIsMachiningAdded = MachiningLib.AddMachinings( OriginalProc, RidgeLap.Result[i]) + local bIsMachiningAdded = MachiningLib.AddMachinings( OriginalProc, RidgeLap.Result[i], AuxiliaryData) if not bIsMachiningAdded then bAreAllMachiningsAdded = false end 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