From 039f261f0cd21f27cd2c17ba13696fb83f1f8f99 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Tue, 3 Feb 2026 17:20:21 +0100 Subject: [PATCH] EgtExecutor 3.1a4 : - in Trimming aggiunte le funzioni per riconoscimento di fori e asole - in Trimming pulizia del codice. --- EXE_Trimming.cpp | 232 ++++++++++++++++++++--------------------------- EgtExecutor.rc | Bin 19652 -> 19652 bytes Lua_Trimming.cpp | 92 ++++++++----------- 3 files changed, 136 insertions(+), 188 deletions(-) diff --git a/EXE_Trimming.cpp b/EXE_Trimming.cpp index 5220647..a94fd40 100644 --- a/EXE_Trimming.cpp +++ b/EXE_Trimming.cpp @@ -29,28 +29,30 @@ using namespace std ; -static string s_sKey_Auto_Trim = "AutoTrim" ; - // --------------------------------------------------------------------------- bool -ExeTrimmingAutoSearch( int nParentId, int nSurfLayerId, double dShapeLinTol, double dShapeAngTol, - double dLinTol, double dEdgeLinTol, double dAngTol, double dAngFaceTol, - const STRVECTOR& vsShapes) +ExeTrimmingGetHoleBorder( int nParentId, const INTVECTOR& vSurfIds, const INTVECTOR& vOtherSurfIds, + double dSurfLinTol, double dSurfAngTol, double dEdgeLinTol, double dEdgeAngTol, + double dEdgeThick, int& nFirstId, int& nCount) { // Verifica database geometrico IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) + // Inizializzo i valori di ritorno + nFirstId = GDB_ID_NULL ; + nCount = 0 ; + // Se non ho geometrie da ricercare, non faccio nulla - if ( vsShapes.empty()) + if ( vSurfIds.empty()) return true ; - // Recupero le superfici presenti nel Layer - CISURFPVECTOR vSurfs ; vSurfs.reserve( pGeomDB->GetGroupObjs( nSurfLayerId)) ; - int nId = pGeomDB->GetFirstInGroup( nSurfLayerId) ; - while ( nId != GDB_ID_NULL) { + // Recupero le superfici da cui estrarre i bordi + CISURFPVECTOR vpSurfs ; vpSurfs.reserve( vSurfIds.size()) ; + for ( int i = 0 ; i < ssize( vSurfIds) ; ++ i) { + int nSurfId = vSurfIds[i] ; // Recupero l'entità - const IGeoObj* pGeoObj = pGeomDB->GetGeoObj( nId) ; + const IGeoObj* pGeoObj = pGeomDB->GetGeoObj( nSurfId) ; if ( pGeoObj != nullptr) { // Recupero il Tipo int nType = pGeoObj->GetType() ; @@ -58,81 +60,89 @@ ExeTrimmingAutoSearch( int nParentId, int nSurfLayerId, double dShapeLinTol, dou // Recupero la superficie const ISurf* pSurf = GetSurf( pGeoObj) ; if ( pSurf != nullptr && pSurf->IsValid()) - vSurfs.emplace_back( pSurf) ; + vpSurfs.emplace_back( pSurf) ; } } - nId = pGeomDB->GetNext( nId) ; } // Se non ho superfici non faccio nulla - if ( vSurfs.empty()) + if ( vpSurfs.empty()) return false ; - // Recupero Le Superfici Selezionate, Le Curve e Le Bezier rigate - ISURFPOMATRIX matSelSurfMatrix ; - ICRVCOMPOPOMATRIX matCompoBorders ; - ISURFBEZPOVECTOR vSurfBz ; - bool bOk = GetTrimmingAutoEntities( vSurfs, dShapeLinTol, dShapeAngTol, dLinTol, dEdgeLinTol, dAngTol, dAngFaceTol, vsShapes, - matSelSurfMatrix, matCompoBorders, vSurfBz) ; - - // Per sicurezza verifico che tutte le entità siano a dimensione corretta - bOk = bOk && ( ssize( matSelSurfMatrix) == ssize( matCompoBorders)) && - ( ssize( matSelSurfMatrix) == ssize( vSurfBz)) ; - - // Per ogni Entità ricavata inserisco le Geometrie nel Layer - // NB. Ordine di Inserimento : Surf -> Edges -> bezier - // Una anomalia nella serie blocca il flusso corrente e passa al successivo - int nCount = -1 ; - for ( int i = 0 ; bOk && i < int( matSelSurfMatrix.size()) ; ++ i) { - // Verifico che la Superficie sia Valida - bool bOkEntity = true ; - for ( int j = 0 ; bOkEntity && j < ssize( matSelSurfMatrix[i]) ; ++ j) - bOkEntity = ( ! IsNull( matSelSurfMatrix[i][j]) && matSelSurfMatrix[i][j]->IsValid()) ; - if ( ! bOkEntity) - continue ; // anomalia serie livello superfici di selezione - for ( int j = 0 ; bOk && j < ssize( matSelSurfMatrix[i]) ; ++ j) { - int nSurfId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( matSelSurfMatrix[i][j])) ; - bOk = ( ( nSurfId != GDB_ID_NULL) && - ( pGeomDB->SetInfo( nSurfId, s_sKey_Auto_Trim, ToString( ++ nCount)))) ; + // Calcolo il Centroide delle superfici complessive + Point3d ptRef = P_INVALID ; + if ( ! vOtherSurfIds.empty()) { + int nToTSurf = 0 ; + for ( const int& nOtherSurfId : vOtherSurfIds) { + // Recupero l'entità + const IGeoObj* pGeoObj = pGeomDB->GetGeoObj( nOtherSurfId) ; + if ( pGeoObj != nullptr) { + // Recupero il Tipo + int nType = pGeoObj->GetType() ; + if ( nType == SRF_TRIMESH || nType == SRF_BEZIER) { + // Recupero la superficie + const ISurf* pSurf = GetSurf( pGeoObj) ; + if ( pSurf != nullptr && pSurf->IsValid()) { + // Recupero il Centroide + Point3d ptCentroid ; + pSurf->GetCentroid( ptCentroid) ; + if ( ! ptRef.IsValid()) + ptRef = ptCentroid ; + else + ptRef += ptCentroid ; + ++ nToTSurf ; + } + } + } } - if ( ! bOk) - break ; // anomalia bloccante - // Verifico che Le Curve di Edges ( Bezier ) siano Valide - for ( int j = 0 ; bOkEntity && j < ssize( matCompoBorders[i]) ; ++ j) - bOkEntity = ( ! IsNull( matCompoBorders[i][j]) && matCompoBorders[i][j]->IsValid()) ; - if ( ! bOkEntity) - continue ; // anomalia serie livello curve di bordo - for ( int j = 0 ; bOk && j < ssize( matCompoBorders[i]) ; ++ j) { - int nCrvId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( matCompoBorders[i][j])) ; - bOk = ( ( nCrvId != GDB_ID_NULL) && - ( pGeomDB->SetInfo( nCrvId, s_sKey_Auto_Trim, ToString( nCount)))) ; + if ( nToTSurf > 0) { + for ( const ISurf* pSurf : vpSurfs) { + Point3d ptCentroid ; + pSurf->GetCentroid( ptCentroid) ; + if ( ! ptRef.IsValid()) + ptRef = ptCentroid ; + else + ptRef += ptCentroid ; + ++ nToTSurf ; + } + ptRef /= nToTSurf ; + } + } + + // Recupero i Bordi per fori ed asole + ICRVCOMPOPOVECTOR vHoleBorders ; + bool bOk = GetTrimmingHoleBorders( vpSurfs, ptRef, dSurfLinTol, dSurfAngTol, dEdgeLinTol, dEdgeAngTol, + dEdgeThick, vHoleBorders) ; + if ( bOk) { + // Inserisco le curve nel DB e imposto i parametri di ritorno + bool bFirst = true ; + for ( int i = 0 ; bOk && i < ssize( vHoleBorders) ; ++ i) { + // Verifico che sia valida + if ( ! IsNull( vHoleBorders[i]) && vHoleBorders[i]->IsValid()) { + int nCrvId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( vHoleBorders[i])) ; + bOk = ( nCrvId != GDB_ID_NULL) ; + if ( bOk) { + ++ nCount ; + if ( bFirst) { + nFirstId = nCrvId ; + bFirst = false ; + } + } + } } - if ( ! bOk) - break ; // anomalia bloccante - // Verifico che le Superfici di Bezier rigate siano Valide - bOkEntity = ( ! IsNull( vSurfBz[i]) && vSurfBz[i]->IsValid()) ; - if ( ! bOkEntity) - continue ; // anomalia seria livello Bezier Rigata - int nBzId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( vSurfBz[i])) ; - bOk = ( ( nBzId != GDB_ID_NULL) && - ( pGeomDB->SetInfo( nBzId, s_sKey_Auto_Trim, ToString( nCount)))) ; - if ( ! bOk) - break ; // anomali bloccante } ExeSetModified() ; - // Se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { - string sLua = "EgtTrimmingAutoSearch(" + ToString( nParentId) + "," + - ToString( nSurfLayerId) + "," + - ToString( dShapeLinTol) + "," + - ToString( dShapeAngTol) + "," + - ToString( dLinTol) + "," + - ToString( dEdgeLinTol) + "," + - ToString( dAngTol) + "," + - ToString( dAngFaceTol) + "," + - ToString( vsShapes) + ")" + - " -- bOk=" + ToString( bOk) ; + string sLua = "EgtTrimmingGetHoleBorder(" + ToString( nParentId) + "," + + ToString( vSurfIds) + "," + + ToString( dSurfLinTol) + "," + + ToString( dSurfAngTol) + "," + + ToString( dEdgeLinTol) + "," + + ToString( dEdgeAngTol) + "," + + ToString( dEdgeThick) + ")" + + " bOk=" + ToString( bOk) + + " nNewSurfId=" + ToString( nFirstId) + ", nCount= " + ToString( nCount) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } @@ -141,7 +151,7 @@ ExeTrimmingAutoSearch( int nParentId, int nSurfLayerId, double dShapeLinTol, dou // --------------------------------------------------------------------------- int -ExeTrimmingGetSurfTmFaceAdj( int nParentId, int nSurfId, const INTVECTOR& vTria, const PNTVECTOR& vPts, +ExeTrimmingGetSurfTmFaceAdj( int nParentId, int nSurfId, int nTria, const Point3d& ptTria, double dAngTol, double dSize, double dSizeTol) { // Verifica database geometrico @@ -152,15 +162,12 @@ ExeTrimmingGetSurfTmFaceAdj( int nParentId, int nSurfId, const INTVECTOR& vTria, const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nSurfId)) ; bool bOk = ( pStm != nullptr && pStm->IsValid()) ; - // Verifico che le facce appartengano alla superficie - bOk = bOk && ( ! vTria.empty()) ; - // Recupero la superficie formata dai triangoli di adiacenza int nNewSurfId = GDB_ID_NULL ; if ( bOk) { PtrOwner pStmAdjFace( CreateSurfTriMesh()) ; bOk = ( ! IsNull( pStmAdjFace) && pStmAdjFace->AdjustTopology()) ; - bOk = GetTrimmingStmAdjTria( pStm, vTria, vPts, dAngTol, dSize, dSizeTol, pStmAdjFace) ; + bOk = GetTrimmingStmAdjTria( pStm, nTria, ptTria, dAngTol, dSize, dSizeTol, pStmAdjFace) ; bOk = ( ! IsNull( pStmAdjFace) && pStmAdjFace->IsValid() && pStmAdjFace->GetTriangleCount() > 0) ; // Inserisco la Superficie nel DB geometrico if ( bOk) { @@ -174,7 +181,10 @@ ExeTrimmingGetSurfTmFaceAdj( int nParentId, int nSurfId, const INTVECTOR& vTria, if ( IsCmdLog()) { string sLua = "EgtTrimmingGetSurfTmFromFaceAdj(" + ToString( nParentId) + "," + ToString( nSurfId) + "," + - ToString( vTria) + "," + + ToString( nTria) + "," + + "{ " + ToString( ptTria.x) + "," + + ToString( ptTria.y) + "," + + ToString( ptTria.z) + "}," + ToString( dAngTol) + ")" + " nNewSurfId=" + ToString( nNewSurfId) ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; @@ -379,7 +389,7 @@ ExeTrimmingGetBorders( int nParentId, const SELVECTOR& vIds, double dSurfLinTol, bool ExeTrimmingGetBordersByNormals( int nParentId, const SELVECTOR& vIds, double dSurfLinTol, double dSurfAngTol, double dLinTol, double dAngTol, double dThick, - Point3d& ptNear, int& nFirstId, int& nCount) + int& nFirstId, int& nCount) { // Verifica database geometrico IGeomDB* pGeomDB = GetCurrGeomDB() ; @@ -423,59 +433,15 @@ ExeTrimmingGetBordersByNormals( int nParentId, const SELVECTOR& vIds, double dSu ICRVCOMPOPOVECTOR vBezierEdges ; bOk = bOk && GetTrimmingFinalBorders( vpSurf, vFaces, dSurfLinTol, dSurfAngTol, dLinTol, dAngTol, dThick, vBezierEdges) ; if ( bOk) { - // Se non ho un punto di vicinanza, le inserisco tutte - if ( ! ptNear.IsValid()) { - nCount = int( vBezierEdges.size()) ; - // Scorro i gli Edges ottenuti - for ( int nCrv = 0 ; bOk && nCrv < nCount ; ++ nCrv) { - vBezierEdges[nCrv]->ToLoc( frDest) ; - // Inserisco la curva nel DB Geometrico - int nCurrId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( vBezierEdges[nCrv])) ; - bOk = ( nCurrId != GDB_ID_NULL) ; - if ( nCrv == 0) - nFirstId = nCurrId ; - } - } - // Se ho un punto di vicinanza, cerco la coppia di curve più vicina - else { - // Se solo una coppia di curve, le inserisco e non ho ambiguità - if ( int( vBezierEdges.size()) == 2) { - nCount = int( vBezierEdges.size()) ; - // Scorro gli Edges ottenuti - for ( int nCrv = 0 ; bOk && nCrv < nCount ; ++ nCrv) { - vBezierEdges[nCrv]->ToLoc( frDest) ; - // Inserisco la curva nel DB Geometrico - int nCurrId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( vBezierEdges[nCrv])) ; - bOk = ( nCurrId != GDB_ID_NULL) ; - if ( nCrv == 0) - nFirstId = nCurrId ; - } - } - // altrimenti cerco la coppia più vicia - else { - double dSqMinDist = INFINITO ; - int nInd = 0 ; - for ( int i = 0 ; i + 1 < int( vBezierEdges.size()) ; i = i + 2) { - double dSqDist = 0., dSqDist1 = 0. ; - if ( DistPointCurve( ptNear, *vBezierEdges[i]).GetSqDist( dSqDist) && - DistPointCurve( ptNear, *vBezierEdges[i + 1]).GetSqDist( dSqDist1)) { - double dCurrMinSqDist = min( dSqDist, dSqDist1) ; - if ( dCurrMinSqDist < dSqMinDist) { - dSqMinDist = dCurrMinSqDist ; - nInd = i ; - } - } - } - vBezierEdges[nInd]->ToLoc( frDest) ; - vBezierEdges[nInd + 1]->ToLoc( frDest) ; - int nCurrId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( vBezierEdges[nInd])) ; - int nCurrId1 = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( vBezierEdges[nInd + 1])) ; - bOk = ( nCurrId != GDB_ID_NULL && nCurrId1 != GDB_ID_NULL) ; - if ( bOk) { - nFirstId = nCurrId1 ; - nCount = 2 ; - } - } + nCount = int( vBezierEdges.size()) ; + // Scorro i gli Edges ottenuti + for ( int nCrv = 0 ; bOk && nCrv < nCount ; ++ nCrv) { + vBezierEdges[nCrv]->ToLoc( frDest) ; + // Inserisco la curva nel DB Geometrico + int nCurrId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( vBezierEdges[nCrv])) ; + bOk = ( nCurrId != GDB_ID_NULL) ; + if ( nCrv == 0) + nFirstId = nCurrId ; } } diff --git a/EgtExecutor.rc b/EgtExecutor.rc index 3d2f9991536e151a3d09fc944d736b51184dfc27..f9952db49c1a3ea3d9ba0c5db95caa245b031329 100644 GIT binary patch delta 225 zcmX>ylkvz*#trM3)jb*V7}6PX7*ZLEfmne-gCUrqgdq`#Gl9HNpll|HJz3DLb#olc z941DS&A-`PnSqoe*K!sx?>N)s4T4pSCX*exk~jAW*?>e(i-FY$N+HxVD8kglDRC$f oYw_lZF2#(3`CylMf?bvabW!4FLAQ;}n8K4Mx*Xg*!OMgR0F`(;fB*mh delta 252 zcmX>ylkvz*#trM3wOtwV7}6PX7%~}(88R3Y7&I6{fg+g