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数据,创建出我们需要的节点:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建示例HTTPS服务器以获取乐趣和收益

通常,在开发人员或/和针对实际场景进行测试期间,我们(开发人员)面临着运行成熟的HTTPS服务器的需求,可能同时进行一些模拟。 在JVM平台上,除非您知道适合此工作的正确工具,否则它过去并不是一件…

WebDriver API元素的定位

一、以下截图为用FireBug定位的用火狐(Firefox)浏览器打开的百度首页,下面所讲述的八种定位方法,就是以该截图中的百度输入框为例子。 ①、FireBug是Firefox浏览器下的开发类插件,通过该插件可以查看HTML、CSS、Javascript控制台、网络状况监…

mysql字符乱码百度_如何解决MySQL字符集乱码问题

变量 a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的,假设此时编码为 A,也就是变量 a 的编码。2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACTER_SET_CONNECTION 决定,假设此时编码为 B。3. 经过 MySQL 一系列词法,语…

[水煮 ASP.NET Web API2 方法论](1-6)Model Validation

问题 想要 ASP.NET Web API 执行模型验证,同时可以和 ASP.NET MVC 共享一些验证逻辑。 解决方案 ASP.NET Web API 与 ASP.NET MVC 支持一样的验证机制,都是通过System.ComponentModel.DataAnnoataions 的属性验证。使用框架提供的相关验证属性&#xff0…

findbugs-dea_FindBugs和JSR-305

findbugs-dea假设该组开发人员在大型项目的各个部分上并行工作-一些开发人员在进行服务实现,而其他开发人员在使用该服务的代码。 考虑到API的假设,两个小组都同意服务API,并开始单独工作。 您认为这个故事会有幸福的结局吗? 好吧…

课程2 谈论音乐行业的趋势

1. 音乐词汇 CDdownloadLPsrecordsvinyl 黑胶sounddlbum covers 专辑封面2. 使用类似单词谈论各种录制你和聆听音乐的不同媒体 I still prefer the sound of my old LP records.My father used to by a lot of CDs.Most of my music these days is MP3s.3. 你可以使用这些词来谈…

带有ActiveMQ和Maven的JMS Sender应用程序

我们已经看到了如何使用ActiveMQ和Maven创建JMS Receiver应用程序 。 让我们看看我们如何类似地创建JMS Sender应用程序 。 web.xml与创建接收器应用程序时使用的相同&#xff1a; <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi"http://www…

mysql自连接查询的sql语句_mysql 自连接

SELECT语句中的自连接。到目前为止&#xff0c;我们连接的都是两张不同的表&#xff0c;那么能不能对一张表进行自我连接呢&#xff1f;答案是肯定的。有没有必要对一张表进行自我连接呢&#xff1f;答案也是肯定的。表的别名&#xff1a;一张表可以自我连接。进行自连接时我们…

Spring的Lifecycle

Lifecycle接口定义了每个对象的重要方法&#xff0c;每个对象都有自己的生命周期需求&#xff0c;如下&#xff1a; public interface Lifecycle { void start(); void stop(); boolean isRunning(); } 任何spring管理的对象都可以实现这个接口。那么&#xff0c;当Appl…

mysql aes密钥大于16位_aes秘钥限制问题解决办法

在oarcle jdk1.8上执行256位的aes秘钥加密报错如下:java.lang.RuntimeException: java.security.InvalidKeyException: Illegal key sizeat com.xx.opal.core.utils.aes.AESTool.encryptWithoutEncode(AESTool.java:33)at com.xx.opal.aes.AESTest.test(AESTest.java:19)at sun…

background-clip与background-origin

规定背景的绘制区域 浏览器支持 IE9、Firefox、Opera、Chrome 以及 Safari 支持 background-clip 属性。 注释&#xff1a;Internet Explorer 8 以及更早的版本不支持 background-clip 属性。IE9、Firefox、Opera、Chrome 以及 Safari 支持 background-clip 属性。 有三个值&am…

策略模式应用场景和uml_策略模式

策略模式应用场景和uml在最近的博客中&#xff0c;我收到了Wojciech Soczy&#xff1f;ski的评论&#xff0c;内容涉及在使用“不要问”&#xff08;TDA&#xff09;时如何使用“战略”模式实施单一责任原则&#xff08;SRP&#xff09;。 在某些时候&#xff0c;我打算进一步讨…

mysql建表时主键_mysql建表时怎么设置主键?

设置方法&#xff1a;在“CREATE TABLE”语句中&#xff0c;通过“PRIMARY KEY”关键字来指定主键&#xff0c;语法格式“字段名 数据类型 PRIMARY KEY [默认值]”或“[CONSTRAINT 约束名] PRIMARY KEY 字段名”。主键(PRIMARY KEY)的完整称呼是“主键约束”&#xff0c;是 MyS…

mysql的考试范围_数据库考试范围整理

填空&#xff1a;1.目前常用的数据库管理系统软件有Access 、SQL Sever和Oracle.2.数据实际上就是存储在某一种媒体上的能够被识别的物理符号。3.一个关系的逻辑结构就是一个二维表。4.对关系进行选择、投影或连接运算之后&#xff0c;运算的结果仍然是一个关系。5.在关系数据库…

Java EE 8 MVC:控制器的详细介绍

Java EE MVC是为Java EE 8规划并在JSR-371中指定的基于动作的新MVC框架。 这是我的Java EE 8 MVC教程的第二篇文章。 第一篇文章介绍了基础知识&#xff0c;并展示了如何开始使用 Java EE 8 MVC参考实现Ozark 。 在本文中&#xff0c;我们将更详细地介绍MVC控制器。 MVC控制器…

mysql htmlspecialchars_htmlSpecialchars和MySQL_REARY_EXECH_String是否保证PHP代码

当涉及到数据库查询时&#xff0c;始终尝试并使用准备好的参数化查询。这个mysqli和PDO图书馆支持这一点。这比使用转义函数(如mysql_real_escape_string.是,mysql_real_escape_string实际上只是一个字符串转义函数。这不是一颗神奇的子弹。它所要做的就是转义危险字符&#xf…

前端跨域问题的几种解决方案

前端跨域问题 一&#xff1a;同源策略   1.whats this     所谓同源是指&#xff0c;域名&#xff0c;协议&#xff0c;端口相同。当浏览器运行一个JS脚本时会进行同源检测&#xff0c;如果不同源是不能执行的。   2.源继承     来自about:blank&#xff0c;javasc…

在OpenShift上部署Java EE微服务

我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客。 您学习了如何使用Maven构建一个所谓的“胖子”&#xff0c;还使用Maven Docker插件对我们的微服务进行了Docker化并在Docker Machine上本地运行。 这是在本地测试事物的好方法。 到目前为止&#xff0c;缺少的…

rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读

推荐阅读一下下2020年后想跳槽&#xff1f;MQ、ZK、Nginx、Kafk等分布式技术你都掌握了&#xff1f;阿里架构师推荐学习的《RabbitMQ实战指南》&#xff0c;渣渣的你都看过吗&#xff1f;RocketMQ入门手册RocketMQ是一个分布式、队列模型的开源消息中间件&#xff0c;前身是Met…

关于返回按钮的事情

在微信的项目涉及到多个不同的项目间跳转那么头部的返回按钮怎么办呢&#xff1f; 在项目之间跳转还有在微信菜单进入页面时我们用了一个中转页进行参数处理和页面跳转判断 目前要用到code&#xff0c;userId等从后端写好的带参数的url到前端获取然后去调用后端的一个校验code和…