├── LICENSE ├── README.md ├── install.bat └── scripts ├── __init__.py ├── __pycache__ ├── menu.cpython-37.pyc ├── picker.cpython-37.pyc └── riggingtoolkit.cpython-37.pyc ├── menu.py ├── picker.py ├── riggingtoolkit.py └── userSetup.py /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-2022 Aji Aditya Darmawan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Awan's Auto Rigging Toolkit for Autodesk Maya 3 |

4 |
5 |

6 | autorigger_rigresults_screenshot 7 |

8 |
9 | 10 | ## Introduction 11 | 12 | With this Auto Rigging tool you can build a 3D character rig without building it yourself from scratch. All you have to do is place a few markers, and then the script will do the rest. **This tool will save you hours if not days of rigging work**. 13 | 14 | ## Getting Started 15 | ### Installation 16 | 17 | 1. Clone/download the zip file 18 | 2. Extract it (you can do it wherever you want) 19 | 20 | Now you have two options: 21 | 22 | 3. Run `install.bat` (for windows, this file will do the steps below automatically) 23 | 24 | or 25 | 26 | 3. Create a new `.mod` file, you can name it whatever you want (e.g. awtorigger.mod) 27 | 4. Inside that file, type in `+ AwtoRigger 1.0 [your awtorigger full directory]` 28 | 29 | e.g. 30 | 31 | + AwtoRigger 1.0 C:\Users\awwwan\Awan-Auto-Rigger 32 | 33 | 5. Move the `.mod` file into one of these directories : 34 | 35 | **Default for Windows** 36 | ``` 37 | /My Documents/Maya//modules 38 | 39 | /My Documents/Maya/modules 40 | 41 | C:/Program Files/Common Files/Autodesk Shared/Modules/Maya/ 42 | 43 | C:/Program Files/Common Files/Autodesk Shared/Modules/Maya 44 | 45 | /modules/ 46 | ``` 47 | 48 | **Default for Mac OS X, Linux** 49 | ``` 50 | $MAYA_APP_DIR/Maya//modules 51 | 52 | $MAYA_APP_DIR/Maya/modules 53 | 54 | /usr/autodesk/modules/Maya/ 55 | 56 | /usr/autodesk/modules/Maya 57 | ``` 58 | 59 | More about this [here](https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2020/ENU/Maya-EnvVar/files/GUID-228CCA33-4AFE-4380-8C3D-18D23F7EAC72-htm.html) and [here](https://help.autodesk.com/view/MAYAUL/2016/ENU/?guid=__files_GUID_CB76E356_753B_4837_8C5B_3296C14872CA_htm) 60 | 61 | ## Usage 62 | 63 | 1. **Launch Maya** (or restart Maya if you already have it opened). 64 | 2. If everything was set up correctly, you should see the menu for `Awto Rigger` on the menu bar. 65 | 66 | ![autorigger_menubar_screenshot](https://user-images.githubusercontent.com/69242299/183229169-44e8b5b9-d19e-4ce0-95ec-add8001e248e.png) 67 | 68 | 3. **Create guides**, and adjust the markers based on the shape of your character model. You can rotate and scale them when needed, but you must not delete any marker individually. 69 | 4. **Awto Rig!** Sit back and relax while the script is building the rig for you. 70 | 71 | ## Support 72 | If you are having issues or found a bug, feel free to [open an issue](https://github.com/adamscript/Auto-Rigger/issues). Also if you have questions about the project, feel free to reach out at: . 73 | 74 | ## Features 75 | ### Toolkit 76 | The main interface for this tool. It covers main functionalities such as guide marker creation and automatic rig generation. It includes options for IK Control, Reverse Foot Control, and custom Picker GUI creation. It also includes some tools needed for curves editing, which can be used to fit the generated controller shapes on the character model better. 77 | 78 |

79 | autorigger_toolkit_screenshot 80 |

81 | 82 | ### Picker GUI 83 | Optional GUI for controller selection. Locations of the buttons will be adjusted dynamically with the shape of the 3D model of the character on the rig. 84 | 85 |

86 | autorigger_picker_screenshot 87 |

88 | 89 |

90 | autorigger_pickerresults_screenshot 91 |

92 | 93 | ## Reflection 94 | For my college final project, I created an Auto Rigging tool for Autodesk Maya that can be used to speed up the rigging process for humanoid 3D character creation. I’m not really a fan of building a rig from scratch for every character that I made. So I wrote this tool to make the rigging process quicker by letting the script do the repetitive work. I used this tool to rig this character (I'm not best at animation yet but I tried 😂). 95 | 96 |

97 | autorigger_tabby_gif 98 |

99 | 100 | Hopefully this tool can be useful for any 3D artist who needs it. 101 | 102 | ## Inspiration 103 | This project is inspired by these awesome tools. Check them out! 104 | - [mGear](http://www.mgear-framework.com/) 105 | - [Advanced Skeleton](https://www.animationstudios.com.au/advanced-skeleton) 106 | -------------------------------------------------------------------------------- /install.bat: -------------------------------------------------------------------------------- 1 | echo.>awtorigger.mod + AwtoRigger 1.0 %CD% 2 | if not exist %USERPROFILE%\Documents\maya\modules\ md %USERPROFILE%\Documents\maya\modules\ 3 | move %CD%\awtorigger.mod %USERPROFILE%\Documents\maya\modules\awtorigger.mod 4 | 5 | echo Installation finished 6 | 7 | pause -------------------------------------------------------------------------------- /scripts/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adamscript/Auto-Rigger/da65eda7f01ad7c8d01275367fdefe10d5eda456/scripts/__init__.py -------------------------------------------------------------------------------- /scripts/__pycache__/menu.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adamscript/Auto-Rigger/da65eda7f01ad7c8d01275367fdefe10d5eda456/scripts/__pycache__/menu.cpython-37.pyc -------------------------------------------------------------------------------- /scripts/__pycache__/picker.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adamscript/Auto-Rigger/da65eda7f01ad7c8d01275367fdefe10d5eda456/scripts/__pycache__/picker.cpython-37.pyc -------------------------------------------------------------------------------- /scripts/__pycache__/riggingtoolkit.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adamscript/Auto-Rigger/da65eda7f01ad7c8d01275367fdefe10d5eda456/scripts/__pycache__/riggingtoolkit.cpython-37.pyc -------------------------------------------------------------------------------- /scripts/menu.py: -------------------------------------------------------------------------------- 1 | import pymel.core as pm 2 | 3 | import riggingtoolkit as toolkit 4 | import picker 5 | 6 | mainMayaWindow = pm.language.melGlobals['gMainWindow'] 7 | awtoRigMenu = pm.menu('Awto Rigger', parent = mainMayaWindow) 8 | 9 | def opentoolkit(*args): 10 | toolkit.window.show(dockable = True) 11 | toolkit.checkGuides() 12 | toolkit.checkRig() 13 | 14 | def openpicker(*args): 15 | picker.pickerwin.show(dockable = True) 16 | picker.getNamespace_list() 17 | picker.setNamespace() 18 | 19 | pm.menuItem(label = "Auto Rigging Toolkit", command = opentoolkit, parent = awtoRigMenu) 20 | pm.menuItem(label = "Picker GUI", command = openpicker, parent = awtoRigMenu) 21 | -------------------------------------------------------------------------------- /scripts/picker.py: -------------------------------------------------------------------------------- 1 | from PySide2.QtWidgets import * 2 | from PySide2.QtGui import * 3 | from PySide2.QtCore import* 4 | 5 | import maya.OpenMayaUI as OpenMayaUI 6 | from pymel.core import * 7 | 8 | import maya.OpenMaya as om 9 | from maya.app.general.mayaMixin import MayaQWidgetDockableMixin 10 | 11 | scriptJob(ka = True) 12 | 13 | picker_bg = QLabel() 14 | 15 | namespace_label = QLabel() 16 | namespace_label.setText("Namespace :") 17 | namespace_label.setAlignment(Qt.AlignRight) 18 | 19 | namespace_sel = QComboBox() 20 | 21 | class PickerWindow(MayaQWidgetDockableMixin, QDialog): 22 | def __init__(self): 23 | super(PickerWindow, self).__init__() 24 | 25 | # It is crucial we set a unique object name as this is used internally by Maya 26 | self.setWindowTitle("Awan's Character Rig Picker GUI") 27 | 28 | self.setFixedWidth(470) 29 | self.setFixedHeight(560) 30 | self.setWindowFlags(Qt.WindowStaysOnTopHint) 31 | 32 | self.layout = QVBoxLayout() 33 | self.setLayout(self.layout) 34 | 35 | self.header_layout = QHBoxLayout() 36 | self.footer_layout = QHBoxLayout() 37 | 38 | def addLayout(self, layout): 39 | self.layout.addLayout(layout) 40 | 41 | pickerwin = PickerWindow() 42 | 43 | def setNamespace(): 44 | if ls("*guiData", r = True): 45 | spine_gui.show().move(offsetX = -60) 46 | 47 | hip_gui.show().move() 48 | waist_gui.show().move() 49 | chest_gui.show().move() 50 | collarbone_gui.show().move() 51 | 52 | head_gui.show().move(offsetX = -70) 53 | jaw_gui.show().move() 54 | 55 | l_eye_gui.show() 56 | r_eye_gui.show() 57 | eyesLookAt_gui.show() 58 | 59 | l_clavicle_gui.show().move() 60 | r_clavicle_gui.show().move() 61 | 62 | l_fingers_thumb_gui.show() 63 | l_fingers_index_gui.show() 64 | l_fingers_middlef_gui.show() 65 | l_fingers_ring_gui.show() 66 | l_fingers_pinky_gui.show() 67 | 68 | l_fingers_metacarpal_gui.show() 69 | l_fingers_proximal_gui.show() 70 | l_fingers_middlep_gui.show() 71 | l_fingers_distal_gui.show() 72 | l_fingers_tip_gui.show() 73 | 74 | l_finger_thumb_metacarpal_gui.show() 75 | l_finger_thumb_proximal_gui.show() 76 | l_finger_thumb_distal_gui.show() 77 | l_finger_thumb_tip_gui.show() 78 | 79 | l_finger_index_metacarpal_gui.show() 80 | l_finger_index_proximal_gui.show() 81 | l_finger_index_middlep_gui.show() 82 | l_finger_index_distal_gui.show() 83 | l_finger_index_tip_gui.show() 84 | 85 | l_finger_middlef_metacarpal_gui.show() 86 | l_finger_middlef_proximal_gui.show() 87 | l_finger_middlef_middlep_gui.show() 88 | l_finger_middlef_distal_gui.show() 89 | l_finger_middlef_tip_gui.show() 90 | 91 | l_finger_ring_metacarpal_gui.show() 92 | l_finger_ring_proximal_gui.show() 93 | l_finger_ring_middlep_gui.show() 94 | l_finger_ring_distal_gui.show() 95 | l_finger_ring_tip_gui.show() 96 | 97 | l_finger_pinky_metacarpal_gui.show() 98 | l_finger_pinky_proximal_gui.show() 99 | l_finger_pinky_middlep_gui.show() 100 | l_finger_pinky_distal_gui.show() 101 | l_finger_pinky_tip_gui.show() 102 | 103 | r_fingers_thumb_gui.show() 104 | r_fingers_index_gui.show() 105 | r_fingers_middlef_gui.show() 106 | r_fingers_ring_gui.show() 107 | r_fingers_pinky_gui.show() 108 | 109 | r_fingers_metacarpal_gui.show() 110 | r_fingers_proximal_gui.show() 111 | r_fingers_middlep_gui.show() 112 | r_fingers_distal_gui.show() 113 | r_fingers_tip_gui.show() 114 | 115 | r_finger_thumb_metacarpal_gui.show() 116 | r_finger_thumb_proximal_gui.show() 117 | r_finger_thumb_distal_gui.show() 118 | r_finger_thumb_tip_gui.show() 119 | 120 | r_finger_index_metacarpal_gui.show() 121 | r_finger_index_proximal_gui.show() 122 | r_finger_index_middlep_gui.show() 123 | r_finger_index_distal_gui.show() 124 | r_finger_index_tip_gui.show() 125 | 126 | r_finger_middlef_metacarpal_gui.show() 127 | r_finger_middlef_proximal_gui.show() 128 | r_finger_middlef_middlep_gui.show() 129 | r_finger_middlef_distal_gui.show() 130 | r_finger_middlef_tip_gui.show() 131 | 132 | r_finger_ring_metacarpal_gui.show() 133 | r_finger_ring_proximal_gui.show() 134 | r_finger_ring_middlep_gui.show() 135 | r_finger_ring_distal_gui.show() 136 | r_finger_ring_tip_gui.show() 137 | 138 | r_finger_pinky_metacarpal_gui.show() 139 | r_finger_pinky_proximal_gui.show() 140 | r_finger_pinky_middlep_gui.show() 141 | r_finger_pinky_distal_gui.show() 142 | r_finger_pinky_tip_gui.show() 143 | 144 | l_foot_ankle_gui.show() 145 | r_foot_ankle_gui.show() 146 | 147 | l_foot_ankle_fk_gui.show() 148 | l_foot_ball_gui.show() 149 | l_foot_toes_gui.show() 150 | r_foot_ankle_fk_gui.show() 151 | r_foot_ball_gui.show() 152 | r_foot_toes_gui.show() 153 | 154 | namespaceik = ls("*" + namespace_sel.currentText() + ":guiData", r = True) 155 | for i in namespaceik: 156 | if getAttr(i + ".isIK"): 157 | l_shoulder_fk_gui.show().move() 158 | l_elbow_fk_gui.show().move() 159 | l_wrist_fk_gui.show().move() 160 | r_shoulder_fk_gui.show().move() 161 | r_elbow_fk_gui.show().move() 162 | r_wrist_fk_gui.show().move() 163 | 164 | l_arm_ikpole_gui.show().move() 165 | l_arm_ik_gui.show().move() 166 | r_arm_ikpole_gui.show().move() 167 | r_arm_ik_gui.show().move() 168 | 169 | l_thigh_fk_gui.show().move() 170 | l_knee_fk_gui.show().move() 171 | l_ankle_fk_gui.show().move() 172 | r_thigh_fk_gui.show().move() 173 | r_knee_fk_gui.show().move() 174 | r_ankle_fk_gui.show().move() 175 | 176 | l_leg_ikpole_gui.show().move() 177 | l_leg_ik_gui.show().move() 178 | r_leg_ikpole_gui.show().move() 179 | r_leg_ik_gui.show().move() 180 | 181 | l_foot_ankle_fk_gui.show() 182 | r_foot_ankle_fk_gui.show() 183 | 184 | l_arm_ikfk_switch_gui.show() 185 | r_arm_ikfk_switch_gui.show() 186 | l_leg_ikfk_switch_gui.show() 187 | r_leg_ikfk_switch_gui.show() 188 | 189 | l_leg_ikfk_switch_select_gui.show() 190 | r_leg_ikfk_switch_select_gui.show() 191 | 192 | l_shoulder_gui.hide() 193 | l_elbow_gui.hide() 194 | l_wrist_gui.hide() 195 | r_shoulder_gui.hide() 196 | r_elbow_gui.hide() 197 | r_wrist_gui.hide() 198 | 199 | l_thigh_gui.hide() 200 | l_knee_gui.hide() 201 | l_ankle_gui.hide() 202 | r_thigh_gui.hide() 203 | r_knee_gui.hide() 204 | r_ankle_gui.hide() 205 | 206 | ikfkuichange() 207 | elif not getAttr(i + ".isIK"): 208 | l_shoulder_gui.show().move() 209 | l_elbow_gui.show().move() 210 | l_wrist_gui.show().move() 211 | r_shoulder_gui.show().move() 212 | r_elbow_gui.show().move() 213 | r_wrist_gui.show().move() 214 | 215 | l_thigh_gui.show().move() 216 | l_knee_gui.show().move() 217 | l_ankle_gui.show().move() 218 | r_thigh_gui.show().move() 219 | r_knee_gui.show().move() 220 | r_ankle_gui.show().move() 221 | 222 | l_shoulder_fk_gui.hide() 223 | l_elbow_fk_gui.hide() 224 | l_wrist_fk_gui.hide() 225 | r_shoulder_fk_gui.hide() 226 | r_elbow_fk_gui.hide() 227 | r_wrist_fk_gui.hide() 228 | 229 | l_arm_ikpole_gui.hide() 230 | l_arm_ik_gui.hide() 231 | r_arm_ikpole_gui.hide() 232 | r_arm_ik_gui.hide() 233 | 234 | l_thigh_fk_gui.hide() 235 | l_knee_fk_gui.hide() 236 | l_ankle_fk_gui.hide() 237 | r_thigh_fk_gui.hide() 238 | r_knee_fk_gui.hide() 239 | r_ankle_fk_gui.hide() 240 | 241 | l_leg_ikpole_gui.hide() 242 | l_leg_ik_gui.hide() 243 | r_leg_ikpole_gui.hide() 244 | r_leg_ik_gui.hide() 245 | 246 | l_foot_ankle_fk_gui.hide() 247 | r_foot_ankle_fk_gui.hide() 248 | 249 | l_arm_ikfk_switch_gui.hide() 250 | r_arm_ikfk_switch_gui.hide() 251 | l_leg_ikfk_switch_gui.hide() 252 | r_leg_ikfk_switch_gui.hide() 253 | 254 | l_leg_ikfk_switch_select_gui.hide() 255 | r_leg_ikfk_switch_select_gui.hide() 256 | 257 | picker_bg.setPixmap(workspace(q = True, rd = True) + "images/" + namespace_sel.currentText() +'_pb.1.jpg') 258 | elif not ls("*guiData", r = True): 259 | print("NO GUI DATA") 260 | 261 | spine_gui.hide() 262 | 263 | hip_gui.hide() 264 | waist_gui.hide() 265 | chest_gui.hide() 266 | collarbone_gui.hide() 267 | 268 | root_gui.hide() 269 | ctrlgrp_gui.hide() 270 | 271 | head_gui.hide() 272 | jaw_gui.hide() 273 | 274 | l_eye_gui.hide() 275 | r_eye_gui.hide() 276 | eyesLookAt_gui.hide() 277 | 278 | l_clavicle_gui.hide() 279 | r_clavicle_gui.hide() 280 | 281 | l_shoulder_gui.hide() 282 | l_elbow_gui.hide() 283 | l_wrist_gui.hide() 284 | r_shoulder_gui.hide() 285 | r_elbow_gui.hide() 286 | r_wrist_gui.hide() 287 | 288 | l_thigh_gui.hide() 289 | l_knee_gui.hide() 290 | l_ankle_gui.hide() 291 | r_thigh_gui.hide() 292 | r_knee_gui.hide() 293 | r_ankle_gui.hide() 294 | 295 | l_shoulder_fk_gui.hide() 296 | l_elbow_fk_gui.hide() 297 | l_wrist_fk_gui.hide() 298 | r_shoulder_fk_gui.hide() 299 | r_elbow_fk_gui.hide() 300 | r_wrist_fk_gui.hide() 301 | 302 | l_fingers_thumb_gui.hide() 303 | l_fingers_index_gui.hide() 304 | l_fingers_middlef_gui.hide() 305 | l_fingers_ring_gui.hide() 306 | l_fingers_pinky_gui.hide() 307 | 308 | l_fingers_metacarpal_gui.hide() 309 | l_fingers_proximal_gui.hide() 310 | l_fingers_middlep_gui.hide() 311 | l_fingers_distal_gui.hide() 312 | l_fingers_tip_gui.hide() 313 | 314 | l_finger_thumb_metacarpal_gui.hide() 315 | l_finger_thumb_proximal_gui.hide() 316 | l_finger_thumb_distal_gui.hide() 317 | l_finger_thumb_tip_gui.hide() 318 | 319 | l_finger_index_metacarpal_gui.hide() 320 | l_finger_index_proximal_gui.hide() 321 | l_finger_index_middlep_gui.hide() 322 | l_finger_index_distal_gui.hide() 323 | l_finger_index_tip_gui.hide() 324 | 325 | l_finger_middlef_metacarpal_gui.hide() 326 | l_finger_middlef_proximal_gui.hide() 327 | l_finger_middlef_middlep_gui.hide() 328 | l_finger_middlef_distal_gui.hide() 329 | l_finger_middlef_tip_gui.hide() 330 | 331 | l_finger_ring_metacarpal_gui.hide() 332 | l_finger_ring_proximal_gui.hide() 333 | l_finger_ring_middlep_gui.hide() 334 | l_finger_ring_distal_gui.hide() 335 | l_finger_ring_tip_gui.hide() 336 | 337 | l_finger_pinky_metacarpal_gui.hide() 338 | l_finger_pinky_proximal_gui.hide() 339 | l_finger_pinky_middlep_gui.hide() 340 | l_finger_pinky_distal_gui.hide() 341 | l_finger_pinky_tip_gui.hide() 342 | 343 | r_fingers_thumb_gui.hide() 344 | r_fingers_index_gui.hide() 345 | r_fingers_middlef_gui.hide() 346 | r_fingers_ring_gui.hide() 347 | r_fingers_pinky_gui.hide() 348 | 349 | r_fingers_metacarpal_gui.hide() 350 | r_fingers_proximal_gui.hide() 351 | r_fingers_middlep_gui.hide() 352 | r_fingers_distal_gui.hide() 353 | r_fingers_tip_gui.hide() 354 | 355 | r_finger_thumb_metacarpal_gui.hide() 356 | r_finger_thumb_proximal_gui.hide() 357 | r_finger_thumb_distal_gui.hide() 358 | r_finger_thumb_tip_gui.hide() 359 | 360 | r_finger_index_metacarpal_gui.hide() 361 | r_finger_index_proximal_gui.hide() 362 | r_finger_index_middlep_gui.hide() 363 | r_finger_index_distal_gui.hide() 364 | r_finger_index_tip_gui.hide() 365 | 366 | r_finger_middlef_metacarpal_gui.hide() 367 | r_finger_middlef_proximal_gui.hide() 368 | r_finger_middlef_middlep_gui.hide() 369 | r_finger_middlef_distal_gui.hide() 370 | r_finger_middlef_tip_gui.hide() 371 | 372 | r_finger_ring_metacarpal_gui.hide() 373 | r_finger_ring_proximal_gui.hide() 374 | r_finger_ring_middlep_gui.hide() 375 | r_finger_ring_distal_gui.hide() 376 | r_finger_ring_tip_gui.hide() 377 | 378 | r_finger_pinky_metacarpal_gui.hide() 379 | r_finger_pinky_proximal_gui.hide() 380 | r_finger_pinky_middlep_gui.hide() 381 | r_finger_pinky_distal_gui.hide() 382 | r_finger_pinky_tip_gui.hide() 383 | 384 | l_arm_ikpole_gui.hide() 385 | l_arm_ik_gui.hide() 386 | r_arm_ikpole_gui.hide() 387 | r_arm_ik_gui.hide() 388 | 389 | l_thigh_fk_gui.hide() 390 | l_knee_fk_gui.hide() 391 | l_ankle_fk_gui.hide() 392 | r_thigh_fk_gui.hide() 393 | r_knee_fk_gui.hide() 394 | r_ankle_fk_gui.hide() 395 | 396 | l_leg_ikpole_gui.hide() 397 | l_leg_ik_gui.hide() 398 | r_leg_ikpole_gui.hide() 399 | r_leg_ik_gui.hide() 400 | 401 | l_foot_ankle_fk_gui.hide() 402 | r_foot_ankle_fk_gui.hide() 403 | 404 | l_arm_ikfk_switch_gui.hide() 405 | r_arm_ikfk_switch_gui.hide() 406 | l_leg_ikfk_switch_gui.hide() 407 | r_leg_ikfk_switch_gui.hide() 408 | 409 | l_leg_ikfk_switch_select_gui.hide() 410 | r_leg_ikfk_switch_select_gui.hide() 411 | 412 | l_foot_ankle_gui.hide() 413 | r_foot_ankle_gui.hide() 414 | 415 | l_foot_ankle_fk_gui.hide() 416 | l_foot_ball_gui.hide() 417 | l_foot_toes_gui.hide() 418 | r_foot_ankle_fk_gui.hide() 419 | r_foot_ball_gui.hide() 420 | r_foot_toes_gui.hide() 421 | 422 | picker_bg.setPixmap(None) 423 | 424 | def ikfkuichange(): 425 | for x in ls("*" + namespace_sel.currentText() + ":*_ikfk_switch_ctrl"): 426 | if((str(x).partition(namespace_sel.currentText() + ':')[2]).startswith("l_arm")): 427 | if(getAttr('*' + namespace_sel.currentText() + ':l_arm_ikfk_switch_ctrl.IK_FK_switch') == 0): 428 | l_arm_ikfk_switch_gui.setText("FK") 429 | l_shoulder_fk_gui.show() 430 | l_elbow_fk_gui.show() 431 | l_wrist_fk_gui.show() 432 | l_arm_ikpole_gui.hide() 433 | l_arm_ik_gui.hide() 434 | elif(getAttr('*' + namespace_sel.currentText() + ':l_arm_ikfk_switch_ctrl.IK_FK_switch') == 1): 435 | l_arm_ikfk_switch_gui.setText("IK") 436 | l_shoulder_fk_gui.hide() 437 | l_elbow_fk_gui.hide() 438 | l_wrist_fk_gui.hide() 439 | l_arm_ikpole_gui.show() 440 | l_arm_ik_gui.show() 441 | elif((str(x).partition(namespace_sel.currentText() + ':')[2]).startswith("r_arm")): 442 | if(getAttr('*' + namespace_sel.currentText() + ':r_arm_ikfk_switch_ctrl.IK_FK_switch') == 0): 443 | r_arm_ikfk_switch_gui.setText("FK") 444 | r_shoulder_fk_gui.show() 445 | r_elbow_fk_gui.show() 446 | r_wrist_fk_gui.show() 447 | r_arm_ikpole_gui.hide() 448 | r_arm_ik_gui.hide() 449 | elif(getAttr('*' + namespace_sel.currentText() + ':r_arm_ikfk_switch_ctrl.IK_FK_switch') == 1): 450 | r_arm_ikfk_switch_gui.setText("IK") 451 | r_shoulder_fk_gui.hide() 452 | r_elbow_fk_gui.hide() 453 | r_wrist_fk_gui.hide() 454 | r_arm_ikpole_gui.show() 455 | r_arm_ik_gui.show() 456 | elif((str(x).partition(namespace_sel.currentText() + ':')[2]).startswith("l_leg")): 457 | if(getAttr('*' + namespace_sel.currentText() + ':l_leg_ikfk_switch_ctrl.IK_FK_switch') == 0): 458 | l_leg_ikfk_switch_gui.setText("FK") 459 | l_thigh_fk_gui.show() 460 | l_knee_fk_gui.show() 461 | l_ankle_fk_gui.show() 462 | l_leg_ikpole_gui.hide() 463 | l_leg_ik_gui.hide() 464 | elif(getAttr('*' + namespace_sel.currentText() + ':l_leg_ikfk_switch_ctrl.IK_FK_switch') == 1): 465 | l_leg_ikfk_switch_gui.setText("IK") 466 | l_thigh_fk_gui.hide() 467 | l_knee_fk_gui.hide() 468 | l_ankle_fk_gui.hide() 469 | l_leg_ikpole_gui.show() 470 | l_leg_ik_gui.show() 471 | elif((str(x).partition(namespace_sel.currentText() + ':')[2]).startswith("r_leg")): 472 | if(getAttr('*' + namespace_sel.currentText() + ':r_leg_ikfk_switch_ctrl.IK_FK_switch') == 0): 473 | r_leg_ikfk_switch_gui.setText("FK") 474 | r_thigh_fk_gui.show() 475 | r_knee_fk_gui.show() 476 | r_ankle_fk_gui.show() 477 | r_leg_ikpole_gui.hide() 478 | r_leg_ik_gui.hide() 479 | elif(getAttr('*' + namespace_sel.currentText() + ':r_leg_ikfk_switch_ctrl.IK_FK_switch') == 1): 480 | r_leg_ikfk_switch_gui.setText("IK") 481 | r_thigh_fk_gui.hide() 482 | r_knee_fk_gui.hide() 483 | r_ankle_fk_gui.hide() 484 | r_leg_ikpole_gui.show() 485 | r_leg_ik_gui.show() 486 | 487 | namespaceik = ls("*" + namespace_sel.currentText() + ":guiData", r = True) 488 | for i in namespaceik: 489 | if getAttr(i + ".isIK"): 490 | for i in ls("*_ikfk_switch_ctrl", r = True): 491 | scriptJob(ac = [i + '.IK_FK_switch', ikfkuichange]) 492 | elif not getAttr(i + ".isIK"): 493 | pass 494 | 495 | def getNamespace_list(): 496 | namespace_sel.clear() 497 | namespace_list = ls("*guiData", r = True) 498 | for i in namespace_list: 499 | namespace_sel.addItem(getAttr(i + ".name")) 500 | 501 | getNamespace_list() 502 | namespace_sel.activated.connect(setNamespace) 503 | 504 | pickerwin.header_layout.addWidget(namespace_label) 505 | pickerwin.header_layout.addWidget(namespace_sel) 506 | 507 | pickerwin.layout.addLayout(pickerwin.header_layout) 508 | pickerwin.layout.addWidget(picker_bg) 509 | pickerwin.layout.addLayout(pickerwin.footer_layout) 510 | 511 | class GUI(): 512 | 513 | def __init__(self, name, shape, p = (0, 0), radius = 1, width = 1, height = 1, color = "", text = "", selections = ""): 514 | self.name = name 515 | self.shape = shape 516 | self.pos = p 517 | self.radius = radius 518 | self.width = width 519 | self.height = height 520 | self.color = color 521 | self.text = text 522 | self.selections = selections 523 | 524 | def drawUIButton(self, command, txt = ""): 525 | self.button = QPushButton() 526 | self.button.setText(txt) 527 | self.button.clicked.connect(command) 528 | pickerwin.footer_layout.addWidget(self.button) 529 | 530 | def drawSelectionButton(self, posX = 0, posY = 0): 531 | if (self.shape == "square"): 532 | self.button = QPushButton(pickerwin) 533 | self.button.setText(self.text) 534 | self.button.setGeometry(posX - (self.radius/2), posY - (self.radius/2), self.radius, self.radius) 535 | self.button.setStyleSheet("background-color: " + self.color + ";") 536 | self.button.clicked.connect(self.selection) 537 | elif(self.shape == "rect"): 538 | self.button = QPushButton(pickerwin) 539 | self.button.setText(self.text) 540 | self.button.setGeometry(posX - (self.width/2), posY - (self.height/2), self.width, self.height) 541 | self.button.setStyleSheet("background-color: " + self.color + ";") 542 | self.button.clicked.connect(self.selection) 543 | elif(self.shape == "circle"): 544 | self.button = QPushButton(pickerwin) 545 | self.button.setText(self.text) 546 | self.button.setGeometry(posX - (self.radius/2), posY - (self.radius/2), self.radius, self.radius) 547 | self.button.setStyleSheet("background-color: " + self.color + "; border-radius: " + str(self.radius/2) + "px;") 548 | self.button.clicked.connect(self.selection) 549 | 550 | def drawMultipleSelectionButton(self, posX = 0, posY = 0): 551 | self.button = QPushButton(pickerwin) 552 | self.button.setText(self.text) 553 | self.button.setGeometry(posX - (self.radius/2), posY - (self.radius/2), self.radius, self.radius) 554 | self.button.setStyleSheet("background-color: " + self.color + "; border-radius: " + str(self.radius/2) + "px;") 555 | self.button.clicked.connect(self.multipleSelection) 556 | 557 | def drawToggleButton(self, posX = 0, posY = 0): 558 | self.button = QPushButton(pickerwin) 559 | self.button.setText(self.text) 560 | self.button.setGeometry(posX - (self.radius/2), posY - (self.radius/2), self.radius, self.radius) 561 | self.button.setStyleSheet("background-color: " + self.color + "; font-size : 15px; font-weight : bold;") 562 | self.button.clicked.connect(self.toggle) 563 | 564 | def selection(self): 565 | if (self.name.startswith("l_finger_") or self.name.startswith("r_finger_")): 566 | self.select = ls("*" + namespace_sel.currentText() + ":" + self.name + "_ctrl", r = True) 567 | for i in self.select: 568 | select(i, add = True) 569 | else: 570 | self.select = ls("*" + namespace_sel.currentText() + ":" + self.name + "_ctrl", r = True) 571 | for i in self.select: 572 | select(i) 573 | print(self.name + " clicked!") 574 | 575 | def multipleSelection(self): 576 | selects = ls("*" + namespace_sel.currentText() + ":" + self.name.partition(self.selections)[0] + "*" + self.name.partition(self.selections)[1] + "*_ctrl") 577 | for x in selects: 578 | select(x, add = True) 579 | print(x) 580 | 581 | def toggle(self): 582 | if(getAttr("*" + namespace_sel.currentText() + ":" + self.name + "_ctrl.IK_FK_switch") == 0): 583 | setAttr("*" + namespace_sel.currentText() + ":" + self.name + "_ctrl.IK_FK_switch", 1) 584 | elif(getAttr("*" + namespace_sel.currentText() + ":" + self.name + "_ctrl.IK_FK_switch") == 1): 585 | setAttr("*" + namespace_sel.currentText() + ":" + self.name + "_ctrl.IK_FK_switch", 0) 586 | ikfkuichange() 587 | select("*" + namespace_sel.currentText() + ":" + self.name + "_ctrl") 588 | 589 | def move(self, offsetX = 0, offsetY = 0): 590 | self.namespace = ls("*" + namespace_sel.currentText() + ":guiData", r = True) 591 | for i in self.namespace: 592 | if(self.shape != "rect"): 593 | self.button.move((getAttr(i + "." + self.name + "_ctrl_guiDataX")) - (self.radius/2) + offsetX, (getAttr(i + "." + self.name + "_ctrl_guiDataY")) - (self.radius/2) + offsetY) 594 | else: 595 | self.button.move((getAttr(i + "." + self.name + "_ctrl_guiDataX")) - (self.width/2) + offsetX, (getAttr(i + "." + self.name + "_ctrl_guiDataY")) - (self.height/2) + offsetY) 596 | 597 | def setText(self, txt = ""): 598 | self.button.setText(txt) 599 | 600 | def hide(self): 601 | self.button.hide() 602 | return self 603 | 604 | def show(self): 605 | self.button.show() 606 | return self 607 | 608 | # UI # 609 | 610 | def key_cmd(): 611 | if not ls(sl = True, r = True): 612 | om.MGlobal.displayError("There is no object to key!") 613 | else: 614 | setKeyframe() 615 | 616 | def keyall_cmd(): 617 | for i in ls("*" + namespace_sel.currentText() + ":*ctrl", r = True): 618 | select(i) 619 | setKeyframe() 620 | 621 | def resetpose_cmd(): 622 | for i in ls("*" + namespace_sel.currentText() + ":*ctrl", r = True): 623 | xform(i, t = (0, 0, 0), ro = (0, 0, 0), s = (1, 1, 1), os = True) 624 | 625 | def deselectall_cmd(): 626 | select(cl = True) 627 | 628 | key_btn = GUI("key", "rect") 629 | keyall_btn = GUI("keyall", "rect") 630 | resetpose_btn = GUI("resetpose", "rect") 631 | deselectall_btn = GUI("deselectall", "rect") 632 | 633 | key_btn.drawUIButton(key_cmd, txt = "Key") 634 | keyall_btn.drawUIButton(keyall_cmd, txt = "Key All") 635 | resetpose_btn.drawUIButton(resetpose_cmd, txt = "Reset Pose") 636 | deselectall_btn.drawUIButton(deselectall_cmd, txt = "Deselect All") 637 | 638 | # ROOT # 639 | 640 | root_gui = GUI("root", "rect", width = 150, height = 10, color = "#3696d9") 641 | ctrlgrp_gui = GUI("grp", "rect", width = 50, height = 10, color = "#3696d9") 642 | 643 | root_gui.drawSelectionButton(235, 505) 644 | ctrlgrp_gui.drawSelectionButton(235, 490) 645 | 646 | # SPINE # 647 | spine_gui = GUI("spine", "square", radius = 20, color = "#cad936") 648 | 649 | hip_gui = GUI("hip", "rect", width = 80, height = 10, color = "#cad936") 650 | waist_gui = GUI("waist", "rect", width = 60, height = 10, color = "#cad936") 651 | chest_gui = GUI("chest", "rect", width = 60, height = 10, color = "#cad936") 652 | collarbone_gui = GUI("collarbone", "square", radius = 18, color = "#cad936") 653 | 654 | spine_gui.drawSelectionButton() 655 | 656 | hip_gui.drawSelectionButton() 657 | waist_gui.drawSelectionButton() 658 | chest_gui.drawSelectionButton() 659 | collarbone_gui.drawSelectionButton() 660 | 661 | # HEAD # 662 | head_gui = GUI("head", "square", radius = 50, color = "#cad936") 663 | jaw_gui = GUI("jaw", "circle", radius = 10, color = "#cad936") 664 | l_eye_gui = GUI("l_eye", "circle", radius = 16, color = "#3d9b2f") 665 | r_eye_gui = GUI("r_eye", "circle", radius = 16, color = "#9b3b2f") 666 | eyesLookAt_gui = GUI("eyesLookAt", "rect", width = 50, height = 7, color = "#cad936") 667 | 668 | head_gui.drawSelectionButton() 669 | jaw_gui.drawSelectionButton() 670 | l_eye_gui.drawSelectionButton(340, 90) 671 | r_eye_gui.drawSelectionButton(316, 90) 672 | eyesLookAt_gui.drawSelectionButton(328, 110) 673 | 674 | # ARMS # 675 | l_clavicle_gui = GUI("l_clavicle", "square", radius = 12, color = "#3d9b2f") 676 | r_clavicle_gui = GUI("r_clavicle", "square", radius = 12, color = "#9b3b2f") 677 | 678 | l_shoulder_gui = GUI("l_shoulder", "circle", radius = 20, color = "#3d9b2f") 679 | l_elbow_gui = GUI("l_elbow", "circle", radius = 20, color = "#3d9b2f") 680 | l_wrist_gui = GUI("l_wrist", "circle", radius = 20, color = "#3d9b2f") 681 | r_shoulder_gui = GUI("r_shoulder", "circle", radius = 20, color = "#9b3b2f") 682 | r_elbow_gui = GUI("r_elbow", "circle", radius = 20, color = "#9b3b2f") 683 | r_wrist_gui = GUI("r_wrist", "circle", radius = 20, color = "#9b3b2f") 684 | 685 | l_shoulder_fk_gui = GUI("l_shoulder_fk", "circle", radius = 20, color = "#3d9b2f") 686 | l_elbow_fk_gui = GUI("l_elbow_fk", "circle", radius = 20, color = "#3d9b2f") 687 | l_wrist_fk_gui = GUI("l_wrist_fk", "circle", radius = 20, color = "#3d9b2f") 688 | r_shoulder_fk_gui = GUI("r_shoulder_fk", "circle", radius = 20, color = "#9b3b2f") 689 | r_elbow_fk_gui = GUI("r_elbow_fk", "circle", radius = 20, color = "#9b3b2f") 690 | r_wrist_fk_gui = GUI("r_wrist_fk", "circle", radius = 20, color = "#9b3b2f") 691 | 692 | l_arm_ikpole_gui = GUI("l_arm_ikpole", "circle", radius = 14, color = "#3d9b2f") 693 | l_arm_ik_gui = GUI("l_arm_ik", "square", radius = 20, color = "#3d9b2f") 694 | r_arm_ikpole_gui = GUI("r_arm_ikpole", "circle", radius = 14, color = "#9b3b2f") 695 | r_arm_ik_gui = GUI("r_arm_ik", "square", radius = 20, color = "#9b3b2f") 696 | 697 | l_clavicle_gui.drawSelectionButton() 698 | r_clavicle_gui.drawSelectionButton() 699 | 700 | l_shoulder_gui.drawSelectionButton() 701 | l_elbow_gui.drawSelectionButton() 702 | l_wrist_gui.drawSelectionButton() 703 | r_shoulder_gui.drawSelectionButton() 704 | r_elbow_gui.drawSelectionButton() 705 | r_wrist_gui.drawSelectionButton() 706 | 707 | l_shoulder_fk_gui.drawSelectionButton() 708 | l_elbow_fk_gui.drawSelectionButton() 709 | l_wrist_fk_gui.drawSelectionButton() 710 | r_shoulder_fk_gui.drawSelectionButton() 711 | r_elbow_fk_gui.drawSelectionButton() 712 | r_wrist_fk_gui.drawSelectionButton() 713 | 714 | l_arm_ikpole_gui.drawSelectionButton() 715 | l_arm_ik_gui.drawSelectionButton() 716 | r_arm_ikpole_gui.drawSelectionButton() 717 | r_arm_ik_gui.drawSelectionButton() 718 | 719 | # L FINGERS # 720 | #THUMB# 721 | l_finger_thumb_metacarpal_gui = GUI("l_finger_thumb_metacarpal", "rect", width = 15, height = 25, color = "#3d9b2f") 722 | l_finger_thumb_proximal_gui = GUI("l_finger_thumb_proximal", "rect", width = 15, height = 10, color = "#3d9b2f") 723 | l_finger_thumb_distal_gui = GUI("l_finger_thumb_distal", "rect", width = 15, height = 10, color = "#3d9b2f") 724 | l_finger_thumb_tip_gui = GUI("l_finger_thumb_tip", "rect", width = 15, height = 10, color = "#3d9b2f") 725 | #INDEX# 726 | l_finger_index_metacarpal_gui = GUI("l_finger_index_metacarpal", "rect", width = 10, height = 25, color = "#3d9b2f") 727 | l_finger_index_proximal_gui = GUI("l_finger_index_proximal", "square", radius = 10, color = "#3d9b2f") 728 | l_finger_index_middlep_gui = GUI("l_finger_index_middlep", "square", radius = 10, color = "#3d9b2f") 729 | l_finger_index_distal_gui = GUI("l_finger_index_distal", "square", radius = 10, color = "#3d9b2f") 730 | l_finger_index_tip_gui = GUI("l_finger_index_tip", "square", radius = 10, color = "#3d9b2f") 731 | #MIDDLE# 732 | l_finger_middlef_metacarpal_gui = GUI("l_finger_middlef_metacarpal", "rect", width = 10, height = 25, color = "#3d9b2f") 733 | l_finger_middlef_proximal_gui = GUI("l_finger_middlef_proximal", "square", radius = 10, color = "#3d9b2f") 734 | l_finger_middlef_middlep_gui = GUI("l_finger_middlef_middlep", "square", radius = 10, color = "#3d9b2f") 735 | l_finger_middlef_distal_gui = GUI("l_finger_middlef_distal", "square", radius = 10, color = "#3d9b2f") 736 | l_finger_middlef_tip_gui = GUI("l_finger_middlef_tip", "square", radius = 10, color = "#3d9b2f") 737 | #RING# 738 | l_finger_ring_metacarpal_gui = GUI("l_finger_ring_metacarpal", "rect", width = 10, height = 25, color = "#3d9b2f") 739 | l_finger_ring_proximal_gui = GUI("l_finger_ring_proximal", "square", radius = 10, color = "#3d9b2f") 740 | l_finger_ring_middlep_gui = GUI("l_finger_ring_middlep", "square", radius = 10, color = "#3d9b2f") 741 | l_finger_ring_distal_gui = GUI("l_finger_ring_distal", "square", radius = 10, color = "#3d9b2f") 742 | l_finger_ring_tip_gui = GUI("l_finger_ring_tip", "square", radius = 10, color = "#3d9b2f") 743 | #PINKY# 744 | l_finger_pinky_metacarpal_gui = GUI("l_finger_pinky_metacarpal", "rect", width = 10, height = 25, color = "#3d9b2f") 745 | l_finger_pinky_proximal_gui = GUI("l_finger_pinky_proximal", "square", radius = 10, color = "#3d9b2f") 746 | l_finger_pinky_middlep_gui = GUI("l_finger_pinky_middlep", "square", radius = 10, color = "#3d9b2f") 747 | l_finger_pinky_distal_gui = GUI("l_finger_pinky_distal", "square", radius = 10, color = "#3d9b2f") 748 | l_finger_pinky_tip_gui = GUI("l_finger_pinky_tip", "square", radius = 10, color = "#3d9b2f") 749 | #EXTRA CONTROLS 750 | l_fingers_thumb_gui = GUI("l_finger_thumb", "circle", radius = 12, color = "#3d9b2f", selections = "thumb") 751 | l_fingers_index_gui = GUI("l_finger_index", "circle", radius = 12, color = "#3d9b2f", selections = "index") 752 | l_fingers_middlef_gui = GUI("l_finger_middlef", "circle", radius = 12, color = "#3d9b2f", selections = "middlef") 753 | l_fingers_ring_gui = GUI("l_finger_ring", "circle", radius = 12, color = "#3d9b2f", selections = "ring") 754 | l_fingers_pinky_gui = GUI("l_finger_pinky", "circle", radius = 12, color = "#3d9b2f", selections = "pinky") 755 | 756 | l_fingers_metacarpal_gui = GUI("l_finger_metacarpal", "circle", radius = 12, color = "#3d9b2f", selections = "metacarpal") 757 | l_fingers_proximal_gui = GUI("l_finger_proximal", "circle", radius = 12, color = "#3d9b2f", selections = "proximal") 758 | l_fingers_middlep_gui = GUI("l_finger_middlep", "circle", radius = 12, color = "#3d9b2f", selections = "middlep") 759 | l_fingers_distal_gui = GUI("l_finger_distal", "circle", radius = 12, color = "#3d9b2f", selections = "distal") 760 | l_fingers_tip_gui = GUI("l_finger_tip", "circle", radius = 12, color = "#3d9b2f", selections = "tip") 761 | 762 | l_fingers_thumb_gui.drawMultipleSelectionButton(posX = 370, posY = 420) 763 | l_fingers_index_gui.drawMultipleSelectionButton(posX = 385, posY = 420) 764 | l_fingers_middlef_gui.drawMultipleSelectionButton(posX = 400, posY = 420) 765 | l_fingers_ring_gui.drawMultipleSelectionButton(posX = 415, posY = 420) 766 | l_fingers_pinky_gui.drawMultipleSelectionButton(posX = 430, posY = 420) 767 | 768 | l_fingers_metacarpal_gui.drawMultipleSelectionButton(posX = 445, posY = 345) 769 | l_fingers_proximal_gui.drawMultipleSelectionButton(posX = 445, posY = 360) 770 | l_fingers_middlep_gui.drawMultipleSelectionButton(posX = 445, posY = 375) 771 | l_fingers_distal_gui.drawMultipleSelectionButton(posX = 445, posY = 390) 772 | l_fingers_tip_gui.drawMultipleSelectionButton(posX = 445, posY = 405) 773 | 774 | l_finger_thumb_metacarpal_gui.drawSelectionButton(posX = 370, posY = 340) 775 | l_finger_thumb_proximal_gui.drawSelectionButton(posX = 370, posY = 360) 776 | l_finger_thumb_distal_gui.drawSelectionButton(posX = 370, posY = 375) 777 | l_finger_thumb_tip_gui.drawSelectionButton(posX = 370, posY = 390) 778 | 779 | l_finger_index_metacarpal_gui.drawSelectionButton(posX = 385, posY = 340) 780 | l_finger_index_proximal_gui.drawSelectionButton(posX = 385, posY = 360) 781 | l_finger_index_middlep_gui.drawSelectionButton(posX = 385, posY = 375) 782 | l_finger_index_distal_gui.drawSelectionButton(posX = 385, posY = 390) 783 | l_finger_index_tip_gui.drawSelectionButton(posX = 385, posY = 405) 784 | 785 | l_finger_middlef_metacarpal_gui.drawSelectionButton(posX = 400, posY = 340) 786 | l_finger_middlef_proximal_gui.drawSelectionButton(posX = 400, posY = 360) 787 | l_finger_middlef_middlep_gui.drawSelectionButton(posX = 400, posY = 375) 788 | l_finger_middlef_distal_gui.drawSelectionButton(posX = 400, posY = 390) 789 | l_finger_middlef_tip_gui.drawSelectionButton(posX = 400, posY = 405) 790 | 791 | l_finger_ring_metacarpal_gui.drawSelectionButton(posX = 415, posY = 340) 792 | l_finger_ring_proximal_gui.drawSelectionButton(posX = 415, posY = 360) 793 | l_finger_ring_middlep_gui.drawSelectionButton(posX = 415, posY = 375) 794 | l_finger_ring_distal_gui.drawSelectionButton(posX = 415, posY = 390) 795 | l_finger_ring_tip_gui.drawSelectionButton(posX = 415, posY = 405) 796 | 797 | l_finger_pinky_metacarpal_gui.drawSelectionButton(posX = 430, posY = 340) 798 | l_finger_pinky_proximal_gui.drawSelectionButton(posX = 430, posY = 360) 799 | l_finger_pinky_middlep_gui.drawSelectionButton(posX = 430, posY = 375) 800 | l_finger_pinky_distal_gui.drawSelectionButton(posX = 430, posY = 390) 801 | l_finger_pinky_tip_gui.drawSelectionButton(posX = 430, posY = 405) 802 | 803 | # R FINGERS # 804 | #THUMB# 805 | r_finger_thumb_metacarpal_gui = GUI("r_finger_thumb_metacarpal", "rect", width = 15, height = 25, color = "#9b3b2f") 806 | r_finger_thumb_proximal_gui = GUI("r_finger_thumb_proximal", "rect", width = 15, height = 10, color = "#9b3b2f") 807 | r_finger_thumb_distal_gui = GUI("r_finger_thumb_distal", "rect", width = 15, height = 10, color = "#9b3b2f") 808 | r_finger_thumb_tip_gui = GUI("r_finger_thumb_tip", "rect", width = 15, height = 10, color = "#9b3b2f") 809 | #INDEX# 810 | r_finger_index_metacarpal_gui = GUI("r_finger_index_metacarpal", "rect", width = 10, height = 25, color = "#9b3b2f") 811 | r_finger_index_proximal_gui = GUI("r_finger_index_proximal", "square", radius = 10, color = "#9b3b2f") 812 | r_finger_index_middlep_gui = GUI("r_finger_index_middlep", "square", radius = 10, color = "#9b3b2f") 813 | r_finger_index_distal_gui = GUI("r_finger_index_distal", "square", radius = 10, color = "#9b3b2f") 814 | r_finger_index_tip_gui = GUI("r_finger_index_tip", "square", radius = 10, color = "#9b3b2f") 815 | #MIDDLE# 816 | r_finger_middlef_metacarpal_gui = GUI("r_finger_middlef_metacarpal", "rect", width = 10, height = 25, color = "#9b3b2f") 817 | r_finger_middlef_proximal_gui = GUI("r_finger_middlef_proximal", "square", radius = 10, color = "#9b3b2f") 818 | r_finger_middlef_middlep_gui = GUI("r_finger_middlef_middlep", "square", radius = 10, color = "#9b3b2f") 819 | r_finger_middlef_distal_gui = GUI("r_finger_middlef_distal", "square", radius = 10, color = "#9b3b2f") 820 | r_finger_middlef_tip_gui = GUI("r_finger_middlef_tip", "square", radius = 10, color = "#9b3b2f") 821 | #RING# 822 | r_finger_ring_metacarpal_gui = GUI("r_finger_ring_metacarpal", "rect", width = 10, height = 25, color = "#9b3b2f") 823 | r_finger_ring_proximal_gui = GUI("r_finger_ring_proximal", "square", radius = 10, color = "#9b3b2f") 824 | r_finger_ring_middlep_gui = GUI("r_finger_ring_middlep", "square", radius = 10, color = "#9b3b2f") 825 | r_finger_ring_distal_gui = GUI("r_finger_ring_distal", "square", radius = 10, color = "#9b3b2f") 826 | r_finger_ring_tip_gui = GUI("r_finger_ring_tip", "square", radius = 10, color = "#9b3b2f") 827 | #PINKY# 828 | r_finger_pinky_metacarpal_gui = GUI("r_finger_pinky_metacarpal", "rect", width = 10, height = 25, color = "#9b3b2f") 829 | r_finger_pinky_proximal_gui = GUI("r_finger_pinky_proximal", "square", radius = 10, color = "#9b3b2f") 830 | r_finger_pinky_middlep_gui = GUI("r_finger_pinky_middlep", "square", radius = 10, color = "#9b3b2f") 831 | r_finger_pinky_distal_gui = GUI("r_finger_pinky_distal", "square", radius = 10, color = "#9b3b2f") 832 | r_finger_pinky_tip_gui = GUI("r_finger_pinky_tip", "square", radius = 10, color = "#9b3b2f") 833 | #EXTRA CONTROLS 834 | r_fingers_thumb_gui = GUI("r_finger_thumb", "circle", radius = 12, color = "#9b3b2f", selections = "thumb") 835 | r_fingers_index_gui = GUI("r_finger_index", "circle", radius = 12, color = "#9b3b2f", selections = "index") 836 | r_fingers_middlef_gui = GUI("r_finger_middlef", "circle", radius = 12, color = "#9b3b2f", selections = "middlef") 837 | r_fingers_ring_gui = GUI("r_finger_ring", "circle", radius = 12, color = "#9b3b2f", selections = "ring") 838 | r_fingers_pinky_gui = GUI("r_finger_pinky", "circle", radius = 12, color = "#9b3b2f", selections = "pinky") 839 | 840 | r_fingers_metacarpal_gui = GUI("r_finger_metacarpal", "circle", radius = 12, color = "#9b3b2f", selections = "metacarpal") 841 | r_fingers_proximal_gui = GUI("r_finger_proximal", "circle", radius = 12, color = "#9b3b2f", selections = "proximal") 842 | r_fingers_middlep_gui = GUI("r_finger_middlep", "circle", radius = 12, color = "#9b3b2f", selections = "middlep") 843 | r_fingers_distal_gui = GUI("r_finger_distal", "circle", radius = 12, color = "#9b3b2f", selections = "distal") 844 | r_fingers_tip_gui = GUI("r_finger_tip", "circle", radius = 12, color = "#9b3b2f", selections = "tip") 845 | 846 | r_fingers_thumb_gui.drawMultipleSelectionButton(posX = 100, posY = 420) 847 | r_fingers_index_gui.drawMultipleSelectionButton(posX = 85, posY = 420) 848 | r_fingers_middlef_gui.drawMultipleSelectionButton(posX = 70, posY = 420) 849 | r_fingers_ring_gui.drawMultipleSelectionButton(posX = 55, posY = 420) 850 | r_fingers_pinky_gui.drawMultipleSelectionButton(posX = 40, posY = 420) 851 | 852 | r_fingers_metacarpal_gui.drawMultipleSelectionButton(posX = 25, posY = 345) 853 | r_fingers_proximal_gui.drawMultipleSelectionButton(posX = 25, posY = 360) 854 | r_fingers_middlep_gui.drawMultipleSelectionButton(posX = 25, posY = 375) 855 | r_fingers_distal_gui.drawMultipleSelectionButton(posX = 25, posY = 390) 856 | r_fingers_tip_gui.drawMultipleSelectionButton(posX = 25, posY = 405) 857 | 858 | r_finger_thumb_metacarpal_gui.drawSelectionButton(posX = 100, posY = 340) 859 | r_finger_thumb_proximal_gui.drawSelectionButton(posX = 100, posY = 360) 860 | r_finger_thumb_distal_gui.drawSelectionButton(posX = 100, posY = 375) 861 | r_finger_thumb_tip_gui.drawSelectionButton(posX = 100, posY = 390) 862 | 863 | r_finger_index_metacarpal_gui.drawSelectionButton(posX = 85, posY = 340) 864 | r_finger_index_proximal_gui.drawSelectionButton(posX = 85, posY = 360) 865 | r_finger_index_middlep_gui.drawSelectionButton(posX = 85, posY = 375) 866 | r_finger_index_distal_gui.drawSelectionButton(posX = 85, posY = 390) 867 | r_finger_index_tip_gui.drawSelectionButton(posX = 85, posY = 405) 868 | 869 | r_finger_middlef_metacarpal_gui.drawSelectionButton(posX = 70, posY = 340) 870 | r_finger_middlef_proximal_gui.drawSelectionButton(posX = 70, posY = 360) 871 | r_finger_middlef_middlep_gui.drawSelectionButton(posX = 70, posY = 375) 872 | r_finger_middlef_distal_gui.drawSelectionButton(posX = 70, posY = 390) 873 | r_finger_middlef_tip_gui.drawSelectionButton(posX = 70, posY = 405) 874 | 875 | r_finger_ring_metacarpal_gui.drawSelectionButton(posX = 55, posY = 340) 876 | r_finger_ring_proximal_gui.drawSelectionButton(posX = 55, posY = 360) 877 | r_finger_ring_middlep_gui.drawSelectionButton(posX = 55, posY = 375) 878 | r_finger_ring_distal_gui.drawSelectionButton(posX = 55, posY = 390) 879 | r_finger_ring_tip_gui.drawSelectionButton(posX = 55, posY = 405) 880 | 881 | r_finger_pinky_metacarpal_gui.drawSelectionButton(posX = 40, posY = 340) 882 | r_finger_pinky_proximal_gui.drawSelectionButton(posX = 40, posY = 360) 883 | r_finger_pinky_middlep_gui.drawSelectionButton(posX = 40, posY = 375) 884 | r_finger_pinky_distal_gui.drawSelectionButton(posX = 40, posY = 390) 885 | r_finger_pinky_tip_gui.drawSelectionButton(posX = 40, posY = 405) 886 | 887 | # LEGS # 888 | 889 | l_thigh_gui = GUI("l_thigh", "circle", radius = 20, color = "#3d9b2f") 890 | l_knee_gui = GUI("l_knee", "circle", radius = 20, color = "#3d9b2f") 891 | l_ankle_gui = GUI("l_ankle", "circle", radius = 20, color = "#3d9b2f") 892 | r_thigh_gui = GUI("r_thigh", "circle", radius = 20, color = "#9b3b2f") 893 | r_knee_gui = GUI("r_knee", "circle", radius = 20, color = "#9b3b2f") 894 | r_ankle_gui = GUI("r_ankle", "circle", radius = 20, color = "#9b3b2f") 895 | 896 | l_thigh_fk_gui = GUI("l_thigh_fk", "circle", radius = 20, color = "#3d9b2f") 897 | l_knee_fk_gui = GUI("l_knee_fk", "circle", radius = 20, color = "#3d9b2f") 898 | l_ankle_fk_gui = GUI("l_ankle_fk", "circle", radius = 20, color = "#3d9b2f") 899 | r_thigh_fk_gui = GUI("r_thigh_fk", "circle", radius = 20, color = "#9b3b2f") 900 | r_knee_fk_gui = GUI("r_knee_fk", "circle", radius = 20, color = "#9b3b2f") 901 | r_ankle_fk_gui = GUI("r_ankle_fk", "circle", radius = 20, color = "#9b3b2f") 902 | 903 | l_leg_ikpole_gui = GUI("l_leg_ikpole", "circle", radius = 14, color = "#3d9b2f") 904 | l_leg_ik_gui = GUI("l_leg_ik", "square", radius = 20, color = "#3d9b2f") 905 | r_leg_ikpole_gui = GUI("r_leg_ikpole", "circle", radius = 14, color = "#9b3b2f") 906 | r_leg_ik_gui = GUI("r_leg_ik", "square", radius = 20, color = "#9b3b2f") 907 | 908 | l_thigh_gui.drawSelectionButton() 909 | l_knee_gui.drawSelectionButton() 910 | l_ankle_gui.drawSelectionButton() 911 | r_thigh_gui.drawSelectionButton() 912 | r_knee_gui.drawSelectionButton() 913 | r_ankle_gui.drawSelectionButton() 914 | 915 | l_thigh_fk_gui.drawSelectionButton() 916 | l_knee_fk_gui.drawSelectionButton() 917 | l_ankle_fk_gui.drawSelectionButton() 918 | r_thigh_fk_gui.drawSelectionButton() 919 | r_knee_fk_gui.drawSelectionButton() 920 | r_ankle_fk_gui.drawSelectionButton() 921 | 922 | l_leg_ikpole_gui.drawSelectionButton() 923 | l_leg_ik_gui.drawSelectionButton() 924 | r_leg_ikpole_gui.drawSelectionButton() 925 | r_leg_ik_gui.drawSelectionButton() 926 | 927 | # FOOT # 928 | 929 | l_foot_ankle_gui = GUI("l_ankle", "rect", width = 55, height = 20, color = "#3d9b2f") 930 | r_foot_ankle_gui = GUI("r_ankle", "rect", width = 55, height = 20, color = "#9b3b2f") 931 | 932 | l_foot_ankle_fk_gui = GUI("l_ankle_fk", "rect", width = 55, height = 20, color = "#3d9b2f") 933 | l_foot_ball_gui = GUI("l_foot_ball", "rect", width = 15, height = 15, color = "#3d9b2f") 934 | l_foot_toes_gui = GUI("l_foot_toes", "rect", width = 20, height = 10, color = "#3d9b2f") 935 | r_foot_ankle_fk_gui = GUI("r_ankle_fk", "rect", width = 55, height = 20, color = "#9b3b2f") 936 | r_foot_ball_gui = GUI("r_foot_ball", "rect", width = 15, height = 15, color = "#9b3b2f") 937 | r_foot_toes_gui = GUI("r_foot_toes", "rect", width = 20, height = 10, color = "#9b3b2f") 938 | 939 | l_foot_ankle_gui.drawSelectionButton(370, 489) 940 | r_foot_ankle_gui.drawSelectionButton(100, 489) 941 | 942 | l_foot_ankle_fk_gui.drawSelectionButton(370, 489) 943 | l_foot_ball_gui.drawSelectionButton(408, 492) 944 | l_foot_toes_gui.drawSelectionButton(428, 494) 945 | r_foot_ankle_fk_gui.drawSelectionButton(100, 489) 946 | r_foot_ball_gui.drawSelectionButton(62, 492) 947 | r_foot_toes_gui.drawSelectionButton(42, 494) 948 | 949 | # IK FK # 950 | 951 | l_arm_ikfk_switch_gui = GUI("l_arm_ikfk_switch", "square", radius = 30, color = "#3d9b2f") 952 | r_arm_ikfk_switch_gui = GUI("r_arm_ikfk_switch", "square", radius = 30, color = "#9b3b2f") 953 | l_leg_ikfk_switch_gui = GUI("l_leg_ikfk_switch", "square", radius = 30, color = "#3d9b2f") 954 | r_leg_ikfk_switch_gui = GUI("r_leg_ikfk_switch", "square", radius = 30, color = "#9b3b2f") 955 | 956 | l_leg_ikfk_switch_select_gui = GUI("l_leg_ikfk_switch", "rect", width = 30, height = 9, color = "#3d9b2f") 957 | r_leg_ikfk_switch_select_gui = GUI("r_leg_ikfk_switch", "rect", width = 30, height = 9, color = "#9b3b2f") 958 | 959 | l_arm_ikfk_switch_gui.drawToggleButton(420, 300) 960 | r_arm_ikfk_switch_gui.drawToggleButton(55, 300) 961 | l_leg_ikfk_switch_gui.drawToggleButton(360, 450) 962 | r_leg_ikfk_switch_gui.drawToggleButton(110, 450) 963 | 964 | l_leg_ikfk_switch_select_gui.drawSelectionButton(360, 472) 965 | r_leg_ikfk_switch_select_gui.drawSelectionButton(110, 472) 966 | 967 | #print(pickerwin.frameGeometry().width()) 968 | setNamespace() 969 | ikfkuichange() 970 | 971 | #pickerwin.show(dockable=True) 972 | 973 | def helloitsme(): 974 | print("hello from the other side") -------------------------------------------------------------------------------- /scripts/riggingtoolkit.py: -------------------------------------------------------------------------------- 1 | from PySide2.QtWidgets import * 2 | from PySide2.QtGui import * 3 | from PySide2.QtCore import* 4 | 5 | from pymel.core import * 6 | from pymel.core.nodetypes import * 7 | 8 | import math 9 | import maya.cmds as cmds 10 | import maya.OpenMayaUI as OpenMayaUI 11 | 12 | import webbrowser as web 13 | 14 | import maya.OpenMaya as om 15 | from maya.app.general.mayaMixin import MayaQWidgetDockableMixin 16 | 17 | guide_layout = QVBoxLayout() 18 | 19 | guidecreate_layout = QHBoxLayout() 20 | guidecreate_layout.setContentsMargins(50, 0, 50, 0) 21 | guideedit_layout = QHBoxLayout() 22 | guideedit_layout.setSpacing(2) 23 | 24 | settings_layout = QVBoxLayout() 25 | 26 | namespace_layout = QHBoxLayout() 27 | namespace_layout.setSpacing(2) 28 | 29 | class ToolkitWindow(MayaQWidgetDockableMixin, QDialog): 30 | def __init__(self): 31 | super(ToolkitWindow, self).__init__() 32 | 33 | # It is crucial we set a unique object name as this is used internally by Maya 34 | self.setWindowTitle("Awan's Auto Rigging Toolkit") 35 | self.setMinimumSize(265, 500) 36 | self.resize(265, 500) 37 | 38 | self.layout = QVBoxLayout() 39 | self.setLayout(self.layout) 40 | 41 | self.menubar = QMenuBar(self) 42 | self.showmenu = self.menubar.addMenu("Show") 43 | self.showmenu.addAction("Local Rotation Axes", self.displayAxes) 44 | self.showmenu.addSeparator() 45 | self.showmenu.addAction("Build Log", self.openlog) 46 | self.showmenu.addAction("Picker GUI", self.openpicker) 47 | 48 | self.addmenu = self.menubar.addMenu("Help") 49 | self.addmenu.addAction("Help on Awan's Auto Rigging Toolkit", self.openhelp) 50 | self.addmenu.addSeparator() 51 | self.addmenu.addAction("Support Me on Gumroad", self.opengumroad) 52 | self.addmenu.addAction("Support Me on Ko-Fi", self.openkofi) 53 | self.addmenu.addAction("Support Me on Sketchfab", self.opensketchfab) 54 | self.addmenu.addSeparator() 55 | self.addmenu.addAction("Developed with ❤ by awwwan", self.opengithub) 56 | 57 | self.layout.addWidget(self.menubar) 58 | 59 | def addLayout(self, layout): 60 | self.layout.addLayout(layout) 61 | 62 | def displayAxes(self): 63 | selectedJoints = ls(type = 'joint', sl = True) 64 | 65 | if not selectedJoints: 66 | allJoints = ls(type = 'joint') 67 | switch(allJoints, la = True) 68 | else: 69 | switch(selectedJoints, la = True) 70 | print("Axes Displayed!") 71 | 72 | def openlog(self): 73 | progresswin.show() 74 | 75 | def openpicker(self): 76 | import picker 77 | picker.pickerwin.show(dockable = True) 78 | picker.getNamespace_list() 79 | picker.setNamespace() 80 | 81 | def openhelp(self): 82 | web.open('https://github.com/awwwan/Auto-Rigger') 83 | 84 | def opengumroad(self): 85 | web.open('https://gumroad.com') 86 | 87 | def openkofi(self): 88 | web.open('https://ko-fi.com/') 89 | 90 | def opensketchfab(self): 91 | web.open('https://sketchfab.com/airy27/') 92 | 93 | def opengithub(self): 94 | web.open('https://github.com/awwwan/') 95 | 96 | #if __name__ == "__main__": 97 | window = ToolkitWindow() 98 | #window.show(dockable=True) 99 | 100 | class ProgressWindow(MayaQWidgetDockableMixin, QDialog): 101 | def __init__(self): 102 | super(ProgressWindow, self).__init__() 103 | self.setWindowTitle("Build Log") 104 | self.setFixedWidth(450) 105 | self.setModal(True) 106 | 107 | self.layout = QVBoxLayout() 108 | self.setLayout(self.layout) 109 | 110 | self.headerlayout = QHBoxLayout() 111 | self.headerlayout.alignment() 112 | self.layout.addLayout(self.headerlayout) 113 | 114 | self.headerlayout.addStretch() 115 | self.button = QPushButton() 116 | self.button.setText("Ok") 117 | self.button.clicked.connect(self.close) 118 | self.headerlayout.addWidget(self.button) 119 | 120 | self.textbox = QTextEdit() 121 | self.textbox.setReadOnly(True) 122 | self.layout.addWidget(self.textbox) 123 | 124 | def close(self): 125 | self.done(True) 126 | 127 | progresswin = ProgressWindow() 128 | 129 | class UI(): 130 | def __init__(self, label = ""): 131 | self.label = label 132 | 133 | def drawTextLabel(self): 134 | self.gui = QLabel() 135 | self.gui.setText(self.label) 136 | return self 137 | 138 | def drawButton(self, command, height = 25): 139 | self.gui = QPushButton() 140 | self.gui.setText(self.label) 141 | self.gui.setFixedHeight(height) 142 | self.gui.clicked.connect(command) 143 | window.layout.addWidget(self.gui) 144 | return self 145 | 146 | def drawToggleButton(self, command, height = 25): 147 | self.gui = QPushButton() 148 | self.gui.setText(self.label) 149 | self.gui.setCheckable(True) 150 | self.gui.setFixedHeight(height) 151 | self.gui.clicked.connect(command) 152 | window.layout.addWidget(self.gui) 153 | return self 154 | 155 | def drawCheckBox(self): 156 | self.gui = QCheckBox() 157 | self.gui.setText(self.label) 158 | self.gui.setChecked(True) 159 | return self 160 | 161 | def drawComboBox(self): 162 | self.gui = QComboBox(editable = True) 163 | window.layout.addWidget(self.gui) 164 | return self 165 | 166 | def addItem(self, item): 167 | self.gui.addItem(item) 168 | 169 | def setLayout(self, layout): 170 | layout.addWidget(self.gui) 171 | 172 | class FrameLayout(QGroupBox): 173 | def __init__(self, title='', parent=None): 174 | super(FrameLayout, self).__init__(title, parent) 175 | 176 | layout = QVBoxLayout() 177 | layout.setContentsMargins(0, 7, 0, 0) 178 | layout.setSpacing(0) 179 | super(FrameLayout, self).setLayout(layout) 180 | 181 | self.__widget = QFrame(parent) 182 | self.__widget.setFrameShape(QFrame.Panel) 183 | self.__widget.setFrameShadow(QFrame.Plain) 184 | self.__widget.setLineWidth(0) 185 | layout.addWidget(self.__widget) 186 | 187 | self.__collapsed = False 188 | 189 | def setLayout(self, layout): 190 | self.__widget.setLayout(layout) 191 | 192 | def expandCollapseRect(self): 193 | return QRect(0, 0, self.width(), 20) 194 | 195 | def mouseReleaseEvent(self, event): 196 | if self.expandCollapseRect().contains(event.pos()): 197 | self.toggleCollapsed() 198 | event.accept() 199 | else: 200 | event.ignore() 201 | 202 | def toggleCollapsed(self): 203 | self.setCollapsed(not self.__collapsed) 204 | 205 | def setCollapsed(self, state=True): 206 | self.__collapsed = state 207 | 208 | if state: 209 | self.setMinimumHeight(20) 210 | self.setMaximumHeight(20) 211 | self.__widget.setVisible(False) 212 | else: 213 | self.setMinimumHeight(0) 214 | self.setMaximumHeight(1000000) 215 | self.__widget.setVisible(True) 216 | 217 | def paintEvent(self, event): 218 | painter = QPainter() 219 | painter.begin(self) 220 | 221 | font = painter.font() 222 | font.setBold(True) 223 | painter.setFont(font) 224 | 225 | x = self.rect().x() 226 | y = self.rect().y() 227 | w = self.rect().width() 228 | offset = 25 229 | 230 | painter.setRenderHint(painter.Antialiasing) 231 | painter.fillRect(self.expandCollapseRect(), QColor(93, 93, 93)) 232 | painter.drawText( 233 | x + offset, y + 3, w, 16, 234 | Qt.AlignLeft | Qt.AlignTop, 235 | self.title() 236 | ) 237 | self.__drawTriangle(painter, x, y)#(1) 238 | painter.setRenderHint(QPainter.Antialiasing, False) 239 | painter.end() 240 | 241 | def __drawTriangle(self, painter, x, y):#(2) 242 | if not self.__collapsed:#(3) 243 | points = [ QPoint(x+10, y+6 ), 244 | QPoint(x+20, y+6 ), 245 | QPoint(x+15, y+11) 246 | ] 247 | 248 | else: 249 | points = [ QPoint(x+10, y+4 ), 250 | QPoint(x+15, y+9 ), 251 | QPoint(x+10, y+14) 252 | ] 253 | 254 | currentBrush = painter.brush()#(4) 255 | currentPen = painter.pen() 256 | 257 | painter.setBrush( 258 | QBrush( 259 | QColor(187, 187, 187), 260 | Qt.SolidPattern 261 | ) 262 | )#(5) 263 | painter.setPen(QPen(Qt.NoPen))#(6) 264 | painter.drawPolygon(QPolygon(points))#(7) 265 | painter.setBrush(currentBrush)#(8) 266 | painter.setPen(currentPen) 267 | 268 | def checkGuides(): 269 | if ls("*guides", r = True): 270 | guides_btn.gui.setEnabled(False) 271 | mirrorguides_btn.gui.setEnabled(True) 272 | deleteguides_btn.gui.setEnabled(True) 273 | autorig_btn.gui.setEnabled(True) 274 | else: 275 | guides_btn.gui.setEnabled(True) 276 | mirrorguides_btn.gui.setEnabled(False) 277 | deleteguides_btn.gui.setEnabled(False) 278 | autorig_btn.gui.setEnabled(False) 279 | 280 | def checkRig(): 281 | if ls("*" + namespace_cmb.gui.currentText() + ":*rig", r = True): 282 | mirrorctrl_btn.gui.setEnabled(True) 283 | deleterig_btn.gui.setEnabled(True) 284 | else: 285 | mirrorctrl_btn.gui.setEnabled(False) 286 | deleterig_btn.gui.setEnabled(False) 287 | 288 | def createGuides(*args): 289 | progresswin.textbox.clear() 290 | 291 | progresswin.setWindowTitle("Awan is creating your guides...") 292 | progresswin.show() 293 | 294 | group(n = "guides") 295 | global prog 296 | prog = 1 297 | 298 | hip.createGuide(s = 10) 299 | waist.createGuide(s = 10) 300 | chest.createGuide(s = 10) 301 | collarbone.createGuide(s = 10) 302 | l_clavicle.createGuide(s = 5) 303 | r_clavicle.createGuide(s = 5) 304 | 305 | neck.createGuide(s = 5) 306 | head.createGuide(s = 5) 307 | jaw.createGuide(s = 5) 308 | chin.createGuide(s = 5) 309 | l_eye.createGuide(s = 5) 310 | r_eye.createGuide(s = 5) 311 | 312 | l_shoulder.createGuide(s = 5) 313 | l_elbow.createGuide(s = 5) 314 | l_wrist.createGuide(s = 5) 315 | r_shoulder.createGuide(s = 5) 316 | r_elbow.createGuide(s = 5) 317 | r_wrist.createGuide(s = 5) 318 | 319 | l_finger_thumb_metacarpal.createGuide() 320 | l_finger_thumb_proximal.createGuide() 321 | l_finger_thumb_distal.createGuide() 322 | l_finger_thumb_tip.createGuide() 323 | r_finger_thumb_metacarpal.createGuide() 324 | r_finger_thumb_proximal.createGuide() 325 | r_finger_thumb_distal.createGuide() 326 | r_finger_thumb_tip.createGuide() 327 | 328 | l_finger_index_metacarpal.createGuide() 329 | l_finger_index_proximal.createGuide() 330 | l_finger_index_middlep.createGuide() 331 | l_finger_index_distal.createGuide() 332 | l_finger_index_tip.createGuide() 333 | r_finger_index_metacarpal.createGuide() 334 | r_finger_index_proximal.createGuide() 335 | r_finger_index_middlep.createGuide() 336 | r_finger_index_distal.createGuide() 337 | r_finger_index_tip.createGuide() 338 | 339 | l_finger_middlef_metacarpal.createGuide() 340 | l_finger_middlef_proximal.createGuide() 341 | l_finger_middlef_middlep.createGuide() 342 | l_finger_middlef_distal.createGuide() 343 | l_finger_middlef_tip.createGuide() 344 | r_finger_middlef_metacarpal.createGuide() 345 | r_finger_middlef_proximal.createGuide() 346 | r_finger_middlef_middlep.createGuide() 347 | r_finger_middlef_distal.createGuide() 348 | r_finger_middlef_tip.createGuide() 349 | 350 | l_finger_ring_metacarpal.createGuide() 351 | l_finger_ring_proximal.createGuide() 352 | l_finger_ring_middlep.createGuide() 353 | l_finger_ring_distal.createGuide() 354 | l_finger_ring_tip.createGuide() 355 | r_finger_ring_metacarpal.createGuide() 356 | r_finger_ring_proximal.createGuide() 357 | r_finger_ring_middlep.createGuide() 358 | r_finger_ring_distal.createGuide() 359 | r_finger_ring_tip.createGuide() 360 | 361 | l_finger_pinky_metacarpal.createGuide() 362 | l_finger_pinky_proximal.createGuide() 363 | l_finger_pinky_middlep.createGuide() 364 | l_finger_pinky_distal.createGuide() 365 | l_finger_pinky_tip.createGuide() 366 | r_finger_pinky_metacarpal.createGuide() 367 | r_finger_pinky_proximal.createGuide() 368 | r_finger_pinky_middlep.createGuide() 369 | r_finger_pinky_distal.createGuide() 370 | r_finger_pinky_tip.createGuide() 371 | 372 | l_thigh.createGuide(s = 5) 373 | l_knee.createGuide(s = 5) 374 | l_ankle.createGuide(s = 5) 375 | l_foot_ball.createGuide(s = 5) 376 | l_foot_toes.createGuide(s = 5) 377 | l_foot_heel.createGuide(s = 5) 378 | l_foot_inner.createGuide(s = 5) 379 | l_foot_outer.createGuide(s = 5) 380 | r_thigh.createGuide(s = 5) 381 | r_knee.createGuide(s = 5) 382 | r_ankle.createGuide(s = 5) 383 | r_foot_ball.createGuide(s = 5) 384 | r_foot_toes.createGuide(s = 5) 385 | r_foot_heel.createGuide(s = 5) 386 | r_foot_inner.createGuide(s = 5) 387 | r_foot_outer.createGuide(s = 5) 388 | 389 | select(cl = True) 390 | 391 | checkGuides() 392 | checkRig() 393 | print("Guides Created!") 394 | progresswin.textbox.append("Guides Created!") 395 | 396 | def mirrorGuides(*args): 397 | selectedGuide = ls(sl = True, l = True) 398 | 399 | if not selectedGuide: 400 | om.MGlobal.displayError ("No guide selected!") 401 | else: 402 | for x in selectedGuide: 403 | if (x.startswith("l_")): 404 | #print(x.partition("l_")[2]) 405 | mirrorpos = xform(x, q = True, t = True, ws = True) 406 | print(mirrorpos) 407 | xform("r_" + x.partition("l_")[2], t = (mirrorpos[0]*-1, mirrorpos[1], mirrorpos[2]), ws = True) 408 | print("r_" + x.partition("l_")[2]) 409 | selectedGuideChildren = listRelatives(x, typ = "locator", ad = True) 410 | 411 | for i in selectedGuideChildren: 412 | #print(mirrorchildpos) 413 | mirrorchildpos = xform(i.partition("Shape")[0], q = True, t = True, ws = True) 414 | print(i.partition("Shape")[0]) 415 | xform("r_" + (i.partition("Shape")[0]).partition("l_")[2], t = (mirrorchildpos[0]*-1, mirrorchildpos[1], mirrorchildpos[2]), ws = True) 416 | elif (x.startswith("r_")): 417 | #print(x.partition("r_")[2]) 418 | mirrorpos = xform(x, q = True, t = True, ws = True) 419 | print(mirrorpos) 420 | xform("l_" + x.partition("r_")[2], t = (mirrorpos[0]*-1, mirrorpos[1], mirrorpos[2]), ws = True) 421 | print("l_" + x.partition("r_")[2]) 422 | selectedGuideChildren = listRelatives(x, typ = "locator", ad = True) 423 | 424 | for i in selectedGuideChildren: 425 | mirrorchildpos = xform(i.partition("Shape")[0], q = True, t = True, ws = True) 426 | print(i.partition("Shape")[0]) 427 | xform("l_" + (i.partition("Shape")[0]).partition("r_")[2], t = (mirrorchildpos[0]*-1, mirrorchildpos[1], mirrorchildpos[2]), ws = True) 428 | else: 429 | om.MGlobal.displayWarning("Selected guide has no symmetry") 430 | print("Guides Mirrored!") 431 | 432 | def deleteGuides(*args): 433 | allGuides = ls("guides") 434 | delete(allGuides) 435 | global prog 436 | prog = 1 437 | 438 | checkGuides() 439 | checkRig() 440 | print("Guides Deleted!") 441 | 442 | def componentMode(*args): 443 | if componentmode_btn.gui.isChecked(): 444 | selectMode(co = True) 445 | selectType(alc = True) 446 | print("Control editing on!") 447 | else: 448 | selectMode(o = True) 449 | print("Control editing off") 450 | 451 | def mirrorControl(*args): 452 | selectedControl = ls(sl = True, l = True, r = True) 453 | 454 | if not selectedControl: 455 | om.MGlobal.displayError ("No control selected!") 456 | else: 457 | for x in selectedControl: 458 | if (x.startswith(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":l_")): 459 | 460 | mirrorpos = xform(x + "Shape.cv[0:8]", q = True, t = True, ws = True) 461 | 462 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":r_" + x.partition("l_")[2] + "Shape.cv[0]", t = (mirrorpos[21]*-1, mirrorpos[22], mirrorpos[23]), ws = True) 463 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":r_" + x.partition("l_")[2] + "Shape.cv[1]", t = (mirrorpos[18]*-1, mirrorpos[19], mirrorpos[20]), ws = True) 464 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":r_" + x.partition("l_")[2] + "Shape.cv[2]", t = (mirrorpos[15]*-1, mirrorpos[16], mirrorpos[17]), ws = True) 465 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":r_" + x.partition("l_")[2] + "Shape.cv[3]", t = (mirrorpos[12]*-1, mirrorpos[13], mirrorpos[14]), ws = True) 466 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":r_" + x.partition("l_")[2] + "Shape.cv[4]", t = (mirrorpos[9]*-1, mirrorpos[10], mirrorpos[11]), ws = True) 467 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":r_" + x.partition("l_")[2] + "Shape.cv[5]", t = (mirrorpos[6]*-1, mirrorpos[7], mirrorpos[8]), ws = True) 468 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":r_" + x.partition("l_")[2] + "Shape.cv[6]", t = (mirrorpos[3]*-1, mirrorpos[4], mirrorpos[5]), ws = True) 469 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":r_" + x.partition("l_")[2] + "Shape.cv[7]", t = (mirrorpos[0]*-1, mirrorpos[1], mirrorpos[2]), ws = True) 470 | 471 | print("Control mirrored!") 472 | elif (x.startswith(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":r_")): 473 | 474 | mirrorpos = xform(x + "Shape.cv[0:8]", q = True, t = True, ws = True) 475 | 476 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":l_" + x.partition("r_")[2] + "Shape.cv[0]", t = (mirrorpos[21]*-1, mirrorpos[22], mirrorpos[23]), ws = True) 477 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":l_" + x.partition("r_")[2] + "Shape.cv[1]", t = (mirrorpos[18]*-1, mirrorpos[19], mirrorpos[20]), ws = True) 478 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":l_" + x.partition("r_")[2] + "Shape.cv[2]", t = (mirrorpos[15]*-1, mirrorpos[16], mirrorpos[17]), ws = True) 479 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":l_" + x.partition("r_")[2] + "Shape.cv[3]", t = (mirrorpos[12]*-1, mirrorpos[13], mirrorpos[14]), ws = True) 480 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":l_" + x.partition("r_")[2] + "Shape.cv[4]", t = (mirrorpos[9]*-1, mirrorpos[10], mirrorpos[11]), ws = True) 481 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":l_" + x.partition("r_")[2] + "Shape.cv[5]", t = (mirrorpos[6]*-1, mirrorpos[7], mirrorpos[8]), ws = True) 482 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":l_" + x.partition("r_")[2] + "Shape.cv[6]", t = (mirrorpos[3]*-1, mirrorpos[4], mirrorpos[5]), ws = True) 483 | xform(x.partition(namespace_cmb.gui.currentText())[0] + namespace_cmb.gui.currentText() + ":l_" + x.partition("r_")[2] + "Shape.cv[7]", t = (mirrorpos[0]*-1, mirrorpos[1], mirrorpos[2]), ws = True) 484 | 485 | print("Control mirrored!") 486 | else: 487 | om.MGlobal.displayWarning("Selected control has no symmetry") 488 | 489 | def deleteRig(*args): 490 | if not namespace_cmb.gui.currentText(): 491 | om.MGlobal.displayError("Select an existing Namespace!") 492 | return 493 | else: 494 | pass 495 | 496 | for i in ls("*" + namespace_cmb.gui.currentText() + ":rig", r = True): 497 | delete(i) 498 | mel.eval('MLdeleteUnused;') 499 | namespace(rm = namespace_cmb.gui.currentText()) 500 | namespace_list() 501 | 502 | checkGuides() 503 | checkRig() 504 | 505 | import picker 506 | picker.getNamespace_list() 507 | picker.setNamespace() 508 | 509 | print("Rig Deleted!") 510 | 511 | def createPickerGUI(): 512 | setAttr('guides.visibility', 0) 513 | picker_cam = Camera(n = "picker_cam") 514 | #picker_cam.rename("picker_cam") 515 | picker_cam.setOrtho(orthoState = True) 516 | bb = xform(charmodel, q = True, bb = True, ws = True) 517 | viewFit("picker_cam1") 518 | setAttr('picker_camShape1.orthographicWidth', (max(bb)*105)/100) 519 | 520 | lookThru("picker_cam1") 521 | pb = playblast(st = 1, et = 1, fmt = 'image', f = workspace(q = True, rd = True) + "images/" + namespace_cmb.gui.currentText() + "_pb", fp = 0, p = 10, c = 'jpg', qlt = 100, w = 450 * 10, h = 480 * 10, orn = False, v = False) 522 | 523 | group(em = True, n = "guiData") 524 | parent("guiData", namespace_cmb.gui.currentText() + ':rig') 525 | 526 | def createRig(*args): 527 | if not ls("*guides", r = True): 528 | om.MGlobal.displayError("Can't create rig because you deleted the 'guides' object, please return it :(") 529 | return 530 | else: 531 | pass 532 | 533 | if not namespace_cmb.gui.currentText(): 534 | om.MGlobal.displayError("Namespace must not be empty! (Try your character's name)") 535 | return 536 | else: 537 | pass 538 | 539 | if createpickergui_chkbox.gui.isChecked(): 540 | if not ls(sl = True): 541 | om.MGlobal.displayError("Select a character model!") 542 | return 543 | else: 544 | pass 545 | else: 546 | pass 547 | 548 | progresswin.textbox.clear() 549 | 550 | global prognum 551 | prognum = 333 552 | 553 | if not createpickergui_chkbox.gui.isChecked(): 554 | prognum -= 93 555 | else: 556 | pass 557 | 558 | progresswin.setWindowTitle("Awan is creating your rig...") 559 | progresswin.show() 560 | 561 | namespace(add = namespace_cmb.gui.currentText(), f = True) 562 | 563 | getSelection() 564 | 565 | group(n = namespace_cmb.gui.currentText() + ':rig', em = True) 566 | parent(namespace_cmb.gui.currentText() + ':rig', w = True) 567 | if createpickergui_chkbox.gui.isChecked(): 568 | createPickerGUI() 569 | elif not createpickergui_chkbox.gui.isChecked(): 570 | pass 571 | 572 | root_ctrl = MakeNurbCircle(r = 50, n = "root_ctrl") 573 | root_ctrl.setNormalY(1) 574 | root_ctrl.setNormalZ(0) 575 | group('root_ctrl', n = "root_ctrl_offset") 576 | parent('root_ctrl_offset', namespace_cmb.gui.currentText() + ':rig') 577 | 578 | grp_ctrl = MakeNurbCircle(r = 30, n = "grp_ctrl") 579 | grp_ctrl.setNormalY(1) 580 | grp_ctrl.setNormalZ(0) 581 | group('grp_ctrl', n = "grp_ctrl_offset") 582 | xform('grp_ctrl_offset', t = xform("hip_guide", q = True, t = True, ws = True)) 583 | parent('grp_ctrl_offset', 'root_ctrl') 584 | 585 | spine_ctrl = MakeNurbCircle(r = 25, n = "spine_ctrl") 586 | spine_ctrl.setNormalY(1) 587 | spine_ctrl.setNormalZ(0) 588 | group('spine_ctrl', n = "spine_ctrl_offset") 589 | xform('spine_ctrl_offset', t = xform("hip_guide", q = True, t = True, ws = True)) 590 | parent('spine_ctrl_offset', 'grp_ctrl') 591 | 592 | group(n = "l_hand_ctrl", em = True) 593 | group("l_hand_ctrl", n = "l_hand_ctrl_offset") 594 | group(n = "r_hand_ctrl", em = True) 595 | group("r_hand_ctrl", n = "r_hand_ctrl_offset") 596 | 597 | group(em = True, n = "ikpole_ctrl_connector_offset") 598 | parent("ikpole_ctrl_connector_offset", "root_ctrl_offset") 599 | 600 | global prog 601 | prog = 1 602 | 603 | # JOINTS # 604 | 605 | hip.createJoint() 606 | waist.createJoint() 607 | chest.createJoint() 608 | collarbone.createJoint() 609 | 610 | neck.createJoint() 611 | head.createJoint() 612 | jaw.createJoint() 613 | chin.createJoint() 614 | l_eye.createJoint() 615 | r_eye.createJoint() 616 | 617 | 618 | l_clavicle.createJoint() 619 | l_shoulder.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 620 | l_elbow.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 621 | l_wrist.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 622 | r_clavicle.createJoint() 623 | r_shoulder.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 624 | r_elbow.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 625 | r_wrist.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 626 | 627 | l_finger_thumb_metacarpal.createJoint() 628 | l_finger_thumb_proximal.createJoint() 629 | l_finger_thumb_distal.createJoint() 630 | l_finger_thumb_tip.createJoint() 631 | r_finger_thumb_metacarpal.createJoint() 632 | r_finger_thumb_proximal.createJoint() 633 | r_finger_thumb_distal.createJoint() 634 | r_finger_thumb_tip.createJoint() 635 | 636 | l_finger_index_metacarpal.createJoint() 637 | l_finger_index_proximal.createJoint() 638 | l_finger_index_middlep.createJoint() 639 | l_finger_index_distal.createJoint() 640 | l_finger_index_tip.createJoint() 641 | r_finger_index_metacarpal.createJoint() 642 | r_finger_index_proximal.createJoint() 643 | r_finger_index_middlep.createJoint() 644 | r_finger_index_distal.createJoint() 645 | r_finger_index_tip.createJoint() 646 | 647 | l_finger_middlef_metacarpal.createJoint() 648 | l_finger_middlef_proximal.createJoint() 649 | l_finger_middlef_middlep.createJoint() 650 | l_finger_middlef_distal.createJoint() 651 | l_finger_middlef_tip.createJoint() 652 | r_finger_middlef_metacarpal.createJoint() 653 | r_finger_middlef_proximal.createJoint() 654 | r_finger_middlef_middlep.createJoint() 655 | r_finger_middlef_distal.createJoint() 656 | r_finger_middlef_tip.createJoint() 657 | 658 | l_finger_ring_metacarpal.createJoint() 659 | l_finger_ring_proximal.createJoint() 660 | l_finger_ring_middlep.createJoint() 661 | l_finger_ring_distal.createJoint() 662 | l_finger_ring_tip.createJoint() 663 | r_finger_ring_metacarpal.createJoint() 664 | r_finger_ring_proximal.createJoint() 665 | r_finger_ring_middlep.createJoint() 666 | r_finger_ring_distal.createJoint() 667 | r_finger_ring_tip.createJoint() 668 | 669 | l_finger_pinky_metacarpal.createJoint() 670 | l_finger_pinky_proximal.createJoint() 671 | l_finger_pinky_middlep.createJoint() 672 | l_finger_pinky_distal.createJoint() 673 | l_finger_pinky_tip.createJoint() 674 | r_finger_pinky_metacarpal.createJoint() 675 | r_finger_pinky_proximal.createJoint() 676 | r_finger_pinky_middlep.createJoint() 677 | r_finger_pinky_distal.createJoint() 678 | r_finger_pinky_tip.createJoint() 679 | 680 | l_thigh.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 681 | l_knee.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 682 | l_ankle.createJoint(ik = createikctrl_chkbox.gui.isChecked(), rev = True) 683 | l_foot_ball.createJoint(ik = createikctrl_chkbox.gui.isChecked(), rev = True) 684 | l_foot_toes.createJoint(ik = createikctrl_chkbox.gui.isChecked(), rev = True) 685 | l_foot_heel.createJoint(rev = True) 686 | l_foot_inner.createJoint() 687 | l_foot_outer.createJoint() 688 | r_thigh.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 689 | r_knee.createJoint(ik = createikctrl_chkbox.gui.isChecked()) 690 | r_ankle.createJoint(ik = createikctrl_chkbox.gui.isChecked(), rev = True) 691 | r_foot_ball.createJoint(ik = createikctrl_chkbox.gui.isChecked(), rev = True) 692 | r_foot_toes.createJoint(ik = createikctrl_chkbox.gui.isChecked(), rev = True) 693 | r_foot_heel.createJoint(rev = True) 694 | r_foot_inner.createJoint() 695 | r_foot_outer.createJoint() 696 | 697 | #Orient Joint 698 | hip.orientJoint() 699 | waist.orientJoint() 700 | chest.orientJoint() 701 | collarbone.orientJoint() 702 | 703 | neck.orientJoint() 704 | head.orientJoint() 705 | jaw.orientJoint() 706 | chin.orientJoint(oj = False) 707 | l_eye.orientJoint(oj = False) 708 | r_eye.orientJoint(oj = False) 709 | 710 | l_clavicle.orientJoint() 711 | l_shoulder.orientJoint(ik = createikctrl_chkbox.gui.isChecked()) 712 | l_elbow.orientJoint(ik = createikctrl_chkbox.gui.isChecked()) 713 | l_wrist.orientJoint(oj = False, ik = createikctrl_chkbox.gui.isChecked()) 714 | r_clavicle.orientJoint() 715 | r_shoulder.orientJoint(ik = createikctrl_chkbox.gui.isChecked()) 716 | r_elbow.orientJoint(ik = createikctrl_chkbox.gui.isChecked()) 717 | r_wrist.orientJoint(oj = False, ik = createikctrl_chkbox.gui.isChecked()) 718 | 719 | l_finger_thumb_metacarpal.orientJoint() 720 | l_finger_thumb_proximal.orientJoint() 721 | l_finger_thumb_distal.orientJoint() 722 | l_finger_thumb_tip.orientJoint(oj = False) 723 | r_finger_thumb_metacarpal.orientJoint() 724 | r_finger_thumb_proximal.orientJoint() 725 | r_finger_thumb_distal.orientJoint() 726 | r_finger_thumb_tip.orientJoint(oj = False) 727 | 728 | l_finger_index_metacarpal.orientJoint() 729 | l_finger_index_proximal.orientJoint() 730 | l_finger_index_middlep.orientJoint() 731 | l_finger_index_distal.orientJoint() 732 | l_finger_index_tip.orientJoint(oj = False) 733 | r_finger_index_metacarpal.orientJoint() 734 | r_finger_index_proximal.orientJoint() 735 | r_finger_index_middlep.orientJoint() 736 | r_finger_index_distal.orientJoint() 737 | r_finger_index_tip.orientJoint(oj = False) 738 | 739 | l_finger_middlef_metacarpal.orientJoint() 740 | l_finger_middlef_proximal.orientJoint() 741 | l_finger_middlef_middlep.orientJoint() 742 | l_finger_middlef_distal.orientJoint() 743 | l_finger_middlef_tip.orientJoint(oj = False) 744 | r_finger_middlef_metacarpal.orientJoint() 745 | r_finger_middlef_proximal.orientJoint() 746 | r_finger_middlef_middlep.orientJoint() 747 | r_finger_middlef_distal.orientJoint() 748 | r_finger_middlef_tip.orientJoint(oj = False) 749 | 750 | l_finger_ring_metacarpal.orientJoint() 751 | l_finger_ring_proximal.orientJoint() 752 | l_finger_ring_middlep.orientJoint() 753 | l_finger_ring_distal.orientJoint() 754 | l_finger_ring_tip.orientJoint(oj = False) 755 | r_finger_ring_metacarpal.orientJoint() 756 | r_finger_ring_proximal.orientJoint() 757 | r_finger_ring_middlep.orientJoint() 758 | r_finger_ring_distal.orientJoint() 759 | r_finger_ring_tip.orientJoint(oj = False) 760 | 761 | l_finger_pinky_metacarpal.orientJoint() 762 | l_finger_pinky_proximal.orientJoint() 763 | l_finger_pinky_middlep.orientJoint() 764 | l_finger_pinky_distal.orientJoint() 765 | l_finger_pinky_tip.orientJoint(oj = False) 766 | r_finger_pinky_metacarpal.orientJoint() 767 | r_finger_pinky_proximal.orientJoint() 768 | r_finger_pinky_middlep.orientJoint() 769 | r_finger_pinky_distal.orientJoint() 770 | r_finger_pinky_tip.orientJoint(oj = False) 771 | 772 | l_thigh.orientJoint(ik = createikctrl_chkbox.gui.isChecked()) 773 | l_knee.orientJoint(ik = createikctrl_chkbox.gui.isChecked()) 774 | l_ankle.orientJoint(oj = False, ik = createikctrl_chkbox.gui.isChecked()) 775 | l_foot_ball.orientJoint() 776 | l_foot_toes.orientJoint(oj = False) 777 | #l_foot_heel.orientJoint() 778 | #l_foot_inner.orientJoint() 779 | #l_foot_outer.orientJoint() 780 | r_thigh.orientJoint(ik = createikctrl_chkbox.gui.isChecked()) 781 | r_knee.orientJoint(ik = createikctrl_chkbox.gui.isChecked()) 782 | r_ankle.orientJoint(oj = False, ik = createikctrl_chkbox.gui.isChecked()) 783 | r_foot_ball.orientJoint() 784 | r_foot_toes.orientJoint(oj = False) 785 | #r_foot_heel.orientJoint() 786 | #r_foot_inner.orientJoint() 787 | #r_foot_outer.orientJoint() 788 | 789 | if createikctrl_chkbox.gui.isChecked(): 790 | #IK FK SYSTEMS 791 | 792 | group('l_thigh_ik', 'l_thigh_fk', n = 'l_leg_ik_fk') 793 | group('l_shoulder_ik', 'l_shoulder_fk', n = 'l_arm_ik_fk') 794 | 795 | group('r_thigh_ik', 'r_thigh_fk', n = 'r_leg_ik_fk') 796 | group('r_shoulder_ik', 'r_shoulder_fk', n = 'r_arm_ik_fk') 797 | 798 | group('l_leg_ik_fk', 'l_arm_ik_fk', 'r_leg_ik_fk', 'r_arm_ik_fk', n = 'ik_fk_joints') 799 | parent('ik_fk_joints', 'root_ctrl') 800 | elif not createikctrl_chkbox.gui.isChecked(): 801 | pass 802 | 803 | # CONTROLLERS # 804 | 805 | hip.createControl(r = 25) 806 | waist.createControl(r = 20) 807 | chest.createControl(r = 20) 808 | collarbone.createControl(r = 10) 809 | 810 | neck.createControl(r = 10) 811 | head.createControl(r = 15, nr = 'z') 812 | jaw.createControl(r = 2) 813 | #chin.createControl(r = 2) 814 | l_eye.createControl(r = 2) 815 | r_eye.createControl(r = 2) 816 | 817 | l_clavicle.createControl(r = 5) 818 | l_shoulder.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 819 | l_elbow.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 820 | l_wrist.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 821 | r_clavicle.createControl(r = 5) 822 | r_shoulder.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 823 | r_elbow.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 824 | r_wrist.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 825 | 826 | if createikctrl_chkbox.gui.isChecked(): 827 | l_arm.createIKControl(sj = 'l_shoulder', ee = 'l_wrist', mj = 'l_elbow') 828 | r_arm.createIKControl(sj = 'r_shoulder', ee = 'r_wrist', mj = 'r_elbow') 829 | elif not createikctrl_chkbox.gui.isChecked(): 830 | pass 831 | 832 | l_finger_thumb_metacarpal.createControl(r = 1) 833 | l_finger_thumb_proximal.createControl() 834 | l_finger_thumb_distal.createControl() 835 | l_finger_thumb_tip.createControl() 836 | r_finger_thumb_metacarpal.createControl(r = 1) 837 | r_finger_thumb_proximal.createControl() 838 | r_finger_thumb_distal.createControl() 839 | r_finger_thumb_tip.createControl() 840 | 841 | l_finger_index_metacarpal.createControl(r = 1) 842 | l_finger_index_proximal.createControl() 843 | l_finger_index_middlep.createControl() 844 | l_finger_index_distal.createControl() 845 | l_finger_index_tip.createControl() 846 | r_finger_index_metacarpal.createControl(r = 1) 847 | r_finger_index_proximal.createControl() 848 | r_finger_index_middlep.createControl() 849 | r_finger_index_distal.createControl() 850 | r_finger_index_tip.createControl() 851 | 852 | l_finger_middlef_metacarpal.createControl(r = 1) 853 | l_finger_middlef_proximal.createControl() 854 | l_finger_middlef_middlep.createControl() 855 | l_finger_middlef_distal.createControl() 856 | l_finger_middlef_tip.createControl() 857 | r_finger_middlef_metacarpal.createControl(r = 1) 858 | r_finger_middlef_proximal.createControl() 859 | r_finger_middlef_middlep.createControl() 860 | r_finger_middlef_distal.createControl() 861 | r_finger_middlef_tip.createControl() 862 | 863 | l_finger_ring_metacarpal.createControl(r = 1) 864 | l_finger_ring_proximal.createControl() 865 | l_finger_ring_middlep.createControl() 866 | l_finger_ring_distal.createControl() 867 | l_finger_ring_tip.createControl() 868 | r_finger_ring_metacarpal.createControl(r = 1) 869 | r_finger_ring_proximal.createControl() 870 | r_finger_ring_middlep.createControl() 871 | r_finger_ring_distal.createControl() 872 | r_finger_ring_tip.createControl() 873 | 874 | l_finger_pinky_metacarpal.createControl(r = 1) 875 | l_finger_pinky_proximal.createControl() 876 | l_finger_pinky_middlep.createControl() 877 | l_finger_pinky_distal.createControl() 878 | l_finger_pinky_tip.createControl() 879 | r_finger_pinky_metacarpal.createControl(r = 1) 880 | r_finger_pinky_proximal.createControl() 881 | r_finger_pinky_middlep.createControl() 882 | r_finger_pinky_distal.createControl() 883 | r_finger_pinky_tip.createControl() 884 | 885 | l_thigh.createControl(r = 15, fk = createikctrl_chkbox.gui.isChecked()) 886 | l_knee.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 887 | l_ankle.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 888 | l_foot_ball.createControl(r = 5) 889 | l_foot_toes.createControl(r = 5) 890 | #l_foot_heel.createControl() 891 | #l_foot_inner.createControl() 892 | #l_foot_outer.createControl() 893 | r_thigh.createControl(r = 15, fk = createikctrl_chkbox.gui.isChecked()) 894 | r_knee.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 895 | r_ankle.createControl(r = 10, fk = createikctrl_chkbox.gui.isChecked()) 896 | r_foot_ball.createControl(r = 5) 897 | r_foot_toes.createControl(r = 5) 898 | #r_foot_heel.createControl() 899 | #r_foot_inner.createControl() 900 | #r_foot_outer.createControl() 901 | 902 | if createikctrl_chkbox.gui.isChecked(): 903 | l_leg.createIKControl(sj = 'l_thigh', ee = 'l_ankle', mj = 'l_knee') 904 | r_leg.createIKControl(sj = 'r_thigh', ee = 'r_ankle', mj = 'r_knee') 905 | elif not createikctrl_chkbox.gui.isChecked(): 906 | pass 907 | 908 | if createrevctrl_chkbox.gui.isChecked(): 909 | l_foot.createReverseControl(sj = 'l_ankle', ee = 'l_foot_toes', mj = 'l_foot_ball', bj = 'l_foot_heel') 910 | r_foot.createReverseControl(sj = 'r_ankle', ee = 'r_foot_toes', mj = 'r_foot_ball', bj = 'r_foot_heel') 911 | elif not createrevctrl_chkbox.gui.isChecked(): 912 | pass 913 | 914 | editControlShape() 915 | 916 | parent("l_clavicle_ctrl_offset", 'collarbone_ctrl') 917 | parent("r_clavicle_ctrl_offset", 'collarbone_ctrl') 918 | 919 | if createikctrl_chkbox.gui.isChecked(): 920 | #IK FK SYSTEMS 921 | 922 | parentConstraint('hip_ctrl', 'l_leg_ik_fk', mo = True) 923 | parentConstraint('l_clavicle_ctrl', 'l_arm_ik_fk', mo = True) 924 | 925 | parentConstraint('hip_ctrl', 'r_leg_ik_fk', mo = True) 926 | parentConstraint('r_clavicle_ctrl', 'r_arm_ik_fk', mo = True) 927 | elif not createikctrl_chkbox.gui.isChecked(): 928 | pass 929 | 930 | #lock and hide attributes 931 | 932 | offsetAttr = ['tx','ty','tz','rx','ry','rz','sx','sy','sz'] 933 | offsetGroup = ls('*_offset') 934 | 935 | for i in offsetGroup: 936 | for j in offsetAttr: 937 | setAttr(i + '.' + j, l = True, k = False, cb = False) 938 | 939 | if createikctrl_chkbox.gui.isChecked(): 940 | ikfkswitch = ls('*ikfk_switch_ctrl') 941 | 942 | for i in ikfkswitch: 943 | for j in offsetAttr: 944 | setAttr(i + '.' + j, l = True, k = False, cb = False) 945 | elif not createikctrl_chkbox.gui.isChecked(): 946 | pass 947 | 948 | #colour overrides 949 | 950 | all_ctrl = ls('*ctrl') 951 | all_l_ctrl = ls('l_*ctrl') 952 | all_r_ctrl = ls('r_*ctrl') 953 | 954 | for i in all_ctrl: 955 | setAttr(i + ".overrideEnabled", 1) 956 | setAttr(i + ".overrideColor", 17) 957 | 958 | for i in all_l_ctrl: 959 | setAttr(i + ".overrideColor", 14) 960 | 961 | for i in all_r_ctrl: 962 | setAttr(i + ".overrideColor", 13) 963 | 964 | setAttr("grp_ctrl.overrideColor", 18) 965 | setAttr("root_ctrl.overrideColor", 18) 966 | 967 | all_joint = ls(type = 'joint') 968 | 969 | for i in all_joint: 970 | setAttr(i + ".overrideEnabled", 1) 971 | setAttr(i + ".overrideColor", 0) 972 | 973 | #Delete All Non Deformer History 974 | bakePartialHistory(all = True) 975 | 976 | #Hide Guides 977 | setAttr('guides.visibility', 0) 978 | 979 | if createpickergui_chkbox.gui.isChecked(): 980 | #GUI Data 981 | addAttr("guiData", ln = "name", type = "string") 982 | setAttr("guiData.name", namespace_cmb.gui.currentText(), type = "string") 983 | 984 | addAttr("guiData", ln = "isIK", type = "bool") 985 | setAttr("guiData.isIK", createikctrl_chkbox.gui.isChecked()) 986 | 987 | allCtrl = ls("*_ctrl") 988 | for i in allCtrl: 989 | addAttr("guiData", ln = i + "_guiDataX") 990 | addAttr("guiData", ln = i + "_guiDataY") 991 | setAttr("guiData." + i + "_guiDataX", worldToScreen(xform(i, q = True, t = True, ws = True))[0]) 992 | setAttr("guiData." + i + "_guiDataY", worldToScreen(xform(i, q = True, t = True, ws = True))[1]) 993 | 994 | progress_msg = "Creating Picker GUI... (" + progressNum(prognum) + "%) " + i 995 | print(progress_msg) 996 | progresswin.textbox.append(progress_msg) 997 | QApplication.processEvents() 998 | 999 | elif not createpickergui_chkbox.gui.isChecked(): 1000 | pass 1001 | 1002 | #Set Namespace 1003 | rigRelatives = listRelatives(namespace_cmb.gui.currentText() + ':rig', ad = True) 1004 | for x in rigRelatives: 1005 | rename(x, namespace_cmb.gui.currentText() + ":" + x) 1006 | 1007 | switches = ls("*switch") 1008 | for x in switches: 1009 | rename(x, namespace_cmb.gui.currentText() + ":" + x) 1010 | 1011 | conditions = ls("*condition") 1012 | for x in conditions: 1013 | rename(x, namespace_cmb.gui.currentText() + ":" + x) 1014 | 1015 | pma = ls("*pma") 1016 | for x in pma: 1017 | rename(x, namespace_cmb.gui.currentText() + ":" + x) 1018 | 1019 | multi = ls("*multi") 1020 | for x in multi: 1021 | rename(x, namespace_cmb.gui.currentText() + ":" + x) 1022 | 1023 | namespace_list() 1024 | 1025 | if createpickergui_chkbox.gui.isChecked(): 1026 | #Delete Playblast Camera 1027 | delete("picker_cam1") 1028 | elif not createpickergui_chkbox.gui.isChecked(): 1029 | pass 1030 | 1031 | checkGuides() 1032 | checkRig() 1033 | 1034 | import picker 1035 | picker.getNamespace_list() 1036 | picker.setNamespace() 1037 | 1038 | print("Rig Created!") 1039 | progresswin.textbox.append("Rig Created!") 1040 | 1041 | def progressNum(max): 1042 | global prog 1043 | prog+=1 1044 | return str(int((prog/max)*100)) 1045 | 1046 | def worldToScreen(point): 1047 | defaultAspectRatio = getAttr('defaultResolution.deviceAspectRatio') 1048 | 1049 | setAttr('defaultResolution.deviceAspectRatio', 0.8393) 1050 | 1051 | sel = om.MSelectionList() 1052 | dag = om.MDagPath() 1053 | 1054 | sel.add("picker_cam1") 1055 | sel.getDagPath(0,dag) 1056 | 1057 | cam = om.MFnCamera(dag) 1058 | floatMat = cam.projectionMatrix() 1059 | projMat = om.MMatrix(floatMat.matrix) 1060 | floatMat = cam.postProjectionMatrix() 1061 | postProjMat = om.MMatrix(floatMat.matrix) 1062 | transMat = dag.inclusiveMatrix() 1063 | 1064 | point = om.MPoint(point[0], point[1], point[2]) 1065 | 1066 | fullMat = transMat.inverse() * projMat * postProjMat 1067 | nuPoint = point * fullMat 1068 | screenPoint = [(nuPoint[0]/nuPoint[3]/2+0.5)*470, (1-(nuPoint[1]/nuPoint[3]/2+0.5))*560] 1069 | 1070 | setAttr('defaultResolution.deviceAspectRatio', defaultAspectRatio) 1071 | 1072 | return screenPoint 1073 | 1074 | def editControlShape(): 1075 | #Eye_LookAt 1076 | xform('l_eye_ctrl', t = (0, 15, 0), r = True) 1077 | xform('r_eye_ctrl', t = (0, 15, 0), r = True) 1078 | 1079 | eyesLookAt_ctrl = MakeNurbCircle(r = 3, n = "eyesLookAt_ctrl") 1080 | eyesLookAt_ctrl.setNormalY(1) 1081 | eyesLookAt_ctrl.setNormalZ(0) 1082 | group('eyesLookAt_ctrl', n = "eyesLookAt_ctrl_offset") 1083 | xform("eyesLookAt_ctrl_offset", t = (0, (xform('l_eye_ctrl', q = True, t = True, ws = True))[1], (xform('l_eye_ctrl', q = True, t = True, ws = True))[2]), ro = xform('l_eye_ctrl_offset', q = True, ro = True, ws = True), ws = True) 1084 | xform('eyesLookAt_ctrlShape.cv[0:8]', s = (3, 1, 2), r = True) 1085 | 1086 | parent('l_eye_ctrl_offset', 'eyesLookAt_ctrl') 1087 | parent('r_eye_ctrl_offset', 'eyesLookAt_ctrl') 1088 | parent('eyesLookAt_ctrl_offset', 'grp_ctrl') 1089 | 1090 | #Neck 1091 | xform('neck_ctrl.rotatePivot', t = xform('neck_guide', q = True, t = True, ws = True), ws = True) 1092 | 1093 | #Collarbone 1094 | xform('collarbone_ctrlShape.cv[0:8]', s = (2, 1, 1), r = True) 1095 | xform('collarbone_ctrlShape.cv[1]', t = (0, -20, 0), r = True) 1096 | xform('collarbone_ctrlShape.cv[5]', t = (0, -20, 0), r = True) 1097 | 1098 | #L_Clavicle 1099 | xform('l_clavicle_ctrlShape.cv[0:8]', s = (1, 1, 0.5), r = True) 1100 | xform('l_clavicle_ctrl.rotatePivot', t = xform('l_clavicle_guide', q = True, t = True, ws = True), ws = True) 1101 | 1102 | #R_Clavicle 1103 | xform('r_clavicle_ctrlShape.cv[0:8]', s = (1, 1, 0.5), r = True) 1104 | xform('r_clavicle_ctrl.rotatePivot', t = xform('r_clavicle_guide', q = True, t = True, ws = True), ws = True) 1105 | 1106 | #Hip 1107 | l_thigh_pos = xform("l_thigh_guide", q = True, t = True, ws = True) 1108 | r_thigh_pos = xform("r_thigh_guide", q = True, t = True, ws = True) 1109 | l_knee_pos = xform("l_knee_guide", q = True, t = True, ws = True) 1110 | r_knee_pos = xform("r_knee_guide", q = True, t = True, ws = True) 1111 | 1112 | xform('hip_ctrl.ep[0]', t = (0, -6, 0), r = True) 1113 | xform('hip_ctrl.ep[4]', t = (0, -6, 0), r = True) 1114 | xform('hip_ctrl.ep[5:7]', t = (0, 2, 0), r = True) 1115 | xform('hip_ctrl.ep[1:3]', t = (0, 2, 0), r = True) 1116 | xform('hip_ctrl.ep[6]', t = (0, 3.5, 0), r = True) 1117 | xform('hip_ctrl.ep[2]', t = (0, 3.5, 0), r = True) 1118 | xform('hip_ctrl.ep[0:8]', t = (0, (((l_thigh_pos[1] - l_knee_pos[1]) / 4) * -1), 0), s = (1, 1, 0.8), r = True) 1119 | 1120 | def getSelection(): 1121 | global charmodel 1122 | charmodel = ls(sl = True) 1123 | 1124 | #BUTTONS 1125 | 1126 | guides_btn = UI(label = "Create Guides") 1127 | 1128 | mirrorguides_btn = UI(label = "Mirror Guides") 1129 | deleteguides_btn = UI(label = "Delete Guides") 1130 | 1131 | settings_frame = FrameLayout("Settings", window) 1132 | 1133 | deleterig_btn = UI(label = "Delete Rig") 1134 | 1135 | componentmode_btn = UI(label = "Component Mode") 1136 | mirrorctrl_btn = UI(label = "Mirror Control Shape") 1137 | 1138 | namespace_cmb = UI() 1139 | namespace_lbl = UI(label = "Namespace :") 1140 | 1141 | createikctrl_chkbox = UI(label = "Create IK Control") 1142 | createrevctrl_chkbox = UI(label = "Create Reverse Foot Control") 1143 | createpickergui_chkbox = UI(label = "Create Picker GUI") 1144 | 1145 | autorig_btn = UI(label = "Awto Rig!") 1146 | 1147 | guides_btn.drawButton(createGuides).setLayout(guidecreate_layout) 1148 | 1149 | window.addLayout(guide_layout) 1150 | guide_layout.addLayout(guidecreate_layout) 1151 | guide_layout.addLayout(guideedit_layout) 1152 | mirrorguides_btn.drawButton(mirrorGuides).setLayout(guideedit_layout) 1153 | deleteguides_btn.drawButton(deleteGuides).setLayout(guideedit_layout) 1154 | 1155 | autorig_btn.drawButton(createRig, height = 50) 1156 | 1157 | window.layout.addWidget(settings_frame) 1158 | settings_frame.setLayout(settings_layout) 1159 | settings_layout.addLayout(namespace_layout) 1160 | 1161 | window.addLayout(namespace_layout) 1162 | namespace_lbl.drawTextLabel().setLayout(namespace_layout) 1163 | namespace_cmb.drawComboBox().setLayout(namespace_layout) 1164 | 1165 | createikctrl_chkbox.drawCheckBox().setLayout(settings_layout) 1166 | createrevctrl_chkbox.drawCheckBox().setLayout(settings_layout) 1167 | createpickergui_chkbox.drawCheckBox().setLayout(settings_layout) 1168 | 1169 | def ikrevchkbox(): 1170 | if createikctrl_chkbox.gui.isChecked(): 1171 | createrevctrl_chkbox.gui.setChecked(True) 1172 | createrevctrl_chkbox.gui.setEnabled(True) 1173 | elif not createikctrl_chkbox.gui.isChecked(): 1174 | createrevctrl_chkbox.gui.setChecked(False) 1175 | createrevctrl_chkbox.gui.setEnabled(False) 1176 | 1177 | createikctrl_chkbox.gui.clicked.connect(ikrevchkbox) 1178 | 1179 | componentmode_btn.drawToggleButton(componentMode).setLayout(settings_layout) 1180 | mirrorctrl_btn.drawButton(mirrorControl).setLayout(settings_layout) 1181 | 1182 | deleterig_btn.drawButton(deleteRig).setLayout(settings_layout) 1183 | 1184 | window.layout.addStretch() 1185 | 1186 | checkGuides() 1187 | checkRig() 1188 | 1189 | def namespace_list(): 1190 | namespace_cmb.gui.clear() 1191 | nsinfo = namespaceInfo(lon = True, r = True) 1192 | for i in nsinfo: 1193 | if(i != "UI" and i != "shared"): 1194 | namespace_cmb.gui.addItem(i) 1195 | else: 1196 | pass 1197 | 1198 | namespace_list() 1199 | 1200 | # RIG # 1201 | 1202 | class Rig: 1203 | 1204 | def __init__(self, name, t = (0, 0, 0), p = ""): 1205 | self.name = name 1206 | self.translate = t 1207 | self.parent = p 1208 | 1209 | def createGuide(self, s = 1): 1210 | self.locator = spaceLocator(n = self.name + "_guide") 1211 | self.locator.setTranslation(self.translate) 1212 | self.locator.setScale([s, s, s]) 1213 | if (self.parent != ""): 1214 | self.locator.setParent(self.parent + "_guide") 1215 | 1216 | self.guide_curve = NurbsCurve(p = [xform(self.name + "_guide", q = True, t = True, ws = True), xform(self.parent + "_guide", q = True, t = True, ws = True)], d = 1, n = self.name + "_guide_connector") 1217 | cluster(self.name + "_guide_connector.cv[0]", n = self.name + "_guide_cluster") 1218 | cluster(self.name + "_guide_connector.cv[1]", n = self.name + "_guide_parent_cluster") 1219 | parent(self.name + "_guide_connector", "guides") 1220 | parent(self.name + "_guide_clusterHandle", self.name + "_guide") 1221 | parent(self.name + "_guide_parent_clusterHandle", self.parent + "_guide") 1222 | setAttr(self.name + "_guide_connector.overrideEnabled", 1) 1223 | setAttr(self.name + "_guide_connector.overrideDisplayType", 2) 1224 | setAttr(self.name + "_guide_clusterHandleShape.visibility", 0) 1225 | setAttr(self.name + "_guide_parent_clusterHandleShape.visibility", 0) 1226 | else: 1227 | self.locator.setParent("guides") 1228 | 1229 | progress_msg = "Creating Guides... (" + progressNum(83) + "%) " + self.name + "_guide" 1230 | print(progress_msg) 1231 | progresswin.textbox.append(progress_msg) 1232 | QApplication.processEvents() 1233 | 1234 | def createJoint(self, ik = False, rev = False): 1235 | self.joint_pos = xform(self.name + "_guide", q = True, t = True, ws = True) 1236 | self.joint = Joint(n = self.name, radius = 1, p = self.joint_pos) 1237 | if (self.name.endswith("_foot_heel") or self.name.endswith("_foot_inner") or self.name.endswith("_foot_outer")): 1238 | delete(self.name) 1239 | elif(self.parent != ""): 1240 | self.joint.setParent(self.parent) 1241 | else: 1242 | self.joint.setParent("root_ctrl") 1243 | 1244 | if ik: 1245 | self.jointIK = Joint(n = self.name + "_ik", radius = 1, p = self.joint_pos) 1246 | self.jointFK = Joint(n = self.name + "_fk", radius = 1, p = self.joint_pos) 1247 | if(self.parent == "l_clavicle" or self.parent == "r_clavicle" or self.parent == "hip"): 1248 | self.jointIK.setParent(self.parent) 1249 | self.jointFK.setParent(self.parent) 1250 | else: 1251 | self.jointIK.setParent(self.parent + "_ik") 1252 | self.jointFK.setParent(self.parent + "_fk") 1253 | elif not ik: 1254 | pass 1255 | 1256 | if rev: 1257 | self.jointrev = Joint(radius = 1, p = self.joint_pos, n = self.name + "_rev") 1258 | if (self.name == "l_ankle" or self.name == "r_ankle"): 1259 | self.jointrev.setParent(self.parent) 1260 | else: 1261 | self.jointrev.setParent(self.parent + "_rev") 1262 | elif not rev: 1263 | pass 1264 | 1265 | hide (ls ('*_ik', type = 'joint')) 1266 | hide (ls ('*_fk', type = 'joint')) 1267 | hide (ls ('*_rev', type = 'joint')) 1268 | 1269 | progress_msg = "Creating Joints... (" + progressNum(prognum) + "%) " + self.name 1270 | print(progress_msg) 1271 | progresswin.textbox.append(progress_msg) 1272 | QApplication.processEvents() 1273 | 1274 | return self 1275 | 1276 | def orientJoint(self, oj = True, ik = False): 1277 | if oj: 1278 | self.joint.orientJoint('yzx', sao = 'zup') 1279 | if ik: 1280 | self.jointIK.orientJoint('yzx', sao = 'zup') 1281 | self.jointFK.orientJoint('yzx', sao = 'zup') 1282 | 1283 | parentConstraint(self.jointIK, self.joint, mo = False) 1284 | parentConstraint(self.jointFK, self.joint, mo = False) 1285 | elif not ik: 1286 | pass 1287 | elif not oj: 1288 | self.joint.orientJoint('none') 1289 | if ik: 1290 | self.jointIK.orientJoint('none') 1291 | self.jointFK.orientJoint('none') 1292 | 1293 | parentConstraint(self.jointIK, self.joint, mo = False) 1294 | parentConstraint(self.jointFK, self.joint, mo = False) 1295 | elif not ik: 1296 | pass 1297 | 1298 | progress_msg = "Creating Joints... (" + progressNum(prognum) + "%) " + self.name 1299 | print(progress_msg) 1300 | progresswin.textbox.append(progress_msg) 1301 | QApplication.processEvents() 1302 | 1303 | def createControl(self, r = 2, nr = "Y", fk = False): 1304 | if fk: 1305 | self.ctrl = MakeNurbCircle(r = r, n = self.name + "_fk_ctrl") 1306 | elif not fk: 1307 | self.ctrl = MakeNurbCircle(r = r, n = self.name + "_ctrl") 1308 | 1309 | #Set the circle plane normal 1310 | if(nr == "X" or nr == "x"): 1311 | self.ctrl.setNormalX(1) 1312 | self.ctrl.setNormalZ(0) 1313 | elif(nr == "Y" or nr == "y"): 1314 | self.ctrl.setNormalY(1) 1315 | self.ctrl.setNormalZ(0) 1316 | elif(nr == "Z" or nr == "z"): 1317 | self.ctrl.setNormalZ(1) 1318 | 1319 | #Create control offset for each control 1320 | if fk: 1321 | self.ctrl_offset = group(em = True, n = self.name + "_fk_ctrl_offset") 1322 | parent(self.name + "_fk_ctrl", self.name + "_fk_ctrl_offset") 1323 | elif not fk: 1324 | self.ctrl_offset = group(em = True, n = self.name + "_ctrl_offset") 1325 | parent(self.name + "_ctrl", self.name + "_ctrl_offset") 1326 | 1327 | if(self.name == "collarbone"): 1328 | xform(self.ctrl_offset, t = xform("neck_guide", q = True, t = True, ws = True), ro = xform("neck", q = True, ro = True, ws = True)) 1329 | elif(self.name == "neck"): 1330 | self.neck_pos = xform("neck_guide", q = True, t = True, ws = True) 1331 | self.head_pos = xform("head_guide", q = True, t = True, ws = True) 1332 | xform(self.ctrl_offset, t = ((self.neck_pos[0], (self.neck_pos[1] + self.head_pos[1])/2, self.neck_pos[2])), ro = xform(self.name, q = True, ro = True, ws = True)) 1333 | elif(self.name.endswith("_clavicle")): 1334 | self.clavicle_pos = xform(self.name + "_guide", q = True, t = True, ws = True) 1335 | self.clavicle_rot = xform(self.name + "_guide", q = True, ro = True, ws = True) 1336 | if(self.name.startswith("l_")): 1337 | self.shoulder_pos = xform("l_shoulder_guide", q = True, t = True, ws = True) 1338 | elif(self.name.startswith("r_")): 1339 | self.shoulder_pos = xform("r_shoulder_guide", q = True, t = True, ws = True) 1340 | xform(self.name + "_ctrl_offset", t = ((self.clavicle_pos[0] + self.shoulder_pos[0])/2, ((self.clavicle_pos[1] + self.shoulder_pos[1])/2) + 5, (self.clavicle_pos[2] + self.shoulder_pos[2])/2), ro = self.clavicle_rot, ws = True) 1341 | elif(self.name == "jaw"): 1342 | xform(self.ctrl_offset, t = xform("chin_guide", q = True, t = True, ws = True), ro = xform("chin", q = True, ro = True, ws = True)) 1343 | xform(self.name + "_ctrl.rotatePivot", t = xform("jaw_guide", q = True, t = True, ws = True), a = True, ws = True) 1344 | else: 1345 | xform(self.ctrl_offset, t = xform(self.name + "_guide", q = True, t = True, ws = True), ro = xform(self.name, q = True, ro = True, ws = True)) 1346 | 1347 | if fk: 1348 | if (self.parent.endswith("_clavicle") or self.parent == "hip"): 1349 | parent(self.name + "_fk_ctrl_offset", self.parent + "_ctrl") 1350 | else: 1351 | parent(self.name + "_fk_ctrl_offset", self.parent + "_fk_ctrl") 1352 | elif not fk: 1353 | if (self.parent.endswith("_wrist")): 1354 | if(self.name.startswith("l_")): 1355 | parent('l_hand_ctrl_offset', 'grp_ctrl') 1356 | parent(self.name + "_ctrl_offset", "l_hand_ctrl") 1357 | parentConstraint(self.parent, 'l_hand_ctrl', mo = True) 1358 | elif(self.name.startswith("r_")): 1359 | parent('r_hand_ctrl_offset', 'grp_ctrl') 1360 | parent(self.name + "_ctrl_offset", "r_hand_ctrl") 1361 | parentConstraint(self.parent, 'r_hand_ctrl', mo = True) 1362 | elif (self.parent.endswith("_ankle")): 1363 | parent(self.name + "_ctrl_offset", "grp_ctrl") 1364 | parentConstraint(self.parent, self.name + "_ctrl_offset", mo = True) 1365 | elif (self.name == "hip" or self.name == "waist"): 1366 | parent(self.name + "_ctrl_offset", "spine_ctrl") 1367 | elif (self.parent != ""): 1368 | parent(self.name + "_ctrl_offset", self.parent + "_ctrl") 1369 | else: 1370 | parent(self.name + "_ctrl_offset", "grp_ctrl") 1371 | 1372 | #Parent Constraint 1373 | if fk: 1374 | parentConstraint(self.name + "_fk_ctrl", self.name + "_fk", mo = False) 1375 | elif not fk: 1376 | if(self.name == "collarbone" or self.name.endswith("_clavicle")): 1377 | pass 1378 | elif(self.name == "jaw"): 1379 | parentConstraint(self.name + "_ctrl", self.name, mo = True) 1380 | elif(self.name.endswith("_eye")): 1381 | aimConstraint(self.name + "_ctrl", self.name, aim = (0, 1, 0), u = (0, 0, 1) , mo = True) 1382 | else: 1383 | parentConstraint(self.name + "_ctrl", self.name, mo = False) 1384 | 1385 | progress_msg = "Creating Controllers... (" + progressNum(prognum) + "%) " + self.name + "_ctrl" 1386 | print(progress_msg) 1387 | progresswin.textbox.append(progress_msg) 1388 | QApplication.processEvents() 1389 | 1390 | def createIKControl(self, sj, ee, mj, rev = False): 1391 | #Get start joint and end effector position and rotation 1392 | self.sj_pos = xform(sj, q = True, t = True, ws = True) 1393 | self.ee_pos = xform(ee, q = True, t = True, ws = True) 1394 | self.ee_rot = xform(mj, q = True, ro = True, ws = True) 1395 | #Create IK Control Circle 1396 | self.IKctrl = MakeNurbCircle(r = 10, n = self.name + "_ik_ctrl") 1397 | self.IKctrl_offset = group(n = self.name + "_ik_ctrl_offset", em = True) 1398 | self.IKctrl.setNormalY(1) 1399 | self.IKctrl.setNormalZ(0) 1400 | parent(self.name + "_ik_ctrl", self.name + "_ik_ctrl_offset") 1401 | xform(self.name + "_ik_ctrl_offset", t = self.ee_pos, ro = self.ee_rot, ws = True) 1402 | parent(self.name + "_ik_ctrl_offset", "grp_ctrl") 1403 | orientConstraint(self.name + "_ik_ctrl", ee + "_ik") 1404 | #Create IK Handle 1405 | self.ikhandle = ikHandle(n = self.name + "_ikHandle", sj = sj + "_ik", ee = ee + "_ik") 1406 | parent(self.name + "_ikHandle", self.name + "_ik_ctrl") 1407 | #Create IK Pole 1408 | self.ikpole = MakeNurbSphere(r = 3, n = self.name + "_ikpole_ctrl") 1409 | rename('makeNurbSphere1', self.name + "_ikpole_ctrlInput") 1410 | setAttr(self.name + '_ikpole_ctrlInput.sections', 4) 1411 | setAttr(self.name + '_ikpole_ctrlInput.spans', 2) 1412 | setAttr(self.name + '_ikpole_ctrl.overrideEnabled', 1) 1413 | setAttr(self.name + '_ikpole_ctrl.overrideShading', 0) 1414 | setAttr(self.name + '_ikpole_ctrl.overrideTexturing', 0) 1415 | setAttr(self.name + '_ikpole_ctrl.overridePlayback', 0) 1416 | 1417 | self.ikpole_offset = group(n = self.name + "_ikpole_ctrl_offset", em = True) 1418 | parent(self.name + "_ikpole_ctrl", self.name + "_ikpole_ctrl_offset") 1419 | xform(self.name + "_ikpole_ctrl_offset", t = xform(mj, q = True, t = True, ws = True), ws = True) 1420 | if(self.name == "l_arm" or self.name == "r_arm"): 1421 | move(0, 0, -30, self.name + "_ikpole_ctrl_offset", ls = True, r = True) 1422 | elif(self.name == "l_leg" or self.name == "r_leg"): 1423 | move(0, 0, 30, self.name + "_ikpole_ctrl_offset", ls = True, r = True) 1424 | makeIdentity(self.name + "_ikpole_ctrl", a = True, t = True) 1425 | parent(self.name + "_ikpole_ctrl_offset", 'grp_ctrl') 1426 | 1427 | poleVectorConstraint(self.name + "_ikpole_ctrl", self.name + "_ikHandle") 1428 | 1429 | curve(p = [xform(mj, q = True, t = True, ws = True), xform(self.name + "_ikpole_ctrl", q = True, t = True, ws = True)], d = 1, ws = True, n = self.name + "_ikpole_ctrl_connector") 1430 | cluster(self.name + '_ikpole_ctrl_connector.cv[0]', n = self.name + "_ikpole_cluster") 1431 | cluster(self.name + '_ikpole_ctrl_connector.cv[1]', n = self.name + "_ikpole_ctrl_cluster") 1432 | parent(self.name + "_ikpole_clusterHandle", mj) 1433 | parent(self.name + "_ikpole_ctrl_clusterHandle", self.name + "_ikpole_ctrl") 1434 | setAttr(self.name + "_ikpole_ctrl_connector.overrideEnabled", 1) 1435 | setAttr(self.name + "_ikpole_ctrl_connector.overrideDisplayType", 2) 1436 | parent(self.name + "_ikpole_ctrl_connector", 'ikpole_ctrl_connector_offset') 1437 | 1438 | setAttr(self.name + "_ikpole_clusterHandle.visibility", 0) 1439 | setAttr(self.name + "_ikpole_ctrl_clusterHandle.visibility", 0) 1440 | 1441 | #IK FK switch 1442 | #Create IK FK switch 1443 | self.ikswitch = MakeNurbPlane(w = 10, d = 1, ax = (0, 0, 1), n = self.name + "_ikfk_switch_ctrl") 1444 | rename('makeNurbPlane1', self.name + "_ikfk_switch_ctrlInput") 1445 | setAttr (self.name + "_ikfk_switch_ctrlInput.width", 10) 1446 | setAttr (self.name + "_ikfk_switch_ctrl.overrideEnabled", 1) 1447 | setAttr(self.name + '_ikfk_switch_ctrl.overrideShading', 0) 1448 | setAttr(self.name + '_ikfk_switch_ctrl.overrideTexturing', 0) 1449 | setAttr(self.name + '_ikfk_switch_ctrl.overridePlayback', 0) 1450 | #Create IK FK switch Text 1451 | self.iktext = textCurves(text = "IK", f = "Lucida Sans Unicode", n = self.name + "_IK_lttr") 1452 | self.fktext = textCurves(text = "FK", f = "Lucida Sans Unicode", n = self.name + "_FK_lttr") 1453 | xform(self.name + "_IK_lttrShape", t = (xform(self.name + "_ikfk_switch_ctrl", q = True, t = True, ws = True)), ws = True, cp = True) 1454 | xform(self.name + "_FK_lttrShape", t = (xform(self.name + "_ikfk_switch_ctrl", q = True, t = True, ws = True)), ws = True, cp = True) 1455 | xform(self.name + "_IK_lttrShape", s = (7, 7, 7)) 1456 | xform(self.name + "_FK_lttrShape", s = (7, 7, 7)) 1457 | setAttr(self.name + "_IK_lttrShape.overrideEnabled", 1) 1458 | setAttr(self.name + "_FK_lttrShape.overrideEnabled", 1) 1459 | setAttr(self.name + "_IK_lttrShape.overrideDisplayType", 2) 1460 | setAttr(self.name + "_FK_lttrShape.overrideDisplayType", 2) 1461 | 1462 | parent(self.name + "_IK_lttrShape", self.name + "_ikfk_switch_ctrl") 1463 | parent(self.name + "_FK_lttrShape", self.name + "_ikfk_switch_ctrl") 1464 | 1465 | #Create ikfk switch offset 1466 | self.ikswitch_offset = group(n = self.name + "_ikfk_switch_ctrl_offset") 1467 | parent(self.name + "_ikfk_switch_ctrl_offset", w = True) 1468 | parent(self.name + "_ikfk_switch_ctrl", self.name + "_ikfk_switch_ctrl_offset") 1469 | xform(self.name + "_ikfk_switch_ctrl_offset", t = (xform(ee, q = True, t = True, ws = True))) 1470 | xform(self.name + "_ikfk_switch_ctrl_offset", t = (0, 10, -20), r = True) 1471 | parent(self.name + "_ikfk_switch_ctrl_offset", 'grp_ctrl') 1472 | pointConstraint(self.parent, self.name + "_ikfk_switch_ctrl_offset", mo = True) 1473 | #Add ik fk switch attribute 1474 | if(self.name == "l_arm" or self.name == "r_arm"): 1475 | addAttr(self.name + "_ikfk_switch_ctrl", ln = "IK_FK_switch", k = True, min = 0, max = 1, dv = 0) 1476 | elif(self.name == "l_leg" or self.name == "r_leg"): 1477 | addAttr(self.name + "_ikfk_switch_ctrl", ln = "IK_FK_switch", k = True, min = 0, max = 1, dv = 1) 1478 | #Connections 1479 | connectAttr(self.name + '_ikfk_switch_ctrl.IK_FK_switch', sj + '_parentConstraint1.' + sj + '_ikW0', f = True) 1480 | connectAttr(self.name + '_ikfk_switch_ctrl.IK_FK_switch', mj + '_parentConstraint1.' + mj + '_ikW0', f = True) 1481 | connectAttr(self.name + '_ikfk_switch_ctrl.IK_FK_switch', ee + '_parentConstraint1.' + ee + '_ikW0', f = True) 1482 | shadingNode('reverse', n = self.name + '_ikfk_switch', au = True) 1483 | connectAttr(self.name + '_ikfk_switch_ctrl.IK_FK_switch', self.name + '_ikfk_switch.inputX', f = True) 1484 | connectAttr(self.name + '_ikfk_switch.outputX', sj + '_parentConstraint1.' + sj + '_fkW1', f = True) 1485 | connectAttr(self.name + '_ikfk_switch.outputX', mj + '_parentConstraint1.' + mj + '_fkW1', f = True) 1486 | connectAttr(self.name + '_ikfk_switch.outputX', ee + '_parentConstraint1.' + ee + '_fkW1', f = True) 1487 | connectAttr(self.name + '_ikfk_switch_ctrl.IK_FK_switch', self.name + '_ikpole_ctrl_offset.visibility', f = True) 1488 | connectAttr(self.name + '_ikfk_switch_ctrl.IK_FK_switch', self.name + '_ik_ctrl_offset.visibility', f = True) 1489 | connectAttr(self.name + '_ikfk_switch_ctrl.IK_FK_switch', self.name + '_ikpole_ctrl_connector.visibility', f = True) 1490 | connectAttr(self.name + '_ikfk_switch_ctrl.IK_FK_switch', self.name + '_IK_lttrShape.visibility', f = True) 1491 | connectAttr(self.name + '_ikfk_switch.outputX', self.name + '_FK_lttrShape.visibility', f = True) 1492 | connectAttr(self.name + '_ikfk_switch.outputX', sj + '_fk_ctrl_offset.visibility', f = True) 1493 | 1494 | progress_msg = "Creating IK Controls... (" + progressNum(prognum) + "%) " + self.name + "_ctrl" 1495 | print(progress_msg) 1496 | progresswin.textbox.append(progress_msg) 1497 | QApplication.processEvents() 1498 | 1499 | def createReverseControl(self, sj, ee, mj, bj): 1500 | parent(sj + "_rev", self.parent + "_ik_ctrl") 1501 | reroot(bj + "_rev") 1502 | 1503 | ikHandle(n = mj + '_ikHandle', sj = sj + '_ik', ee = mj + '_ik', sol = 'ikSCsolver') 1504 | ikHandle(n = ee + '_ikHandle', sj = mj + '_ik', ee = ee + '_ik', sol = 'ikSCsolver') 1505 | parent(mj + '_ikHandle', mj + '_rev') 1506 | parent(ee + '_ikHandle', ee + '_rev') 1507 | parent(self.parent + '_ikHandle', sj + '_rev') 1508 | #parent(bj + '_rev', self.parent + '_ik_ctrl') 1509 | 1510 | group(ee + '_ikHandle', n = self.name + "_toes_tap") 1511 | group(bj + '_rev', n = self.name + '_bank_inner') 1512 | group(self.name + '_bank_inner', n = self.name + '_bank_outer') 1513 | 1514 | inner_pos = xform(self.name + '_inner_guide', q = True, t = True, ws = True) 1515 | outer_pos = xform(self.name + '_outer_guide', q = True, t = True, ws = True) 1516 | ball_pos = xform(self.name + '_ball_guide', q = True, t = True, ws = True) 1517 | xform(ee + '_tap.rotatePivot', t = ball_pos, ws = True) 1518 | xform(self.name + '_bank_inner.rotatePivot', t = inner_pos, ws = True) 1519 | xform(self.name + '_bank_outer.rotatePivot', t = outer_pos, ws = True) 1520 | 1521 | select(self.parent + '_ikfk_switch_ctrl') 1522 | addAttr(ln = "Heel_Twist", k = True) 1523 | addAttr(ln = "Toes_Twist", k = True) 1524 | addAttr(ln = "Toe_Tap", k = True) 1525 | addAttr(ln = "Bank", k = True) 1526 | addAttr(ln = "Roll", k = True, min = -30, max = 30, dv = 0) 1527 | 1528 | connectAttr(self.parent + '_ikfk_switch_ctrl.Heel_Twist', bj + '_rev.rotateY') 1529 | connectAttr(self.parent + '_ikfk_switch_ctrl.Toes_Twist', ee + '_rev.rotateY') 1530 | connectAttr(self.parent + '_ikfk_switch_ctrl.Toe_Tap', ee + '_tap.rotateX') 1531 | 1532 | shadingNode('condition', n = self.name + '_bank_condition', au = True) 1533 | setAttr(self.name + '_bank_condition.operation', 2) 1534 | connectAttr(self.parent + '_ikfk_switch_ctrl.Bank', self.name + '_bank_condition.colorIfFalseG') 1535 | connectAttr(self.parent + '_ikfk_switch_ctrl.Bank', self.name + '_bank_condition.colorIfTrueR') 1536 | connectAttr(self.parent + '_ikfk_switch_ctrl.Bank', self.name + '_bank_condition.firstTerm') 1537 | connectAttr(self.name + '_bank_condition.outColorR', self.name + '_bank_inner.rotateZ') 1538 | connectAttr(self.name + '_bank_condition.outColorG', self.name + '_bank_outer.rotateZ') 1539 | 1540 | shadingNode('condition', au = True, n = bj + '_roll_condition') 1541 | shadingNode('condition', au = True, n = mj + '_roll_condition') 1542 | shadingNode('condition', au = True, n = ee + '_roll_condition') 1543 | shadingNode('multiplyDivide', au = True, n = self.name + '_roll_multi') 1544 | shadingNode('plusMinusAverage', au = True, n = self.name + '_roll_pma') 1545 | setAttr(bj + '_roll_condition.operation', 4) 1546 | setAttr(mj + '_roll_condition.operation', 2) 1547 | setAttr(ee + '_roll_condition.operation', 2) 1548 | setAttr(ee + '_roll_condition.secondTerm', 10) 1549 | setAttr(self.name + '_roll_multi.input2X', 1) 1550 | setAttr(self.name + '_roll_multi.input2Y', 1) 1551 | setAttr(self.name + '_roll_multi.input2Z', 1) 1552 | setAttr(self.name + '_roll_pma.operation', 2) 1553 | setAttr(self.name + '_roll_pma.input1D[1]', 10) 1554 | connectAttr(self.parent + '_ikfk_switch_ctrl.Roll', bj + '_roll_condition.colorIfTrueR') 1555 | connectAttr(self.parent + '_ikfk_switch_ctrl.Roll', bj + '_roll_condition.firstTerm') 1556 | connectAttr(self.parent + '_ikfk_switch_ctrl.Roll', mj + '_roll_condition.colorIfTrueR') 1557 | connectAttr(self.parent + '_ikfk_switch_ctrl.Roll', mj + '_roll_condition.firstTerm') 1558 | connectAttr(self.parent + '_ikfk_switch_ctrl.Roll', self.name + '_roll_pma.input1D[0]') 1559 | connectAttr(self.parent + '_ikfk_switch_ctrl.Roll', ee + '_roll_condition.firstTerm') 1560 | connectAttr(self.name + '_roll_pma.output1D', ee + '_roll_condition.colorIfTrueR') 1561 | connectAttr(bj + '_roll_condition.outColorR', self.name + '_roll_multi.input1X') 1562 | connectAttr(mj + '_roll_condition.outColorR', self.name + '_roll_multi.input1Y') 1563 | connectAttr(ee + '_roll_condition.outColorR', self.name + '_roll_multi.input1Z') 1564 | connectAttr(self.name + '_roll_multi.outputX', bj + '_rev.rotateZ') 1565 | connectAttr(self.name + '_roll_multi.outputY', mj + '_rev.rotateZ') 1566 | connectAttr(self.name + '_roll_multi.outputZ', ee + '_rev.rotateZ') 1567 | 1568 | progress_msg = "Creating Reverse Foot Controls... (" + progressNum(prognum) + "%) " + self.name + "_ctrl" 1569 | print(progress_msg) 1570 | progresswin.textbox.append(progress_msg) 1571 | QApplication.processEvents() 1572 | 1573 | # SPINE # 1574 | hip = Rig("hip", t = (0, 106.85, 2.652)) 1575 | waist = Rig("waist", t = (0, 119.473, 5), p = "hip") 1576 | chest = Rig("chest", t = (0, 131.713, 5), p = "waist") 1577 | collarbone = Rig("collarbone", t = (0, 153.569, 1.886), p = "chest") 1578 | 1579 | # HEAD # 1580 | neck = Rig("neck", t = (0, 156.891, 1.886), p = "collarbone") 1581 | head = Rig("head", t = (0, 170.281, 3.69), p = "neck") 1582 | jaw = Rig("jaw", t = (0, 170.281, 7.175), p = "head") 1583 | chin = Rig("chin", t = (0, 163.448, 15.213), p = "jaw") 1584 | l_eye = Rig("l_eye", t = (3.125, 175.471, 12.969), p = "head") 1585 | r_eye = Rig("r_eye", t = (-3.125, 175.471, 12.969), p = "head") 1586 | 1587 | # ARMS # 1588 | l_clavicle = Rig("l_clavicle", t = (3.107, 152.95, 4.807), p = "collarbone") 1589 | l_shoulder = Rig("l_shoulder", t = (19, 150.912, 0), p = "l_clavicle") 1590 | l_elbow = Rig("l_elbow", t = (31, 125, 0), p = "l_shoulder") 1591 | l_wrist = Rig("l_wrist", t = (45, 103, 6), p = "l_elbow") 1592 | r_clavicle = Rig("r_clavicle", t = (-3.107, 152.95, 4.807), p = "collarbone") 1593 | r_shoulder = Rig("r_shoulder", t = (-19, 150.912, 0), p = "r_clavicle") 1594 | r_elbow = Rig("r_elbow", t = (-31, 125, 0), p = "r_shoulder") 1595 | r_wrist = Rig("r_wrist", t = (-45, 103, 6), p = "r_elbow") 1596 | 1597 | l_arm = Rig("l_arm", p = "l_wrist") 1598 | r_arm = Rig("r_arm", p = "r_wrist") 1599 | 1600 | # FINGERS # 1601 | #THUMB# 1602 | l_finger_thumb_metacarpal = Rig("l_finger_thumb_metacarpal", t = (45.382, 101.311, 7.675), p = "l_wrist") 1603 | l_finger_thumb_proximal = Rig("l_finger_thumb_proximal", t = (43.059, 97.395, 11.934), p = "l_finger_thumb_metacarpal") 1604 | l_finger_thumb_distal = Rig("l_finger_thumb_distal", t = (41.629, 94.984, 13.81), p = "l_finger_thumb_proximal") 1605 | l_finger_thumb_tip = Rig("l_finger_thumb_tip", t = (40.527, 92.962, 15.23), p = "l_finger_thumb_distal") 1606 | r_finger_thumb_metacarpal = Rig("r_finger_thumb_metacarpal", t = (-45.382, 101.311, 7.675), p = "r_wrist") 1607 | r_finger_thumb_proximal = Rig("r_finger_thumb_proximal", t = (-43.059, 97.395, 11.934), p = "r_finger_thumb_metacarpal") 1608 | r_finger_thumb_distal = Rig("r_finger_thumb_distal", t = (-41.629, 94.984, 13.81), p = "r_finger_thumb_proximal") 1609 | r_finger_thumb_tip = Rig("r_finger_thumb_tip", t = (-40.527, 92.962, 15.23), p = "r_finger_thumb_distal") 1610 | #INDEX# 1611 | l_finger_index_metacarpal = Rig("l_finger_index_metacarpal", t = (45.382, 101.311, 7.675), p = "l_wrist") 1612 | l_finger_index_proximal = Rig("l_finger_index_proximal", t = (47.514, 93.318, 13.052), p = "l_finger_index_metacarpal") 1613 | l_finger_index_middlep = Rig("l_finger_index_middlep", t = (48.218, 90.448, 14.448), p = "l_finger_index_proximal") 1614 | l_finger_index_distal = Rig("l_finger_index_distal", t = (48.629, 87.937, 15.367), p = "l_finger_index_middlep") 1615 | l_finger_index_tip = Rig("l_finger_index_tip", t = (49, 86, 16), p = "l_finger_index_distal") 1616 | r_finger_index_metacarpal = Rig("r_finger_index_metacarpal", t = (-45.382, 101.311, 7.675), p = "r_wrist") 1617 | r_finger_index_proximal = Rig("r_finger_index_proximal", t = (-47.514, 93.318, 13.052), p = "r_finger_index_metacarpal") 1618 | r_finger_index_middlep = Rig("r_finger_index_middlep", t = (-48.218, 90.448, 14.448), p = "r_finger_index_proximal") 1619 | r_finger_index_distal = Rig("r_finger_index_distal", t = (-48.629, 87.937, 15.367), p = "r_finger_index_middlep") 1620 | r_finger_index_tip = Rig("r_finger_index_tip", t = (-49, 86, 16), p = "r_finger_index_distal") 1621 | #MIDDLE# 1622 | l_finger_middlef_metacarpal = Rig("l_finger_middlef_metacarpal", t = (46, 101.217, 6.603), p = "l_wrist") 1623 | l_finger_middlef_proximal = Rig("l_finger_middlef_proximal", t = (49, 92.83, 10.919), p = "l_finger_middlef_metacarpal") 1624 | l_finger_middlef_middlep = Rig("l_finger_middlef_middlep", t = (49.284, 89.204, 11.585), p = "l_finger_middlef_proximal") 1625 | l_finger_middlef_distal = Rig("l_finger_middlef_distal", t = (48.689, 86, 12), p = "l_finger_middlef_middlep") 1626 | l_finger_middlef_tip = Rig("l_finger_middlef_tip", t = (48.271, 84.081, 12.244), p = "l_finger_middlef_distal") 1627 | r_finger_middlef_metacarpal = Rig("r_finger_middlef_metacarpal", t = (-46, 101.217, 6.603), p = "r_wrist") 1628 | r_finger_middlef_proximal = Rig("r_finger_middlef_proximal", t = (-49, 92.83, 10.919), p = "r_finger_middlef_metacarpal") 1629 | r_finger_middlef_middlep = Rig("r_finger_middlef_middlep", t = (-49.284, 89.204, 11.585), p = "r_finger_middlef_proximal") 1630 | r_finger_middlef_distal = Rig("r_finger_middlef_distal", t = (-48.689, 86, 12), p = "r_finger_middlef_middlep") 1631 | r_finger_middlef_tip = Rig("r_finger_middlef_tip", t = (-48.271, 84.081, 12.244), p = "r_finger_middlef_distal") 1632 | #RING# 1633 | l_finger_ring_metacarpal = Rig("l_finger_ring_metacarpal", t = (46, 100.783, 5.433), p = "l_wrist") 1634 | l_finger_ring_proximal = Rig("l_finger_ring_proximal", t = (49.763, 93.155, 8.511), p = "l_finger_ring_metacarpal") 1635 | l_finger_ring_middlep = Rig("l_finger_ring_middlep", t = (49.312, 89.47, 8.796), p = "l_finger_ring_proximal") 1636 | l_finger_ring_distal = Rig("l_finger_ring_distal", t = (48.491, 86.937, 8.919), p = "l_finger_ring_middlep") 1637 | l_finger_ring_tip = Rig("l_finger_ring_tip", t = (48, 84.47, 9.081), p = "l_finger_ring_distal") 1638 | r_finger_ring_metacarpal = Rig("r_finger_ring_metacarpal", t = (-46, 100.783, 5.433), p = "r_wrist") 1639 | r_finger_ring_proximal = Rig("r_finger_ring_proximal", t = (-49.763, 93.155, 8.511), p = "r_finger_ring_metacarpal") 1640 | r_finger_ring_middlep = Rig("r_finger_ring_middlep", t = (-49.312, 89.47, 8.796), p = "r_finger_ring_proximal") 1641 | r_finger_ring_distal = Rig("r_finger_ring_distal", t = (-48.491, 86.937, 8.919), p = "r_finger_ring_middlep") 1642 | r_finger_ring_tip = Rig("r_finger_ring_tip", t = (-48, 84.47, 9.081), p = "r_finger_ring_distal") 1643 | #PINKY# 1644 | l_finger_pinky_metacarpal = Rig("l_finger_pinky_metacarpal", t = (46, 100.686, 4.506), p = "l_wrist") 1645 | l_finger_pinky_proximal = Rig("l_finger_pinky_proximal", t = (50, 93.654, 6.103), p = "l_finger_pinky_metacarpal") 1646 | l_finger_pinky_middlep = Rig("l_finger_pinky_middlep", t = (49.827, 90.743, 5.949), p = "l_finger_pinky_proximal") 1647 | l_finger_pinky_distal = Rig("l_finger_pinky_distal", t = (49, 89.103, 5.64), p = "l_finger_pinky_middlep") 1648 | l_finger_pinky_tip = Rig("l_finger_pinky_tip", t = (48, 87.794, 5.077), p = "l_finger_pinky_distal") 1649 | r_finger_pinky_metacarpal = Rig("r_finger_pinky_metacarpal", t = (-46, 100.686, 4.506), p = "r_wrist") 1650 | r_finger_pinky_proximal = Rig("r_finger_pinky_proximal", t = (-50, 93.654, 6.103), p = "r_finger_pinky_metacarpal") 1651 | r_finger_pinky_middlep = Rig("r_finger_pinky_middlep", t = (-49.827, 90.743, 5.949), p = "r_finger_pinky_proximal") 1652 | r_finger_pinky_distal = Rig("r_finger_pinky_distal", t = (-49, 89.103, 5.64), p = "r_finger_pinky_middlep") 1653 | r_finger_pinky_tip = Rig("r_finger_pinky_tip", t = (-48, 87.794, 5.077), p = "r_finger_pinky_distal") 1654 | 1655 | # LEGS # 1656 | l_thigh = Rig("l_thigh", t = (8.782, 101.69, 1.97), p = "hip") 1657 | l_knee = Rig("l_knee", t = (15, 54, 3), p = "l_thigh") 1658 | l_ankle = Rig("l_ankle", t = (18.901, 10, 0), p = "l_knee") 1659 | l_foot_ball = Rig("l_foot_ball", t = (21.058, 3.639, 14.117), p = "l_ankle") 1660 | l_foot_toes = Rig("l_foot_toes", t = (22.253, 3.639, 21.534), p = "l_foot_ball") 1661 | l_foot_heel = Rig("l_foot_heel", t = (18.406, 3.639, -4.419), p = "l_foot_toes") 1662 | l_foot_inner = Rig("l_foot_inner", t = (15.229, 3.639, 7.702), p = "l_foot_heel") 1663 | l_foot_outer = Rig("l_foot_outer", t = (25.864, 3.639, 7.702), p = "l_foot_heel") 1664 | r_thigh = Rig("r_thigh", t = (-8.782, 101.69, 1.97), p = "hip") 1665 | r_knee = Rig("r_knee", t = (-15, 54, 3), p = "r_thigh") 1666 | r_ankle = Rig("r_ankle", t = (-18.901, 10, 0), p = "r_knee") 1667 | r_foot_ball = Rig("r_foot_ball", t = (-21.058, 3.639, 14.117), p = "r_ankle") 1668 | r_foot_toes = Rig("r_foot_toes", t = (-22.253, 3.639, 21.534), p = "r_foot_ball") 1669 | r_foot_heel = Rig("r_foot_heel", t = (-18.406, 3.639, -4.419), p = "r_foot_toes") 1670 | r_foot_inner = Rig("r_foot_inner", t = (-15.229, 3.639, 7.702), p = "r_foot_heel") 1671 | r_foot_outer = Rig("r_foot_outer", t = (-25.864, 3.639, 7.702), p = "r_foot_heel") 1672 | 1673 | l_leg = Rig("l_leg", p = "l_ankle") 1674 | r_leg = Rig("r_leg", p = "r_ankle") 1675 | 1676 | l_foot = Rig("l_foot", p = "l_leg") 1677 | r_foot = Rig("r_foot", p = "r_leg") -------------------------------------------------------------------------------- /scripts/userSetup.py: -------------------------------------------------------------------------------- 1 | import pymel.core as pm 2 | pm.evalDeferred('import menu') --------------------------------------------------------------------------------