mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-05-09 15:16:53 +02:00
[ui] introduce Scene3DHelper object
Expose missing QEntity methods and helper functions to QML via this Python class.
This commit is contained in:
parent
f6365c5607
commit
2f50587904
5 changed files with 54 additions and 1 deletions
|
@ -9,6 +9,7 @@ import meshroom
|
||||||
from meshroom.core import nodesDesc
|
from meshroom.core import nodesDesc
|
||||||
from meshroom.ui import components
|
from meshroom.ui import components
|
||||||
from meshroom.ui.components.filepath import FilepathHelper
|
from meshroom.ui.components.filepath import FilepathHelper
|
||||||
|
from meshroom.ui.components.scene3D import Scene3DHelper
|
||||||
from meshroom.ui.palette import PaletteManager
|
from meshroom.ui.palette import PaletteManager
|
||||||
from meshroom.ui.reconstruction import Reconstruction
|
from meshroom.ui.reconstruction import Reconstruction
|
||||||
from meshroom.ui.utils import QmlInstantEngine
|
from meshroom.ui.utils import QmlInstantEngine
|
||||||
|
@ -51,6 +52,8 @@ class MeshroomApp(QApplication):
|
||||||
self.engine.rootContext().setContextProperty("_PaletteManager", pm)
|
self.engine.rootContext().setContextProperty("_PaletteManager", pm)
|
||||||
fpHelper = FilepathHelper(parent=self)
|
fpHelper = FilepathHelper(parent=self)
|
||||||
self.engine.rootContext().setContextProperty("Filepath", fpHelper)
|
self.engine.rootContext().setContextProperty("Filepath", fpHelper)
|
||||||
|
scene3DHelper = Scene3DHelper(parent=self)
|
||||||
|
self.engine.rootContext().setContextProperty("Scene3DHelper", scene3DHelper)
|
||||||
self.engine.rootContext().setContextProperty("MeshroomApp", self)
|
self.engine.rootContext().setContextProperty("MeshroomApp", self)
|
||||||
# Request any potential computation to stop on exit
|
# Request any potential computation to stop on exit
|
||||||
self.aboutToQuit.connect(r.stopExecution)
|
self.aboutToQuit.connect(r.stopExecution)
|
||||||
|
|
|
@ -3,7 +3,8 @@ def registerTypes():
|
||||||
from PySide2.QtQml import qmlRegisterType
|
from PySide2.QtQml import qmlRegisterType
|
||||||
from meshroom.ui.components.edge import EdgeMouseArea
|
from meshroom.ui.components.edge import EdgeMouseArea
|
||||||
from meshroom.ui.components.filepath import FilepathHelper
|
from meshroom.ui.components.filepath import FilepathHelper
|
||||||
|
from meshroom.ui.components.scene3D import Scene3DHelper
|
||||||
|
|
||||||
qmlRegisterType(EdgeMouseArea, "GraphEditor", 1, 0, "EdgeMouseArea")
|
qmlRegisterType(EdgeMouseArea, "GraphEditor", 1, 0, "EdgeMouseArea")
|
||||||
qmlRegisterType(FilepathHelper, "Meshroom.Helpers", 1, 0, "FilepathHelper") # TODO: uncreatable
|
qmlRegisterType(FilepathHelper, "Meshroom.Helpers", 1, 0, "FilepathHelper") # TODO: uncreatable
|
||||||
|
qmlRegisterType(Scene3DHelper, "Meshroom.Helpers", 1, 0, "Scene3DHelper") # TODO: uncreatable
|
||||||
|
|
42
meshroom/ui/components/scene3D.py
Normal file
42
meshroom/ui/components/scene3D.py
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
from PySide2.QtCore import QObject, Slot
|
||||||
|
from PySide2.Qt3DCore import Qt3DCore
|
||||||
|
from PySide2.Qt3DRender import Qt3DRender
|
||||||
|
|
||||||
|
|
||||||
|
class Scene3DHelper(QObject):
|
||||||
|
|
||||||
|
@Slot(Qt3DCore.QEntity, str, result="QVariantList")
|
||||||
|
def findChildrenByProperty(self, entity, propertyName):
|
||||||
|
""" Recursively get all children of an entity that have a property named 'propertyName'. """
|
||||||
|
children = []
|
||||||
|
for child in entity.childNodes():
|
||||||
|
try:
|
||||||
|
if child.metaObject().indexOfProperty(propertyName) != -1:
|
||||||
|
children.append(child)
|
||||||
|
except RuntimeError:
|
||||||
|
continue
|
||||||
|
children += self.findChildrenByProperty(child, propertyName)
|
||||||
|
return children
|
||||||
|
|
||||||
|
@Slot(Qt3DCore.QEntity, Qt3DCore.QComponent)
|
||||||
|
def addComponent(self, entity, component):
|
||||||
|
""" Adds a component to an entity. """
|
||||||
|
entity.addComponent(component)
|
||||||
|
|
||||||
|
@Slot(Qt3DCore.QEntity, Qt3DCore.QComponent)
|
||||||
|
def removeComponent(self, entity, component):
|
||||||
|
""" Removes a component from an entity. """
|
||||||
|
entity.removeComponent(component)
|
||||||
|
|
||||||
|
@Slot(Qt3DCore.QEntity, result=int)
|
||||||
|
def vertexCount(self, entity):
|
||||||
|
""" Return vertex count based on children QGeometryRenderer 'vertexCount'."""
|
||||||
|
return sum([renderer.vertexCount() for renderer in entity.findChildren(Qt3DRender.QGeometryRenderer)])
|
||||||
|
|
||||||
|
@Slot(Qt3DCore.QEntity, result=int)
|
||||||
|
def faceCount(self, entity):
|
||||||
|
""" Returns face count based on children QGeometry buffers size."""
|
||||||
|
count = 0
|
||||||
|
for geo in entity.findChildren(Qt3DRender.QGeometry):
|
||||||
|
count += sum([attr.count() for attr in geo.attributes() if attr.name() == "vertexPosition"])
|
||||||
|
return count / 3
|
6
meshroom/ui/qml/Utils/Scene3DHelper.qml
Normal file
6
meshroom/ui/qml/Utils/Scene3DHelper.qml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
pragma Singleton
|
||||||
|
import Meshroom.Helpers 1.0
|
||||||
|
|
||||||
|
Scene3DHelper {
|
||||||
|
|
||||||
|
}
|
|
@ -4,3 +4,4 @@ SortFilterDelegateModel 1.0 SortFilterDelegateModel.qml
|
||||||
Request 1.0 request.js
|
Request 1.0 request.js
|
||||||
# causes random crash at application exit
|
# causes random crash at application exit
|
||||||
# singleton Filepath 1.0 Filepath.qml
|
# singleton Filepath 1.0 Filepath.qml
|
||||||
|
# singleton Scene3DHelper 1.0 Scene3DHelper.qml
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue