- in BeamExec.GetFeatureInfoAndDependency si calcolano i punti ai vertici dei tagli di testa e coda

- in BeamLib aggiunta funzione GetSurfTmSortedVertices per restituire i punti ai vertici già ordinati; da correggere perchè i vertici non arrivano ordinati dalla funzione EgtSurfTmGetAllVertInFacet
This commit is contained in:
luca.mazzoleni
2026-05-12 09:06:43 +02:00
parent 40580cdc69
commit 05a8d23f6a
2 changed files with 70 additions and 2 deletions
+67 -1
View File
@@ -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)