diff --git a/EXE_GdbModifyCurve.cpp b/EXE_GdbModifyCurve.cpp index 3dca741..80ae05c 100644 --- a/EXE_GdbModifyCurve.cpp +++ b/EXE_GdbModifyCurve.cpp @@ -44,6 +44,7 @@ #include "/EgtDev/Include/EgtPointerOwner.h" #include "/EgtDev/Include/EGkCalcPocketing.h" #include +#include "/EgtDev/Include/EGkSurfBezier.h" #include @@ -2490,6 +2491,230 @@ ExeProjectCurveOnSurfTmExt( int nCurveId, int nSurfTmId, int nGuideId, int nDest } +//------------------------------------------------------------------------------- +static bool +MyProjectCurveOnSurfBz( int nCurveId, int nSurfBzId, const Vector3d& vtDir, int nDestGrpId, + double dLinTol, double dMaxSegmLen, int nRefType) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la curva e il suo riferimento + const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nCurveId)) ; + if ( pCrv == nullptr) + return false ; + Frame3d frCrv ; + if ( ! pGeomDB->GetGlobFrame( nCurveId, frCrv)) + return false ; + // recupero la superficie bezier e il suo riferimento + const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfBzId)) ; + // recupero la superficie trimesh + const ISurfTriMesh* pStm = pSbz->GetAuxSurf() ; + if ( pStm == nullptr) + return false ; + Frame3d frSbz ; + if ( ! pGeomDB->GetGlobFrame( nSurfBzId, frSbz)) + return false ; + // recupero il riferimento del gruppo di destinazione + nDestGrpId = AdjustId( nDestGrpId) ; + Frame3d frDest ; + if ( ! pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest)) + return false ; + // porto la curva e il vettore nel riferimento della superficie + CurveLocal CrvLoc( pCrv, frCrv, frSbz) ; + if ( CrvLoc.Get() == nullptr) + return false ; + Vector3d vtDirL = GetVectorLocal( pGeomDB, vtDir, nRefType, frCrv) ; + vtDirL.LocToLoc( frCrv, frSbz) ; + // eseguo la proiezione + PNT5AXVECTOR vPt5ax ; + if ( ! ProjectCurveOnSurfTm( *CrvLoc.Get(), *pStm, vtDirL, dLinTol, dMaxSegmLen, vPt5ax)) + return false ; + // inserisco la composita nel gruppo destinazione + PtrOwner pCompo ; + for ( const auto& Pt5ax : vPt5ax) { + if ( IsNull( pCompo)) { + pCompo.Set( CreateCurveComposite()) ; + if ( IsNull( pCompo)) + return false ; + pCompo->AddPoint( GetLocToLoc( Pt5ax.ptP, frSbz, frDest)) ; + } + else + pCompo->AddLine( GetLocToLoc( Pt5ax.ptP, frSbz, frDest)) ; + } + int nCompoId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCompo)) ; + if ( nCompoId == GDB_ID_NULL) + return false ; + // aggiungo i versori nel gruppo destinazione + int nInd = 0 ; + for ( const auto& Pt5ax : vPt5ax) { + PtrOwner pGeoVct( CreateGeoVector3d()) ; + if ( IsNull( pGeoVct)) + return false ; + pGeoVct->Set( 10 * GetLocToLoc( Pt5ax.vtDir, frSbz, frDest), GetLocToLoc( Pt5ax.ptP, frSbz, frDest)) ; + int nNewId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pGeoVct)) ; + if ( nNewId == GDB_ID_NULL) + return false ; + pGeomDB->SetInfo( nNewId, "Ind", nInd ++) ; + pGeomDB->SetInfo( nNewId, "Par", Pt5ax.dPar) ; + pGeomDB->SetInfo( nNewId, "Flag", Pt5ax.nFlag) ; + } + + return true ; +} + +//------------------------------------------------------------------------------- +bool +ExeProjectCurveOnSurfBz( int nCurveId, int nSurfBzId, const Vector3d& vtDir, int nDestGrpId, + double dLinTol, double dMaxSegmLen, int nRefType) +{ + bool bOk = MyProjectCurveOnSurfBz( nCurveId, nSurfBzId, vtDir, nDestGrpId, dLinTol, dMaxSegmLen, nRefType) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtProjectCurveOnSurfBz(" + ToString( nCurveId) + "," + + ToString( nSurfBzId) + ",{" + + ToString( vtDir) + "}," + + ToString( nDestGrpId) + "," + + ToString( dLinTol) + "," + + ToString( dMaxSegmLen) + "," + + RefTypeToString( nRefType) + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + return bOk ; + +} + +//------------------------------------------------------------------------------- +static bool +MyProjectCurveOnSurfBzExt( int nCurveId, int nSurfBzId, int nGuideId, int nDestGrpId, + double dLinTol, double dMaxSegmLen, bool bDirFromGuide) +{ + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la curva e il suo riferimento + const ICurve* pCrv = GetCurve( pGeomDB->GetGeoObj( nCurveId)) ; + if ( pCrv == nullptr) + return false ; + Frame3d frCrv ; + if ( ! pGeomDB->GetGlobFrame( nCurveId, frCrv)) + return false ; + // recupero la superficie Bezier e il suo riferimento + const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfBzId)) ; + // recupero la superficie trimesh + const ISurfTriMesh* pStm = pSbz->GetAuxSurf() ; + if ( pStm == nullptr) + return false ; + Frame3d frSbz ; + if ( ! pGeomDB->GetGlobFrame( nSurfBzId, frSbz)) + return false ; + // recupero l'entità guida (punto, curva o superficie) e il suo riferimento + const IGeoPoint3d* pGdePnt = nullptr ; + const ICurve* pGdeCrv = nullptr ; + const ISurfTriMesh* pGdeStm = nullptr ; + pGdePnt = GetGeoPoint3d( pGeomDB->GetGeoObj( nGuideId)) ; + if ( pGdePnt == nullptr) { + pGdeCrv = GetCurve( pGeomDB->GetGeoObj( nGuideId)) ; + if ( pGdeCrv == nullptr) { + pGdeStm = GetSurfTriMesh( pGeomDB->GetGeoObj( nGuideId)) ; + if ( pGdeStm == nullptr) + return false ; + } + } + Frame3d frGde ; + if ( ! pGeomDB->GetGlobFrame( nGuideId, frGde)) + return false ; + // recupero il riferimento del gruppo di destinazione + nDestGrpId = AdjustId( nDestGrpId) ; + Frame3d frDest ; + if ( ! pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest)) + return false ; + // porto la curva nel riferimento della superficie + CurveLocal CrvLoc( pCrv, frCrv, frSbz) ; + if ( CrvLoc.Get() == nullptr) + return false ; + // eseguo l'opportuna proiezione dopo aver portato l'entità guida nel riferimento della superficie + PNT5AXVECTOR vPt5ax ; + if ( pGdePnt != nullptr) { + PtrOwner pGdeLoc( pGdePnt->Clone()) ; + if ( pGdeLoc == nullptr) + return false ; + pGdeLoc->LocToLoc( frGde, frSbz) ; + if ( ! ProjectCurveOnSurfTm( *CrvLoc.Get(), *pStm, *pGdeLoc, dLinTol, dMaxSegmLen, vPt5ax)) + return false ; + } + else if ( pGdeCrv != nullptr) { + CurveLocal GdeLoc( pGdeCrv, frGde, frSbz) ; + if ( GdeLoc.Get() == nullptr) + return false ; + if ( ! ProjectCurveOnSurfTm( *CrvLoc.Get(), *pStm, *GdeLoc.Get(), dLinTol, dMaxSegmLen, vPt5ax)) + return false ; + } + else { // pGdeStm != nullptr + SurfLocal GdeLoc( pGdeStm, frGde, frSbz) ; + const ISurfTriMesh* pGdeLoc = GetSurfTriMesh( GdeLoc.Get()) ; + if ( pGdeLoc == nullptr) + return false ; + if ( ! ProjectCurveOnSurfTm( *CrvLoc.Get(), *pStm, *pGdeLoc, dLinTol, dMaxSegmLen, vPt5ax)) + return false ; + } + // inserisco la composita nel gruppo destinazione + PtrOwner pCompo ; + for ( const auto& Pt5ax : vPt5ax) { + if ( IsNull( pCompo)) { + pCompo.Set( CreateCurveComposite()) ; + if ( IsNull( pCompo)) + return false ; + pCompo->AddPoint( GetLocToLoc( Pt5ax.ptP, frSbz, frDest)) ; + } + else + pCompo->AddLine( GetLocToLoc( Pt5ax.ptP, frSbz, frDest)) ; + } + int nCompoId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pCompo)) ; + if ( nCompoId == GDB_ID_NULL) + return false ; + // aggiungo i versori nel gruppo destinazione + int nInd = 0 ; + for ( const auto& Pt5ax : vPt5ax) { + PtrOwner pGeoVct( CreateGeoVector3d()) ; + if ( IsNull( pGeoVct)) + return false ; + Vector3d vtDir = ( bDirFromGuide ? Pt5ax.vtDir2 : Pt5ax.vtDir) ; + pGeoVct->Set( 10 * GetLocToLoc( vtDir, frSbz, frDest), GetLocToLoc( Pt5ax.ptP, frSbz, frDest)) ; + int nNewId = pGeomDB->AddGeoObj( GDB_ID_NULL, nDestGrpId, Release( pGeoVct)) ; + if ( nNewId == GDB_ID_NULL) + return false ; + pGeomDB->SetInfo( nNewId, "Ind", nInd ++) ; + pGeomDB->SetInfo( nNewId, "Par", Pt5ax.dPar) ; + pGeomDB->SetInfo( nNewId, "Flag", Pt5ax.nFlag) ; + } + + return true ; +} + +//------------------------------------------------------------------------------- +bool +ExeProjectCurveOnSurfBzExt( int nCurveId, int nSurfBzId, int nGuideId, int nDestGrpId, + double dLinTol, double dMaxSegmLen, bool bDirFromGuide) +{ + bool bOk = MyProjectCurveOnSurfBzExt( nCurveId, nSurfBzId, nGuideId, nDestGrpId, dLinTol, dMaxSegmLen, bDirFromGuide) ; + ExeSetModified() ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtProjectCurveOnSurfBzExt(" + ToString( nCurveId) + "," + + ToString( nSurfBzId) + ",{" + + ToString( nGuideId) + "}," + + ToString( nDestGrpId) + "," + + ToString( dLinTol) + "," + + ToString( dMaxSegmLen) + "," + + ( bDirFromGuide ? "true" : "false") + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + return bOk ; + +} + //---------------------------------------------------------------------------- int ExeCurveGetVoronoi( int nId, int nDestGrpId, int nBound, int* pnCount) diff --git a/LUA_GdbModifyCurve.cpp b/LUA_GdbModifyCurve.cpp index 9b846c4..28f00ff 100644 --- a/LUA_GdbModifyCurve.cpp +++ b/LUA_GdbModifyCurve.cpp @@ -1001,6 +1001,58 @@ LuaProjectCurveOnSurfTmExt( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +static int +LuaProjectCurveOnSurfBz( lua_State* L) +{ + // 4, 5, 6 o 7 parametri : nCurveId, nSurfBzId, vtDir, nDestGrpId [, dLinTol [, dMaxSegmLen] [, nRefType]] + int nCurveId ; + LuaCheckParam( L, 1, nCurveId) + int nSurfBzId ; + LuaCheckParam( L, 2, nSurfBzId) + Vector3d vtDir ; + LuaCheckParam( L, 3, vtDir) + int nDestGrpId ; + LuaCheckParam( L, 4, nDestGrpId) + double dLinTol = 0.01 ; + double dMaxSegmLen = INFINITO ; + int nRefType = RTY_DEFAULT ; + if ( LuaGetParam( L, 5, dLinTol) && + LuaGetParam( L, 6, dMaxSegmLen)) + LuaGetParam( L, 7, nRefType) ; + LuaClearStack( L) ; + // proietto la curva su una trimesh secondo la direzione data + bool bOk = ExeProjectCurveOnSurfBz( nCurveId, nSurfBzId, vtDir, nDestGrpId, dLinTol, dMaxSegmLen, nRefType) ; + LuaSetParam( L, bOk) ; + return 1 ; +} + +//---------------------------------------------------------------------------- +static int +LuaProjectCurveOnSurfBzExt( lua_State* L) +{ + // 4, 5, 6 o 7 parametri : nCurveId, nSurfBzId, nGuideId, nDestGrpId [, dLinTol [, dMaxSegmLen] [, bDirFromGuide]] + int nCurveId ; + LuaCheckParam( L, 1, nCurveId) + int nSurfBzId ; + LuaCheckParam( L, 2, nSurfBzId) + int nGuideId ; + LuaCheckParam( L, 3, nGuideId) + int nDestGrpId ; + LuaCheckParam( L, 4, nDestGrpId) + double dLinTol = 0.01 ; + double dMaxSegmLen = INFINITO ; + bool bDirFromGuide = false ; + if ( LuaGetParam( L, 5, dLinTol) && + LuaGetParam( L, 6, dMaxSegmLen)) + LuaGetParam( L, 7, bDirFromGuide) ; + LuaClearStack( L) ; + // proietto la curva su una trimesh secondo la direzione data + bool bOk = ExeProjectCurveOnSurfBzExt( nCurveId, nSurfBzId, nGuideId, nDestGrpId, dLinTol, dMaxSegmLen, bDirFromGuide) ; + LuaSetParam( L, bOk) ; + return 1 ; +} + //---------------------------------------------------------------------------- static int LuaCurveGetVoronoi( lua_State* L) @@ -1137,5 +1189,7 @@ LuaInstallGdbModifyCurve( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtCurveGetVoronoi", LuaCurveGetVoronoi) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveMedialAxisAdv", LuaCurveMedialAxisAdv) ; bOk = bOk && luaMgr.RegisterFunction( "EgtCurveGetFatCurve", LuaCurveGetFatCurve) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtProjectCurveOnSurfBz", LuaProjectCurveOnSurfBz) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtProjectCurveOnSurfBzExt", LuaProjectCurveOnSurfBzExt) ; return bOk ; }