- in BLADETOWASTE aggiunto CutWholeWaste da due lati anche verticali (GetDualSideCutStrategy)

- in FACEBYBLADE correzione ai tagli ridotti
This commit is contained in:
luca.mazzoleni
2025-07-17 18:34:31 +02:00
parent 69259e3f80
commit af971f70fc
2 changed files with 163 additions and 136 deletions
+159 -135
View File
@@ -273,26 +273,26 @@ local function GetBestBlade( Proc, Part, Face, OptionalParameters)
nToolIndexBottom = OptionalParameters.nToolIndex
end
end
-- non ho l'untensile, devo cercarlo e scegliere il migliore tra testa sopra e sotto
else
local ToolInfo
-- ricerca lama testa sopra
local ToolSearchParameters = {}
ToolSearchParameters.vtN = Face.vtN
ToolSearchParameters.bAllowTopHead = true
ToolSearchParameters.bAllowBottomHead = false
ToolSearchParameters.dElevation = dElevationTop
ToolInfo = MachiningLib.FindBlade( Proc, ToolSearchParameters)
ToolInfo = MachiningLib.FindBlade( Proc, {
vtN = Face.vtN,
bAllowTopHead = true,
bAllowBottomHead = false,
dElevation = dElevationTop
})
if ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL then
nToolIndexTop = ToolInfo.nToolIndex
end
-- ricerca lama testa sotto
ToolSearchParameters = {}
ToolSearchParameters.vtN = Face.vtN
ToolSearchParameters.bAllowTopHead = false
ToolSearchParameters.bAllowBottomHead = true
ToolSearchParameters.dElevation = dElevationBottom
ToolInfo = MachiningLib.FindBlade( Proc, ToolSearchParameters)
ToolInfo = MachiningLib.FindBlade( Proc, {
vtN = Face.vtN,
bAllowTopHead = false,
bAllowBottomHead = true,
dElevation = dElevationBottom
})
if ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL then
nToolIndexBottom = ToolInfo.nToolIndex
end
@@ -365,9 +365,8 @@ end
local function GetSingleCutStrategy( Proc, Part, OptionalParameters)
OptionalParameters = OptionalParameters or {}
local FaceToMachine = Proc.Faces[1]
local sChosenBladeType
-- lati da lavorare in base al tipo di lama
local EdgeToMachineList = {
@@ -377,9 +376,10 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters)
TopGuillotine = GetEdgeToMachine(FaceToMachine.Edges, FaceToMachine.vtN, 'TopGuillotine')
}
-- parametri opzionali
OptionalParameters = OptionalParameters or {}
local nToolIndex = OptionalParameters.nToolIndex
local bReduceBladePath = OptionalParameters.bReduceBladePath
local sChosenBladeType
-- se nToolIndex è presente, GetBestBlade sceglierà solo il lato, altrimenti sceglierà lama e lato
local OptionalParametersGetBestBlade = {
@@ -393,12 +393,11 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters)
-- se possibile, upgrade del taglio tipo 'Top' a taglio a ghigliottina
if sChosenBladeType == 'Top' and bReduceBladePath and FaceData.IsFaceRectangular( Proc, FaceToMachine.id) then
-- ricerca lama migliore testa sopra
local ToolSearchParameters = {}
ToolSearchParameters.vtN = Proc.Faces[1].vtN
ToolSearchParameters.bAllowTopHead = true
ToolSearchParameters.bAllowBottomHead = false
ToolSearchParameters.dElevation = nil
local ToolInfo = MachiningLib.FindBlade( Proc, ToolSearchParameters)
local ToolInfo = MachiningLib.FindBlade( Proc, {
vtN = Proc.Faces[1].vtN,
bAllowTopHead = true,
bAllowBottomHead = false
})
-- test fattibilità taglio a ghigliottina
if ToolInfo.nToolIndex then
@@ -415,14 +414,129 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters)
end
local function GetDualSideCutStrategy( Proc, OptionalParameters)
local FaceToMachine = Proc.Faces[1]
-- parametri opzionali
OptionalParameters = OptionalParameters or {}
local nToolIndex = OptionalParameters.nToolIndex
local CuttingParametersList
local EdgeToMachine
-- se possibile, si prova il doppio taglio orizzontale con mix testa sopra/sotto (questa modalità si esclude se l'utensile arriva dall'esterno)
-- TODO valutare se farlo anche doppio orizzontale solo con testa sopra, se la lama ha la corsa per andare sotto!
EdgeToMachine = GetEdgeToMachine( FaceToMachine.Edges, FaceToMachine.vtN, 'HorizontalBottom')
if not nToolIndex and AreSameOrOppositeVectorApprox( EdgeToMachine.vtN, Z_AX()) then
-- inizialmente si prova a lavorare in mezzeria
local dDepthToMachineTop = EdgeToMachine.dElevation / 2 + BeamData.CUT_EXTRA_MIN
local dDepthToMachineBottom = dDepthToMachineTop
-- ricerca lama testa sopra
local ToolInfoTopBlade = MachiningLib.FindBlade( Proc, {
vtN = FaceToMachine.vtN,
bAllowTopHead = true,
bAllowBottomHead = false,
dElevation = dDepthToMachineTop
})
-- ricerca lama testa sotto
local ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, {
vtN = FaceToMachine.vtN,
bAllowTopHead = false,
bAllowBottomHead = true,
dElevation = dDepthToMachineBottom
})
local bIsTopLimited = ToolInfoTopBlade.dResidualDepth > 10 * GEO.EPS_SMALL
local bIsBottomLimited = ToolInfoBottomBlade.dResidualDepth > 10 * GEO.EPS_SMALL
-- testa sopra limitante
if bIsTopLimited and not bIsBottomLimited then
-- ricalcolo profondità di lavoro
dDepthToMachineTop = TOOLS[ToolInfoTopBlade.nToolIndex].dMaxMaterial
dDepthToMachineBottom = EdgeToMachine.dElevation - dDepthToMachineTop + BeamData.CUT_EXTRA_MIN
-- ricerca lama sotto con la nuova depth
ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, {
vtN = FaceToMachine.vtN,
bAllowTopHead = false,
bAllowBottomHead = true,
dElevation = dDepthToMachineBottom
})
bIsBottomLimited = ToolInfoBottomBlade.dResidualDepth > 10 * GEO.EPS_SMALL
-- testa sotto limitante
elseif bIsBottomLimited and not bIsTopLimited then
-- ricalcolo profondità di lavoro
dDepthToMachineBottom = TOOLS[ToolInfoBottomBlade.nToolIndex].dMaxMaterial
dDepthToMachineTop = EdgeToMachine.dElevation - dDepthToMachineBottom + BeamData.CUT_EXTRA_MIN
-- ricerca lama sopra con la nuova depth
ToolInfoTopBlade = MachiningLib.FindBlade( Proc, {
vtN = FaceToMachine.vtN,
bAllowTopHead = true,
bAllowBottomHead = false,
dElevation = dDepthToMachineTop
})
bIsTopLimited = ToolInfoTopBlade.dResidualDepth > 10 * GEO.EPS_SMALL
end
-- se almeno una delle due lame ci arriva si assegnano utensili e profondità da ritornare
if not ( bIsTopLimited and bIsBottomLimited) and ToolInfoTopBlade.nToolIndex and ToolInfoBottomBlade.nToolIndex then
CuttingParametersList = {
{
nToolIndex = ToolInfoBottomBlade.nToolIndex,
dDepthToMachine = dDepthToMachineBottom
},
{
nToolIndex = ToolInfoTopBlade.nToolIndex,
dDepthToMachine = dDepthToMachineTop
}
}
return CuttingParametersList, EdgeToMachine
end
end
-- arrivati qui si prova il taglio doppio verticale (taglio doppio orizzontale non si può fare oppure non ci arriva)
EdgeToMachine = GetEdgeToMachine( FaceToMachine.Edges, FaceToMachine.vtN, 'Vertical')
local dDepthToMachine = EdgeToMachine.dElevation / 2 + BeamData.CUT_EXTRA_MIN
-- ricerca lama testa sopra
local ToolInfo = MachiningLib.FindBlade( Proc, {
vtN = FaceToMachine.vtN,
bAllowTopHead = true,
bAllowBottomHead = false,
dElevation = dDepthToMachine
})
-- se lama ci arriva si assegnano utensili e profondità da ritornare
if ToolInfo.nToolIndex and ToolInfo.dResidualDepth < 10 * GEO.EPS_SMALL then
CuttingParametersList = {
{
nToolIndex = ToolInfo.nToolIndex,
dDepthToMachine = dDepthToMachine
},
{
nToolIndex = ToolInfo.nToolIndex,
dDepthToMachine = dDepthToMachine
}
}
else
EdgeToMachine = nil
end
return CuttingParametersList, EdgeToMachine
end
local function CutWholeWaste( Proc, Part, OptionalParameters)
local Machinings = {}
local Cutting = nil
local CuttingDouble = nil
local Result = {}
local EdgeToMachine = {}
local EdgeToMachine
local sChosenBladeType = ''
local dDepthToMachine = 0
local dCompletionPercentage = 0
-- controlli preventivi
@@ -445,9 +559,8 @@ local function CutWholeWaste( Proc, Part, OptionalParameters)
-- se taglio da un lato ce la fa, si crea la lavorazione
if nToolIndex then
dDepthToMachine = EdgeToMachine.dElevation + BeamData.CUT_EXTRA
local OptionalParametersFaceByBlade = {
dDepthToMachine = dDepthToMachine,
dDepthToMachine = EdgeToMachine.dElevation + BeamData.CUT_EXTRA,
nToolIndex = nToolIndex,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath
@@ -462,118 +575,29 @@ local function CutWholeWaste( Proc, Part, OptionalParameters)
-- TODO valutare se estendere ai non parallelogrammi
elseif FaceData.IsFaceRhomboid( Proc, Proc.Faces[1].id) then
EdgeToMachine = GetEdgeToMachine( Proc.Faces[1].Edges, Proc.Faces[1].vtN, 'HorizontalBottom')
-- se possibile, si prova il doppio taglio orizzontale con mix testa sopra/sotto
-- TODO valutare se farlo anche doppio orizzontale solo con testa sopra, se la lama ha la corsa per andare sotto
if BeamData.DOWN_HEAD and AreSameOrOppositeVectorApprox( EdgeToMachine.vtN, Z_AX()) then
-- inizialmente si prova a lavorare in mezzeria
dDepthToMachine = EdgeToMachine.dElevation / 2 + BeamData.CUT_EXTRA_MIN
local dDepthToMachineDouble = dDepthToMachine
local CuttingParametersList
CuttingParametersList, EdgeToMachine = GetDualSideCutStrategy( Proc, OptionalParameters)
-- ricerca lama testa sotto
local ToolSearchParameters = {}
ToolSearchParameters.vtN = Proc.Faces[1].vtN
ToolSearchParameters.bAllowTopHead = false
ToolSearchParameters.bAllowBottomHead = true
ToolSearchParameters.dElevation = dDepthToMachine
local ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, ToolSearchParameters)
local nToolIndexBottomBlade = ToolInfoBottomBlade.nToolIndex
-- ricerca lama testa sopra
ToolSearchParameters = {}
ToolSearchParameters.vtN = Proc.Faces[1].vtN
ToolSearchParameters.bAllowTopHead = true
ToolSearchParameters.bAllowBottomHead = false
ToolSearchParameters.dElevation = dDepthToMachine
local ToolInfoTopBlade = MachiningLib.FindBlade( Proc, ToolSearchParameters)
local nToolIndexTopBlade = ToolInfoTopBlade.nToolIndex
if CuttingParametersList then
local OptionalParametersFaceByBlade = {
dDepthToMachine = CuttingParametersList[1].dDepthToMachine,
nToolIndex = CuttingParametersList[1].nToolIndex,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath,
OppositeToolDirectionMode = 'Enabled'
}
local OptionalParametersFaceByBladeDouble = {
dDepthToMachine = CuttingParametersList[2].dDepthToMachine,
nToolIndex = CuttingParametersList[2].nToolIndex,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath
}
-- si può lavorare in mezzeria
if ( ToolInfoTopBlade.dResidualDepth <= 10 * GEO.EPS_SMALL)
and ( ToolInfoBottomBlade.dResidualDepth <= 10 * GEO.EPS_SMALL) then
local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine,
nToolIndex = nToolIndexBottomBlade,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath,
OppositeToolDirectionMode = 'Enabled'
}
local OptionalParametersFaceByBladeDouble = { dDepthToMachine = dDepthToMachineDouble,
nToolIndex = nToolIndexTopBlade,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath
}
Cutting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBlade)
CuttingDouble = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBladeDouble)
-- testa sopra limitante
elseif ( ToolInfoTopBlade.dResidualDepth > 10 * GEO.EPS_SMALL)
and ( ToolInfoBottomBlade.dResidualDepth <= 10 * GEO.EPS_SMALL) then
dDepthToMachineDouble = TOOLS[nToolIndexTopBlade].dMaxMaterial
dDepthToMachine = EdgeToMachine.dElevation - dDepthToMachineDouble + BeamData.CUT_EXTRA_MIN
-- ricerca lama testa sotto
ToolSearchParameters = {}
ToolSearchParameters.vtN = Proc.Faces[1].vtN
ToolSearchParameters.bAllowTopHead = false
ToolSearchParameters.bAllowBottomHead = true
ToolSearchParameters.dElevation = dDepthToMachine
ToolInfoBottomBlade = MachiningLib.FindBlade( Proc, ToolSearchParameters)
nToolIndexBottomBlade = ToolInfoBottomBlade.nToolIndex
if ToolInfoBottomBlade.dResidualDepth < 10 * GEO.EPS_SMALL then
local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine,
nToolIndex = nToolIndexBottomBlade,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath,
OppositeToolDirectionMode = 'Enabled'
}
local OptionalParametersFaceByBladeDouble = { dDepthToMachine = dDepthToMachineDouble,
nToolIndex = nToolIndexTopBlade,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath
}
Cutting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBlade)
CuttingDouble = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBladeDouble)
end
-- testa sotto limitante
elseif ( ToolInfoBottomBlade.dResidualDepth > 10 * GEO.EPS_SMALL)
and ( ToolInfoTopBlade.dResidualDepth <= 10 * GEO.EPS_SMALL) then
dDepthToMachine = TOOLS[nToolIndexBottomBlade].dMaxMaterial
dDepthToMachineDouble = EdgeToMachine.dElevation - dDepthToMachine + BeamData.CUT_EXTRA_MIN
-- ricerca lama testa sopra
ToolSearchParameters = {}
ToolSearchParameters.vtN = Proc.Faces[1].vtN
ToolSearchParameters.bAllowTopHead = true
ToolSearchParameters.bAllowBottomHead = false
ToolSearchParameters.dElevation = dDepthToMachineDouble
ToolInfoTopBlade = MachiningLib.FindBlade( Proc, ToolSearchParameters)
nToolIndexTopBlade = ToolInfoTopBlade.nToolIndex
if ToolInfoTopBlade.dResidualDepth < 10 * GEO.EPS_SMALL then
local OptionalParametersFaceByBlade = { dDepthToMachine = dDepthToMachine,
nToolIndex = nToolIndexBottomBlade,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath,
OppositeToolDirectionMode = 'Enabled'
}
local OptionalParametersFaceByBladeDouble = { dDepthToMachine = dDepthToMachineDouble,
nToolIndex = nToolIndexTopBlade,
dExtendAfterTail = dExtendAfterTail,
bReduceBladePath = bReduceBladePath
}
Cutting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBlade)
CuttingDouble = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBladeDouble)
end
end
Cutting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBlade)
CuttingDouble = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBladeDouble)
end
end
if Cutting and Cutting.bIsApplicable then
+4 -1
View File
@@ -199,7 +199,10 @@ function FACEBYBLADE.GetPathReductionLength( nToolIndex, dRadialOffset, Optional
local dExtra = OptionalParameters.dExtra or BeamData.CUT_EXTRA
-- calcolo
local dReductionLength = sqrt( ( dToolRadius - dExtra)^2 - ( dToolRadius - dRadialOffset)^2)
local dReductionLength = -dExtra
if dRadialOffset > dExtra + 10 * GEO.EPS_SMALL then
dReductionLength = sqrt( ( dToolRadius - dExtra)^2 - ( dToolRadius - dRadialOffset)^2)
end
return dReductionLength
end