diff --git a/EXE_GeoInters.cpp b/EXE_GeoInters.cpp index 2ee0acc..3b88304 100644 --- a/EXE_GeoInters.cpp +++ b/EXE_GeoInters.cpp @@ -33,6 +33,7 @@ #include "/EgtDev/Include/EGkIntersLineBox.h" #include "/EgtDev/Include/EGkIntersPlaneBox.h" #include "/EgtDev/Include/EGkIntersLineSurfTm.h" +#include "/EgtDev/Include/EGkIntersLineSurfBez.h" #include "/EgtDev/Include/EGkIntersPlaneSurfTm.h" #include "/EgtDev/Include/EGkIntersSurfTmSurfTm.h" #include "/EgtDev/Include/EGkIntersLinePlane.h" @@ -271,6 +272,116 @@ ExeLineSurfTmInters( const Point3d& ptP, const Vector3d& vtDir, int nId, int nRe return bOk ; } +//------------------------------------------------------------------------------- +static bool +MyLineSurfBzInters( const Point3d& ptP, const Vector3d& vtDir, int nId, int nRefType, + INTDBLVECTOR& vInters) +{ + vInters.clear() ; + IGeomDB* pGeomDB = GetCurrGeomDB() ; + VERIFY_GEOMDB( pGeomDB, false) + // recupero la superficie Bezier + const ISurfBezier* pSbz = GetSurfBezier( pGeomDB->GetGeoObj( nId)) ; + if ( pSbz == nullptr) + return false ; + // recupero il suo riferimento globale + Frame3d frSurf ; + if ( ! pGeomDB->GetGlobFrame( nId, frSurf)) + return false ; + // porto in locale il punto e la direzione della linea + Point3d ptPL = GetPointLocal( pGeomDB, ptP, nRefType, frSurf) ; + Vector3d vtDirL = GetVectorLocal( pGeomDB, vtDir, nRefType, frSurf) ; + vtDirL.Normalize() ; + // calcolo l'ingombro della Bezier + BBox3d b3Surf ; + if ( ! pSbz->GetLocalBBox( b3Surf)) + return false ; + // calcolo l'intersezione + double dLen = b3Surf.MaxDistFromPoint( ptPL) ; + ILSBIVECTOR vInfo ; + if ( ! IntersLineSurfBz( ptPL, vtDirL, dLen, pSbz, vInfo, false)) + return false ; + // ciclo sulle intersezioni + for ( const auto& Info : vInfo) { + // se intersezione puntuale + if ( Info.nILTT == ILTT_VERT || Info.nILTT == ILTT_EDGE || Info.nILTT == ILTT_IN) { + int nFlag = SLT_TOUCH ; + if ( Info.dCosDN > EPS_ZERO) + nFlag = SLT_OUT ; + else if ( Info.dCosDN < -EPS_ZERO) + nFlag = SLT_IN ; + vInters.emplace_back( nFlag, Info.dU) ; + } + // se altrimenti intersezione con coincidenza + else if ( Info.nILTT == ILTT_SEGM || Info.nILTT == ILTT_SEGM_ON_EDGE) { + vInters.emplace_back( SLT_TG_INI, Info.dU) ; + vInters.emplace_back( SLT_TG_FIN, Info.dU2) ; + } + } + // elimino intersezioni ripetute + for ( size_t j = 1 ; j < vInters.size() ; ) { + // intersezione precedente + size_t i = j - 1 ; + // se hanno lo stesso parametro + if ( abs( vInters[i].second - vInters[j].second) < EPS_SMALL) { + // se sono entrambe entranti o uscenti, elimino la seconda + if ( ( vInters[i].first == SLT_IN && vInters[j].first == SLT_IN) || + ( vInters[i].first == SLT_OUT && vInters[j].first == SLT_OUT)) { + vInters.erase( vInters.begin() + j) ; + continue ; + } + // se una entrante e l'altra uscente, cambio in touch ed elimino la seconda + else if ( ( vInters[i].first == SLT_IN && vInters[j].first == SLT_OUT) || + ( vInters[i].first == SLT_OUT && vInters[j].first == SLT_IN)) { + vInters[i].first = SLT_TOUCH ; + vInters.erase( vInters.begin() + j) ; + continue ; + } + // se una puntuale e l'altra inizio di coincidenza, elimino la prima + else if ( ( vInters[i].first == SLT_IN || vInters[i].first == SLT_OUT || vInters[i].first == SLT_TOUCH) && vInters[j].first == SLT_TG_INI) { + vInters.erase( vInters.begin() + i) ; + continue ; + } + // se una fine di coincidenza e l'altra puntuale, elimino la seconda + else if ( vInters[i].first == SLT_TG_FIN && ( vInters[j].first == SLT_IN || vInters[j].first == SLT_OUT || vInters[j].first == SLT_TOUCH)) { + vInters.erase( vInters.begin() + j) ; + continue ; + } + // se una fine di coincidenza e l'altra inizio di coincidenza, elimino entrambe + else if ( i > 0 && vInters[i].first == SLT_TG_FIN && vInters[j].first == SLT_TG_INI) { + vInters.erase( vInters.begin() + j) ; + vInters.erase( vInters.begin() + i) ; + -- j ; + continue ; + } + } + // passo alla successiva + ++ j ; + } + + return true ; +} + +//------------------------------------------------------------------------------- +bool +ExeLineSurfBzInters( const Point3d& ptP, const Vector3d& vtDir, int nId, int nRefType, + INTDBLVECTOR& vInters) +{ + // eseguo + bool bOk = MyLineSurfBzInters( ptP, vtDir, nId, nRefType, vInters) ; + // se richiesto, salvo il comando Lua equivalente + if ( IsCmdLog()) { + string sLua = "EgtLineSurfBzInters({" + ToString( ptP) + "},{" + + ToString( vtDir) + "}," + + ToString( nId) + "," + + RefTypeToString( nRefType) + ")" + + " -- Ok=" + ToString( bOk) ; + LOG_INFO( GetCmdLogger(), sLua.c_str()) ; + } + // restituisco l'identificativo della prima nuova entità + return bOk ; +} + //------------------------------------------------------------------------------- static bool MyLineVolZmapInters( const Point3d& ptP, const Vector3d& vtDir, int nId, int nRefType, INTDBLVECTOR& vInters) diff --git a/LUA_GeoInters.cpp b/LUA_GeoInters.cpp index a4c9eca..54dd1cc 100644 --- a/LUA_GeoInters.cpp +++ b/LUA_GeoInters.cpp @@ -123,6 +123,41 @@ LuaLineSurfTmInters( lua_State* L) return 3 ; } +//---------------------------------------------------------------------------- +static int +LuaLineSurfBzInters( lua_State* L) +{ + // 3 o 4 parametri : ptP, vtDir, Id, [, nRefId] + Point3d ptP ; + LuaCheckParam( L, 1, ptP) + Vector3d vtDir ; + LuaCheckParam( L, 2, vtDir) + int nId ; + LuaCheckParam( L, 3, nId) + int nRefType = nId ; + LuaGetParam( L, 4, nRefType) ; + LuaClearStack( L) ; + // recupero i punti di intersezione tra linea e superficie trimesh + INTDBLVECTOR vInters ; + if ( ExeLineSurfBzInters( ptP, vtDir, nId, nRefType, vInters)) { + LuaSetParam( L, true) ; + INTVECTOR vType( vInters.size()) ; + DBLVECTOR vPar( vInters.size()) ; + for ( size_t i = 0 ; i < vInters.size() ; ++ i) { + vType[i] = vInters[i].first ; + vPar[i] = vInters[i].second ; + } + LuaSetParam( L, vType) ; + LuaSetParam( L, vPar) ; + } + else { + LuaSetParam( L) ; + LuaSetParam( L) ; + LuaSetParam( L) ; + } + return 3 ; +} + //---------------------------------------------------------------------------- static int LuaLineVolZmapInters( lua_State* L) @@ -379,6 +414,7 @@ LuaInstallGeoInters( LuaMgr& luaMgr) bOk = bOk && luaMgr.RegisterFunction( "EgtLineCurveInters", LuaLineCurveInters) ; bOk = bOk && luaMgr.RegisterFunction( "EgtLineBoxInters", LuaLineBoxInters) ; bOk = bOk && luaMgr.RegisterFunction( "EgtLineSurfTmInters", LuaLineSurfTmInters) ; + bOk = bOk && luaMgr.RegisterFunction( "EgtLineSurfBzInters", LuaLineSurfBzInters) ; bOk = bOk && luaMgr.RegisterFunction( "EgtLineVolZmapInters", LuaLineVolZmapInters) ; bOk = bOk && luaMgr.RegisterFunction( "EgtPlaneCurveInters", LuaPlaneCurveInters) ; bOk = bOk && luaMgr.RegisterFunction( "EgtPlaneBoxInters", LuaPlaneBoxInters) ;