diff --git a/EXE_GdbGetSurf.cpp b/EXE_GdbGetSurf.cpp index da80410..4e3de8f 100644 --- a/EXE_GdbGetSurf.cpp +++ b/EXE_GdbGetSurf.cpp @@ -16,9 +16,12 @@ #include "EXE.h" #include "EXE_Const.h" #include "EXE_Macro.h" +#include "AuxTools.h" #include "GeoTools.h" #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EXeConst.h" +#include "/EgtDev/Include/EGkGeoPoint3d.h" +#include "/EgtDev/Include/EGkCurveBezier.h" #include "/EgtDev/Include/EGkCurveComposite.h" #include "/EgtDev/Include/EGkCurveLocal.h" #include "/EgtDev/Include/EGkSurf.h" @@ -91,52 +94,6 @@ ExeSurfFrGrossArea( int nId, double& dArea) return ( pSfr != nullptr && pSfr->GetGrossArea( dArea)) ; } -//---------------------------------------------------------------------------- -int -ExeSurfFrChunkCount( int nId) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, 0) - // recupero la regione - const ISurfFlatRegion* pSfr = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId)) ; - if ( pSfr == nullptr) - return false ; - // recupero il numero di chunk - return pSfr->GetChunkCount() ; -} - -//---------------------------------------------------------------------------- -int -ExeSurfFrChunkSimpleClassify( int nId1, int nChunk1, int nId2, int nChunk2) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, 0) - // recupero la prima superficie FlatRegion - ISurfFlatRegion* pSfr1 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId1)) ; - bool bOk = ( pSfr1 != nullptr) ; - // recupero il riferimento della superficie - Frame3d frSurf1 ; - bOk = bOk && pGeomDB->GetGlobFrame( nId1, frSurf1) ; - // recupero la seconda superficie FlatRegion - const ISurfFlatRegion* pSfr2 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId2)) ; - bOk = bOk && ( pSfr2 != nullptr) ; - // recupero il riferimento della superficie - Frame3d frSurf2 ; - bOk = bOk && pGeomDB->GetGlobFrame( nId2, frSurf2) ; - // se riferimenti diversi, porto una copia della seconda nel riferimento della prima - const ISurfFlatRegion* pSfr2L = pSfr2 ; - PtrOwner pTmp ; - if ( ! AreSameFrame( frSurf1, frSurf2)) { - pTmp.Set( pSfr2->Clone()) ; - bOk = bOk && ! IsNull( pTmp) ; - bOk = bOk && pTmp->LocToLoc( frSurf2, frSurf1) ; - pSfr2L = pTmp ; - } - // classifico il chunk della prima regione rispetto a quello della seconda - int nRes = ( bOk ? pSfr1->GetChunkSimpleClassification( nChunk1, *pSfr2L, nChunk2) : REGC_NULL) ; - return nRes ; -} - //---------------------------------------------------------------------------- bool ExeSurfFrTestExternal( int nId1, int nId2, double dMinDist) @@ -203,6 +160,104 @@ ExeSurfFrTestExternal( int nId1, int nId2, double dMinDist) return false ; } +//---------------------------------------------------------------------------- +int +ExeSurfFrChunkCount( int nId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, 0) + // recupero la regione + const ISurfFlatRegion* pSfr = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId)) ; + if ( pSfr == nullptr) + return false ; + // recupero il numero di chunk + return pSfr->GetChunkCount() ; +} + +//---------------------------------------------------------------------------- +int +ExeSurfFrChunkSimpleClassify( int nId1, int nChunk1, int nId2, int nChunk2) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, 0) + // recupero la prima superficie FlatRegion + ISurfFlatRegion* pSfr1 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId1)) ; + bool bOk = ( pSfr1 != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf1 ; + bOk = bOk && pGeomDB->GetGlobFrame( nId1, frSurf1) ; + // recupero la seconda superficie FlatRegion + const ISurfFlatRegion* pSfr2 = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId2)) ; + bOk = bOk && ( pSfr2 != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf2 ; + bOk = bOk && pGeomDB->GetGlobFrame( nId2, frSurf2) ; + // se riferimenti diversi, porto una copia della seconda nel riferimento della prima + const ISurfFlatRegion* pSfr2L = pSfr2 ; + PtrOwner pTmp ; + if ( ! AreSameFrame( frSurf1, frSurf2)) { + pTmp.Set( pSfr2->Clone()) ; + bOk = bOk && ! IsNull( pTmp) ; + bOk = bOk && pTmp->LocToLoc( frSurf2, frSurf1) ; + pSfr2L = pTmp ; + } + // classifico il chunk della prima regione rispetto a quello della seconda + int nRes = ( bOk ? pSfr1->GetChunkSimpleClassification( nChunk1, *pSfr2L, nChunk2) : REGC_NULL) ; + return nRes ; +} + +//---------------------------------------------------------------------------- +int +ExeExtractSurfFrChunkLoops( int nId, int nChunk, int nDestGrpId, int* pnCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie FlatRegion + const ISurfFlatRegion* pSfr = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId)) ; + bool bOk = ( pSfr != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf ; + bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; + // recupero il riferimento di destinazione + Frame3d frDest ; + bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; + // richiedo i contorni del componente connesso (chunk) e li inserisco nel DB + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + int nL = 0 ; + PtrOwner pCrv( bOk ? pSfr->GetLoop( nChunk, nL) : nullptr) ; + while ( ! IsNull( pCrv)) { + // porto la curva nel riferimento destinazione + bOk = bOk && pCrv->LocToLoc( frSurf, frDest) ; + // la inserisco nel DB geometrico + int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrv)) : GDB_ID_NULL) ; + bOk = bOk && ( nNewId != GDB_ID_NULL) ; + // copio il materiale + if ( ! pGeomDB->CopyMaterial( nId, nNewId)) + return GDB_ID_NULL ; + // aggiorno contatori + if ( bOk && nFirstId == GDB_ID_NULL) + nFirstId = nNewId ; + if ( bOk) + ++ nCount ; + // passo alla prossima curva + pCrv.Set( bOk ? pSfr->GetLoop( nChunk, ++nL) : nullptr) ; + } + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtExtractSurfFrChunkLoops(" + ToString( nId) + "," + + ToString( nChunk) + "," + + ToString( nDestGrpId) + ")" + + " -- Id=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} + //---------------------------------------------------------------------------- int ExeSurfTmFacetCount( int nId) @@ -549,6 +604,244 @@ ExeSurfTmFacetsContact( int nId, int nF1, int nF2, int nRefId, bool& bAdjac, Poi return true ; } +//---------------------------------------------------------------------------- +int +ExeExtractSurfTmLoops( int nId, int nDestGrpId, int* pnCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie TriMesh + const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + bool bOk = ( pStm != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf ; + bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; + // recupero il riferimento di destinazione + Frame3d frDest ; + bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; + // recupero i loop come polilinee + POLYLINEVECTOR vPL ; + bOk = bOk && pStm->GetLoops( vPL) ; + // dalle polilinee creo le curve e le inserisco nel DB + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + for ( size_t i = 0 ; i < vPL.size() ; ++ i) { + // creo la curva + PtrOwner pCrvCompo( CreateCurveComposite()) ; + bOk = bOk && pCrvCompo->FromPolyLine( vPL[i]) ; + // la porto nel riferimento destinazione + bOk = bOk && pCrvCompo->LocToLoc( frSurf, frDest) ; + // la inserisco nel DB geometrico + int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCompo)) : GDB_ID_NULL) ; + bOk = bOk && ( nNewId != GDB_ID_NULL) ; + // copio il materiale + if ( ! pGeomDB->CopyMaterial( nId, nNewId)) + return GDB_ID_NULL ; + // aggiorno contatori + if ( bOk && nFirstId == GDB_ID_NULL) + nFirstId = nNewId ; + if ( bOk) + ++ nCount ; + } + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtExtractSurfTmLoops(" + ToString( nId) + "," + + ToString( nDestGrpId) + ")" + + " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} + +//---------------------------------------------------------------------------- +int +ExeGetSurfTmSilhouette( int nId, const Vector3d& vtDir, int nDestGrpId, int nRefType, int* pnCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie TriMesh + const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + bool bOk = ( pStm != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf ; + bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; + // recupero il riferimento di destinazione + Frame3d frDest ; + bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; + // porto in locale alla superficie il versore di riferimento + Vector3d vtDirL = GetVectorLocal( pGeomDB, vtDir, nRefType, frSurf) ; + // recupero i loop come polilinee + POLYLINEVECTOR vPL ; + bOk = bOk && pStm->GetSilhouette( vtDirL, vPL) ; + // dalle polilinee creo le curve e le inserisco nel DB + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + for ( size_t i = 0 ; i < vPL.size() ; ++ i) { + // creo la curva + PtrOwner pCrvCompo( CreateCurveComposite()) ; + bOk = bOk && pCrvCompo->FromPolyLine( vPL[i]) ; + // la porto nel riferimento destinazione + bOk = bOk && pCrvCompo->LocToLoc( frSurf, frDest) ; + // la inserisco nel DB geometrico + int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCompo)) : GDB_ID_NULL) ; + bOk = bOk && ( nNewId != GDB_ID_NULL) ; + // copio il materiale + if ( ! pGeomDB->CopyMaterial( nId, nNewId)) + return GDB_ID_NULL ; + // aggiorno contatori + if ( bOk && nFirstId == GDB_ID_NULL) + nFirstId = nNewId ; + if ( bOk) + ++ nCount ; + } + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtGetSurfTmSilhouette(" + ToString( nId) + ",{" + + ToString( vtDir) + "}," + + ToString( nDestGrpId) + "," + + RefTypeToString( nRefType) + ")" + + " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} + +//---------------------------------------------------------------------------- +int +ExeExtractSurfTmFacetLoops( int nId, int nFacet, int nDestGrpId, int* pnCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie TriMesh + const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + bool bOk = ( pStm != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf ; + bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; + // recupero il riferimento di destinazione + Frame3d frDest ; + bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; + // recupero i loop come polilinee + POLYLINEVECTOR vPL ; + bOk = bOk && pStm->GetFacetLoops( nFacet, vPL) ; + // dalle polilinee creo le curve e le inserisco nel DB + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + for ( size_t i = 0 ; i < vPL.size() ; ++ i) { + // creo la curva + PtrOwner pCrvCompo( CreateCurveComposite()) ; + bOk = bOk && pCrvCompo->FromPolyLine( vPL[i]) ; + // la porto nel riferimento destinazione + bOk = bOk && pCrvCompo->LocToLoc( frSurf, frDest) ; + // la inserisco nel DB geometrico + int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCompo)) : GDB_ID_NULL) ; + bOk = bOk && ( nNewId != GDB_ID_NULL) ; + // copio il materiale + if ( ! pGeomDB->CopyMaterial( nId, nNewId)) + return GDB_ID_NULL ; + // aggiorno contatori + if ( bOk && nFirstId == GDB_ID_NULL) + nFirstId = nNewId ; + if ( bOk) + ++ nCount ; + } + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtExtractSurfTmFacetLoops(" + ToString( nId) + "," + + ToString( nFacet) + "," + + ToString( nDestGrpId) + ")" + + " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} + +//------------------------------------------------------------------------------- +int +ExeCopySurfTmFacet( int nId, int nFacet, int nDestGrpId) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie TriMesh + const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + if ( pStm == nullptr) + return GDB_ID_NULL ; + // recupero il suo riferimento globale + Frame3d frSurf ; + if ( ! pGeomDB->GetGlobFrame( nId, frSurf)) + return GDB_ID_NULL ; + // recupero il riferimento del gruppo di destinazione + Frame3d frDest ; + if ( ! pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest)) + return GDB_ID_NULL ; + // copio la faccia + PtrOwner pFac( pStm->CloneFacet( nFacet)) ; + if ( IsNull( pFac)) + return GDB_ID_NULL ; + pFac->LocToLoc( frSurf, frDest) ; + // inserisco nel DB + int nFacId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nDestGrpId, GDB_LAST_SON, Release( pFac)) ; + if ( nFacId == GDB_ID_NULL) + return GDB_ID_NULL ; + // copio gli attributi + if ( ! pGeomDB->CopyAttributes( nId, nFacId)) + return GDB_ID_NULL ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtCopySurfTmFacet(" + ToString( nId) + "," + + ToString( nFacet) + "," + + ToString( nDestGrpId) + ")" + + " -- Id=" + ToString( nFacId) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + return nFacId ; +} + +//----------------------------------------------------------------------------- +bool +ExeSurfTmGetFacetBBox( int nId, int nFacet, int nFlag, BBox3d& b3Box) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la superficie TriMesh + const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + if ( pStm == nullptr) + return false ; + // recupero il bounding box della faccia dell'oggetto in locale + return pStm->GetFacetLocalBBox( nFacet, b3Box, nFlag) ; +} + +//----------------------------------------------------------------------------- +bool +ExeSurfTmGetFacetBBoxGlob( int nId, int nFacet, int nFlag, BBox3d& b3Box) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la superficie TriMesh + const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; + if ( pStm == nullptr) + return false ; + // recupero il riferimento globale del gruppo cui appartiene + Frame3d frGlob ; + if ( nId != GDB_ID_ROOT && ! pGeomDB->GetGroupGlobFrame( pGeomDB->GetParentId( nId), frGlob)) + return false ; + // recupero il bounding box della faccia dell'oggetto in globale + return pStm->GetFacetBBox( nFacet, frGlob, b3Box, nFlag) ; +} + //---------------------------------------------------------------------------- bool ExeSurfBezierGetPoint( int nSurfId, double dU, double dV, int nRefId, Point3d& ptP) @@ -639,31 +932,58 @@ ExeSurfBezierGetPointNrmD1( int nSurfId, double dU, double dV, int nRefId, Point //---------------------------------------------------------------------------- int -ExeSurfBezierGetCurveU( int nSurfId, double dV, int nDestGrpId) +MySurfBezierGetCurveUV( int nSurfId, bool bIsU, double dPar, int nDestGrpId) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la superficie di Bezier const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; - bool bOk = ( pSbz != nullptr) ; + if ( pSbz == nullptr) + return GDB_ID_NULL ; // recupero il riferimento della superficie Frame3d frSurf ; - bOk = bOk && pGeomDB->GetGlobFrame( nSurfId, frSurf) ; + if ( ! pGeomDB->GetGlobFrame( nSurfId, frSurf)) + return GDB_ID_NULL ; // recupero il riferimento di destinazione Frame3d frDest ; - bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; - // richiedo la curva e la inserisco nel DB - PolyLine PL ; - bOk = bOk && pSbz->GetCurveOnU( dV, PL) ; - PtrOwner pCrvCo( CreateCurveComposite()) ; - bOk = bOk && ! IsNull( pCrvCo) && pCrvCo->FromPolyLine( PL) ; - // porto la curva nel riferimento destinazione - bOk = bOk && pCrvCo->LocToLoc( frSurf, frDest) ; - // la inserisco nel DB geometrico - int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCo)) : GDB_ID_NULL) ; - bOk = bOk && ( nNewId != GDB_ID_NULL) ; - // copio il materiale - bOk = bOk && pGeomDB->CopyMaterial( nSurfId, nNewId) ; + if ( ! pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest)) + return GDB_ID_NULL ; + // richiedo la curva + PtrOwner pCrv( bIsU ? pSbz->GetCurveOnU( dPar) : pSbz->GetCurveOnV( dPar)) ; + if ( IsNull( pCrv)) + return GDB_ID_NULL ; + // se è una curva + if ( ! pCrv->IsAPoint()) { + // porto la curva nel riferimento destinazione + pCrv->LocToLoc( frSurf, frDest) ; + // la inserisco nel DB geometrico + int nNewId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrv)) ; + // copio il materiale + pGeomDB->CopyMaterial( nSurfId, nNewId) ; + return nNewId ; + } + // altrimenti è collassata in un punto + else { + Point3d ptP = pCrv->GetControlPoint( 0) ; + PtrOwner pGeoPnt( CreateGeoPoint3d()) ; + if ( IsNull( pGeoPnt) || ! pGeoPnt->Set( ptP)) + return GDB_ID_NULL ; + // porto il punto nel riferimento destinazione + pGeoPnt->LocToLoc( frSurf, frDest) ; + // lo inserisco nel DB geometrico + int nNewId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pGeoPnt)) ; + // copio il materiale + pGeomDB->CopyMaterial( nSurfId, nNewId) ; + return nNewId ; + } +} + +//---------------------------------------------------------------------------- +int +ExeSurfBezierGetCurveU( int nSurfId, double dV, int nDestGrpId) +{ + // creo la curva + int nNewId = MySurfBezierGetCurveUV( nSurfId, true, dV, nDestGrpId) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { @@ -681,29 +1001,8 @@ ExeSurfBezierGetCurveU( int nSurfId, double dV, int nDestGrpId) int ExeSurfBezierGetCurveV( int nSurfId, double dU, int nDestGrpId) { - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - // recupero la superficie di Bezier - const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; - bool bOk = ( pSbz != nullptr) ; - // recupero il riferimento della superficie - Frame3d frSurf ; - bOk = bOk && pGeomDB->GetGlobFrame( nSurfId, frSurf) ; - // recupero il riferimento di destinazione - Frame3d frDest ; - bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; - // richiedo la curva e la inserisco nel DB - PolyLine PL ; - bOk = bOk && pSbz->GetCurveOnV( dU, PL) ; - PtrOwner pCrvCo( CreateCurveComposite()) ; - bOk = bOk && ! IsNull( pCrvCo) && pCrvCo->FromPolyLine( PL) ; - // porto la curva nel riferimento destinazione - bOk = bOk && pCrvCo->LocToLoc( frSurf, frDest) ; - // la inserisco nel DB geometrico - int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCo)) : GDB_ID_NULL) ; - bOk = bOk && ( nNewId != GDB_ID_NULL) ; - // copio il materiale - bOk = bOk && pGeomDB->CopyMaterial( nSurfId, nNewId) ; + // creo la curva + int nNewId = MySurfBezierGetCurveUV( nSurfId, false, dU, nDestGrpId) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { @@ -719,7 +1018,7 @@ ExeSurfBezierGetCurveV( int nSurfId, double dU, int nDestGrpId) //---------------------------------------------------------------------------- bool -ExeSurfBezierGetInfo( int nSurfId, int& nDegU, int& nDegV, bool& bIsRat) +ExeSurfBezierGetInfo( int nSurfId, int& nDegU, int& nDegV, bool& bIsRat, bool& bTrimmed) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) @@ -727,13 +1026,14 @@ ExeSurfBezierGetInfo( int nSurfId, int& nDegU, int& nDegV, bool& bIsRat) const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; bool bOk = ( pSbz != nullptr) ; // recupero le info (gradi in U e V, flag di razionale) - bOk = bOk && pSbz->GetInfo( nDegU, nDegV, bIsRat) ; + bOk = bOk && pSbz->GetInfo( nDegU, nDegV, bIsRat, bTrimmed) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtSurfBezierGetInfo(" + ToString( nSurfId) + ")" + " -- DegU=" + ( bOk ? ToString( nDegU) : "nil") + " -- DegV=" + ( bOk ? ToString( nDegV) : "nil") + - " -- IsRat=" + ( bOk ? ToString( bIsRat) : "nil") ; + " -- IsRat=" + ( bOk ? ToString( bIsRat) : "nil") + + " -- Trim=" + ( bOk ? ToString( bTrimmed) : "nil") ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } // restituisco risultati @@ -742,31 +1042,66 @@ ExeSurfBezierGetInfo( int nSurfId, int& nDegU, int& nDegV, bool& bIsRat) //---------------------------------------------------------------------------- int -ExeSurfBezierGetControlCurveU( int nSurfId, int nIndV, int nDestGrpId) +MySurfBezierGetControlCurveUV( int nSurfId, bool bIsU, int nInd, int nDestGrpId) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la superficie di Bezier const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; - bool bOk = ( pSbz != nullptr) ; + if ( pSbz == nullptr) + return GDB_ID_NULL ; // recupero il riferimento della superficie Frame3d frSurf ; - bOk = bOk && pGeomDB->GetGlobFrame( nSurfId, frSurf) ; + if ( ! pGeomDB->GetGlobFrame( nSurfId, frSurf)) + return GDB_ID_NULL ; // recupero il riferimento di destinazione Frame3d frDest ; - bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; - // richiedo la curva e la inserisco nel DB + if ( ! pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest)) + return GDB_ID_NULL ; + // richiedo i dati della polilinea PolyLine PL ; - bOk = bOk && pSbz->GetControlCurveOnU( nIndV, PL) ; - PtrOwner pCrvCo( CreateCurveComposite()) ; - bOk = bOk && ! IsNull( pCrvCo) && pCrvCo->FromPolyLine( PL) ; - // porto la curva nel riferimento destinazione - bOk = bOk && pCrvCo->LocToLoc( frSurf, frDest) ; - // la inserisco nel DB geometrico - int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCo)) : GDB_ID_NULL) ; - bOk = bOk && ( nNewId != GDB_ID_NULL) ; - // copio il materiale - bOk = bOk && pGeomDB->CopyMaterial( nSurfId, nNewId) ; + if ( bIsU) + pSbz->GetControlCurveOnU( nInd, PL) ; + else + pSbz->GetControlCurveOnV( nInd, PL) ; + // se è una curva + if ( PL.GetPointNbr() > 1) { + PtrOwner pCrvCo( CreateCurveComposite()) ; + if ( IsNull( pCrvCo) || ! pCrvCo->FromPolyLine( PL)) + return GDB_ID_NULL ; + // porto la curva nel riferimento destinazione + pCrvCo->LocToLoc( frSurf, frDest) ; + // la inserisco nel DB geometrico + int nNewId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCo)) ; + // copio il materiale + pGeomDB->CopyMaterial( nSurfId, nNewId) ; + return nNewId ; + } + // se altrimenti è collassata in un punto + else if ( PL.GetPointNbr() == 1) { + Point3d ptP ; PL.GetFirstPoint( ptP) ; + PtrOwner pGeoPnt( CreateGeoPoint3d()) ; + if ( IsNull( pGeoPnt) || ! pGeoPnt->Set( ptP)) + return GDB_ID_NULL ; + // porto il punto nel riferimento destinazione + pGeoPnt->LocToLoc( frSurf, frDest) ; + // lo inserisco nel DB geometrico + int nNewId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pGeoPnt)) ; + // copio il materiale + pGeomDB->CopyMaterial( nSurfId, nNewId) ; + return nNewId ; + } + // altrimenti è errore + else + return GDB_ID_NULL ; +} + +//---------------------------------------------------------------------------- +int +ExeSurfBezierGetControlCurveU( int nSurfId, int nIndV, int nDestGrpId) +{ + // creo la curva + int nNewId = MySurfBezierGetControlCurveUV( nSurfId, true, nIndV, nDestGrpId) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { @@ -784,29 +1119,8 @@ ExeSurfBezierGetControlCurveU( int nSurfId, int nIndV, int nDestGrpId) int ExeSurfBezierGetControlCurveV( int nSurfId, int nIndU, int nDestGrpId) { - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - // recupero la superficie di Bezier - const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; - bool bOk = ( pSbz != nullptr) ; - // recupero il riferimento della superficie - Frame3d frSurf ; - bOk = bOk && pGeomDB->GetGlobFrame( nSurfId, frSurf) ; - // recupero il riferimento di destinazione - Frame3d frDest ; - bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; - // richiedo la curva e la inserisco nel DB - PolyLine PL ; - bOk = bOk && pSbz->GetControlCurveOnV( nIndU, PL) ; - PtrOwner pCrvCo( CreateCurveComposite()) ; - bOk = bOk && ! IsNull( pCrvCo) && pCrvCo->FromPolyLine( PL) ; - // porto la curva nel riferimento destinazione - bOk = bOk && pCrvCo->LocToLoc( frSurf, frDest) ; - // la inserisco nel DB geometrico - int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCo)) : GDB_ID_NULL) ; - bOk = bOk && ( nNewId != GDB_ID_NULL) ; - // copio il materiale - bOk = bOk && pGeomDB->CopyMaterial( nSurfId, nNewId) ; + // creo la curva + int nNewId = MySurfBezierGetControlCurveUV( nSurfId, false, nIndU, nDestGrpId) ; ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { @@ -819,3 +1133,54 @@ ExeSurfBezierGetControlCurveV( int nSurfId, int nIndU, int nDestGrpId) // restituisco risultati return nNewId ; } + +//---------------------------------------------------------------------------- +int +ExeExtractSurfBezierLoops( int nId, int nDestGrpId, int* pnCount) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + // recupero la superficie di Bezier + const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nId)) ; + bool bOk = ( pSbz != nullptr) ; + // recupero il riferimento della superficie + Frame3d frSurf ; + bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; + // recupero il riferimento di destinazione + Frame3d frDest ; + bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; + // richiedo i contorni della superficie e li inserisco nel DB + int nFirstId = GDB_ID_NULL ; + int nCount = 0 ; + int nL = 0 ; + PtrOwner pCrv( bOk ? pSbz->GetLoop( nL) : nullptr) ; + while ( ! IsNull( pCrv)) { + // porto la curva nel riferimento destinazione + bOk = bOk && pCrv->LocToLoc( frSurf, frDest) ; + // la inserisco nel DB geometrico + int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrv)) : GDB_ID_NULL) ; + bOk = bOk && ( nNewId != GDB_ID_NULL) ; + // copio il materiale + if ( ! pGeomDB->CopyMaterial( nId, nNewId)) + return GDB_ID_NULL ; + // aggiorno contatori + if ( bOk && nFirstId == GDB_ID_NULL) + nFirstId = nNewId ; + if ( bOk) + ++ nCount ; + // passo alla prossima curva + pCrv.Set( bOk ? pSbz->GetLoop( ++nL) : nullptr) ; + } + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtExtractSurfBezierLoops(" + ToString( nId) + "," + + ToString( nDestGrpId) + ")" + + " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; +} diff --git a/EXE_GdbModifySurf.cpp b/EXE_GdbModifySurf.cpp index fc1dd40..2188141 100644 --- a/EXE_GdbModifySurf.cpp +++ b/EXE_GdbModifySurf.cpp @@ -323,58 +323,6 @@ ExeSurfFrOffset( int nId, double dDist, int nType) return bOk ; } -//---------------------------------------------------------------------------- -int -ExeExtractSurfFrChunkLoops( int nId, int nChunk, int nDestGrpId, int* pnCount) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - // recupero la superficie FlatRegion - const ISurfFlatRegion* pSfr = GetSurfFlatRegion( pGeomDB->GetGeoObj( nId)) ; - bool bOk = ( pSfr != nullptr) ; - // recupero il riferimento della superficie - Frame3d frSurf ; - bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; - // recupero il riferimento di destinazione - Frame3d frDest ; - bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; - // richiedo i contorni del componente connesso (chunk) e li inserisco nel DB - int nFirstId = GDB_ID_NULL ; - int nCount = 0 ; - int nL = 0 ; - PtrOwner pCrv( bOk ? pSfr->GetLoop( nChunk, nL) : nullptr) ; - while ( ! IsNull( pCrv)) { - // porto la curva nel riferimento destinazione - bOk = bOk && pCrv->LocToLoc( frSurf, frDest) ; - // la inserisco nel DB geometrico - int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrv)) : GDB_ID_NULL) ; - bOk = bOk && ( nNewId != GDB_ID_NULL) ; - // copio il materiale - if ( ! pGeomDB->CopyMaterial( nId, nNewId)) - return GDB_ID_NULL ; - // aggiorno contatori - if ( bOk && nFirstId == GDB_ID_NULL) - nFirstId = nNewId ; - if ( bOk) - ++ nCount ; - // passo alla prossima curva - pCrv.Set( bOk ? pSfr->GetLoop( nChunk, ++nL) : nullptr) ; - } - ExeSetModified() ; - // se richiesto, salvo il comando Lua equivalente - if ( IsCmdLog()) { - string sLua = "EgtExtractSurfFrChunkLoops(" + ToString( nId) + "," + - ToString( nChunk) + "," + - ToString( nDestGrpId) + ")" + - " -- Id=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; - LOG_INFO( GetCmdLogger(), sLua.c_str()) ; - } - // restituisco risultati - if ( pnCount != nullptr) - *pnCount = nCount ; - return nFirstId ; -} - //---------------------------------------------------------------------------- bool ExeSurfFrMoveSimpleNoCollision( int nId1, int nId2, const Vector3d& vtDir, double& dLen, int nRefType) @@ -419,212 +367,6 @@ ExeSurfFrRotateSimpleNoCollision( int nId1, int nId2, const Point3d& ptCen, doub return ( bOk && CAvSimpleSurfFrMove( *pSfr1, *pSfr2L).Rotate(ptCenL, dAngDeg)) ; } -//---------------------------------------------------------------------------- -int -ExeExtractSurfTmLoops( int nId, int nDestGrpId, int* pnCount) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - // recupero la superficie TriMesh - const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; - bool bOk = ( pStm != nullptr) ; - // recupero il riferimento della superficie - Frame3d frSurf ; - bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; - // recupero il riferimento di destinazione - Frame3d frDest ; - bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; - // recupero i loop come polilinee - POLYLINEVECTOR vPL ; - bOk = bOk && pStm->GetLoops( vPL) ; - // dalle polilinee creo le curve e le inserisco nel DB - int nFirstId = GDB_ID_NULL ; - int nCount = 0 ; - for ( size_t i = 0 ; i < vPL.size() ; ++ i) { - // creo la curva - PtrOwner pCrvCompo( CreateCurveComposite()) ; - bOk = bOk && pCrvCompo->FromPolyLine( vPL[i]) ; - // la porto nel riferimento destinazione - bOk = bOk && pCrvCompo->LocToLoc( frSurf, frDest) ; - // la inserisco nel DB geometrico - int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCompo)) : GDB_ID_NULL) ; - bOk = bOk && ( nNewId != GDB_ID_NULL) ; - // copio il materiale - if ( ! pGeomDB->CopyMaterial( nId, nNewId)) - return GDB_ID_NULL ; - // aggiorno contatori - if ( bOk && nFirstId == GDB_ID_NULL) - nFirstId = nNewId ; - if ( bOk) - ++ nCount ; - } - ExeSetModified() ; - // se richiesto, salvo il comando Lua equivalente - if ( IsCmdLog()) { - string sLua = "EgtExtractSurfTmLoops(" + ToString( nId) + "," + - ToString( nDestGrpId) + ")" + - " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; - LOG_INFO( GetCmdLogger(), sLua.c_str()) ; - } - // restituisco risultati - if ( pnCount != nullptr) - *pnCount = nCount ; - return nFirstId ; -} - -//---------------------------------------------------------------------------- -int -ExeGetSurfTmSilhouette( int nId, const Vector3d& vtDir, int nDestGrpId, int nRefType, int* pnCount) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - // recupero la superficie TriMesh - const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; - bool bOk = ( pStm != nullptr) ; - // recupero il riferimento della superficie - Frame3d frSurf ; - bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; - // recupero il riferimento di destinazione - Frame3d frDest ; - bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; - // porto in locale alla superficie il versore di riferimento - Vector3d vtDirL = GetVectorLocal( pGeomDB, vtDir, nRefType, frSurf) ; - // recupero i loop come polilinee - POLYLINEVECTOR vPL ; - bOk = bOk && pStm->GetSilhouette( vtDirL, vPL) ; - // dalle polilinee creo le curve e le inserisco nel DB - int nFirstId = GDB_ID_NULL ; - int nCount = 0 ; - for ( size_t i = 0 ; i < vPL.size() ; ++ i) { - // creo la curva - PtrOwner pCrvCompo( CreateCurveComposite()) ; - bOk = bOk && pCrvCompo->FromPolyLine( vPL[i]) ; - // la porto nel riferimento destinazione - bOk = bOk && pCrvCompo->LocToLoc( frSurf, frDest) ; - // la inserisco nel DB geometrico - int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCompo)) : GDB_ID_NULL) ; - bOk = bOk && ( nNewId != GDB_ID_NULL) ; - // copio il materiale - if ( ! pGeomDB->CopyMaterial( nId, nNewId)) - return GDB_ID_NULL ; - // aggiorno contatori - if ( bOk && nFirstId == GDB_ID_NULL) - nFirstId = nNewId ; - if ( bOk) - ++ nCount ; - } - ExeSetModified() ; - // se richiesto, salvo il comando Lua equivalente - if ( IsCmdLog()) { - string sLua = "EgtGetSurfTmSilhouette(" + ToString( nId) + ",{" + - ToString( vtDir) + "}," + - ToString( nDestGrpId) + "," + - RefTypeToString( nRefType) + ")" + - " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; - LOG_INFO( GetCmdLogger(), sLua.c_str()) ; - } - // restituisco risultati - if ( pnCount != nullptr) - *pnCount = nCount ; - return nFirstId ; -} - -//---------------------------------------------------------------------------- -int -ExeExtractSurfTmFacetLoops( int nId, int nFacet, int nDestGrpId, int* pnCount) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - // recupero la superficie TriMesh - const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; - bool bOk = ( pStm != nullptr) ; - // recupero il riferimento della superficie - Frame3d frSurf ; - bOk = bOk && pGeomDB->GetGlobFrame( nId, frSurf) ; - // recupero il riferimento di destinazione - Frame3d frDest ; - bOk = bOk && pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest) ; - // recupero i loop come polilinee - POLYLINEVECTOR vPL ; - bOk = bOk && pStm->GetFacetLoops( nFacet, vPL) ; - // dalle polilinee creo le curve e le inserisco nel DB - int nFirstId = GDB_ID_NULL ; - int nCount = 0 ; - for ( size_t i = 0 ; i < vPL.size() ; ++ i) { - // creo la curva - PtrOwner pCrvCompo( CreateCurveComposite()) ; - bOk = bOk && pCrvCompo->FromPolyLine( vPL[i]) ; - // la porto nel riferimento destinazione - bOk = bOk && pCrvCompo->LocToLoc( frSurf, frDest) ; - // la inserisco nel DB geometrico - int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCrvCompo)) : GDB_ID_NULL) ; - bOk = bOk && ( nNewId != GDB_ID_NULL) ; - // copio il materiale - if ( ! pGeomDB->CopyMaterial( nId, nNewId)) - return GDB_ID_NULL ; - // aggiorno contatori - if ( bOk && nFirstId == GDB_ID_NULL) - nFirstId = nNewId ; - if ( bOk) - ++ nCount ; - } - ExeSetModified() ; - // se richiesto, salvo il comando Lua equivalente - if ( IsCmdLog()) { - string sLua = "EgtExtractSurfTmFacetLoops(" + ToString( nId) + "," + - ToString( nFacet) + "," + - ToString( nDestGrpId) + ")" + - " -- Id1=" + ToString( nFirstId) + ",Nbr=" + ToString( nCount) ; - LOG_INFO( GetCmdLogger(), sLua.c_str()) ; - } - // restituisco risultati - if ( pnCount != nullptr) - *pnCount = nCount ; - return nFirstId ; -} - -//------------------------------------------------------------------------------- -int -ExeCopySurfTmFacet( int nId, int nFacet, int nDestGrpId) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) - // recupero la superficie TriMesh - const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; - if ( pStm == nullptr) - return GDB_ID_NULL ; - // recupero il suo riferimento globale - Frame3d frSurf ; - if ( ! pGeomDB->GetGlobFrame( nId, frSurf)) - return GDB_ID_NULL ; - // recupero il riferimento del gruppo di destinazione - Frame3d frDest ; - if ( ! pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest)) - return GDB_ID_NULL ; - // copio la faccia - PtrOwner pFac( pStm->CloneFacet( nFacet)) ; - if ( IsNull( pFac)) - return GDB_ID_NULL ; - pFac->LocToLoc( frSurf, frDest) ; - // inserisco nel DB - int nFacId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nDestGrpId, GDB_LAST_SON, Release( pFac)) ; - if ( nFacId == GDB_ID_NULL) - return GDB_ID_NULL ; - // copio gli attributi - if ( ! pGeomDB->CopyAttributes( nId, nFacId)) - return GDB_ID_NULL ; - ExeSetModified() ; - // se richiesto, salvo il comando Lua equivalente - if ( IsCmdLog()) { - string sLua = "EgtCopySurfTmFacet(" + ToString( nId) + "," + - ToString( nFacet) + "," + - ToString( nDestGrpId) + ")" + - " -- Id=" + ToString( nFacId) ; - LOG_INFO( GetCmdLogger(), sLua.c_str()) ; - } - return nFacId ; -} - //------------------------------------------------------------------------------- bool ExeSurfTmSwapFacets( int nId, int nFacet1, int nFacet2) @@ -649,38 +391,6 @@ ExeSurfTmSwapFacets( int nId, int nFacet1, int nFacet2) return bOk ; } -//----------------------------------------------------------------------------- -bool -ExeSurfTmGetFacetBBox( int nId, int nFacet, int nFlag, BBox3d& b3Box) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, false) - // recupero la superficie TriMesh - const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; - if ( pStm == nullptr) - return false ; - // recupero il bounding box della faccia dell'oggetto in locale - return pStm->GetFacetLocalBBox( nFacet, b3Box, nFlag) ; -} - -//----------------------------------------------------------------------------- -bool -ExeSurfTmGetFacetBBoxGlob( int nId, int nFacet, int nFlag, BBox3d& b3Box) -{ - IGeomDB* pGeomDB = GetCurrGeomDB() ; - VERIFY_GEOMDB( pGeomDB, false) - // recupero la superficie TriMesh - const ISurfTriMesh* pStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nId)) ; - if ( pStm == nullptr) - return false ; - // recupero il riferimento globale del gruppo cui appartiene - Frame3d frGlob ; - if ( nId != GDB_ID_ROOT && ! pGeomDB->GetGroupGlobFrame( pGeomDB->GetParentId( nId), frGlob)) - return false ; - // recupero il bounding box della faccia dell'oggetto in globale - return pStm->GetFacetBBox( nFacet, frGlob, b3Box, nFlag) ; -} - //------------------------------------------------------------------------------- bool ExeCutSurfTmPlane( int nId, const Point3d& ptOn, const Vector3d& vtN, bool bSaveOnEq, int nRefType) diff --git a/EgtExecutor.vcxproj b/EgtExecutor.vcxproj index 51e8a68..b097df4 100644 --- a/EgtExecutor.vcxproj +++ b/EgtExecutor.vcxproj @@ -150,7 +150,7 @@ copy $(TargetPath) \EgtProg\DllD64 Level3 Use - Full + MaxSpeed true true WIN32;I_AM_EXE;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) @@ -184,7 +184,7 @@ copy $(TargetPath) \EgtProg\Dll32 Level3 Use - Full + MaxSpeed true true WIN32;I_AM_EXE;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) diff --git a/LUA_GdbGetSurf.cpp b/LUA_GdbGetSurf.cpp index 924ebf8..cf57718 100644 --- a/LUA_GdbGetSurf.cpp +++ b/LUA_GdbGetSurf.cpp @@ -585,7 +585,7 @@ LuaExtractSurfTmFacetLoops( lua_State* L) LuaCheckParam( L, 3, nDestGrpId) LuaClearStack( L) ; // recupero i contorni della faccetta della superficie - int nCount ; + int nCount = 0 ; int nNewId = ExeExtractSurfTmFacetLoops( nId, nFacet, nDestGrpId, &nCount) ; // restituisco il risultato if ( nNewId != GDB_ID_NULL) @@ -759,17 +759,19 @@ LuaSurfBezierGetInfo( lua_State* L) LuaClearStack( L) ; // recupero la curva int nDegU, nDegV ; - bool bIsRat ; - bool bOk = ExeSurfBezierGetInfo( nSurfId, nDegU, nDegV, bIsRat) ; + bool bIsRat, bTrimmed ; + bool bOk = ExeSurfBezierGetInfo( nSurfId, nDegU, nDegV, bIsRat, bTrimmed) ; if ( bOk) { LuaSetParam( L, nDegU) ; LuaSetParam( L, nDegV) ; LuaSetParam( L, bIsRat) ; + LuaSetParam( L, bTrimmed) ; } else { LuaSetParam( L) ; LuaSetParam( L) ; LuaSetParam( L) ; + LuaSetParam( L) ; } return 3 ; } @@ -816,6 +818,28 @@ LuaSurfBezierGetControlCurveV( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +static int +LuaExtractSurfBezierLoops( lua_State* L) +{ + // 2 parametri : nId, nDestGrpId + int nId ; + LuaCheckParam( L, 1, nId) + int nDestGrpId ; + LuaCheckParam( L, 2, nDestGrpId) + LuaClearStack( L) ; + // recupero i contorni della superficie + int nCount = 0 ; + int nNewId = ExeExtractSurfBezierLoops( nId, nDestGrpId, &nCount) ; + // restituisco il risultato + if ( nNewId != GDB_ID_NULL) + LuaSetParam( L, nNewId) ; + else + LuaSetParam( L) ; + LuaSetParam( L, nCount) ; + return 2 ; +} + //------------------------------------------------------------------------------- bool LuaInstallGdbGetSurf( LuaMgr& luaMgr) @@ -855,5 +879,6 @@ LuaInstallGdbGetSurf( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetInfo", LuaSurfBezierGetInfo) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetControlCurveU", LuaSurfBezierGetControlCurveU) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfBezierGetControlCurveV", LuaSurfBezierGetControlCurveV) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtExtractSurfBezierLoops", LuaExtractSurfBezierLoops) ; return bOk ; }