gsee

AM_layoutTools py2.7

May 29th, 2020 (edited)
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 25.97 KB | None | 0 0
  1. import maya.cmds as mc
  2. import math
  3. from maya import OpenMayaUI as omui
  4. from shiboken2 import wrapInstance
  5. from PySide2 import QtCore, QtWidgets
  6.  
  7.  
  8. def get_maya_window():
  9.     mayaMainWindowPtr = omui.MQtUtil.mainWindow()
  10.     return wrapInstance(long(mayaMainWindowPtr), QtWidgets.QWidget)
  11.  
  12.  
  13. class LayoutTools(QtWidgets.QWidget):
  14.     OBJECT_NAME = "LayoutTools"
  15.  
  16.     def __init__(self, parent=None):
  17.         super(LayoutTools, self).__init__(parent)
  18.  
  19.         self.__sj_time_changed = None
  20.         self.__sj_selection_changed = None
  21.         self.copy_list = None
  22.  
  23.         self.setObjectName(LayoutTools.OBJECT_NAME)
  24.         self.setWindowTitle('AM Layout Tools')
  25.         self.setParent(parent or get_maya_window())
  26.         self.setWindowFlags(QtCore.Qt.Window)
  27.         self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
  28.  
  29.         self.camera = get_camera()
  30.         self.__setup_ui()
  31.  
  32.     def __setup_ui(self):
  33.         self.__create_widgets()
  34.         self.__modify_widgets()
  35.         self.__create_layouts()
  36.         self.__add_widgets_to_layouts()
  37.         self.__setup_connections()
  38.  
  39.     def __create_widgets(self):
  40.         self.camera_lbl = QtWidgets.QLabel('Camera')
  41.         self.camera_le = QtWidgets.QLineEdit()
  42.         self.camera_btn = QtWidgets.QPushButton('Refresh')
  43.         self.camera_cb = QtWidgets.QCheckBox('Auto')
  44.  
  45.         self.focal_lbl = QtWidgets.QLabel('Focal')
  46.         self.focal_spb = QtWidgets.QSpinBox()
  47.         self.focal_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
  48.         self.focal_btn = QtWidgets.QPushButton('Key')
  49.  
  50.         self.near_lbl = QtWidgets.QLabel('Near')
  51.         self.near_dblSpb = QtWidgets.QDoubleSpinBox()
  52.         self.near_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
  53.  
  54.         self.tools_copy_btn = QtWidgets.QPushButton('Copy')
  55.         self.tools_paste_btn = QtWidgets.QPushButton('Paste')
  56.         self.tools_mpc_btn = QtWidgets.QPushButton('MultiParentConstraint')
  57.  
  58.         self.tools_tiers_btn = QtWidgets.QPushButton('Tiers')
  59.         self.tools_fibonacciSpiral_btn = QtWidgets.QPushButton('FibonacciSpiral')
  60.         self.tools_wd_btn = QtWidgets.QPushButton('WaveDestroyer')
  61.  
  62.         self.help_curves_view_slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
  63.  
  64.     def __modify_widgets(self):
  65.         self.camera_le.setReadOnly(1)
  66.         self.camera_le.setText(self.camera.name)
  67.  
  68.         self.focal_spb.setMinimum(15)
  69.         self.focal_spb.setMaximum(250)
  70.         self.focal_slider.setMinimum(15)
  71.         self.focal_slider.setMaximum(250)
  72.  
  73.         self.near_slider.setMinimum(1)
  74.         self.near_slider.setMaximum(5000)
  75.  
  76.         self.focal_slider.setValue(self.camera.focal)
  77.         self.focal_spb.setValue(self.camera.focal)
  78.         self.near_slider.setValue(self.camera.near * 10)
  79.         self.near_dblSpb.setValue(self.camera.near)
  80.  
  81.     def __create_layouts(self):
  82.         self.main_layout = QtWidgets.QVBoxLayout(self)
  83.  
  84.         self.camera_layout = QtWidgets.QHBoxLayout()
  85.         self.focal_layout = QtWidgets.QHBoxLayout()
  86.         self.near_layout = QtWidgets.QHBoxLayout()
  87.         self.tools_layout = QtWidgets.QHBoxLayout()
  88.         self.tools_two_layout = QtWidgets.QHBoxLayout()
  89.  
  90.     def __add_widgets_to_layouts(self):
  91.         [self.camera_layout.addWidget(w) for w in (self.camera_lbl, self.camera_le, self.camera_cb, self.camera_btn)]
  92.         [self.focal_layout.addWidget(w) for w in (self.focal_lbl, self.focal_spb, self.focal_slider, self.focal_btn)]
  93.         [self.near_layout.addWidget(w) for w in (self.near_lbl, self.near_dblSpb, self.near_slider)]
  94.         [self.tools_layout.addWidget(w) for w in (self.tools_copy_btn, self.tools_paste_btn, self.tools_mpc_btn)]
  95.         [self.tools_two_layout.addWidget(w) for w in
  96.          (self.tools_tiers_btn, self.tools_fibonacciSpiral_btn, self.tools_wd_btn)]
  97.  
  98.         [self.main_layout.addLayout(l) for l in
  99.          (self.camera_layout, self.focal_layout, self.near_layout, self.tools_layout, self.tools_two_layout)]
  100.  
  101.     def __setup_connections(self):
  102.         self.camera_btn.clicked.connect(self.refresh)
  103.         self.camera_cb.clicked.connect(self.setup_camera_callback)
  104.  
  105.         self.focal_spb.valueChanged.connect(self.focal_value_spb)
  106.         self.focal_slider.valueChanged.connect(self.focal_value_slider)
  107.         self.focal_btn.clicked.connect(self.key_focal)
  108.  
  109.         self.near_slider.valueChanged.connect(self.near_value_slider)
  110.         self.near_dblSpb.valueChanged.connect(self.near_value_dblspb)
  111.  
  112.         self.tools_copy_btn.clicked.connect(self.ui_copy_selected_transform)
  113.         self.tools_paste_btn.clicked.connect(self.ui_paste_selected_transform)
  114.         self.tools_mpc_btn.clicked.connect(self.ui_multi_parent_constraint)
  115.  
  116.         self.tools_tiers_btn.clicked.connect(self.ui_tiers)
  117.         self.tools_fibonacciSpiral_btn.clicked.connect(self.ui_fibonacci_spiral)
  118.         self.tools_wd_btn.clicked.connect(self.ui_wave_destroyer_inputdialog)
  119.  
  120.     def setup_camera_callback(self):
  121.         if not self.camera_cb.isChecked() and self.__sj_time_changed and self.__sj_selection_changed:
  122.             mc.scriptJob(k=self.__sj_time_changed, f=True)
  123.             mc.scriptJob(k=self.__sj_selection_changed, f=True)
  124.  
  125.         elif self.camera_cb.isChecked():
  126.             self.__sj_time_changed = mc.scriptJob(cu=True, kws=False, event=['timeChanged', self.refresh])
  127.             self.__sj_selection_changed = mc.scriptJob(cu=True, kws=False, event=['SelectionChanged', self.refresh])
  128.  
  129.     def closeEvent(self, event):
  130.         if not self.camera_cb.isChecked() and self.__sj_time_changed and self.__sj_selection_changed:
  131.             mc.scriptJob(k=self.__sj_time_changed, f=True)
  132.             mc.scriptJob(k=self.__sj_selection_changed, f=True)
  133.  
  134.         if mc.objExists('AM_cameraTools_grp'):
  135.             mc.delete('AM_cameraTools_grp')
  136.  
  137.     def refresh(self):
  138.         self.camera = get_camera()
  139.         self.camera_le.setText(self.camera.name)
  140.         self.focal_slider.setValue(self.camera.focal)
  141.         self.focal_spb.setValue(self.camera.focal)
  142.         self.near_slider.setValue(self.camera.near * 100)
  143.         self.near_dblSpb.setValue(self.camera.near)
  144.  
  145.     def focal_value_spb(self, value):
  146.         self.focal_slider.setValue(value)
  147.         self.camera.set_focal(value)
  148.  
  149.     def focal_value_slider(self, value):
  150.         self.focal_spb.setValue(value)
  151.  
  152.     def key_focal(self):
  153.         self.camera.key_focal()
  154.  
  155.     def near_value_dblspb(self, value):
  156.         self.near_slider.setValue(value * 100)
  157.         self.camera.set_near(value)
  158.  
  159.     def near_value_slider(self, value):
  160.         self.near_dblSpb.setValue(value / 100)
  161.  
  162.     def ui_copy_selected_transform(self):
  163.         self.copy_list = copy_selected_transform()
  164.  
  165.     def ui_paste_selected_transform(self):
  166.         paste_selected_transform(self.copy_list[0], self.copy_list[1], self.copy_list[2])
  167.  
  168.     def ui_multi_parent_constraint(self):
  169.         multi_parent_constraint()
  170.  
  171.     def ui_tiers(self):
  172.         self.camera.set_tiers()
  173.  
  174.     def ui_fibonacci_spiral(self):
  175.         self.camera.set_fibonnaci_spiral()
  176.  
  177.     def ui_wave_destroyer_inputdialog(self):
  178.         key_value, ok = QtWidgets.QInputDialog.getInt(self, 'Number',
  179.                                                       'Put the frame number between last 2 keys of focal (before transfer!):')
  180.  
  181.         if ok and key_value:
  182.             wave_destroyer(key_value)
  183.  
  184.  
  185. class Camera:
  186.     def __init__(self, name, focal, near, panel):
  187.         self.name = name
  188.         self.focal = focal
  189.         self.near = near
  190.         self.panel = panel
  191.  
  192.     def set_focal(self, value):
  193.         if not mc.listConnections(self.name + '.focalLength', destination=True, plugs=True, type='transform'):
  194.             focal_path = self.name + '.focalLength'
  195.         else:
  196.             focal_path = mc.listConnections(self.name + '.focalLength', destination=True, plugs=True, type='transform')[
  197.                 0]
  198.  
  199.         mc.setAttr(focal_path, value)
  200.         self.focal = value
  201.  
  202.     def set_near(self, value):
  203.         if not mc.listConnections(self.name + '.nearClipPlane', destination=True, plugs=True, type='transform'):
  204.             near_path = self.name + '.nearClipPlane'
  205.         else:
  206.             near_path = \
  207.                 mc.listConnections(self.name + '.nearClipPlane', destination=True, plugs=True, type='transform')[0]
  208.  
  209.         mc.setAttr(near_path, value)
  210.         self.near = value
  211.  
  212.     def key_focal(self):
  213.         if not mc.listConnections(self.name + '.focalLength', destination=True, plugs=True, type='transform'):
  214.             focal_path = self.name + '.focalLength'
  215.         else:
  216.             focal_path = mc.listConnections(self.name + '.focalLength', destination=True, plugs=True, type='transform')[
  217.                 0]
  218.         mc.setKeyframe(focal_path)
  219.  
  220.     def set_tiers(self):
  221.         am_grp = 'AM_cameraTools_grp'
  222.         if not mc.objExists(am_grp):
  223.             mc.group(em=True, name='AM_cameraTools_grp')
  224.  
  225.         cam_grp = self.name + '_grp'
  226.         if not mc.objExists(cam_grp):
  227.             mc.group(em=True, name=self.name + '_grp')
  228.             mc.parent(cam_grp, am_grp)
  229.             mc.parentConstraint(self.name, cam_grp, maintainOffset=False)
  230.  
  231.         tiers_grp = self.name + '_tiers'
  232.         if not mc.objExists(tiers_grp):
  233.             mc.group(em=True, name=self.name + '_tiers')
  234.             mc.parent(tiers_grp, cam_grp)
  235.             create_tiers(self.name, self.panel)
  236.  
  237.         else:
  238.             old_sel = mc.ls(selection=True)
  239.             isolate_transform = []
  240.             if mc.listRelatives(mc.ls(type='mesh'), path=True, parent=True):
  241.                 isolate_transform = mc.listRelatives(mc.ls(type='mesh'), path=True, parent=True)
  242.  
  243.             isolate_transform.append(tiers_grp)
  244.             mc.select(isolate_transform)
  245.             currentState = mc.isolateSelect(self.panel, query=True, state=True)
  246.  
  247.             if currentState == 0:
  248.                 mc.isolateSelect(self.panel, state=1)
  249.                 mc.isolateSelect(self.panel, addSelected=True)
  250.                 mc.setAttr(tiers_grp + '.visibility', 1)
  251.                 mc.select(old_sel, r=True)
  252.             else:
  253.                 mc.isolateSelect(self.panel, state=0)
  254.                 mc.isolateSelect(self.panel, removeSelected=True)
  255.                 mc.setAttr(tiers_grp + '.visibility', 0)
  256.                 mc.select(old_sel, r=True)
  257.  
  258.     def set_fibonnaci_spiral(self):
  259.         am_grp = 'AM_cameraTools_grp'
  260.         if not mc.objExists(am_grp):
  261.             mc.group(em=True, name='AM_cameraTools_grp')
  262.  
  263.         cam_grp = self.name + '_grp'
  264.         if not mc.objExists(cam_grp):
  265.             mc.group(em=True, name=self.name + '_grp')
  266.             mc.parent(cam_grp, am_grp)
  267.             mc.parentConstraint(self.name, cam_grp, maintainOffset=False)
  268.  
  269.         fibonacci_grp = self.name + '_fibonacci'
  270.         if not mc.objExists(fibonacci_grp):
  271.             mc.group(em=True, name=self.name + '_fibonacci')
  272.             mc.parent(fibonacci_grp, cam_grp)
  273.             create_fibonacci_curve(self.name, self.panel, 15, 16)
  274.  
  275.  
  276. # get the current camera ,in this order, selection > sequencer > 2nd camera in list of all cams
  277. # send camera to camera Class
  278.  
  279. def get_camera():
  280.     sel = mc.ls(selection=True)
  281.     cam_shot = mc.sequenceManager(currentShot=True, query=True)
  282.     cam_list = []
  283.     cam_panel = []
  284.  
  285.     if sel:
  286.         for c in sel:
  287.             if mc.listRelatives(c, type='camera'):
  288.                 cam_list.append(c)
  289.  
  290.             elif mc.listRelatives(c, type='nurbsCurve') and mc.listRelatives(c, allDescendents=True, type='camera'):
  291.                 cam_shape = mc.listRelatives(c, allDescendents=True, type='camera')[0]
  292.                 parent_node = mc.listRelatives(cam_shape, parent=True)[0]
  293.                 cam_list.append(parent_node)
  294.  
  295.     if cam_list:
  296.         cam = cam_list[0]
  297.  
  298.     elif not cam_list and cam_shot:
  299.         if not mc.listRelatives(mc.shot(cam_shot, currentCamera=True, query=True), shapes=True):
  300.             cam = mc.listRelatives(mc.shot(cam_shot, currentCamera=True, query=True), parent=True)[0]
  301.         else:
  302.             cam = mc.shot(cam_shot, currentCamera=True, query=True)
  303.  
  304.     else:
  305.         all_cam = mc.ls(type='camera')
  306.         cam = mc.listRelatives(all_cam[1], parent=True)[0]
  307.  
  308.     for p in mc.getPanel(type="modelPanel"):
  309.         if mc.modelPanel(p, query=True, camera=True) == cam:
  310.             cam_panel = p
  311.  
  312.         elif mc.modelPanel(p, query=True, camera=True) == mc.listRelatives(cam, shapes=True)[0]:
  313.             cam_panel = p
  314.  
  315.         else:
  316.             continue
  317.  
  318.     if not cam_panel:
  319.         mc.warning('No Panel with this camera. Put one and refresh')
  320.  
  321.     camera = Camera(cam, mc.getAttr(cam + '.focalLength'), mc.getAttr(cam + '.nearClipPlane'), cam_panel)
  322.     return camera
  323.  
  324.  
  325. def copy_selected_transform():
  326.     sel = mc.ls(selection=True)
  327.  
  328.     if len(sel) is not 1 and mc.nodeType(sel) != 'transform':
  329.         mc.error('Select one transform')
  330.  
  331.     else:
  332.         world_translate = mc.xform(sel, worldSpace=True, translation=True, query=True)
  333.         world_rotate = mc.xform(sel, worldSpace=True, rotation=True, query=True)
  334.         world_scale = mc.xform(sel, worldSpace=True, scale=True, query=True)
  335.  
  336.         return world_translate, world_rotate, world_scale
  337.  
  338.  
  339. def paste_selected_transform(world_translate, world_rotate, world_scale):
  340.     sel = mc.ls(selection=True)
  341.  
  342.     if len(sel) is not 1 and mc.nodeType(sel) != 'transform':
  343.         mc.error('Select one transform')
  344.  
  345.     else:
  346.         mc.xform(sel, worldSpace=True, translation=world_translate)
  347.         mc.xform(sel, worldSpace=True, rotation=world_rotate)
  348.         mc.xform(sel, worldSpace=True, scale=world_scale)
  349.  
  350.  
  351. def multi_parent_constraint():
  352.     sel = mc.ls(selection=True)
  353.     mpc_childrens = sel[:-1]
  354.     mpc_parent = sel[-1]
  355.  
  356.     if sel:
  357.         for t in sel:
  358.             if mc.nodeType(t) != 'transform' and len(sel) < 3:
  359.                 mc.warning('Select 3 transforms mini')
  360.  
  361.             else:
  362.                 for p in mpc_childrens:
  363.                     mc.parentConstraint(mpc_parent, p, mo=True)
  364.  
  365.                 mc.select(mpc_parent, r=True)
  366.     else:
  367.         mc.warning('Select 3 transforms mini')
  368.  
  369.  
  370. def wave_destroyer(key_value):
  371.     values_focal_alpha = []
  372.     anim_crv = mc.keyframe(selected=True, name=True, query=True)
  373.     cam = []
  374.     playback = mc.playbackOptions(minTime=True, query=True), mc.playbackOptions(maxTime=True, query=True)
  375.  
  376.     if anim_crv and len(mc.keyframe(anim_crv, timeChange=True, query=True, selected=True)) == 3:
  377.         cam_focal = mc.listConnections(anim_crv, plugs=True)[0]
  378.  
  379.         if mc.listConnections(cam_focal, type='camera'):
  380.             cam = mc.listConnections(cam_focal, type='camera')[0]
  381.  
  382.         else:
  383.             cam = mc.listRelatives(cam_focal.rsplit('.', 1)[0], parent=True)[0]
  384.  
  385.     if not cam:
  386.         mc.error('Select 3 focal''s keys from graph editor')
  387.  
  388.     select_time = mc.keyframe(cam_focal, timeChange=True, query=True, selected=True)
  389.     values_focal = mc.keyframe(cam_focal, valueChange=True, selected=True, query=True)
  390.  
  391.     store_start_keys = mc.keyframe(cam_focal, time=(playback[0], select_time[0] - 1), query=True, timeChange=True,
  392.                                    valueChange=True)
  393.     store_end_keys = mc.keyframe(cam_focal, time=(select_time[-1] + 1, playback[1]), query=True, timeChange=True,
  394.                                  valueChange=True)
  395.  
  396.     for v in values_focal:
  397.         values = 100 * math.atan(v)
  398.         values_focal_alpha.append(values)
  399.  
  400.     mc.addAttr(cam, longName='Alpha', attributeType='double', min=80, max=157, keyable=True)
  401.     cam_focal_alpha = cam + '.Alpha'
  402.     mc.setAttr(cam_focal_alpha, keyable=True)
  403.  
  404.     mc.cutKey(cam_focal)
  405.  
  406.     mc.setKeyframe(cam_focal_alpha, time=(select_time[0], select_time[0]), value=values_focal_alpha[0],
  407.                    inTangentType='auto', outTangentType='auto')
  408.     mc.setKeyframe(cam_focal_alpha, time=(select_time[-2] + key_value, select_time[-2] + key_value),
  409.                    value=values_focal_alpha[-1], inTangentType='auto', outTangentType='auto')
  410.     mc.setKeyframe(cam_focal_alpha, time=(select_time[-2], select_time[-2]), inTangentType='auto',
  411.                    outTangentType='auto', insert=True)
  412.     mc.keyframe(cam_focal_alpha, edit=True,
  413.                 time=(select_time[-2] + key_value, select_time[-2] + key_value), absolute=True,
  414.                 timeChange=select_time[-1])
  415.     mc.keyTangent(cam_focal_alpha, inTangentType='auto', outTangentType='auto')
  416.  
  417.     exp = '%s = tan(%s/100)' % (cam_focal, cam_focal_alpha)
  418.     mc.expression(s=exp)
  419.  
  420.     mc.bakeResults(cam_focal, simulation=True, time=(select_time[0], select_time[-1]), sampleBy=True,
  421.                    preserveOutsideKeys=True, sparseAnimCurveBake=0)
  422.  
  423.     if store_start_keys:
  424.         index = 0
  425.         for k in store_start_keys:
  426.             if index < len(store_start_keys):
  427.                 mc.setKeyframe(cam_focal, time=(store_start_keys[index], store_start_keys[index]),
  428.                                value=store_start_keys[index + 1])
  429.                 index += 2
  430.  
  431.     if store_end_keys:
  432.         index = 0
  433.         for k in store_end_keys:
  434.             if index < len(store_end_keys):
  435.                 mc.setKeyframe(cam_focal, time=(store_end_keys[index], store_end_keys[index]),
  436.                                value=store_end_keys[index + 1])
  437.                 index += 2
  438.     mc.keyTangent(cam_focal, inTangentType='auto', outTangentType='auto')
  439.     mc.deleteAttr(cam, attribute='Alpha')
  440.  
  441.  
  442. def create_camera_node(camera, plane_for_cam):
  443.    
  444.     """this fonction ll be create nodes to scaleX and Y plane_for_cam to keep proportions if near_clip and focal are
  445.    changing. this formula ((nearclip * aperture) / focal) work with a plane with 1x1 value and it ll be stick to
  446.    the nearClip"""
  447.  
  448.     if not mc.objExists('multiplyDivide_focal_' + camera) and not mc.objExists('multiplyDivide_aperture_' + camera):
  449.        
  450.         # convert inch to mm from aperture's camera (X and Y input)
  451.  
  452.         multiplyDivide_aperture_node = mc.createNode('multiplyDivide', name='multiplyDivide_aperture_' + camera)
  453.         mc.setAttr(multiplyDivide_aperture_node + '.operation', 1)
  454.         mc.connectAttr(camera + '.horizontalFilmAperture', multiplyDivide_aperture_node + '.input1X')
  455.         mc.connectAttr(camera + '.verticalFilmAperture', multiplyDivide_aperture_node + '.input1Y')
  456.         mc.setAttr(multiplyDivide_aperture_node + '.input2X', 25.4)
  457.         mc.setAttr(multiplyDivide_aperture_node + '.input2Y', 25.4)
  458.  
  459.         # plane_for_cam ll be on near_clip, add 0.0001 + near_clip value from camera on tz to be sure its always visible
  460.  
  461.         plusMinus_for_near = mc.createNode('plusMinusAverage', name='plusMinusAverage_near_' + camera)
  462.         mc.setAttr(plusMinus_for_near + '.operation')
  463.         mc.connectAttr(camera + '.nearClipPlane', plusMinus_for_near + '.input1D[0]')
  464.         mc.setAttr(plusMinus_for_near + '.input1D[1]', 0.0001)
  465.  
  466.         # connect near_clip on first node (Z input)
  467.  
  468.         mc.connectAttr(plusMinus_for_near + '.output1D', multiplyDivide_aperture_node + '.input1Z')
  469.         mc.setAttr(multiplyDivide_aperture_node + '.input2Z', -1)
  470.  
  471.         # formula to scale img with nearclip
  472.  
  473.         multiplyDivide_base_node = mc.createNode('multiplyDivide', name='multiplyDivide_base_' + camera)
  474.         mc.setAttr(multiplyDivide_base_node + '.operation', 1)
  475.         mc.connectAttr(camera + '.nearClipPlane', multiplyDivide_base_node + '.input1X')
  476.         mc.connectAttr(camera + '.nearClipPlane', multiplyDivide_base_node + '.input1Y')
  477.         mc.connectAttr(multiplyDivide_aperture_node + '.output', multiplyDivide_base_node + '.input2')
  478.  
  479.         # and now, end of formala with focal
  480.  
  481.         multiplyDivide_focal_node = mc.createNode('multiplyDivide', name='multiplyDivide_focal_' + camera)
  482.         mc.setAttr(multiplyDivide_focal_node + '.operation', 2)
  483.         mc.connectAttr(multiplyDivide_base_node + '.output', multiplyDivide_focal_node + '.input1')
  484.         mc.connectAttr(camera + '.focalLength', multiplyDivide_focal_node + '.input2X')
  485.         mc.connectAttr(camera + '.focalLength', multiplyDivide_focal_node + '.input2Y')
  486.  
  487.     # connect plane_for_cam to camera
  488.  
  489.     mc.connectAttr('multiplyDivide_aperture_' + camera + '.outputZ', plane_for_cam + '.translateZ')
  490.     mc.connectAttr('multiplyDivide_focal_' + camera + '.outputX', plane_for_cam + '.scaleX')
  491.     mc.connectAttr('multiplyDivide_focal_' + camera + '.outputY', plane_for_cam + '.scaleY')
  492.  
  493.  
  494. def create_tiers(camera, panel):
  495.     old_sel = mc.ls(selection=True)
  496.     tiers_grp = camera + '_tiers'
  497.  
  498.     top_crv = mc.curve(degree=1, p=[(-0.5, 0.25, 0), (0.5, 0.25, 0)], name=camera + '_top_crv')
  499.     bottom_crv = mc.curve(degree=1, p=[(-0.5, -0.25, 0), (0.5, -0.25, 0)], name=camera + '_bottom_crv')
  500.     left_crv = mc.curve(degree=1, p=[(-0.25, 0.5, 0), (-0.25, -0.5, 0)], name=camera + '_left_crv')
  501.     right_crv = mc.curve(degree=1, p=[(0.25, 0.5, 0), (0.25, -0.5, 0)], name=camera + '_right_crv')
  502.  
  503.     for curves in top_crv, bottom_crv, left_crv, right_crv:
  504.         mc.parent(curves, tiers_grp)
  505.  
  506.     matrix_cam = mc.xform(camera, worldSpace=True, matrix=True, query=True)
  507.     mc.xform(tiers_grp, worldSpace=True, matrix=matrix_cam)
  508.     mc.makeIdentity(tiers_grp, apply=True, t=1, r=1, s=1, n=0)
  509.  
  510.     create_camera_node(camera, tiers_grp)
  511.  
  512.     isolate_transform = []
  513.     if mc.listRelatives(mc.ls(type='mesh'), path=True, parent=True):
  514.         isolate_transform = mc.listRelatives(mc.ls(type='mesh'), path=True, parent=True)
  515.  
  516.     isolate_transform.append(tiers_grp)
  517.     mc.select(isolate_transform)
  518.  
  519.     currentState = mc.isolateSelect(panel, query=True, state=True)
  520.     if currentState == 1:
  521.         mc.isolateSelect(panel, state=0)
  522.         mc.isolateSelect(panel, removeSelected=True)
  523.         mc.isolateSelect(panel, state=1)
  524.         mc.isolateSelect(panel, addSelected=True)
  525.         mc.select(old_sel, r=True)
  526.     else:
  527.         mc.isolateSelect(panel, state=1)
  528.         mc.isolateSelect(panel, addSelected=True)
  529.         mc.select(old_sel, r=True)
  530.  
  531.  
  532. def create_fibonacci_curve(camera, panel, iterations, points_per_section):
  533.     """Creates a Fibonacci curve.
  534.  
  535.    Args:
  536.        iterations (int): number of quarter circles in the created curve
  537.        points_per_section (int): number of segment per quarter of circle
  538.  
  539.    Returns:
  540.        str: curve maya node
  541.    """
  542.     old_sel = mc.ls(selection=True)
  543.     fibonacci_grp = camera + '_fibonacci'
  544.     # ratio = mc.camera(camera, aspectRatio=True, query=True)
  545.     ratio = (1 + math.sqrt(5)) * 0.5
  546.  
  547.     all_curves = []
  548.  
  549.     fib_gen = gen_fib_points(ratio)
  550.  
  551.     # Create the quarter of circles
  552.     for _ in range(iterations):
  553.         start_point, center_point, end_point = next(fib_gen)
  554.         radius = math.sqrt((start_point[0] - center_point[0]) ** 2 +
  555.                            (start_point[1] - center_point[1]) ** 2)
  556.  
  557.         ctx = mc.createNode("makeTwoPointCircularArc")
  558.         mc.setAttr(ctx + ".pt1", start_point[0], 0, start_point[1],
  559.                    type='double3')
  560.         mc.setAttr(ctx + ".pt2", end_point[0], 0, end_point[1],
  561.                    type='double3')
  562.         mc.setAttr(ctx + ".directionVector", 0, 1, 0, type='double3')
  563.         mc.setAttr(ctx + ".radius", radius)
  564.         mc.setAttr(ctx + ".sections", points_per_section)
  565.  
  566.         curve = mc.createNode("nurbsCurve")
  567.         all_curves.append(curve)
  568.         mc.connectAttr(ctx + ".outputCurve", curve + ".create")
  569.  
  570.         mc.delete(curve, constructionHistory=True)
  571.  
  572.     # Attach all curves
  573.     mc.attachCurve(all_curves, constructionHistory=False,
  574.                    replaceOriginal=True,
  575.                    keepMultipleKnots=False, method=0, blendBias=0.5,
  576.                    blendKnotInsertion=False, parameter=0.1)
  577.     mc.delete(mc.listRelatives(all_curves[1:], parent=True))
  578.     fibonacci_crv = mc.rename(mc.listRelatives(all_curves[0], parent=True), 'fibonacci')
  579.  
  580.     matrix_cam = mc.xform(camera, worldSpace=True, matrix=True, query=True)
  581.     mc.xform(fibonacci_grp, worldSpace=True, matrix=matrix_cam)
  582.     mc.makeIdentity(fibonacci_grp, apply=True, t=1, r=0, s=1, n=0)
  583.  
  584.     # Test
  585.  
  586.     mc.parent(fibonacci_crv, fibonacci_grp)
  587.     mc.setAttr(fibonacci_grp + '.rx', -90)
  588.     mc.setAttr(fibonacci_crv + '.tx', -0.5)
  589.     mc.setAttr(fibonacci_crv + '.tz', -0.5)
  590.  
  591.     create_camera_node(camera, fibonacci_crv)
  592.  
  593.     isolate_transform = []
  594.     if mc.listRelatives(mc.ls(type='mesh'), path=True, parent=True):
  595.         isolate_transform = mc.listRelatives(mc.ls(type='mesh'), path=True, parent=True)
  596.  
  597.     isolate_transform.append(fibonacci_grp)
  598.     mc.select(isolate_transform)
  599.  
  600.     currentState = mc.isolateSelect(panel, query=True, state=True)
  601.     if currentState == 1:
  602.         mc.isolateSelect(panel, state=0)
  603.         mc.isolateSelect(panel, removeSelected=True)
  604.         mc.isolateSelect(panel, state=1)
  605.         mc.isolateSelect(panel, addSelected=True)
  606.         mc.select(old_sel, r=True)
  607.     else:
  608.         mc.isolateSelect(panel, state=1)
  609.         mc.isolateSelect(panel, addSelected=True)
  610.         mc.select(old_sel, r=True)
  611.  
  612.  
  613. def gen_fib_points(ratio):
  614.     """Generator of the points on the fibonnaci curve.
  615.    Each iteration returns the start point, center point and end point of
  616.    the iteration quarter circle
  617.  
  618.    Yields:
  619.        list, list, list
  620.    """
  621.  
  622.     current_point = [0, 0]
  623.  
  624.     offset = 1.0
  625.  
  626.     cycle_cpt = 0
  627.  
  628.     while True:
  629.  
  630.         end_point = list(current_point)
  631.  
  632.         xdir = 1 if cycle_cpt in {0, 1} else -1
  633.         ydir = 1 if cycle_cpt in {0, 3} else -1
  634.         end_point[0] = current_point[0] + xdir * offset
  635.         end_point[1] = current_point[1] + ydir * offset
  636.  
  637.         if cycle_cpt % 2:
  638.  
  639.             center_point = [current_point[0], end_point[1]]
  640.         else:
  641.             center_point = [end_point[0], current_point[1]]
  642.  
  643.         yield current_point, center_point, end_point
  644.  
  645.         current_point = end_point
  646.         offset /= ratio
  647.         cycle_cpt += 1
  648.         cycle_cpt %= 4
  649.  
  650.  
  651. def launch():
  652.     if mc.window(LayoutTools.OBJECT_NAME, q=True, exists=True):
  653.         mc.deleteUI(LayoutTools.OBJECT_NAME)
  654.  
  655.     lt = LayoutTools()
  656.     lt.show()
  657.     return lt
  658.  
  659.  
  660. launch()
  661.  
Advertisement
Add Comment
Please, Sign In to add comment