教程 8:如何结合使用旧版 v1 和新版 v2 Python 界面

教程 8:如何结合使用旧版 v1 和新版 v2 Python 界面视频介绍了旧的 vrNodePtr 对象和新的 vrdNode 对象之间的互操作性示例。

下载示例脚本

跳转到脚本示例

下载教程 PDF

视频字幕:大家好,欢迎学习这一面向 VRED Pro 的新 Python 教程。我叫 Christopher,今天我将介绍如何结合使用 Python API v1 和 v2 中的不同数据类型和函数。

API v2 版本对我们在 VRED 中与数据交互的方式进行了一些巨大的更改。现在,这些功能组合到相应名称的服务中,而不是使用模块。例如,现在 vrCameraServicevrNodeService 包含以前在 vrCameravrNodePtr 中可用的所有方法。这些服务替代了 API v1 中的大多数函数,但并非所有函数。仍有一些仅在 API v1 中可用的函数。此外,可能还有一些使用旧版 API 的插件和脚本,其接口要求数据与 API v1 兼容。因此,在某些情况下,您必须结合使用两个 API 中的函数和数据类型,以确保旧脚本和插件与我们正在开发的新脚本配合良好。

我们先从最大的差异开始,即处理节点。v1 使用节点指针与变换节点、组节点、几何体节点等节点进行交互。您可以使用 vrScenegraph 模块 findNodes 中的函数在场景中查找节点,此函数返回 vrNodePointer。通过使用此节点指针,我们可以调用属于 vrNodePointer 类(有关此类的说明,请参见相关文档)的任何函数。例如,用于所有变换操作、设置或获取材质、将子项添加到场景图形等的函数。

随着 API v2 的推出,Autodesk 现在引入了 vrdNodeType,旨在一定程度上替代旧的 vrNodePointer,同时还引入了 vrNodeService 类来帮助您使用它。从 vrNodeService 调用 findNode 操作时,此操作返回 vrdNode,并且可以使用 vrNodeService.findNode 调用此操作。这样,就不会在脚本中混淆这些相似的函数。现在,使用服务返回的 vrdNode,您可以调用 vrdNode 类中定义的任何函数。由于 vrdNode 继承 vrdTransformNode 中的函数,因此,您还可以调用其中的任何变换操作。

API v1 和 v2 中仍有相当多的函数将在同一脚本中使用,它们将使用 NodePtr 类作为参数或新的 vrdNode。通常,这确实会造成混淆。但幸运的是,Autodesk 工程师更改了这两个 API,使它们在函数中接受这两种类型的节点。在通常要求使用 vrdNode 的函数中完全可以使用 NodePtr,反之亦然。这样,我们就不必担心节点是否正确。在此示例中,我们可以创建一个新节点并指定其父节点。我们可以看到,这两种类型的节点都可以用作参数,而不会显示错误。

当然,也可以将 NodePtr 转换为 vrdNode。文档中指出有两个函数可执行此操作,但不太容易记住它们。如果要从新的 vrdNode 转换为旧的 NodePtr,则使用 toNode 函数并将 vrdNode 的对象 ID 作为参数。这会将 vrdNode 转换为 NodePtr。如果要执行相反操作,则调用 vrNodeService 类中的 getNodeFromId 函数。此方法也将 NodeId 作为参数。但这次我们使用另一个函数来获取 ID。如果您需要进行此转换,请在文档中查看相关内容。实际上没有人要求您将它们牢记于心,您可以回头查看。

API v2 还引入了新的数据类型,它们有助于软件开发。例如,“变换操作”现在全都使用“Qt 矢量”类型。使用它们并不是太难。大多数情况下,只是将原本单独使用的值放入新数据类型中,正如这个新的 QVector3D 类型示例中所示。

颜色类型有一个静态函数,它可帮助您创建对象,而且还提供不同的颜色格式,例如 RGB 或 HSV。您不必导入这些类型,因为默认情况下,它们已经添加到 VRED 名称空间。我们提供了一个介绍新数据类型的完整教程,因此请务必查看此教程以获取有关该主题的详细信息。

目前,vrNodePointervrdNode 都可以在脚本中使用。在一些用例中,您可能希望使用其中一个,而不是另一个。这可能只是因为更方便,也可能是因为新 API 尚未准备好替代 vrdNodePointer 的所有功能。

处理材质就是一个很好的示例。您只能使用 vrNodePointer 而不能使用 vrdNode 来设置和获取材质。但是,我认为在未来发布版本中将会看到类似 vrMaterialService 的内容。随着时间推移,新版 API 一定会逐渐取代旧版 API,因此您应尽可能使用 API v2。

关于旧 API v1 和新 API v2 的介绍,今天就到这里。您现在应该已充分了解如何结合使用这两个 API 来编写面向未来的高效脚本。感谢您观看本视频,下次见。


Python 代码示例

下面是教程 8:如何结合使用旧版 v1 和新版 v2 Python 界面视频随附的 Python 脚本示例。

提示:

要下载这些压缩文件,请单击此处

deprecated_examples.py

# Deprecated API v1 functions

# vrCamera
addViewPoint("New Viewpoint")

vrCameraService.createViewpoint('New Viewpoint')

# vrOSGWidget
createBackplate('filePath')
setBackplate('filePath')
deleteBackplate()

vrSceneplateService.createNode()  # TODO Parameter prüfen

# vrRenerSettings
setRaytracingAAThreshold()

difference_nodes_v1_v2.py

# Node pointers with API v1

# Find node "EXT" with API v1
extNodePtr = findNode("EXT")

# set translation
extNodePtr.setTranslation(0,0,38)

# get translation
translation = extNodePtr.getTranslation()
print("Translation:", translation)

# set name
extNodePtr.setName("Another EXT")



# Node pointers with API v2

# Find node "EXT" with API v2
ext`VrdNode` = `vrNodeService.findNode`("EXT")

# set translation
translationVector = QVector3D(0,0,38)
ext`VrdNode`.setTranslation(translationVector)

# get translation
translation = ext`VrdNode`.getTranslation()
print("Translation:", translation)

# set name
ext`VrdNode`.setName("Another EXT")

node_examples.py

# Example 1.0
# Finding Nodes

# Finding nodes with API v1 and v2
study_NodePtr = findNode('Study_Transform')
study_`vrdNode` = `vrNodeService.findNode`('Study_Transform')

# Example 2.0
# Using API v1 functions with `vrdNode`s
createNode("Group", "Interieur_nodePtr", study_NodePtr)
print("Created new group with nodePtr")

createNode("Group", "Interieur_`vrdNode`", study_`vrdNode`)
print("Created new group with `vrdNode`")

updateScenegraph(True)


# Using API v2 functions with `vrNodePtr`s
interieur_NodePtr = findNode('Interieur_nodePtr')

childIndex = study_`vrdNode`.getChildIndex(interieur_NodePtr)

print("Interieur Node is at index:", childIndex)


# Example 3.0
# Convert from nodePtr to `vrdNode`
targetNodePtr = findNode("Target")
targetNode = `vrNodeService`.`getNodeFromId`(targetNodePtr.getID())

# Convert from `vrdNode` to nodePtr
targetNodePtr = toNode(targetNode.getObjectId())