well, I used the subprocess method and got somewhat closer to what I am
looking for,
I modified and implemented the readFile() method to read
san_telus_pan_v009.ma which gets read by readMayaFile.py via mayapy
interpreter but the cams function in it doesnt return a value that i can
capture by subprocss
def readFile(self):
## call to readMayaFile.py using mayapy.exe interpreter
fileToOpen="I:/scenes/san_telus_pan_v009.ma"
code_str = \
"""
import readMayaFile
readMayaFile.getCams('"""+fileToOpen+"""')
"""
# save the code
phile=os.path.join(os.path.split(__file__)[0],"test.py")
filename=phile
fout = open(filename, "w")
fout.write(code_str)
fout.close()
# execute the code with mayapy and pipe the result to a string
#mayapy="D:/Program Files/Autodesk/Maya2013/bin/mayapy.exe"
#the path D:/Program Files/Autodesk/Maya2013/bin/ must be added
to sys path environment variables
test = "mayapy " + filename
process = subprocess.Popen(test, shell=True,
stdout=subprocess.PIPE)
process.wait()
print process.returncode,"<" # 0 = success, optional check
# read the result to a string
strRead = process.stdout.read()
print strRead
after I click QPushButton the above slot is executinf and i get the
following result in Command prompt
E:\Dropbox\Rnd\myprojects\Batch>ipython RenderUI.py
File read in 0 seconds.
0 <
[u'frontShape', u'perspShape', u'sideShape', u'topShape']
but the above valuse got printed should also be returned by the getCams
function in readMayaFile.py
#mapay interprer file
import os
import maya.standalone
import maya.cmds as cmds
def getCams(phileToOpen):
maya.standalone.initialize(name='python')
cmds.file(phileToOpen, force=True,open=True)
cams=cmds.ls(type="camera")
print cams
return cams
do I have to change something in readMayaFile.py to return the value to
subprocess or do I need to change some thing in the actual slot( readFile()
) ?
On Sun, Dec 9, 2012 at 1:43 AM, Justin Israel <[email protected]>wrote:
> The docs explain using an external interpreter:
>
> http://download.autodesk.com/global/docs/maya2013/en_us/index.html?url=files/Python_Python_from_an_external_interpreter.htm,topicNumber=d30e727177
>
> So you can either set up your python scripts to properly set the
> environment variables, similar to how mayapy does it, or you can start the
> script as you suggested with a subprocess: mayapy <script>
>
>
>
> On Dec 8, 2012, at 11:58 AM, šãñ wrote:
>
> well I must say thank you,
>
> as per heading towards the goal I feel like I am stuck with desire to read
> cameras available from maya scene file without having to launch maya.
>
> I made a python script like this
>
> #file for mapay interprer to execute
> import os
> import maya.standalone
> import maya.cmds as cmds
> #fileToOpen="I:/scenes/san_telus_pan_v009.ma"
> def getCams(phileToOpen):
> maya.standalone.initialize(name='python')
> cmds.file(phileToOpen, force=True,open=True)
> cams=cmds.ls(type="camera")
> return cams
>
> the above file is called by a slot readFile(self) in my this
> GUI<http://www.devilsan.com/uploads/9/9/4/6/9946022/2955377_orig.png>I
> already posted as link to
> pastebin <http://pastebin.com/9gfYaWRV>
> def readFile(self):
> ## call to readMayaFile.py using mayapy.exe interpreter
> fileToOpen="I:/Vanarts Work/san_term3_project/3D/scenes/
> san_telus_pan_v009.ma"
> print "Opening: %s" %(os.path.basename(fileToOpen))
> import readMayaFile
> reload(readMayaFile)
> readMayaFile.getCams(fileToOpen)
>
> but I do not understand How I shoudl use mayapy interpreter to run the
> readMayaFile.py and return list of cameras .. makes me in exquisite pain
> coz I coundt figure out trying different ways
> this logic seems like useful to have coz otherwise someone who wants to do
> a batch render would have to open the maya to see what camera/s needs to
> be rendered.
>
> Should I use subproess.call() to launch mayapy.exe and pass the
> readMayaFile.py but then how would i get the list of cameras ?
>
>
>
> On Sun, Dec 9, 2012 at 1:10 AM, Justin Israel <[email protected]>wrote:
>
>> The general idea of what you are doing is correct. You have a more
>> generalized SLOT function that can receive arguments telling it how to
>> operate on different targets or whatnot.
>> There are different ways, I am sure, of doing the actual conditional
>> logic within that SLOT. It could delegate out to other private methods if
>> you want, or simply do the action right there in the code as you are doing
>> it. The optimal thing would be to make sure it is DRY (Dont Repeat
>> Yourself), so that you don't have 10 conditions all performing duplicate
>> functionality. Though you are not doing wrong now, since each condition has
>> different things to call, with different checks to made, with different
>> widgets to set result values on.
>>
>> Anyways. What you are doing now is fine. One way of making it a bit
>> cleaner is to use some constants for your action types instead of plain
>> literal strings:
>>
>> class MyClass(QWidget):
>> SCENE_FILE_TYPE = "scnFile" # or just 0
>> RENDER_DIR_TYPE = "rdPath # or just 1
>>
>> ...
>> def foo(self):
>> scnFile = partial(self.showFileDialog, self.SCENE_FILE_TYPE)
>> rndPath = partial(self.showFileDialog, self.RENDER_DIR_TYPE)
>> ...
>> def showFileDialog(self, typ, *args, **kwargs):
>> if typ == self.SCENE_FILE_TYPE:
>> ...
>> elif typ == self.RENDER_DIR_TYPE:
>> ...
>>
>> It is not necessary to do this, but you were asking for extra tips.
>>
>>
>>
>> On Dec 8, 2012, at 9:55 AM, šãñ wrote:
>>
>> sorry i forgot to mention the question for my last post about slots..
>>
>> I am calling same slots with different button by passing a value and
>> checking what value it is and executing the relevant part in the
>> showFileDialog method.. is it the right way to do becuase this does work
>> but I guess their is a better way of doing it ?
>>
>>
>> On Sat, Dec 8, 2012 at 11:07 PM, Justin Israel <[email protected]>wrote:
>>
>>> Unless you specifically change settings on SIP, a QString is returned
>>> for all Qt methods that return a "string" results. You have to convert it
>>> to a python string if you want to treat it as such:
>>>
>>> self.scnFilePath.setText(os.path.normpath(str(fname)))
>>>
>>>
>>> On Dec 8, 2012, at 9:01 AM, šãñ wrote:
>>>
>>> I have two browse button in the GUI as uprobably say in last image
>>> atachment
>>>
>>> so instead of creating two different slot for each button click i
>>> implemented it this way !!
>>> # assign slots to buttons
>>> scnFile=partial(self.showFileDialog,"scnFile")
>>> self.browseBtn.clicked.connect(scnFile)
>>> rndPath=partial(self.showFileDialog,"rdPath")
>>> self.rdBtn.clicked.connect(rndPath)
>>>
>>>
>>> and the showFileDialog() method as as under:
>>> def showFileDialog(self,*args):
>>> directory=os.path.expanduser('~')
>>> if args[0]=="scnFile":
>>> fname=QtGui.QFileDialog.getOpenFileName(self,'Open
>>> File',directory)
>>> if os.path.isfile(fname):
>>> self.scnFilePath.setText(fname)
>>> elif args[0]=="rdPath":
>>>
>>> selectedDir=QtGui.QFileDialog.getExistingDirectory(self,"Select Render
>>> Directory",directory)
>>> if selectedDir.isEmpty():
>>> print "No directory selected"
>>> else:
>>> self.renDir.setText(selectedDir)
>>>
>>> also if i try to do self.scnFilePath.setText(os.path.normpath(fname))
>>>
>>> i get error saying
>>> Traceback (most recent call last):
>>> File "RenderUI.py", line 203, in showFileDialog
>>> if os.path.isfile(os.path.normpath(fname)):
>>> File "D:\Python26\lib\ntpath.py", line 417, in normpath
>>> if path.startswith("\\"):
>>> AttributeError: 'QString' object has no attribute 'startswith'
>>>
>>>
>>>
>>>
>>> On Sat, Dec 8, 2012 at 4:12 AM, Justin Israel <[email protected]>wrote:
>>>
>>>> 1) Just set your label to have a fixed with (setFixedWidth), or make
>>>> your other widgets size policies "expanding" so they take up any new space.
>>>> Probably the first one though.
>>>>
>>>> 2) If you want an asynchronous result from your filedialog, then
>>>> instead of using my static getExistingDirectory() suggestion, just stick
>>>> with creating the instance like you were. If you stay with calling the
>>>> exec_() on the dialog, you are waiting for a response anyways so you can
>>>> just set the value on to the text box. But for the async approach, you
>>>> would show() instead of exec_() and maybe connect the accept() signal to a
>>>> slot that will check the value and enter it into the textedit.
>>>> For more specific help, I would need to see an example of what you are
>>>> trying.
>>>>
>>>> 3) Why would so many people recommend not using list comprehension?
>>>> Just flat out not to use it? They are a great way to get more performance
>>>> than a normal for loop. I can see there are misuses of them though.
>>>> For your specific example, you would usually not want to use a list
>>>> comprehension for side effects. That is, you shouldn't use them to append
>>>> or call some method in a loop. They are used to produce results that you
>>>> intend to keep.
>>>> There really isn't much you can do to change your example. Qt would
>>>> have needed to provide an layout.addWidgets(aList) to accept a list of
>>>> widgets. So you just need to call them in order like you are doing.
>>>>
>>>>
>>>> On Fri, Dec 7, 2012 at 1:10 PM, šãñ <[email protected]> wrote:
>>>>
>>>>>
>>>>> thank you guys for pointing a solution but Now I really have a bunch
>>>>> of more questions these are pretty basic that i know ...
>>>>>
>>>>> my first question is how do I keep the gridColumWidth fixed so that it
>>>>> should not change if the label text changes(see attached image)
>>>>>
>>>>> my second question is how can i use a showFileDialog slot fill
>>>>> QLineEdit for scne file for selecting directory and similarly in second
>>>>> tab
>>>>> ..(as you can see in the attached screenshot I have so many browse
>>>>> buttons)
>>>>> I remember seeing in the PyQt tutorial where you made use of partial
>>>>> but i guess that was for removeCallable from OM, but now how should i find
>>>>> QPushButton.objectName to be passed to slot so depending on what button is
>>>>> pressed i can perform some operation...
>>>>>
>>>>> thirdly , so many people have recommended me not to use List
>>>>> comprehension but i find it convenient(at least here) to use while
>>>>> addWidget or addLayout...
>>>>> like [p3_HBox2.addWidget(each) for each in
>>>>> [self.pylbl,self.pyEdt,self.pybrwBtn]]
>>>>>
>>>>> but I have a situation when I am using a combination of addWidget
>>>>> ,addStretch and addLayout
>>>>>
>>>>> like in this case
>>>>>
>>>>> p1_vertical.addLayout(gridLayout)
>>>>> p1_vertical.addLayout(gridLayout2)
>>>>> p1_vertical.addLayout(hbox)
>>>>> p1_vertical.addWidget(hLine)
>>>>> p1_vertical.addLayout(nxtbtnbox)
>>>>>
>>>>> in that case how should i after adding hbox in LC i can add
>>>>> addWidget(hLine) then again nxtbtnbox, i feel like i can use it with
>>>>> enumerate but is their any better option?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Sat, Dec 8, 2012 at 12:30 AM, Justin Israel <[email protected]
>>>>> > wrote:
>>>>>
>>>>>> If you are using your own custom status bar in a widget, then you
>>>>>> have to connect focus or hover events to something that sets the message
>>>>>> on
>>>>>> the status bar. You can set the setStatusTip("") on each widget and then
>>>>>> just read that.
>>>>>>
>>>>>> When you use a QMainWindow, the status bar is already wired up for
>>>>>> you so that any time you hover a widget, the statusBar will automatically
>>>>>> read the widgets statusTip():
>>>>>>
>>>>>> app = QtGui.QApplication([])
>>>>>>
>>>>>> w = QtGui.QMainWindow()
>>>>>> button = QtGui.QPushButton("clicky", w)
>>>>>> button.setStatusTip("I am a clicky")
>>>>>> w.setCentralWidget(button)
>>>>>>
>>>>>> status = w.statusBar()
>>>>>>
>>>>>> w.show()
>>>>>> w.raise_()
>>>>>>
>>>>>> status.showMessage("Welcome to the app!", 5000)
>>>>>>
>>>>>> app.exec_()
>>>>>>
>>>>>> For the file dialog, the way you are using it, there is a convenience
>>>>>> static method you can call:
>>>>>> http://qt-project.org/doc/qt-4.8/qfiledialog.html#getExistingDirectory
>>>>>>
>>>>>> It will return an empty string if they cancel:
>>>>>>
>>>>>> directory=os.path.expanduser('~')
>>>>>> selectedDir = QtGui.QFileDialog.getExistingDirectory(w,
>>>>>> "Select Render Directory", directory)
>>>>>>
>>>>>> if selectedDir.isEmpty():
>>>>>> print "No directory selected"
>>>>>> else:
>>>>>> print selectedDir
>>>>>>
>>>>>>
>>>>>> On Fri, Dec 7, 2012 at 9:56 AM, Kurian O.S <[email protected]>wrote:
>>>>>>
>>>>>>> For Directory you want to use exec so you need to change your code
>>>>>>> like this
>>>>>>>
>>>>>>> def showDirDialog(self):
>>>>>>> directory=os.path.expanduser('~')
>>>>>>> dirPath=QtGui.QFileDialog(self,"Select Render Directory",
>>>>>>> directory)
>>>>>>> dirPath.setFileMode(QtGui.QFileDialog.DirectoryOnly)
>>>>>>> if dirPath.exec_() == 1:
>>>>>>> fname_list = str(dirPath.selectedFiles()[0])
>>>>>>> print fname_list
>>>>>>>
>>>>>>> For changing the statusBar text you need to implement focusIn and
>>>>>>> out Event and Justin already mention about that in
>>>>>>> reimplementQPlainText’s
>>>>>>> focusInEvent in another source file ,how to ? thread.
>>>>>>>
>>>>>>>
>>>>>>> On Fri, Dec 7, 2012 at 6:25 AM, san <[email protected]> wrote:
>>>>>>>
>>>>>>>> as a part of my learning PyQt4 I started making a gui(see
>>>>>>>> attachment) where I implement all the examples I learn from video tuts
>>>>>>>> or
>>>>>>>> book I am referring,
>>>>>>>>
>>>>>>>> however I count figure out how should I implement the method to
>>>>>>>> show text message on the status bar when user hover mouse over a
>>>>>>>> widget[link to pastebin <http://pastebin.com/9gfYaWRV>]
>>>>>>>>
>>>>>>>> and secondly I dont understand how come this method to select
>>>>>>>> Directory is not working?
>>>>>>>>
>>>>>>>> def showDirDialog(self):
>>>>>>>> directory=os.path.expanduser('~')
>>>>>>>> dirPath=QtGui.QFileDialog(self,"Select Render Directory",
>>>>>>>> directory)
>>>>>>>> dirPath.setFileMode(QtGui.QFileDialog.DirectoryOnly)
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> view archives: http://groups.google.com/group/python_inside_maya
>>>>>>>> change your subscription settings:
>>>>>>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> --:: Kurian ::--
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> view archives: http://groups.google.com/group/python_inside_maya
>>>>>>> change your subscription settings:
>>>>>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> view archives: http://groups.google.com/group/python_inside_maya
>>>>>> change your subscription settings:
>>>>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> **
>>>>>
>>>>> [image: San's personal blog]<http://feeds.feedburner.com/SanLuthraBlog>
>>>>>
>>>>> *
>>>>> *
>>>>>
>>>>>
>>>>> --
>>>>> view archives: http://groups.google.com/group/python_inside_maya
>>>>> change your subscription settings:
>>>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>>>
>>>>
>>>>
>>>> --
>>>> view archives: http://groups.google.com/group/python_inside_maya
>>>> change your subscription settings:
>>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>>
>>>
>>>
>>>
>>> --
>>> **
>>>
>>> [image: San's personal blog] <http://feeds.feedburner.com/SanLuthraBlog>
>>>
>>> *
>>> *
>>>
>>>
>>> --
>>> view archives: http://groups.google.com/group/python_inside_maya
>>> change your subscription settings:
>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>
>>>
>>>
>>> --
>>> view archives: http://groups.google.com/group/python_inside_maya
>>> change your subscription settings:
>>> http://groups.google.com/group/python_inside_maya/subscribe
>>>
>>
>>
>>
>> --
>> **
>>
>> [image: San's personal blog] <http://feeds.feedburner.com/SanLuthraBlog>
>>
>> *
>> *
>>
>>
>> --
>> view archives: http://groups.google.com/group/python_inside_maya
>> change your subscription settings:
>> http://groups.google.com/group/python_inside_maya/subscribe
>>
>>
>>
>> --
>> view archives: http://groups.google.com/group/python_inside_maya
>> change your subscription settings:
>> http://groups.google.com/group/python_inside_maya/subscribe
>>
>
>
>
> --
> **
>
> [image: San's personal blog] <http://feeds.feedburner.com/SanLuthraBlog>
>
> *
> *
>
>
> --
> view archives: http://groups.google.com/group/python_inside_maya
> change your subscription settings:
> http://groups.google.com/group/python_inside_maya/subscribe
>
>
> --
> view archives: http://groups.google.com/group/python_inside_maya
> change your subscription settings:
> http://groups.google.com/group/python_inside_maya/subscribe
>
--
**
[image: San's personal blog] <http://feeds.feedburner.com/SanLuthraBlog>
*
*
--
view archives: http://groups.google.com/group/python_inside_maya
change your subscription settings:
http://groups.google.com/group/python_inside_maya/subscribe