Skip to content

Commit

Permalink
Fix PyQGIS 3D module patching
Browse files Browse the repository at this point in the history
The module patching for _3d was not working at all, because
the same logic which works for other modules with a private _module
copy clashed with the approach of exposing the public 3d module
as qgis._3d

Work around this by renaming the private internal module as _3d_p,
so that the monkey patching logic from sip is correctly run
when the module is loaded.

Fixes broken API in 3d module for renamed enums, and fixes the
broken PyQGIS doc for the 3d module
  • Loading branch information
nyalldawson committed Aug 30, 2024
1 parent 5668207 commit da317dd
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 47 deletions.
2 changes: 1 addition & 1 deletion python/3d/3d.sip.in
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
%Module(name=qgis._3d,
%Module(name=qgis._3d_p,
keyword_arguments="All")

${DEFAULTDOCSTRINGSIGNATURE}
Expand Down
40 changes: 20 additions & 20 deletions python/3d/__init__.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -22,43 +22,43 @@ __date__ = 'May 2014'
__copyright__ = '(C) 2014, Nathan Woodrow'

from qgis.PyQt import QtCore
from qgis._3d import *
from qgis._3d_p import *

@MONKEYPATCH_INJECTIONS@

from qgis.core import Qgis
from qgis.core import Qgis as _Qgis

# manual monkey patching for old enum values
Qgs3DTypes.AltitudeClamping = Qgis.AltitudeClamping
Qgs3DTypes.AltClampAbsolute = Qgis.AltitudeClamping.Absolute
Qgs3DTypes.AltitudeClamping = _Qgis.AltitudeClamping
Qgs3DTypes.AltClampAbsolute = _Qgis.AltitudeClamping.Absolute
Qgs3DTypes.AltClampAbsolute.is_monkey_patched = True
Qgs3DTypes.AltClampRelative = Qgis.AltitudeClamping.Relative
Qgs3DTypes.AltClampRelative = _Qgis.AltitudeClamping.Relative
Qgs3DTypes.AltClampRelative.is_monkey_patched = True
Qgs3DTypes.AltClampTerrain = Qgis.AltitudeClamping.Terrain
Qgs3DTypes.AltClampTerrain = _Qgis.AltitudeClamping.Terrain
Qgs3DTypes.AltClampTerrain.is_monkey_patched = True

Qgs3DTypes.AltitudeBinding = Qgis.AltitudeBinding
Qgs3DTypes.AltBindVertex = Qgis.AltitudeBinding.Vertex
Qgs3DTypes.AltitudeBinding = _Qgis.AltitudeBinding
Qgs3DTypes.AltBindVertex = _Qgis.AltitudeBinding.Vertex
Qgs3DTypes.AltBindVertex.is_monkey_patched = True
Qgs3DTypes.AltBindCentroid = Qgis.AltitudeBinding.Centroid
Qgs3DTypes.AltBindCentroid = _Qgis.AltitudeBinding.Centroid
Qgs3DTypes.AltBindCentroid.is_monkey_patched = True

QgsPoint3DSymbol.Shape = Qgis.Point3DShape
QgsPoint3DSymbol.Cylinder = Qgis.Point3DShape.Cylinder
QgsPoint3DSymbol.Shape = _Qgis.Point3DShape
QgsPoint3DSymbol.Cylinder = _Qgis.Point3DShape.Cylinder
QgsPoint3DSymbol.Cylinder.is_monkey_patched = True
QgsPoint3DSymbol.Sphere = Qgis.Point3DShape.Sphere
QgsPoint3DSymbol.Sphere = _Qgis.Point3DShape.Sphere
QgsPoint3DSymbol.Sphere.is_monkey_patched = True
QgsPoint3DSymbol.Cone = Qgis.Point3DShape.Cone
QgsPoint3DSymbol.Cone = _Qgis.Point3DShape.Cone
QgsPoint3DSymbol.Cone.is_monkey_patched = True
QgsPoint3DSymbol.Cube = Qgis.Point3DShape.Cube
QgsPoint3DSymbol.Cube = _Qgis.Point3DShape.Cube
QgsPoint3DSymbol.Cube.is_monkey_patched = True
QgsPoint3DSymbol.Torus = Qgis.Point3DShape.Torus
QgsPoint3DSymbol.Torus = _Qgis.Point3DShape.Torus
QgsPoint3DSymbol.Torus.is_monkey_patched = True
QgsPoint3DSymbol.Plane = Qgis.Point3DShape.Plane
QgsPoint3DSymbol.Plane = _Qgis.Point3DShape.Plane
QgsPoint3DSymbol.Plane.is_monkey_patched = True
QgsPoint3DSymbol.ExtrudedText = Qgis.Point3DShape.ExtrudedText
QgsPoint3DSymbol.ExtrudedText = _Qgis.Point3DShape.ExtrudedText
QgsPoint3DSymbol.ExtrudedText.is_monkey_patched = True
QgsPoint3DSymbol.Model = Qgis.Point3DShape.Model
QgsPoint3DSymbol.Model = _Qgis.Point3DShape.Model
QgsPoint3DSymbol.Model.is_monkey_patched = True
QgsPoint3DSymbol.Billboard = Qgis.Point3DShape.Billboard
QgsPoint3DSymbol.Billboard = _Qgis.Point3DShape.Billboard
QgsPoint3DSymbol.Billboard.is_monkey_patched = True

2 changes: 1 addition & 1 deletion python/3d/project.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class Qgis3D(PyQtBindings):

def __init__(self, project):
""" Initialize the bindings. """
super().__init__(project, '3d')
super().__init__(project, '3d_p')
self.sip_file = '3d.sip'
self.exceptions = True
self.release_gil = True
Expand Down
40 changes: 26 additions & 14 deletions python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -252,21 +252,21 @@ if (WITH_3D)

file(GLOB_RECURSE sip_files_3d ${BINDING_FILES_ROOT_DIR}/3d/*.sip ${BINDING_FILES_ROOT_DIR}/3d/*.sip.in)
set(SIP_EXTRA_FILES_DEPEND ${sip_files_core} ${sip_files_3d})
set(SIP_EXTRA_OPTIONS ${PYQT_SIP_FLAGS} -g -o -a ${CMAKE_BINARY_DIR}/python/qgis.3d.api)
set(SIP_EXTRA_OPTIONS ${PYQT_SIP_FLAGS} -g -o -a ${CMAKE_BINARY_DIR}/python/qgis.3d_p.api)
if((${SIP_VERSION_STR} VERSION_EQUAL 4.19.11) OR (${SIP_VERSION_STR} VERSION_GREATER 4.19.11))
set(SIP_EXTRA_OPTIONS ${SIP_EXTRA_OPTIONS} -n ${PYQT_SIP_IMPORT})
endif()
if(SIP_BUILD_EXECUTABLE)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/3d/build/_3d/_3d.pyi DESTINATION ${QGIS_PYTHON_DIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/3d/build/3d_p/3d_p.pyi DESTINATION ${QGIS_PYTHON_DIR})
elseif((${SIP_VERSION_STR} VERSION_EQUAL 4.18) OR (${SIP_VERSION_STR} VERSION_GREATER 4.18))
set(SIP_EXTRA_OPTIONS ${SIP_EXTRA_OPTIONS} -y ${QGIS_PYTHON_OUTPUT_DIRECTORY}/_qgis3d.pyi)
install(FILES ${QGIS_PYTHON_OUTPUT_DIRECTORY}/_qgis3d.pyi DESTINATION ${QGIS_PYTHON_DIR})
set(SIP_EXTRA_OPTIONS ${SIP_EXTRA_OPTIONS} -y ${QGIS_PYTHON_OUTPUT_DIRECTORY}/3d_p.pyi)
install(FILES ${QGIS_PYTHON_OUTPUT_DIRECTORY}/3d_p.pyi DESTINATION ${QGIS_PYTHON_DIR})
endif()

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/3d/project.py.in ${CMAKE_CURRENT_BINARY_DIR}/3d/project.py @ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/3d/pyproject.toml.in ${CMAKE_CURRENT_BINARY_DIR}/3d/pyproject.toml @ONLY)
GENERATE_SIP_PYTHON_MODULE_CODE(qgis._3d 3d/3d.sip "${sip_files_3d}" cpp_files)
BUILD_SIP_PYTHON_MODULE(qgis._3d 3d/3d.sip ${cpp_files} "" qgis_core qgis_3d)
GENERATE_SIP_PYTHON_MODULE_CODE(qgis._3d_p 3d/3d.sip "${sip_files_3d}" cpp_files)
BUILD_SIP_PYTHON_MODULE(qgis._3d_p 3d/3d.sip ${cpp_files} "" qgis_core qgis_3d)
endif()

# server module
Expand Down Expand Up @@ -345,7 +345,11 @@ if(WITH_QSCIAPI)
set(api_modules)
set(api_files)
foreach(module ${PY_MODULES})
set(api_modules ${api_modules} python_module_qgis__${module})
set(module_out ${module})
if(${module} EQUAL "3d")
set(module_out "3d_p")
endif()
set(api_modules ${api_modules} python_module_qgis__${module_out})
if(NOT SIP_BUILD_EXECUTABLE)
set(api_files ${api_files} "${CMAKE_BINARY_DIR}/python/qgis.${module}.api")
else()
Expand Down Expand Up @@ -409,8 +413,16 @@ foreach(pyfile ${PY_FILES})
endforeach(pyfile)

foreach(module ${PY_MODULES})
set(module_out ${module})
if(${module} EQUAL "3d")
set(module_out "3d_p")
endif()
set(module_name ${module})
if(${module} EQUAL "3d")
set(module_name "_3d")
endif()
add_custom_target(py${module} ALL)
add_dependencies(py${module} python_module_qgis__${module})
add_dependencies(py${module} python_module_qgis__${module_out})

# concat auto_additions/*.py in _module_/__init__.py
file(GLOB PY_FILES_AUTO_ADDITIONS ${BINDING_FILES_ROOT_DIR}/${module}/auto_additions/*.py)
Expand All @@ -419,14 +431,14 @@ foreach(module ${PY_MODULES})
file(READ ${pyfile} CONTENTS)
string(APPEND MONKEYPATCH_INJECTIONS "${CONTENTS}")
endforeach(pyfile)
configure_file(${BINDING_FILES_ROOT_DIR}/${module}/__init__.py.in ${QGIS_PYTHON_OUTPUT_DIRECTORY}/${module}/__init__.py @ONLY)
install(FILES ${QGIS_PYTHON_OUTPUT_DIRECTORY}/${module}/__init__.py DESTINATION "${QGIS_PYTHON_DIR}/${module}")
configure_file(${BINDING_FILES_ROOT_DIR}/${module}/__init__.py.in ${QGIS_PYTHON_OUTPUT_DIRECTORY}/${module_name}/__init__.py @ONLY)
install(FILES ${QGIS_PYTHON_OUTPUT_DIRECTORY}/${module_name}/__init__.py DESTINATION "${QGIS_PYTHON_DIR}/${module_name}")

file(GLOB PY_FILES ${BINDING_FILES_ROOT_DIR}/${module}/*.py)
install(FILES ${PY_FILES} DESTINATION "${QGIS_PYTHON_DIR}/${module}")
install(FILES ${PY_FILES} DESTINATION "${QGIS_PYTHON_DIR}/${module_name}")
file(GLOB PY_FILES_ADDITIONS ${BINDING_FILES_ROOT_DIR}/${module}/additions/*.py)

install(FILES ${PY_FILES_ADDITIONS} DESTINATION "${QGIS_PYTHON_DIR}/${module}/additions")
install(FILES ${PY_FILES_ADDITIONS} DESTINATION "${QGIS_PYTHON_DIR}/${module_name}/additions")
set(PY_FILES ${PY_FILES} ${PY_FILES_ADDITIONS})
foreach(pyfile ${PY_FILES})
file(RELATIVE_PATH rel_pyfile ${BINDING_FILES_ROOT_DIR} ${pyfile})
Expand All @@ -440,10 +452,10 @@ foreach(module ${PY_MODULES})
DEPENDS ${PY_FILES}
)
endforeach(pyfile)
PY_COMPILE(py${module} "${QGIS_PYTHON_OUTPUT_DIRECTORY}/${module}")
PY_COMPILE(py${module} "${QGIS_PYTHON_OUTPUT_DIRECTORY}/${module_name}")

# install class map file
install(FILES ${BINDING_FILES_ROOT_DIR}/${module}/class_map.yaml DESTINATION "${QGIS_PYTHON_DIR}/${module}")
install(FILES ${BINDING_FILES_ROOT_DIR}/${module}/class_map.yaml DESTINATION "${QGIS_PYTHON_DIR}/${module_name}")

# install source sip files
if(SIP_GLOBAL_INSTALL)
Expand Down
2 changes: 1 addition & 1 deletion python/PyQt6/3d/3d.sip.in
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
%Module(name=qgis._3d,
%Module(name=qgis._3d_p,
keyword_arguments="All")

${DEFAULTDOCSTRINGSIGNATURE}
Expand Down
38 changes: 29 additions & 9 deletions python/PyQt6/3d/__init__.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,43 @@ __date__ = 'May 2014'
__copyright__ = '(C) 2014, Nathan Woodrow'

from qgis.PyQt import QtCore
from qgis._3d import *
from qgis._3d_p import *

from qgis.core import Qgis
from qgis.core import Qgis as _Qgis

@MONKEYPATCH_INJECTIONS@

# manual monkey patching for old enum values
Qgs3DTypes.AltitudeClamping = Qgis.AltitudeClamping
Qgs3DTypes.AltClampAbsolute = Qgis.AltitudeClamping.Absolute
Qgs3DTypes.AltitudeClamping = _Qgis.AltitudeClamping
Qgs3DTypes.AltClampAbsolute = _Qgis.AltitudeClamping.Absolute
Qgs3DTypes.AltClampAbsolute.is_monkey_patched = True
Qgs3DTypes.AltClampRelative = Qgis.AltitudeClamping.Relative
Qgs3DTypes.AltClampRelative = _Qgis.AltitudeClamping.Relative
Qgs3DTypes.AltClampRelative.is_monkey_patched = True
Qgs3DTypes.AltClampTerrain = Qgis.AltitudeClamping.Terrain
Qgs3DTypes.AltClampTerrain = _Qgis.AltitudeClamping.Terrain
Qgs3DTypes.AltClampTerrain.is_monkey_patched = True

Qgs3DTypes.AltitudeBinding = Qgis.AltitudeBinding
Qgs3DTypes.AltBindVertex = Qgis.AltitudeBinding.Vertex
Qgs3DTypes.AltitudeBinding = _Qgis.AltitudeBinding
Qgs3DTypes.AltBindVertex = _Qgis.AltitudeBinding.Vertex
Qgs3DTypes.AltBindVertex.is_monkey_patched = True
Qgs3DTypes.AltBindCentroid = Qgis.AltitudeBinding.Centroid
Qgs3DTypes.AltBindCentroid = _Qgis.AltitudeBinding.Centroid
Qgs3DTypes.AltBindCentroid.is_monkey_patched = True

QgsPoint3DSymbol.Shape = _Qgis.Point3DShape
QgsPoint3DSymbol.Cylinder = _Qgis.Point3DShape.Cylinder
QgsPoint3DSymbol.Cylinder.is_monkey_patched = True
QgsPoint3DSymbol.Sphere = _Qgis.Point3DShape.Sphere
QgsPoint3DSymbol.Sphere.is_monkey_patched = True
QgsPoint3DSymbol.Cone = _Qgis.Point3DShape.Cone
QgsPoint3DSymbol.Cone.is_monkey_patched = True
QgsPoint3DSymbol.Cube = _Qgis.Point3DShape.Cube
QgsPoint3DSymbol.Cube.is_monkey_patched = True
QgsPoint3DSymbol.Torus = _Qgis.Point3DShape.Torus
QgsPoint3DSymbol.Torus.is_monkey_patched = True
QgsPoint3DSymbol.Plane = _Qgis.Point3DShape.Plane
QgsPoint3DSymbol.Plane.is_monkey_patched = True
QgsPoint3DSymbol.ExtrudedText = _Qgis.Point3DShape.ExtrudedText
QgsPoint3DSymbol.ExtrudedText.is_monkey_patched = True
QgsPoint3DSymbol.Model = _Qgis.Point3DShape.Model
QgsPoint3DSymbol.Model.is_monkey_patched = True
QgsPoint3DSymbol.Billboard = _Qgis.Point3DShape.Billboard
QgsPoint3DSymbol.Billboard.is_monkey_patched = True
2 changes: 1 addition & 1 deletion python/PyQt6/3d/project.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class Qgis3D(PyQtBindings):

def __init__(self, project):
""" Initialize the bindings. """
super().__init__(project, '3d')
super().__init__(project, '3d_p')
self.sip_file = '3d.sip'
self.exceptions = True
self.release_gil = True
Expand Down

0 comments on commit da317dd

Please sign in to comment.