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)