From 4cc0b6e2b36a9d1d4ba8120ef8c77fa1757107be Mon Sep 17 00:00:00 2001 From: "andrea.villa" Date: Mon, 29 Sep 2025 12:35:17 +0200 Subject: [PATCH] - HEADCUT ore chiama SPLITCUT in caso di PreCut e BLADETOWASTE per materiale residuo. - Modifiche varie minori per gestire HEADCUT con librerie standard --- BatchProcessNew.lua | 1 + LuaLibs/BeamExec.lua | 1 + Strategies/Standard/HEADCUT/HEADCUT.json | 10 + Strategies/Standard/HEADCUT/HEADCUT.lua | 368 +++++------------------ Strategies/Standard/TAILCUT/TAILCUT.lua | 3 + StrategyLibs/SPLITCUT.lua | 15 +- 6 files changed, 89 insertions(+), 309 deletions(-) diff --git a/BatchProcessNew.lua b/BatchProcessNew.lua index 4f57018..a287c60 100644 --- a/BatchProcessNew.lua +++ b/BatchProcessNew.lua @@ -582,6 +582,7 @@ if bToProcess then -- sovramateriale in testa al pezzo local dDeltaS = max( PARTS[i].dPosX - ( dBarLen - dLen), 0) + PARTS[i].dHeadOverMaterial = dDeltaS -- lunghezza grezzo (comprende sovramateriale di testa e mm tagliati in coda dalla lavorazione, tipicamente 5.4mm dello spessore lama) local dCrawLen = PARTS[i].dRawLength -- materiale tolto in coda dalla lavorazione di separazione diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 787c046..cec9362 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -462,6 +462,7 @@ function BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, PARTS, b PARTS[i].CombinationList = BeamExec.GetAvailableCombinations( PARTS[i], bCalcBestPieceUnloadPosition) PARTS[i].SplittingPoints = BeamLib.GetPartSplittingPoints( PARTS[i]) PARTS[i].NotClampableLength = { STD = { dHead = 0, dTail = 0}, SIDE = { dHead = 0, dTail = 0}, DOWN = { dHead = 0, dTail = 0}} + PARTS[i].dHeadOverMaterial = dDeltaS else local sOut = 'Error: part L(' .. EgtNumToString( dPartLen, 1) .. ') too big for raw part L(' .. EgtNumToString( dLen - 0.1, 1) .. ')' return false, sOut diff --git a/Strategies/Standard/HEADCUT/HEADCUT.json b/Strategies/Standard/HEADCUT/HEADCUT.json index 2fac4e0..6333621 100644 --- a/Strategies/Standard/HEADCUT/HEADCUT.json +++ b/Strategies/Standard/HEADCUT/HEADCUT.json @@ -51,6 +51,16 @@ "sMessageId": " ", "sMinUserLevel": "1" }, + { + "sName": "bExecutePreCut", + "sNameNge": "EXEC_PRECUT", + "sValue": "true", + "sDescriptionShort": "Force to add PreCuts", + "sDescriptionLong": "Autocam will apply a machining on the theoretical zero, to avoid collision if the theoretical piece length doesn't correspond to the real length", + "sType": "b", + "sMessageId": " ", + "sMinUserLevel": "1" + }, { "sName": "bFinishWithMill", "sNameNge": "MILL_FINISH", diff --git a/Strategies/Standard/HEADCUT/HEADCUT.lua b/Strategies/Standard/HEADCUT/HEADCUT.lua index 7a65ae0..b5b314c 100644 --- a/Strategies/Standard/HEADCUT/HEADCUT.lua +++ b/Strategies/Standard/HEADCUT/HEADCUT.lua @@ -3,229 +3,57 @@ -- HeadCut -- Feature: HeadCut - ---------------------------------------------------------------------------------------------------------- --- TODO: SPLITCUT è una funzione di base e si occupa di fare lo split, cioè considernado come se la trave fosse molto lunga e motore non interferisce mai --- HEADCUT è figlia della TAILCUT. Le due strategie sono identiche in caso di rimozione del grezzo in eccesso. La TAILCUT ha in più la gestione dello split --- Decidere se lasciare HEADCUT e TAILCUT divise, oppure se uniformarle e chiamare una o l'altra in base alla feature alla quale sono applicate. ---------------------------------------------------------------------------------------------------------- - - -- carico librerie local BeamLib = require( 'BeamLib') local BeamData = require( 'BeamData') -local MachiningLib = require( 'MachiningLib') local FeatureLib = require( 'FeatureLib') +local MachiningLib = require( 'MachiningLib') +local SPLITCUT = require( 'SPLITCUT') -- strategie di base -local FaceByBlade = require('FACEBYBLADE') +local BladeToWaste = require('BLADETOWASTE') -- Tabella per definizione modulo local HEADCUT = {} local Strategy = {} -------------------------------------------------------------------------------------------------------------- -local function LoadStrategyParameters( Proc, CustomParameters) - local StrategyLib = {} - StrategyLib.Config = STRATEGIES_CONFIG[CustomParameters.sStrategyId] - Strategy.sName = StrategyLib.Config.sStrategyId - Strategy.Parameters = BeamLib.LoadCustomParametersInStrategy( Proc, CustomParameters, StrategyLib.Config) - Strategy.Result = {} - Strategy.Machining = {} - Strategy.Result.sInfo = '' - return Strategy -end ------------------------------------------------------------------------------------------------------------- local function MakeChamfer() -- TODO funzionalità da aggiungere end -------------------------------------------------------------------------------------------------------------- -local function GetEdgeToMachine( Proc, vtEdge) - local Edge - for i = 1, #Proc.Faces[1].Edges do - if AreSameVectorApprox( Proc.Faces[1].Edges[i].vtN, vtEdge) then - Edge = Proc.Faces[1].Edges[i] - end - end - return Edge -end - -------------------------------------------------------------------------------------------------------------- -local function GetSplitStrategy( Proc, Part) - -- se non sono stati caricati i parametri, si ricaricano - if not Strategy.Parameters then - Strategy = LoadStrategyParameters( Proc, _) - end - - -- separazione solo se esiste grezzo successivo con pezzi o scaricabile - local nNextRawId = EgtGetNextRawPart( Part.idRaw) - Strategy.bSplit = ( nNextRawId and ( EgtGetPartInRawPartCount( nNextRawId) > 0 or EgtGetRawPartBBox( nNextRawId):getDimX() >= BeamData.dMinRaw)) - - -- imposto paraemtri di ricerca utensile in base a topologia - local Machining = {} - -- sTypeMachining = BladeSideSingle\ BladeSideDouble\ BladeHorizontalSingle\ BladeHorizontalDouble\ ChainSawHorizontal\ ChainSawSideSingle\ ChainSawSideDouble\ ChainSawPlusBlade\ Mill\ None - Machining.sTypeMachining = 'None' - local Splitting = {} - local ToolSearchParameters = {} - ToolSearchParameters.vtN = Proc.Faces[1].vtN - - - -- ===== RICERCA UTENSILE ===== - -- cerco lama sopra - Splitting.bIsApplicable = false - ToolSearchParameters.bAllowTopHead = true - ToolSearchParameters.bAllowBottomHead = false - Splitting.ToolInfo = {} - Splitting.ToolInfo = MachiningLib.FindBlade( Proc, ToolSearchParameters) - if Splitting.ToolInfo.nToolIndex then - Splitting.bIsApplicable = true - local ParametersMRR = {} - ParametersMRR.nToolIndex = Splitting.ToolInfo.nToolIndex - Splitting.dMRR = MachiningLib.GetToolMRR( ParametersMRR) - end - table.insert( Machining, Splitting) - - -- cerco lama sotto - Splitting = {} - Splitting.bIsApplicable = false - ToolSearchParameters.bAllowTopHead = false - ToolSearchParameters.bAllowBottomHead = true - Splitting.ToolInfo = {} - Splitting.ToolInfo = MachiningLib.FindBlade( Proc, ToolSearchParameters) - if Splitting.ToolInfo.nToolIndex then - Splitting.bIsApplicable = true - local ParametersMRR = {} - ParametersMRR.nToolIndex = Splitting.ToolInfo.nToolIndex - Splitting.dMRR = MachiningLib.GetToolMRR( ParametersMRR) - end - table.insert( Machining, Splitting) - - -- cerco motosega - Splitting = {} - Splitting.bIsApplicable = false - table.insert( Machining, Splitting) - - -- cerco fresa - Splitting = {} - Splitting.bIsApplicable = false - table.insert( Machining, Splitting) - - -- ===== SCELTA LAVORAZIONI ===== - -- forzature da parametri - if Strategy.Parameters.bForceChainSaw then - Machining[1].bIsApplicable = false - Machining[2].bIsApplicable = false - end - - -- setto valori di default. Impossibile che taglio di separazione sia incompleto - Strategy.Result.sStatus = 'Completed' - Strategy.Result.nCompletionIndex = FeatureLib.GetFeatureCompletionIndex( 100) - Strategy.Result.dMRR = 1 - - -- correzioni sul massimo materiale lama, considerando ingombri vari - local dMaxMatBladeSideSingle - local dMaxMatBladeSideDouble - local dMaxMatBladeHorizontalSingle - local dMaxMatBladeHorizontalDouble - if Machining[1].bIsApplicable then - local dMaxMat = TOOLS[Machining[1].ToolInfo.nToolIndex].dMaxMaterial - local dRadius = TOOLS[Machining[1].ToolInfo.nToolIndex].dDiameter / 2 - local sHead = TOOLS[Machining[1].ToolInfo.nToolIndex].sHead - -- se taglio di fianco disponibile, si controlla il massimo materiale reale. Per pezzi alti, bisogna controllare anche l'ingombro asse Z nelle 4 direzioni. - if Part.dHeight < BeamData.MIN_DIM_HBEAM then - dMaxMat = min( dMaxMat, BeamData.MAX_DIM_HTCUT) - dMaxMatBladeSideSingle = dMaxMat - dMaxMatBladeSideDouble = dMaxMat * 2 - else - if BeamData.GetMaxMatReductionBladeCut then - dMaxMatBladeSideSingle = min( max( dRadius - BeamData.GetMaxMatReductionBladeCut( sHead, Y_AX()), dRadius - BeamData.GetMaxMatReductionBladeCut( sHead, -Y_AX())), - TOOLS[Machining[1].ToolInfo.nToolIndex].dMaxMaterial) - dMaxMatBladeSideDouble = dRadius - BeamData.GetMaxMatReductionBladeCut( sHead, Y_AX()) + dRadius - BeamData.GetMaxMatReductionBladeCut( sHead, -Y_AX()) - else - dMaxMatBladeSideSingle = abs( BeamData.MAX_DIM_HTCUT_HBEAM) - dMaxMatBladeSideDouble = abs( BeamData.MAX_DIM_HTCUT_HBEAM) * 2 - end - end - -- se taglio orizzontale - if BeamData.GetMaxMatReductionBladeCut then - dMaxMatBladeHorizontalSingle = min( TOOLS[Machining[1].ToolInfo.nToolIndex].dMaxMaterial, dRadius - BeamData.GetMaxMatReductionBladeCut( TOOLS[Machining[1].ToolInfo.nToolIndex].sHead, -Z_AX())) - else - dMaxMatBladeHorizontalSingle = TOOLS[Machining[1].ToolInfo.nToolIndex].dMaxMaterial - end - end - if Machining[2].bIsApplicable then - if BeamData.GetMaxMatReductionBladeCut then - local dRadius = TOOLS[Machining[2].ToolInfo.nToolIndex].dDiameter / 2 - dMaxMatBladeHorizontalDouble = min( TOOLS[Machining[2].ToolInfo.nToolIndex].dMaxMaterial, dRadius - BeamData.GetMaxMatReductionBladeCut( TOOLS[Machining[2].ToolInfo.nToolIndex].sHead, Z_AX())) - else - dMaxMatBladeHorizontalDouble = TOOLS[Machining[2].ToolInfo.nToolIndex].dMaxMaterial - end - end - - -- TODO considerare di tagliare con il massimo materiale possibile per non salire troppo in Z (macchine tipo PF), oppure non scendere troppo (tipo Kairos) - -- BladeSideSingle (taglio di lama singolo di fianco) - if Machining[1].bIsApplicable and ( dMaxMatBladeSideSingle - BeamData.CUT_EXTRA) > Part.dWidth + 10 * GEO.EPS_SMALL then - Strategy.Result.nQuality = FeatureLib.GetStrategyQuality( 'SAWBLADE') - Machining.sTypeMachining = 'BladeSideSingle' - Machining[2].bIsApplicable = false - Machining[3].bIsApplicable = false - Machining[4].bIsApplicable = false - return Machining - -- TODO considerare di tagliare con il massimo materiale possibile per non salire troppo in Z (macchine tipo PF), oppure non scendere troppo (tipo Kairos) - -- BladeSideDouble (taglio di lama doppio di fianco) - elseif Machining[1].bIsApplicable and ( dMaxMatBladeSideDouble - BeamData.CUT_EXTRA) > Part.dWidth + 10 * GEO.EPS_SMALL then - Strategy.Result.nQuality = FeatureLib.GetStrategyQuality( 'SAWBLADE') - Strategy.Result.dMRR = Strategy.Result.dMRR/2 - Machining.sTypeMachining = 'BladeSideDouble' - Machining[2].bIsApplicable = false - Machining[3].bIsApplicable = false - Machining[4].bIsApplicable = false - return Machining - -- BladeHorizontalSingle (taglio di lama singolo orizzontale) - elseif Machining[1].bIsApplicable and ( dMaxMatBladeHorizontalSingle - BeamData.CUT_EXTRA) > Part.dHeight + 10 * GEO.EPS_SMALL then - Strategy.Result.nQuality = FeatureLib.GetStrategyQuality( 'SAWBLADE') - Machining.sTypeMachining = 'BladeHorizontalSingle' - Machining[2].bIsApplicable = false - Machining[3].bIsApplicable = false - Machining[4].bIsApplicable = false - return Machining - -- BladeHorizontalDouble (taglio di lama doppio orizzontale) - elseif Machining[1].bIsApplicable and Machining[2].bIsApplicable and - ( dMaxMatBladeHorizontalSingle + dMaxMatBladeHorizontalDouble - BeamData.CUT_EXTRA) > Part.dHeight + 10 * GEO.EPS_SMALL then - Strategy.Result.nQuality = FeatureLib.GetStrategyQuality( 'SAWBLADE') - Strategy.Result.dMRR = Strategy.Result.dMRR/2 - Machining.sTypeMachining = 'BladeHorizontalDouble' - Machining[1].ToolInfo.dMaxMatBladeFromTop = dMaxMatBladeHorizontalSingle - Machining[2].ToolInfo.dMaxMatBladeFromDown = dMaxMatBladeHorizontalDouble - Machining[3].bIsApplicable = false - Machining[4].bIsApplicable = false - return Machining - - -- TODO : casi con motosega da completare - -- ChainSawHorizontal (motosega) - -- ChainSawSideSingle (motosega) - -- ChainSawSideDouble (motosega) - -- ChainSawPlusBlade (motosega più lama orizzontale) - -- Mill (svuotatura) - end - - -- se non ho trovato neanche una lavorazione completa, non posso separare - if Machining.sTypeMachining == 'None' then - Strategy.Result = FeatureLib.GetStrategyResultNotApplicable( 'Split not possible') - end - - return Machining -end - ------------------------------------------------------------------------------------------------------------- function HEADCUT.Make( bAddMachining, Proc, Part, CustomParameters) - Strategy = LoadStrategyParameters( Proc, CustomParameters) + local StrategyLib = {} + StrategyLib.Config = STRATEGIES_CONFIG[CustomParameters.sStrategyId] + Strategy.sName = StrategyLib.Config.sStrategyId + Strategy.Parameters = BeamLib.LoadCustomParametersInStrategy( Proc, CustomParameters, StrategyLib.Config) + Strategy.SplitStrategy = {} + Strategy.Result = {} + Strategy.Machining = {} + Strategy.Result.sInfo = '' local bAreAllMachiningsAdded = true - local Splitting = {} - local AuxiliaryData = {} - Strategy.SplitStrategy = GetSplitStrategy( Proc, Part) + -- si setta che è taglio di coda + Strategy.bIsHeadCut = true + + -- se abilitato, faccio tagli di PRECUT a zero (come SPLIT) + if Strategy.Parameters.bExecutePreCut then + Strategy.SplitStrategy, Strategy.Result = SPLITCUT.GetStrategy( Proc, Part, Strategy.Parameters) + -- se non faccio tagli PRECUT, imposto tabella Result direttamente. Non serve verificare che riesca a rimuovere il materiale extra + if not Strategy.SplitStrategy or #Strategy.SplitStrategy == 0 then + Strategy.Result.sInfo = 'PreCut on head not possible' + end + end + + Strategy.Result.sStatus = 'Completed' + Strategy.Result.nCompletionIndex = 5 + Strategy.Result.dMRR = 1 + -- TODO di quale utensile si deve impostare la qualità qui? + Strategy.Result.nQuality = FeatureLib.GetStrategyQuality( 'SAWBLADE') + + + -- se devo applicare le lavorazioni if bAddMachining then -- forzo nome feature, potrebbe essere stata invertita con taglio di coda @@ -236,108 +64,46 @@ function HEADCUT.Make( bAddMachining, Proc, Part, CustomParameters) MakeChamfer() end - local OptionalParameters = {} - -- applico le lavorazioni - ---------------------------------------------------------------------------------- - if Strategy.SplitStrategy.sTypeMachining == 'BladeSideSingle' then - OptionalParameters = {} - OptionalParameters.nToolIndex = Strategy.SplitStrategy[1].ToolInfo.nToolIndex - OptionalParameters.dRadialStepSpan = 0 + local MachiningsToAdd = {} + local bExecutePrecutOnly = false + -- se abilitato, faccio tagli di PRECUT a zero (come SPLIT) + if Strategy.Parameters.bExecutePreCut then + if Part.dHeadOverMaterial < 10 then + bExecutePrecutOnly = true + Strategy.dOffset = 0 + else + Strategy.bIsPreCut = true + Strategy.dOffset = Part.dHeadOverMaterial + end + MachiningsToAdd = SPLITCUT.Execute( Proc, Part, Strategy) + end - -- TODO gestire lavorazione a cubetti + if not bExecutePrecutOnly then + local OptionalParameters = {} + -- si parte dal box della feature e si aggiunge il punto estremo del grezzo + -- ATTENZIONE : Proc.b3Box viene modificata dato che il tipo Box è come se fosse una tabella, ma da qui passa solo 1 volta per pezzo quindi non dovrebbero esserci problemi + local b3BoxDicing = Proc.b3Box + b3BoxDicing:Add( Part.b3Raw:getMax()) + b3BoxDicing:expand( 1000 * GEO.EPS_SMALL) + OptionalParameters.b3BoxDicing = b3BoxDicing - local EdgeToMachine = GetEdgeToMachine( Proc, -Y_AX()) - Splitting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParameters) - Splitting.sStage = 'Head' - MachiningLib.AddMachinings( Proc, Splitting, AuxiliaryData) - ---------------------------------------------------------------------------------- - elseif Strategy.SplitStrategy.sTypeMachining == 'BladeSideDouble' then - -- Taglio lato frontale - OptionalParameters = {} - OptionalParameters.nToolIndex = Strategy.SplitStrategy[1].ToolInfo.nToolIndex - OptionalParameters.dDepthToMachine = Part.dWidth / 2 + BeamData.CUT_EXTRA_MIN - OptionalParameters.dRadialStepSpan = 0 + OptionalParameters.dMaxWasteVolume = Strategy.Parameters.dMaxWasteVolume + OptionalParameters.dMaxWasteLength = Strategy.Parameters.dMaxWasteLength + OptionalParameters.bReduceBladePath = Strategy.Parameters.bReduceBladePath - -- TODO gestire lavorazione a cubetti + Strategy.Machining, _ = BladeToWaste.Make( Proc, Part, OptionalParameters) + if Strategy.Machining and #Strategy.Machining > 0 then + for i = 1, #Strategy.Machining do + local TempList = {} + TempList = Strategy.Machining[i] + table.insert( MachiningsToAdd, TempList) + end + end + end - local EdgeToMachine = GetEdgeToMachine( Proc, -Y_AX()) - Splitting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParameters) - Splitting.sStage = 'Head' - MachiningLib.AddMachinings( Proc, Splitting, AuxiliaryData) - - -- Taglio lato dietro - OptionalParameters = {} - Splitting = {} - AuxiliaryData = {} - OptionalParameters.nToolIndex = Strategy.SplitStrategy[1].ToolInfo.nToolIndex - OptionalParameters.dDepthToMachine = Part.dWidth / 2 + BeamData.CUT_EXTRA_MIN - OptionalParameters.dRadialStepSpan = 0 - - -- TODO gestire lavorazione a cubetti - - EdgeToMachine = GetEdgeToMachine( Proc, Y_AX()) - Splitting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParameters) - Splitting.sStage = 'Head' - MachiningLib.AddMachinings( Proc, Splitting, AuxiliaryData) - ---------------------------------------------------------------------------------- - elseif Strategy.SplitStrategy.sTypeMachining == 'BladeHorizontalSingle' then - OptionalParameters = {} - OptionalParameters.nToolIndex = Strategy.SplitStrategy[1].ToolInfo.nToolIndex - OptionalParameters.dDepthToMachine = Part.dHeight + BeamData.CUT_EXTRA - OptionalParameters.dRadialStepSpan = 0 - - -- TODO gestire lavorazione a cubetti - - local EdgeToMachine = GetEdgeToMachine( Proc, Z_AX()) - Splitting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParameters) - Splitting.sStage = 'Head' - MachiningLib.AddMachinings( Proc, Splitting, AuxiliaryData) - ---------------------------------------------------------------------------------- - elseif Strategy.SplitStrategy.sTypeMachining == 'BladeHorizontalDouble' then - -- Taglio lato frontale - OptionalParameters = {} - OptionalParameters.nToolIndex = Strategy.SplitStrategy[1].ToolInfo.nToolIndex - local dExtraMaxMat = ( Strategy.SplitStrategy[1].ToolInfo.dMaxMatBladeFromTop + Strategy.SplitStrategy[2].ToolInfo.dMaxMatBladeFromDown - Part.dHeight - BeamData.CUT_EXTRA_MIN) / 2 - OptionalParameters.dDepthToMachine = Strategy.SplitStrategy[1].ToolInfo.dMaxMatBladeFromTop - dExtraMaxMat - OptionalParameters.dRadialStepSpan = 0 - - -- TODO gestire lavorazione a cubetti - - local EdgeToMachine = GetEdgeToMachine( Proc, Z_AX()) - Splitting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParameters) - Splitting.sStage = 'Head' - MachiningLib.AddMachinings( Proc, Splitting, AuxiliaryData) - - -- Taglio lato dietro - OptionalParameters = {} - Splitting = {} - AuxiliaryData = {} - OptionalParameters.nToolIndex = Strategy.SplitStrategy[2].ToolInfo.nToolIndex - OptionalParameters.dDepthToMachine = Strategy.SplitStrategy[2].ToolInfo.dMaxMatBladeFromDown - dExtraMaxMat - OptionalParameters.dRadialStepSpan = 0 - - -- TODO gestire lavorazione a cubetti - - EdgeToMachine = GetEdgeToMachine( Proc, -Z_AX()) - Splitting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParameters) - Splitting.sStage = 'Head' - MachiningLib.AddMachinings( Proc, Splitting, AuxiliaryData) - ---------------------------------------------------------------------------------- - elseif Strategy.SplitStrategy.sTypeMachining == 'ChainSawHorizontal' then - ; -- TODO - ---------------------------------------------------------------------------------- - elseif Strategy.SplitStrategy.sTypeMachining == 'ChainSawSideSingle' then - ; -- TODO - ---------------------------------------------------------------------------------- - elseif Strategy.SplitStrategy.sTypeMachining == 'ChainSawSideDouble' then - ; -- TODO - ---------------------------------------------------------------------------------- - elseif Strategy.SplitStrategy.sTypeMachining == 'ChainSawPlusBlade' then - ; -- TODO - ---------------------------------------------------------------------------------- - elseif Strategy.SplitStrategy.sTypeMachining == 'Mill' then - ; -- TODO - ---------------------------------------------------------------------------------- + -- aggiungo lavorazioni trovate alla lista generale + for i = 1, #MachiningsToAdd do + MachiningLib.AddMachinings( Proc, MachiningsToAdd[i], MachiningsToAdd[i].AuxiliaryData) end return bAreAllMachiningsAdded, Strategy.Result diff --git a/Strategies/Standard/TAILCUT/TAILCUT.lua b/Strategies/Standard/TAILCUT/TAILCUT.lua index 85feb08..72dcec3 100644 --- a/Strategies/Standard/TAILCUT/TAILCUT.lua +++ b/Strategies/Standard/TAILCUT/TAILCUT.lua @@ -34,6 +34,9 @@ function TAILCUT.Make( bAddMachining, Proc, Part, CustomParameters) Strategy.Result.sInfo = '' local bAreAllMachiningsAdded = true + -- si setta che è taglio di coda + Strategy.bIsTailCut = true + -- separazione solo se esiste grezzo successivo con pezzi o scaricabile Strategy.bSplit = not( Part.bIsLastPart) or Part.dRestLength >= BeamData.dMinRaw diff --git a/StrategyLibs/SPLITCUT.lua b/StrategyLibs/SPLITCUT.lua index 2f26793..1abee58 100644 --- a/StrategyLibs/SPLITCUT.lua +++ b/StrategyLibs/SPLITCUT.lua @@ -201,13 +201,12 @@ function SPLITCUT.Execute( Proc, Part, Strategy) local OptionalParameters = {} OptionalParameters.nToolIndex = Strategy.SplitStrategy[1].ToolInfo.nToolIndex OptionalParameters.dLongitudinalOffset = Strategy.dOffset or 0 - if not Strategy.bIsPreCut then + if Strategy.bIsTailCut and not Strategy.bIsPreCut then OptionalParameters.sUserNotes = EgtIf( Strategy.bSplit, 'Split;', 'Cut;') Machining.AuxiliaryData.bIsSplitOrCut = true end - - OptionalParameters.dRadialStepSpan = 0 + OptionalParameters.dRadialStepSpan = 0 local EdgeToMachine = SPLITCUT.GetEdgeToMachine( Proc, -Y_AX()) Machining.Splitting = FaceByBlade.Make( Proc, Part, Proc.Faces[1], EdgeToMachine, OptionalParameters) @@ -223,7 +222,7 @@ function SPLITCUT.Execute( Proc, Part, Strategy) -- Taglio lato frontale OptionalParameters.dLongitudinalOffset = Strategy.dOffset or 0 OptionalParameters.dDepthToMachine = Part.dWidth / 2 + BeamData.CUT_EXTRA_MIN - if not Strategy.bIsPreCut then + if Strategy.bIsTailCut and not Strategy.bIsPreCut then OptionalParameters.sUserNotes = EgtIf( Strategy.bSplit, 'Presplit;', 'Precut;') end OptionalParameters.dRadialStepSpan = 0 @@ -240,7 +239,7 @@ function SPLITCUT.Execute( Proc, Part, Strategy) OptionalParameters.nToolIndex = Strategy.SplitStrategy[1].ToolInfo.nToolIndex OptionalParameters.dLongitudinalOffset = Strategy.dOffset or 0 OptionalParameters.dDepthToMachine = Part.dWidth / 2 + BeamData.CUT_EXTRA_MIN - if not Strategy.bIsPreCut then + if Strategy.bIsTailCut and not Strategy.bIsPreCut then OptionalParameters.sUserNotes = EgtIf( Strategy.bSplit, 'Split;', 'Cut;') Machining.AuxiliaryData.bIsSplitOrCut = true end @@ -258,7 +257,7 @@ function SPLITCUT.Execute( Proc, Part, Strategy) OptionalParameters.nToolIndex = Strategy.SplitStrategy[1].ToolInfo.nToolIndex OptionalParameters.dLongitudinalOffset = Strategy.dOffset or 0 OptionalParameters.dDepthToMachine = Part.dHeight + BeamData.CUT_EXTRA - if not Strategy.bIsPreCut then + if Strategy.bIsTailCut and not Strategy.bIsPreCut then OptionalParameters.sUserNotes = EgtIf( Strategy.bSplit, 'Split;', 'Cut;') Machining.AuxiliaryData.bIsSplitOrCut = true end @@ -278,7 +277,7 @@ function SPLITCUT.Execute( Proc, Part, Strategy) OptionalParameters.dLongitudinalOffset = Strategy.dOffset or 0 local dExtraMaxMat = ( Strategy.SplitStrategy[1].ToolInfo.dMaxMatBladeFromTop + Strategy.SplitStrategy[2].ToolInfo.dMaxMatBladeFromDown - Part.dHeight - BeamData.CUT_EXTRA_MIN) / 2 OptionalParameters.dDepthToMachine = Strategy.SplitStrategy[1].ToolInfo.dMaxMatBladeFromTop - dExtraMaxMat - if not Strategy.bIsPreCut then + if Strategy.bIsTailCut and not Strategy.bIsPreCut then OptionalParameters.sUserNotes = EgtIf( Strategy.bSplit, 'Presplit;', 'Precut;') end OptionalParameters.dRadialStepSpan = 0 @@ -295,7 +294,7 @@ function SPLITCUT.Execute( Proc, Part, Strategy) OptionalParameters.nToolIndex = Strategy.SplitStrategy[2].ToolInfo.nToolIndex OptionalParameters.dLongitudinalOffset = Strategy.dOffset or 0 OptionalParameters.dDepthToMachine = Strategy.SplitStrategy[2].ToolInfo.dMaxMatBladeFromDown - dExtraMaxMat - if not Strategy.bIsPreCut then + if Strategy.bIsTailCut and not Strategy.bIsPreCut then OptionalParameters.sUserNotes = EgtIf( Strategy.bSplit, 'Split;', 'Cut;') Machining.AuxiliaryData.bIsSplitOrCut = true end