Prima versione Scarf Joint. Manca:

- lavorazioni di antischeggia con fresa e lama
 - Il primo taglio de ve essere calcolato con 2 facce se il piano di taglio attraversa faccia 1
 - gestione caso con facce 4 e 5 mancanti
This commit is contained in:
andrea.villa
2026-04-24 14:45:31 +02:00
parent 117e475de5
commit 89b342a564
2 changed files with 158 additions and 7 deletions
+1 -1
View File
@@ -688,7 +688,7 @@
"TopologyList" : [
{ "sName": "Feature",
"sImage": "ConfigStrategy\\ScarfJoint.png",
"StrategyList" : [ ]
"StrategyList" : [ { "sStrategyId": "STR0009" }]
}
]
},
+157 -6
View File
@@ -15,8 +15,141 @@ local BladeToWaste = require('BLADETOWASTE')
local STR0009 = {}
local Strategy = {}
-------------------------------------------------------------------------------------------------------------
local function GetFacesIdOrder( Proc, Part)
local Faces = { {}, {}, {}, {}, {}}
if Proc.nFct == 5 then
-- carico gli id delle facce
for i = 1, Proc.nFct do
Faces[i].nFaceOrd = i - 1
Faces[i].ptC, Faces[i].vtN = EgtSurfTmFacetCenter( Proc.id, i-1, GDB_ID.ROOT)
end
elseif Proc.nFct == 4 then
local _, vtN1 = EgtSurfTmFacetCenter( Proc.id, 0, GDB_ID.ROOT)
local _, vtN2 = EgtSurfTmFacetCenter( Proc.id, 1, GDB_ID.ROOT)
local nIndex = EgtIf( abs( vtN1:getX()) > abs( vtN2:getX()), 1, 2)
for i = nIndex, Proc.nFct do
Faces[i].nFaceOrd = i - 1
Faces[i].ptC, Faces[i].vtN = EgtSurfTmFacetCenter( Proc.id, i-1, GDB_ID.ROOT)
end
-- TODO manca il caso in cui mancano facce 4 e 5
else -- Proc.nFct == 3
for i = 2, Proc.nFct do
Faces[i].nFaceOrd = i - 1
Faces[i].ptC, Faces[i].vtN = EgtSurfTmFacetCenter( Proc.id, i-1, GDB_ID.ROOT)
end
end
return Faces
end
-------------------------------------------------------------------------------------------------------------
local function GetScarfJointStrategy( Proc, Part)
-- ordino le facce in base al loro numero e al parallelismo delle due facce principali
-- faccia 0: superficie tappo (*potrebbe non esserci)
-- faccia 1: superficie principale di fondo
-- faccia 2: superficie opposta alla faccia 1
-- faccia 3: superficie principale superiore
-- faccia 4: superficie di testa (*potrebbe non esserci)
-- creo una tabella unica contenente tutte le lavorazioni
local Result = {}
local Cutting = { Machinings = {}, Result = {}}
local AntiSplint = {}
local Pocketing = {}
Result.dTimeToMachine = 0
local Faces = GetFacesIdOrder( Proc)
-- taglio su faccia 4
if Faces[4] and Faces[4].vtN then
-- recupero gruppo per geometria addizionale
local nAddGrpId = BeamLib.GetAddGroup( Part.id)
-- TODO la nuova faccia creata sulla 4 può tagliare faccia 1. In caso tagliasse faccia 1, bisogna calcolare i cubetti con 2 facce
Strategy.idFeatureCutPlane = EgtSurfTmPlaneInBBox( nAddGrpId, Faces[4].ptC, Faces[4].vtN, Part.b3Part, GDB_RT.GLOB)
Cutting.Machinings, Cutting.Result = BladeToWaste.Make( Strategy.idFeatureCutPlane, Part)
if Cutting.Result.sStatus == 'Completed' then
Cutting.Machinings.bIsApplicable = true
end
end
-- antischeggia facce 1 e 3
if Strategy.ParametersbAntiSplint then
end
-- svuotatura faccia 2
if Faces[2] and Faces[2].vtN then
local frPock, dL, dW = EgtSurfTmFacetMinAreaRectangle( Proc.id, Faces[2].nFaceOrd, GDB_ID.ROOT)
local ToolSearchParameters = {}
ToolSearchParameters.sMillShape = 'STANDARD'
ToolSearchParameters.vtToolDirection = Faces[2].vtN
ToolSearchParameters.dElevation = abs( ( Faces[2].ptC - Faces[4].ptC) * Faces[2].vtN)
ToolSearchParameters.dMaxToolDiameter = min( dL, dW)
ToolSearchParameters.ToolInfo = {}
ToolSearchParameters.ToolInfo = MachiningLib.FindMill( Proc, ToolSearchParameters)
if ToolSearchParameters.ToolInfo.nToolIndex then
Pocketing = MachiningLib.InitMachiningParameters( MCH_MY.POCKETING)
Pocketing.Geometry = {{ Proc.id, Faces[2].nFaceOrd}}
Pocketing.dElevation = ToolSearchParameters.dElevation
Pocketing.dMaxElev = Pocketing.dElevation
Pocketing.vtToolDirection = ToolSearchParameters.vtToolDirection
Pocketing.nSubType = MCH_POCK_SUB.SPIRALIN
Pocketing.LeadIn.nType = MCH_POCK_LI.ZIGZAG
Pocketing.Steps.dStep = TOOLS[ToolSearchParameters.ToolInfo.nToolIndex].dStep
Pocketing.Steps.dSideStep = TOOLS[ToolSearchParameters.ToolInfo.nToolIndex].dSideStep
Pocketing.nToolIndex = ToolSearchParameters.ToolInfo.nToolIndex
Pocketing.LeadIn.dTangentDistance = TOOLS[ToolSearchParameters.ToolInfo.nToolIndex].dDiameter / 2
Pocketing.LeadIn.dElevation = TOOLS[ToolSearchParameters.ToolInfo.nToolIndex].dDiameter / 2
Pocketing.sDepth = 0
Pocketing.dResidualDepth = ToolSearchParameters.ToolInfo.dResidualDepth
-- TODO vedere se questo parametro con svuotature nuove si può rimuovere
Pocketing.dOpenMinSafe = Strategy.Parameters.dOpenMinSafe
Pocketing.dTimeToMachine = MachiningLib.GetTimeToMachineAllStepsWithLeadInOut( Pocketing, Part)
Result.dTimeToMachine = Result.dTimeToMachine + Pocketing.dTimeToMachine
Pocketing.bIsApplicable = true
end
end
-- se manca taglio principale, feature non eseguibile
if not Cutting.Machinings.bIsApplicable then
local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. Strategy.sName .. ' not applicable'
EgtOutLog( sErr)
Result = FeatureLib.GetStrategyResultNotApplicable( sErr)
else
local dCompletionPercentage = 100
-- completa se svuotatura eseguita e antisplit eseguiti (o non richiesti)
if Pocketing.bIsApplicable and ( AntiSplint.bIsApplicable or not Strategy.ParametersbAntiSplint) then
Result.sStatus = 'Completed'
if AntiSplint.bIsApplicable then
Result.dQuality = FeatureLib.GetStrategyQuality( 'FINE')
else
Result.dQuality = FeatureLib.GetStrategyQuality( 'STD')
end
-- altrimenti non completa
else
Result.dQuality = FeatureLib.GetStrategyQuality( 'STD')
Result.sStatus = 'Not-Completed'
-- se fa solo svuotatura
if Pocketing.bIsApplicable then
dCompletionPercentage = 90
Result.sInfo = 'Anti-Split not executed'
elseif Strategy.ParametersbAntiSplint and AntiSplint.bIsApplicable then
dCompletionPercentage = 75
Result.sInfo = 'Pocketing not executed'
else
dCompletionPercentage = 50
Result.sInfo = 'Only the cut has been executed'
end
end
Result.dCompletionIndex = FeatureLib.GetFeatureCompletionIndex( dCompletionPercentage)
end
-- creo una tabella unica contenente tutte le lavorazioni
local Machinings = {}
EgtJoinTables( Machinings, Cutting.Machinings)
EgtJoinTables( Machinings, AntiSplint)
EgtJoinTables( Machinings, {Pocketing})
return Machinings, Result
end
-------------------------------------------------------------------------------------------------------------
@@ -31,14 +164,32 @@ function STR0009.Make( bAddMachining, Proc, Part, CustomParameters)
local bAreAllMachiningsAdded = true
Strategy.Machinings = GetScarfJointStrategy( Proc, Part)
if bAddMachining and Strategy.Result.sStatus ~= 'Not-Applicable' then
else
bAreAllMachiningsAdded = false
-- controlli preliminari
if Proc.nFct < 3 or Proc.nFct > 5 then
local sErr = 'Feature '.. Proc.idFeature .. ' : strategy ' .. StrategyLib.Config.sStrategyId .. ' not applicable'
EgtOutLog( sErr)
Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( sErr)
return false, Strategy.Result
end
Strategy.Machinings, Strategy.Result = GetScarfJointStrategy( Proc, Part)
-- aggiunta lavorazioni
if #Strategy.Machinings > 0 then
if bAddMachining and Strategy.Result.sStatus ~= 'Not-Applicable' then
-- aggiunge lavorazione
for j = 1, #Strategy.Machinings do
if Proc.AffectedFaces.bLeft then
Strategy.Machinings[j].sStage = 'AfterTail'
end
bAreAllMachiningsAdded = MachiningLib.AddMachinings( Proc, Strategy.Machinings[j])
end
end
else
Strategy.Result = FeatureLib.GetStrategyResultNotApplicable()
end
return bAreAllMachiningsAdded, Strategy.Result
end