-- ProcessVariant.lua by Egaltech s.r.l. 2023/11/08 -- Gestione calcolo Feature Custom (Variant) per Travi -- 2023/11/08 Creazione modulo. -- 2023/11/30 Calcolo elevazione velocizzato e centralizzato tramite la funzione GetFaceElevation. -- 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) local b3Solid = EgtGetBBoxGlob( EgtGetFirstNameInGroup( nPartId, 'Box') or GDB_ID.NULL, GDB_BB.STANDARD) -- 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, vFace[1], b3Solid) 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 local sUserNotes = EgtGetMachiningParam( MCH_MP.USERNOTES) or '' sUserNotes = EgtSetValInNotes( sUserNotes, 'MaxElev', EgtNumToString( dMaxDepth, 1)) EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- 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