Difference between revisions of "IC Python API:List All Props"

From Reallusion Wiki!
Jump to: navigation, search
m (Everything Put Together)
m (Populating the Prop List)
Line 58: Line 58:
 
== Populating the Prop List ==
 
== Populating the Prop List ==
  
We'll need some additional lines of code to populate the props list.
+
We'll need some additional lines of code to populate the props list. We do this by adding entries into the QComboBox widget, for more information see [https://doc-snapshots.qt.io/qtforpython/PySide2/QtWidgets/QComboBox.html QComboBox.html]
  
 
<syntaxhighlight lang="Python">
 
<syntaxhighlight lang="Python">

Revision as of 22:36, 22 April 2019

Main article: RL Python Samples.

This article will focus on creating a drop down list for all of the existing props in the current iClone scene.

Necessary Modules

Get started by loading the required modules for the script.

import RLPy
from PySide2 import QtWidgets
from PySide2.shiboken2 import wrapInstance

We'll need RLPy to access iClone's Python API and Pyside2 related modules to create a functional interface.

Qt Widgets

The Qt Widgets module extends Qt GUI with C++ widget functionality. This is the building blocks for composing the user interface.

For more information, see Pyside2 QtWidgets

Shiboken2

Shiboken is the Python binding generator that Qt for Python uses to create the PySide module, in other words, its the system used to expose the Qt C++ API to Python. The name Shiboken2 and Pyside2 make reference to the Qt5 compatibility, since the previous versions (without the 2) refer to Qt4.

For more information, see the Shiboken documentation

Building the UI

Creating a window requires that we define it as a global entity and reference it in the run_script definition. Notice that the window requires a main widget with a layout. The layout is also where individual child UI elements are added.

# Create an iClone Dock Widget
dockable_window = RLPy.RUi.CreateRDockWidget()
dockable_window.SetWindowTitle("All Scene Props")
# Use wrapInstance to convert the dockable window to something that Python can understand, in this case a Dock Widget
dock = wrapInstance(int(dockable_window.GetWindow()),
                    QtWidgets.QDockWidget)
main_widget = QtWidgets.QWidget()
dock.setWidget(main_widget)

main_widget_layout = QtWidgets.QVBoxLayout()
main_widget.setLayout(main_widget_layout)

combo_box = QtWidgets.QComboBox()

main_widget_layout.addWidget(combo_box)

If you run the above scripts, you'll receive an empty shell of an UI. Which is not very useful to us unless we populate the combo-box.

Python API List All Props 01.png

Populating the Prop List

We'll need some additional lines of code to populate the props list. We do this by adding entries into the QComboBox widget, for more information see QComboBox.html

# Grab all props in the scene
all_props = RLPy.RScene.FindObjects(RLPy.EObjectType_Prop)
# Add an entry into the combo-box for every prop found
for i in range(len(all_props)):
    combo_box.addItem(all_props[i].GetName())

Now when we run the script again, we get something that is much more useful.

Python API List All Props 02.png

You can also grab other asset types like avatars, cameras, lights, etc. For example:

all_avatars = RLPy.RScene.FindObject(RLPy.EObjectType_Avatar)
all_cameras = RLPy.RScene.FindObject(RLPy.EObjectType_Camera)
all_lights = RLPy.RScene.FindObject(RLPy.EObjectType_Light)

For more information, see RLPy.RScene.FindObjects()

Everything Put Together

You can copy and paste the following code into a PY file and load it into iClone via Script > Load Python.

import RLPy
from PySide2 import QtWidgets
from PySide2.shiboken2 import wrapInstance

# Create an iClone Dock Widget
dockable_window = RLPy.RUi.CreateRDockWidget()
dockable_window.SetWindowTitle("All Scene Props")
# Use wrapInstance to convert the dockable window to something that Python can understand, in this case a Dock Widget
dock = wrapInstance(int(dockable_window.GetWindow()),
                    QtWidgets.QDockWidget)
main_widget = QtWidgets.QWidget()
dock.setWidget(main_widget)

main_widget_layout = QtWidgets.QVBoxLayout()
main_widget.setLayout(main_widget_layout)

combo_box = QtWidgets.QComboBox()

main_widget_layout.addWidget(combo_box)

# Grab all props in the scene
all_props = RLPy.RScene.FindObjects(RLPy.EObjectType_Prop)
# Add an entry into the combo-box for every prop found
for i in range(len(all_props)):
    combo_box.addItem(all_props[i].GetName())

dockable_window.Show()

When you load this script into a scene that is heavily populated with props you'll get a result similar to the following:

IClone API List All Props 03.gif