//---------------------------------------------------------------------------- // EgalTech 2014-2014 //---------------------------------------------------------------------------- // File : API_ModifyCurve.cpp Data : 03.10.14 Versione : 1.5i5 // Contenuto : Funzioni di modifica delle curve per API. // // // // Modifiche : 03.10.14 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "API.h" #include "API_Macro.h" #include "/EgtDev/Include/EInAPI.h" #include "/EgtDev/Include/EGkCurve.h" #include "/EgtDev/Include/EGkCurveArc.h" #include "/EgtDev/Include/EGkCurveBezier.h" #include "/EgtDev/Include/EGkCurveComposite.h" #include "/EgtDev/Include/EGkDistPointCurve.h" #include "/EgtDev/Include/EGkExtTExt.h" #include "/EgtDev/Include/EGkGdbIterator.h" #include "/EgtDev/Include/EgtPointerOwner.h" //---------------------------------------------------------------------------- BOOL __stdcall EgtInvertCurve( int nId) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // la inverto return ( pCurve->Invert() ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtModifyCurveStartPoint( int nId, const double ptP[3]) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // ne modifico il punto iniziale return ( pCurve->ModifyStart( ptP) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtModifyCurveEndPoint( int nId, const double ptP[3]) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // ne modifico il punto finale return ( pCurve->ModifyEnd( ptP) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtModifyCurveExtrusion( int nId, const double vtExtr[3]) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // se gruppo, agisco sulle sole curve componenti if ( pGeomDB->GetGdbType( nId) == GDB_TY_GROUP) { PtrOwner pIter( CreateGdbIterator( pGeomDB)) ; if ( IsNull( pIter)) return FALSE ; bool bOk = true ; Vector3d vtVE( vtExtr) ; for ( bool bFound = pIter->GoToFirstInGroup( nId) ; bFound ; bFound = pIter->GoToNext()) { // recupero la curva e ne modifico il vettore estrusione ICurve* pCurve = GetCurve( pIter->GetGeoObj()) ; if ( pCurve != nullptr && ! pCurve->SetExtrusion( vtVE)) bOk = false ; } return ( bOk ? TRUE : FALSE) ; } // se oggetto geometrico else { // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // ne modifico il vettore estrusione return ( pCurve->SetExtrusion( Vector3d( vtExtr)) ? TRUE : FALSE) ; } } //---------------------------------------------------------------------------- BOOL __stdcall EgtModifyCurveThickness( int nId, double dThick) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // se gruppo, agisco sulle sole curve componenti if ( pGeomDB->GetGdbType( nId) == GDB_TY_GROUP) { PtrOwner pIter( CreateGdbIterator( pGeomDB)) ; if ( IsNull( pIter)) return FALSE ; bool bOk = true ; for ( bool bFound = pIter->GoToFirstInGroup( nId) ; bFound ; bFound = pIter->GoToNext()) { // recupero la curva e ne modifico lo spessore ICurve* pCurve = GetCurve( pIter->GetGeoObj()) ; if ( pCurve != nullptr && ! pCurve->SetThickness( dThick)) bOk = false ; } return ( bOk ? TRUE : FALSE) ; } // se oggetto geometrico else { // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // ne modifico lo spessore return ( pCurve->SetThickness( dThick) ? TRUE : FALSE) ; } } //---------------------------------------------------------------------------- BOOL __stdcall EgtTrimCurveStartAtLen( int nId, double dLen) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // taglio la curva all'inizio return ( pCurve->TrimStartAtLen( dLen) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtTrimCurveEndAtLen( int nId, double dLen) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // taglio la curva alla fine return ( pCurve->TrimEndAtLen( dLen) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtTrimCurveStartAtParam( int nId, double dPar) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // taglio la curva all'inizio return ( pCurve->TrimStartAtParam( dPar) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtTrimCurveEndAtParam( int nId, double dPar) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // taglio la curva alla fine return ( pCurve->TrimEndAtParam( dPar) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtTrimCurveStartEndAtParam( int nId, double dParS, double dParE) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // taglio la curva agli estremi return ( pCurve->TrimStartEndAtParam( dParS, dParE) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtExtendCurveStartByLen( int nId, double dLen) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // estendo la curva all'inizio return ( pCurve->ExtendStartByLen( dLen) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtExtendCurveEndByLen( int nId, double dLen) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // estendo la curva alla fine return ( pCurve->ExtendEndByLen( dLen) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtTrimExtendCurveByLen( int nId, double dLen, const double ptNear[3]) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // cerco l'estremo pił vicino al punto passato Point3d ptStart, ptEnd ; if ( ! pCurve->GetStartPoint( ptStart) || ! pCurve->GetEndPoint( ptEnd)) return FALSE ; if ( SqDist( ptStart, ptNear) < SqDist( ptEnd, ptNear)) { if ( dLen < - EPS_SMALL) return ( pCurve->TrimStartAtLen( - dLen) ? TRUE : FALSE) ; else if ( dLen > EPS_SMALL) return ( pCurve->ExtendStartByLen( dLen) ? TRUE : FALSE) ; else return TRUE ; } else { if ( dLen < - EPS_SMALL) { double dCrvLen ; if ( ! pCurve->GetLength( dCrvLen)) return FALSE ; return ( pCurve->TrimEndAtLen( dCrvLen + dLen) ? TRUE : FALSE) ; } else if ( dLen > EPS_SMALL) return ( pCurve->ExtendEndByLen( dLen) ? TRUE : FALSE) ; else return TRUE ; } } //---------------------------------------------------------------------------- BOOL __stdcall EgtSplitCurveAtPoint( int nId, double ptOn[3]) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, FALSE) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // determino la posizione parametrica del punto sulla curva (con tolleranza) DistPointCurve dstPC( ptOn, *pCurve) ; int nFlag ; double dU ; if ( ! dstPC.GetParamAtMinDistPoint( 0, dU, nFlag) || nFlag != MDPCI_NORMAL) return FALSE ; // copio la curva int nCopyId = pGeomDB->Copy( nId, GDB_ID_NULL, nId, GDB_AFTER) ; if ( nCopyId == GDB_ID_NULL) return FALSE ; // tengo la prima parte dell'originale e la seconda parte della copia if ( ! pCurve->TrimEndAtParam( dU)) return false ; return ( EgtTrimCurveStartAtParam( nCopyId, dU) ? TRUE : FALSE) ; } //---------------------------------------------------------------------------- BOOL __stdcall EgtOffsetCurve( int nId, double dDist, int nType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, FALSE) // recupero la curva ICurve* pCurve = GetCurve( pGeomDB->GetGeoObj( nId)) ; if ( pCurve == nullptr) return FALSE ; // eseguo l'offset return ( pCurve->SimpleOffset( dDist, nType) ? TRUE : FALSE) ; } //------------------------------------------------------------------------------- BOOL __stdcall EgtModifyCurveCircleCPN( int nId, const double ptOn[3]) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, FALSE) // recupero l'arco e i suoi dati ICurveArc* pArc = GetCurveArc( pGeomDB->GetGeoObj( nId)) ; if ( pArc == nullptr) return FALSE ; Point3d ptCen = pArc->GetCenter() ; Vector3d vtN = pArc->GetNormVersor() ; double dOldRad = pArc->GetRadius() ; // calcolo il nuovo raggio double dRad = (( Point3d( ptOn) - ptCen) ^ vtN).Len() ; // imposto il nuovo raggio if ( pArc->Set( ptCen, vtN, dRad)) return TRUE ; // in caso di errore, ripristino i vecchi dati else { pArc->Set( ptCen, vtN, dOldRad) ; return FALSE ; } } //------------------------------------------------------------------------------- BOOL __stdcall EgtModifyCurveArcRadius( int nId, double dRad) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, FALSE) // recupero l'arco e i suoi dati ICurveArc* pArc = GetCurveArc( pGeomDB->GetGeoObj( nId)) ; if ( pArc == nullptr) return FALSE ; double dOldRad = pArc->GetRadius() ; // imposto il nuovo raggio if ( pArc->ChangeRadius( dRad)) return TRUE ; // in caso di errore, ripristino i vecchi dati else { pArc->ChangeRadius( dOldRad) ; return FALSE ; } } //------------------------------------------------------------------------------- BOOL __stdcall EgtModifyCurveArcC2PN( int nId, const double ptEnd[3]) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, FALSE) // recupero l'arco e i suoi dati ICurveArc* pArc = GetCurveArc( pGeomDB->GetGeoObj( nId)) ; if ( pArc == nullptr) return FALSE ; Point3d ptCen = pArc->GetCenter() ; Vector3d vtN = pArc->GetNormVersor() ; Point3d ptStart, ptOldEnd ; if ( ! pArc->GetStartPoint( ptStart) || ! pArc->GetEndPoint( ptOldEnd)) return FALSE ; // imposto il nuovo punto finale if ( pArc->SetC2PN( ptCen, ptStart, ptEnd, vtN)) return TRUE ; // in caso di errore, ripristino i vecchi dati else { pArc->SetC2PN( ptCen, ptStart, ptOldEnd, vtN) ; return FALSE ; } } //------------------------------------------------------------------------------- BOOL __stdcall EgtModifyCurveArc3P( int nId, const double ptMid[3]) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, FALSE) // recupero l'arco e i suoi punti notevoli ICurveArc* pArc = GetCurveArc( pGeomDB->GetGeoObj( nId)) ; if ( pArc == nullptr) return FALSE ; Point3d ptStart, ptOldMid, ptEnd ; if ( ! pArc->GetStartPoint( ptStart) || ! pArc->GetMidPoint( ptOldMid) || ! pArc->GetEndPoint( ptEnd)) return false ; // imposto il nuovo punto medio if ( pArc->Set3P( ptStart, ptMid, ptEnd)) return TRUE ; // in caso di errore, ripristino i vecchi dati else { pArc->Set3P( ptStart, ptOldMid, ptEnd) ; return FALSE ; } } //------------------------------------------------------------------------------- BOOL __stdcall EgtSeparateCurveCompo( int nId) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, FALSE) // recupero la curva composita ICurveComposite* pCompo = GetCurveComposite( pGeomDB->GetGeoObj( nId)) ; if ( pCompo == nullptr) return FALSE ; // estraggo tutte le curve ICurve* pCrv ; while ( ( pCrv = pCompo->RemoveFirstOrLastCurve( false)) != nullptr) { // inserisco la curva nello stesso gruppo e nello stesso posto del GeomDB int nCrvId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, pCrv) ; if ( nCrvId == GDB_ID_NULL) return FALSE ; // copio gli attributi if ( ! pGeomDB->CopyAttributes( nId, nCrvId)) return FALSE ; } // elimino la curva composita ormai vuota return ( pGeomDB->Erase( nId) ? TRUE : FALSE) ; } //------------------------------------------------------------------------------- BOOL __stdcall EgtExplodeCurveBezier( int nId, double dLinTol, BOOL bArcsVsLines) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, FALSE) // recupero la curva di Bezier ICurveBezier* pCBezier = GetCurveBezier( pGeomDB->GetGeoObj( nId)) ; if ( pCBezier == nullptr) return FALSE ; // eseguo l'approssimazione const double ANG_TOL_STD_DEG = 15 ; PtrOwner pCC( CreateCurveComposite()) ; if ( IsNull( pCC)) return FALSE ; if ( bArcsVsLines) { // con bi-archi PolyArc PA ; if ( ! pCBezier->ApproxWithArcs( dLinTol, ANG_TOL_STD_DEG, PA) || ! pCC->FromPolyArc( PA)) return FALSE ; } else { // con linee PolyLine PL ; if ( ! pCBezier->ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, PL) || ! pCC->FromPolyLine( PL)) return FALSE ; } // inserisco le curve elementari nel DB ICurve* pCrv ; while ( ( pCrv = pCC->RemoveFirstOrLastCurve( false)) != nullptr) { // inserisco la curva nello stesso gruppo e nello stesso posto del GeomDB int nCrvId = pGeomDB->InsertGeoObj( GDB_ID_NULL, nId, GDB_BEFORE, pCrv) ; if ( nCrvId == GDB_ID_NULL) return FALSE ; // copio gli attributi if ( ! pGeomDB->CopyAttributes( nId, nCrvId)) return FALSE ; } // elimino la curva di Bezier return ( pGeomDB->Erase( nId) ? TRUE : FALSE) ; }