From 90513d2ca7668513aab51bf13502e1337360d824 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Fri, 29 Jul 2022 18:50:39 +0200 Subject: [PATCH] Feature/MortiseCornerFinishing: aggiunto check dimensioni tasca vs utensile corretta direzione attacco utensile per mortasa frontale --- LuaLibs/ProcessMortise.lua | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/LuaLibs/ProcessMortise.lua b/LuaLibs/ProcessMortise.lua index f539e6c..ca8c369 100644 --- a/LuaLibs/ProcessMortise.lua +++ b/LuaLibs/ProcessMortise.lua @@ -3,6 +3,7 @@ -- 2021/07/20 Aggiunta gestione rinvio angolare su FAST. -- 2021/12/01 Se frontale aggiungo taglio con Grp e Proc di vero taglio (per aggiornare ingombro di testa /coda). -- 2022/07/26 Aggiunta gestione del parametro P04=1 per la pulizia degli angoli con mortasatrice (sega a catena) specifica +-- 2022/07/29 Nella pulitura angoli aggiunto il check dimensioni tasca vs utensile. Corretta direzione utensile per mortasa frontale. -- Tabella per definizione modulo local ProcessMortise = {} @@ -127,9 +128,12 @@ end --------------------------------------------------------------------- -- Pulizia angoli nel caso sia settato il parametro P04=1 -local function CleanCorners( Proc, dMorH, vtN, bOpenBtm) - -- verifico se è attiva la pulizia - local bCleanCorners = ( EgtGetInfo( Proc.Id, 'P04', 'i') == 1 and Proc.Prc ~= 51) +local function CleanCorners( Proc, dMorH, vtN, bOpenBtm, AuxId) + -- verifico se è attiva la pulizia e se l'orientamento della feature è adeguato + local bCleanCorners = ( EgtGetInfo( Proc.Id, 'P04', 'i') == 1 and + ( AreSameOrOppositeVectorApprox( vtN, X_AX()) or + AreSameOrOppositeVectorApprox( vtN, Y_AX()) or + AreSameOrOppositeVectorApprox( vtN, Z_AX()))) -- cerco la lavorazione adatta local sMortisingCleanCorners = ML.FindSawing( 'Mortising') if bCleanCorners and sMortisingCleanCorners then @@ -138,7 +142,7 @@ local function CleanCorners( Proc, dMorH, vtN, bOpenBtm) local dMaxDepth = 200 -- se non trova la lavorazione non faccio nulla if not sMortisingCleanCorners then - local sWarn = 'Warning: mortising tool not found, square tenon finishing skipped' + local sWarn = 'Warning: mortising tool not found, corner cleaning skipped' EgtOutLog( sWarn) return true, sWarn else @@ -154,13 +158,31 @@ local function CleanCorners( Proc, dMorH, vtN, bOpenBtm) -- al momento se l'utensile non arriva salto la lavorazione local dFullMorH = EgtIf( bOpenBtm, dMorH * 2, dMorH) if dFullMorH > dMaxDepth + 10 * GEO.EPS_SMALL then - local sErr = 'Error in Mortise : elevation (' .. EgtNumToString( dFullMorH, 1) .. ') bigger than max tool depth (' .. EgtNumToString( dMaxDepth, 1) .. ')' + local sErr = 'Error in Mortise - corner cleaning : elevation (' .. EgtNumToString( dFullMorH, 1) .. ') bigger than max tool depth (' .. EgtNumToString( dMaxDepth, 1) .. ')' + EgtOutLog( sErr) + return false, sErr + end + -- verifico se la tasca ha dimensioni sufficienti per l'utensile + local nSurf = EgtSurfTmByFlatContour( EgtGetParent( AuxId), AuxId, 0.05) + local frMor, dMortiseWidth, dMortiseThick = EgtSurfTmFacetMinAreaRectangle( nSurf, 0, GDB_ID.ROOT) + if abs( frMor:getVersX() * X_AX()) < abs( frMor:getVersY() * X_AX()) then + dMortiseWidth, dMortiseThick = dMortiseThick, dMortiseWidth + end + EgtErase( nFlat) + if dSawWidth >= dMortiseWidth + 10 * GEO.EPS_SMALL or dSawThick >= dMortiseThick + 10 * GEO.EPS_SMALL then + local sErr = 'Error in Mortise - corner cleaning: pocket too small' EgtOutLog( sErr) return false, sErr end -- cerco le due facce migliori da lavorare - local nWorkFaceInd, _, _ = BL.FindFaceBestOrientedAsAxis( Proc, vtN ^ X_AX()) - local nWorkFaceInd2, _, _ = BL.FindFaceBestOrientedAsAxis( Proc, vtN ^ X_AX(), nWorkFaceInd) + local nWorkFaceInd, nWorkFaceInd2 + if AreSameOrOppositeVectorApprox( vtN, X_AX()) then + nWorkFaceInd, _, _ = BL.FindFaceBestOrientedAsAxis( Proc, vtN ^ Y_AX()) + nWorkFaceInd2, _, _ = BL.FindFaceBestOrientedAsAxis( Proc, vtN ^ Y_AX(), nWorkFaceInd) + else + nWorkFaceInd, _, _ = BL.FindFaceBestOrientedAsAxis( Proc, vtN ^ X_AX()) + nWorkFaceInd2, _, _ = BL.FindFaceBestOrientedAsAxis( Proc, vtN ^ X_AX(), nWorkFaceInd) + end -- lavoro la prima faccia local bOk1, sErr = AddCleanCornersMachining( Proc.Id, sMortisingCleanCorners, nWorkFaceInd, vtN) -- lavoro la seconda faccia @@ -428,7 +450,7 @@ function ProcessMortise.Make( Proc, nPhase, nRawId, nPartId, dCurrOvmH) return false, sErr end -- verifico se necessaria la pulizia degli angoli ( tenone ad angoli non raggiati) e applico nel caso - local _, sWarn2 = CleanCorners( Proc, dMorH, vtN, bOpenBtm) + local _, sWarn2 = CleanCorners( Proc, dMorH, vtN, bOpenBtm, AuxId) if sWarn2 then if not sWarn then sWarn = '' end sWarn = EgtIf( #sWarn > 0, sWarn .. '\n' .. sWarn2, sWarn2)