Merge branch 'STR0006_Tenon' into develop
This commit is contained in:
@@ -201,6 +201,7 @@ local function GetStrategies_Egalware( Proc)
|
||||
---------------------------------------------------------------------
|
||||
-- Feature : Tenon
|
||||
elseif ID.IsTenon( Proc) then
|
||||
Strategies = { { sStrategyId = 'STR0006'}}
|
||||
---------------------------------------------------------------------
|
||||
-- Feature : Mortise
|
||||
elseif ID.IsMortise( Proc) then
|
||||
@@ -460,6 +461,7 @@ local function GetStrategies_Essetre( Proc)
|
||||
---------------------------------------------------------------------
|
||||
-- Feature : Tenon
|
||||
elseif ID.IsTenon( Proc) then
|
||||
Strategies = { { sStrategyId = 'STR0006'}}
|
||||
---------------------------------------------------------------------
|
||||
-- Feature : Mortise
|
||||
elseif ID.IsMortise( Proc) then
|
||||
|
||||
+30
-36
@@ -211,12 +211,13 @@ end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
function FeatureLib.GetAdditionalInfo( Proc, Part)
|
||||
-- se foro calcolo altri dati
|
||||
Proc.FeatureInfo = {}
|
||||
-- se foro
|
||||
if ID.IsDrilling( Proc) then
|
||||
-- assegno diametro e facce di ingresso e uscita (dati tabelle sempre per riferimento)
|
||||
Proc.dDiam, Proc.dLen, Proc.nFcs, Proc.nFce = FeatureLib.GetDrillingData( Proc)
|
||||
elseif ID.IsDovetailTenon( Proc) then
|
||||
Proc.dDTLength, Proc.dDTMaxDist, Proc.vtDTNormal, Proc.ptDTCenter, Proc.idAddAuxGeom = FeatureLib.GetDoveTailTenonData( Proc)
|
||||
Proc.FeatureInfo = FeatureLib.GetDrillingData( Proc)
|
||||
-- se tenone o tenone a coda di rondine
|
||||
elseif ID.IsTenon( Proc) or ID.IsDovetailTenon( Proc) then
|
||||
Proc.FeatureInfo = FeatureLib.GetTenonData( Proc)
|
||||
end
|
||||
|
||||
return Proc
|
||||
@@ -226,6 +227,7 @@ end
|
||||
-- Recupero dati foro e adattamento se speciale
|
||||
function FeatureLib.GetDrillingData( Proc)
|
||||
local AuxId = EgtGetInfo( Proc.id, 'AUXID', 'i')
|
||||
local FeatureExtraInfo = {}
|
||||
|
||||
-- verifico se foro da adattare
|
||||
if EgtExistsInfo( Proc.id, 'DiamUser') then
|
||||
@@ -235,17 +237,19 @@ function FeatureLib.GetDrillingData( Proc)
|
||||
end
|
||||
end
|
||||
|
||||
local dDiam = EgtGetInfo( Proc.id, 'P12', 'd') or 0
|
||||
local dLen = abs( EgtCurveThickness( Proc.id + AuxId)) or 0
|
||||
local nFcs = EgtGetInfo( Proc.id, 'FCS', 'i') or 0
|
||||
local nFce = EgtGetInfo( Proc.id, 'FCE', 'i') or 0
|
||||
FeatureExtraInfo.dDrillDiam = EgtGetInfo( Proc.id, 'P12', 'd') or 0
|
||||
FeatureExtraInfo.dDrillLen = abs( EgtCurveThickness( Proc.id + AuxId)) or 0
|
||||
FeatureExtraInfo.nDrillFcs = EgtGetInfo( Proc.id, 'FCS', 'i') or 0
|
||||
FeatureExtraInfo.nDrillFce = EgtGetInfo( Proc.id, 'FCE', 'i') or 0
|
||||
|
||||
return dDiam, dLen, nFcs, nFce
|
||||
return FeatureExtraInfo
|
||||
end
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
-- Recupero dati tenone a coda di rondine
|
||||
function FeatureLib.GetDoveTailTenonData( Proc)
|
||||
-- Recupero dati tenone e tenone a coda di rondine
|
||||
function FeatureLib.GetTenonData( Proc)
|
||||
local FeatureExtraInfo = {}
|
||||
-- recupero e verifico l'entità curva
|
||||
local idAux = EgtGetInfo( Proc.id, 'AUXID', 'i')
|
||||
if idAux then idAux = idAux + Proc.id end
|
||||
@@ -253,13 +257,13 @@ function FeatureLib.GetDoveTailTenonData( Proc)
|
||||
local vtExtr = EgtCurveExtrusion( idAux, GDB_RT.GLOB)
|
||||
local ptBC = EgtGP( idAux, GDB_RT.GLOB)
|
||||
-- determino altezza del tenone
|
||||
local frDtTen = Frame3d( ptBC, vtExtr)
|
||||
local b3DtTen = EgtGetBBoxRef( Proc.id, GDB_BB.STANDARD, frDtTen)
|
||||
local dDtTenH = b3DtTen:getDimZ()
|
||||
local frTen = Frame3d( ptBC, vtExtr)
|
||||
local b3Ten = EgtGetBBoxRef( Proc.id, GDB_BB.STANDARD, frTen)
|
||||
local dTenH = b3Ten:getDimZ()
|
||||
-- assegno centro e normale della faccia top
|
||||
local vtN = vtExtr
|
||||
local ptC = ptBC + vtN * dDtTenH
|
||||
-- calcolo distanza massima della curva dal punto più lontano della base tenone Dt (facet 0)
|
||||
local ptC = ptBC + vtN * dTenH
|
||||
-- calcolo distanza massima della curva dal punto più lontano della base tenone (facet 0)
|
||||
local dMaxDist
|
||||
for i = 0, Proc.nFct - 1 do
|
||||
local ptFC, vtFN = EgtSurfTmFacetCenter( Proc.id, i, GDB_ID.ROOT)
|
||||
@@ -283,17 +287,17 @@ function FeatureLib.GetDoveTailTenonData( Proc)
|
||||
end
|
||||
end
|
||||
if not dMaxDist then
|
||||
local b3DtAux = EgtGetBBoxRef( idAux, GDB_BB.STANDARD, frDtTen)
|
||||
dMaxDist = 2 * ( b3DtTen:getRadius() - b3DtAux:getRadius())
|
||||
local b3TenonAux = EgtGetBBoxRef( idAux, GDB_BB.STANDARD, frTen)
|
||||
dMaxDist = 2 * ( b3Ten:getRadius() - b3TenonAux:getRadius())
|
||||
end
|
||||
|
||||
Proc.dDTLength = dDtTenH
|
||||
Proc.dDTMaxDist = dMaxDist
|
||||
Proc.vtDTNormal = vtExtr
|
||||
Proc.ptDTCenter = ptC
|
||||
Proc.idAddAuxGeom = idAux
|
||||
FeatureExtraInfo.dTenonLength = dTenH
|
||||
FeatureExtraInfo.dTenonMaxDist = dMaxDist
|
||||
FeatureExtraInfo.vtTenonN = vtExtr
|
||||
FeatureExtraInfo.ptTenonCenter = ptC
|
||||
FeatureExtraInfo.idAddAuxGeom = idAux
|
||||
|
||||
return Proc.dDTLength, Proc.dDTMaxDist, Proc.vtDTNormal, Proc.ptDTCenter, Proc.idAddAuxGeom
|
||||
return FeatureExtraInfo
|
||||
|
||||
end
|
||||
|
||||
@@ -462,21 +466,11 @@ function FeatureLib.GetFeatureSplittingPoints( Proc, Part, OptionalParameters)
|
||||
return FeatureSplittingPoints
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
function FeatureLib.GetAdditionalInfo( Proc, Part)
|
||||
-- se foro calcolo altri dati
|
||||
if ID.IsDrilling( Proc) then
|
||||
-- assegno diametro e facce di ingresso e uscita (dati tabelle sempre per riferimento)
|
||||
Proc.dDiam, Proc.dLen, Proc.nFcs, Proc.nFce = FeatureLib.GetDrillingData( Proc)
|
||||
end
|
||||
return Proc
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
function FeatureLib.GetFeatureVolume( Proc, Part)
|
||||
local dProcVolume = 0
|
||||
|
||||
local nAddGrpId = BeamLib.GetAddGroup( Proc.idPart)
|
||||
local nAddGrpId = BeamLib.GetAddGroup( Part.id)
|
||||
if not nAddGrpId then
|
||||
-- TODO gestire meglio questo errore. Non conviene creare e verificare all'inizio se il gruppo esiste?
|
||||
EgtOutLog( 'Error : missing AddGroup')
|
||||
|
||||
@@ -242,7 +242,7 @@ function MachiningLib.FindMill( Proc, ToolSearchParameters)
|
||||
-- calcolo riduzione del massimo materiale utilizzabile
|
||||
local ToolEntryAngle = GetToolEntryAngle( Proc, ToolSearchParameters.vtToolDirection)
|
||||
-- se ToolHolder più grande dell'utensile, il primo oggetto in collisione è il ToolHolder. Altrimenti il motore.
|
||||
local dDimObjToCheck = EgtIf( TOOLS[i].ToolHolder.dDiameter > TOOLS[i].dDiameter, TOOLS[i].ToolHolder.dDiameter, BeamData.C_SIMM_ENC)
|
||||
local dDimObjToCheck = EgtIf( TOOLS[i].ToolHolder.dDiameter > TOOLS[i].dDiameter, TOOLS[i].ToolHolder.dDiameter, TOOLS[i].SetupInfo.dCAxisEncumbrance)
|
||||
local dCurrentMaxMatReduction = BeamData.COLL_SIC or 5
|
||||
|
||||
-- TODO implementare le funzioni di Tool Collision Avoidance (vedi wiki e FacesBysaw -> CalcLeadInOutPerpGeom)
|
||||
@@ -603,6 +603,12 @@ function MachiningLib.AddOperations( vProc, Part, sRotation)
|
||||
end
|
||||
EgtSetMachiningGeometry( Geometry)
|
||||
|
||||
-- si scrive info pezzo e feature su geometria lavorazione
|
||||
if Geometry then
|
||||
EgtSetInfo( Geometry[1][1], 'CUTID', MACHININGS[i].Proc.idCut)
|
||||
EgtSetInfo( Geometry[1][1], 'TASKID', MACHININGS[i].Proc.idTask)
|
||||
end
|
||||
|
||||
-- impostazione parametri lavorazione
|
||||
-- TODO scrivere sempre Steps, LeadIn, LeadOut nelle tabelle in modo da non dover controllare ogni volta che ci siano
|
||||
for k = 1, #MachiningParameters do
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
local STR0001Data = {
|
||||
sStrategyId = 'STR0001',
|
||||
Parameters = {
|
||||
{ sName = 'dOverMatOnLenght', sNameNge = 'OVM_LENGTH', sValue = '0', sDescription = 'Sovramateriale lunghezza tenone', sType = 'd'},
|
||||
{ sName = 'dOverMatOnLength', sNameNge = 'OVM_LENGTH', sValue = '0', sDescription = 'Sovramateriale lunghezza tenone', sType = 'd'},
|
||||
{ sName = 'dOverMatOnRadius', sNameNge = 'OVM_RADIUS', sValue = '0', sDescription = 'Sovramateriale larghezza tenone', sType = 'd'},
|
||||
{ sName = 'nMaxMillingPaths', sNameNge = 'MAX_PATHS', sValue = '3', sDescription = 'Numero massimo di passaggi di fresatura. Se richiesti più passaggi, si fa svuotatura', sType = 'd'},
|
||||
{ sName = 'bUseDTToolOnPocketing', sNameNge = 'ALLOW_DT_POCKET', sValue = 'true', sDescription = 'Utilizza utensile a coda di rondine per fare svuotatura', sType = 'b'}
|
||||
|
||||
@@ -0,0 +1,269 @@
|
||||
-- Strategia: STR0006
|
||||
-- Descrizione
|
||||
-- Lama + fresa CodaDiRondine per tenone
|
||||
-- Feature: 55,1
|
||||
|
||||
-- carico librerie
|
||||
local BeamLib = require( 'BeamLib')
|
||||
local BeamData = require( 'BeamData')
|
||||
local MachiningLib = require( 'MachiningLib')
|
||||
local FeatureLib = require( 'FeatureLib')
|
||||
-- strategie di base
|
||||
local BladeToWaste = require( 'BLADETOWASTE')
|
||||
local FaceByBlade = require('FACEBYBLADE')
|
||||
|
||||
-- Tabella per definizione modulo
|
||||
local STR0006 = {}
|
||||
local Strategy = {}
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
function AddMachiningAllSteps( Proc, Cutting, AuxiliaryData)
|
||||
local bMachiningAdded = false
|
||||
if not AuxiliaryData then
|
||||
AuxiliaryData = {}
|
||||
end
|
||||
AuxiliaryData.Clones = {}
|
||||
|
||||
local dOriginalRadialOffset = Cutting.dRadialOffset
|
||||
local dOriginalLeadInPerpDistance = Cutting.LeadIn.dPerpDistance
|
||||
local dOriginalLeadOutPerpDistance = Cutting.LeadOut.dPerpDistance
|
||||
for i = 1, Cutting.HorizontalSteps.nCount do
|
||||
AuxiliaryData.Clones[i] = {}
|
||||
AuxiliaryData.Clones[i].LeadIn = {}
|
||||
AuxiliaryData.Clones[i].LeadOut = {}
|
||||
AuxiliaryData.Clones[i].dRadialOffset = dOriginalRadialOffset + Cutting.HorizontalSteps.dStep * ( Cutting.HorizontalSteps.nCount - i)
|
||||
-- update distanza perpendicolare attacco per contemplare l'offset applicato
|
||||
AuxiliaryData.Clones[i].LeadIn.dPerpDistance = dOriginalLeadInPerpDistance - Cutting.dRadialOffset
|
||||
AuxiliaryData.Clones[i].LeadOut.dPerpDistance = dOriginalLeadOutPerpDistance - Cutting.dRadialOffset
|
||||
end
|
||||
bMachiningAdded = MachiningLib.AddNewMachining( Proc, Cutting, AuxiliaryData)
|
||||
|
||||
return bMachiningAdded
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
function STR0006.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( 'STR0006\\STR0006Config')
|
||||
Strategy.sName = StrategyLib.Config.sStrategyId
|
||||
CustomParameters = BeamLib.GetUpdateCustomParameters( CustomParameters, StrategyLib.Config.Parameters)
|
||||
Strategy.Parameters = BeamLib.LoadCustomParametersInStrategy( CustomParameters)
|
||||
Strategy.Machining = {}
|
||||
Strategy.Result = {}
|
||||
|
||||
|
||||
local bAreAllMachiningsAdded = true
|
||||
local ToolSearchParameters = {}
|
||||
local Milling = {}
|
||||
local Cutting = {}
|
||||
local bCuttingWithMill = false
|
||||
local nMillingPathsNeeded = 0
|
||||
local dCompletionPercentage
|
||||
|
||||
|
||||
-- calcolo se la lavorazione del tenone può essere spostata dopo taglio di coda
|
||||
local dLengthOnX = Proc.b3Box:getDimX()
|
||||
local bCanMoveAfterSplit = MachiningLib.CanMoveAfterSplitcut( dLengthOnX, Part)
|
||||
|
||||
-- aggiunta superficie di taglio sulla lunghezza del tenone
|
||||
local nAddGrpId = BeamLib.GetAddGroup( Part.id)
|
||||
local idTenonCutPlane = EgtSurfTmPlaneInBBox( nAddGrpId, Proc.FeatureInfo.ptTenonCenter, Proc.FeatureInfo.vtTenonN, Part.b3Part, GDB_RT.GLOB)
|
||||
|
||||
-- scelta automatica lavorazione. Non viene mai scelta la motosega
|
||||
if Strategy.Parameters.sCuttingStrategy == 'AUTO' then
|
||||
-- creo piano di taglio sulla testa del tenone
|
||||
local OptionalParameters = { dMaxWasteVolume = Strategy.Parameters.dMaxWasteVolume,
|
||||
dMaxWasteLength = Strategy.Parameters.dMaxWasteLength
|
||||
}
|
||||
Cutting.Result, dCompletionPercentage = BladeToWaste.Make( idTenonCutPlane, Part, OptionalParameters)
|
||||
-- se presente almeno una lavorazione e completo, il taglio è applicabile
|
||||
if #Cutting.Result > 0 and dCompletionPercentage == 100 then
|
||||
Cutting.bIsApplicable = true
|
||||
end
|
||||
-- se non possibile di lama si prova con fresa
|
||||
if not Cutting.Result or #Cutting.Result == 0 then
|
||||
bCuttingWithMill = true
|
||||
end
|
||||
-- lavorazione forzata con utensile lama
|
||||
elseif Strategy.Parameters.sCuttingStrategy == 'BLADE_FORCED' then
|
||||
local OptionalParameters = { dMaxWasteVolume = Strategy.Parameters.dMaxWasteVolume,
|
||||
dMaxWasteLength = Strategy.Parameters.dMaxWasteLength
|
||||
}
|
||||
Cutting.Result, dCompletionPercentage = BladeToWaste.Make( idTenonCutPlane, Part, OptionalParameters)
|
||||
-- se presente almeno una lavorazione e completo, il taglio è applicabile
|
||||
if #Cutting.Result > 0 and dCompletionPercentage == 100 then
|
||||
Cutting.bIsApplicable = true
|
||||
end
|
||||
-- lavorazione forzata con utensile fresa
|
||||
elseif Strategy.Parameters.sCuttingStrategy == 'MILL_FORCED' then
|
||||
bCuttingWithMill = true
|
||||
-- lavorazione forzata con utensile motosega
|
||||
elseif Strategy.Parameters.sCuttingStrategy == 'CHAINSAW_FORCED' then
|
||||
-- DA FARE!!
|
||||
end
|
||||
|
||||
-- TODO = Verificare se il taglio può essere fatto prima (con pezzo a caduta). Deve dagliare in un colpo, altrimenti a cubetti non si può fare prima di separare.
|
||||
|
||||
if Cutting.bIsApplicable then
|
||||
local ParametersMRR = {}
|
||||
ParametersMRR.nToolIndex = Cutting.Result.nToolIndex
|
||||
Cutting.dMRR = MachiningLib.GetToolMRR( ParametersMRR)
|
||||
end
|
||||
|
||||
-- === ricerca utensile per lavorare tenone ===
|
||||
Milling.bIsApplicable = false
|
||||
-- se tenone in testa oppure se di coda ma è possibile lavorare dopo separazione
|
||||
if not( Proc.AffectedFaces.bLeft) or bCanMoveAfterSplit then
|
||||
ToolSearchParameters.dElevation = Proc.FeatureInfo.dTenonLength
|
||||
ToolSearchParameters.vtToolDirection = Proc.FeatureInfo.vtTenonN
|
||||
Milling.ToolInfo = {}
|
||||
Milling.ToolInfo = MachiningLib.FindMill( Proc, ToolSearchParameters)
|
||||
Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( 'Mill')
|
||||
if Milling.ToolInfo.nToolIndex then
|
||||
Milling.bIsApplicable = true
|
||||
-- calcolo passate necessarie
|
||||
nMillingPathsNeeded = ceil( Proc.FeatureInfo.dTenonMaxDist / TOOLS[Milling.ToolInfo.nToolIndex].dSideStep)
|
||||
local ParametersMRR = {}
|
||||
ParametersMRR.nToolIndex = Milling.ToolInfo.nToolIndex
|
||||
Milling.dMRR = MachiningLib.GetToolMRR( ParametersMRR)
|
||||
end
|
||||
|
||||
-- se cutting da fare come svuotatura, copio i dati dell'utensile scelto per lavorare il tenone
|
||||
if bCuttingWithMill and Milling.bIsApplicable then
|
||||
Cutting.bIsApplicable = true
|
||||
Cutting.ToolInfo = Milling.ToolInfo
|
||||
Cutting.dMRR = Milling.dMRR
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- setto il risultato in base agli utensili trovati
|
||||
-- lavorazione completa
|
||||
if Milling.bIsApplicable and Cutting.bIsApplicable then
|
||||
Strategy.Result.sStatus = 'Completed'
|
||||
Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( 100)
|
||||
Strategy.Result.dMRR = ( Milling.dMRR + Cutting.dMRR) / 2
|
||||
Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( EgtIf( bCuttingWithMill, 'Mill,Mill', 'Mill,Blade'))
|
||||
Strategy.Result.sInfo = ''
|
||||
-- lavorazione incompleta
|
||||
elseif Cutting.bIsApplicable then
|
||||
Strategy.Result.sStatus = 'Not-Completed'
|
||||
Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( 50)
|
||||
Strategy.Result.dMRR = ( Milling.dMRR + Cutting.dMRR) / 2
|
||||
Strategy.Result.nQuality = FeatureLib.GetFeatureQuality( EgtIf( bCuttingWithMill, 'Mill', 'Blade'))
|
||||
Strategy.Result.sInfo = 'Tenon not completed'
|
||||
-- strategia non applicabile, manca il taglio di lama sulla lunghezza del tenone
|
||||
else
|
||||
Strategy.Result.sStatus = 'Not-Applicable'
|
||||
Strategy.Result.nCompletionIndex = 0
|
||||
Strategy.Result.dMRR = 0
|
||||
Strategy.Result.nQuality = 0
|
||||
Strategy.Result.sInfo = 'Error on Tenon cutting'
|
||||
end
|
||||
|
||||
-- applicazione delle lavorazioni
|
||||
if bAddMachining and Strategy.Result.sStatus ~= 'Not-Applicable' then
|
||||
-- taglio in lunghezza sul tenone
|
||||
if Cutting.bIsApplicable then
|
||||
OptionalParameters = {}
|
||||
local AuxiliaryData = {}
|
||||
|
||||
-- se cutting da fare come svuotatura
|
||||
if bCuttingWithMill then
|
||||
Cutting.Steps = {}
|
||||
Cutting.LeadIn = {}
|
||||
Cutting.nType = MCH_OY.POCKETING
|
||||
Cutting.nSubType = MCH_POCK_SUB.SPIRALIN
|
||||
Cutting.LeadIn.nType = MCH_POCK_LI.ZIGZAG
|
||||
Cutting.Steps.dStep = TOOLS[Cutting.ToolInfo.nToolIndex].dStep
|
||||
Cutting.Steps.dSideStep = TOOLS[Cutting.ToolInfo.nToolIndex].dSideStep
|
||||
Cutting.nToolIndex = Cutting.ToolInfo.nToolIndex
|
||||
Cutting.LeadIn.dTangentDistance = TOOLS[Cutting.ToolInfo.nToolIndex].dDiameter/2
|
||||
Cutting.LeadIn.dElevation = TOOLS[Cutting.ToolInfo.nToolIndex].dDiameter/2
|
||||
Cutting.sDepth = 0
|
||||
Cutting.Geometry = {{ idTenonCutPlane, 0}}
|
||||
Cutting.vtToolDirection = Proc.vtTNormal
|
||||
if Proc.AffectedFaces.bLeft and bCanMoveAfterSplit then
|
||||
Cutting.sStage = 'AfterTail'
|
||||
end
|
||||
bAreAllMachiningsAdded = MachiningLib.AddNewMachining( Proc, Cutting)
|
||||
|
||||
-- taglio di lama
|
||||
else
|
||||
|
||||
for i = 1, #Cutting.Result do
|
||||
if Cutting.Result[i].bIsApplicable then
|
||||
if Proc.AffectedFaces.bLeft and bCanMoveAfterSplit then
|
||||
Cutting.Result[i].sStage = 'AfterTail'
|
||||
end
|
||||
local bIsMachiningAdded = AddMachiningAllSteps( Proc, Cutting.Result[i])
|
||||
if not bIsMachiningAdded then
|
||||
bAreAllMachiningsAdded = false
|
||||
end
|
||||
Strategy.Result.sInfo = Strategy.Result.sInfo .. '\n' .. Cutting.Result[i].sMessage
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- passaggio sul profilo
|
||||
if Milling.bIsApplicable then
|
||||
local AuxiliaryData = {}
|
||||
-- se molti passaggi richiesti, si fa svuotatura
|
||||
if nMillingPathsNeeded > Strategy.Parameters.nMaxMillingPaths then
|
||||
-- TODO. SERVONO NUOVE SVUOTATURE!!!!
|
||||
else
|
||||
-- aggiungo geometria
|
||||
Milling.Geometry = {{ Proc.FeatureInfo.idAddAuxGeom, -1}}
|
||||
Milling.nToolIndex = Milling.ToolInfo.nToolIndex
|
||||
Milling.nType = MCH_MY.MILLING
|
||||
Milling.vtToolDirection = Proc.vtTNormal
|
||||
Milling.sDepth = 0
|
||||
|
||||
-- LeadIn / LeadOut
|
||||
Milling.LeadIn = {}
|
||||
Milling.LeadOut = {}
|
||||
Milling.LeadIn.nType = MCH_MILL_LI.TANGENT
|
||||
Milling.LeadOut.nType = MCH_MILL_LI.TANGENT
|
||||
Milling.LeadIn.dTangentDistance = TOOLS[Milling.ToolInfo.nToolIndex].dDiameter / 2 + BeamData.COLL_SIC
|
||||
Milling.LeadIn.dPerpDistance = TOOLS[Milling.ToolInfo.nToolIndex].dSideStep
|
||||
Milling.LeadOut.dTangentDistance = TOOLS[Milling.ToolInfo.nToolIndex].dDiameter / 2 + BeamData.COLL_SIC
|
||||
Milling.LeadOut.dPerpDistance = TOOLS[Milling.ToolInfo.nToolIndex].dSideStep
|
||||
|
||||
if Proc.AffectedFaces.bLeft and bCanMoveAfterSplit then
|
||||
Milling.sStage = 'AfterTail'
|
||||
end
|
||||
|
||||
-- sistemo il lato e la direzione di lavoro
|
||||
Milling.bInvert = EgtIf( TOOLS[Milling.ToolInfo.nToolIndex].bIsCCW, false, true)
|
||||
Milling.nWorkside = EgtIf( TOOLS[Milling.ToolInfo.nToolIndex].bIsCCW, MCH_MILL_WS.RIGHT, MCH_MILL_WS.LEFT)
|
||||
|
||||
Milling.sUserNotes = EgtSetVal( 'MaxElev', EgtNumToString( Proc.FeatureInfo.dTenonLength, 1)) .. ';'
|
||||
|
||||
-- TODO calcolare SCC
|
||||
|
||||
-- passate con sovramateriale
|
||||
AuxiliaryData.Clones = {}
|
||||
for i = nMillingPathsNeeded, 1, -1 do
|
||||
-- il primo è il passaggio più esterno
|
||||
local nIndexClones = nMillingPathsNeeded - i + 1
|
||||
-- suddivido step in base al numero passate da fare
|
||||
local dRealSideStep = floor( Proc.FeatureInfo.dTenonMaxDist / nMillingPathsNeeded)
|
||||
-- cambia solo sovrmateriale radiale
|
||||
AuxiliaryData.Clones[nIndexClones] = {}
|
||||
AuxiliaryData.Clones[nIndexClones].dRadialOffset = ( i - 1) * dRealSideStep
|
||||
end
|
||||
|
||||
-- aggiunge lavorazione
|
||||
bAreAllMachiningsAdded = MachiningLib.AddNewMachining( Proc, Milling, AuxiliaryData)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return bAreAllMachiningsAdded, Strategy.Result
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
|
||||
return STR0006
|
||||
@@ -0,0 +1,19 @@
|
||||
-- Parametri configurabili da cliente per strategia: STR0001
|
||||
|
||||
local STR0006Data = {
|
||||
sStrategyId = 'STR0006',
|
||||
Parameters = {
|
||||
{ sName = 'dOverMatOnLength', sNameNge = 'OVM_LENGTH', sValue = '0', sDescription = 'Sovramateriale lunghezza tenone', sType = 'd'},
|
||||
{ sName = 'dOverMatOnRadius', sNameNge = 'OVM_RADIUS', sValue = '0', sDescription = 'Sovramateriale larghezza tenone', sType = 'd'},
|
||||
{ sName = 'nMaxMillingPaths', sNameNge = 'MAX_PATHS', sValue = '3', sDescription = 'Numero massimo di passaggi di fresatura. Se richiesti più passaggi, si fa svuotatura', sType = 'd'},
|
||||
{ sName = 'dMaxWasteLength', sNameNge = 'MAX_WASTE_LENGTH', sValue = '300', sDescriptionShort = '', sDescriptionLong = '', sType = 'd', sMessageId = '', sMinUserLevel = '1'},
|
||||
{ sName = 'dMaxWasteVolume', sNameNge = 'MAX_WASTE_VOLUME', sValue = '6000000', sDescriptionShort = '', sDescriptionLong = '', sType = 'd', sMessageId = '', sMinUserLevel = '1'},
|
||||
{ sName = 'sCuttingStrategy', sNameNge = 'EXEC_TENON_SURF', sValue = 'AUTO', sType = 'combo', sMinUserLevel = '1',
|
||||
Choices = { { sValue = 'AUTO', sDescriptionShort = '', sDescriptionLong = '', sMessageId = ''},
|
||||
{ sValue = 'BLADE_FORCED', sDescriptionShort = '', sDescriptionLong = '', sMessageId = ''},
|
||||
{ sValue = 'MILL_FORCED', sDescriptionShort = '', sDescriptionLong = '', sMessageId = ''},
|
||||
{ sValue = 'CHAINSAW_FORCED', sDescriptionShort = '', sDescriptionLong = '', sMessageId = ''}}}
|
||||
}
|
||||
}
|
||||
|
||||
return STR0006Data
|
||||
@@ -90,7 +90,7 @@ function BLADETOWASTE.Make( ProcOrId, Part, OptionalParameters)
|
||||
local dCompletionPercentage = 0
|
||||
|
||||
-- disambiguazione feature vs id trimesh
|
||||
local Proc
|
||||
local Proc = {}
|
||||
if type( ProcOrId) == "table" then
|
||||
Proc = ProcOrId
|
||||
elseif type( ProcOrId) == "number" then
|
||||
|
||||
Reference in New Issue
Block a user