-- Strategia: STR0012 -- Descrizione -- RidgeLap -- Feature: RidgeLap -- carico librerie local BeamLib = require( 'BeamLib') local BeamData = require( 'BeamDataNew') 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 = {} local Strategy = {} local RidgeLap = {} RidgeLap.Result = {} ------------------------------------------------------------------------------------------------------------- -- TODO risolvere problemi calcolo volume nullo se facce rimosse -- TODO gestire lavorazione con svuotatura -- TODO risolvere problema ultimo cubetto troppo profondo!! -- TODO gestire strategia con fresa function STR0012.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, Part, CustomParameters, StrategyLib.Config) Strategy.Result = {} Strategy.Result.sInfo = '' RidgeLap.Result = {} local TwoFaces = {} local AddedFace = {} TwoFaces.Result = {} AddedFace.Result = {} local dTimeToMachine = 0 local dMRRBlade = 0 local dCompletionPercentage = 0 local dQuality = 0 local dMRRBladeAddedFace = 0 local dCompletionPercentageAddedFace = 0 local dQualityAddedFace = 0 local AuxiliaryData = { bIgnoreNotClampableLength = false} -- gestito solo RidgeLap 3 facce if Proc.nFct ~= 3 then Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Only RidgeLap 3 faces is applicable') end -- estensione oltre la coda local dExtendAfterTail = Strategy.Parameters.dExtendAfterTail or max( Part.dDistanceToNextPiece - BeamData.CUT_EXTRA, 0) if MachiningLib.CanExtendAfterTail( Strategy.Parameters.sCanDamageNextPiece, Part) then dExtendAfterTail = 10000 end -- separazione della terza faccia local idAddedTmFace local nAddedFace if Proc.AdjacencyMatrix[2][3] < 0 then nAddedFace = 1 - 1 elseif Proc.AdjacencyMatrix[1][3] < 0 then nAddedFace = 2 - 1 else nAddedFace = 3 - 1 end local OriginalProc = Proc -- recupero gruppo per geometria addizionale local nAddGrpId = BeamLib.GetAddGroup( Part.id) -- se la faccia aggiuntiva non corrisponde al taglio di testa o di coda, si deve lavorare come faccia singola if not( AreSameVectorApprox( Proc.Faces[nAddedFace + 1].vtN, X_AX()) and abs( Proc.Faces[nAddedFace + 1].ptCenter:getX() - Part.b3Part:getMax():getX()) < 10 * GEO.EPS_SMALL) and not( AreSameVectorApprox( Proc.Faces[nAddedFace + 1].vtN, -X_AX()) and abs( Proc.Faces[nAddedFace + 1].ptCenter:getX() - Part.b3Part:getMin():getX()) < 10 * GEO.EPS_SMALL) then -- faccia aggiuntiva da lavorare: si estende fino al box della parte local idAddGroup if bAddMachining then idAddGroup = BeamLib.GetAddGroup( Part.id) else idAddGroup = Part.idTempGroup end idAddedTmFace = EgtSurfTmPlaneInBBox( idAddGroup, Proc.Faces[nAddedFace + 1].ptCenter, Proc.Faces[nAddedFace + 1].vtN, Part.b3Part, GDB_ID.ROOT) end -- rimozione della terza faccia dalla Proc local idNewProc = EgtCopyGlob( Proc.id, nAddGrpId) EgtSurfTmRemoveFacet( idNewProc, nAddedFace) local NewProc = FeatureLib.GetProcFromTrimesh( idNewProc, Part, Proc) NewProc.Topology = FeatureLib.ClassifyTopology( NewProc, Part) NewProc.NotClampableLength = FeatureLib.CalculateFeatureNotClampableLengths( NewProc, Part) NewProc.bHindersLaserMeasure = FeatureLib.CalculateFeatureHindersLaserMeasure( NewProc, Part) -- 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 bFeatureHindersClamping = MachiningLib.IsFeatureHinderingClamping( Proc, Part) -- lavorazione con codolo if ( 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 else local BladeToWasteResult local OptionalParameters = { dMaxWasteVolume = Strategy.Parameters.dMaxWasteVolume, dMaxWasteLength = Strategy.Parameters.dMaxWasteLength, 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 -- lavorazione terza faccia -- TODO da completare -- TODO va messa per prima???????? if idAddedTmFace then local BladeToWasteResult local OptionalParameters = { dMaxWasteVolume = Strategy.Parameters.dMaxWasteVolume, dMaxWasteLength = Strategy.Parameters.dMaxWasteLength, bSaveAddedGeometries = bAddMachining, dExtendAfterTail = dExtendAfterTail, bReduceBladePath = Strategy.Parameters.bReduceBladePath } AddedFace.Result, BladeToWasteResult = BladeToWaste.Make( idAddedTmFace, Part, OptionalParameters) -- TODO calcolo risultati da aggiornare con funzioni nuove dMRRBladeAddedFace = BladeToWasteResult.dMRR dCompletionPercentageAddedFace = BladeToWasteResult.dCompletionPercentage dQualityAddedFace = BladeToWasteResult.dQuality dTimeToMachine = dTimeToMachine + BladeToWasteResult.dTimeToMachine -- la faccia aggiuntiva conta per 1/3 dMRRBlade = 2/3 * dMRRBlade + 1/3 * dMRRBladeAddedFace dCompletionPercentage = 2/3 * dCompletionPercentage + 1/3 * dCompletionPercentageAddedFace dQuality = 2/3 * dQuality + 1/3 * dQualityAddedFace end -- lavorazioni in lista unica for i = 1, #AddedFace.Result do table.insert( RidgeLap.Result, AddedFace.Result[i]) end for i = 1, #TwoFaces.Result do table.insert( RidgeLap.Result, TwoFaces.Result[i]) end -- aggiunta lavorazioni local nIsApplicableCount = 0 local bAreAllMachiningsAdded = true for i = 1, #RidgeLap.Result do if RidgeLap.Result[i].bIsApplicable then nIsApplicableCount = nIsApplicableCount + 1 if bAddMachining then local bIsMachiningAdded = MachiningLib.AddMachinings( OriginalProc, RidgeLap.Result[i], AuxiliaryData) if not bIsMachiningAdded then bAreAllMachiningsAdded = false end end Strategy.Result.sInfo = Strategy.Result.sInfo .. '\n' .. RidgeLap.Result[i].sMessage end end -- TODO migliorare calcolo area lavorata; se ho il codolo ha senso l'incompleta? se incompleta con codolo faccio i cubetti?? -- TODO settare che il codolo restituisce incompleta tranne quando รจ forzato if nIsApplicableCount > 0 then if dCompletionPercentage > 100 - 10 * GEO.EPS_SMALL then Strategy.Result.sStatus = 'Completed' else Strategy.Result.sStatus = 'Not-Completed' end Strategy.Result.dCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dCompletionPercentage) Strategy.Result.dQuality = dQuality Strategy.Result.dTimeToMachine = dTimeToMachine Strategy.Result.dMRR = dMRRBlade else Strategy.Result.sStatus = 'Not-Applicable' Strategy.Result = FeatureLib.GetStrategyResultNotApplicable() end return bAreAllMachiningsAdded, Strategy.Result end ------------------------------------------------------------------------------------------------------------- return STR0012