diff --git a/EXE_GdbGetCurve.cpp b/EXE_GdbGetCurve.cpp index 1a1a620..687341f 100644 --- a/EXE_GdbGetCurve.cpp +++ b/EXE_GdbGetCurve.cpp @@ -679,36 +679,77 @@ ExeCurveCompoNormVersor( int nId, int nSimpCrv, int nRefId, Vector3d& vtNorm) return TransformVector( pGeomDB, nId, nRefId, vtNorm) ; } - //---------------------------------------------------------------------------- -bool +int ExeShowCurveBezierControlPoints( int nCrvId, int* pnCount) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, false) // recupero la curva di bezier - const ICurveBezier* pCrvBezier = GetCurveBezier( pGeomDB->GetGeoObj( nCrvId)) ; - if ( pCrvBezier == nullptr || pCrvBezier->GetType() != CRV_BEZIER) - return false ; - int nParent = pGeomDB->GetParentId( nCrvId) ; - int nDeg = pCrvBezier->GetDegree() ; - bool bRat = pCrvBezier->IsRational() ; - int nFirstId = -1 ; - int nCount = 0 ; - for ( int i = 0 ; i < nDeg + 1 ; ++i) { - IGeoPoint3d* pGeoPt( CreateGeoPoint3d()) ; - if ( ! bRat) - pGeoPt->Set( pCrvBezier->GetControlPoint( i)) ; - else - pGeoPt->Set( pCrvBezier->GetControlPoint( i) * pCrvBezier->GetControlWeight( i)) ; - int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParent, pGeoPt) ; - if ( nFirstId == GDB_ID_NULL) - nFirstId = nId ; - if ( nId != GDB_ID_NULL) - ++nCount ; + IGeoObj* pGeoObj = pGeomDB->GetGeoObj( nCrvId) ; + int nType = pGeoObj->GetType() ; + if ( nType == CRV_COMPO) { + const ICurveComposite* pCrvCompo = GetCurveComposite( pGeoObj) ; + if ( pCrvCompo == nullptr) + return false ; + int nParent = pGeomDB->GetParentId( nCrvId) ; + int nFirstId = -1 ; + int nCount = 0 ; + for ( int i = 0 ; i < pCrvCompo->GetCurveCount() ; ++i) { + const ICurveBezier* pCrvBezier = GetCurveBezier( pCrvCompo->GetCurve(i)) ; + if ( pCrvBezier == nullptr) { + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; + } + int nDeg = pCrvBezier->GetDegree() ; + //bool bRat = pCrvBezier->IsRational() ; + for ( int i = 0 ; i < nDeg + 1 ; ++i) { + IGeoPoint3d* pGeoPt( CreateGeoPoint3d()) ; + //if ( ! bRat) + // pGeoPt->Set( pCrvBezier->GetControlPoint( i)) ; + //else + // pGeoPt->Set( pCrvBezier->GetControlPoint( i) * pCrvBezier->GetControlWeight( i)) ; + pGeoPt->Set( pCrvBezier->GetControlPoint( i)) ; + int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParent, pGeoPt) ; + if ( nFirstId == GDB_ID_NULL) + nFirstId = nId ; + if ( nId != GDB_ID_NULL) + ++nCount ; + } + } + // restituisco i risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; } - // restituisco i risultati - if ( pnCount != nullptr) - *pnCount = nCount ; - return nFirstId ; + else if ( nType == CRV_BEZIER) { + const ICurveBezier* pCrvBezier = GetCurveBezier( pGeoObj) ; + if ( pCrvBezier == nullptr) + return false ; + int nParent = pGeomDB->GetParentId( nCrvId) ; + int nDeg = pCrvBezier->GetDegree() ; + //bool bRat = pCrvBezier->IsRational() ; + int nFirstId = -1 ; + int nCount = 0 ; + for ( int i = 0 ; i < nDeg + 1 ; ++i) { + IGeoPoint3d* pGeoPt( CreateGeoPoint3d()) ; + //if ( ! bRat) + // pGeoPt->Set( pCrvBezier->GetControlPoint( i)) ; + //else + // pGeoPt->Set( pCrvBezier->GetControlPoint( i) * pCrvBezier->GetControlWeight( i)) ; + pGeoPt->Set( pCrvBezier->GetControlPoint( i)) ; + int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParent, pGeoPt) ; + if ( nFirstId == GDB_ID_NULL) + nFirstId = nId ; + if ( nId != GDB_ID_NULL) + ++nCount ; + } + // restituisco i risultati + if ( pnCount != nullptr) + *pnCount = nCount ; + return nFirstId ; + } + else + return GDB_ID_NULL ; } \ No newline at end of file