diff --git a/EXE_GdbCreateSurf.cpp b/EXE_GdbCreateSurf.cpp index 7c2cf3a..9bda430 100644 --- a/EXE_GdbCreateSurf.cpp +++ b/EXE_GdbCreateSurf.cpp @@ -1444,14 +1444,14 @@ ExeCreateSurfTmByVolZmap( int nParentId, int nZmapId, int nPart) //------------------------------------------------------------------------------- int -ExeCreateSurfBezier( int nParentId, int nDegU, int nDegV, const PNTVECTOR& vPnt, int nRefType) +ExeCreateSurfBezier( int nParentId, int nDegU, int nDegV, int nSpanU, int nSpanV, const PNTVECTOR& vPnt, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) nParentId = AdjustId( nParentId) ; bool bOk = true ; - // il numero dei punti deve essere pari al prodotto dei gradi + 1 - int nDim = ( nDegU + 1) * ( nDegV + 1) ; + // il numero dei punti deve essere pari al prodotto dei gradi per gli span + 1 + int nDim = ( nDegU * nSpanU + 1) * ( nDegV * nSpanV + 1) ; bOk = bOk && ( vPnt.size() == nDim) ; // recupero il riferimento di immersione della superficie Frame3d frLoc ; @@ -1460,7 +1460,7 @@ ExeCreateSurfBezier( int nParentId, int nDegU, int nDegV, const PNTVECTOR& vPnt, PtrOwner pSurfBez( CreateSurfBezier()) ; bOk = bOk && ! IsNull( pSurfBez) ; // inizializzo la superficie di Bezier - bOk = bOk && pSurfBez->Init( nDegU, nDegV, false) ; + bOk = bOk && pSurfBez->Init( nDegU, nDegV, nSpanU, nSpanV, false) ; // setto i punti di controllo for ( int i = 0 ; i < nDim && bOk ; ++ i) { // eventuale trasformazione del punto nel riferimento locale @@ -1482,7 +1482,9 @@ ExeCreateSurfBezier( int nParentId, int nDegU, int nDegV, const PNTVECTOR& vPnt, } string sLua = "EgtSurfBezier(" + IdToString( nParentId) + "," + ToString( nDegU) + "," + - ToString( nDegV) + ",{" + + ToString( nDegV) + "," + + ToString( nSpanU) + "," + + ToString( nSpanV) + ",{" + sPC + "}," + RefTypeToString( nRefType) + ")" + " -- Id=" + ToString( nId) ; @@ -1494,14 +1496,14 @@ ExeCreateSurfBezier( int nParentId, int nDegU, int nDegV, const PNTVECTOR& vPnt, //------------------------------------------------------------------------------- int -ExeCreateSurfBezierRational( int nParentId, int nDegU, int nDegV, const PNTUVECTOR& vPntW, int nRefType) +ExeCreateSurfBezierRational( int nParentId, int nDegU, int nDegV, int nSpanU, int nSpanV, const PNTUVECTOR& vPntW, int nRefType) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) nParentId = AdjustId( nParentId) ; bool bOk = true ; - // il numero dei punti deve essere pari al prodotto dei gradi + 1 - int nDim = ( nDegU + 1) * ( nDegV + 1) ; + // il numero dei punti deve essere pari al prodotto dei gradi per gli span + 1 + int nDim = ( nDegU * nSpanU + 1) * ( nDegV * nSpanV + 1) ; bOk = bOk && ( vPntW.size() == nDim) ; // recupero il riferimento di immersione della superficie Frame3d frLoc ; @@ -1510,7 +1512,7 @@ ExeCreateSurfBezierRational( int nParentId, int nDegU, int nDegV, const PNTUVECT PtrOwner pSurfBez( CreateSurfBezier()) ; bOk = bOk && ! IsNull( pSurfBez) ; // inizializzo la superficie di Bezier - bOk = bOk && pSurfBez->Init( nDegU, nDegV, true) ; + bOk = bOk && pSurfBez->Init( nDegU, nDegV, nSpanU, nSpanV, true) ; // setto i punti di controllo for ( int i = 0 ; i < nDim && bOk ; ++ i) { // eventuale trasformazione del punto nel riferimento locale @@ -1532,7 +1534,9 @@ ExeCreateSurfBezierRational( int nParentId, int nDegU, int nDegV, const PNTUVECT } string sLua = "EgtSurfBezierRat(" + IdToString( nParentId) + "," + ToString( nDegU) + "," + - ToString( nDegV) + ",{" + + ToString( nDegV) + "," + + ToString( nSpanU) + "," + + ToString( nSpanV) + ",{" + sPC + "}," + RefTypeToString( nRefType) + ")" + " -- Id=" + ToString( nId) ; diff --git a/EXE_GdbGetSurf.cpp b/EXE_GdbGetSurf.cpp index 17c8ae1..096db76 100644 --- a/EXE_GdbGetSurf.cpp +++ b/EXE_GdbGetSurf.cpp @@ -874,7 +874,7 @@ ExeSurfBezierGetPoint( int nSurfId, double dU, double dV, int nRefId, Point3d& p const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; bool bOk = ( pSbz != nullptr) ; // richiedo il punto - bOk = bOk && pSbz->GetPointD1D2( dU, dV, ptP) ; + bOk = bOk && pSbz->GetPointD1D2( dU, dV, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptP) ; // gestione trasformazioni ( eventuali) bOk = bOk && TransformPoint( pGeomDB, nSurfId, nRefId, ptP) ; // se richiesto, salvo il comando Lua equivalente @@ -892,15 +892,19 @@ ExeSurfBezierGetPoint( int nSurfId, double dU, double dV, int nRefId, Point3d& p //---------------------------------------------------------------------------- bool -ExeSurfBezierGetPointD1( int nSurfId, double dU, double dV, int nRefId, Point3d& ptP, Vector3d& vtDerU, Vector3d& vtDerV) +ExeSurfBezierGetPointD1( int nSurfId, double dU, double dV, int nUsd, int nVsd, int nRefId, + Point3d& ptP, Vector3d& vtDerU, Vector3d& vtDerV) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la superficie di Bezier const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; bool bOk = ( pSbz != nullptr) ; + // direzioni di approccio + ISurfBezier::Side nSbzUsd = ( nUsd > 0 ? ISurfBezier::FROM_PLUS : ISurfBezier::FROM_MINUS) ; + ISurfBezier::Side nSbzVsd = ( nVsd > 0 ? ISurfBezier::FROM_PLUS : ISurfBezier::FROM_MINUS) ; // richiedo il punto - bOk = bOk && pSbz->GetPointD1D2( dU, dV, ptP, &vtDerU, &vtDerV) ; + bOk = bOk && pSbz->GetPointD1D2( dU, dV, nSbzUsd, nSbzVsd, ptP, &vtDerU, &vtDerV) ; // gestione trasformazioni ( eventuali) bOk = bOk && TransformPoint( pGeomDB, nSurfId, nRefId, ptP) && TransformVector( pGeomDB, nSurfId, nRefId, vtDerU) && @@ -922,15 +926,19 @@ ExeSurfBezierGetPointD1( int nSurfId, double dU, double dV, int nRefId, Point3d& //---------------------------------------------------------------------------- bool -ExeSurfBezierGetPointNrmD1( int nSurfId, double dU, double dV, int nRefId, Point3d& ptP, Vector3d& vtN, Vector3d& vtDerU, Vector3d& vtDerV) +ExeSurfBezierGetPointNrmD1( int nSurfId, double dU, double dV, int nUsd, int nVsd, int nRefId, + Point3d& ptP, Vector3d& vtN, Vector3d& vtDerU, Vector3d& vtDerV) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) // recupero la superficie di Bezier const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; bool bOk = ( pSbz != nullptr) ; + // direzioni di approccio + ISurfBezier::Side nSbzUsd = ( nUsd > 0 ? ISurfBezier::FROM_PLUS : ISurfBezier::FROM_MINUS) ; + ISurfBezier::Side nSbzVsd = ( nVsd > 0 ? ISurfBezier::FROM_PLUS : ISurfBezier::FROM_MINUS) ; // richiedo il punto - bOk = bOk && pSbz->GetPointNrmD1D2( dU, dV, ptP, vtN, &vtDerU, &vtDerV) ; + bOk = bOk && pSbz->GetPointNrmD1D2( dU, dV, nSbzUsd, nSbzVsd, ptP, vtN, &vtDerU, &vtDerV) ; // gestione trasformazioni ( eventuali) bOk = bOk && TransformPoint( pGeomDB, nSurfId, nRefId, ptP) && TransformVector( pGeomDB, nSurfId, nRefId, vtN) && @@ -971,7 +979,7 @@ MySurfBezierGetCurveUV( int nSurfId, bool bIsU, double dPar, int nDestGrpId) if ( ! pGeomDB->GetGroupGlobFrame( nDestGrpId, frDest)) return GDB_ID_NULL ; // richiedo la curva - PtrOwner pCrv( bIsU ? pSbz->GetCurveOnU( dPar) : pSbz->GetCurveOnV( dPar)) ; + PtrOwner pCrv( bIsU ? pSbz->GetCurveOnU( dPar) : pSbz->GetCurveOnV( dPar)) ; if ( IsNull( pCrv)) return GDB_ID_NULL ; // se è una curva @@ -986,7 +994,7 @@ MySurfBezierGetCurveUV( int nSurfId, bool bIsU, double dPar, int nDestGrpId) } // altrimenti è collassata in un punto else { - Point3d ptP = pCrv->GetControlPoint( 0) ; + Point3d ptP ; pCrv->GetStartPoint( ptP) ; PtrOwner pGeoPnt( CreateGeoPoint3d()) ; if ( IsNull( pGeoPnt) || ! pGeoPnt->Set( ptP)) return GDB_ID_NULL ; @@ -1040,7 +1048,7 @@ ExeSurfBezierGetCurveV( int nSurfId, double dU, int nDestGrpId) //---------------------------------------------------------------------------- bool -ExeSurfBezierGetInfo( int nSurfId, int& nDegU, int& nDegV, bool& bIsRat, bool& bTrimmed) +ExeSurfBezierGetInfo( int nSurfId, int& nDegU, int& nDegV, int& nSpanU, int& nSpanV, bool& bIsRat, bool& bTrimmed) { IGeomDB* pGeomDB = GetCurrGeomDB() ; VERIFY_GEOMDB( pGeomDB, GDB_ID_NULL) @@ -1048,12 +1056,14 @@ ExeSurfBezierGetInfo( int nSurfId, int& nDegU, int& nDegV, bool& bIsRat, bool& b const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nSurfId)) ; bool bOk = ( pSbz != nullptr) ; // recupero le info (gradi in U e V, flag di razionale) - bOk = bOk && pSbz->GetInfo( nDegU, nDegV, bIsRat, bTrimmed) ; + bOk = bOk && pSbz->GetInfo( nDegU, nDegV, nSpanU, nSpanV, bIsRat, bTrimmed) ; // se richiesto, salvo il comando Lua equivalente if ( IsCmdLog()) { string sLua = "EgtSurfBezierGetInfo(" + ToString( nSurfId) + ")" + " -- DegU=" + ( bOk ? ToString( nDegU) : "nil") + " -- DegV=" + ( bOk ? ToString( nDegV) : "nil") + + " -- SpanU=" + ( bOk ? ToString( nSpanU) : "nil") + + " -- SpanV=" + ( bOk ? ToString( nSpanV) : "nil") + " -- IsRat=" + ( bOk ? ToString( bIsRat) : "nil") + " -- Trim=" + ( bOk ? ToString( bTrimmed) : "nil") ; LOG_INFO( GetCmdLogger(), sLua.c_str()) ; diff --git a/EXE_GeoSnap.cpp b/EXE_GeoSnap.cpp index 800caa4..f6b7bd7 100644 --- a/EXE_GeoSnap.cpp +++ b/EXE_GeoSnap.cpp @@ -457,12 +457,10 @@ ExeAtParamVector( int nId, double dU, int nSide, int nRefId, Vector3d& vtV) // recupero la curva const ICurve* pCrv = GetCurve( pGObj) ; // assegno il lato di approccio - ICurve::Side nSide = ICurve::FROM_MINUS ; - if ( nSide > 0) - nSide = ICurve::FROM_PLUS ; + ICurve::Side nCrvSide = ( nSide > 0 ? ICurve::FROM_PLUS : ICurve::FROM_MINUS) ; // recupero la direzione Point3d ptP ; - if ( ! pCrv->GetPointTang( dU, nSide, ptP, vtV)) + if ( ! pCrv->GetPointTang( dU, nCrvSide, ptP, vtV)) return false ; } else diff --git a/EgtExecutor.rc b/EgtExecutor.rc index 61bca47..9273558 100644 Binary files a/EgtExecutor.rc and b/EgtExecutor.rc differ diff --git a/LUA_GdbCreateSurf.cpp b/LUA_GdbCreateSurf.cpp index d959d49..4e29eab 100644 --- a/LUA_GdbCreateSurf.cpp +++ b/LUA_GdbCreateSurf.cpp @@ -700,20 +700,28 @@ LuaCreateSurfTmByVolZmap( lua_State* L) static int LuaCreateSurfBezier( lua_State* L) { - // 4 o 5 parametri : ParentId, DegreeU, DegreeV, CtrlPnts [, nRefType] + // da 4 a 7 parametri : ParentId, DegreeU, DegreeV [, SpanU, SpanV], CtrlPnts [, nRefType] int nParentId ; LuaCheckParam( L, 1, nParentId) int nDegU ; LuaCheckParam( L, 2, nDegU) int nDegV ; LuaCheckParam( L, 3, nDegV) + int nSpanU = 1, nSpanV = 1 ; PNTVECTOR vPnt ; - LuaCheckParam( L, 4, vPnt) int nRefType = RTY_DEFAULT ; - LuaGetParam( L, 5, nRefType) ; + if ( LuaGetParam( L, 4, nSpanU)) { + LuaCheckParam( L, 5, nSpanV) + LuaCheckParam( L, 6, vPnt) + LuaGetParam( L, 7, nRefType) ; + } + else { + LuaCheckParam( L, 4, vPnt) + LuaGetParam( L, 5, nRefType) ; + } LuaClearStack( L) ; // creo la superficie - int nId = ExeCreateSurfBezier( nParentId, nDegU, nDegV, vPnt, nRefType) ; + int nId = ExeCreateSurfBezier( nParentId, nDegU, nDegV, nSpanU, nSpanV, vPnt, nRefType) ; // restituisco il risultato if ( nId != GDB_ID_NULL) LuaSetParam( L, nId) ; @@ -726,20 +734,28 @@ LuaCreateSurfBezier( lua_State* L) static int LuaCreateSurfBezierRational( lua_State* L) { - // 4 o 5 parametri : ParentId, DegreeU, DegreeV, CtrlPntWs [, nRefType] + // da 4 a 7 parametri : ParentId, DegreeU, DegreeV [, SpanU, SpanV], CtrlPntWs [, nRefType] int nParentId ; LuaCheckParam( L, 1, nParentId) int nDegU ; LuaCheckParam( L, 2, nDegU) int nDegV ; LuaCheckParam( L, 3, nDegV) + int nSpanU = 1, nSpanV = 1 ; PNTUVECTOR vPntW ; - LuaCheckParam( L, 4, vPntW) int nRefType = RTY_DEFAULT ; - LuaGetParam( L, 5, nRefType) ; + if ( LuaGetParam( L, 4, nSpanU)) { + LuaCheckParam( L, 5, nSpanV) + LuaCheckParam( L, 6, vPntW) + LuaGetParam( L, 7, nRefType) ; + } + else { + LuaCheckParam( L, 4, vPntW) + LuaGetParam( L, 5, nRefType) ; + } LuaClearStack( L) ; // creo la superficie - int nId = ExeCreateSurfBezierRational( nParentId, nDegU, nDegV, vPntW, nRefType) ; + int nId = ExeCreateSurfBezierRational( nParentId, nDegU, nDegV, nSpanU, nSpanV, vPntW, nRefType) ; // restituisco il risultato if ( nId != GDB_ID_NULL) LuaSetParam( L, nId) ; diff --git a/LUA_GdbGetSurf.cpp b/LUA_GdbGetSurf.cpp index 708f934..6fae536 100644 --- a/LUA_GdbGetSurf.cpp +++ b/LUA_GdbGetSurf.cpp @@ -673,20 +673,24 @@ LuaSurfBezierGetPoint( lua_State* L) static int LuaSurfBezierGetPointD1( lua_State* L) { - // 3 o 4 parametri : nSurfId, dU, dV [, nRefId] + // 5 o 6 parametri : nSurfId, dU, dV, nUsd, nVsd [, nRefId] int nSurfId ; LuaCheckParam( L, 1, nSurfId) double dU ; LuaCheckParam( L, 2, dU) double dV ; LuaCheckParam( L, 3, dV) + int nUsd ; + LuaCheckParam( L, 4, nUsd) + int nVsd ; + LuaCheckParam( L, 5, nVsd) int nRefId = nSurfId ; - LuaGetParam( L, 4, nRefId) ; + LuaGetParam( L, 6, nRefId) ; LuaClearStack( L) ; // recupero i dati del punto Point3d ptP ; Vector3d vtDerU, vtDerV ; - bool bOk = ExeSurfBezierGetPointD1( nSurfId, dU, dV, nRefId, ptP, vtDerU, vtDerV) ; + bool bOk = ExeSurfBezierGetPointD1( nSurfId, dU, dV, nUsd, nVsd, nRefId, ptP, vtDerU, vtDerV) ; if ( bOk) { LuaSetParam( L, ptP) ; LuaSetParam( L, vtDerU) ; @@ -704,21 +708,25 @@ LuaSurfBezierGetPointD1( lua_State* L) static int LuaSurfBezierGetPointNrmD1( lua_State* L) { - // 3 o 4 parametri : nSurfId, dU, dV [, nRefId] + // 5 o 6 parametri : nSurfId, dU, dV, nUsd, nVsd [, nRefId] int nSurfId ; LuaCheckParam( L, 1, nSurfId) double dU ; LuaCheckParam( L, 2, dU) double dV ; LuaCheckParam( L, 3, dV) + int nUsd ; + LuaCheckParam( L, 4, nUsd) + int nVsd ; + LuaCheckParam( L, 5, nVsd) int nRefId = nSurfId ; - LuaGetParam( L, 4, nRefId) ; + LuaGetParam( L, 6, nRefId) ; LuaClearStack( L) ; // recupero i dati del punto Point3d ptP ; Vector3d vtN ; Vector3d vtDerU, vtDerV ; - bool bOk = ExeSurfBezierGetPointNrmD1( nSurfId, dU, dV, nRefId, ptP, vtN, vtDerU, vtDerV) ; + bool bOk = ExeSurfBezierGetPointNrmD1( nSurfId, dU, dV, nUsd, nVsd, nRefId, ptP, vtN, vtDerU, vtDerV) ; if ( bOk) { LuaSetParam( L, ptP) ; LuaSetParam( L, vtN) ; @@ -786,11 +794,14 @@ LuaSurfBezierGetInfo( lua_State* L) LuaClearStack( L) ; // recupero la curva int nDegU, nDegV ; + int nSpanU, nSpanV ; bool bIsRat, bTrimmed ; - bool bOk = ExeSurfBezierGetInfo( nSurfId, nDegU, nDegV, bIsRat, bTrimmed) ; + bool bOk = ExeSurfBezierGetInfo( nSurfId, nDegU, nDegV, nSpanU, nSpanV, bIsRat, bTrimmed) ; if ( bOk) { LuaSetParam( L, nDegU) ; LuaSetParam( L, nDegV) ; + LuaSetParam( L, nSpanU) ; + LuaSetParam( L, nSpanV) ; LuaSetParam( L, bIsRat) ; LuaSetParam( L, bTrimmed) ; } @@ -799,8 +810,10 @@ LuaSurfBezierGetInfo( lua_State* L) LuaSetParam( L) ; LuaSetParam( L) ; LuaSetParam( L) ; + LuaSetParam( L) ; + LuaSetParam( L) ; } - return 3 ; + return 6 ; } //---------------------------------------------------------------------------- diff --git a/LUA_GeoSnap.cpp b/LUA_GeoSnap.cpp index 8b7460d..7b39ae3 100644 --- a/LUA_GeoSnap.cpp +++ b/LUA_GeoSnap.cpp @@ -239,7 +239,7 @@ LuaMidVector( lua_State* L) static int LuaAtParamVector( lua_State* L) { - // 2, 3 o 4 parametri : Id, U, nSide [, nRefId] + // 3 o 4 parametri : Id, U, nSide [, nRefId] int nId ; LuaCheckParam( L, 1, nId) double dU ;