From 7fcf169b6b4c8e06881ef9385cf09f9e8287861c Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 8 Nov 2023 17:46:20 +0100 Subject: [PATCH] DataBeam 2.5k3 : - aggiunta gestione features Variant (per ora solo con lavorazioni di tipo Pocket). --- LuaLibs/BeamExec.lua | 12 ++- LuaLibs/ProcessVariant.lua | 168 +++++++++++++++++++++++++++++++++++++ Version.lua | 2 +- 3 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 LuaLibs/ProcessVariant.lua diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 1ffe804..6566398 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -1,4 +1,4 @@ --- BeamExec.lua by Egaltech s.r.l. 2023/03/31 +-- BeamExec.lua by Egaltech s.r.l. 2023/11/08 -- Libreria esecuzione lavorazioni per Travi -- 2019/07/11 Aggiunta gestione stato rotazione di feature per TS3. -- 2019/09/04 Corretto controllo feature di testa e coda con sovramateriale di testa elevato. @@ -50,6 +50,7 @@ -- 2022/09/26 Funzione IsFeatureCuttingEntireSection spostata in BeamLib -- 2022/09/26 In ClassifyTopology aggiunto passaggio del parametro nRawId -- 2023/10/24 Aggiunta scrittura parametro BARLEN nelle info del mach group +-- 2023/11/08 Aggiunta gestione processi Variant. -- Tabella per definizione modulo local BeamExec = {} @@ -104,6 +105,7 @@ _G.package.loaded.ProcessTyroleanDovetail = nil _G.package.loaded.ProcessDovetail = nil _G.package.loaded.ProcessFreeContour = nil _G.package.loaded.ProcessDecor = nil +_G.package.loaded.ProcessVariant = nil local ML = require( 'MachiningLib') local BL = require( 'BeamLib') local Topology = require( 'FeatureTopology') @@ -142,6 +144,7 @@ local TyroleanDovetail = require( 'ProcessTyroleanDovetail') local Dovetail = require( 'ProcessDovetail') local FreeContour = require( 'ProcessFreeContour') local Decor = require( 'ProcessDecor') +local Variant = require( 'ProcessVariant') EgtOutLog( ' BeamExec started', 1) EgtMdbSetGeneralParam( MCH_GP.MAXDEPTHSAFE, BD.COLL_SIC) @@ -1103,6 +1106,9 @@ local function ClassifyFeatures( vProc, b3Raw, Stats) -- se decorazione elseif Decor.Identify( Proc) then bOk, bDown = Decor.Classify( Proc) + -- se Variant + elseif Variant.Identify( Proc) then + bOk, bDown = Variant.Classify( Proc, b3Raw) end -- assegno risultato if bOk then @@ -1313,6 +1319,10 @@ local function AddFeatureMachining( Proc, nPhase, nRawId, nPartId, dCurrOvmH, bN elseif Decor.Identify( Proc) then -- esecuzione decorazione bOk, sErr = Decor.Make( Proc, nPhase, nRawId, nPartId) + -- se Variant + elseif Variant.Identify( Proc) then + -- esecuzione variante custom + bOk, sErr = Variant.Make( Proc, nPhase, nRawId, nPartId) -- altrimenti feature sconosciuta else sErr = 'Error on process ' .. tostring( Proc.Id) .. ' unknown type (' .. tonumber( Proc.Grp) .. '-' .. tonumber( Proc.Prc) .. ')' diff --git a/LuaLibs/ProcessVariant.lua b/LuaLibs/ProcessVariant.lua new file mode 100644 index 0000000..0557758 --- /dev/null +++ b/LuaLibs/ProcessVariant.lua @@ -0,0 +1,168 @@ +-- ProcessVariant.lua by Egaltech s.r.l. 2023/11/08 +-- Gestione calcolo Feature Custom (Variant) per Travi +-- 2023/11/08 Creazione modulo. + +-- Tabella per definizione modulo +local ProcessVariant = {} + +-- Include +require( 'EgtBase') +local BL = require( 'BeamLib') + +EgtOutLog( ' ProcessVariant started', 1) + +-- Dati +local BD = require( 'BeamData') +local ML = require( 'MachiningLib') + +--------------------------------------------------------------------- +-- Riconoscimento della feature +function ProcessVariant.Identify( Proc) + return (( Proc.Grp == 0 or Proc.Grp == 1 or Proc.Grp == 2 or Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 900) +end + +--------------------------------------------------------------------- +-- Classificazione della feature: decide se la feature è in una posizione lavorabile +local function ClassifyPocket( Proc, b3Raw) + -- recupero gli indici delle facce da lavorare + local vFace = EgtGetInfo( Proc.Id, 'Faces', 'vi') + if not vFace or #vFace == 0 then + local sErr = 'Error : missing Faces for Pocketing' + EgtOutLog( sErr) + return false + end + -- recupero le normali di tutte le facce e verifico siano uguali + local vtN + for i = 1, #vFace do + local vtNf = EgtSurfTmFacetNormVersor( Proc.Id, vFace[i], GDB_ID.ROOT) + if not vtN then + vtN = vtNf + else + if not AreSameVectorApprox( vtN, vtNf) then + local sErr = 'Error : Faces for Pocketing with different orientation' + EgtOutLog( sErr) + return false + end + end + end + local bDown = ( vtN:getZ() < - 0.5) + -- se da sotto e presente rinvio angolare verifico se c'è opportuna lavorazione + if bDown and BD.ANG_TRASM then + local dMaxDiam = EgtGetInfo( Proc.Id, 'MaxDiam', 'd') + if ML.FindPocketing( 'Pocket_AT', dMaxDiam) then + bDown = false + end + end + return true, bDown, false +end + +--------------------------------------------------------------------- +function ProcessVariant.Classify( Proc, b3Raw) + -- recupero il codice identificativo e il tipo di lavorazione + local sCode = EgtGetInfo( Proc.Id, 'DES') + local sType = EgtGetInfo( Proc.Id, 'Type') + -- gestione in base al tipo + if sType == 'Pocket' then + return ClassifyPocket( Proc, b3Raw) + else + return false + end +end + +--------------------------------------------------------------------- +-- Applicazione della lavorazione +local function MakePocket( Proc, nRawId, b3Raw, nPartId) + -- recupero gli indici delle facce da lavorare + local vFace = EgtGetInfo( Proc.Id, 'Faces', 'vi') + if not vFace or #vFace == 0 then + local sErr = 'Error : missing Faces for Pocketing' + EgtOutLog( sErr) + return false + end + -- recupero i dati delle facce (le normali sono identiche) + local dTotDepth = 0 + local vDepth = {} + for i = 1, #vFace do + vDepth[i] = BL.GetFaceElevation( Proc.Id, vFace[1], nPartId) + dTotDepth = max( dTotDepth, vDepth[i]) + end + local vtN = EgtSurfTmFacetNormVersor( Proc.Id, vFace[1], GDB_ID.ROOT) + -- recupero eventuale massimo diametro impostato + local dMaxDiam = EgtGetInfo( Proc.Id, 'MaxDiam', 'd') + -- abilitazione lavorazione da sotto + local bMillUp = ( BD.DOWN_HEAD and vtN:getZ() > -0.259) + local bMillDown = ( BD.DOWN_HEAD and vtN:getZ() < 0.174) + local bMillAngTrasm = ( BD.ANG_TRASM and vtN:getZ() < -0.5) + -- recupero la lavorazione + local sPockType = EgtIf( not bMillAngTrasm, 'Pocket', 'Pocket_AT') + local sPocketing = ML.FindPocketing( sPockType, dMaxDiam, dTotDepth) + if not sPocketing then + sPocketing = ML.FindPocketing( sPockType, dMaxDiam, dTotDepth / 2) + if not sPocketing then + local sErr = 'Error : pocketing not found in library' + EgtOutLog( sErr) + return false, sErr + end + end + -- recupero i dati dell'utensile + local dMillDiam = 20 + local dMaxDepth = 0 + if EgtMdbSetCurrMachining( sPocketing) then + local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) + if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then + dMillDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dMillDiam + dMaxDepth = EgtTdbGetCurrToolMaxDepth() or dMaxDepth + end + end + -- se elevazione superiore a massimo affondamento della fresa, segnalo + local sWarn + if dTotDepth > dMaxDepth + 10 * GEO.EPS_SMALL then + sWarn = 'Warning : elevation bigger than max tool depth' + EgtOutLog( sWarn) + end + -- lavoro ogni faccia + for i = 1, #vFace do + -- inserisco la lavorazione di svuotatura + local sName = 'Pock_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. '_' .. tostring( i) + local nMchFId = EgtAddMachining( sName, sPocketing) + if not nMchFId then + local sErr = 'Error adding machining ' .. sName .. '-' .. sPocketing + EgtOutLog( sErr) + return false, sErr + end + -- aggiungo geometria + EgtSetMachiningGeometry( {{ Proc.Id, vFace[i]}}) + -- imposto posizione braccio porta testa + if vtN:getY() <= 0 then + EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YM) + else + EgtSetMachiningParam( MCH_MP.SCC, MCH_SCC.ADIR_YP) + end + EgtSetMachiningParam( MCH_MP.DEPTH, min( 0, dMaxDepth - vDepth[i])) + -- imposto elevazione + EgtSetMachiningParam( MCH_MP.USERNOTES, 'MaxElev=' .. EgtNumToString( dMaxDepth, 1) .. ';') + -- eseguo + if not ML.ApplyMachining( true, false) then + local _, sErr = EgtGetLastMachMgrError() + EgtSetOperationMode( nMchFId, false) + return false, sErr + end + end + return true, sWarn +end + +--------------------------------------------------------------------- +function ProcessVariant.Make( Proc, nRawId, b3Raw, nPartId) + -- recupero il codice identificativo e il tipo di lavorazione + local sCode = EgtGetInfo( Proc.Id, 'DES') + local sType = EgtGetInfo( Proc.Id, 'Type') + -- gestione in base al tipo + if sType == 'Pocket' then + return MakePocket( Proc, nRawId, b3Raw, nPartId) + else + return false, 'Variant Type non recognized for machining' + end +end + +--------------------------------------------------------------------- +return ProcessVariant diff --git a/Version.lua b/Version.lua index 19282df..c37c0db 100644 --- a/Version.lua +++ b/Version.lua @@ -2,5 +2,5 @@ -- Gestione della versione di Beam NAME = 'Beam' -VERSION = '2.5k2' +VERSION = '2.5k3' MIN_EXE = '2.5c1'