Can't find the right function call from Py3DsMax (blur-dev) for selectionSetChanged

Hello everyone.
Using information here:

http://www.scriptspot.com/forums/3ds-max/general-scripting/py3dsmax-glob...

I'm trying to detect any selection change and execute a function in my python script. So far, I have this line:

mxs.callbacks.addScript(mxs.pyhelper.namify("selectionSetChanged"), "python.exec('test = callBack()\ntest.selCallBack()\n')", id = mxs.pyhelper.namify("scene_explorer"))

scene_explorer.py being the name of my script. It does not gives any error, but it does not execute selCallBack().

If anyone could give me any help on how this is supposed to work, it would be great. I can't find any other kind of information about this.

This is my code:

from blurdev.gui import Dialog
from Py3dsMax import mxs
import sys
from PyQt4 import QtGui,QtCore
from PyQt4.QtCore import QSignalMapper, pyqtSignal
from PyQt4.QtGui import QPalette
 
class callBack:
    def selCallBack(self):
            print "selCallBack!"
 
class sceneExplorer(Dialog):
    def __init__(self, parent = None):
        super(sceneExplorer, self).__init__()
        self.initUI()
 
    def initUI(self):
        self.last_sel_index = -1
        self.setWindowTitle('Scene Explorer')
        mxs.callbacks.addScript(mxs.pyhelper.namify("selectionSetChanged"), "python.exec('test = callBack()\ntest.selCallBack()\n')", id = mxs.pyhelper.namify("scene_explorer"))
        QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))
        self.horizontalLayout = QtGui.QGridLayout(self)
        self.scrollArea = QtGui.QScrollArea(self)
        self.scrollArea.setWidgetResizable(True)
        self.scrollAreaWidgetContents = Dialog()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 380, 280))
        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.scrollAreaWidgetContents)
        self.gridLayout = QtGui.QGridLayout()
        self.gridLayout.setSpacing(0)
        self.horizontalLayout_2.addLayout(self.gridLayout)
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.add_button = QtGui.QPushButton("Refresh Explorer")
        self.center_button = QtGui.QPushButton("Center Window")
        self.horizontalLayout.addWidget(self.scrollArea, 1, 0)
        self.horizontalLayout.addWidget(self.add_button, 0, 0)
        self.horizontalLayout.addWidget(self.center_button, 0, 1)
        self.connect(self.add_button, QtCore.SIGNAL("clicked()"), self.addButtons)
        self.connect(self.center_button, QtCore.SIGNAL("clicked()"), self.center)
        self.setGeometry(300, 200, 400, 300)
 
    def addChildren (self, button_index, obj, row):
        signalMapper = QSignalMapper(self)
        for child in obj.Children:
            button_index = button_index + 1
            if len(child.Children):
                self.expand_button = QtGui.QPushButton("-")
            else:
                self.expand_button = QtGui.QPushButton(" ")
            self.expand_button.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed))
            self.expand_button.setMaximumSize(10,10)
            self.child_button = QtGui.QPushButton(child.name)
            self.child_button.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Fixed))
            self.child_button.setMaximumSize(10000,16)
            self.child_button.setToolTip(child.name)
            self.gridLayout.addWidget(self.expand_button, button_index, row)
            self.gridLayout.addWidget(self.child_button, button_index, row + 1)
            self.child_button.setAutoFillBackground(True)
            self.all_buttons.append(self.child_button) # a collection of all buttons
            self.all_max_obj.append(child) # a collection of the max objects
            signalMapper.setMapping(self.child_button, button_index) # map a value to the button
            self.child_button.clicked.connect(signalMapper.map) #connect to signalMapper
            button_index = self.addChildren(button_index, child, row + 2)
        signalMapper.mapped.connect(self.highlightButton) #connect signalMapper to highlightButton
        return button_index
 
    def addButtons(self):
        self.all_buttons = []
        self.all_max_obj = []
        highlightButton = pyqtSignal(int)
        signalMapper = QSignalMapper(self)
        button_index = 0
        for obj in mxs.objects:
            if obj.Parent == None:
                if len(obj.Children):
                    self.expand_button = QtGui.QPushButton("-")
                else:
                    self.expand_button = QtGui.QPushButton(" ")
                self.expand_button.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,QtGui.QSizePolicy.Fixed))
                self.expand_button.setMaximumSize(10,10)
                self.obj_button = QtGui.QPushButton(obj.name)
                self.obj_button.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Fixed))
                self.obj_button.setMaximumSize(10000,16)
                self.obj_button.setToolTip(obj.name)
                self.gridLayout.addWidget(self.expand_button, button_index, 0)
                self.gridLayout.addWidget(self.obj_button, button_index, 1)
                self.obj_button.setAutoFillBackground(True)
                self.all_buttons.append(self.obj_button) # a collection of all buttons
                self.all_max_obj.append(obj) # a collection of the max objects
                signalMapper.setMapping(self.obj_button, button_index) # map a value to the button
                self.obj_button.clicked.connect(signalMapper.map) #connect to signalMapper
                button_index = self.addChildren(button_index, obj, 2)
                button_index = button_index + 1
        signalMapper.mapped.connect(self.highlightButton) #connect signalMapper to highlightButton
 
    def highlightButton(self,index):
        palette = QPalette()
        if self.last_sel_index != -1:
            self.color = QtGui.QColor(215, 215, 215)
            palette.setColor(QPalette.Button, self.color)
            self.all_buttons[self.last_sel_index].setPalette(palette) # remove highlight
        actual_color = self.all_buttons[index].palette().color(1) #sample actual_color
        if actual_color == QtGui.QColor(255, 127, 127):
            self.color = QtGui.QColor(215, 215, 215)
        else:
            self.color = QtGui.QColor(255, 127, 127)
        palette.setColor(QPalette.Button, self.color)
        self.all_buttons[index].setPalette(palette) # apply new color
        self.selectObject(index)
        self.last_sel_index = index
 
    def selectObject(self, index):
        try:
            mxs.select (self.all_max_obj[index])
        except IOError:
            mxs.select (None)
 
    def center(self):
        qr = self.frameGeometry()
        cp = QtGui.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
 
    def selCallBack(self):
        print "selCallBack!"
 
def main():
   import blurdev 
   blurdev.launch(sceneExplorer)
 
if __name__ == '__main__':
    main() 

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
Lancelot's picture

Just in case someone is

Just in case someone is looking for the answer.

import blur3d
blur3d.api.dispatch.connect('selectionChanged', self.yourFunctionCall)

Eat well, stay fit and die anyway.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.