From 05a8d23f6a60d7fc8fd7cf6b4659025c6812fe79 Mon Sep 17 00:00:00 2001 From: "luca.mazzoleni" Date: Tue, 12 May 2026 09:06:43 +0200 Subject: [PATCH] =?UTF-8?q?-=20in=20BeamExec.GetFeatureInfoAndDependency?= =?UTF-8?q?=20si=20calcolano=20i=20punti=20ai=20vertici=20dei=20tagli=20di?= =?UTF-8?q?=20testa=20e=20coda=20-=20in=20BeamLib=20aggiunta=20funzione=20?= =?UTF-8?q?GetSurfTmSortedVertices=20per=20restituire=20i=20punti=20ai=20v?= =?UTF-8?q?ertici=20gi=C3=A0=20ordinati;=20da=20correggere=20perch=C3=A8?= =?UTF-8?q?=20i=20vertici=20non=20arrivano=20ordinati=20dalla=20funzione?= =?UTF-8?q?=20EgtSurfTmGetAllVertInFacet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/BeamExec.lua | 4 ++- LuaLibs/BeamLib.lua | 68 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 2d783af..35df068 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -805,7 +805,7 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, Part) ( ID.IsCut( Proc) or ID.IsHeadCut( Proc) or ID.IsTailCut( Proc)) and ( ID.IsCut( ProcB) or ID.IsHeadCut( ProcB) or ID.IsTailCut( ProcB)) and ( FeatureLib.IsFeatureCuttingEntireSection( Proc.b3Box, Part) and FeatureLib.IsFeatureCuttingEntireSection( ProcB.b3Box, Part)) - -- sono entrambi tagli troncanti di testa o coda + -- si trovano i veri tagli di testa e coda e si disattivano gli altri, se necessario if bAreBothTruncatingCuts then -- testa if Proc.Faces[1].vtN:getX() > GEO.EPS_SMALL and ProcB.Faces[1].vtN:getX() > GEO.EPS_SMALL then @@ -926,6 +926,8 @@ local function GetFeatureInfoAndDependency( vProcSingleRot, Part) TailProc.Topology.sName = 'TailCut' HeadProc.AvailableStrategies = GetStrategies( HeadProc, Part.sAISetupConfig) TailProc.AvailableStrategies = GetStrategies( TailProc, Part.sAISetupConfig) + local PtSortedHead = BeamLib.GetSurfTmSortedVertices( HeadProc.id) + local PtSortedTail = BeamLib.GetSurfTmSortedVertices( TailProc.id) return vProcSingleRot end diff --git a/LuaLibs/BeamLib.lua b/LuaLibs/BeamLib.lua index ab8d022..47aaddf 100644 --- a/LuaLibs/BeamLib.lua +++ b/LuaLibs/BeamLib.lua @@ -512,10 +512,76 @@ function BeamLib.GetDirectionFromSCC( nSCC) elseif nSCC == MCH_SCC.ADIR_ZM then vtSCC = -Z_AX() end - + return vtSCC end +------------------------------------------------------------------------------------------------------------- +-- Funzione che restituisce una tabella con i punti ai vertici di una trimesh (se almeno 3), in globale +-- ordinati partendo da quello ai valori minimi degli assi e i successivi secondo rotazione attorno a X+ +function BeamLib.GetSurfTmSortedVertices( idSurfTm) + -- se più di una faccia si esce subito + if not ( EgtSurfTmFacetCount( idSurfTm) == 1) then + return + end + + local VerticesIndex = EgtSurfTmGetAllVertInFacet( idSurfTm, 0) + local nVerticesCount = #VerticesIndex + + -- Una faccia deve avere almeno 3 vertici + if nVerticesCount < 3 then + return + end + + local Vertices = {} + local nFirstVertex + + -- 1. Popolamento tabella Vertices e ricerca del vertice di partenza + local dMinYZ = GEO.INFINITO + for i = 1, nVerticesCount do + Vertices[i] = {} + Vertices[i].ptVertex = EgtSurfTmGetVertex( idSurfTm, VerticesIndex[i], GDB_RT.GLOB) + + -- Circular indexing 1 based + Vertices[i].nNextIndex = (i % nVerticesCount) + 1 + Vertices[i].nPrevIndex = ((i - 2 + nVerticesCount) % nVerticesCount) + 1 + + -- il primo punto è quello con il totale di coordinate Y e Z più basso + if( ( Vertices[i].ptVertex:getY() + Vertices[i].ptVertex:getZ()) < dMinYZ) then + nFirstVertex = i + dMinYZ = Vertices[i].ptVertex:getY() + Vertices[i].ptVertex:getZ() + end + end + + -- se non trova il punto con Y+Z minima c'è qualcosa che non va: si esce + if not nFirstVertex then + return + end + + local vtN = EgtSurfTmFacetNormVersor( idSurfTm, 0, GDB_ID.ROOT) + local PtVerticesSorted = {} + + -- 2. Ordinamento in base alla normale X + table.insert( PtVerticesSorted, Vertices[nFirstVertex].ptVertex) + + local nCurrentIndex = nFirstVertex + -- Faccia verso destra (avanti nell'indice della mesh) + if vtN:getX() > GEO.EPS_SMALL then + for _ = 1, nVerticesCount - 1 do + nCurrentIndex = Vertices[nCurrentIndex].nNextIndex + table.insert( PtVerticesSorted, Vertices[nCurrentIndex].ptVertex) + end + -- Faccia verso sinistra (indietro nell'indice della mesh) + else + for _ = 1, nVerticesCount - 1 do + nCurrentIndex = Vertices[nCurrentIndex].nPrevIndex + table.insert( PtVerticesSorted, Vertices[nCurrentIndex].ptVertex) + end + end + + return PtVerticesSorted +end + ------------------------------------------------------------------------------------------------------------- -- Funzione per determinare se la faccia ha lati molto corti (trascurabili) ed è quindi approssimabile ad una 3 facce function BeamLib.Is3EdgesApprox( Proc, idFace, nAddGrpId)