Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 31 additions & 9 deletions InternalAPI/MSPyCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -329,31 +329,53 @@ py::class_<bvector<ValueType>, holder_type> bind_PointerVector(py::handle scope,
return cls;
}

// Generic conversion from Python object to C++ type
template <typename T>
T ConvertItemFromPyObject(const py::handle& item) {
if (!py::isinstance<T>(item)) {
throw std::invalid_argument("All items in the list must be of the correct item type");
try {
return py::cast<T>(item);
} catch (const py::cast_error& e) {
throw std::invalid_argument("Failed to cast item to expected type: " + std::string(e.what()));
}
return item.cast<T>();
}

inline double ConvertItemFromPyObject(const py::handle& item) {
if (!PyFloat_Check(item.ptr()) && !PyLong_Check(item.ptr())) {
throw std::invalid_argument("Expected all items to be convertible to double");
// Specialized conversion for double
template <>
inline double ConvertItemFromPyObject<double>(const py::handle& item) {
try {
return item.cast<double>();
} catch (const py::cast_error& e) {
throw std::invalid_argument("Failed to cast item to double: " + std::string(e.what()));
}
return item.cast<double>();
}

// Specialized conversion for bool
template <>
inline bool ConvertItemFromPyObject<bool>(const py::handle& item) {
try {
return item.cast<bool>();
} catch (const py::cast_error& e) {
throw std::invalid_argument("Failed to cast item to bool: " + std::string(e.what()));
}
}

// Generic conversion from C++ type to Python object
template <typename T>
py::object ConvertItemToPyObject(const T& item) {
return py::cast(item);
}

// Specialized conversion for double
inline py::object ConvertItemToPyObject(const double& item) {
return py::float_(item);
}

//Convert Python list to an existing C++ array
// Specialized conversion for bool
inline py::object ConvertItemToPyObject(const bool& item) {
return py::bool_(item);
}

// Convert Python list to an existing C++ array
template <typename arrayType, typename itemType>
void ConvertPyListToCppArray(const py::list& pyList, arrayType& cppArray) {
cppArray.clear();
Expand Down Expand Up @@ -404,4 +426,4 @@ py::list ConvertCppArrayToPyList(const arrayType& cppArray) {
ConvertCppArrayToPyList<cppArrayType, cppItemType>(pyList, cppArray);

#define CONVERT_CPPARRAY_TO_NEW_PYLIST(pyList, cppArray, cppArrayType, cppItemType) \
py::list pyList = ConvertCppArrayToPyList<cppArrayType, cppItemType>(cppArray);
py::list pyList = ConvertCppArrayToPyList<cppArrayType, cppItemType>(cppArray);
2 changes: 1 addition & 1 deletion MSPython.mke
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ always:
#

always:
$(MakeProgram) $(_MakeFilePath)MSPythonCore.mke
$(MakeProgram) $(_MakeFilePath)MSPythonCore\MSPythonCore.mke
$(MakeProgram) $(_MakeFilePath)MSPythonWrapper\PyBentley\PyBentley.mke
$(MakeProgram) $(_MakeFilePath)MSPythonWrapper\PyBentleyGeom\PyBentleyGeom.mke
$(MakeProgram) $(_MakeFilePath)MSPythonWrapper\PyDgnPlatform\PyDgnPlatform.mke
Expand Down
93 changes: 0 additions & 93 deletions MSPythonCore.mke

This file was deleted.

139 changes: 139 additions & 0 deletions MSPythonCore/MSPythonCore.mke
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
#--------------------------------------------------------------------------------------
#
# $Source: MSPython\MSPythonCore\MSPythonCore.mke $
#
# $Copyright: (c) 2023 Bentley Systems, Incorporated. All rights reserved. $
#
#--------------------------------------------------------------------------------------
appName = MSPythonCore

%if defined (BSIBUILD)
MSPythonSrc = $(SrcRoot)MSPython/
%else
MSPythonSrc = $(SrcRoot)
%endif

PolicyFile = $(MSPythonSrc)/MSPythonAssertPolicy.mki
SolutionPolicyMki = $(MSPythonSrc)/MSPythonSolutionPolicy.mki

%include mdl.mki
#----------------------------------------------------------------------
# Define macros specific to this program
#----------------------------------------------------------------------
baseDir = $(_MakeFilePath)

#----------------------------------------------------------------------
# Create output directories
#----------------------------------------------------------------------
o = $(out)MSPythonCore/

always:
!~@mkdir $(o)

always:
~linkdir "$(BuildContext)PublicAPI/MsPythonCore=$(MSPythonSrc)/PublicAPI/MSPythonCore/"

#---------------------------------------------
# Compile Native source files
#---------------------------------------------
MultiCompileDepends = $(_MakeFileSpec)

PchCompiland = $(MSPythonSrc)MSPythonPCH.cpp
PchOutputDir = $(o)
PchArgumentsDepends = $(MultiCompileDepends)
PchExtraOptions + -Zm170 -wd4456 -wd4457 -wd4459 -wd4311 -wd4312 -wd4302 -wd4471 -wd4653 -wd4652 -wd4651

%include $(MSPythonSrc)/build/publicSDK/PreCompileHeader.mki

CCPchOpts = $(UsePrecompiledHeaderOptions)

dependencies = $(MSPythonSrc)MSPythonPCH.h

PyhonCoreSource = $(PyhonCore)ScriptEngineManager/source/
PythonCoreDependencies = $(dependencies) \
$(PythonInternalHeaders)MSPythonEngine.h \
$(PythonPublicHeaders)ScriptEngineManager.h

%include MultiCppCompileRule.mki

$(o)ScriptEngineManager$(oext) : $(PyhonCoreSource)ScriptEngineManager.cpp $(PythonCoreDependencies) ${MultiCompileDepends}

$(o)MSPythonEngine$(oext) : $(PyhonCoreSource)MSPythonEngine.cpp $(PythonCoreDependencies) ${MultiCompileDepends}

%include MultiCppCompileGo.mki
NATIVE_OBJS =% $(MultiCompileObjectList) \
$(o)MSPythonPCH$(oext)


#---------------------------------------------
# Compile Managed source files (/clr)
#---------------------------------------------
%include compileForCLRStart.mki

CCPchOpts =
MultiCompileDepends=$(_MakeFileSpec)

%include MultiCppCompileRule.mki

ScriptEngineManagerNetDependencies = $(dependencies) \
$(PythonPublicHeaders)ScriptEngineManager.h

$(o)ScriptEngineManagerNet$(oext) : $(PyhonCoreSource)ScriptEngineManagerNet.cpp $(ScriptEngineManagerNetDependencies) ${MultiCompileDepends}

%include MultiCppCompileGo.mki
MANAGED_OBJS =% $(MultiCompileObjectList)
%include compileForCLRStop.mki


DLM_NAME = $(appName)
RIGHTSCOMPLIANT = false
DLM_DEST = $(o)
DLM_EXPORT_DEST = $(o)
DLM_OBJECT_DEST = $(o)
DLM_OBJECT_FILES = $(NATIVE_OBJS) $(MANAGED_OBJS)
DLM_NO_DEF = 1
DLM_NO_DLS = 1
DLM_NO_IMPLIB = 0
DLM_NOENTRY = 0
DLM_NO_INITIALIZE_FUNCTION = 0

LINKER_LIBRARIES = $(PythonLibName) \
$(ContextSubpartsLibs)Bentley.lib \
$(ContextSubpartsLibs)BentleyAllocator.lib \
$(ContextSubpartsLibs)DgnPlatform.lib \
$(ContextSubpartsLibs)RmgrTools.lib \
$(ContextSubpartsLibs)mdlbltin.lib

DLM_CONTEXT_LOCATION = $(BuildContext)Delivery/

%if defined (BSI)
DLM_LIB_CONTEXT_LOCATION = $(BuildContext)Delivery/
DLM_CREATE_LIB_CONTEXT_LINK = 1
%else
DLM_LIB_CONTEXT_LOCATION = $(ContextSubpartsLibs)
%endif


ASSEMBLY_NAME = $(DLM_NAME)
ASSEMBLY_TITLE = $(DLM_NAME)
ASSEMBLY_DESCRIPTION = Bentley MSPython Core Mixed Assembly
ASSEMBLY_VERSION = 1.0.0.0
ASSEMBLY_FILE_VERSION = 1.0.0.0
ASSEMBLY_PRODUCT_NAME = MSPythonCore
ASSEMBLY_COMPANY_NAME = $(companyName)
ASSEMBLY_COPYRIGHT = $(Bentley_Copyright)

%if defined (BSI)

ASSEMBLY_STRONGNAME = 1
%include $(SharedMki)isRightsCompliant.mki
%include $(SharedMki)VersionedPartSignatureDefaults.mki

ASSEMBLY_KEYFILE =% $(ASSEMBLY_KEYFILE_DEFAULT)
ASSEMBLY_TESTKEYFILE =% $(ASSEMBLY_TESTKEYFILE_DEFAULT)

%endif


%include linkMixedAssembly.mki

Loading
Loading