From 1c25ca766770368bfed33c9ccf5722ed94fe78c0 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Wed, 27 Sep 2023 11:54:33 +0200 Subject: [PATCH] - In LapJoint -> MakeMoreFaces e Classify refactoring della gestione scanalatura chiusa - in FeatureTopology modificata GetFacesParallelToPart per tunnel, pocket e groove 3 lati --- LuaLibs/FeatureTopology.lua | 3 +- LuaLibs/ProcessLapJoint.lua | 103 +++++------------------------------- 2 files changed, 16 insertions(+), 90 deletions(-) diff --git a/LuaLibs/FeatureTopology.lua b/LuaLibs/FeatureTopology.lua index 0adf516..2213c6b 100644 --- a/LuaLibs/FeatureTopology.lua +++ b/LuaLibs/FeatureTopology.lua @@ -1,6 +1,7 @@ -- FeatureTopology.lua by Egaltech s.r.l. 2023/09/12 -- Libreria per classificazione topologica feature travi -- 2023/09/26 Aggiunte topologie Strip e Cut. +-- 2023/09/27 Modificata GetFacesParallelToPart per tunnel, pocket e groove 3 lati -- Tabella per definizione modulo local FeatureTopology = {} @@ -109,7 +110,7 @@ local function GetFacesParallelToPart( Proc, sFamily) local vFacesParallelToPart = {} for i = 0, Proc.Fct - 1 do local vtN = EgtSurfTmFacetNormVersor( Proc.Id, i, GDB_ID.ROOT) - if sFamily == 'Bevel' or sFamily == 'DoubleBevel' or sFamily == 'Strip' or sFamily == 'Tunnel' or ( sFamily == 'Groove' and Proc.IsThrough == true) then + if sFamily == 'Bevel' or sFamily == 'DoubleBevel' or sFamily == 'Strip' or sFamily == 'Tunnel' or sFamily == 'Pocket' or ( sFamily == 'Groove' and Proc.IsThrough == true) then local vTriangularFaces = GetTriangularFaces( Proc) local bIsTriangularFace = false -- verifico se la faccia è triangolare diff --git a/LuaLibs/ProcessLapJoint.lua b/LuaLibs/ProcessLapJoint.lua index 2e3d22e..f016056 100644 --- a/LuaLibs/ProcessLapJoint.lua +++ b/LuaLibs/ProcessLapJoint.lua @@ -75,6 +75,7 @@ -- 2023/08/10 Modificata scelta SCC per tasche in Y+/- in coda o quasi (anche per relativi antischeggia con lama). -- 2023/09/12 In MakeByPockets gestito correttamente il ritorno nil di GetUShapeWidth. -- 2023/09/26 Modificata chiamata a GetFaceWithMostAdj. +-- 2023/09/27 In MakeMoreFaces e Classify refactoring della gestione scanalatura chiusa. -- Tabella per definizione modulo local ProcessLapJoint = {} @@ -87,6 +88,7 @@ local Cut = require( 'ProcessCut') local DoubleCut = require( 'ProcessDoubleCut') local LongCut = require( 'ProcessLongCut') local Long2Cut = require( 'ProcessLongDoubleCut') +local Topology = require( 'FeatureTopology') EgtOutLog( ' ProcessLapJoint started', 1) @@ -635,6 +637,7 @@ function ProcessLapJoint.IsHeadFeature( Proc, b3Raw, dCurrOvmH) end end -- deve avere la normale principale diretta verso la testa + Topology.Classify( Proc, b3Raw) local nFacInd, dElev = BL.GetFaceWithMostAdj( Proc, nPartId) local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd, GDB_ID.ROOT) if vtN and vtN:getX() < 0.499 then @@ -689,6 +692,7 @@ function ProcessLapJoint.IsTailFeature( Proc, b3Raw) end end -- deve avere la normale principale diretta verso la coda (oppure tunnel) + Topology.Classify( Proc, b3Raw) local nFacInd, dElev, nFacInd2, dElev2 = BL.GetFaceWithMostAdj( Proc, nPartId) local ptC, vtN = EgtSurfTmFacetCenter( Proc.Id, nFacInd, GDB_ID.ROOT) if vtN and vtN:getZ() < BD.NZ_MINA and nFacInd2 then @@ -753,52 +757,11 @@ function ProcessLapJoint.Classify( Proc, b3Raw) return true, false end end - -- se è una feature scanalatura (con 5 facce) e non è stata riconosciuta come fessura, eseguo altre verifiche - if Proc.Prc == 16 and Proc.Fct == 5 and not bClosedOrthoFaces then - -- recupero gruppo per geometria addizionale - local nAddGrpId = BL.GetAddGroup( nPartId) - if not nAddGrpId then - return false - end - -- dalla copia della superfice, ciclo eliminando una faccia per volta per verificare se trova fessura - for i = 1, Proc.Fct do - local nNewProc = {} - nNewProc.Id = EgtCopyGlob( Proc.Id, nAddGrpId) or GDB_ID.NULL - nNewProc.Topology = Proc.Topology - nNewProc.TopologyLongName = Proc.TopologyLongName - nNewProc.AllRightAngles = Proc.AllRightAngles - nNewProc.IsThrough = Proc.IsThrough - nNewProc.IsParallel = Proc.IsParallel - nNewProc.Fct = Proc.Fct - -- elimino una faccia - nDeletedFace = i - 1 - if EgtSurfTmRemoveFacet( nNewProc.Id, nDeletedFace) then - -- recupero la faccia con il maggior numero di adiacenze e l'elevazione relativa - nFacInd, dElev, nFacInd2, dElev2 = BL.GetFaceWithMostAdj( nNewProc, nPartId) - if not nFacInd or nFacInd < 0 then - if nFacInd == -1 then - bClosedOrthoFaces = nFacInd2 - EgtErase( nNewProc.Id) - break - else - EgtErase( nNewProc.Id) - return false - end - end - -- altrimenti esco - else - EgtErase( nNewProc.Id) - break - end - end - -- se riconosciuta fessura ricalcolo l'elevazione dalla faccia di fondo - if bClosedOrthoFaces then - nFacInd = nDeletedFace - -- rendo nulla la faccia opzionale perchè si tratta di una fessura - nFacInd2 = nil - dElev = BL.GetFaceElevation( Proc.Id, nFacInd) - bClosedOrthoFaces = false -- non lo setto come tunnel - end + -- se scanalatura chiusa lavoro la faccia di fondo + if Proc.Topology == 'Pocket' and ( Proc.IsParallel or Proc.AllRightAngles) and not bClosedOrthoFaces then + nFacInd = Topology.GetFacesWithGivenAdjacencyNumber( Proc, 4)[1] + nFacInd2 = nil + dElev = Proc.Face[ nFacInd + 1].Elevation end -- se facce formano un tunnel e sono ortogonali if bClosedOrthoFaces then @@ -4520,49 +4483,11 @@ local function MakeMoreFaces( Proc, nPhase, nRawId, nPartId, dOvmHead, bSinglePa return false, sErr end end - -- se è una feature scanalatura (con 5 facce) e non è stata riconosciuta come fessura, eseguo altre verifiche - if Proc.Prc == 16 and Proc.Fct == 5 and not bClosedOrthoFaces then - -- dalla copia della superfice, ciclo eliminando una faccia per volta per verificare se trova fessura - for i = 1, Proc.Fct do - local nNewProc = {} - nNewProc.Id = EgtCopyGlob( Proc.Id, nAddGrpId) or GDB_ID.NULL - nNewProc.Topology = Proc.Topology - nNewProc.TopologyLongName = Proc.TopologyLongName - nNewProc.AllRightAngles = Proc.AllRightAngles - nNewProc.IsThrough = Proc.IsThrough - nNewProc.IsParallel = Proc.IsParallel - nNewProc.Fct = Proc.Fct - -- elimino una faccia - nBottomFace = i - 1 - if EgtSurfTmRemoveFacet( nNewProc.Id, nBottomFace) then - -- recupero la faccia con il maggior numero di adiacenze e l'elevazione relativa - nFacInd, dFacElev, nFacInd2, dFacElev2 = BL.GetFaceWithMostAdj( nNewProc, nPartId) - if not nFacInd or nFacInd < 0 then - if nFacInd == -1 then - bClosedOrthoFaces = nFacInd2 - EgtErase( nNewProc.Id) - break - else - EgtErase( nNewProc.Id) - local sErr = 'Error : MakeMoreFaces could not find reference face' - EgtOutLog( sErr) - return false, sErr - end - end - -- altrimenti esco - else - EgtErase( nNewProc.Id) - break - end - end - -- se riconosciuta fessura ricalcolo l'elevazione dalla faccia di fondo - if bClosedOrthoFaces then - nFacInd = nBottomFace - -- rendo nulla la faccia opzionale perchè si tratta di una fessura - nFacInd2 = nil - dFacElev = BL.GetFaceElevation( Proc.Id, nFacInd) - bClosedOrthoFaces = false -- non setto come tunnel - end + -- se scanalatura chiusa lavoro la faccia di fondo + if Proc.Topology == 'Pocket' and ( Proc.IsParallel or Proc.AllRightAngles) and not bClosedOrthoFaces then + nFacInd = Topology.GetFacesWithGivenAdjacencyNumber( Proc, 4)[1] + nFacInd2 = nil + dElev = Proc.Face[ nFacInd + 1].Elevation end -- se proviene da divisione in parti lungo X ed è un tunnel non è fattibile if not bSinglePart and bClosedOrthoFaces then