EgtInterface 1.6c5 :

- aggiunte funzioni per raccordi e smussi di curve.
This commit is contained in:
Dario Sassi
2015-03-20 08:32:23 +00:00
parent e9f0822fbe
commit 80845befdc
3 changed files with 199 additions and 0 deletions
+127
View File
@@ -31,6 +31,7 @@
#include "/EgtDev/Include/EgkArcSpecial.h"
#include "/EgtDev/Include/EgkArcPntDirTgCurve.h"
#include "/EgtDev/Include/EgkArcCenTgCurvePnt.h"
#include "/EgtDev/Include/EgkFilletChamfer.h"
#include "/EgtDev/Include/EgkCurveBezier.h"
#include "/EgtDev/Include/EgkCurveComposite.h"
#include "/EgtDev/Include/EgkChainCurves.h"
@@ -1061,6 +1062,132 @@ __stdcall EgtCreateCurveArc2PVNEx( int nParentId, const double ptStart[3],
return nNewId ;
}
//-------------------------------------------------------------------------------
int
__stdcall EgtCreateCurveFillet( int nParentId, int nCrv1, const double ptNear1[3],
int nCrv2, const double ptNear2[3],
const double vtNorm[3], double dRad, BOOL bTrim, int nRefType)
{
IGeomDB* pGeomDB = GetCurrGeomDB() ;
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
// creo l'arco
PtrOwner<ICurveArc> pArc ;
bool bOk = true ;
// recupero il riferimento locale
Frame3d frLoc ;
bOk = bOk && pGeomDB->GetGroupGlobFrame( nParentId, frLoc) ;
// porto in locale i punti, i versori e il versore estrusione
Point3d ptNear1L = GetPointLocal( pGeomDB, ptNear1, nRefType, frLoc) ;
Point3d ptNear2L = GetPointLocal( pGeomDB, ptNear2, nRefType, frLoc) ;
Vector3d vtNormL = GetVectorLocal( pGeomDB, vtNorm, nRefType, frLoc) ;
Vector3d vtExtrL = GetVectorLocal( pGeomDB, Z_AX.v, nRefType, frLoc) ;
// recupero la copia locale delle curve
CurveLocal CrvLoc1( pGeomDB, nCrv1, frLoc) ;
CurveLocal CrvLoc2( pGeomDB, nCrv2, frLoc) ;
// calcolo il raccordo
double dTrim1, dTrim2 ;
pArc.Set( CreateFillet( *CrvLoc1.Get(), ptNear1L, *CrvLoc2.Get(), ptNear2L, vtNormL, dRad, dTrim1, dTrim2)) ;
bOk = bOk && ! IsNull( pArc) ;
// assegno il versore estrusione
bOk = bOk && pArc->SetExtrusion( vtExtrL) ;
// inserisco l'arco nel DB
int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pArc)) : GDB_ID_NULL) ;
// se richiesto trim
if ( nNewId != GDB_ID_NULL && bTrim) {
// recupero e aggiusto la prima curva
ICurve* pCrv1 = GetCurve( pGeomDB->GetGeoObj( nCrv1)) ;
if ( dTrim1 > EPS_ZERO)
pCrv1->TrimStartAtParam( dTrim1) ;
else if ( dTrim1 < - EPS_ZERO)
pCrv1->TrimEndAtParam( fabs( dTrim1)) ;
// recupero e aggiusto la seconda curva
ICurve* pCrv2 = GetCurve( pGeomDB->GetGeoObj( nCrv2)) ;
if ( dTrim2 > EPS_ZERO)
pCrv2->TrimStartAtParam( dTrim2) ;
else if ( dTrim2 < - EPS_ZERO)
pCrv2->TrimEndAtParam( fabs( dTrim2)) ;
}
EgtSetModified() ;
// se richiesto, salvo il comando Lua equivalente
if ( IsCmdLog()) {
string sLua = "EgtCurveFillet(" + ToString( nParentId) + "," +
ToString( nCrv1) + ",{" +
ToString( Point3d( ptNear1)) + "}," +
ToString( nCrv2) + ",{" +
ToString( Point3d( ptNear2)) + "},{" +
ToString( Vector3d( vtNorm)) + "}," +
ToString( dRad) + "," +
( bTrim ? "true" : "false") + "," +
RefTypeToString( nRefType) + ")" +
" -- Id=" + ToString( nNewId) ;
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
}
return nNewId ;
}
//-------------------------------------------------------------------------------
int
__stdcall EgtCreateCurveChamfer( int nParentId, int nCrv1, const double ptNear1[3],
int nCrv2, const double ptNear2[3],
const double vtNorm[3], double dDist, BOOL bTrim, int nRefType)
{
IGeomDB* pGeomDB = GetCurrGeomDB() ;
VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL)
// creo la linea
PtrOwner<ICurveLine> pLine ;
bool bOk = true ;
// recupero il riferimento locale
Frame3d frLoc ;
bOk = bOk && pGeomDB->GetGroupGlobFrame( nParentId, frLoc) ;
// porto in locale i punti, i versori e il versore estrusione
Point3d ptNear1L = GetPointLocal( pGeomDB, ptNear1, nRefType, frLoc) ;
Point3d ptNear2L = GetPointLocal( pGeomDB, ptNear2, nRefType, frLoc) ;
Vector3d vtNormL = GetVectorLocal( pGeomDB, vtNorm, nRefType, frLoc) ;
Vector3d vtExtrL = GetVectorLocal( pGeomDB, Z_AX.v, nRefType, frLoc) ;
// recupero la copia locale delle curve
CurveLocal CrvLoc1( pGeomDB, nCrv1, frLoc) ;
CurveLocal CrvLoc2( pGeomDB, nCrv2, frLoc) ;
// calcolo lo smusso
double dTrim1, dTrim2 ;
pLine.Set( CreateChamfer( *CrvLoc1.Get(), ptNear1L, *CrvLoc2.Get(), ptNear2L, vtNormL, dDist, dTrim1, dTrim2)) ;
bOk = bOk && ! IsNull( pLine) ;
// assegno il versore estrusione
bOk = bOk && pLine->SetExtrusion( vtExtrL) ;
// inserisco l'arco nel DB
int nNewId = ( bOk ? pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pLine)) : GDB_ID_NULL) ;
// se richiesto trim
if ( nNewId != GDB_ID_NULL && bTrim) {
// recupero e aggiusto la prima curva
ICurve* pCrv1 = GetCurve( pGeomDB->GetGeoObj( nCrv1)) ;
if ( dTrim1 > EPS_ZERO)
pCrv1->TrimStartAtParam( dTrim1) ;
else if ( dTrim1 < - EPS_ZERO)
pCrv1->TrimEndAtParam( fabs( dTrim1)) ;
// recupero e aggiusto la seconda curva
ICurve* pCrv2 = GetCurve( pGeomDB->GetGeoObj( nCrv2)) ;
if ( dTrim2 > EPS_ZERO)
pCrv2->TrimStartAtParam( dTrim2) ;
else if ( dTrim2 < - EPS_ZERO)
pCrv2->TrimEndAtParam( fabs( dTrim2)) ;
}
EgtSetModified() ;
// se richiesto, salvo il comando Lua equivalente
if ( IsCmdLog()) {
string sLua = "EgtCurveChamfer(" + ToString( nParentId) + "," +
ToString( nCrv1) + ",{" +
ToString( Point3d( ptNear1)) + "}," +
ToString( nCrv2) + ",{" +
ToString( Point3d( ptNear2)) + "},{" +
ToString( Vector3d( vtNorm)) + "}," +
ToString( dDist) + "," +
( bTrim ? "true" : "false") + "," +
RefTypeToString( nRefType) + ")" +
" -- Id=" + ToString( nNewId) ;
LOG_INFO( GetCmdLogger(), sLua.c_str()) ;
}
return nNewId ;
}
//-------------------------------------------------------------------------------
int
__stdcall EgtCreateCurveBezier( int nParentId, int nDegree, const double ptCtrls[], int nRefType)