SP的python插件开发笔记(一)

0.简介

sp目前对python的支持力度还是蛮大的,基本上已经不存在js有但是py没有的api了。

前段时间因为工作原因开发了一个sp的python插件,把过程中的一些相对重要并且很难找到资料的部分记录下来当做备忘。

一些创建插件的基础部分可以在知乎搜索“sp插件”之类的关键词,有很多很好的文章。

1.窗体UI

使用pyside2做UI即可。

substance_painter.ui​下提供了一个获取主窗口的函数.get_main_window()​。

1
2
3
4
5
6
7
8
9
10
11
import substance_painter
import PySide2
def createNewWindow():
#获取sp主窗口
mainWindow = substance_painter.ui.get_main_window()
#PySide2.QDialog(mainWindow)替换成自己的模块的UI函数
newWindow = PySide2.QDialog(mainWindow)
newWindow.show()
#需要一个数组储存此窗口,以便于插件关闭时能够清理所有UI
plug_widgets.append(newWindow)

2.substance_painter.event

sp的事件模块,主要依赖于调度器(.DISPATCHER)对事件和函数进行连接和解除连接

导入:

1
from substance_painter.event import DISPATCHER

四个核心函数

1
2
3
4
5
6
7
8
DISPATCHER.connect(event,Func)
'''对信号和函数的弱连接,当函数被回收后(如函数执行完毕或函数所在类实例被回收),断开连接'''
DISPATCHER.connect_strong(event,Func)
’‘'对信号和函数的强连接,永远不会断开连接。
DISPATCHER.disconnect(event,Func)
'''断开信号和函数的连接,注意先检查调度器是否在监听此事件"
DISPATCHER._has_listeners(event)
'''检查调度器是否在监听此事件'''

部分事件会默认传入参数,如substance_painter.event.BusyStatusChanged会传入一个bool变量来表示此时项目是否繁忙。

连接此事件的函数需要将事件作为参数使用。

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#导入调度器和相关事件
from substance_painter.event import DISPATCHER,BusyStatusChanged
class Project(object):
def __init__(self):
#强绑定信号
        DISPATCHER.connect_strong(BusyStatusChanged, self.whenProjectBusyStatusChanged)
def whenProjectBusyStatusChanged(self,event):
if event.busy == False:
#do somethings
         #调度器是否还在监听此事件
if DISPATCHER._has_listeners(BusyStatusChanged):
try:
#尝试解绑
DISPATCHER.disconnect(BusyStatusChanged,self.whenProjectBusyStatusChanged)
except:
pass

3.substance_painter.project.Matedata

项目元数据,能够保存在项目文件中,靠context进行区分。

能够储存一些此项目独有的数据和配置,能够跟着sp项目走。

官网的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import substance_painter

# Instantiate the Metadata utility, for the plugin "MyPlugin".
metadata = substance_painter.project.Metadata("MyPlugin")

# Store a version number under the key "version".
plugin_version = { "major": 1, "minor": 0 }
metadata.set("version", plugin_version)

# List the project's metadata keys. The key "version" is now present.
keys = metadata.list()
print(keys)

# Retrieve the metadata "version".
plugin_version = metadata.get("version")
print("Version: " + str(plugin_version))

4.网络路径问题

sp不支持对如\\17.1.1.1\​之类的网络路径进行读取资产或者输出贴图之类的操作(但是支持插件放在网络路径上)。

因此如果要做一些公共库,项目管理之类的东西,最好将网络路径映射到本地盘符上。