From 130f40d2bc74db3e3962a5262f8b917c74adeed5 Mon Sep 17 00:00:00 2001 From: DarioS Date: Sun, 21 Aug 2022 16:20:34 +0200 Subject: [PATCH] EgtExecutor 2.4h2 : - aggiunte funzioni Exe e Lua CreateCircle2P - in ExeCreateCurveFillet migliorato trim celle parti rimanenti arrivando anche a cancellazione - estesa ExeModifyArcRadius per modificare raggio di arco mantenendo gli estremi oppure no da parametro bKeepCenter (default true). --- EXE_GdbCreateCurve.cpp | 75 +++++++++++++++++++++++++++++++++++------ EXE_GdbModifyCurve.cpp | 63 ++++++++++++++++++++++++++++------ EgtExecutor.rc | Bin 18890 -> 18890 bytes LUA_GdbCreateCurve.cpp | 25 ++++++++++++++ LUA_GdbModifyCurve.cpp | 6 ++-- 5 files changed, 146 insertions(+), 23 deletions(-) diff --git a/EXE_GdbCreateCurve.cpp b/EXE_GdbCreateCurve.cpp index e7b11f9..850345c 100644 --- a/EXE_GdbCreateCurve.cpp +++ b/EXE_GdbCreateCurve.cpp @@ -29,6 +29,7 @@ #include "/EgtDev/Include/EGkLineTgCurvePerpCurve.h" #include "/EgtDev/Include/EGkCurveArc.h" #include "/EgtDev/Include/EGkCircleCenTgCurve.h" +#include "/EgtDev/Include/EGkCircle2P.h" #include "/EgtDev/Include/EGkArcSpecial.h" #include "/EgtDev/Include/EGkArcPntDirTgCurve.h" #include "/EgtDev/Include/EGkArcCenTgCurvePnt.h" @@ -764,6 +765,44 @@ ExeCreateCircleCPEx( int nParentId, const Point3d& ptCen, return nNewId ; } +//------------------------------------------------------------------------------- +int +ExeCreateCircle2P( int nParentId, const Point3d& ptP1, const Point3d& ptP2, int nRefType) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) + nParentId = AdjustId( nParentId) ; + // recupero il riferimento locale + Frame3d frLoc ; + if ( ! pGeomDB->GetGroupGlobFrame( nParentId, frLoc)) + return GDB_ID_NULL ; + // porto in locale i punti e i versori + Point3d ptP1L = GetPointLocal( pGeomDB, ptP1, nRefType, frLoc) ; + Point3d ptP2L = GetPointLocal( pGeomDB, ptP2, nRefType, frLoc) ; + Vector3d vtNL = GetVectorLocal( pGeomDB, Z_AX, nRefType, frLoc) ; + Vector3d vtExtrL = GetVectorLocal( pGeomDB, Z_AX, nRefType, frLoc) ; + // calcolo la circonferenza + PtrOwner pCrvArc( GetCircle2P( ptP1L, ptP2L, vtNL)) ; + if ( IsNull( pCrvArc)) + return GDB_ID_NULL ; + // assegno il versore estrusione + pCrvArc->SetExtrusion( vtExtrL) ; + // inserisco l'arco nel DB + int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nParentId, Release( pCrvArc)) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtCircle2P(" + IdToString( nParentId) + ",{" + + ToString( ptP1) + "}," + + ToString( ptP2) + "," + + RefTypeToString( nRefType) + ")" + + " -- Id=" + ToString( nId) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco l'identificativo della nuova entità + return nId ; +} + //------------------------------------------------------------------------------- int ExeCreateCircle3P( int nParentId, const Point3d& ptP1, @@ -1293,18 +1332,34 @@ ExeCreateCurveFillet( int nParentId, int nCrv1, const Point3d& ptNear1, 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 + // recupero prima curva ICurve* pCrv1 = GetCurve( pGeomDB->GetGeoObj( nCrv1)) ; - if ( dTrim1 > EPS_ZERO) - pCrv1->TrimStartAtParam( dTrim1) ; - else if ( dTrim1 < - EPS_ZERO) - pCrv1->TrimEndAtParam( abs( dTrim1)) ; - // recupero e aggiusto la seconda curva + double dLen1 = 0 ; pCrv1->GetLength( dLen1) ; + double dParS1 = 0, dParE1 = 1 ; pCrv1->GetDomain( dParS1, dParE1) ; + // se prima curva da eliminare + if ( abs( abs( dTrim1) - dParE1) * dLen1 < EPS_SMALL || abs( abs( dTrim1) - dParS1) * dLen1 < EPS_SMALL) + pGeomDB->Erase( nCrv1) ; + // altrimenti da trimmare + else { + if ( dTrim1 > EPS_ZERO) + pCrv1->TrimStartAtParam( dTrim1) ; + else if ( dTrim1 < - EPS_ZERO) + pCrv1->TrimEndAtParam( abs( dTrim1)) ; + } + // recupero seconda curva ICurve* pCrv2 = GetCurve( pGeomDB->GetGeoObj( nCrv2)) ; - if ( dTrim2 > EPS_ZERO) - pCrv2->TrimStartAtParam( dTrim2) ; - else if ( dTrim2 < - EPS_ZERO) - pCrv2->TrimEndAtParam( abs( dTrim2)) ; + double dLen2 = 0 ; pCrv2->GetLength( dLen2) ; + double dParS2 = 0, dParE2 = 1 ; pCrv2->GetDomain( dParS2, dParE2) ; + // se seconda curva da eliminare + if ( abs( abs( dTrim2) - dParE2) * dLen2 < EPS_SMALL || abs( abs( dTrim2) - dParS2) * dLen2 < EPS_SMALL) + pGeomDB->Erase( nCrv2) ; + // altrimenti da trimmare + else { + if ( dTrim2 > EPS_ZERO) + pCrv2->TrimStartAtParam( dTrim2) ; + else if ( dTrim2 < - EPS_ZERO) + pCrv2->TrimEndAtParam( abs( dTrim2)) ; + } } ExeSetModified() ; // se richiesto, salvo il comando Lua equivalente diff --git a/EXE_GdbModifyCurve.cpp b/EXE_GdbModifyCurve.cpp index c2081d7..a7669cb 100644 --- a/EXE_GdbModifyCurve.cpp +++ b/EXE_GdbModifyCurve.cpp @@ -1325,7 +1325,7 @@ ExeModifyCircle3P( int nId, const Point3d& ptP1, const Point3d& ptP2, const Poin // creo l'arco PtrOwner pCrvArc( CreateCurveArc()) ; if ( IsNull( pCrvArc)) - return GDB_ID_NULL ; + return false ; // recupero il riferimento locale Frame3d frLoc ; if ( ! pGeomDB->GetGlobFrame( nId, frLoc)) @@ -1348,24 +1348,65 @@ ExeModifyCircle3P( int nId, const Point3d& ptP1, const Point3d& ptP2, const Poin } //------------------------------------------------------------------------------- -bool -ExeModifyArcRadius( int nId, double dRad) +static bool +MyModifyArcRadius( IGeomDB* pGeomDB, 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 pArc->ChangeRadius( dRad) ; +} + +//------------------------------------------------------------------------------- +static bool +MyModifyArcRadiusEx( IGeomDB* pGeomDB, int nId, double dRad) +{ + // recupero l'arco e i suoi dati + ICurveArc* pArc = GetCurveArc( pGeomDB->GetGeoObj( nId)) ; + if ( pArc == nullptr) return false ; + // recupero gli estremi dell'arco e la loro distanza nel piano dell'arco + Point3d ptStart, ptEnd ; + if ( ! pArc->GetStartPoint( ptStart) || ! pArc->GetEndPoint( ptEnd)) + return false ; + double dPlaneDist = OrthoCompo( ( ptEnd - ptStart), pArc->GetNormVersor()).Len() ; + // se angolo al centro maggiore o uguale ad un giro o estremi coincidenti, conservo il centro + if ( abs( pArc->GetAngCenter()) >= ANG_FULL - EPS_ANG_ZERO || dPlaneDist < 2 * EPS_SMALL) + return MyModifyArcRadius( pGeomDB, nId, dRad) ; + // mantengo i punti estremi (pertanto il nuovo raggio non può essere inferiore a metà della loro distanza nel piano) + if ( dRad < dPlaneDist / 2 - EPS_ZERO) + return false ; + // creo arco con gli stessi estremi, con identica normale e con nuovo raggio + PtrOwner pCrvArc( CreateCurveArc()) ; + if ( IsNull( pCrvArc) || + ! pCrvArc->Set2PNRS( ptStart, ptEnd, pArc->GetNormVersor(), dRad, pArc->GetAngCenter() > 0)) + return false ; + // lo sostituisco all'originale + return pGeomDB->ReplaceGeoObj( nId, Release( pCrvArc)) ; +} + +//------------------------------------------------------------------------------- +bool +ExeModifyArcRadius( int nId, double dRad, bool bKeepCenter) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + + bool bOk = ( bKeepCenter ? MyModifyArcRadius( pGeomDB, nId, dRad) : MyModifyArcRadiusEx( pGeomDB, nId, dRad)) ; + if ( bOk) + ExeSetModified() ; + + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtModifyArcRadius(" + IdToString( nId) + "," + + ToString( dRad) + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; } + + return bOk ; } //------------------------------------------------------------------------------- diff --git a/EgtExecutor.rc b/EgtExecutor.rc index 832453c00ea359f7fe7994d18503e2575b73c4f3..f3a1091d29a7155fbb042003fc865bfa2e93fc99 100644 GIT binary patch delta 81 zcmX>#neo(Q#tpyN7>zdnW^-i*QjT29S-`yGOp`YVRxuh)cH~Ol+$UrM5m>XaK delta 81 zcmX>#neo(Q#tpyN7!5c7W^-i*QjT29S-`yGOp`YVRxuh*cH~Ol+$UrM5