c28d250749
- agg. gestione attributi per selezione superfici in shading - EgtSplitCurveCompo è diventata EgtSeparateCurveCompo - aggiunta EgtSplitCurveAtPoint - aggiunta EgtFrameFrom3Points
291 lines
9.7 KiB
C++
291 lines
9.7 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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/EgkCurveComposite.h"
|
|
#include "/EgtDev/Include/EgkDistPointCurve.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)
|
|
// 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)
|
|
// 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 all'inizio
|
|
return ( pCurve->TrimStartEndAtParam( dParS, dParE) ? TRUE : FALSE) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
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 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 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 ;
|
|
// ne recupero il padre
|
|
int nParentId = pGeomDB->GetParentId( nId) ;
|
|
if ( nParentId == GDB_ID_NULL)
|
|
return FALSE ;
|
|
// estraggo tutte le curve
|
|
ICurve* pCrv ;
|
|
while ( ( pCrv = pCompo->RemoveFirstOrLastCurve( false)) != nullptr) {
|
|
// inserisco la curva nello stesso gruppo del GeomDB
|
|
int nCrvId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, 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) ;
|
|
} |