-- WProcessDtMortise.lua by Egaltech s.r.l. 2021/04/20 -- Gestione calcolo mortase a coda di rondine per Pareti -- Tabella per definizione modulo local WPDM= {} -- Include require( 'EgtBase') local WL = require( 'WallLib') EgtOutLog( ' WProcessDtMortise started', 1) -- Dati local WD = require( 'WallData') local WM = require( 'WMachiningLib') -- settaggi interni ( poi andrà utilizzato parametro ACTIVE_AS proveniente da parametri utente di TechnoEssetre) local bMakeAntiSplitPath = true local bMakeAsByArc = true --------------------------------------------------------------------- -- Riconoscimento della feature function WPDM.Identify( Proc) return ( (( Proc.Grp == 3 or Proc.Grp == 4) and Proc.Prc == 55)) end --------------------------------------------------------------------- -- Classificazione della feature function WPDM.Classify( Proc, b3Raw) -- recupero i dati della curva di contorno della faccia di fondo local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') if not AuxId then return false end AuxId = AuxId + Proc.Id local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) -- verifico se la mortasa è lavorabile return ( vtExtr:getZ() > WD.NZ_MINA) end ---------------------------------------------------------------------- -- Classificazione del flip della feature per nesting -- return nFlip0, nFlip1 function WPDM.FlipClassify( Proc) -- recupero i dati della curva di contorno della faccia di fondo local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') if not AuxId then return false end AuxId = AuxId + Proc.Id local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) -- verifico se la mortasa è lavorabile nFlip0 = EgtIf( vtExtr:getZ() > WD.NZ_MINA, 100, 0) nFlip1 = EgtIf( - vtExtr:getZ() > WD.NZ_MINA, 100, 0) return nFlip0, nFlip1 end --------------------------------------------------------------------- -- Applicazione della lavorazione function WPDM.Make( Proc, nRawId, b3Raw) -- recupero e verifico l'entità curva local AuxId = EgtGetInfo( Proc.Id, 'AUXID', 'i') if AuxId then AuxId = AuxId + Proc.Id end if not AuxId or ( EgtGetType( AuxId) & GDB_FY.GEO_CURVE) == 0 then local sErr = 'Missing profile geometry : Error on DtMortise ' .. tostring( Proc.Id) EgtOutLog( sErr) return false, sErr end -- recupero i dati della curva local vtExtr = EgtCurveExtrusion( AuxId, GDB_RT.GLOB) local ptBC = EgtGP( AuxId, GDB_RT.GLOB) -- verifico che la mortasa non sia orientata verso il basso (-5 deg) o che ci sia una testa da sotto local bFaceDown = ( vtExtr:getZ() < - 0.1) if bFaceDown then local sErr = 'Machining from bottom impossible : Error on DtMortise ' .. tostring( Proc.Id) EgtOutLog( sErr) return false, sErr end -- determino l'altezza della mortasa (0=faccia di fondo) local rfDtMrt = Frame3d( ptBC, vtExtr) local b3DtMrt = EgtGetBBoxRef( Proc.Id, GDB_BB.STANDARD, rfDtMrt) local dAltMort = b3DtMrt:getDimZ() -- verifico se di tipo pocket local bPocket = ( EgtGetInfo( Proc.Id, 'P05', 'i') == 1) if bPocket then bMakeAntiSplitPath = false end -- recupero il raggio minimo della mortasa local dMinRad = 1000 local nSt, nEnd = EgtCurveDomain( AuxId) for i = nSt, nEnd - 1 do local dRad = EgtCurveCompoRadius( AuxId, i) if dRad > 0 and dRad < dMinRad then dMinRad = dRad end end -- recupero la lavorazione local sMillType = 'DtMortise' -- recupero la lavorazione : prima ricerca per sola tipologia local sMilling = WM.FindMilling( sMillType) if not sMilling then local sErr = 'Milling not found in library : Error on DtMortise ' .. tostring( Proc.Id) EgtOutLog( sErr) return false, sErr end -- recupero la lavorazione : seconda ricerca con tipologia e diametro massimo sMilling = WM.FindMilling( sMillType, nil, nil, nil, 2 * dMinRad) if not sMilling then local sErr = 'Radius too small : Error on DtMortise ' .. tostring( Proc.Id) EgtOutLog( sErr) return false, sErr end -- recupero il diametro dell'utensile e l'angolo di spoglia local dToolDiam = 100 local dMaxMat = 30 local dSideAng = 0 local bCW = true if EgtMdbSetCurrMachining( sMilling) then local sTuuid = EgtMdbGetCurrMachiningParam( MCH_MP.TUUID) if EgtTdbSetCurrTool( EgtTdbGetToolFromUUID( sTuuid) or '') then dToolDiam = EgtTdbGetCurrToolParam( MCH_TP.DIAM) or dToolDiam dToolDiam = max( dToolDiam, 10) dMaxMat = EgtTdbGetCurrToolParam( MCH_TP.MAXMAT) or dMaxMat dSideAng = EgtTdbGetCurrToolParam( MCH_TP.SIDEANG) or dSideAng local dSpeed = EgtMdbGetCurrMachiningParam( MCH_MP.SPEED) or 0 bCW = ( dSpeed >= 0) end end -- verifico che la profondità non superi il massimo materiale dell'utensile if dAltMort > dMaxMat + 10 * GEO.EPS_SMALL then local sErr = 'Error : DtMortise Depth bigger than Tool Cutting edge' EgtOutLog( sErr) return false, sErr end -- se con tasca, la lavoro if bPocket then -- recupero il contorno della tasca (seconda curva ausiliaria) local sVal = EgtGetInfo( Proc.Id, 'AUXID') local vsAuxId = EgtSplitString( sVal) local Aux2Id if vsAuxId and #vsAuxId >=2 then Aux2Id = tonumber( vsAuxId[2]) end if Aux2Id then Aux2Id = Aux2Id + Proc.Id end if not Aux2Id or ( EgtGetType( Aux2Id) & GDB_FY.GEO_CURVE) == 0 then local sErr = 'Missing pocket geometry : Error on DtMortise ' .. tostring( Proc.Id) EgtOutLog( sErr) return false, sErr end -- recupero la lavorazione local sPocketing if Proc.Prc ~= 53 then sPocketing = WM.FindPocketing( 'Mortise', dToolDiam) end if not sPocketing then sPocketing = WM.FindPocketing( 'Pocket', dToolDiam) end if not sPocketing then local sErr = 'Error : Mortise or Pocket not found in library' EgtOutLog( sErr) return false, sErr end -- inserisco la lavorazione di svuotatura local sName = 'DtMtPck_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) 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( {{ Aux2Id, -1}}) -- dichiaro non si generano sfridi per VMill local sUserNotes = 'MaxElev='.. EgtNumToString( dMaxMat - 0.1, 1) .. '; VMRS=0;' EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- eseguo if not EgtApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() EgtSetOperationMode( nMchFId, false) return false, sErr end end -- verifico se necessarie più passate (distanza all'imbocco ortogonale all'asse) local vtDiff = EgtEP( AuxId, GDB_RT.GLOB) - EgtSP( AuxId, GDB_RT.GLOB) local vtAx = EgtEV( AuxId, GDB_RT.GLOB) - EgtSV( AuxId, GDB_RT.GLOB) vtAx:normalize() local vtOrtDiff = vtDiff - vtDiff * vtAx * vtAx local dDist = vtOrtDiff:len() -- calcolo le passate local nPass = ceil( dDist / ( 1.9 * dToolDiam)) local dStep = ( dDist - 0.95 * dToolDiam) / ( 2 * nPass) for i = nPass, 1, -1 do -- inserisco la lavorazione di contornatura local sNameF = 'DtMt_' .. ( EgtGetName( Proc.Id) or tostring( Proc.Id)) .. '_' .. tostring( nPass) local nMchFId = EgtAddMachining( sNameF, sMilling) if not nMchFId then local sErr = 'Error adding machining ' .. sNameF .. '-' .. sMilling EgtOutLog( sErr) return false, sErr end -- aggiungo geometria EgtSetMachiningGeometry( {{ AuxId, -1}}) -- imposto offset local dOffs = ( i - 1) * dStep EgtSetMachiningParam( MCH_MP.OFFSR, dOffs) -- sistemo il lato e la direzione di lavoro EgtSetMachiningParam( MCH_MP.WORKSIDE, EgtIf( bCW, MCH_MILL_WS.LEFT, MCH_MILL_WS.RIGHT)) EgtSetMachiningParam( MCH_MP.INVERT, EgtIf( bCW, false, true)) -- dichiaro non si generano sfridi per VMill local sUserNotes = 'MaxElev='.. EgtNumToString( dMaxMat - 0.1, 1) .. '; VMRS=0;' EgtSetMachiningParam( MCH_MP.USERNOTES, sUserNotes) -- eseguo if not EgtApplyMachining( true, false) then local _, sErr = EgtGetLastMachMgrError() EgtSetOperationMode( nMchFId, false) return false, sErr end end return true end --------------------------------------------------------------------- return WPDM