From 764c80824acfbcde06dd7c728d91bfd42a5cf0e0 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Mon, 11 Dec 2023 11:27:54 +0100 Subject: [PATCH] modifiche a WallExec, WallLib, FeatureTopology per allineamento Topology con Beam --- LuaLibs/WFeatureTopology.lua | 28 +++++++++++++++++++++++----- LuaLibs/WallExec.lua | 8 +++++--- LuaLibs/WallLib.lua | 10 +++++++++- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/LuaLibs/WFeatureTopology.lua b/LuaLibs/WFeatureTopology.lua index 191c868..033756c 100644 --- a/LuaLibs/WFeatureTopology.lua +++ b/LuaLibs/WFeatureTopology.lua @@ -1,5 +1,6 @@ -- WFeatureTopology.lua by Egaltech s.r.l. 2023/06/23 -- Libreria per classificazione topologica feature pareti +-- 2023/12/11 Modifiche varie per allineamento con Beam. -- Tabella per definizione modulo local WFeatureTopology = {} @@ -104,11 +105,11 @@ end --------------------------------------------------------------------- -- restituisce un vettore contenente gli indici delle facce di Proc parallele ad una delle direzioni principali; il check varia in base alla famiglia topologica -local function GetFacesParallelToPart( Proc, sFamily) +local function GetFacesParallelToPart( Proc, sFamily, bIsThrough) local vFacesParallelToPart = {} for i = 0, Proc.Fct - 1 do local vtN = EgtSurfTmFacetNormVersor( Proc.Id, i, GDB_ID.ROOT) - if sFamily == 'Bevel' or sFamily == 'DoubleBevel' then + if sFamily == 'Rabbet' or sFamily == 'Bevel' or sFamily == 'DoubleBevel' or sFamily == 'Strip' or sFamily == 'Tunnel' or ( sFamily == 'Groove' and bIsThrough) then local vTriangularFaces = GetTriangularFaces( Proc) local bIsTriangularFace = false -- verifico se la faccia è triangolare @@ -158,7 +159,13 @@ end --------------------------------------------------------------------- -- riconosce se Proc è una delle topologie standard e, in caso positivo, ne scrive le caratteristiche in campi specifici della Proc stessa restituendo true -function WFeatureTopology.Classify( Proc) +function WFeatureTopology.Classify( Proc, b3Raw) + + if not Proc.AffectedFaces then Proc.AffectedFaces = WL.GetProcessAffectedFaces( Proc) end + if not Proc.Box or Proc.Box:isEmpty() then + return false + end + local bRecognized = false local sFamily local bIsThrough @@ -172,23 +179,31 @@ function WFeatureTopology.Classify( Proc) bAllAnglesConcave, bAllRightAngles = AreAllAnglesConcaveOrRight( Proc) local vTriangularFaces = GetTriangularFaces( Proc) local bIsAnyDimensionLongAsPart = IsAnyDimensionLongAsPart( Proc) + local vFacesWithOneAdj = WFeatureTopology.GetFacesWithGivenAdjacencyNumber( Proc, 1) local vFacesWithTwoAdj = WFeatureTopology.GetFacesWithGivenAdjacencyNumber( Proc, 2) local vFacesWithThreeAdj = WFeatureTopology.GetFacesWithGivenAdjacencyNumber( Proc, 3) local vFacesWithFourAdj = WFeatureTopology.GetFacesWithGivenAdjacencyNumber( Proc, 4) + local dRawW, dRawH, dRawL = b3Raw:getDimY(), b3Raw:getDimZ(), b3Raw:getDimX() + local bIsFeatureCuttingEntireSection = WL.IsFeatureCuttingEntireSection( Proc.Box, dRawW, dRawH, dRawL) if Proc.IsOutline then sFamily = 'OUTLINE' elseif Proc.Prc == 40 then sFamily = 'DRILLING' + elseif Proc.Fct == 1 and bIsAnyDimensionLongAsPart and bIsFeatureCuttingEntireSection then + sFamily = 'Cut' elseif Proc.Fct == 1 and bIsAnyDimensionLongAsPart then sFamily = 'Bevel' bIsThrough = true elseif Proc.Fct == 2 and bAllAnglesConcave and #vTriangularFaces == 1 then sFamily = 'Bevel' bIsThrough = false - elseif Proc.Fct == 2 and bAllAnglesConcave then + elseif Proc.Fct == 2 and bAllAnglesConcave and ( Proc.AffectedFaces.Left or Proc.AffectedFaces.Right) and ( Proc.AffectedFaces.Front or Proc.AffectedFaces.Back) then sFamily = 'Rabbet' bIsThrough = true + elseif Proc.Fct == 2 and bAllAnglesConcave then + sFamily = 'Groove' + bIsThrough = true elseif Proc.Fct == 2 and not bAllAnglesConcave and bIsAnyDimensionLongAsPart then sFamily = 'DoubleBevel' bIsThrough = true @@ -207,11 +222,14 @@ function WFeatureTopology.Classify( Proc) elseif Proc.Fct == 4 and bAllAnglesConcave and #vFacesWithTwoAdj == 4 and bIsAnyDimensionLongAsPart then sFamily = 'Tunnel' bIsThrough = true + elseif Proc.Fct >= 4 and #vFacesWithOneAdj == 2 and bIsAnyDimensionLongAsPart then + sFamily = 'Strip' + bIsThrough = true elseif Proc.Fct == 5 and bAllAnglesConcave and #vFacesWithFourAdj == 1 then sFamily = 'Pocket' bIsThrough = false end - local vFacesParallelToPart = GetFacesParallelToPart( Proc, sFamily) + local vFacesParallelToPart = GetFacesParallelToPart( Proc, sFamily, bIsThrough) bIsParallel = ( #vFacesParallelToPart == Proc.Fct) if sFamily == 'OUTLINE' or sFamily == 'DRILLING' then diff --git a/LuaLibs/WallExec.lua b/LuaLibs/WallExec.lua index 4ffabc6..d262e1e 100644 --- a/LuaLibs/WallExec.lua +++ b/LuaLibs/WallExec.lua @@ -7,6 +7,7 @@ -- 2023/10/16 Aggiunta gestione Aree vietate (LockOut) per chiodature. -- 2023/11/14 Modifiche sostanziali per l'aggiunta delle lavorazioni in doppio. -- In Collect aggiunto il recupero preliminare di varie informazioni sulla feature. +-- 2023/12/11 In ClassifyTopology si passa ora anche l'Id del grezzo (allineamento Topology con Beam). -- Tabella per definizione modulo local WallExec = {} @@ -309,11 +310,12 @@ local function ClassifyFeatures( vProc, b3Raw) end ------------------------------------------------------------------------------------------------------------- -local function ClassifyTopology( vProc) +local function ClassifyTopology( vProc, nRawId) + local b3Raw = EgtGetRawPartBBox( nRawId) local nRecognized = 0 for i = 1, #vProc do local Proc = vProc[i] - if Topology.Classify( Proc) then + if Topology.Classify( Proc, b3Raw) then nRecognized = nRecognized + 1 end end @@ -1085,7 +1087,7 @@ function WallExec.ProcessFeatures() vProc = EgtJoinTables( vProc, vPartProc) end -- classifico topologicamente le feature - ClassifyTopology( vProc) + ClassifyTopology( vProc, nRawId) -- classifico le feature ClassifyFeatures( vProc, b3Raw) -- recupero l'elenco delle aree vietate alle chiodature diff --git a/LuaLibs/WallLib.lua b/LuaLibs/WallLib.lua index 485adaa..3796cb8 100644 --- a/LuaLibs/WallLib.lua +++ b/LuaLibs/WallLib.lua @@ -2,6 +2,7 @@ -- Libreria globale per Pareti -- 2023/06/26 Spostata qui Is3EdgesApprox da FreeContour. Ora cerca autonomamente il gruppo se non viene passato. -- 2023/11/14 Aggiunte funzioni GetProcessAffectedFaces, GetProcessDistanceToNearestParts, GetProcessDistanceToRawPart. +-- 2023/12/11 Aggiunta funzione IsFeatureCuttingEntireSection (allineamento Topology con Beam). -- Tabella per definizione modulo local WallLib = {} @@ -534,7 +535,7 @@ function WallLib.GetNailLockOutAreas( vProc) if AuxId then AuxId = AuxId + vProc[i].Id end if AuxId then local nAddGrpId = WallLib.GetAddGroup( vProc[i].PartId) - local nSfrId = EgtSurfFlatRegion( nAddGrpId, {AuxId}) + local nSfrId = EgtSurfFlatRegion( nAddGrpId, {AuxId}) if nSfrId then table.insert( vNLO, nSfrId) end @@ -544,5 +545,12 @@ function WallLib.GetNailLockOutAreas( vProc) return vNLO end + +------------------------------------------------------------------------------------------------------------- +-- restituisce vero se la feature con box b3Proc taglia l'intera sezione della parete, rappresentata dalle sue dimensioni W, H e L +function WallLib.IsFeatureCuttingEntireSection( b3Proc, dRawW, dRawH, dRawL) + return ( ( ( abs( b3Proc:getDimY() - dRawW) < 10 * GEO.EPS_SMALL or b3Proc:getDimY() > dRawW) or ( abs( b3Proc:getDimX() - dRawL) < 10 * GEO.EPS_SMALL or b3Proc:getDimX() > dRawL)) and (abs(b3Proc:getDimZ() - dRawH) < 10 * GEO.EPS_SMALL or b3Proc:getDimZ() > dRawH)) +end + ------------------------------------------------------------------------------------------------------------- return WallLib