//---------------------------------------------------------------------------- // EgalTech 2018-2018 //---------------------------------------------------------------------------- // File : LUA_GeoInters.cpp Data : 27.09.18 Versione : 1.9i4 // Contenuto : Funzioni di intersezione tra oggetti geometrici per LUA. // // // // Modifiche : 27.09.18 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "LUA.h" #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EGkLuaAux.h" using namespace std ; //---------------------------------------------------------------------------- static int LuaLineBoxInters( lua_State* L) { // 3 parametri : ptP, vtDir, b3Box Point3d ptP ; LuaCheckParam( L, 1, ptP) Vector3d vtDir ; LuaCheckParam( L, 2, vtDir) BBox3d b3Box ; LuaCheckParam( L, 3, b3Box) LuaClearStack( L) ; // recupero i punti di intersezione tra linea e superficie trimesh INTDBLVECTOR vInters ; if ( ExeLineBoxInters( ptP, vtDir, b3Box, 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 LuaLineSurfTmInters( 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 ( ExeLineSurfTmInters( 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 LuaPlaneSurfTmInters( lua_State* L) { // 4 o 5 parametri : ptOn, vtN, Id, nDestGrpId [, nRefType] Point3d ptOn ; LuaCheckParam( L, 1, ptOn) Vector3d vtN ; LuaCheckParam( L, 2, vtN) int nId ; LuaCheckParam( L, 3, nId) int nDestGrpId ; LuaGetParam( L, 4, nDestGrpId) ; int nRefType = RTY_DEFAULT ; LuaGetParam( L, 5, nRefType) ; LuaClearStack( L) ; // eseguo l'intersezione int nPntCount = 0 ; int nCrvCount = 0 ; int nSrfCount = 0 ; int nNewId = ExePlaneSurfTmInters( ptOn, vtN, nId, nDestGrpId, nRefType, &nPntCount, &nCrvCount, &nSrfCount) ; // restituisco il risultato if ( nNewId != GDB_ID_NULL) LuaSetParam( L, nNewId) ; else LuaSetParam( L) ; LuaSetParam( L, nPntCount) ; LuaSetParam( L, nCrvCount) ; LuaSetParam( L, nSrfCount) ; return 4 ; } //---------------------------------------------------------------------------- static int LuaSurfTmSurfTmInters( lua_State* L) { // 3 parametri : Id1, nId2, nDestGrpId int nId1 ; LuaCheckParam( L, 1, nId1) int nId2 ; LuaCheckParam( L, 2, nId2) int nDestGrpId ; LuaCheckParam( L, 3, nDestGrpId) ; LuaClearStack( L) ; // eseguo l'intersezione int nPntCount = 0 ; int nCrvCount = 0 ; int nSrfCount = 0 ; int nNewId = ExeSurfTmSurfTmInters( nId1, nId2, nDestGrpId, &nPntCount, &nCrvCount, &nSrfCount) ; // restituisco il risultato if ( nNewId != GDB_ID_NULL) LuaSetParam( L, nNewId) ; else LuaSetParam( L) ; LuaSetParam( L, nPntCount) ; LuaSetParam( L, nCrvCount) ; LuaSetParam( L, nSrfCount) ; return 4 ; } //---------------------------------------------------------------------------- static int LuaPlaneVolZmapInters( lua_State* L) { // 4 o 5 parametri : ptP, vtN, nId, nDestGrpId [, nRefType] Point3d ptP ; LuaCheckParam( L, 1, ptP) Vector3d vtN ; LuaCheckParam( L, 2, vtN) int nId ; LuaCheckParam( L, 3, nId) int nDestGrpId ; LuaCheckParam( L, 4, nDestGrpId) int nRefType = RTY_DEFAULT ; LuaGetParam( L, 5, nRefType) ; LuaClearStack( L) ; // eseguo calcolo intersezione int nCount ; int nFirstId = ExePlaneVolZmapInters( ptP, vtN, nId, nDestGrpId, nRefType, &nCount) ; // restituisco il risultato if ( nFirstId != GDB_ID_NULL) { LuaSetParam( L, nFirstId) ; LuaSetParam( L, nCount) ; } else { LuaSetParam( L) ; LuaSetParam( L) ; } return 2 ; } //------------------------------------------------------------------------------- bool LuaInstallGeoInters( LuaMgr& luaMgr) { bool bOk = ( &luaMgr != nullptr) ; bOk = bOk && luaMgr.RegisterFunction( "EgtLineBoxInters", LuaLineBoxInters) ; bOk = bOk && luaMgr.RegisterFunction( "EgtLineSurfTmInters", LuaLineSurfTmInters) ; bOk = bOk && luaMgr.RegisterFunction( "EgtPlaneSurfTmInters", LuaPlaneSurfTmInters) ; bOk = bOk && luaMgr.RegisterFunction( "EgtSurfTmSurfTmInters", LuaSurfTmSurfTmInters) ; bOk = bOk && luaMgr.RegisterFunction( "EgtPlaneVolZmapInters", LuaPlaneVolZmapInters) ; return bOk ; }