- in BLADETOWASTE aggiunto CutWholeWaste da due lati anche verticali (GetDualSideCutStrategy)
- in FACEBYBLADE correzione ai tagli ridotti
This commit is contained in:
+159
-135
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user