- in BLADETOWASTE.CutWithDicing refactor

This commit is contained in:
luca.mazzoleni
2026-01-22 18:07:18 +01:00
parent 5c463298da
commit 76c8f45284
2 changed files with 168 additions and 140 deletions
+1
View File
@@ -198,6 +198,7 @@ function BeamExec.GetToolsFromDB()
-- se tutti i dati necessari sono disponibili, inserisco utensile nella lista globale degli utensili disponibili
if IsToolOk( Tool) then
Tool.nIndex = #TOOLS
table.insert( TOOLS, Tool)
-- altrimenti scrivo nel log che l'utensile non è conforme
else
+167 -140
View File
@@ -730,8 +730,152 @@ local function CutWholeWaste( Proc, Part, OptionalParameters)
end
local function CutWithDicing( Proc, Part, OptionalParameters)
local function CalculateDiceMachinings( vCuts, Parameters)
local Machinings = {}
local bMoveAfterSplit = false
local Proc = Parameters.Proc
local Part = Parameters.Part
local MainFace = Parameters.MainFace
local Tool = Parameters.Tool
local sChosenBladeType = Parameters.sChosenBladeType
local dExtendAfterTail = Parameters.dExtendAfterTail
local bReduceBladePath = Parameters.bReduceBladePath
-- eventuale inversione tagli ortogonali e aggiunta informazioni alla geometria
local bAreOrthogonalCutsInverted = false
for i = 1, #vCuts do
for j = 1, #vCuts[i] do
SetDiceFaceInfo( Proc, vCuts[i][j])
if ( i % 2) == 1 then
local vtO = EgtSurfTmFacetNormVersor( vCuts[i][j], 0, GDB_ID.ROOT)
if ( MainFace.vtN:getY() > 0.766 and vtO:getY() < -0.05) or
( MainFace.vtN:getY() < -0.766 and vtO:getY() > 0.05) then
EgtInvertSurf( vCuts[i][j])
bAreOrthogonalCutsInverted = true
end
end
end
end
-- calcolo lavorazioni
for i = 1, #vCuts do
-- determinazione direzione di taglio
local vtToolDirection
local bNoPerpCuts = false
if i % 2 == 1 then
vtToolDirection = Vector3d( MainFace.vtN)
else
local vtO
if #vCuts[i-1] > 0 then
vtO = EgtSurfTmFacetNormVersor( vCuts[i-1][1], 0, GDB_ID.ROOT)
elseif vCuts[i+1] and #vCuts[i+1] > 0 then
-- lunghezza faccia nell'eventuale direzione ortogonale
local asseX = EgtSurfTmFacetNormVersor( vCuts[i+1][1], 0, GDB_ID.ROOT)
local asseY = asseX ^ MainFace.vtN
local Frame = Frame3d( MainFace.ptCenter, MainFace.ptCenter + asseX, MainFace.ptCenter + asseY)
local b3Fac = EgtGetBBoxRef( vCuts[i][1], GDB_BB.STANDARD, Frame)
-- se lunghezza inferiore al limite, accetto la direzione
if b3Fac:getDimX() < Tool.dMaxDepth - BeamData.CUT_EXTRA then
vtO = asseX
else
bNoPerpCuts = true
end
else
bNoPerpCuts = true
end
if vtO then
vtToolDirection = Vector3d( vtO) * EgtIf( bAreOrthogonalCutsInverted, -1, 1)
else
-- scelta lato da lavorare per stabilire la vtToolDirection
local EdgeToMachine = {}
local _, Edges = FaceData.GetEdgesInfo( vCuts[i][1], 0)
EdgeToMachine = GetEdgeToMachine( Edges, sChosenBladeType)
vtToolDirection = EdgeToMachine.vtN
end
end
-- calcolo lavorazione della singola faccia
-- per tagli paralleli e faccia aperta si prova a tagliare come se fosse una faccia singola, accorpando i tagli
local bCanMergeParallelCuts = ( ( i % 2) == 0) and ( Proc.nFct == 1)
local bIsDicingOk = true
if bCanMergeParallelCuts then
local nAddGrpId = BeamLib.GetAddGroup( Part.id)
local nSurfToCut = EgtSurfTmBySewing( nAddGrpId, vCuts[i], false)
local ProcTrimesh = FeatureLib.GetProcFromTrimesh( nSurfToCut, Part)
local OptionalParametersCutWholeWaste = {
nToolIndex = Tool.nIndex,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath
}
local CutWholeWasteMachinings, CutWholeWasteResult = CutWholeWaste( ProcTrimesh, Part, OptionalParametersCutWholeWaste)
if CutWholeWasteResult.sStatus == 'Completed' then
for k = 1, #CutWholeWasteMachinings do
table.insert( Machinings, CutWholeWasteMachinings[k])
if CutWholeWasteMachinings[k].sStage == 'AfterTail' then
bMoveAfterSplit = true
end
end
else
EgtErase( nSurfToCut)
bIsDicingOk = false
end
end
-- caso standard (tagli perpendicolari o paralleli non accorpabili)
if ( not bCanMergeParallelCuts) or ( not bIsDicingOk) then
for j = 1, #vCuts[i] do
-- in generale sta sollevato di pochissimo
local dExtraCut = -0.1
-- se tagli paralleli
if ( i % 2) == 0 then
-- se non ci sono tagli ortogonali devo affondare
if bNoPerpCuts then
dExtraCut = BeamData.CUT_EXTRA
-- se è faccia singola si affonda
elseif Proc.nFct < 2 then
-- se tagli ortogonali invertiti, devo approfondire dello spessore lama
if bAreOrthogonalCutsInverted then
dExtraCut = Tool.dThickness
-- se ultimo taglio, devo affondare
elseif j == #vCuts[i] then
dExtraCut = BeamData.CUT_EXTRA
end
end
end
local Cutting = {}
local ProcTrimesh = FeatureLib.GetProcFromTrimesh( vCuts[i][j], Part)
local FaceToMachine = ProcTrimesh.Faces[1]
local EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( FaceToMachine.Edges, vtToolDirection)
local dDepthToMachine = EdgeToMachine.dElevation + dExtraCut
local OptionalParametersFaceByBlade = {
dDepthToMachine = dDepthToMachine,
nToolIndex = Tool.nIndex,
dRadialStepSpan = 0,
dExtendAfterTail = dExtendAfterTail,
bIsDicing = true
}
Cutting = FaceByBlade.Make( ProcTrimesh, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade)
Cutting.ptCenter = Point3d( ProcTrimesh.Faces[1].ptCenter:getX(), 0, 0)
if Cutting.bIsApplicable then
table.insert( Machinings, Cutting)
-- se un cubetto fallisce è inutile proseguire
else
Result = FeatureLib.GetStrategyResultNotApplicable( 'Dicing failed')
return false
end
if Cutting.sStage == 'AfterTail' then
bMoveAfterSplit = true
end
end
end
end
return true, Machinings, bMoveAfterSplit
end
local function CutWithDicing( Proc, Part, OptionalParameters)
local Result = {}
-- parametri opzionali e default
@@ -768,7 +912,7 @@ local function CutWithDicing( Proc, Part, OptionalParameters)
if not nToolIndex then
Result = FeatureLib.GetStrategyResultNotApplicable( 'Blade not found')
return Machinings, Result
return {}, Result
end
-- calcolo dimensione cubetto e eventuale cubetto ridotto (tagli orizzontali con affondamento verticale)
@@ -791,138 +935,25 @@ local function CutWithDicing( Proc, Part, OptionalParameters)
if #vCuts == 0 then
OptionalParameters.bDisableDicing = true
Machinings, Result = BLADETOWASTE.Make( Proc, Part, OptionalParameters)
return Machinings, Result
return {}, Result
end
-- lavorazione cubetti
local bIsDicingOk = true
local bMoveAfterSplit = false
-- eventuale inversione tagli ortogonali e aggiunta informazioni alla geometria
local bAreOrthogonalCutsInverted = false
for i = 1, #vCuts do
for j = 1, #vCuts[i] do
SetDiceFaceInfo( Proc, vCuts[i][j])
if ( i % 2) == 1 then
local vtO = EgtSurfTmFacetNormVersor( vCuts[i][j], 0, GDB_ID.ROOT)
if ( Face1.vtN:getY() > 0.766 and vtO:getY() < -0.05) or
( Face1.vtN:getY() < -0.766 and vtO:getY() > 0.05) then
EgtInvertSurf( vCuts[i][j])
bAreOrthogonalCutsInverted = true
end
end
end
end
-- calcolo lavorazioni
for i = 1, #vCuts do
-- determinazione direzione di taglio
local vtToolDirection
local bNoPerpCuts = false
if i % 2 == 1 then
vtToolDirection = Vector3d( Face1.vtN)
else
local vtO
if #vCuts[i-1] > 0 then
vtO = EgtSurfTmFacetNormVersor( vCuts[i-1][1], 0, GDB_ID.ROOT)
elseif vCuts[i+1] and #vCuts[i+1] > 0 then
-- lunghezza faccia nell'eventuale direzione ortogonale
local asseX = EgtSurfTmFacetNormVersor( vCuts[i+1][1], 0, GDB_ID.ROOT)
local asseY = asseX ^ Face1.vtN
local Frame = Frame3d( Face1.ptCenter, Face1.ptCenter + asseX, Face1.ptCenter + asseY)
local b3Fac = EgtGetBBoxRef( vCuts[i][1], GDB_BB.STANDARD, Frame)
-- se lunghezza inferiore al limite, accetto la direzione
if b3Fac:getDimX() < TOOLS[nToolIndex].dMaxDepth - BeamData.CUT_EXTRA then
vtO = asseX
else
bNoPerpCuts = true
end
else
bNoPerpCuts = true
end
if vtO then
vtToolDirection = Vector3d( vtO) * EgtIf( bAreOrthogonalCutsInverted, -1, 1)
else
-- scelta lato da lavorare per stabilire la vtToolDirection
local EdgeToMachine = {}
local _, Edges = FaceData.GetEdgesInfo( vCuts[i][1], 0)
EdgeToMachine = GetEdgeToMachine( Edges, sChosenBladeType)
vtToolDirection = EdgeToMachine.vtN
end
end
-- calcolo lavorazione della singola faccia
-- per tagli paralleli e faccia aperta si prova a tagliare come se fosse una faccia singola, accorpando i tagli
local bCanMergeParallelCuts = ( ( i % 2) == 0) and ( Proc.nFct == 1)
if bCanMergeParallelCuts then
local nAddGrpId = BeamLib.GetAddGroup( Part.id)
local nSurfToCut = EgtSurfTmBySewing( nAddGrpId, vCuts[i], false)
local ProcTrimesh = FeatureLib.GetProcFromTrimesh( nSurfToCut, Part)
local Parameters = {
Proc = Proc,
Part = Part,
MainFace = Face1,
Tool = TOOLS[nToolIndex],
sChosenBladeType = sChosenBladeType,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath
}
local bIsDicingOk, Machinings, bMoveAfterSplit = CalculateDiceMachinings( vCuts, Parameters)
local OptionalParametersCutWholeWaste = {
nToolIndex = nToolIndex,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath
}
local CutWholeWasteMachinings, CutWholeWasteResult = CutWholeWaste( ProcTrimesh, Part, OptionalParametersCutWholeWaste)
if CutWholeWasteResult.sStatus == 'Completed' then
for k = 1, #CutWholeWasteMachinings do
table.insert( Machinings, CutWholeWasteMachinings[k])
if CutWholeWasteMachinings[k].sStage == 'AfterTail' then
bMoveAfterSplit = true
end
end
else
EgtErase( nSurfToCut)
bIsDicingOk = false
end
end
-- caso standard (tagli perpendicolari o paralleli non accorpabili)
if ( not bCanMergeParallelCuts) or ( not bIsDicingOk) then
for j = 1, #vCuts[i] do
-- in generale sta sollevato di pochissimo
local dExtraCut = -0.1
-- se tagli paralleli
if ( i % 2) == 0 then
-- se non ci sono tagli ortogonali devo affondare
if bNoPerpCuts then
dExtraCut = BeamData.CUT_EXTRA
-- se è faccia singola si affonda
elseif Proc.nFct < 2 then
-- se tagli ortogonali invertiti, devo approfondire dello spessore lama
if bAreOrthogonalCutsInverted then
dExtraCut = TOOLS[nToolIndex].dThickness
-- se ultimo taglio, devo affondare
elseif j == #vCuts[i] then
dExtraCut = BeamData.CUT_EXTRA
end
end
end
local Cutting = {}
local ProcTrimesh = FeatureLib.GetProcFromTrimesh( vCuts[i][j], Part)
local FaceToMachine = ProcTrimesh.Faces[1]
local EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( FaceToMachine.Edges, vtToolDirection)
local dDepthToMachine = EdgeToMachine.dElevation + dExtraCut
local OptionalParametersFaceByBlade = {
dDepthToMachine = dDepthToMachine,
nToolIndex = nToolIndex,
dRadialStepSpan = 0,
dExtendAfterTail = dExtendAfterTail,
bIsDicing = true
}
Cutting = FaceByBlade.Make( ProcTrimesh, Part, FaceToMachine, EdgeToMachine, OptionalParametersFaceByBlade)
Cutting.ptCenter = Point3d( ProcTrimesh.Faces[1].ptCenter:getX(), 0, 0)
if Cutting.bIsApplicable then
table.insert( Machinings, Cutting)
bIsDicingOk = true
else
Result = FeatureLib.GetStrategyResultNotApplicable( 'Dicing failed')
return Machinings, Result
end
if Cutting.sStage == 'AfterTail' then
bMoveAfterSplit = true
end
end
end
if not bIsDicingOk then
Result = FeatureLib.GetStrategyResultNotApplicable()
return {}, Result
end
-- se presente anche solo una lavorazione AfterTail si spostano tutte
@@ -933,16 +964,12 @@ local function CutWithDicing( Proc, Part, OptionalParameters)
end
-- risultati del calcolo
if bIsDicingOk then
Result.sStatus = 'Completed'
Result.dCompletionPercentage = 100
Result.dQuality = FeatureLib.GetStrategyQuality( TOOLS[nToolIndex].sFamily)
Result.dTimeToMachineOriginal = FeatureLib.GetStrategyTimeToMachine( Machinings)
Result.dTimeToMachine = Result.dTimeToMachineOriginal * 2
Result.dMRR = ( FeatureInfo.dFeatureVolume / Result.dTimeToMachine) / pow( 10, 6)
else
Result = FeatureLib.GetStrategyResultNotApplicable()
end
Result.sStatus = 'Completed'
Result.dCompletionPercentage = 100
Result.dQuality = FeatureLib.GetStrategyQuality( TOOLS[nToolIndex].sFamily)
Result.dTimeToMachineOriginal = FeatureLib.GetStrategyTimeToMachine( Machinings)
Result.dTimeToMachine = Result.dTimeToMachineOriginal * 2
Result.dMRR = ( FeatureInfo.dFeatureVolume / Result.dTimeToMachine) / pow( 10, 6)
return Machinings, Result
end