Aggiunta "VerifySplitMachiningNeeded" per verifica split
This commit is contained in:
+103
-106
@@ -325,6 +325,81 @@ local function GetBestPocketingStrategy( Proc)
|
||||
return Machining
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
local function VerifySplitMachiningNeeded( Proc, Part)
|
||||
local vAddId = {}
|
||||
-- la lunghezza richiede spezzatura
|
||||
if ( Proc.b3Box:getDimX() > BeamData.LONGCUT_MAXLEN) or ( Proc.b3Box:getDimX() > 0.7 * Part.b3Solid:getDimX() and Proc.b3Box:getDimX() > BeamData.LONGCUT_ENDLEN) then
|
||||
-- recupero gruppo per geometria aggiuntiva
|
||||
local nAddGrpId = BeamLib.GetAddGroup( Part.idPart)
|
||||
local bStartLeft, bStartRight
|
||||
|
||||
-- se feature inizia al di sotto del limite sinistro
|
||||
if Proc.b3Box:getMin():getX() < Part.b3Solid:getMin():getX() + BeamData.LONGCUT_ENDLEN then
|
||||
bStartLeft = true
|
||||
end
|
||||
-- se feature inizia al di sotto del limite destro
|
||||
if Proc.b3Box:getMax():getX() > Part.b3Solid:getMax():getX() - BeamData.LONGCUT_ENDLEN then
|
||||
bStartRight = true
|
||||
end
|
||||
|
||||
-- salvo valori
|
||||
local dNewMinX = Proc.b3Box:getMin():getX()
|
||||
local dNewMaxX = Proc.b3Box:getMax():getX()
|
||||
local dNewRest = Proc.b3Box:getDimX()
|
||||
-- creo primo spezzone sulla sinistra
|
||||
if bStartLeft then
|
||||
local AddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL
|
||||
dNewMinX = max( ( Proc.b3Box:getMin():getX() + TOOLS[ToolInfo.nToolIndex].dDiameter * 2), Part.b3Solid:getMin():getX() + BeamData.LONGCUT_ENDLEN)
|
||||
local ptOn = Point3d( dNewMinX, 0, 0)
|
||||
dNewRest = abs( dNewMaxX - dNewMinX)
|
||||
-- taglio della superficie lato sinistro
|
||||
EgtCutSurfTmPlane( AddId, ptOn, X_AX(), true, GDB_RT.GLOB)
|
||||
-- eseguo inserimento
|
||||
table.insert( vAddId, AddId)
|
||||
end
|
||||
-- creo spezzone sulla destra
|
||||
if bStartRight then
|
||||
local AddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL
|
||||
dNewMaxX = min( ( Proc.b3Box:getMax():getX() - TOOLS[ToolInfo.nToolIndex].dDiameter * 2), Part.b3Solid:getMax():getX() - BeamData.LONGCUT_ENDLEN)
|
||||
local ptOn = Point3d( dNewMaxX, 0, 0)
|
||||
dNewRest = abs( dNewMaxX - dNewMinX)
|
||||
-- taglio della superficie lato destro
|
||||
EgtCutSurfTmPlane( AddId, ptOn, -X_AX(), true, GDB_RT.GLOB)
|
||||
-- eseguo inserimento
|
||||
table.insert( vAddId, EgtIf( BeamData.RIGHT_LOAD, 2, 1),AddId)
|
||||
end
|
||||
-- lavoro il restante
|
||||
local nSplitParts = max( ceil( dNewRest / BeamData.LONGCUT_MAXLEN + 10 * GEO.EPS_SMALL), 2)
|
||||
local dSplitPartsLen = dNewRest / nSplitParts
|
||||
for i = 1, nSplitParts do
|
||||
local AddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL
|
||||
local ptOn
|
||||
-- eseguo trim sinistro
|
||||
if i ~= 1 or bStartLeft then
|
||||
ptOn = Point3d( dNewMinX, 0, 0)
|
||||
-- taglio della superficie lato sinistro
|
||||
EgtCutSurfTmPlane( AddId, ptOn, -X_AX(), true, GDB_RT.GLOB)
|
||||
end
|
||||
-- eseguo trim destro
|
||||
dNewMaxX = dNewMinX + dSplitPartsLen
|
||||
if i ~= nSplitParts or bStartRight then
|
||||
ptOn = Point3d( dNewMaxX, 0, 0)
|
||||
-- taglio della superficie lato destro
|
||||
EgtCutSurfTmPlane( AddId, ptOn, X_AX(), true, GDB_RT.GLOB)
|
||||
end
|
||||
-- il nuovo minimo è il punto massimo del precedente
|
||||
dNewMinX = dNewMaxX
|
||||
-- eseguo inserimento in modo da ordinare da X- a X+
|
||||
table.insert( vAddId, EgtIf( BeamData.RIGHT_LOAD, 1+i, EgtIf( bStartLeft, 1, 2)), AddId)
|
||||
end
|
||||
else
|
||||
table.insert( vAddId, Proc.id)
|
||||
end
|
||||
|
||||
return vAddId
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
function STR0002.Make( bAddMachining, Proc, Part, CustomParameters)
|
||||
-- carico parametri de default e li aggiorno con quelli passati dal chiamante (potrebbero non essere congruenti)
|
||||
@@ -350,128 +425,50 @@ function STR0002.Make( bAddMachining, Proc, Part, CustomParameters)
|
||||
local bAreAllApplyOk = true
|
||||
local ToolInfo = {}
|
||||
local Pocketing = {}
|
||||
Pocketing.Steps = {}
|
||||
Pocketing.LeadIn = {}
|
||||
|
||||
Strategy.Machining = GetBestPocketingStrategy( Proc)
|
||||
|
||||
if bAddMachining and Strategy.Result.sStatus ~= 'Not-Applicable' then
|
||||
-- le lunghezza richiede spezzatura
|
||||
if ( Proc.b3Box:getDimX() > BeamData.LONGCUT_MAXLEN) or ( Proc.b3Box:getDimX() > 0.7 * Part.b3Solid:getDimX() and Proc.b3Box:getDimX() > BeamData.LONGCUT_ENDLEN) then
|
||||
-- recupero gruppo per geometria aggiuntiva
|
||||
local nAddGrpId = BeamLib.GetAddGroup( Part.idPart)
|
||||
local vAddId = {}
|
||||
local bStartLeft, bStartRight
|
||||
local vAddId = VerifySplitMachiningNeeded( Proc, Part)
|
||||
|
||||
-- se feature inizia al di sotto del limite sinistro
|
||||
if Proc.b3Box:getMin():getX() < Part.b3Solid:getMin():getX() + BeamData.LONGCUT_ENDLEN then
|
||||
bStartLeft = true
|
||||
end
|
||||
-- se feature inizia al di sotto del limite destro
|
||||
if Proc.b3Box:getMax():getX() > Part.b3Solid:getMax():getX() - BeamData.LONGCUT_ENDLEN then
|
||||
bStartRight = true
|
||||
end
|
||||
|
||||
-- salvo valori
|
||||
local dNewMinX = Proc.b3Box:getMin():getX()
|
||||
local dNewMaxX = Proc.b3Box:getMax():getX()
|
||||
local dNewRest = Proc.b3Box:getDimX()
|
||||
-- creo primo spezzone sulla sinistra
|
||||
if bStartLeft then
|
||||
local AddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL
|
||||
dNewMinX = max( ( Proc.b3Box:getMin():getX() + TOOLS[ToolInfo.nToolIndex].dDiameter * 2), Part.b3Solid:getMin():getX() + BeamData.LONGCUT_ENDLEN)
|
||||
local ptOn = Point3d( dNewMinX, 0, 0)
|
||||
dNewRest = abs( dNewMaxX - dNewMinX)
|
||||
-- taglio della superficie lato sinistro
|
||||
EgtCutSurfTmPlane( AddId, ptOn, X_AX(), true, GDB_RT.GLOB)
|
||||
-- eseguo inserimento
|
||||
table.insert( vAddId, AddId)
|
||||
end
|
||||
-- creo spezzone sulla destra
|
||||
if bStartRight then
|
||||
local AddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL
|
||||
dNewMaxX = min( ( Proc.b3Box:getMax():getX() - TOOLS[ToolInfo.nToolIndex].dDiameter * 2), Part.b3Solid:getMax():getX() - BeamData.LONGCUT_ENDLEN)
|
||||
local ptOn = Point3d( dNewMaxX, 0, 0)
|
||||
dNewRest = abs( dNewMaxX - dNewMinX)
|
||||
-- taglio della superficie lato destro
|
||||
EgtCutSurfTmPlane( AddId, ptOn, -X_AX(), true, GDB_RT.GLOB)
|
||||
-- eseguo inserimento
|
||||
table.insert( vAddId, EgtIf( BeamData.RIGHT_LOAD, 2, 1),AddId)
|
||||
end
|
||||
-- lavoro il restante
|
||||
local nSplitParts = max( ceil( dNewRest / BeamData.LONGCUT_MAXLEN + 10 * GEO.EPS_SMALL), 2)
|
||||
local dSplitPartsLen = dNewRest / nSplitParts
|
||||
for i = 1, nSplitParts do
|
||||
local AddId = EgtCopyGlob( Proc.id, nAddGrpId) or GDB_ID.NULL
|
||||
local ptOn
|
||||
-- eseguo trim sinistro
|
||||
if i ~= 1 or bStartLeft then
|
||||
ptOn = Point3d( dNewMinX, 0, 0)
|
||||
-- taglio della superficie lato sinistro
|
||||
EgtCutSurfTmPlane( AddId, ptOn, -X_AX(), true, GDB_RT.GLOB)
|
||||
end
|
||||
-- eseguo trim destro
|
||||
dNewMaxX = dNewMinX + dSplitPartsLen
|
||||
if i ~= nSplitParts or bStartRight then
|
||||
ptOn = Point3d( dNewMaxX, 0, 0)
|
||||
-- taglio della superficie lato destro
|
||||
EgtCutSurfTmPlane( AddId, ptOn, X_AX(), true, GDB_RT.GLOB)
|
||||
end
|
||||
-- il nuovo minimo è il punto massimo del precedente
|
||||
dNewMinX = dNewMaxX
|
||||
-- eseguo inserimento in modo da ordinare da X- a X+
|
||||
table.insert( vAddId, EgtIf( BeamData.RIGHT_LOAD, 1+i, EgtIf( bStartLeft, 1, 2)), AddId)
|
||||
end
|
||||
-- setto i parametri di base comuni
|
||||
Pocketing.nType = MCH_OY.POCKETING
|
||||
Pocketing.nSubType = EgtIf( Proc.Topology.sName == 'Pocket-5-Blind', MCH_POCK_SUB.SPIRALOUT, MCH_POCK_SUB.SPIRALIN)
|
||||
Pocketing.LeadIn.nType = MCH_POCK_LI.ZIGZAG
|
||||
Pocketing.idProc = Proc.id
|
||||
-- si applicano le lavorazioni
|
||||
for i = 1, #vAddId do
|
||||
for j = 1, #Strategy.Machining do
|
||||
if Strategy.Machining[i].bIsApplicable then
|
||||
Pocketing.Steps.dStep = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dStep
|
||||
Pocketing.Steps.dSideStep = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dSideStep
|
||||
Pocketing.nToolIndex = Strategy.Machining[j].ToolInfo.nToolIndex
|
||||
Pocketing.LeadIn.dTangentDistance = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dDiameter/2
|
||||
Pocketing.LeadIn.dElevation = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dDiameter/2
|
||||
Pocketing.sDepth = -Strategy.Machining[j].ToolInfo.dResidualDepth
|
||||
if j == 4 then
|
||||
Pocketing.bToolInvert = true
|
||||
end
|
||||
-- si applicano le lavorazioni
|
||||
for i = 1, #vAddId do
|
||||
for j = 1, #Strategy.Machining do
|
||||
if Strategy.Machining[j].bIsApplicable then
|
||||
Pocketing = {}
|
||||
Pocketing.Steps = {}
|
||||
Pocketing.LeadIn = {}
|
||||
Pocketing.nType = MCH_OY.POCKETING
|
||||
Pocketing.nSubType = EgtIf( Proc.Topology.sName == 'Pocket-5-Blind', MCH_POCK_SUB.SPIRALOUT, MCH_POCK_SUB.SPIRALIN)
|
||||
Pocketing.LeadIn.nType = MCH_POCK_LI.ZIGZAG
|
||||
Pocketing.idProc = Proc.id
|
||||
Pocketing.Steps.dStep = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dStep
|
||||
Pocketing.Steps.dSideStep = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dSideStep
|
||||
Pocketing.nToolIndex = Strategy.Machining[j].ToolInfo.nToolIndex
|
||||
Pocketing.LeadIn.dTangentDistance = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dDiameter/2
|
||||
Pocketing.LeadIn.dElevation = TOOLS[Strategy.Machining[j].ToolInfo.nToolIndex].dDiameter/2
|
||||
Pocketing.sDepth = -Strategy.Machining[j].ToolInfo.dResidualDepth
|
||||
if j == 4 then
|
||||
Pocketing.bToolInvert = true
|
||||
end
|
||||
-- se ho una sola trimesh, sto lavorando la Proc direttamente e non ho spezzato. Applico direttamente alla geometria calcolata prima
|
||||
if #vAddId == 1 then
|
||||
Pocketing.Geometry = {{ Strategy.Machining[i].idProc, Strategy.Machining[i].idFaceToMachine}}
|
||||
bAreAllApplyOk = MachiningLib.AddNewMachining( Proc, Pocketing)
|
||||
else
|
||||
-- TODO settare parametro per indicare qual è lo spezzone che deve essere fatto dopo il taglio di separazione
|
||||
for k=1, Proc.nFct do
|
||||
for k = 1, Proc.nFct do
|
||||
local vtNSplitFace
|
||||
_, vtNSplitFace = EgtSurfTmFacetCenter( vAddId[i], k - 1, GDB_ID.ROOT)
|
||||
if vtNSplitFace and AreSameVectorApprox( vtNSplitFace, Strategy.Machining[j].vtFaceNormal) then
|
||||
Pocketing.Geometry = {{ vAddId[i], k - 1}}
|
||||
bAreAllApplyOk = MachiningLib.AddNewMachining( Proc, Pocketing)
|
||||
bAreAllApplyOk = bAreAllApplyOk and MachiningLib.AddNewMachining( Proc, Pocketing)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
Pocketing.nType = MCH_OY.POCKETING
|
||||
Pocketing.nSubType = EgtIf( Proc.Topology.sName == 'Pocket-5-Blind', MCH_POCK_SUB.SPIRALOUT, MCH_POCK_SUB.SPIRALIN)
|
||||
Pocketing.LeadIn.nType = MCH_POCK_LI.ZIGZAG
|
||||
for i = 1, #Strategy.Machining do
|
||||
if Strategy.Machining[i].bIsApplicable then
|
||||
Pocketing.Steps.dStep = TOOLS[Strategy.Machining[i].ToolInfo.nToolIndex].dStep
|
||||
Pocketing.Steps.dSideStep = TOOLS[Strategy.Machining[i].ToolInfo.nToolIndex].dSideStep
|
||||
Pocketing.nToolIndex = Strategy.Machining[i].ToolInfo.nToolIndex
|
||||
Pocketing.LeadIn.dTangentDistance = TOOLS[Strategy.Machining[i].ToolInfo.nToolIndex].dDiameter/2
|
||||
Pocketing.LeadIn.dElevation = TOOLS[Strategy.Machining[i].ToolInfo.nToolIndex].dDiameter/2
|
||||
Pocketing.sDepth = -Strategy.Machining[i].ToolInfo.dResidualDepth
|
||||
if i == 4 and Strategy.Machining[i].bInvertTool then
|
||||
Pocketing.bToolInvert = true
|
||||
end
|
||||
Pocketing.Geometry = {{ Strategy.Machining[i].idProc, Strategy.Machining[i].idFaceToMachine}}
|
||||
bAreAllApplyOk = MachiningLib.AddNewMachining( Proc, Pocketing)
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
bAreAllApplyOk = false
|
||||
|
||||
Reference in New Issue
Block a user