Exemplo n.º 1
0
    def _duplicate_module(self):
        """Duplicate the selected module."""
        if not self.modules:
            return
        rig = Rig()
        new_modules = []
        for module in self.modules:
            new_module = rig.duplicate_module(module)
            new_modules.append(new_module)

        publish("modules-created", new_modules)
Exemplo n.º 2
0
    def _mirror_module(self):
        if not self.modules:
            return
        rig = Rig()
        new_modules = []
        for module in self.modules:
            new_module = rig.mirror_module(module)
            if new_module is not None:
                new_modules.append(new_module)

        publish("modules-created", new_modules)
Exemplo n.º 3
0
    def _populate_model(self, modules, expand_new_modules=True):
        new_module_items = []
        new_joint_items = []
        for module in modules:
            module_item = self._create_module_item(module)
            new_module_items.append((module, module_item))
            for joint in module.deform_joints:
                joint_item = self._create_joint_item(module, joint)
                new_joint_items.append((joint, joint_item))
            if not Rig().is_built.get():
                for guide in module.guide_nodes:
                    guide_item = self._create_control_item(module, guide)
                    new_joint_items.append((guide, guide_item))
            else:
                for control in module.controllers:
                    control_item = self._create_control_item(module, control)
                    new_joint_items.append((control, control_item))

        root = self.model.invisibleRootItem()

        for module, item in new_module_items:
            self._auto_parent_module_item(module, item, root)
            if expand_new_modules:
                source_index = self.model.indexFromItem(item)
                index = self.proxy.mapFromSource(source_index)
                self.tree_view.setExpanded(index, True)

        for joint, item in new_joint_items:
            self._auto_parent_joint_item(joint, item)
Exemplo n.º 4
0
 def _show_colors_recursively(self, parent):
     for item in self._iter_items_recursively(parent):
         if self.model.is_module_item(item):
             module = Rig().get_module(item.text())
         else:
             module = self._joint_parent_module(item.text())
         item.setForeground(self._colors[module.side.get()])
Exemplo n.º 5
0
 def _delete_module(self):
     """Delete the selected module."""
     if not self.modules:
         return
     button = QtWidgets.QMessageBox.warning(
         self,
         "mop - Delete Module",
         "You are about to delete %d module(s). Continue ?" %
         len(self.modules),
         QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
     )
     if button != QtWidgets.QMessageBox.Yes:
         return
     rig = Rig()
     modules = self.modules[:]
     for module in self.modules:
         if module.name.get() == "root":
             logger.warning("Cannot delete root module.")
             modules.remove(module)
             continue
         rig.delete_module(module.node_name)
     publish("modules-deleted", modules)
Exemplo n.º 6
0
    def update(self):
        """Update the parent space data of the selected control.

        This method will only update the parent space data contained in
        the control, users will have to manually unbuild and rebuild the
        rig in order for the parent spaces to be created.
        """
        ctl = self.child.text()
        if not ctl:
            logger.warning("Please pick a child control first.")
            return

        prev_space_type, prev_drivers = self._control_configuration()

        drivers = self.model.stringList()
        name = self.space_type.currentText()
        space_type = self.space_types[name]

        # Transform the list of drivers to a mapping of
        # nice name: transform name.
        _drivers = OrderedDict()
        for driver in drivers:
            _drivers[self._nice_names.get(driver, driver)] = driver
        drivers = _drivers

        space_changed = space_type != prev_space_type
        drivers_changed = drivers != prev_drivers.values()
        if prev_drivers and (space_changed or drivers_changed):
            mop.dag.remove_parent_spaces(ctl)

        if drivers:
            Rig.reset_pose()
            mop.dag.create_space_switching(ctl, drivers, space_type)

        data = json.dumps({space_type: drivers})
        cmds.setAttr(ctl + ".parent_space_data", data, type="string")

        self._update_ui_state()
Exemplo n.º 7
0
 def _on_selection_changed(self, selected, deselected):
     selection = self.tree_view.selectionModel()
     selected = selection.selectedRows()
     source_indices = map(self.proxy.mapToSource, selected)
     items = [self.model.itemFromIndex(index) for index in source_indices]
     joints = [item.text() for item in items if not self.model.is_module_item(item)]
     modules = [
         Rig().get_module(item.text())
         for item in items
         if self.model.is_module_item(item)
     ]
     if joints:
         cmds.select(joints)
     publish("selected-modules-changed", modules)
Exemplo n.º 8
0
 def _update_buttons_enabled(self):
     rig = Rig()
     if rig.is_published.get():
         self.build_button.setEnabled(False)
         self.unbuild_button.setEnabled(False)
         self.publish_button.setEnabled(False)
         return
     elif rig.is_built.get():
         self.build_button.setEnabled(False)
         self.unbuild_button.setEnabled(True)
         self.publish_button.setEnabled(True)
     else:
         self.build_button.setEnabled(True)
         self.unbuild_button.setEnabled(False)
         self.publish_button.setEnabled(False)
Exemplo n.º 9
0
    def _save_expanded_modules(self):
        modules = []
        if not self.model:
            return modules

        for item in self._iter_items_recursively(self.model.invisibleRootItem()):
            if not self.model.is_module_item(item):
                continue
            source_index = self.model.indexFromItem(item)
            index = self.proxy.mapFromSource(source_index)
            if self.tree_view.isExpanded(index):
                module = Rig().get_module(item.text())
                modules.append(module)

        return modules
Exemplo n.º 10
0
    def _generate_model(self):
        selection_model = self.tree_view.selectionModel()
        if selection_model:
            selection_model.selectionChanged.disconnect(self._on_selection_changed)

        self.model = ModulesModel()
        self.proxy = ModulesFilter()
        self.proxy.setSourceModel(self.model)
        self.proxy.setDisplayMode(self._display_mode)

        self._populate_model(Rig().rig_modules, expand_new_modules=False)

        self.tree_view.setModel(self.proxy)
        self.tree_view.expandAll()

        selection_model = self.tree_view.selectionModel()
        selection_model.selectionChanged.connect(self._on_selection_changed)
Exemplo n.º 11
0
 def _update_display_names(self):
     if Rig().is_built.get():
         self.joints_mode_control.setText("Controls")
     else:
         self.joints_mode_control.setText("Guides")
Exemplo n.º 12
0
    def _on_modules_updated(self, modified_fields):
        selected_items, current_item = self._save_selection()
        expanded_modules = self._save_expanded_modules()
        parents_have_changed = False
        sides_have_changed = False
        for module, modified_values in modified_fields.iteritems():
            if "node_name" in modified_values:
                was_renamed = True
                module_item_name = modified_values["node_name"][0]
                module_item = self._item_for_name(module_item_name)
                module_item.setText(module.node_name)
            else:
                was_renamed = False
                module_item = self._item_for_name(module.node_name)

            if "parent_joint" in modified_values:
                parent_has_changed = True
                self._handle_reparenting(module, module_item)
            else:
                parent_has_changed = False

            parents_have_changed = parents_have_changed or parent_has_changed

            joints = module.deform_joints.get()
            if Rig().is_built.get():
                controls = module.controllers.get()
            else:
                controls = module.guide_nodes.get()

            if "joint_count" in modified_values:
                old_joint_count = modified_values["joint_count"][0]
                new_joint_count = modified_values["joint_count"][1]
                joint_items = [
                    module_item.child(row)
                    for row in xrange(module_item.rowCount())
                    if self.model.is_joint_item(module_item.child(row))
                ]
                if new_joint_count > old_joint_count:
                    self._fill_missing_joint_items(module, joints, joint_items)
                    if Rig().is_built.get():
                        controls = module.controllers.get()
                        control_items = [
                            module_item.child(row)
                            for row in xrange(module_item.rowCount())
                            if self.model.is_control_item(module_item.child(row))
                        ]
                    else:
                        controls = module.guide_nodes.get()
                        control_items = [
                            module_item.child(row)
                            for row in xrange(module_item.rowCount())
                            if self.model.is_guide_item(module_item.child(row))
                        ]
                    self._fill_missing_control_items(module, controls, control_items)
                else:
                    self._remove_unused_items(module_item)

            if was_renamed:
                self._rename_child_joint_items(module_item, joints, controls)

            if "side" in modified_values:
                side_has_changed = True
            else:
                side_has_changed = False

            sides_have_changed = sides_have_changed or side_has_changed

        if parents_have_changed:
            self._restore_selection(selected_items, current_item)

        if sides_have_changed and self._color_by_side:
            self._show_colors_recursively(self.model.invisibleRootItem())

        if expanded_modules:
            self._restore_expanded_modules(expanded_modules)
Exemplo n.º 13
0
 def _joint_parent_module(self, joint):
     modules = cmds.listConnections(joint + ".module", source=True)
     if not modules:
         raise AttributeError("Joint %s is not connected to a module !" % joint)
     module = modules[0]
     return Rig().get_module(module)