基於Vertex的表情鏡像的max工具腳本-《Python-UI篇1-1》

先把這個UI篇結束,然後在繼續通讀Max的Python模塊的文檔。

 

這一篇我是在Max2016上測試的,聽說從2017之後,開始支持ui文件(Qt designer.exe)的解析.

在Max2016目錄裏的Python2.7並沒有這個designer工具,我是在我自己安裝的2.7的環境裏找到的,它安靜的躺在PySide的文件夾裏等我輕輕的雙擊。

打開之後的界面是這樣的

之後。。。我就省略了,這種基礎UI佈局類的軟件都是基本操作。

然後簡單的做了一下功能按鈕,沒有想太多,就按之前DotNet做的那個醜UI做吧

然後保存一下,文件名ExpressiongMirror.ui,於是我們就得到了一個UI文件

在2017版應該提供了直接將這個UI文件變成圖形界面的接口。明天找時間重開一篇補充一下這個吧。

這個UI文件的內容我貼一下,其實就是個xml格式的文件

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>245</width>
    <height>369</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QPushButton" name="ResetXFormToPolyBtn">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>10</y>
     <width>221</width>
     <height>23</height>
    </rect>
   </property>
   <property name="text">
    <string>ResetXFormToPoly</string>
   </property>
   <property name="autoDefault">
    <bool>false</bool>
   </property>
   <property name="default">
    <bool>false</bool>
   </property>
   <property name="flat">
    <bool>false</bool>
   </property>
  </widget>
  <widget class="QPushButton" name="GetSampleBtn">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>40</y>
     <width>221</width>
     <height>71</height>
    </rect>
   </property>
   <property name="text">
    <string>GetSample</string>
   </property>
  </widget>
  <widget class="QPushButton" name="MirrorVertexBtn">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>120</y>
     <width>221</width>
     <height>71</height>
    </rect>
   </property>
   <property name="text">
    <string>MirrorVertex</string>
   </property>
  </widget>
  <widget class="QPushButton" name="GetLocalSampleBtn">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>200</y>
     <width>221</width>
     <height>71</height>
    </rect>
   </property>
   <property name="text">
    <string>GetLocalSample</string>
   </property>
  </widget>
  <widget class="QPushButton" name="MirrorLocalVertexBtn">
   <property name="geometry">
    <rect>
     <x>10</x>
     <y>280</y>
     <width>221</width>
     <height>71</height>
    </rect>
   </property>
   <property name="text">
    <string>MirrorLocalVertex</string>
   </property>
  </widget>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>ResetXFormToPolyBtn</sender>
   <signal>clicked()</signal>
   <receiver>Form</receiver>
   <slot>ResetXFormToPolyClicked()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>215</x>
     <y>19</y>
    </hint>
    <hint type="destinationlabel">
     <x>240</x>
     <y>23</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>GetSampleBtn</sender>
   <signal>clicked()</signal>
   <receiver>Form</receiver>
   <slot>GetSampleClicked()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>216</x>
     <y>77</y>
    </hint>
    <hint type="destinationlabel">
     <x>243</x>
     <y>77</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>MirrorVertexBtn</sender>
   <signal>clicked()</signal>
   <receiver>Form</receiver>
   <slot>MirrorVertexClicked()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>209</x>
     <y>153</y>
    </hint>
    <hint type="destinationlabel">
     <x>241</x>
     <y>155</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>GetLocalSampleBtn</sender>
   <signal>clicked()</signal>
   <receiver>Form</receiver>
   <slot>GetLocalSampleClicked()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>211</x>
     <y>243</y>
    </hint>
    <hint type="destinationlabel">
     <x>241</x>
     <y>243</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>MirrorLocalVertexBtn</sender>
   <signal>clicked()</signal>
   <receiver>Form</receiver>
   <slot>MirrorLocalVertexClicked()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>216</x>
     <y>311</y>
    </hint>
    <hint type="destinationlabel">
     <x>243</x>
     <y>313</y>
    </hint>
   </hints>
  </connection>
 </connections>
 <slots>
  <slot>ResetXFormToPolyClicked()</slot>
  <slot>GetSampleClicked()</slot>
  <slot>MirrorVertexClicked()</slot>
  <slot>GetLocalSampleClicked()</slot>
  <slot>MirrorLocalVertexClicked()</slot>
 </slots>
</ui>

有興趣的可以看一下文件的內容,反正。。。我不太感興趣,也不想自己造“解析這個文件爲max2016及一下支持py的版本能用的文件“的輪子。

“生命苦短,我用派森”

這就是python的標語,輪子有人造好了,拿來主義,用就好了。(手動貼上那張牛頓圖)

找到我自己安裝的python2.7和PySide的目錄

在PySide的目錄上有個Scripts文件夾,裏面有個uic.py文件,它就是輪子。

爲了省略篇幅,我就直接吧我的ExpressiongMirror.ui複製到這個文件夾下。

然後(。。我的是win平臺。。。)按住Shift,右鍵,選擇在此處打開命令窗口.然後,也看到了,路徑已經cd好了。

輸入python uic.py ExpressiongMirror.ui -o ExpressiongMirror.py,按下偉大的Enter。我們的py文件就生成了,然後我把這UI和PY文件剪切走,還原我的原生態PySide目錄。

打開看一下ExpressiongMirror.py文件

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ExpressiongMirror.ui'
#
# Created: Thu Nov  8 00:12:47 2018
#      by: pyside-uic 0.2.15 running on PySide 1.2.4
#
# WARNING! All changes made in this file will be lost!

from PySide import QtCore, QtGui

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(245, 369)
        self.ResetXFormToPolyBtn = QtGui.QPushButton(Form)
        self.ResetXFormToPolyBtn.setGeometry(QtCore.QRect(10, 10, 221, 23))
        self.ResetXFormToPolyBtn.setAutoDefault(False)
        self.ResetXFormToPolyBtn.setDefault(False)
        self.ResetXFormToPolyBtn.setFlat(False)
        self.ResetXFormToPolyBtn.setObjectName("ResetXFormToPolyBtn")
        self.GetSampleBtn = QtGui.QPushButton(Form)
        self.GetSampleBtn.setGeometry(QtCore.QRect(10, 40, 221, 71))
        self.GetSampleBtn.setObjectName("GetSampleBtn")
        self.MirrorVertexBtn = QtGui.QPushButton(Form)
        self.MirrorVertexBtn.setGeometry(QtCore.QRect(10, 120, 221, 71))
        self.MirrorVertexBtn.setObjectName("MirrorVertexBtn")
        self.GetLocalSampleBtn = QtGui.QPushButton(Form)
        self.GetLocalSampleBtn.setGeometry(QtCore.QRect(10, 200, 221, 71))
        self.GetLocalSampleBtn.setObjectName("GetLocalSampleBtn")
        self.MirrorLocalVertexBtn = QtGui.QPushButton(Form)
        self.MirrorLocalVertexBtn.setGeometry(QtCore.QRect(10, 280, 221, 71))
        self.MirrorLocalVertexBtn.setObjectName("MirrorLocalVertexBtn")

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.ResetXFormToPolyBtn, QtCore.SIGNAL("clicked()"), Form.ResetXFormToPolyClicked)
        QtCore.QObject.connect(self.GetSampleBtn, QtCore.SIGNAL("clicked()"), Form.GetSampleClicked)
        QtCore.QObject.connect(self.MirrorVertexBtn, QtCore.SIGNAL("clicked()"), Form.MirrorVertexClicked)
        QtCore.QObject.connect(self.GetLocalSampleBtn, QtCore.SIGNAL("clicked()"), Form.GetLocalSampleClicked)
        QtCore.QObject.connect(self.MirrorLocalVertexBtn, QtCore.SIGNAL("clicked()"), Form.MirrorLocalVertexClicked)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.ResetXFormToPolyBtn.setText(QtGui.QApplication.translate("Form", "ResetXFormToPoly", None, QtGui.QApplication.UnicodeUTF8))
        self.GetSampleBtn.setText(QtGui.QApplication.translate("Form", "GetSample", None, QtGui.QApplication.UnicodeUTF8))
        self.MirrorVertexBtn.setText(QtGui.QApplication.translate("Form", "MirrorVertex", None, QtGui.QApplication.UnicodeUTF8))
        self.GetLocalSampleBtn.setText(QtGui.QApplication.translate("Form", "GetLocalSample", None, QtGui.QApplication.UnicodeUTF8))
        self.MirrorLocalVertexBtn.setText(QtGui.QApplication.translate("Form", "MirrorLocalVertex", None, QtGui.QApplication.UnicodeUTF8))

爲了簡單操作,我就直接在這個py文件裏繼續寫了,根據上篇博客,直接寫一個lei繼承這個類和QtGui.QWidget。。

注意 我刪除了上面的註釋

from PySide import QtCore, QtGui

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(245, 369)
        self.ResetXFormToPolyBtn = QtGui.QPushButton(Form)
        self.ResetXFormToPolyBtn.setGeometry(QtCore.QRect(10, 10, 221, 23))
        self.ResetXFormToPolyBtn.setAutoDefault(False)
        self.ResetXFormToPolyBtn.setDefault(False)
        self.ResetXFormToPolyBtn.setFlat(False)
        self.ResetXFormToPolyBtn.setObjectName("ResetXFormToPolyBtn")
        self.GetSampleBtn = QtGui.QPushButton(Form)
        self.GetSampleBtn.setGeometry(QtCore.QRect(10, 40, 221, 71))
        self.GetSampleBtn.setObjectName("GetSampleBtn")
        self.MirrorVertexBtn = QtGui.QPushButton(Form)
        self.MirrorVertexBtn.setGeometry(QtCore.QRect(10, 120, 221, 71))
        self.MirrorVertexBtn.setObjectName("MirrorVertexBtn")
        self.GetLocalSampleBtn = QtGui.QPushButton(Form)
        self.GetLocalSampleBtn.setGeometry(QtCore.QRect(10, 200, 221, 71))
        self.GetLocalSampleBtn.setObjectName("GetLocalSampleBtn")
        self.MirrorLocalVertexBtn = QtGui.QPushButton(Form)
        self.MirrorLocalVertexBtn.setGeometry(QtCore.QRect(10, 280, 221, 71))
        self.MirrorLocalVertexBtn.setObjectName("MirrorLocalVertexBtn")

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.ResetXFormToPolyBtn, QtCore.SIGNAL("clicked()"), Form.ResetXFormToPolyClicked)
        QtCore.QObject.connect(self.GetSampleBtn, QtCore.SIGNAL("clicked()"), Form.GetSampleClicked)
        QtCore.QObject.connect(self.MirrorVertexBtn, QtCore.SIGNAL("clicked()"), Form.MirrorVertexClicked)
        QtCore.QObject.connect(self.GetLocalSampleBtn, QtCore.SIGNAL("clicked()"), Form.GetLocalSampleClicked)
        QtCore.QObject.connect(self.MirrorLocalVertexBtn, QtCore.SIGNAL("clicked()"), Form.MirrorLocalVertexClicked)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
		#我忘了修改這個。。。在py裏直接修改了
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "ExpressiongMirror", None, QtGui.QApplication.UnicodeUTF8))
        self.ResetXFormToPolyBtn.setText(QtGui.QApplication.translate("Form", "ResetXFormToPoly", None, QtGui.QApplication.UnicodeUTF8))
        self.GetSampleBtn.setText(QtGui.QApplication.translate("Form", "GetSample", None, QtGui.QApplication.UnicodeUTF8))
        self.MirrorVertexBtn.setText(QtGui.QApplication.translate("Form", "MirrorVertex", None, QtGui.QApplication.UnicodeUTF8))
        self.GetLocalSampleBtn.setText(QtGui.QApplication.translate("Form", "GetLocalSample", None, QtGui.QApplication.UnicodeUTF8))
        self.MirrorLocalVertexBtn.setText(QtGui.QApplication.translate("Form", "MirrorLocalVertex", None, QtGui.QApplication.UnicodeUTF8))



#  add it by c.p.
class _GCProtector(object):
	widgets = []



class MyWindow(QtGui.QWidget, Ui_Form):
	def __init__(self):
		super(MyWindow, self).__init__()
		self.setupUi(self)
	
		
	def ResetXFormToPolyClicked(self):
		print "ResetXFormToPolyClicked"
	
	def GetSampleClicked(self):
		print "GetSampleClicked"
	
	def MirrorVertexClicked(self):
		print "MirrorVertexClicked"
	
	def GetLocalSampleClicked(self):
		print "GetLocalSampleClicked"
	
	def MirrorLocalVertexClicked(self):
		print "MirrorLocalVertexClicked"

def main():	
	app = QtGui.QApplication.instance()
	if not app:
		app = QtGui.QApplication([])
	
	MaxPlus.FileManager.Reset(True)

	form = MyWindow()

	_GCProtector.widgets.append(form)
	
	#爲了讓這個窗口一直浮於max主窗口之上,Max2016
	MaxPlus.AttachQWidgetToMax(form)
	form.show()
	
	
if __name__ == '__main__':
	main()

這樣,我的py文件修改好了,然後我打開max2016在一個ms文件裏這麼寫道:

fname = "E:\\我的堅果雲\\MaxScriptsDev\\ExpressiongMirror.py"
python.ExecuteFile fname

Ctrl+E運行一下。。

於是就有了

到此,工具的UI篇就這麼恍恍惚惚的結束了吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章