- in MachiningLib.FindBlade si restituisce il BladeEngagement, se presente
- in BLADETOWASTE.GetEdgeToMachine aggiunta la possibilità di restituire l'n-esimo lato della lista ordinata; in GetSingleCutStrategy si tenta di cambiare lato se il con il primo set non si è trovato alcun utensile; altre piccole correzioni - in FACEBYBLADE refactoring per contemplare i vari casi di inversione
This commit is contained in:
@@ -119,6 +119,7 @@ end
|
||||
|
||||
function BLADEKEEPWASTE.Make( Proc, Part, OptionalParameters)
|
||||
-- TODO verificare funzionamento con lama da sotto
|
||||
-- TODO scelta utensile è corretto lasciarla a FaceByBlade?
|
||||
-- attenzione perchè se l'inclinazione della faccia la fa finire oltre lo spigolo questo riduce il massimo (come calcolare????)
|
||||
-- il FindBlade dovrà restituire di utilizzare sempre la lama sopra se l'angolo lo permette, ma avendo un'altezza massima (da macchina) oltre cui il DownUp non sarà fattibile (evita collisioni tra asse e pezzo)
|
||||
|
||||
|
||||
@@ -204,9 +204,14 @@ local function CompareEdgesNoPreference( EdgeA, EdgeB)
|
||||
end
|
||||
|
||||
|
||||
local function GetEdgeToMachine( Edges, sBladeType, bAllowFastCuts)
|
||||
local function GetEdgeToMachine( Edges, sBladeType, OptionalParameters)
|
||||
local EdgeToMachine = {}
|
||||
|
||||
-- parametri opzionali
|
||||
OptionalParameters = OptionalParameters or {}
|
||||
local bAllowFastCuts = OptionalParameters.bAllowFastCuts or false
|
||||
local nIndex = OptionalParameters.nIndex or 1
|
||||
|
||||
local EdgesSorted = {}
|
||||
for i = 1, #Edges do
|
||||
table.insert( EdgesSorted, Edges[i])
|
||||
@@ -218,23 +223,23 @@ local function GetEdgeToMachine( Edges, sBladeType, bAllowFastCuts)
|
||||
else
|
||||
table.sort( EdgesSorted, CompareEdgesTopHead)
|
||||
end
|
||||
EdgeToMachine = EdgesSorted[1]
|
||||
EdgeToMachine = EdgesSorted[nIndex]
|
||||
elseif sBladeType == 'Bottom' then
|
||||
table.sort( EdgesSorted, CompareEdgesBottomHead)
|
||||
EdgeToMachine = EdgesSorted[1]
|
||||
EdgeToMachine = EdgesSorted[nIndex]
|
||||
elseif sBladeType == 'TopGuillotine' then
|
||||
table.sort( EdgesSorted, CompareEdgesTopHeadGuillotine)
|
||||
EdgeToMachine = EdgesSorted[1]
|
||||
EdgeToMachine = EdgesSorted[nIndex]
|
||||
elseif sBladeType == 'HorizontalBottom' then
|
||||
table.sort( EdgesSorted, CompareEdgesHorizontalBottom)
|
||||
EdgeToMachine = EdgesSorted[1]
|
||||
EdgeToMachine = EdgesSorted[nIndex]
|
||||
elseif sBladeType == 'Vertical' then
|
||||
table.sort( EdgesSorted, CompareEdgesVertical)
|
||||
EdgeToMachine = EdgesSorted[1]
|
||||
EdgeToMachine = EdgesSorted[nIndex]
|
||||
-- TODO non testato; non si dovrebbe mai entrare in questo caso
|
||||
else
|
||||
table.sort( EdgesSorted, CompareEdgesNoPreference)
|
||||
EdgeToMachine = EdgesSorted[1]
|
||||
EdgeToMachine = EdgesSorted[nIndex]
|
||||
end
|
||||
|
||||
return EdgeToMachine
|
||||
@@ -357,24 +362,44 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters)
|
||||
local bAllowFastCuts = OptionalParameters.bAllowFastCuts or false
|
||||
local FaceToMachine = Proc.Faces[OptionalParameters.nFaceToMachineIndex or 1]
|
||||
-- lati da lavorare in base al tipo di lama
|
||||
-- se non arrivano dall'esterno si cercano i migliori disponibili
|
||||
-- se non arrivano dall'esterno si cercano i migliori disponibili, dapprima ignorando il flag bAllowFastCuts
|
||||
local EdgeToMachineList = OptionalParameters.EdgeToMachineList
|
||||
or {
|
||||
Top = GetEdgeToMachine( FaceToMachine.Edges, 'Top', bAllowFastCuts),
|
||||
Bottom = GetEdgeToMachine( FaceToMachine.Edges, 'Bottom', bAllowFastCuts),
|
||||
TopGuillotine = GetEdgeToMachine( FaceToMachine.Edges, 'TopGuillotine', bAllowFastCuts)
|
||||
Top = GetEdgeToMachine( FaceToMachine.Edges, 'Top'),
|
||||
Bottom = GetEdgeToMachine( FaceToMachine.Edges, 'Bottom'),
|
||||
TopGuillotine = GetEdgeToMachine( FaceToMachine.Edges, 'TopGuillotine')
|
||||
}
|
||||
|
||||
local sChosenBladeType
|
||||
|
||||
-- se nToolIndex è presente, GetBestBlade sceglierà solo il lato, altrimenti sceglierà lama e lato
|
||||
local OptionalParametersGetBestBlade = {
|
||||
EdgeToMachineTop = EdgeToMachineList.Top,
|
||||
EdgeToMachineBottom = EdgeToMachineList.Bottom,
|
||||
nToolIndex = nToolIndex
|
||||
}
|
||||
-- se nToolIndex è presente, GetBestBlade sceglierà solo il lato, altrimenti sceglierà lama e lato
|
||||
nToolIndex, sChosenBladeType = GetBestBlade( Proc, Part, FaceToMachine, OptionalParametersGetBestBlade)
|
||||
|
||||
-- se non è stato trovato un utensile e utensile e lati non arrivavano dall'esterno, si prova a cambiare lato (si prende il secondo della lista), sempre ignorando bAllowFastCuts
|
||||
if not nToolIndex and not OptionalParameters.nToolIndex and not OptionalParameters.EdgeToMachineList then
|
||||
EdgeToMachineList.Top = GetEdgeToMachine( FaceToMachine.Edges, 'Top', { nIndex = 2})
|
||||
EdgeToMachineList.Bottom = GetEdgeToMachine( FaceToMachine.Edges, 'Bottom', { nIndex = 2})
|
||||
OptionalParametersGetBestBlade.EdgeToMachineTop = EdgeToMachineList.Top
|
||||
OptionalParametersGetBestBlade.EdgeToMachineBottom = EdgeToMachineList.Bottom
|
||||
|
||||
nToolIndex, sChosenBladeType = GetBestBlade( Proc, Part, FaceToMachine, OptionalParametersGetBestBlade)
|
||||
end
|
||||
|
||||
-- se ancora non è stato trovato un utensile e utensile e lati non arrivavano dall'esterno, se permesso, si prova a scegliere il lato "veloce" (bAllowFastCuts)
|
||||
if bAllowFastCuts and not nToolIndex and not OptionalParameters.nToolIndex and not OptionalParameters.EdgeToMachineList then
|
||||
EdgeToMachineList.Top = GetEdgeToMachine( FaceToMachine.Edges, 'Top', { bAllowFastCuts = true})
|
||||
EdgeToMachineList.Bottom = GetEdgeToMachine( FaceToMachine.Edges, 'Bottom', { bAllowFastCuts = true})
|
||||
OptionalParametersGetBestBlade.EdgeToMachineTop = EdgeToMachineList.Top
|
||||
OptionalParametersGetBestBlade.EdgeToMachineBottom = EdgeToMachineList.Bottom
|
||||
|
||||
nToolIndex, sChosenBladeType = GetBestBlade( Proc, Part, FaceToMachine, OptionalParametersGetBestBlade)
|
||||
end
|
||||
|
||||
-- se possibile, upgrade del taglio tipo 'Top' a taglio a ghigliottina. Si tenta anche se il taglio singolo non è riuscito.
|
||||
if ( sChosenBladeType == 'Top' or not nToolIndex) and bReduceBladePath and FaceData.IsFaceRectangle( FaceToMachine) then
|
||||
local nToolIndexGuillotine
|
||||
@@ -384,7 +409,7 @@ local function GetSingleCutStrategy( Proc, Part, OptionalParameters)
|
||||
bAllowTopHead = true,
|
||||
bAllowBottomHead = false,
|
||||
FaceToMachine = FaceToMachine,
|
||||
EdgeToMachine = EdgeToMachineList.Top,
|
||||
EdgeToMachine = EdgeToMachineList.TopGuillotine,
|
||||
Part = Part
|
||||
})
|
||||
nToolIndexGuillotine = ToolInfo.nToolIndex
|
||||
@@ -590,7 +615,7 @@ local function CutWholeWaste( Proc, Part, OptionalParameters)
|
||||
Cutting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParametersFaceByBlade)
|
||||
|
||||
-- se taglio da un lato non ce la fa, si prova da due lati
|
||||
-- TODO valutare se estendere ai non parallelogrammi
|
||||
-- TODO valutare se deve funzionare solo per i rettangoli
|
||||
elseif FaceData.IsFaceParallelogram( Proc.Faces[1]) then
|
||||
|
||||
local CuttingParametersList
|
||||
@@ -798,9 +823,6 @@ local function CutWithDicing( Proc, Part, OptionalParameters)
|
||||
-- caso standard (tagli perpendicolari o paralleli non accorpabili)
|
||||
if ( not bCanMergeParallelCuts) or ( not bIsDicingOk) then
|
||||
for j = 1, #vCuts[i] do
|
||||
local Cutting = {}
|
||||
local vtNCurrentFace = EgtSurfTmFacetNormVersor( vCuts[i][j], 0, GDB_ID.ROOT)
|
||||
local FaceToMachine = { id = 0, vtN = vtNCurrentFace}
|
||||
-- in generale sta sollevato di pochissimo
|
||||
local dExtraCut = -0.1
|
||||
-- se tagli paralleli
|
||||
@@ -819,9 +841,10 @@ local function CutWithDicing( Proc, Part, OptionalParameters)
|
||||
end
|
||||
end
|
||||
end
|
||||
local Cutting = {}
|
||||
local ProcTrimesh = FeatureLib.GetProcFromTrimesh( vCuts[i][j], Part)
|
||||
local _, Edges = FaceData.GetEdgesInfo( vCuts[i][j], 0)
|
||||
local EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( Edges, vtToolDirection)
|
||||
local FaceToMachine = ProcTrimesh.Faces[1]
|
||||
local EdgeToMachine = BeamLib.FindEdgeBestOrientedAsDirection( FaceToMachine.Edges, vtToolDirection)
|
||||
local dDepthToMachine = EdgeToMachine.dElevation + dExtraCut
|
||||
local OptionalParametersFaceByBlade = {
|
||||
dDepthToMachine = dDepthToMachine,
|
||||
|
||||
@@ -343,6 +343,12 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar
|
||||
Cutting.bInvert = false
|
||||
end
|
||||
|
||||
-- ToolInvert
|
||||
if Cutting.sBladeEngagement == 'DownUp' then
|
||||
Cutting.bToolInvert = true
|
||||
Cutting.bInvert = not Cutting.bInvert
|
||||
end
|
||||
|
||||
-- analisi fattibilità lavorazione dal lato opposto
|
||||
if OppositeToolDirectionMode ~= 'Disabled' then
|
||||
|
||||
@@ -372,11 +378,12 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar
|
||||
OppositeToolDirectionMode = 'Disabled'
|
||||
|
||||
-- la direzione di percorrenza del lato deve essere verso l'alto; bInvert va considerata perchè inverte la direzione di percorrenza
|
||||
if ( Cutting.bInvert and Cutting.vtEdgeDirection:getZ() > 100 * GEO.EPS_SMALL)
|
||||
-- il BladeEngagement non deve cambiare, altrimenti è inutile invertire la direzione
|
||||
if ( sBladeEngagementOpposite == Cutting.sBladeEngagement)
|
||||
and ( Cutting.bInvert and Cutting.vtEdgeDirection:getZ() > 100 * GEO.EPS_SMALL)
|
||||
or ( ( not Cutting.bInvert) and Cutting.vtEdgeDirection:getZ() < -100 * GEO.EPS_SMALL) then
|
||||
|
||||
OppositeToolDirectionMode = 'Enabled'
|
||||
Cutting.sBladeEngagement = sBladeEngagementOpposite
|
||||
end
|
||||
end
|
||||
|
||||
@@ -422,8 +429,10 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar
|
||||
if Cutting.dMaxRadialOffset > 10 * GEO.EPS_SMALL then
|
||||
-- taglio a ghigliottina
|
||||
if bIsTopBlade and ( Cutting.dRadialOffsetGuillotine < Cutting.dMaxRadialOffset - 10 * GEO.EPS_SMALL) then
|
||||
|
||||
dDepthToMachine = Cutting.dDepthToMachine + Cutting.dRadialOffsetGuillotine
|
||||
Cutting.sEdgeUsage = 'Guillotine'
|
||||
|
||||
-- taglio ridotto
|
||||
else
|
||||
dDepthToMachine = Cutting.dDepthToMachine + Cutting.dMaxRadialOffset
|
||||
@@ -432,17 +441,19 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar
|
||||
end
|
||||
end
|
||||
|
||||
-- si ritesta la fattibilità del taglio con le nuove profondità
|
||||
local EdgeToMachineForEngagement = EdgeToMachine
|
||||
if OppositeToolDirectionMode == 'Enabled' then
|
||||
EdgeToMachineForEngagement = EdgeToMachineOpposite
|
||||
end
|
||||
local bIsApplicable, sBladeEngagement = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachineForEngagement, Part, TOOLS[Cutting.nToolIndex], dDepthToMachine)
|
||||
if bIsApplicable then
|
||||
Cutting.sBladeEngagement = sBladeEngagement
|
||||
else
|
||||
Cutting.sEdgeUsage = 'Standard'
|
||||
dDepthToMachine = Cutting.dDepthToMachine
|
||||
-- se cambiata la profondità dDepthToMachine, si ritesta la fattibilità del taglio
|
||||
if Cutting.sEdgeUsage ~= 'Standard' then
|
||||
local EdgeToMachineForEngagement = EdgeToMachine
|
||||
if OppositeToolDirectionMode == 'Enabled' then
|
||||
EdgeToMachineForEngagement = EdgeToMachineOpposite
|
||||
end
|
||||
local bIsApplicable, sBladeEngagement = MachiningLib.GetBladeEngagement( FaceToMachine, EdgeToMachineForEngagement, Part, TOOLS[Cutting.nToolIndex], dDepthToMachine)
|
||||
|
||||
-- se non fattibile o cambiano le condizioni BladeEngagement, non si riduce
|
||||
if not ( bIsApplicable and ( sBladeEngagement == Cutting.sBladeEngagement)) then
|
||||
Cutting.sEdgeUsage = 'Standard'
|
||||
dDepthToMachine = Cutting.dDepthToMachine
|
||||
end
|
||||
end
|
||||
|
||||
-- offset radiale (cambia se taglio opposto)
|
||||
@@ -453,12 +464,6 @@ function FACEBYBLADE.Make( Proc, Part, FaceToMachine, EdgeToMachine, OptionalPar
|
||||
end
|
||||
end
|
||||
|
||||
-- ToolInvert
|
||||
if Cutting.sBladeEngagement == 'DownUp' then
|
||||
Cutting.bToolInvert = true
|
||||
Cutting.bInvert = not Cutting.bInvert
|
||||
end
|
||||
|
||||
-- completamento
|
||||
Cutting.dCompletionPercentage = ( 1 - Cutting.dResidualDepth / Cutting.dDepthToMachine) * 100
|
||||
|
||||
|
||||
Reference in New Issue
Block a user