- 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:
+67
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user