From 4facba3389d5fb97ec4edc88c7eaf2ecc98b521f Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Mon, 10 Jun 2024 09:31:17 +0200 Subject: [PATCH] Aggiunta "VerifySplitMachiningNeeded" per verifica split --- Strategies/STR0002/STR0002.lua | 209 ++++++++++++++++----------------- 1 file changed, 103 insertions(+), 106 deletions(-) diff --git a/Strategies/STR0002/STR0002.lua b/Strategies/STR0002/STR0002.lua index a7a0f05..338e6c4 100644 --- a/Strategies/STR0002/STR0002.lua +++ b/Strategies/STR0002/STR0002.lua @@ -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