日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

minecraft pythonapl_Substance PythonAPI入门案例

發布時間:2023/12/2 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 minecraft pythonapl_Substance PythonAPI入门案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一次在知乎發文,技術朋友們請多包涵。

Substance Designer自去年夏天2018版推出Python API至今已有一年,從一開始的寒酸到現在的初成規模,官方的API庫也隨著版本的更新不斷完善。目前網上(包括youtube)相關的教程甚少,即便是官方去年推出的唯一一門入門教程,也隨著2019的更新而變得不再適用于當前最新的SD版本。今天就乘著興致發一篇帶案例的入門SD Python API小教程以及我自己總結的探索SD Python API的一些基本思路。

既然是Python API的相關,我這邊就不過度闡述python的基本語法了。

寫腳本的一開始,首先必須引入的sd的總類“sd”:

另外,SD2019已經引入了PyQt這個強大的Python GUI,所以,同時引入PySide2:

同時,由于本篇涉及到保存的操作,所以引入os模塊方便提取文件路徑。

SD腳本絕大部分的操作是從獲取SDApplication開始的:

Python中一切皆對象,我們大部分獲取的object都可以通過官方API幫助文檔來獲取自身相應的實例方法,這也是自我學習最主要途徑之一,一定要多翻官方API幫助文檔:Help -> Python API Documentation官方API離線幫助文檔

回到正題,一開始我們通過sd.getContext().getSDApplication()獲得了SDApplication對象并賦予到了自己定義的app這個變量上。

接下來我們要得到3個Manager:sdPackageManager、uiManager、qtUIManager。

這三個manager都是從app中得到,去到sdapplication module幫助文檔,可以查閱到獲取方法:獲得PackageMgr獲得QtForPythonUIMgr獲得UIMgr

這里值得一提的是這個QtForPythonUIMgr(),幫助文檔里并沒有寫返回的東西,只有三個點... 它的信息可以再qtforpythonuimgrwrapper里找到:

進去之后。找到getMainWindow():

并用一個變量接受返回的QMainWindow:

至此,寫ui類之前的準備工作基本完成。因為要寫保存功能,所以預先存儲一個地址的變量saving_path在外面。當然這變量也能寫在類的里面,因為用戶可能要在UI上自己指定地址。

進入到類的編寫:

在類的構造函數中,這個類繼承自QtWidgets.QDialog,使用super先執行QDialog的構造函數,并將parent變量先繼承下來,同時加上自己定義的實例變量pkg_mgr和abs_saving_path。

UI窗口的名字直接使用setWindowTitle('..')來定義:一開始的UI窗口名字

這邊的custom_print _field先不用管。這是下面要用的輸入欄的實例變量。

在構造函數最后運行build_ui()實例方法來創建UI。build_ui方法會在下面定義:

要用文字一行行解釋過于麻煩,我總結一些我這個UI創建的大致思路:

首先得定義一個總Layout,master_layout,用來控制整體的Layout走向。QVBoxLayout則是Qt中整體縱向排布的基本布局,作用在self也就是實例上來控制整體走向。

確定整體走向之后,可以分批定義child widget,我這里有兩個child widget,分別是custom_print _widget和creation_widget。

child widget定義完之后,可以設定這個child widget自己的layout(作用在自身):

先展示一下這個custom_print_widget的基本效果:

這是一個橫向的布局也就是QHBoxLayout的作用。左邊是一個輸入框,右邊是一個按鈕。輸入框由于需要在另外的實例方法中繼續提取它的信息,所以把它當做一個實例變量定義在構造函數中了:

這個輸入欄的對象是由QtWidgets.QLineEdit()獲取而來。

按鈕的對象由QtWidgets.QPushButton()獲取而來:

點擊的發生的事件則由clicked.connect(實例方法)來建立。

創建完了兩個組件之后,需要把它們按順序添加到child widget的layout中:

這樣一個完整的child widget就寫完了。

最后,將這個child widget添加到master_layout中:

這就是基本的QtUI模塊的創建思路。creation_widget的創建思路也完全一樣,就不過多做闡述了。UI創建好了之后,再在類里添加一個展示UI的實例方法:show()是QDialog可以直接調用的方法

在類的外部,建立一個實例,并調用display_window方法來顯示UI:

接下來闡述一下save的實現:

這里需要用到一開始定義的sdPackageMgr,通過它可以獲取工作目錄下的package:

使用getUserPackages()方法(在幫助文檔的sdpackage module下可以找到)獲取到一個存儲著sdPackage object的SD數組(SD Array),使用for循環遍歷這個數組來提取每一個工作欄下的package,我們可以利用getFilePath()的返回來確認它是否有被保存:

如果通過getFilePath()可以返回一個確切路徑的話,那就說明這個package已經被保存過了,如果返回的是一個空值NoneType,那就說明這個package沒有被保存過。

對于已經保存過的package,可以使用pkgMgr下的savePackage()方法來進行覆蓋保存工作,對于沒有保存過的package,可以使用pkgMgr下的savePackageAs()方法來進行第一次的另存為保存:

savePackageAs方法后面除了sdPackage這個變量之外,還需要一個絕對路徑(以.sbs后綴結尾)。輸入保存名稱并點擊save

可以看到在相關路徑下,package被正確保存下來了。

接下來解析下面四個按鈕的作用和實現:

這四個按鈕的功能是創建對應的SD節點,非常直觀的四個常用節點名稱。

這里的思路是這樣的,一般情況下,四個節點的clicked事件會綁定不同的四個方法,因為clicked.connect()里面傳入的是方法名而不是實現:

所以說,如果有非常多的節點,那么常規思路下就得定義對應數量的方法來判斷到底用戶點擊了哪個按鈕,但這樣寫的話,代碼量就會變得非常龐大。我這里的思路是通過Qt里sender()的方法來直接宏觀地判斷用戶究竟點擊了哪個按鈕,這樣所有的按鈕都可以連接到同一個方法中,而不需要像常規一樣定義很多個方法:使用變量接受sender()的返回信息

這個button_clicked返回的就是QPushButton object,我們可以通過在后面加.text()方法來獲取這個按鈕上面的名字:

知道了返回的Button信息之后,就可以預先準備好一個字典或者switch對象來根據Button的信息直接使用創建節點的方法:

這是我在類的一開始定義的類變量。字典的key值就是Button給我的信息,我就可以通過key來獲取相應的value。

關鍵來了,關于字典里value的值,并不是隨隨便便定義的,它的定義是取自節點的ID字符串。這么做的目的是配合創建節點的newNode()方法的參數條件。newNode()方法是通過uiMgr.getCurrentGraph().newNode()獲得:

通過sduimgr下的getCurrentGraph()方法獲得當前的SDGraph,再利用SDGraph的newNode方法來創建新節點:

newNode方法的必要參數是sdDefinitionId,看解釋是通過sdDefinition這個類下的identifier來獲取。sdDefinition這個類我很熟悉,它在sdnode module下有出現:

點擊進入sdDefinition module,可以看到有一個getId()方法:

這就是我們想要的sdDefinitionId的字符串。

那我們如何知道這些具體節點的sdDefinitionId是啥?很簡單,先手頭創建這四個目標節點,然后直接調用getDefinition().getId()預先獲取了就行:

這就是這四個節點的sdDefinitionId,最后的字樣也就是字典里的value。

通過newNode,傳入相應的sdDefinitionId數據,創建出我們需要的節點:

總結

以上是生活随笔為你收集整理的minecraft pythonapl_Substance PythonAPI入门案例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。