From 80845befdc56ffa0ac53628be01b5057be7e235e Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 20 Mar 2015 08:32:23 +0000 Subject: [PATCH] EgtInterface 1.6c5 : - aggiunte funzioni per raccordi e smussi di curve. --- API_GdbCreateCurve.cpp | 127 +++++++++++++++++++++++++++++++++++++++++ EgtInterface.rc | Bin 11718 -> 11718 bytes LUA_GdbCreateCurve.cpp | 72 +++++++++++++++++++++++ 3 files changed, 199 insertions(+) diff --git a/API_GdbCreateCurve.cpp b/API_GdbCreateCurve.cpp index 4f68aa3..e63d9d5 100644 --- a/API_GdbCreateCurve.cpp +++ b/API_GdbCreateCurve.cpp @@ -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 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 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) diff --git a/EgtInterface.rc b/EgtInterface.rc index 47233dd51c77b1605c6045b0f1630517996568b1..fa1303def88563ce04d7be002fc8a9fabacedd4b 100644 GIT binary patch delta 111 zcmX>WeJpyzFE&Qg%^&$rGEF|hS;uHP`Jtfh<^rw;7OzIAO+TQQ4Xt~E@c}o08AGs#sB~S delta 111 zcmX>WeJpyzFE&P#%^&$rGEF|hS;uHH`Jtfh<^rw;7OzIAO+TQQ4Xt~E@c}o07@$;z5oCK diff --git a/LUA_GdbCreateCurve.cpp b/LUA_GdbCreateCurve.cpp index fb9f05e..00211bd 100644 --- a/LUA_GdbCreateCurve.cpp +++ b/LUA_GdbCreateCurve.cpp @@ -423,6 +423,76 @@ LuaCreateCurveArc2PVNEx( lua_State* L) return 1 ; } +//------------------------------------------------------------------------------- +static int +LuaCreateCurveFillet( lua_State* L) +{ + // 8 o 9 parametri : ParentId, nCrv1, PtNear1, nCrv2, PtNear2, VtNorm, dRad, bTrim [, sRefType] + int nParentId ; + LuaCheckParam( L, 1, nParentId) + int nCrv1 ; + LuaCheckParam( L, 2, nCrv1) + Point3d ptNear1 ; + LuaCheckParam( L, 3, ptNear1) + int nCrv2 ; + LuaCheckParam( L, 4, nCrv2) + Point3d ptNear2 ; + LuaCheckParam( L, 5, ptNear2) + Vector3d vtNorm ; + LuaCheckParam( L, 6, vtNorm) + double dRad ; + LuaCheckParam( L, 7, dRad) + bool bTrim ; + LuaCheckParam( L, 8, bTrim) + int nRefType = RTY_DEFAULT ; + LuaGetRefType( L, 9, nRefType) ; + LuaClearStack( L) ; + // creo l'arco di fillet + int nId = EgtCreateCurveFillet( nParentId, nCrv1, ptNear1.v, nCrv2, ptNear2.v, + vtNorm.v, dRad, bTrim, nRefType) ; + // restituisco il risultato + if ( nId != GDB_ID_NULL) + LuaSetReturn( L, nId) ; + else + LuaSetReturn( L) ; + return 1 ; +} + +//------------------------------------------------------------------------------- +static int +LuaCreateCurveChamfer( lua_State* L) +{ + // 8 o 9 parametri : ParentId, nCrv1, PtNear1, nCrv2, PtNear2, VtNorm, dDist, bTrim [, sRefType] + int nParentId ; + LuaCheckParam( L, 1, nParentId) + int nCrv1 ; + LuaCheckParam( L, 2, nCrv1) + Point3d ptNear1 ; + LuaCheckParam( L, 3, ptNear1) + int nCrv2 ; + LuaCheckParam( L, 4, nCrv2) + Point3d ptNear2 ; + LuaCheckParam( L, 5, ptNear2) + Vector3d vtNorm ; + LuaCheckParam( L, 6, vtNorm) + double dDist ; + LuaCheckParam( L, 7, dDist) + bool bTrim ; + LuaCheckParam( L, 8, bTrim) + int nRefType = RTY_DEFAULT ; + LuaGetRefType( L, 9, nRefType) ; + LuaClearStack( L) ; + // creo l'arco di fillet + int nId = EgtCreateCurveChamfer( nParentId, nCrv1, ptNear1.v, nCrv2, ptNear2.v, + vtNorm.v, dDist, bTrim, nRefType) ; + // restituisco il risultato + if ( nId != GDB_ID_NULL) + LuaSetReturn( L, nId) ; + else + LuaSetReturn( L) ; + return 1 ; +} + //------------------------------------------------------------------------------- static int LuaCreateCurveBezier( lua_State* L) @@ -755,6 +825,8 @@ LuaInstallGdbCreateCurve( lua_State* L) lua_register( L, "EgtArc3P", LuaCreateCurveArc3P) ; lua_register( L, "EgtArc2PVN", LuaCreateCurveArc2PVN) ; lua_register( L, "EgtArc2PVNEx", LuaCreateCurveArc2PVNEx) ; + lua_register( L, "EgtCurveFillet", LuaCreateCurveFillet) ; + lua_register( L, "EgtCurveChamfer", LuaCreateCurveChamfer) ; lua_register( L, "EgtCurveBezier", LuaCreateCurveBezier) ; lua_register( L, "EgtCurveBezierRat", LuaCreateCurveBezierRational) ; lua_register( L, "EgtCurveBezierFromArc", LuaCreateCurveBezierFromArc) ;