5522 lines
258 KiB
Python
5522 lines
258 KiB
Python
|
#!/usr/bin/env python
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
import maya.OpenMaya as om # type: ignore
|
||
|
import maya.OpenMayaUI as omui # type: ignore
|
||
|
import maya.cmds as cmds # type: ignore
|
||
|
import math
|
||
|
import maya.api.OpenMaya as OpenMaya # type: ignore
|
||
|
import maya.mel as mel # type: ignore
|
||
|
import re
|
||
|
from collections import OrderedDict
|
||
|
import random
|
||
|
|
||
|
def run():
|
||
|
if cmds.window("jwSpeedCutWin", exists=True):
|
||
|
cmds.deleteUI("jwSpeedCutWin")
|
||
|
if cmds.dockControl('speedCutDock', q=1, ex=1):
|
||
|
cmds.deleteUI('speedCutDock', control=1)
|
||
|
|
||
|
mayaHSize = cmds.window('MayaWindow', q=1, h=1)
|
||
|
jwSpeedCutWin = cmds.window("jwSpeedCutWin", title="Spped Cut", mxb=False, s=1, bgc=[0.2, 0.2, 0.2])
|
||
|
cmds.tabLayout(tv=0)
|
||
|
cmds.columnLayout(adj=1)
|
||
|
cmds.rowColumnLayout(nc=4, cw=[(1, 180), (2, 30), (3, 30), (4, 30)])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('SCminFrame', l="1", c=lambda *args: SCUI("min"), bgc=[0.24, 0.5, 0.2])
|
||
|
cmds.button('SCmidFrame', l="2", c=lambda *args: SCUI("mid"), bgc=[0.2, 0.4, 0.5])
|
||
|
cmds.button('SCmaxFrame', l="3", c=lambda *args: SCUI("max"), bgc=[0.45, 0.2, 0.5])
|
||
|
cmds.setParent('..')
|
||
|
cmds.scrollLayout('SCScrol', h=(mayaHSize * 0.95))
|
||
|
cmds.columnLayout()
|
||
|
cmds.frameLayout('meshSetupFrame', cll=1, cl=0, label="Mesh Setup", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
cmds.rowColumnLayout(nc=4, cw=[(1, 70), (2, 140), (3, 5), (4, 80)])
|
||
|
cmds.text(l='Base Mesh')
|
||
|
cmds.optionMenu('baseMeshMenu', bgc=[0.28, 0.28, 0.28], bsp=checkBaseMeshList, cc=lambda *args: (loadSymmetryState(), cageVisToggle(), showAllCutter(), updateVisLayer(), updateSnapState(), fadeOutCage(), rdMirrorUIUpdate()))
|
||
|
cmds.menuItem("NoBaseMeshMenu", label='No Base Mesh')
|
||
|
cmds.text(l='')
|
||
|
cmds.button('setBaseButton', l="Set", c=lambda *args: (checkBaseMeshList(), setCutterBaseMesh(), baseMeshColorUpdate(), updateVisLayer()), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
|
||
|
cmds.rowColumnLayout(nc=9, cw=[(1, 70), (2, 5), (3, 30), (4, 5), (5, 30), (6, 5), (7, 65), (8, 5), (9, 80)])
|
||
|
cmds.text(l='')
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton('meshLayerButton', h=20, w=30, c=lambda *args: toggleLayer(), style='iconOnly', image1='nodeGrapherModeAll.svg')
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton('meshColorUpdateButton', h=20, w=30, c=lambda *args: baseMeshColorUpdate(), style='iconOnly', image1='out_colorComposite_200.png')
|
||
|
cmds.text(l='')
|
||
|
cmds.button('reTargetButton', l="reTarget", c=lambda *args: reTarget(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('freeResultButton', l="Finalize", c=lambda *args: freeResultMesh(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
|
||
|
cmds.frameLayout('cutterFrame', cll=1, cl=0, label="Cutter", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
cmds.rowColumnLayout(nc=8, cw=[(1, 40), (2, 58), (3, 5), (4, 58), (5, 5), (6, 58), (7, 5), (8, 58)])
|
||
|
cmds.text(l='Show', h=20)
|
||
|
cmds.iconTextButton(w=40, style='textOnly', l="Selected", rpt=True, c=lambda *args: hideUnSelectedCutters(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton(w=40, style='textOnly', l="All", c=lambda *args: showAllCutter(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton(w=40, style='textOnly', l="None", c=lambda *args: hideAllCutter(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='', h=20)
|
||
|
cmds.iconTextButton(w=40, style='textOnly', l="Loop", rpt=True, c=lambda *args: showLastCutter(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=5, cw=[(1, 40), (2, 50), (3, 5), (4, 110), (5, 85)])
|
||
|
cmds.columnLayout()
|
||
|
cmds.text(l=' Cutter', h=50)
|
||
|
cmds.setParent('..')
|
||
|
cmds.columnLayout()
|
||
|
cmds.separator(height=1, style='none')
|
||
|
cmds.iconTextButton('newCutButton', h=23, w=50, style='textOnly', l="[ * ]", rpt=True, c=lambda *args: goPressCutter(4), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.separator(height=3, style='none')
|
||
|
cmds.iconTextButton('drawCutButton', h=23, w=50, style='textOnly', l="Draw", rpt=True, c=lambda *args: goDraw(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.intSliderGrp('cutterSideSlider', en=1, vis=0, v=4, min=3, max=6, s=1, cw3=[35, 40, 200], label="side ", field=True)
|
||
|
cmds.columnLayout()
|
||
|
cmds.rowColumnLayout(nc=5, cw=[(1, 30), (2, 5), (3, 30), (4, 5), (5, 30)])
|
||
|
cmds.iconTextButton('triButton', w=30, style='textOnly', l="3", rpt=True, c=lambda *args: goPressCutter(3), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton('pentaButton', w=30, style='textOnly', l="5", rpt=True, c=lambda *args: goPressCutter(5), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton('hexButton', w=30, style='textOnly', l="6", rpt=True, c=lambda *args: goPressCutter(6), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.separator(height=1, style='none')
|
||
|
cmds.setParent('..')
|
||
|
cmds.columnLayout()
|
||
|
cmds.iconTextButton('selCutButton', w=100, style='textOnly', l="Selected", rpt=True, c=lambda *args: useOwnCutterShape(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
cmds.columnLayout()
|
||
|
cmds.iconTextButton('dulCutButton', w=80, style='textOnly', l="Duplicate", rpt=True, c=lambda *args: cutterDulpicate(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.separator(height=4, style='none')
|
||
|
cmds.iconTextButton('comCutButton', w=80, style='textOnly', l="Combine", rpt=True, c=lambda *args: combineSelCutters(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
cmds.columnLayout()
|
||
|
cmds.floatSliderGrp('cutterScaleSlider', v=1, min=0.1, max=5, s=0.1, cw3=[40, 50, 190], label="Scale ", field=True)
|
||
|
cmds.floatField('cuterPreSize', value=1, vis=0)
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=8, cw=[(1, 40), (2, 58), (3, 5), (4, 58), (5, 5), (6, 58), (7, 5), (8, 58)])
|
||
|
cmds.text(l='Opera', h=10)
|
||
|
cmds.button('subsButton', l="Difference", c=lambda *args: cutterType("subs"), bgc=[0.3, 0.5, 0.6])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('unionButton', l="Union", c=lambda *args: cutterType("union"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('cutButton', l="After Cut", c=lambda *args: cutterType("cut"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('cutToNewMeshButton', l="New Grp", c=lambda *args: cutter2NewMeshGrp(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.setParent('..')
|
||
|
cmds.columnLayout()
|
||
|
cmds.rowColumnLayout(nc=6, cw=[(1, 40), (2, 80), (3, 5), (4, 80), (5, 5), (6, 80)])
|
||
|
cmds.text(l='Mirror', h=10)
|
||
|
cmds.button(w=50, l="X", c=lambda *args: cutterMirror("x"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button(w=50, l="Y", c=lambda *args: cutterMirror("y"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button(w=50, l="Z", c=lambda *args: cutterMirror("z"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
########################################################################################################################################################################
|
||
|
cmds.frameLayout('controlFrame', cll=1, cl=0, label="Control", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
cmds.rowColumnLayout(nc=6, cw=[(1, 40), (2, 80), (3, 5), (4, 80), (5, 5), (6, 80)])
|
||
|
cmds.text(l='', h=20)
|
||
|
cmds.button(w=50, l="Bevel", c=lambda *args: QBoxBevel(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button(w=50, l="Smooth", c=lambda *args: QBoxSmooth(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button(w=50, l="Remove", c=lambda *args: QBoxBevelRemove(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout()
|
||
|
cmds.columnLayout()
|
||
|
cmds.floatSliderGrp('fractionSlider', v=0.2, min=0.001, max=1, s=0.01, cw3=[55, 40, 180], label=" Fraction", field=True, cc=lambda *args: attributeFloatSlider("fraction"), dc=lambda *args: attributeFloatSlider("fraction"))
|
||
|
cmds.intSliderGrp('segmentsSlider', v=1, min=1, max=10, fmx=20, s=1, cw3=[55, 40, 180], label="Segments", field=True, cc=lambda *args: attributeIntSlider("segments"), dc=lambda *args: attributeIntSlider("segments"))
|
||
|
cmds.floatSliderGrp('depthSlider', v=1, min=-1, max=1, fmn=-3, fmx=3, s=1, cw3=[55, 40, 180], label="Depth", field=True, cc=lambda *args: attributeFloatSlider("depth"), dc=lambda *args: attributeFloatSlider("depth"))
|
||
|
cmds.setParent('..')
|
||
|
cmds.text(l='')
|
||
|
cmds.separator(height=5, style='none')
|
||
|
cmds.rowColumnLayout(nc=6, cw=[(1, 40), (2, 80), (3, 5), (4, 80), (5, 5), (6, 80)])
|
||
|
cmds.text(l='', h=10)
|
||
|
cmds.button('makePanelButton', w=50, l="Gap", c=lambda *args: makeGap(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('ScrapeButton', w=50, l="Scrape", c=lambda *args: scrapeCutter(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('removePanelButton', w=50, l="Remove", c=lambda *args: removeGap(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout()
|
||
|
cmds.columnLayout()
|
||
|
cmds.floatSliderGrp('gapSlider', v=0.3, min=0.01, max=5, fmx=20, s=0.01, cw3=[55, 40, 180], label="Gap ", field=True, cc=lambda *args: attributeGapSlider(), dc=lambda *args: attributeGapSlider())
|
||
|
cmds.floatSliderGrp('scrapeSlider', v=0.3, min=0.01, max=1, fmx=5, s=0.01, cw3=[55, 40, 180], label="Scrape ", field=True)
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
#######################################################################################################################################################################################
|
||
|
cmds.frameLayout('meshSymmetryFrame', cll=1, cl=1, label="Mesh Symmetry", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
buttonSize = 25
|
||
|
cmds.rowColumnLayout(nc=10, cw=[(1, 70), (2, buttonSize), (3, buttonSize), (4, buttonSize), (5, buttonSize), (6, buttonSize), (7, buttonSize), (8, buttonSize), (9, buttonSize), (10, buttonSize)])
|
||
|
cmds.text(l=' Direction')
|
||
|
cmds.text(l='X')
|
||
|
cmds.button('symmXButtonP', l="-", c=lambda *args: boolSymmetry("x", 1), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.button('symmXButtonN', l="+", c=lambda *args: boolSymmetry("x", 2), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='Y')
|
||
|
cmds.button('symmYButtonP', l="-", c=lambda *args: boolSymmetry("y", 1), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.button('symmYButtonN', l="+", c=lambda *args: boolSymmetry("y", 2), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='Z')
|
||
|
cmds.button('symmZButtonP', l="-", c=lambda *args: boolSymmetry("z", 1), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.button('symmZButtonN', l="+", c=lambda *args: boolSymmetry("z", 2), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=6, cw=[(1, 80), (2, 104), (3, 6), (4, 104)])
|
||
|
cmds.text(l='')
|
||
|
cmds.button(l="Reset", c=lambda *args: boolSymmetryReset(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button(l="Freeze", c=lambda *args: boolSymmetryFreeze(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=6, cw=[(1, 70), (2, 75), (3, 30), (4, 57), (5, 12), (6, 50)])
|
||
|
cmds.text(l=' Cage')
|
||
|
cmds.colorSliderGrp('CageColorSlider', l='', cw=[(1, 2), (2, 13)], rgb=(0.5, 0, 0), dc=lambda *args: updateCageColor())
|
||
|
cmds.iconTextButton(en=1, w=30, style='iconOnly', image1='eye.png')
|
||
|
cmds.floatSlider('CageTransparentSlider', min=0.1, max=1, value=0.5, step=0.1, dc=lambda *args: updateCageTransparent())
|
||
|
cmds.text(l='')
|
||
|
cmds.button(l='On/Off', w=35, bgc=[0.28, 0.28, 0.28], c=lambda *args: cageVisToggle())
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
|
||
|
cmds.frameLayout('meshRadialMirrorFrame', cll=1, cl=1, label="Mesh Radial Mirror", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
cmds.rowColumnLayout(nc=9, cw=[(1, 70), (2, 40), (3, 40), (4, 40), (5, 5), (6, 60), (7, 20), (8, 20)])
|
||
|
cmds.text(l='Axis')
|
||
|
cmds.button('rMirrorXButton', l="X", c=lambda *args: rdMirror("x"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.button('rMirrorYButton', l="Y", c=lambda *args: rdMirror("y"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.button('rMirrorZButton', l="Z", c=lambda *args: rdMirror("z"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.text(l='Half')
|
||
|
cmds.button('rMirrorNegButton', l="-", c=lambda *args: rdMirrorHalf("n"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.button('rMirrorPosButton', l="+", c=lambda *args: rdMirrorHalf("p"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=3, cw=[(1, 240), (2, 15), (3, 40)])
|
||
|
cmds.intSliderGrp('rMirrorSideSlider', v=1, min=3, max=15, fmx=20, s=1, cw3=[70, 40, 30], label="Side ", field=True, cc=lambda *args: rdMirrorUpdate(), dc=lambda *args: rdMirrorUpdate())
|
||
|
cmds.text(l='')
|
||
|
cmds.text(l='')
|
||
|
cmds.intSliderGrp('rMirrorOffsetSlider', v=10, min=-20, max=20, fmn=-200, fmx=200, s=1, cw3=[70, 40, 30], label="Offset ", field=True, cc=lambda *args: rdMirrorOffsetUpdate(), dc=lambda *args: rdMirrorOffsetUpdate())
|
||
|
cmds.text(l='')
|
||
|
cmds.button(l="Done", c=lambda *args: rdMirrorOutput(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
########################################################################################################################################################################
|
||
|
cmds.frameLayout('alignmentFrame', cll=1, cl=1, label="Alignment", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
cmds.rowColumnLayout(nc=8, cw=[(1, 40), (2, 50), (3, 5), (4, 50), (5, 5), (6, 50), (7, 10), (8, 80)])
|
||
|
cmds.text(l='Rotate', h=20)
|
||
|
cmds.iconTextButton(style='textOnly', l="X", rpt=True, c=lambda *args: QChangeCutterDir("X"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton(style='textOnly', l="Y", rpt=True, c=lambda *args: QChangeCutterDir("Y"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton(style='textOnly', l="Z", rpt=True, c=lambda *args: QChangeCutterDir("Z"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=4, cw=[(1, 40), (2, 200), (3, 5), (4, 170), (5, 50)])
|
||
|
cmds.text(l='Border', h=20)
|
||
|
cmds.intSliderGrp('bboxDivSlider', v=2, min=1, max=10, fmx=20, s=1, cw3=[10, 40, 170], label="", field=True, dc=lambda *args: borderAlginBBoxDivUpdate())
|
||
|
cmds.button('borderAlginButton', l='On/Off', w=50, bgc=[0.28, 0.28, 0.28], c=lambda *args: borderAlginBBoxToggle())
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=8, cw=[(1, 40), (2, 50), (3, 5), (4, 50), (5, 5), (6, 50), (7, 10), (8, 80)])
|
||
|
cmds.text(l='Axis', h=20)
|
||
|
cmds.button('toggleAxisX', l="X", c=lambda *args: toggleAxisButton("X"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('toggleAxisY', l="Y", c=lambda *args: toggleAxisButton("Y"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('toggleAxisZ', l="Z", c=lambda *args: toggleAxisButton("Z"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='', h=20)
|
||
|
cmds.button('toggleAxisXYZ', l="XYZ", c=lambda *args: toggleAxisButton("XYZ"), bgc=[0.3, 0.5, 0.6])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=6, cw=[(1, 40), (2, 80), (3, 5), (4, 80), (5, 5), (6, 80)])
|
||
|
cmds.text(l='Snap')
|
||
|
cmds.iconTextButton(w=50, style='textOnly', l="Border", rpt=True, c=lambda *args: alignCutterToBase(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton(w=50, style='textOnly', l="Last Cutter", rpt=True, c=lambda *args: alignLastCutter(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton(w=50, style='textOnly', l="Select Cutter", rpt=True, c=lambda *args: alignSelCutter(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=6, cw=[(1, 40), (2, 80), (3, 5), (4, 80), (5, 5), (6, 80)])
|
||
|
cmds.text(l='Even', h=20)
|
||
|
cmds.iconTextButton(w=50, style='textOnly', l="left / right", rpt=True, c=lambda *args: evenObjLineUp("x"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton(w=50, style='textOnly', l="up/ down", rpt=True, c=lambda *args: evenObjLineUp("y"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
########################################################################################################################################################################
|
||
|
cmds.frameLayout('patternFrame', cll=1, cl=1, label="Pattern", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
cmds.rowColumnLayout(nc=8, cw=[(1, 40), (2, 50), (3, 5), (4, 50), (5, 5), (6, 50), (7, 10), (8, 80)])
|
||
|
cmds.text(l='Type', h=20)
|
||
|
cmds.button('arrayLinear', l="Linear", c=lambda *args: toggleArrayType(), bgc=[0.3, 0.5, 0.6])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('arrayRadial', l="Radial", c=lambda *args: toggleArrayType(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.text(l='')
|
||
|
cmds.text(l='')
|
||
|
cmds.button(l="Freeze", c=lambda *args: instBake(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=8, cw=[(1, 40), (2, 50), (3, 5), (4, 50), (5, 5), (6, 50), (7, 10), (8, 80)])
|
||
|
cmds.text(l='Axis', h=20)
|
||
|
cmds.button('arrayAxisX', l="X", c=lambda *args: arrayPattrn("X"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('arrayAxisY', l="Y", c=lambda *args: arrayPattrn("Y"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('arrayAxisZ', l="Z", c=lambda *args: arrayPattrn("Z"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button(l="Remove", c=lambda *args: removeArrayGrp(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout()
|
||
|
cmds.columnLayout()
|
||
|
cmds.intSliderGrp('instNumSlider', v=1, min=1, max=10, fmx=20, s=1, cw3=[55, 40, 180], label="Number", field=True, cc=lambda *args: instReNew(), dc=lambda *args: instReNew())
|
||
|
cmds.floatSliderGrp('disSlider', v=1, min=-3, max=3, fmx=20, fmn=-20, s=0.01, cw3=[55, 40, 180], label="Distance", field=True, cc=lambda *args: instDistanceUpdate(), dc=lambda *args: instDistanceUpdate())
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
##########################################################################################################################################################################
|
||
|
cmds.frameLayout('liveDrawFrame', cll=1, cl=1, label="Live Draw", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
cmds.rowColumnLayout(nc=7, cw=[(1, 40), (2, 78), (3, 5), (4, 78), (5, 5), (6, 78)])
|
||
|
cmds.text(l='Grid')
|
||
|
cmds.iconTextButton('snapGridCameraVisButton', w=50, style='textOnly', l="Camera", c=lambda *args: snapGridCamera(), rpt=True, bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton('snapGridPointVisButton', w=50, style='textOnly', l="Point", c=lambda *args: goPressDraw(), rpt=True, bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.iconTextButton('snapGridVisToggleButton', w=50, style='textOnly', l="Remove", c=lambda *args: drawGirdOff(), rpt=True, bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.columnLayout()
|
||
|
cmds.intSliderGrp('snapGirdSize', v=10, min=1, max=50, fmx=100, s=1, cw3=[35, 40, 200], label="Grid ", field=True, dc=lambda *args: resizeSnapGrid())
|
||
|
cmds.intSliderGrp('snapGirdRot', v=0, min=0, max=90, s=1, cw3=[35, 40, 200], label="Rot ", field=True, dc=lambda *args: rotateSnapGrid())
|
||
|
cmds.floatSliderGrp('snapGirdOffset', v=0.1, min=0.01, max=3, fmx=20, s=0.01, cw3=[35, 40, 200], label="Offset", field=True, dc=lambda *args: offsetSnapGrid())
|
||
|
cmds.setParent('..')
|
||
|
cmds.rowColumnLayout(nc=6, cw=[(1, 40), (2, 78), (3, 5), (4, 78), (5, 5), (6, 78)])
|
||
|
cmds.text(l='Tools')
|
||
|
cmds.button('cureveDrawButtton', w=50, l="Draw Curve", c=lambda *args: drawCurveNow(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('buildBlockButton', w=50, l="Make Block", c=lambda *args: makeDrawBlock(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
##########################################################################################################################################################################
|
||
|
cmds.frameLayout('bakeFrame', cll=1, cl=1, label="Bake", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
cmds.rowColumnLayout(nc=6, cw=[(1, 40), (2, 80), (3, 5), (4, 80), (5, 5), (6, 80)])
|
||
|
cmds.text(l='', h=10)
|
||
|
cmds.button('bakeUnSelButton', w=50, l="Unselect", c=lambda *args: bakeCutter("unselect"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('bakeAllButton', w=50, l="All", c=lambda *args: bakeCutter("all"), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.text(l='')
|
||
|
cmds.button('bakeRestoreButton', w=50, l="Restore", c=lambda *args: restoreCutterWithSymmtry(), bgc=[0.28, 0.28, 0.28])
|
||
|
cmds.setParent('..')
|
||
|
cmds.setParent('..')
|
||
|
cmds.frameLayout('meshBevelManagerFrame', cll=1, cl=1, label="Mesh Bevel Manager", bgc=[0.14, 0.14, 0.14], w=300)
|
||
|
cmds.rowColumnLayout(nc=4, cw=[(1, 80), (2, 185), (3, 5), (4, 58)])
|
||
|
cmds.text(l='', h=20)
|
||
|
cmds.iconTextButton('preBevelButton', w=40, style='textOnly', l="Bevel Manager", rpt=True, c=lambda *args: jwSpeedCutBevelMangerSetup(), bgc=[0.14, 0.14, 0.14])
|
||
|
cmds.separator(height=15, style='none')
|
||
|
cmds.setParent('..')
|
||
|
cmds.separator(height=15, style='none')
|
||
|
cmds.showWindow(jwSpeedCutWin)
|
||
|
cmds.window("jwSpeedCutWin", e=True, w=320, h=1250)
|
||
|
cmds.commandEcho(state=False)
|
||
|
cmds.scriptEditorInfo(suppressWarnings=0, suppressInfo=0, se=0)
|
||
|
checkBaseMeshList()
|
||
|
allowedAreas = ['right', 'left']
|
||
|
cmds.dockControl('speedCutDock', l='Speed Cut', area='right', content='jwSpeedCutWin', allowedArea=allowedAreas, fcc=lambda *args: floatSCUIsize())
|
||
|
#start with floating UI
|
||
|
#cmds.dockControl('speedCutDock', l='speedCut 1.69', area='right', content = 'jwSpeedCutWin', allowedArea= allowedAreas, fcc =lambda: floatSCUIsize(),fl=1)
|
||
|
|
||
|
def SCUI(state):
|
||
|
frameList = {'meshSetupFrame','meshSymmetryFrame','meshRadialMirrorFrame','cutterFrame','controlFrame','alignmentFrame','patternFrame','bakeFrame','liveDrawFrame','meshBevelManagerFrame'}
|
||
|
midList = {'meshSetupFrame','cutterFrame','controlFrame'}
|
||
|
otherList = list(set(frameList) - set(midList))
|
||
|
if state == 'min':
|
||
|
for f in frameList:
|
||
|
cmds.frameLayout(f, e=1, cl= 1)
|
||
|
elif state == 'mid':
|
||
|
for m in midList:
|
||
|
cmds.frameLayout(m, e=1, cl= 0)
|
||
|
for o in otherList:
|
||
|
cmds.frameLayout(o, e=1, cl= 1)
|
||
|
elif state == 'max':
|
||
|
for f in frameList:
|
||
|
cmds.frameLayout(f, e=1, cl= 0)
|
||
|
|
||
|
def floatSCUIsize():
|
||
|
SCUI('mid')
|
||
|
checkState = cmds.dockControl('speedCutDock', q=1, fl=1)
|
||
|
mayaHSize = cmds.window('MayaWindow', q=1, h=1)
|
||
|
if checkState == 0:
|
||
|
cmds.scrollLayout('SCScrol', e=1, h=(mayaHSize * 0.95))
|
||
|
else:
|
||
|
cmds.scrollLayout('SCScrol', e=1, h=570)
|
||
|
cmds.dockControl('speedCutDock', e=1, h=570)
|
||
|
|
||
|
def cutter2NewMeshGrp():
|
||
|
selCut = cmds.ls(sl=1,l=1)
|
||
|
if len(selCut) == 1:
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
instBake()
|
||
|
selCut = cmds.ls(sl=1,l=1)
|
||
|
getOPType = cmds.getAttr(selCut[0]+'.cutterOp')
|
||
|
if getOPType != 'union':
|
||
|
#create new box shape by adding all union cutter and base mesh
|
||
|
meshNameGrp = selCut[0].split('|')[1]
|
||
|
meshName = meshNameGrp.replace('BoolGrp','')
|
||
|
liveCutterList = cmds.ls('|'+ meshNameGrp + '|' + meshName + '_cutterGrp|boxCutter*',l=True)
|
||
|
bakeCutterList = cmds.ls('|'+ meshNameGrp + '|' + meshName + '_bakeStep|bakeCutter*',l=True)
|
||
|
totalList = liveCutterList + bakeCutterList
|
||
|
collectUnionShape =[]
|
||
|
for t in totalList:
|
||
|
checkType = cmds.getAttr(t+'.cutterOp')
|
||
|
if checkType == 'union':
|
||
|
collectUnionShape.append(t)
|
||
|
if cmds.objExists('|'+ meshNameGrp + '|' + meshName + '_bakeStep|' + meshName + '_bakeBaseMesh'):
|
||
|
collectUnionShape.append('|'+ meshNameGrp + '|' + meshName + '_bakeStep|' + meshName + '_bakeBaseMesh')
|
||
|
else:
|
||
|
collectUnionShape.append('|'+ meshNameGrp + '|' + meshName)
|
||
|
dulMesh = cmds.duplicate(collectUnionShape, rr = True, un=True)
|
||
|
cmds.parent(dulMesh,w=1)
|
||
|
selList = cmds.ls(sl=1,fl=1,transforms=1,l=1)
|
||
|
while len(selList) > 1:
|
||
|
cmds.polyCBoolOp(selList[0], selList[1], op=1, ch=1, preserveColor=0, classification=1, name=selList[0])
|
||
|
cmds.DeleteHistory()
|
||
|
if cmds.objExists(selList[1]):
|
||
|
cmds.delete(selList[1])
|
||
|
cmds.rename(selList[0])
|
||
|
selList.remove(selList[1])
|
||
|
combineShape = cmds.ls(sl=1)
|
||
|
checkNumber = ''.join([n for n in selCut[0].split('|')[-1] if n.isdigit()])
|
||
|
cmds.rename(meshName + "bc" + str(checkNumber))
|
||
|
shadowMesh = cmds.ls(sl=1)
|
||
|
checkBaseMeshList()
|
||
|
cmds.select(shadowMesh)
|
||
|
setCutterBaseMesh()
|
||
|
updateVisLayer()
|
||
|
cutterShapeNode = cmds.listRelatives(selCut[0], s=True, f=True )
|
||
|
preCutShapeNode = cmds.listRelatives(shadowMesh[0], s=True, f=True )
|
||
|
dulCombineMesh = cmds.duplicate(preCutShapeNode, rr = True, un=True)
|
||
|
cmds.rename(dulCombineMesh, shadowMesh[0]+'_myInterMesh')
|
||
|
interMeshShapeNode = cmds.listRelatives(shadowMesh[0]+'_myInterMesh', s=True, f=True )
|
||
|
cmds.createNode('polyCBoolOp')
|
||
|
cmds.rename(shadowMesh[0]+'_myInter')
|
||
|
cmds.connectAttr((interMeshShapeNode[0]+'.outMesh'), (shadowMesh[0]+'_myInter.inputPoly[0]'),f=True)
|
||
|
cmds.connectAttr((interMeshShapeNode[0]+'.worldMatrix[0]'), (shadowMesh[0]+'_myInter.inputMat[0]'),f=True)
|
||
|
cmds.connectAttr((cutterShapeNode[0]+'.outMesh'), (shadowMesh[0]+'_myInter.inputPoly[1]'),f=True)
|
||
|
cmds.connectAttr((cutterShapeNode[0]+'.worldMatrix[0]'), (shadowMesh[0]+'_myInter.inputMat[1]'),f=True)
|
||
|
cmds.setAttr((shadowMesh[0]+'_myInter.operation'),3)
|
||
|
cmds.connectAttr((shadowMesh[0]+'_myInter.output'), (preCutShapeNode[0]+'.inMesh'),f=True)
|
||
|
cmds.select(selCut)
|
||
|
cmds.sets(name = (shadowMesh[0] + 'Shadow'), text= (shadowMesh[0] + 'Shadow'))
|
||
|
showAllCutter()
|
||
|
baseMeshColorUpdate()
|
||
|
cmds.setAttr((shadowMesh[0]+".translate"),0,0,0)
|
||
|
cmds.setAttr((shadowMesh[0]+".rotate"),0,0,0)
|
||
|
cmds.setAttr((shadowMesh[0]+".scale"),1,1,1)
|
||
|
else:
|
||
|
print('only work for different or after cut')
|
||
|
else:
|
||
|
print('select one cutter Only!')
|
||
|
|
||
|
def fixShadowLink():
|
||
|
listAllShadow = cmds.ls('*Shadow')
|
||
|
for l in listAllShadow:
|
||
|
checkNodeType = cmds.nodeType(l)
|
||
|
if checkNodeType == 'objectSet':
|
||
|
shadowName = cmds.sets(l,q=1)
|
||
|
targetName = l.replace('Shadow','')
|
||
|
if cmds.objExists((targetName +'BoolGrp')) == 0:
|
||
|
cmds.delete(l)
|
||
|
else:
|
||
|
cutterShapeNode = cmds.listRelatives(shadowName[0], s=True, f=True )
|
||
|
preCutShapeNode = cmds.listRelatives(targetName, s=True, f=True )
|
||
|
shapes = cmds.listRelatives((targetName+'_bool'), shapes=True)
|
||
|
shadeEng = cmds.listConnections(shapes , type = 'shadingEngine')
|
||
|
materials = cmds.ls(cmds.listConnections(shadeEng ), materials = True)
|
||
|
if cmds.objExists((targetName +'_myInter')) == 0:
|
||
|
cmds.createNode('polyCBoolOp')
|
||
|
cmds.rename(targetName+'_myInter')
|
||
|
cmds.connectAttr((preCutShapeNode[0]+'.outMesh'), (targetName+'_myInter.inputPoly[0]'),f=True)
|
||
|
cmds.connectAttr((preCutShapeNode[0]+'.worldMatrix[0]'), (targetName+'_myInter.inputMat[0]'),f=True)
|
||
|
cmds.connectAttr((cutterShapeNode[0]+'.outMesh'), (targetName+'_myInter.inputPoly[1]'),f=True)
|
||
|
cmds.connectAttr((cutterShapeNode[0]+'.worldMatrix[0]'), (targetName+'_myInter.inputMat[1]'),f=True)
|
||
|
cmds.setAttr((targetName+'_myInter.operation'),2)
|
||
|
cmds.connectAttr((targetName+'_myInter.output'), (targetName+'_preSubBoxShape.inMesh'),f=True)
|
||
|
else:
|
||
|
cmds.connectAttr((cutterShapeNode[0]+'.outMesh'), (targetName+'_myInter.inputPoly[1]'),f=True)
|
||
|
cmds.connectAttr((cutterShapeNode[0]+'.worldMatrix[0]'), (targetName+'_myInter.inputMat[1]'),f=True)
|
||
|
cmds.connectAttr((targetName+'_myInter.output'), (targetName+'_preSubBoxShape.inMesh'),f=True)
|
||
|
|
||
|
if cmds.objExists(targetName+'_ShaderSG'):
|
||
|
cmds.sets((targetName+'_bool'), e=True, forceElement = (targetName+'_ShaderSG'))
|
||
|
|
||
|
###################################################################################################################################################
|
||
|
def deSelect():
|
||
|
obj_shape = cmds.listRelatives(parent=True, f=True)
|
||
|
obj = cmds.listRelatives(obj_shape,parent=True, f=True)
|
||
|
cmds.select(obj)
|
||
|
cmds.selectMode(leaf=True)
|
||
|
cmd = "changeSelectMode -object;"
|
||
|
mel.eval(cmd)
|
||
|
cmds.select(clear=True)
|
||
|
|
||
|
def instDistanceUpdate():
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
checkMaster = myType[0]
|
||
|
checkDis = cmds.floatSliderGrp('disSlider',q=True, v = True )
|
||
|
checkState = cmds.attributeQuery('arrayOffset',node = checkMaster,ex=True)
|
||
|
if checkState == 1:
|
||
|
cmds.setAttr((checkMaster+'.arrayOffset'),checkDis)
|
||
|
|
||
|
def instReNew():
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
instRemove()
|
||
|
checkMaster = myType[0]
|
||
|
currentDir = cmds.getAttr(checkMaster+'.arrayDirection')
|
||
|
|
||
|
if myType[1] == 'linear':
|
||
|
instLinearAdd(currentDir)
|
||
|
else:
|
||
|
instRadAdd(currentDir)
|
||
|
|
||
|
def instTypeToggle():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
currentSel =cmds.ls(sl=1,fl=1)
|
||
|
if len(currentSel) == 1:
|
||
|
#case one Linear to Radial
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
getNumber = cmds.getAttr(myType[0]+'.arrayNumber')
|
||
|
getDis = cmds.getAttr(myType[0]+'.arrayOffset')
|
||
|
getDir = cmds.getAttr(myType[0]+'.arrayDirection')
|
||
|
cmds.intSliderGrp('instNumSlider', e=True, v = getNumber)
|
||
|
cmds.floatSliderGrp('disSlider',e=True, v = getDis)
|
||
|
if myType[1] == 'linear':
|
||
|
instRemove()
|
||
|
instRadAdd(getDir)
|
||
|
|
||
|
elif myType[1] == 'radial':
|
||
|
removeRadArray()
|
||
|
instLinearAdd(getDir)
|
||
|
|
||
|
def instLinearAdd(direction):
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if len(beseMesh) > 0:
|
||
|
selCutterCheck = cmds.ls(sl=1, fl=1, l=1, type='transform')
|
||
|
if 'boxCutter' in selCutterCheck[0]:
|
||
|
cmds.button('arrayLinear',e=True, bgc = [0.3, 0.5, 0.6] )
|
||
|
cmds.button('arrayRadial',e=True, bgc = [0.28,0.28,0.28])
|
||
|
myType = checkInstType()
|
||
|
instRemove()
|
||
|
dir = direction
|
||
|
arraySample = cmds.ls(sl=1,fl=1)
|
||
|
sourcePivot = cmds.xform(arraySample[0], q=1, ws=1 ,rp=1)
|
||
|
if 'boxCutter' in arraySample[0] and len(arraySample)==1:
|
||
|
bbox= cmds.xform(arraySample[0], q=1, ws=1, bb=1)
|
||
|
myLength = []
|
||
|
if dir == 'X':
|
||
|
myLength=math.sqrt((math.pow(bbox[0]-bbox[3],2)))
|
||
|
if dir == 'Y':
|
||
|
myLength=math.sqrt((math.pow(bbox[1]-bbox[4],2)))
|
||
|
if dir == 'Z':
|
||
|
myLength=math.sqrt((math.pow(bbox[2]-bbox[5],2)))
|
||
|
|
||
|
getIntNumber = []
|
||
|
getDist = []
|
||
|
|
||
|
if myType[1] == 'new':
|
||
|
getIntNumber = 2
|
||
|
getDist = 1.5
|
||
|
cmds.intSliderGrp('instNumSlider', e=True, v = 2)
|
||
|
cmds.floatSliderGrp('disSlider',e=True, v = 1.5)
|
||
|
else:
|
||
|
getIntNumber = cmds.intSliderGrp('instNumSlider', q=True, v = True)
|
||
|
checkState = cmds.attributeQuery('arrayOffset',node = myType[0],ex=True)
|
||
|
if checkState == 1:
|
||
|
getDist = cmds.getAttr(myType[0]+'.arrayOffset')
|
||
|
cmds.floatSliderGrp('disSlider',e=True, v = getDist)
|
||
|
#create Attr
|
||
|
if not cmds.attributeQuery('arrayNumber', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayNumber')
|
||
|
|
||
|
if not cmds.attributeQuery('arrayDirection', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayDirection' ,dt= 'string')
|
||
|
|
||
|
if not cmds.attributeQuery('arrayType', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayType',dt= 'string')
|
||
|
|
||
|
if not cmds.attributeQuery('arrayLength', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayLength')
|
||
|
|
||
|
if not cmds.attributeQuery('arrayOffset', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayOffset')
|
||
|
|
||
|
if not cmds.attributeQuery('arrayMaster', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayMaster' ,dt= 'string')
|
||
|
cmds.setAttr((arraySample[0]+'.arrayOffset'),1)
|
||
|
|
||
|
cmds.setAttr((arraySample[0]+'.arrayNumber'),getIntNumber)
|
||
|
cmds.setAttr((arraySample[0]+'.arrayDirection'),dir,type="string")
|
||
|
cmds.setAttr((arraySample[0]+'.arrayType'),'linear',type="string")
|
||
|
cmds.setAttr((arraySample[0]+'.arrayLength'),myLength)
|
||
|
cmds.setAttr((arraySample[0]+'.arrayMaster'),arraySample[0],type="string")
|
||
|
|
||
|
dirA = (arraySample[0]+'.translate'+dir)
|
||
|
collections=[]
|
||
|
|
||
|
for i in range(getIntNumber-1):
|
||
|
newIns = cmds.instance(arraySample[0])
|
||
|
collections.append(newIns[0])
|
||
|
if not cmds.attributeQuery('arrayOrder', node = newIns[0], ex=True ):
|
||
|
cmds.addAttr(newIns[0], ln='arrayOrder')
|
||
|
cmds.setAttr((newIns[0]+'.arrayOrder'),(i+1))
|
||
|
cmds.setAttr((arraySample[0] + '.arrayOffset'),getDist)
|
||
|
cmdTextA = (newIns[0] + '.translate' + dir + '= ' + arraySample[0] + '.arrayLength *' + arraySample[0] + '.arrayOffset *' + newIns[0] + '.arrayOrder +'+ dirA +';')
|
||
|
cmds.expression( s = cmdTextA, o = newIns[0], ae = True, uc = all)
|
||
|
attrList = {'translateX','translateY','translateZ','rotateX','rotateY','rotateZ','scaleX','scaleY','scaleZ'}
|
||
|
attrList.remove(('translate' + str(dir)))
|
||
|
for a in attrList:
|
||
|
cmds.connectAttr((arraySample[0]+'.' + a), (newIns[0] + '.' + a),f=True)
|
||
|
parent = cmds.listRelatives(arraySample[0], p=True )
|
||
|
if not 'ArrayGrp' in parent[0]:
|
||
|
cmds.group(arraySample[0],collections)
|
||
|
cmds.rename(arraySample[0]+'ArrayGrp')
|
||
|
|
||
|
cmds.xform((arraySample[0]+'ArrayGrp') ,ws=1, piv = (sourcePivot[0],sourcePivot[1],sourcePivot[2]))
|
||
|
cmds.setAttr( (arraySample[0]+".arrayNumber"),getIntNumber)
|
||
|
cmds.setAttr( (arraySample[0]+".arrayOffset"),getDist)
|
||
|
cmds.select((arraySample[0]+'ArrayGrp'))
|
||
|
fixBoolNodeConnection()
|
||
|
|
||
|
def toggleArrayType():
|
||
|
#toggle existing pattern
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
currentSel =cmds.ls(sl=1,fl=1)
|
||
|
checkState = cmds.button('arrayLinear', q=True , bgc =True )
|
||
|
if len(currentSel) == 1:
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
getNumber = cmds.getAttr(myType[0]+'.arrayNumber')
|
||
|
getDis = cmds.getAttr(myType[0]+'.arrayOffset')
|
||
|
getDir = cmds.getAttr(myType[0]+'.arrayDirection')
|
||
|
getGap = cmds.getAttr(myType[0]+'.panelGap')
|
||
|
cmds.intSliderGrp('instNumSlider', e=True, v = getNumber)
|
||
|
cmds.floatSliderGrp('disSlider',e=True, v = getDis)
|
||
|
cmds.floatSliderGrp('gapSlider',e=True, v = getGap)
|
||
|
if (checkState[0] < 0.285):
|
||
|
removeRadArray()
|
||
|
instLinearAdd(getDir)
|
||
|
|
||
|
else:
|
||
|
instRemove()
|
||
|
instRadAdd(getDir)
|
||
|
|
||
|
|
||
|
if (checkState[0] < 0.285):
|
||
|
cmds.button('arrayRadial' ,e=True, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('arrayLinear', e=True, bgc = [0.3, 0.5, 0.6] )
|
||
|
else:
|
||
|
cmds.button('arrayRadial' ,e=True, bgc = [0.3, 0.5, 0.6] )
|
||
|
cmds.button('arrayLinear', e=True, bgc = [0.28,0.28,0.28])
|
||
|
|
||
|
def arrayPattrn(dir):
|
||
|
checkState = cmds.button('arrayLinear', q=True , bgc =True )
|
||
|
if (checkState[0] > 0.285):#Linear
|
||
|
instLinearAdd(dir)
|
||
|
else:
|
||
|
instRadAdd(dir)
|
||
|
|
||
|
def checkInstType():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
arraySample = []
|
||
|
checkGrp = cmds.ls(sl=1,fl=1,l=1)
|
||
|
if 'ArrayGrp' in checkGrp[0]:
|
||
|
cmds.connectControl('disSlider', (''))
|
||
|
allChild = cmds.listRelatives(checkGrp[0], ad=True)
|
||
|
getShapeNode = cmds.ls(allChild,type ='shape')
|
||
|
listTransNode = cmds.listRelatives(getShapeNode, p=True )
|
||
|
arraySample = listTransNode
|
||
|
checkMaster = cmds.getAttr(arraySample[0]+'.arrayMaster')
|
||
|
checkMasterType = cmds.getAttr(arraySample[0]+'.arrayType')
|
||
|
cmds.floatSliderGrp('disSlider',e=True, en= True )
|
||
|
cmds.intSliderGrp('instNumSlider',e=True, en= True )
|
||
|
return (checkMaster,checkMasterType)
|
||
|
else:
|
||
|
if cmds.attributeQuery('arrayMaster', node = checkGrp[0], ex=True ):
|
||
|
checkMaster = cmds.getAttr(checkGrp[0]+'.arrayMaster')
|
||
|
checkMasterType = cmds.getAttr(checkGrp[0]+'.arrayType')
|
||
|
if checkMasterType != None:
|
||
|
return (checkMaster,checkMasterType)
|
||
|
else:
|
||
|
return ('new','new')
|
||
|
|
||
|
def removeArrayGrp():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selCutterCheck = cmds.ls(sl=1, fl=1, l=1, type='transform')
|
||
|
if len(selCutterCheck) == 1 and 'boxCutter' in selCutterCheck[0] and 'ArrayGrp' in selCutterCheck[0]:
|
||
|
myType = checkInstType()
|
||
|
cmds.select(myType[0])
|
||
|
if myType[1] == 'radial':
|
||
|
removeRadArray()
|
||
|
elif myType[1] == 'linear':
|
||
|
instRemove()
|
||
|
cmds.parent(myType[0],(beseMesh +'_cutterGrp'))
|
||
|
cmds.delete(myType[0]+'ArrayGrp')
|
||
|
cmds.setAttr((myType[0]+'.arrayType'),'new',type="string")
|
||
|
cmds.setAttr((myType[0]+'.arrayMaster'),'new',type="string")
|
||
|
|
||
|
def instLink():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
cmds.parent(beseMesh,beseMesh+'_cutterGrp')
|
||
|
|
||
|
def instRadReNew():
|
||
|
cmds.radioButtonGrp('arrayTypeButton',e=True, sl = 2)
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'radial':#lin
|
||
|
instLink()
|
||
|
removeRadArray()
|
||
|
checkMaster = myType[0]
|
||
|
if cmds.attributeQuery('arrayDirection', node = checkMaster, ex=True ):
|
||
|
currentDir = cmds.getAttr(checkMaster+'.arrayDirection')
|
||
|
instRadAdd(currentDir)
|
||
|
fixBoolNodeConnection()
|
||
|
instLink()
|
||
|
|
||
|
def instRadAdd(direction):
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selCutterCheck = cmds.ls(sl=1, fl=1, l=1, type='transform')
|
||
|
if len(beseMesh) > 0:
|
||
|
if 'boxCutter' in selCutterCheck[0] :
|
||
|
cmds.button('arrayLinear',e=True, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('arrayRadial',e=True, bgc = [0.3, 0.5, 0.6])
|
||
|
myType = checkInstType()
|
||
|
removeArrayGrp()
|
||
|
arraySample = cmds.ls(sl=1,fl=1)
|
||
|
dir = direction
|
||
|
getIntNumber = []
|
||
|
getDist = []
|
||
|
|
||
|
if myType[1] == 'new':
|
||
|
getIntNumber = 3
|
||
|
getDist = 1
|
||
|
cmds.intSliderGrp('instNumSlider', e=True, v = 3)
|
||
|
cmds.floatSliderGrp('disSlider',e=True, v = 1)
|
||
|
else:
|
||
|
getIntNumber = cmds.intSliderGrp('instNumSlider', q=True, v = True)
|
||
|
checkState = cmds.attributeQuery('arrayOffset',node = myType[0],ex=True)
|
||
|
if checkState == 1:
|
||
|
getDist = cmds.getAttr(myType[0]+'.arrayOffset')
|
||
|
cmds.floatSliderGrp('disSlider',e=True, v = getDist)
|
||
|
collection =[]
|
||
|
|
||
|
#create Attr
|
||
|
if not cmds.attributeQuery('arrayNumber', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayNumber')
|
||
|
|
||
|
if not cmds.attributeQuery('arrayDirection', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayDirection' ,dt= 'string')
|
||
|
|
||
|
if not cmds.attributeQuery('arrayType', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayType',dt= 'string')
|
||
|
|
||
|
if not cmds.attributeQuery('arrayOffset', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayOffset')
|
||
|
|
||
|
if not cmds.attributeQuery('arrayMaster', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayMaster' ,dt= 'string')
|
||
|
cmds.setAttr((arraySample[0]+'.arrayOffset'),1)
|
||
|
if not cmds.attributeQuery('arrayLength', node = arraySample[0], ex=True ):
|
||
|
cmds.addAttr(arraySample[0], ln='arrayLength')
|
||
|
|
||
|
cmds.setAttr((arraySample[0]+'.arrayNumber'),getIntNumber)
|
||
|
cmds.setAttr((arraySample[0]+'.arrayOffset'),getDist)
|
||
|
cmds.setAttr((arraySample[0]+'.arrayDirection'),dir,type="string")
|
||
|
cmds.setAttr((arraySample[0]+'.arrayType'),'radial',type="string")
|
||
|
cmds.setAttr((arraySample[0]+'.arrayMaster'),arraySample[0],type="string")
|
||
|
|
||
|
bbox= cmds.xform(arraySample[0], q=1, ws=1, bb=1)
|
||
|
length=math.sqrt((math.pow(bbox[0]-bbox[3],2)+math.pow(bbox[1]-bbox[4],2)+math.pow(bbox[2]-bbox[5],2))/3)
|
||
|
cmds.setAttr((arraySample[0]+'.arrayLength'),length)
|
||
|
|
||
|
sourcePivot = cmds.xform(arraySample[0], q=1, ws=1 ,rp=1)
|
||
|
|
||
|
rAngle = 360.0 / getIntNumber
|
||
|
#inst
|
||
|
collection = []
|
||
|
for i in range(getIntNumber-1):
|
||
|
cmds.select(arraySample[0])
|
||
|
cmds.instance()
|
||
|
newNode = cmds.ls(sl=True)
|
||
|
cmds.select(newNode)
|
||
|
cmds.group()
|
||
|
cmds.rename(newNode[0]+'_Trans')
|
||
|
cmds.group()
|
||
|
cmds.rename(newNode[0]+'_Rot')
|
||
|
collection.append(newNode[0]+'_Rot')
|
||
|
cmds.xform((newNode[0]+'_Rot') ,ws=1, piv = (sourcePivot[0],sourcePivot[1],sourcePivot[2]))
|
||
|
if dir == 'X':
|
||
|
cmds.rotate((rAngle*(i)+rAngle), 0 ,0, r=True, ws=True, fo=True)
|
||
|
elif dir == 'Y':
|
||
|
cmds.rotate(0,(rAngle*(i)+rAngle),0, r=True, ws=True, fo=True)
|
||
|
else:
|
||
|
cmds.rotate(0,0,(rAngle*(i)+rAngle), r=True, ws=True, fo=True)
|
||
|
# group master
|
||
|
cmds.select(arraySample[0])
|
||
|
cmds.group()
|
||
|
cmds.rename(arraySample[0]+'_Trans')
|
||
|
cmds.group()
|
||
|
cmds.rename(arraySample[0]+'_Rot')
|
||
|
collection.append(arraySample[0]+'_Rot')
|
||
|
cmds.xform((arraySample[0]+'_Rot') ,ws=1, piv = (sourcePivot[0],sourcePivot[1],sourcePivot[2]))
|
||
|
|
||
|
cmds.select(collection)
|
||
|
cmds.group()
|
||
|
cmds.rename(arraySample[0]+'ArrayGrp')
|
||
|
OffsetDir =[]
|
||
|
|
||
|
if dir == 'X':
|
||
|
OffsetDir = 'Y'
|
||
|
elif dir == 'Y':
|
||
|
OffsetDir = 'X'
|
||
|
else:
|
||
|
OffsetDir = 'X'
|
||
|
|
||
|
for c in collection:
|
||
|
cutterName = c.replace('_Rot', '')
|
||
|
cmdTextA = (cutterName + '_Trans.translate' + OffsetDir + '= ' + arraySample[0] + '.arrayLength *' + arraySample[0] + '.arrayOffset;')
|
||
|
cmds.expression( s = cmdTextA, o = (arraySample[0] + '_Trans.translate'), ae = True, uc = all)
|
||
|
cmds.select((arraySample[0]+'ArrayGrp'))
|
||
|
cmds.xform((arraySample[0]+'ArrayGrp') ,ws=1, piv = (sourcePivot[0],sourcePivot[1],sourcePivot[2]))
|
||
|
attrList = {'translateX','translateY','translateZ','rotateX','rotateY','rotateZ','scaleX','scaleY','scaleZ'}
|
||
|
if cutterName != arraySample[0]:
|
||
|
for a in attrList:
|
||
|
cmds.connectAttr((arraySample[0]+'.' + a), (cutterName + '.' + a),f=True)
|
||
|
|
||
|
cmds.setAttr( (arraySample[0]+".arrayNumber"),getIntNumber)
|
||
|
cmds.setAttr( (arraySample[0]+".arrayOffset"),getDist)
|
||
|
fixBoolNodeConnection()
|
||
|
|
||
|
def removeRadArray():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
boolNode = cmds.listConnections(cmds.listHistory((beseMesh +'_bool'),f=1),type='polyCBoolOp')
|
||
|
myType = checkInstType()
|
||
|
if myType[1] == 'radial':
|
||
|
arraySample = myType[0]
|
||
|
if cmds.objExists(arraySample+'_Rot*'):
|
||
|
cmds.select(arraySample+'_Rot*')
|
||
|
listRArray = cmds.ls(sl=1,fl=1)
|
||
|
cmds.delete(listRArray[1:len(listRArray)])
|
||
|
cmds.parent(arraySample,beseMesh+'_cutterGrp')
|
||
|
sourcePivot = cmds.xform((arraySample+'_Rot'), q=1, ws=1 ,rp=1)
|
||
|
cmds.select(arraySample)
|
||
|
cmds.move( sourcePivot[0],sourcePivot[1],sourcePivot[2],rpr=True)
|
||
|
if cmds.objExists(arraySample+'ArrayGrp'):
|
||
|
cmds.delete(arraySample+'ArrayGrp')
|
||
|
if cmds.objExists(arraySample+'ArrayGrp'):
|
||
|
cmds.delete(arraySample+'ArrayGrp')
|
||
|
|
||
|
shapeNode = cmds.listRelatives(arraySample, s=True )
|
||
|
listConnect = cmds.connectionInfo((shapeNode[0]+'.outMesh'), dfs=True )
|
||
|
if len(listConnect)>0:
|
||
|
for a in listConnect:
|
||
|
cmds.disconnectAttr((shapeNode[0]+'.outMesh'), a)
|
||
|
checkNumber = ''.join([n for n in arraySample.split('|')[-1] if n.isdigit()])
|
||
|
cmds.connectAttr( (shapeNode[0]+".outMesh"), ((boolNode[0]+'.inputPoly['+str(checkNumber)+']')),f=True)
|
||
|
cmds.connectAttr( (shapeNode[0]+".worldMatrix[0]"), ((boolNode[0]+'.inputMat['+str(checkNumber)+']')),f=True)
|
||
|
cmds.select(arraySample)
|
||
|
|
||
|
def instBake():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkSel = cmds.ls(sl=True)
|
||
|
if len(checkSel) > 0:
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
opType = cmds.getAttr(myType[0]+'.cutterOp')
|
||
|
arraySample = myType[0]
|
||
|
sourcePivot = cmds.xform((arraySample+'ArrayGrp'), q=1, ws=1 ,rp=1)
|
||
|
cmds.select(arraySample+'ArrayGrp')
|
||
|
cmds.select(hi=True)
|
||
|
cmds.select(arraySample,d=True)
|
||
|
cmds.select((arraySample+'ArrayGrp'),d=True)
|
||
|
cutterList = cmds.ls('boxCutter*',sl=True,type='transform')
|
||
|
cmds.select(arraySample)
|
||
|
cmds.ConvertInstanceToObject()
|
||
|
if myType[1] == 'radial':
|
||
|
cmds.parent(arraySample,(arraySample+'ArrayGrp'))
|
||
|
unInstanceMesh = cmds.ls(sl=1,fl=1, l=1)
|
||
|
for c in cutterList:
|
||
|
if '_Rot' not in c and '_Trans' not in c and 'ArrayGrp' not in c:
|
||
|
if myType[1] == 'radial':
|
||
|
cmds.parent(c , (arraySample + 'ArrayGrp'))
|
||
|
cmds.select(arraySample,r=True)
|
||
|
cmds.duplicate()
|
||
|
newNode=cmds.ls(sl=True)
|
||
|
cmds.select(c,add=1)
|
||
|
cmds.matchTransform(pos =True,rot=True)
|
||
|
cmds.delete(c)
|
||
|
cmds.rename(newNode,c)
|
||
|
for c in cutterList:
|
||
|
if '_Rot' in c :
|
||
|
cmds.delete(c)
|
||
|
cmds.select(arraySample+'ArrayGrp')
|
||
|
cmds.select(hi=True)
|
||
|
cmds.select((arraySample+'ArrayGrp'),d=True)
|
||
|
listNew = cmds.ls('boxCutter*',sl=True,type='transform')
|
||
|
for n in listNew:
|
||
|
cmds.rename(n,'tempCutter01')
|
||
|
listBake=cmds.ls('tempCutter*',s=1)
|
||
|
while len(listBake) > 1:
|
||
|
cmds.polyCBoolOp(listBake[0], listBake[1], op=1, ch=1, preserveColor=0, classification=1, name=listBake[0])
|
||
|
cmds.DeleteHistory()
|
||
|
if cmds.objExists(listBake[1]):
|
||
|
cmds.delete(listBake[1])
|
||
|
cmds.rename(listBake[0])
|
||
|
listBake.remove(listBake[1])
|
||
|
#in case cutterGrp will get delete when delete history
|
||
|
if cmds.objExists((beseMesh +'_cutterGrp')) == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'_cutterGrp'))
|
||
|
cmds.parent((beseMesh +'_cutterGrp'),(beseMesh +'BoolGrp'))
|
||
|
cmds.select(listBake[0])
|
||
|
useOwnCutterShape()
|
||
|
newCutter = cmds.ls(sl=True, fl=True)
|
||
|
cmds.rename(newCutter[0],arraySample)
|
||
|
cmds.xform(arraySample ,ws=1, piv = (sourcePivot[0],sourcePivot[1],sourcePivot[2]))
|
||
|
if cmds.objExists(arraySample+'ArrayGrp'):
|
||
|
cmds.delete(arraySample+'ArrayGrp')
|
||
|
cmds.ogs(reset =1)
|
||
|
if not cmds.attributeQuery('cutterOp', node = arraySample, ex=True ):
|
||
|
cmds.addAttr(arraySample, ln='cutterOp', dt= 'string')
|
||
|
cmds.setAttr((arraySample+'.cutterOp'),e=True, keyable=True)
|
||
|
cmds.setAttr((arraySample+'.cutterOp'),opType,type="string")
|
||
|
cmds.select(arraySample)
|
||
|
fixBoolNodeConnection()
|
||
|
else:
|
||
|
print('nothing selected!')
|
||
|
|
||
|
def instRemove():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
myType = checkInstType()
|
||
|
if myType[1] == 'linear':
|
||
|
arraySample = myType[0]
|
||
|
listA = cmds.listConnections(arraySample,type = 'expression')
|
||
|
if listA != None:
|
||
|
listA = set(listA)
|
||
|
collectInst=[]
|
||
|
for l in listA:
|
||
|
checkConnection = cmds.connectionInfo( (l+'.output[0]'), dfs=True)
|
||
|
mesh = checkConnection[0].split(".")[0]
|
||
|
collectInst.append(mesh)
|
||
|
cmds.delete(collectInst)
|
||
|
shapeNode = cmds.listRelatives(arraySample, s=True )
|
||
|
listConnect = cmds.connectionInfo((shapeNode[0]+'.outMesh'), dfs=True )
|
||
|
if len(listConnect)>0:
|
||
|
for a in listConnect:
|
||
|
cmds.disconnectAttr((shapeNode[0]+'.outMesh'), a)
|
||
|
checkNumber = ''.join([n for n in arraySample.split('|')[-1] if n.isdigit()])
|
||
|
if cmds.objExists(beseMesh + '_mySubs') == 0:
|
||
|
restoreCutterWithSymmtry()
|
||
|
|
||
|
setType = cmds.getAttr(arraySample+'.cutterOp')
|
||
|
|
||
|
cmds.connectAttr( (shapeNode[0]+".outMesh"), ((beseMesh +'_my' + setType.title() + '.inputPoly['+str(checkNumber)+']')),f=True)
|
||
|
cmds.connectAttr( (shapeNode[0]+".worldMatrix[0]"), ((beseMesh +'_my' + setType.title() +'.inputMat['+str(checkNumber)+']')),f=True)
|
||
|
cmds.select(arraySample)
|
||
|
checkGap = cmds.getAttr(arraySample + '.panelGap')
|
||
|
if checkGap > 0:
|
||
|
makeGap()
|
||
|
cmds.floatSliderGrp('gapSlider',e=True, en= True,v=checkGap )
|
||
|
|
||
|
#######################################################################################################################################################################################
|
||
|
#######################################################################################################################################################################################
|
||
|
def moveRightItem():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selListRight = cmds.textScrollList('bevelList', q=True, si=True)
|
||
|
checkState = cmds.iconTextButton('visRight', q = True , image1 = True)
|
||
|
if selListRight != None:
|
||
|
if len(selListRight) > 0:
|
||
|
cmds.textScrollList('nonBevelList',edit = True, da = True)
|
||
|
for s in selListRight:
|
||
|
cmds.textScrollList('bevelList',edit = True, ri = s)
|
||
|
cmds.textScrollList('nonBevelList',edit = True, si = s, append = s)
|
||
|
sortBevelList()
|
||
|
for s in selListRight:
|
||
|
cmds.textScrollList('nonBevelList',edit = True, si = s)
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
if checkState == 'nodeGrapherSoloed.svg':
|
||
|
cmds.setAttr((longName + '.visibility'), 1)
|
||
|
else:
|
||
|
cmds.setAttr((longName + '.visibility'), 0)
|
||
|
cmds.setAttr((longName+'.preBevel'),0)
|
||
|
|
||
|
def moveLeftItem():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selListLeft = cmds.textScrollList('nonBevelList', q=True, si=True)
|
||
|
checkState = cmds.iconTextButton('visLeft', q = True , image1 = True)
|
||
|
if selListLeft != None:
|
||
|
if len(selListLeft) > 0:
|
||
|
cmds.textScrollList('bevelList',edit = True, da = True)
|
||
|
for s in selListLeft:
|
||
|
cmds.textScrollList('nonBevelList',edit = True, ri = s)
|
||
|
cmds.textScrollList('bevelList',edit = True, si = s ,append = s)
|
||
|
sortBevelList()
|
||
|
for s in selListLeft:
|
||
|
cmds.textScrollList('bevelList',edit = True, si = s)
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
if checkState == 'nodeGrapherSoloed.svg':
|
||
|
cmds.setAttr((longName + '.visibility'), 1)
|
||
|
else:
|
||
|
cmds.setAttr((longName + '.visibility'), 0)
|
||
|
cmds.setAttr((longName+'.preBevel'),1)
|
||
|
|
||
|
def reselctList():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
currentSel = cmds.ls(sl=True,l=True)
|
||
|
cmds.textScrollList('nonBevelList', e=True, da=True)
|
||
|
selListRight = cmds.textScrollList('nonBevelList', q=True, ai=True)
|
||
|
if selListRight != None:
|
||
|
for c in currentSel:
|
||
|
shortName = c.split('|')[-1]
|
||
|
for s in selListRight:
|
||
|
if shortName == s:
|
||
|
cmds.textScrollList('nonBevelList',edit = True, si = shortName)
|
||
|
|
||
|
cmds.textScrollList('bevelList', e=True, da=True)
|
||
|
selListLeft = cmds.textScrollList('bevelList', q=True, ai=True)
|
||
|
if selListLeft != None:
|
||
|
for c in currentSel:
|
||
|
shortName = c.split('|')[-1]
|
||
|
for s in selListLeft:
|
||
|
if shortName == s:
|
||
|
cmds.textScrollList('bevelList',edit = True, si = shortName)
|
||
|
|
||
|
def togglevisLeft():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkState = cmds.iconTextButton('visLeft', q = True , image1 = True)
|
||
|
selListLeft = cmds.textScrollList('bevelList', q=True, ai=True)
|
||
|
if checkState == 'nodeGrapherSoloed.svg':
|
||
|
cmds.iconTextButton('visLeft', e = True , image1 = 'circle.png')
|
||
|
if selListLeft != None and len(selListLeft) > 0:
|
||
|
for s in selListLeft:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
cmds.setAttr((longName + '.visibility'), 0)
|
||
|
else:
|
||
|
cmds.iconTextButton('visLeft', e = True , image1 = 'nodeGrapherSoloed.svg')
|
||
|
if selListLeft != None and len(selListLeft) > 0:
|
||
|
for s in selListLeft:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
cmds.setAttr((longName + '.visibility'), 1)
|
||
|
|
||
|
def togglevisRight():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkState = cmds.iconTextButton('visRight', q = True , image1 = True)
|
||
|
selListRight = cmds.textScrollList('nonBevelList', q=True, ai=True)
|
||
|
if checkState == 'nodeGrapherSoloed.svg':
|
||
|
cmds.iconTextButton('visRight', e = True , image1 = 'circle.png')
|
||
|
if selListRight != None and len(selListRight) > 0:
|
||
|
for s in selListRight:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
cmds.setAttr((longName + '.visibility'), 0)
|
||
|
else:
|
||
|
cmds.iconTextButton('visRight', e = True , image1 = 'nodeGrapherSoloed.svg')
|
||
|
if selListRight != None and len(selListRight) > 0:
|
||
|
for s in selListRight:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
cmds.setAttr((longName + '.visibility'), 1)
|
||
|
|
||
|
def selBevelList():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selList = cmds.textScrollList('bevelList', q=True, si=True)
|
||
|
cmds.textScrollList('nonBevelList',edit = True, da = True)
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + selList[0]
|
||
|
cmds.select(longName, r=True)
|
||
|
|
||
|
def selNonBevelList():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selList = cmds.textScrollList('nonBevelList', q=True, si=True)
|
||
|
cmds.textScrollList('bevelList',edit = True, da = True)
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + selList[0]
|
||
|
cmds.select(longName, r=True)
|
||
|
|
||
|
def visListOn():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selListLeft = cmds.textScrollList('bevelList', q=True, ai=True)
|
||
|
cmds.iconTextButton('visLeft', e = True , image1 = 'nodeGrapherSoloed.svg')
|
||
|
if selListLeft != None and len(selListLeft) > 0:
|
||
|
for s in selListLeft:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
cmds.setAttr((longName + '.visibility'), 1)
|
||
|
|
||
|
selListRight = cmds.textScrollList('nonBevelList', q=True, ai=True)
|
||
|
cmds.iconTextButton('visRight', e = True , image1 = 'nodeGrapherSoloed.svg')
|
||
|
if selListRight != None and len(selListRight) > 0:
|
||
|
for s in selListRight:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
cmds.setAttr((longName + '.visibility'), 1)
|
||
|
cmds.setAttr((beseMesh+'_bakeStep.visibility'),1)
|
||
|
|
||
|
def visListOff():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selListLeft = cmds.textScrollList('bevelList', q=True, ai=True)
|
||
|
cmds.iconTextButton('visLeft', e = True , image1 = 'circle.png')
|
||
|
if selListLeft != None and len(selListLeft) > 0:
|
||
|
for s in selListLeft:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
cmds.setAttr((longName + '.visibility'), 0)
|
||
|
|
||
|
selListRight = cmds.textScrollList('nonBevelList', q=True, ai=True)
|
||
|
cmds.iconTextButton('visRight', e = True , image1 = 'circle.png')
|
||
|
if selListRight != None and len(selListRight) > 0:
|
||
|
for s in selListRight:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + s
|
||
|
cmds.setAttr((longName + '.visibility'), 0)
|
||
|
cmds.setAttr((beseMesh+'_bakeStep.visibility'),1)
|
||
|
|
||
|
def loadBevelList():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
list = cmds.ls('bakeCutter*',type='transform',l=True)
|
||
|
if len(list) > 0:
|
||
|
cleanList = []
|
||
|
for l in list:
|
||
|
if beseMesh in l:
|
||
|
cleanList.append(l)
|
||
|
cmds.textScrollList('bevelList',edit = True, ra = True)
|
||
|
cmds.textScrollList('nonBevelList',edit = True, ra = True)
|
||
|
for c in cleanList:
|
||
|
shortName = c.split('|')[-1]
|
||
|
checkState = cmds.getAttr(c+'.preBevel')
|
||
|
if checkState == 1:
|
||
|
cmds.textScrollList('bevelList',edit = True, append = shortName)
|
||
|
else:
|
||
|
cmds.textScrollList('nonBevelList',edit = True, append = shortName)
|
||
|
|
||
|
def publishFinal():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if len(beseMesh) > 0:
|
||
|
if cmds.objExists(beseMesh + '_publishMesh'):
|
||
|
print('publishMesh existed!')
|
||
|
|
||
|
else:
|
||
|
if cmds.objExists(beseMesh + '_preBevelMeshFinal'):
|
||
|
newNode = cmds.duplicate((beseMesh + '_preBevelMeshFinal'),rr = True, un=True)
|
||
|
cmds.rename(newNode[0],(beseMesh + '_publishMesh'))
|
||
|
cmds.parent((beseMesh + '_publishMesh'),w=True)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.setAttr((beseMesh+ 'BoolGrp.visibility'),0)
|
||
|
else:
|
||
|
if cmds.objExists(beseMesh + '_preBaseMesh'):
|
||
|
newNode = cmds.duplicate((beseMesh + '_preBaseMesh'),rr = True, un=True)
|
||
|
cmds.rename(newNode[0],(beseMesh + '_publishMesh'))
|
||
|
cmds.parent((beseMesh + '_publishMesh'),w=True)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.setAttr((beseMesh+ 'BoolGrp.visibility'),0)
|
||
|
else:
|
||
|
print('nothing to publish')
|
||
|
|
||
|
def preCheckBevelByVolumn():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
bbox = cmds.xform(beseMesh, q=True, ws=True, bbi=True)
|
||
|
disX = math.sqrt((bbox[3] - bbox[0])*(bbox[3] - bbox[0]))
|
||
|
disY = math.sqrt((bbox[4] - bbox[1])*(bbox[4] - bbox[1]))
|
||
|
disZ = math.sqrt((bbox[5] - bbox[2])*(bbox[5] - bbox[2]))
|
||
|
baseVolumn = disX * disY *disZ
|
||
|
guildVolumn = baseVolumn * 0.01 # 5% of base
|
||
|
#check all cutter
|
||
|
cmds.select((beseMesh+'_bakeStep'), hi=True)
|
||
|
cmds.select((beseMesh+'_bakeStep'),d=True)
|
||
|
cmds.select((beseMesh+'_bakeBaseMesh'),d=True)
|
||
|
sel = cmds.ls(sl=1,fl=1,type='transform',l=True)
|
||
|
cmds.select(cl=True)
|
||
|
for s in sel:
|
||
|
checkState = cmds.getAttr(s+'.statePanel')# skip if gap or panel
|
||
|
if not cmds.attributeQuery('preBevel', node = s, ex=True ):
|
||
|
cmds.addAttr(s, ln='preBevel', at = "float" )
|
||
|
cmds.setAttr((s+'.preBevel'), 0)
|
||
|
checkStateBevel = cmds.getAttr(s+'.preBevel')# already Made as non bevel
|
||
|
if checkState == 0 and checkStateBevel == 1 :
|
||
|
bbox = cmds.xform(s, q=True, ws=True, bbi=True)
|
||
|
disX = math.sqrt((bbox[3] - bbox[0])*(bbox[3] - bbox[0]))
|
||
|
disY = math.sqrt((bbox[4] - bbox[1])*(bbox[4] - bbox[1]))
|
||
|
disZ = math.sqrt((bbox[5] - bbox[2])*(bbox[5] - bbox[2]))
|
||
|
volumn = disX * disY *disZ
|
||
|
if volumn < guildVolumn:
|
||
|
cmds.setAttr((s+'.preBevel'), 0)
|
||
|
else:
|
||
|
cmds.setAttr((s+'.preBevel'), 1)
|
||
|
|
||
|
def removeNonBevelList():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if len(beseMesh) > 0:
|
||
|
removeLeftOver()
|
||
|
cmds.setAttr(beseMesh + '_preBevel.visibility',1)
|
||
|
cmds.rename((beseMesh + '_preBevel'),(beseMesh + '_preBaseMesh'))
|
||
|
list = cmds.listHistory((beseMesh + '_preBaseMesh'))
|
||
|
for l in list:
|
||
|
nodeTypeA = cmds.nodeType(l)
|
||
|
if nodeTypeA == 'polyBevel3':
|
||
|
cmds.rename(l,(beseMesh+'_edgePreBevel'))
|
||
|
elif nodeTypeA == 'polyExtrudeFace':
|
||
|
cmds.rename(l,(beseMesh+'_lcokFace'))
|
||
|
else:
|
||
|
pass
|
||
|
offsetV = cmds.floatSliderGrp('offsetSliderPre',q=1, v =True)
|
||
|
lockV = cmds.floatSliderGrp('lockFaceSliderPre',q=1, v =True)
|
||
|
segV = cmds.intSliderGrp('segmentSliderPre', q=1, v =True)
|
||
|
miterV = cmds.intSliderGrp('miteringSliderPre', q=1,v =True)
|
||
|
cmds.setAttr((beseMesh+'_lcokFace.offset'),lockV)
|
||
|
cmds.setAttr((beseMesh+'_edgePreBevel.segments'), segV)
|
||
|
cmds.setAttr((beseMesh+'_edgePreBevel.mitering'), miterV)
|
||
|
cmds.setAttr((beseMesh+'_edgePreBevel.offset'), offsetV)
|
||
|
visListOff()
|
||
|
outlineClean()
|
||
|
cmds.button('addPreBButton',e=True,en=False)
|
||
|
cmds.button('removePreBButton',e=True,en=True)
|
||
|
cmds.button('addPreNonBButton',e=True,en=True)
|
||
|
cmds.button('removePreNonBButton',e=True,en=False)
|
||
|
cmds.floatSliderGrp('lockFaceSliderPre',e=1, en=0)
|
||
|
cmds.floatSliderGrp('offsetSliderPre',e=1, en=1)
|
||
|
cmds.intSliderGrp('segmentSliderPre',e=1, en=1)
|
||
|
cmds.intSliderGrp('miteringSliderPre',e=1, en=1)
|
||
|
cmds.connectControl('segmentSliderPre', (beseMesh+'_edgePreBevel.segments'))
|
||
|
cmds.connectControl('miteringSliderPre',(beseMesh+'_edgePreBevel.mitering'))
|
||
|
cmds.connectControl('offsetSliderPre', (beseMesh+'_edgePreBevel.offset'))
|
||
|
if cmds.objExists(beseMesh + '_preBevelGrp'):
|
||
|
cmds.delete(beseMesh + '_preBevelGrp')
|
||
|
cmds.select((beseMesh + '_preBaseMesh'))
|
||
|
|
||
|
def addNonBevelList():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists(beseMesh + '_boolNonBevelUnion') == 0 or cmds.objExists(beseMesh + '_boolNonBevelSubs') == 0 or cmds.objExists(beseMesh + '_boolNonBevelCut') == 0:
|
||
|
if len(beseMesh) > 0:
|
||
|
boolPreNonBevel()
|
||
|
visListOff()
|
||
|
#outlineClean()
|
||
|
cmds.intSliderGrp('segmentSliderPre',e=True,en=True)
|
||
|
cmds.intSliderGrp('miteringSliderPre',e=True,en=True)
|
||
|
cmds.button('addPreBButton',e=True,en=False)
|
||
|
cmds.button('removePreBButton',e=True,en=True)
|
||
|
cmds.button('addPreNonBButton',e=True,en=False)
|
||
|
cmds.button('removePreNonBButton',e=True,en=True)
|
||
|
cmds.button('removeLockButton', e=1, en = 0)
|
||
|
cmds.button('removePreBButton', e=1, en = 0)
|
||
|
cmds.intSliderGrp('segmentSliderPre',e=1, en=0)
|
||
|
cmds.intSliderGrp('miteringSliderPre',e=1, en=0)
|
||
|
|
||
|
def rebuildPreview():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if len(beseMesh) > 0:
|
||
|
if cmds.objExists('*preBevel*'):
|
||
|
cmds.delete('*preBevel*')
|
||
|
if cmds.objExists('*_preBaseMesh*'):
|
||
|
cmds.delete('*_preBaseMesh*')
|
||
|
if cmds.objExists('*boolNon*'):
|
||
|
cmds.delete('*boolNon*')
|
||
|
cmds.setAttr((beseMesh +'BoolGrp.visibility'),1)
|
||
|
cmds.setAttr((beseMesh +'_bool.visibility'),1)
|
||
|
cmds.button('addPreBButton',e=True,en=False)
|
||
|
cmds.button('removePreBButton',e=True,en=False)
|
||
|
|
||
|
def killPreview():
|
||
|
rebuildPreview()
|
||
|
restoreCutter()
|
||
|
cmds.button('addPreBButton',e=True,en=False)
|
||
|
cmds.button('removePreBButton',e=True,en=False)
|
||
|
cmds.button('addPreNonBButton',e=True,en=False)
|
||
|
cmds.button('removePreNonBButton',e=True,en=False)
|
||
|
cmds.button('removeLockButton',e=True,en=False)
|
||
|
cmds.button('addLockButton',e=True,en=False)
|
||
|
cmds.button('addCutButton',e=True,en=True)
|
||
|
|
||
|
|
||
|
#if cmds.window("jwSpeedCutBevelManger", exists = True):
|
||
|
# cmds.deleteUI("jwSpeedCutBevelManger")
|
||
|
|
||
|
def preBevelUpdate():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if len(beseMesh) > 0:
|
||
|
cutUpdate()
|
||
|
lcokUpdate()
|
||
|
addPreBevelEdgeRun()
|
||
|
addNonBevelList()
|
||
|
cmds.floatSliderGrp('lockFaceSliderPre',e=1, en=1)
|
||
|
cmds.floatSliderGrp('offsetSliderPre', e=True, v = 1, min = 0.001, max = 1, fmx = 10)
|
||
|
|
||
|
def cutUpdate():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
offsetV = cmds.floatSliderGrp('offsetSliderPre',q=1, v =True)
|
||
|
lockV = cmds.floatSliderGrp('lockFaceSliderPre',q=1, v =True)
|
||
|
segV = cmds.intSliderGrp('segmentSliderPre', q=1, v =True)
|
||
|
miterV = cmds.intSliderGrp('miteringSliderPre', q=1,v =True)
|
||
|
if len(beseMesh) > 0:
|
||
|
loadBevelList()
|
||
|
rebuildPreview()
|
||
|
setPreBevelGrp()
|
||
|
boolPreBevel()
|
||
|
visListOff()
|
||
|
#outlineClean()
|
||
|
member = beseMesh + '_preBaseMesh'
|
||
|
cmds.select(beseMesh + '_preBaseMesh')
|
||
|
cmds.intSliderGrp('segmentSliderPre',e=True,en=False)
|
||
|
cmds.intSliderGrp('miteringSliderPre',e=True,en=False)
|
||
|
cmds.floatSliderGrp('lockFaceSliderPre',e=True,en=False)
|
||
|
cmds.floatSliderGrp('offsetSliderPre',e=True,en=False)
|
||
|
cmds.button('addLockButton',e=True,en=True)
|
||
|
#Retop
|
||
|
cmds.polySelectConstraint(m=3,t=0x8000,sm=1)
|
||
|
cmds.polySelectConstraint(disable =True)
|
||
|
triNode = cmds.polyTriangulate(member,ch=0)
|
||
|
quadNode = cmds.polyQuad(member,a = 30, kgb = 0 ,ktb = 0, khe= 1, ws = 0, ch = 0)
|
||
|
cmds.delete(ch = True)
|
||
|
#Clean
|
||
|
cmds.select(member)
|
||
|
mergeNode = cmds.polyMergeVertex( d = 0.01,ch = True)
|
||
|
softNode = cmds.polySoftEdge(angle=0.3)
|
||
|
mel.eval("ConvertSelectionToEdges;")
|
||
|
cmds.polySelectConstraint(t=0x8000, m=3, sm=2)
|
||
|
cmds.polySelectConstraint(disable =True)
|
||
|
selectEdges=cmds.ls(sl=1,fl=1)
|
||
|
if len(selectEdges)>0:
|
||
|
cmds.polyDelEdge(cv = True, ch = False)
|
||
|
#Clean unused vertex points
|
||
|
cmds.select(member)
|
||
|
mergeNode = cmds.polyMergeVertex( d = 0.01,ch = True)
|
||
|
cmds.select(member)
|
||
|
cmds.ConvertSelectionToVertices()
|
||
|
selected = cmds.ls(sl=1, fl=1)
|
||
|
cmds.select(clear=True)
|
||
|
for v in selected:
|
||
|
if len( re.findall('\d+', cmds.polyInfo(v,ve=True)[0]) ) == 3:
|
||
|
cmds.select(v,add=True)
|
||
|
cmds.delete(cmds.ls(sl=True))
|
||
|
cmds.select(member)
|
||
|
softNode = cmds.polySoftEdge(angle=30)
|
||
|
#merge very close vertex by user
|
||
|
cmds.select(member)
|
||
|
cmds.delete(ch = True)
|
||
|
cmds.select(member)
|
||
|
mergeNode = cmds.polyMergeVertex( d = 0.01,ch = 0)
|
||
|
cmds.button('removeLockButton', e=1, en = 0)
|
||
|
cmds.select(member)
|
||
|
cmds.button('addLockButton', e=1, en = 1)
|
||
|
|
||
|
def bevelPreviewLockFace():
|
||
|
global sourceFaces
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
member = beseMesh + '_preBaseMesh'
|
||
|
cmds.select(member)
|
||
|
cmds.polySelectConstraint(m=3,t=0x8000,sm=1)
|
||
|
cmds.polySelectConstraint(disable =True)
|
||
|
hardEdges = cmds.ls(sl=1,fl=1)
|
||
|
cmds.DetachComponent()
|
||
|
listH = cmds.listHistory(member, lv=0 )
|
||
|
for h in listH:
|
||
|
checkNode = cmds.nodeType(h)
|
||
|
if checkNode == 'polySplitEdge':
|
||
|
cmds.rename(h,'lockStart')
|
||
|
cmds.select(member)
|
||
|
cmds.ConvertSelectionToFaces()
|
||
|
sourceFaces = cmds.ls(sl=1,fl=1)
|
||
|
offsetData = cmds.floatSliderGrp('offsetSliderPre', q=1, v = 1)
|
||
|
createSupportNode = cmds.polyExtrudeFacet(sourceFaces, constructionHistory =1, keepFacesTogether = 1, divisions = 1, off = offsetData, smoothingAngle = 30)
|
||
|
faceLockNode = cmds.rename(createSupportNode[0], (beseMesh+'_lcokFace'))
|
||
|
cmds.GrowPolygonSelectionRegion()
|
||
|
shapeExtrude = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(member)
|
||
|
cmds.ConvertSelectionToFaces()
|
||
|
cmds.select(shapeExtrude,d=1 )
|
||
|
cmds.delete()
|
||
|
cmds.select(member)
|
||
|
cmds.polyMergeVertex(d = 0.001, ch = 1)
|
||
|
cmds.setAttr((faceLockNode + ".offset"), offsetData)
|
||
|
cmds.connectControl('lockFaceSliderPre', (faceLockNode + ".offset"))
|
||
|
cmds.setAttr((faceLockNode + ".offset"),0.1)
|
||
|
cmds.polySelectConstraint(m=3,t=0x8000,sm=1)
|
||
|
cmds.polySelectConstraint(disable =True)
|
||
|
softNode = cmds.polySoftEdge(angle= 180)
|
||
|
cmds.rename(softNode,'preSoftEdge')
|
||
|
cmds.select(cl=True)
|
||
|
|
||
|
def mergeHardEdgeVex():# vertices too close
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
member = beseMesh + '_preBaseMesh'
|
||
|
cmds.select(member)
|
||
|
cmds.polySelectConstraint(m=3,t=0x8000,sm=1)
|
||
|
cmds.polySelectConstraint(disable =True)
|
||
|
cmds.ConvertSelectionToVertices()
|
||
|
cmds.polyMergeVertex(d= 0.1,am= 1, ch= 1)
|
||
|
|
||
|
def smoothAroundLockEdge():#relax vertices surround lock edge then snap back to bool mesh to maintain shape
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
snapMesh = beseMesh + '_bool'
|
||
|
global sourceFaces
|
||
|
cmds.select(sourceFaces)
|
||
|
mel.eval('InvertSelection')
|
||
|
cmds.ConvertSelectionToVertices()
|
||
|
tempSel=cmds.ls(sl=1,fl=1)
|
||
|
cmds.GrowPolygonSelectionRegion()
|
||
|
cmds.select(tempSel, d=1 )
|
||
|
cmds.polyAverageVertex(i=10)
|
||
|
cmds.polyAverageVertex(i=10)
|
||
|
cmds.select(snapMesh,add=1)
|
||
|
cmds.transferAttributes(transferPositions =1, transferNormals= 0, transferUVs =0, transferColors= 2, sampleSpace = 0, searchMethod = 3, flipUVs = 0, colorBorders =0)
|
||
|
cmds.select(cl=1)
|
||
|
|
||
|
def bevelPreviewLockFaceRemove():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
member = beseMesh + '_preBaseMesh'
|
||
|
cmds.select(member)
|
||
|
listH = cmds.listHistory(member, lv=0 )
|
||
|
for h in listH:
|
||
|
checkNode = cmds.nodeType(h)
|
||
|
if checkNode != 'mesh':
|
||
|
cmds.delete(h)
|
||
|
if 'lockStart' in h:
|
||
|
break
|
||
|
cmds.button('removeLockButton', e=1, en = 0)
|
||
|
cmds.button('addLockButton', e=1, en = 1)
|
||
|
cmds.button('addPreBButton', e=1, en = 0)
|
||
|
cmds.button('removePreBButton', e=1, en = 0)
|
||
|
cmds.button('addPreNonBButton', e=1, en = 0)
|
||
|
cmds.button('removePreNonBButton', e=1, en = 0)
|
||
|
cmds.connectControl('lockFaceSliderPre', (beseMesh + '_lcokFace.offset'))
|
||
|
cmds.select(member)
|
||
|
softHardVis()
|
||
|
|
||
|
def lcokUpdate():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
offsetV = cmds.floatSliderGrp('offsetSliderPre',q=1, v =True)
|
||
|
lockV = cmds.floatSliderGrp('lockFaceSliderPre',q=1, v =True)
|
||
|
segV = cmds.intSliderGrp('segmentSliderPre', q=1, v =True)
|
||
|
miterV = cmds.intSliderGrp('miteringSliderPre', q=1,v =True)
|
||
|
if len(beseMesh) > 0:
|
||
|
bevelPreviewLockFace()
|
||
|
cmds.setAttr((beseMesh+'_lcokFace.offset'),lockV)
|
||
|
visListOff()
|
||
|
outlineClean()
|
||
|
cmds.select(beseMesh + '_preBaseMesh')
|
||
|
cmds.button('addPreBButton',e=True,en=True)
|
||
|
cmds.button('removePreBButton',e=True,en=False)
|
||
|
cmds.button('addPreNonBButton',e=True,en=False)
|
||
|
cmds.button('removePreNonBButton',e=True,en=False)
|
||
|
cmds.button('removeLockButton', e=1, en = 1)
|
||
|
cmds.button('addLockButton', e=1, en = 0)
|
||
|
|
||
|
def addPreBevelEdgeRun():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists(beseMesh +'_edgePreBevel') == 0:
|
||
|
lockV = cmds.floatSliderGrp('lockFaceSliderPre',q=1, v =True)
|
||
|
addPreBevelEdge()
|
||
|
visListOff()
|
||
|
outlineClean()
|
||
|
cmds.button('addPreBButton',e=True,en=False)
|
||
|
cmds.button('removePreBButton',e=True,en=True)
|
||
|
cmds.floatSliderGrp('lockFaceSliderPre',e=True,en=False)
|
||
|
cmds.floatSliderGrp('offsetSliderPre',e=True,en=True , max = lockV)
|
||
|
cmds.button('addPreNonBButton',e=True,en=True)
|
||
|
cmds.button('removePreNonBButton',e=True,en=False)
|
||
|
cmds.button('addLockButton',e=True,en=False)
|
||
|
cmds.setAttr((beseMesh+'_edgePreBevel.offset'),lockV)
|
||
|
cmds.select(beseMesh + '_preBaseMesh')
|
||
|
cmds.TogglePolyDisplayEdges()
|
||
|
cmds.button('removeLockButton',e=1, en=0)
|
||
|
|
||
|
def removePreBevelEdgeRun():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
cmds.delete(beseMesh + '_preBaseMesh')
|
||
|
cmds.showHidden(beseMesh + '_preBaseLock')
|
||
|
cmds.rename((beseMesh + '_preBaseLock') ,(beseMesh + '_preBaseMesh'))
|
||
|
outlineClean()
|
||
|
cmds.button('addPreBButton',e=True,en=True)
|
||
|
cmds.button('removePreBButton',e=True,en=False)
|
||
|
cmds.floatSliderGrp('lockFaceSliderPre',e=True,en=True)
|
||
|
cmds.floatSliderGrp('offsetSliderPre',e=True,en=False)
|
||
|
cmds.button('addPreNonBButton',e=True,en=False)
|
||
|
cmds.button('removePreNonBButton',e=True,en=False)
|
||
|
cmds.button('removeLockButton', e=1, en = 0)
|
||
|
cmds.button('addLockButton', e=1, en = 0)
|
||
|
cmds.button('removeLockButton', e=1, en = 1)
|
||
|
cmds.select(beseMesh + '_preBaseMesh')
|
||
|
listH = cmds.listHistory((beseMesh + '_preBaseMesh'), lv=0 )
|
||
|
for l in listH:
|
||
|
checkType=cmds.nodeType(l)
|
||
|
if checkType == "polyExtrudeFace":
|
||
|
cmds.connectControl('lockFaceSliderPre', (l + ".offset"))
|
||
|
|
||
|
def addPreBevelEdge():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
newGrp = cmds.duplicate((beseMesh + '_preBaseMesh'),rr = True, un=True)
|
||
|
if cmds.objExists(beseMesh+'_preBaseLock'):
|
||
|
cmds.delete(beseMesh + '_preBaseLock')
|
||
|
cmds.rename(newGrp,(beseMesh + '_preBaseLock'))
|
||
|
cmds.hide(beseMesh + '_preBaseLock')
|
||
|
cmds.select(beseMesh + '_preBaseMesh')
|
||
|
mel.eval("ConvertSelectionToEdges;")
|
||
|
softNode = cmds.polySoftEdge(angle=30)
|
||
|
cmds.polySelectConstraint(m=3,t=0x8000,sm=1)
|
||
|
cmds.polySelectConstraint(disable =True)
|
||
|
hardEdges = cmds.ls(sl=1,fl=1)
|
||
|
bevelNodeNew = cmds.polyBevel3(hardEdges, offset = 0.1, offsetAsFraction= 0, autoFit= 1, depth= 1, mitering= 1 ,miterAlong= 0 ,chamfer =1 ,segments= 3 ,worldSpace= 0 ,smoothingAngle= 30 ,subdivideNgons =1 ,mergeVertices= 1, mergeVertexTolerance= 0.0001, miteringAngle=180, angleTolerance =180 ,ch= 1)
|
||
|
cmds.rename(bevelNodeNew,(beseMesh+'_edgePreBevel'))
|
||
|
cmds.connectControl('segmentSliderPre', (beseMesh+'_edgePreBevel.segments'))
|
||
|
cmds.connectControl('miteringSliderPre',(beseMesh+'_edgePreBevel.mitering'))
|
||
|
cmds.connectControl('offsetSliderPre', (beseMesh+'_edgePreBevel.offset'))
|
||
|
softHardVis()
|
||
|
|
||
|
def outlineClean():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkList = ['_cutterGrp','_preSubBox','_preUnionBox','_preBevelMeshUnion','_preBevelMeshSubs','_myBoolUnion','_bool','_preBaseMeshBackup' ,'_preBevelGrp','_preBaseMesh','_preBaseMeshFinal','_preBevelMeshFinal','_boolNonBevelUnion','_boolNonBevelsubs']
|
||
|
for c in checkList:
|
||
|
checkGrp = cmds.ls((beseMesh + c), l=True)
|
||
|
if len(checkGrp)>0:
|
||
|
if 'BoolGrp' not in checkGrp[0]:
|
||
|
cmds.parent(checkGrp[0],(beseMesh +'BoolGrp'))
|
||
|
|
||
|
def removeLeftOver():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkList = ['_preBevelMeshSubs','_boolNonBevelUnion','_boolNonBevelSubs','_preBevelMeshFinal']
|
||
|
for c in checkList:
|
||
|
if cmds.objExists(beseMesh + c):
|
||
|
cmds.delete(beseMesh + c)
|
||
|
|
||
|
def boolPreNonBevel():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
preBevelMesh = (beseMesh + '_preBaseMesh')
|
||
|
newNode = cmds.duplicate(preBevelMesh,n=(beseMesh + '_preBaseMeshBackup'),rr=1,un=1)
|
||
|
cmds.setAttr(beseMesh + '_preBaseMeshBackup.visibility',0)
|
||
|
cmds.rename(newNode, (beseMesh + '_preBevel'))
|
||
|
nonBevelsList = cmds.textScrollList('nonBevelList', q=True, ai=True)
|
||
|
|
||
|
if cmds.objExists(beseMesh+'_preBevelGrp') == 0:
|
||
|
newGrp = cmds.duplicate((beseMesh + '_bakeStep'),rr = True, un=True)
|
||
|
cmds.parent(newGrp,w=True)
|
||
|
cmds.rename(beseMesh + '_preBevelGrp')
|
||
|
cmds.select(hi=True)
|
||
|
#rename
|
||
|
listCutters = cmds.ls(sl=True, type ='transform',l=True)
|
||
|
for l in listCutters:
|
||
|
if '_bakeBaseMesh' in l:
|
||
|
cmds.delete(l)
|
||
|
else:
|
||
|
sName = l.replace('bake','pre')
|
||
|
cmds.rename(l, sName.split("|")[-1])
|
||
|
cmds.parent((beseMesh + '_preBevelGrp'),(beseMesh + 'BoolGrp'))
|
||
|
# sort operation type
|
||
|
subsGrp = []
|
||
|
unionGrp = []
|
||
|
cutGrp = []
|
||
|
for b in nonBevelsList:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + b
|
||
|
if cmds.objExists(longName):
|
||
|
checkOP = cmds.getAttr(longName + '.cutterOp')
|
||
|
if checkOP == 'subs':
|
||
|
subsGrp.append(b)
|
||
|
elif checkOP == 'union':
|
||
|
unionGrp.append(b)
|
||
|
elif checkOP == 'cut':
|
||
|
cutGrp.append(b)
|
||
|
|
||
|
for s in subsGrp:
|
||
|
newNode = '|' + beseMesh + 'BoolGrp|' + beseMesh + '_preBevelGrp|'+ (s.replace('bake','pre'))
|
||
|
cmds.polyCBoolOp(preBevelMesh, newNode, op=2, ch=1, preserveColor=0, classification=1, name= preBevelMesh)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.rename(preBevelMesh)
|
||
|
for u in unionGrp:
|
||
|
newNode = '|' + beseMesh + 'BoolGrp|' + beseMesh + '_preBevelGrp|'+ (u.replace('bake','pre'))
|
||
|
cmds.polyCBoolOp(preBevelMesh, newNode, op=1, ch=1, preserveColor=0, classification=1, name= preBevelMesh)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.rename(preBevelMesh)
|
||
|
for c in cutGrp:
|
||
|
newNode = '|' + beseMesh + 'BoolGrp|' + beseMesh + 'BoolGrp|' + beseMesh + '_preBevelGrp|'+ (c.replace('bake','pre'))
|
||
|
cmds.polyCBoolOp(preBevelMesh, newNode, op=2, ch=1, preserveColor=0, classification=1, name= preBevelMesh)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.rename(preBevelMesh)
|
||
|
cmds.rename(beseMesh + '_preBevelMeshFinal')
|
||
|
cmds.parent((beseMesh + '_preBevelMeshFinal') ,( beseMesh + 'BoolGrp|'))
|
||
|
|
||
|
def boolPreBevel():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
bevelsList = cmds.textScrollList('bevelList', q=True, ai=True)
|
||
|
cmds.parent(('|' + beseMesh + 'BoolGrp|' + beseMesh + '_preBevelGrp|' + beseMesh + '_preBaseMesh'),w=True)
|
||
|
preBevelMesh = (beseMesh + '_preBaseMesh')
|
||
|
# sort operation type
|
||
|
subsGrp = []
|
||
|
unionGrp = []
|
||
|
cutGrp = []
|
||
|
for b in bevelsList:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_bakeStep|' + b
|
||
|
if cmds.objExists(longName):
|
||
|
checkOP = cmds.getAttr(longName + '.cutterOp')
|
||
|
if checkOP == 'subs':
|
||
|
subsGrp.append(b)
|
||
|
elif checkOP == 'union':
|
||
|
unionGrp.append(b)
|
||
|
elif checkOP == 'cut':
|
||
|
cutGrp.append(b)
|
||
|
|
||
|
for s in subsGrp:
|
||
|
newNode = '|' + beseMesh + 'BoolGrp|' + beseMesh + '_preBevelGrp|'+ (s.replace('bake','pre'))
|
||
|
cmds.polyCBoolOp(preBevelMesh, newNode, op=2, ch=0, preserveColor=0, classification=1, name= preBevelMesh)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.rename(preBevelMesh)
|
||
|
for u in unionGrp:
|
||
|
newNode = '|' + beseMesh + 'BoolGrp|' + beseMesh + '_preBevelGrp|'+ (u.replace('bake','pre'))
|
||
|
cmds.polyCBoolOp(preBevelMesh, newNode, op=1, ch=0, preserveColor=0, classification=1, name= preBevelMesh)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.rename(preBevelMesh)
|
||
|
for c in cutGrp:
|
||
|
newNode = '|' + beseMesh + 'BoolGrp|' + beseMesh + '_preBevelGrp|'+ (c.replace('bake','pre'))
|
||
|
cmds.polyCBoolOp(preBevelMesh, newNode, op=2, ch=0, preserveColor=0, classification=1, name= preBevelMesh)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.rename(preBevelMesh)
|
||
|
cmds.parent(preBevelMesh,('|' + beseMesh + 'BoolGrp|'))
|
||
|
cmds.select(preBevelMesh)
|
||
|
mel.eval('setSelectMode components Components')
|
||
|
cmds.selectType(smp= 0, sme= 1, smf= 0, smu = 0, pv= 0, pe = 1, pf= 0, puv= 0)
|
||
|
cmds.TogglePolyDisplayHardEdgesColor()
|
||
|
|
||
|
def setPreBevelGrp():
|
||
|
bakeCutter('All')
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
newGrp = cmds.duplicate((beseMesh + '_bakeStep'),rr = True, un=True)
|
||
|
cmds.parent(newGrp,w=True)
|
||
|
cmds.rename(beseMesh + '_preBevelGrp')
|
||
|
cmds.select(hi=True)
|
||
|
#rename
|
||
|
listCutters = cmds.ls(sl=True, type ='transform',l=True)
|
||
|
for l in listCutters:
|
||
|
sName = l.replace('bake','pre')
|
||
|
cmds.rename(l, sName.split("|")[-1])
|
||
|
#show
|
||
|
listCutters = cmds.ls(sl=True, type ='transform',l=True)
|
||
|
for l in listCutters:
|
||
|
cmds.setAttr((l + '.visibility'),1)
|
||
|
cmds.setAttr((beseMesh + 'BoolGrp.visibility'),1)
|
||
|
cmds.setAttr((beseMesh + '_bakeStep.visibility'),1)
|
||
|
cmds.setAttr((beseMesh + '_bool.visibility'),0)
|
||
|
cmds.setAttr((beseMesh + '_preBevelGrp.visibility'),1)
|
||
|
list = cmds.ls('preCutter*',type='transform')
|
||
|
for i in list:
|
||
|
cmds.setAttr((i + '.visibility'),0)
|
||
|
cmds.parent((beseMesh + '_preBevelGrp'),(beseMesh + 'BoolGrp'))
|
||
|
|
||
|
def sortBevelList():
|
||
|
selListLeft = cmds.textScrollList('bevelList', q=True, ai=True)
|
||
|
if selListLeft != None:
|
||
|
if len(selListLeft) > 0:
|
||
|
selListLeft.sort()
|
||
|
cmds.textScrollList('bevelList',edit = True, ra = True)
|
||
|
for s in selListLeft:
|
||
|
cmds.textScrollList('bevelList',edit = True, append = s)
|
||
|
|
||
|
selListRight = cmds.textScrollList('nonBevelList', q=True, ai=True)
|
||
|
if selListRight != None:
|
||
|
if len(selListRight) > 0:
|
||
|
selListRight.sort()
|
||
|
cmds.textScrollList('nonBevelList',edit = True, ra = True)
|
||
|
for s in selListRight:
|
||
|
cmds.textScrollList('nonBevelList',edit = True, append = s)
|
||
|
|
||
|
def jwSpeedCutBevelMangerSetup():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if len(beseMesh)>0:
|
||
|
jwSpeedCutBevelMangerUI()
|
||
|
bakeCutter('all')
|
||
|
preCheckBevelByVolumn()
|
||
|
loadBevelList()
|
||
|
visListOn()
|
||
|
cmds.button('addPreBButton',e=True,en=False)
|
||
|
cmds.button('removePreBButton',e=True,en=False)
|
||
|
cmds.button('addPreNonBButton',e=True,en=False)
|
||
|
cmds.button('removePreNonBButton',e=True,en=False)
|
||
|
|
||
|
def softHardVis():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkState = cmds.iconTextButton('edgeVis' , q = True , image1 = True)
|
||
|
if cmds.objExists((beseMesh + '_preBaseMesh')):
|
||
|
cmds.select(beseMesh + '_preBaseMesh')
|
||
|
if checkState == 'nodeGrapherSoloed.svg':
|
||
|
cmds.iconTextButton('edgeVis' , e = True , image1 = 'circle.png')
|
||
|
cmds.TogglePolyDisplayEdges()
|
||
|
else:
|
||
|
cmds.iconTextButton('edgeVis' , e = True , image1 = 'nodeGrapherSoloed.svg')
|
||
|
cmds.TogglePolyDisplayHardEdgesColor()
|
||
|
#change to edge mode
|
||
|
mel.eval('setSelectMode components Components')
|
||
|
cmds.selectType(smp= 0, sme= 1, smf= 0, smu = 0, pv= 0, pe = 1, pf= 0, puv= 0)
|
||
|
|
||
|
def jwSpeedCutBevelMangerUI():
|
||
|
if cmds.window("jwSpeedCutBevelManger", exists = True):
|
||
|
cmds.deleteUI("jwSpeedCutBevelManger")
|
||
|
jwSpeedCutBevelManger = cmds.window("jwSpeedCutBevelManger",title = "speedCut Bevel Manger",w = 400,h = 380, mxb = False, s = 1, bgc = [0.2, 0.2, 0.2 ])
|
||
|
cmds.columnLayout()
|
||
|
cmds.rowColumnLayout(nc= 1, cw = [(1, 420)])
|
||
|
cmds.separator( height=15, style='none' )
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.rowColumnLayout(nc= 5, cw = [(1, 20),(2, 200),(3, 40),(4,10),(5, 200)])
|
||
|
cmds.text(l ='')
|
||
|
cmds.menuBarLayout()
|
||
|
cmds.rowColumnLayout(nc= 3, cw = [(1,50),(2,100),(3,20)])
|
||
|
cmds.text(l ='Bevel' ,en=False)
|
||
|
cmds.text(l ='')
|
||
|
cmds.iconTextButton('visLeft' , h = 20, style='iconOnly', image1 = 'nodeGrapherSoloed.svg', c = 'togglevisLeft()')
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.scrollLayout(h = 320)
|
||
|
cmds.textScrollList('bevelList', h= 300, w =180, vis = True, ams= True, sc= 'selBevelList()')
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.columnLayout()
|
||
|
cmds.text(l ='',h=150)
|
||
|
cmds.iconTextButton('moveLeft' , w = 30, style='iconOnly', image1 = 'timeplay.png', c = 'moveRightItem()')
|
||
|
cmds.text(l ='',h=10)
|
||
|
cmds.iconTextButton('moveRight' , w = 30, style='iconOnly', image1 = 'timerev.png', c = 'moveLeftItem()')
|
||
|
cmds.text(l ='',h=10)
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.text(l ='',h=10)
|
||
|
cmds.menuBarLayout()
|
||
|
cmds.rowColumnLayout(nc= 3, cw = [(1,50),(2,100),(3,20)])
|
||
|
cmds.text(l ='Ignore' ,en=False)
|
||
|
cmds.text(l ='')
|
||
|
cmds.iconTextButton('visRight' , h = 20, style='iconOnly', image1 = 'nodeGrapherSoloed.svg', c = 'togglevisRight()')
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.scrollLayout(h= 320)
|
||
|
cmds.textScrollList('nonBevelList', h= 300, w =180, vis = True, ams= True, sc= 'selNonBevelList()')
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.separator( height=1, style='none' )
|
||
|
cmds.rowColumnLayout(nc=2, cw = [(1,215),(2,270)])
|
||
|
cmds.frameLayout( labelVisible = 0,vis = 1)
|
||
|
cmds.columnLayout()
|
||
|
cmds.rowColumnLayout(nc=6, cw = [(1,55),(2,50),(3,3),(4,50),(5,3),(6,50)])
|
||
|
cmds.text(l ='All')
|
||
|
cmds.button('updatePreBButton', w = 50, l= "Auto", c = 'preBevelUpdate()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.text(l ='')
|
||
|
cmds.button('killPreBButton', w = 50, l= "x", c = 'killPreview()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.text(l ='')
|
||
|
cmds.button('outMeshButton', w = 50, l= "Output", c = 'publishFinal()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.setParent( '..' )
|
||
|
bSize = 76 #button
|
||
|
sSize = 250#slider
|
||
|
tSize = 65 #slider Text
|
||
|
cmds.separator( height=5, style='none' )
|
||
|
cmds.rowColumnLayout(nc=6, cw = [(1,55),(2,50),(3,3),(4,50),(5,3),(6,50)])
|
||
|
cmds.text(l ='Mesh ')
|
||
|
cmds.button('addCutButton', w = 50, l= "Cut", c = 'cutUpdate()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.text(l ='')
|
||
|
cmds.button('addLockButton', w = 50, en=0, l= "Lock", c = 'lcokUpdate()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.text(l ='')
|
||
|
cmds.button('removeLockButton', w = 50, en = 0, l= "Remove", c = 'bevelPreviewLockFaceRemove()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.separator( height=5, style='none' )
|
||
|
cmds.rowColumnLayout(nc=4, cw = [(1,55),(2,bSize),(3,3),(4,bSize)])
|
||
|
cmds.text(l ='Bevel ')
|
||
|
cmds.button('addPreBButton', w = bSize, l= "Add", c = 'addPreBevelEdgeRun()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.text(l ='')
|
||
|
cmds.button('removePreBButton', w = bSize, l= "Remove", c = 'removePreBevelEdgeRun()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.separator( height=5, style='none' )
|
||
|
cmds.rowColumnLayout(nc=4, cw = [(1,55),(2,bSize),(3,3),(4,bSize)])
|
||
|
cmds.text(l =' NonBevel')
|
||
|
cmds.button('addPreNonBButton', w = bSize, l= "Add", c = 'addNonBevelList()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.text(l ='')
|
||
|
cmds.button('removePreNonBButton', w = bSize, l= "Remove", c = 'removeNonBevelList()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.separator( height=5, style='none' )
|
||
|
cmds.rowColumnLayout(nc=8, cw = [(1,55),(2,20),(3,9),(4,40),(5,3),(6,40),(7,3),(8,40)])
|
||
|
cmds.text(l =' Edge')
|
||
|
cmds.iconTextButton('edgeVis' , h = 20, style='iconOnly', image1 = 'circle.png', c = 'softHardVis()')
|
||
|
cmds.text(l ='')
|
||
|
cmds.button('selContEdgeButton', l= "Loop", c = 'cmds.SelectContiguousEdges()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.text(l ='')
|
||
|
cmds.button('edgeHardButton', l= "H", c = 'cmds.PolygonHardenEdge()',bgc = [0.14, 0.14, 0.14] )
|
||
|
cmds.text(l ='')
|
||
|
cmds.button('edgeSoftButton', l= "S", c = 'cmds.PolygonSoftenEdge()',bgc = [0.14, 0.14, 0.14] )
|
||
|
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.frameLayout( labelVisible = 0,vis = 1)
|
||
|
cmds.floatSliderGrp('lockFaceSliderPre', en=1, v = 0.1, min = 0.001, max = 1, fmx = 5, s = 0.01, cw3 = [tSize,40,sSize] , label = "Lock" ,field =True)
|
||
|
cmds.floatSliderGrp('offsetSliderPre', en=1, v = 0.1, min = 0.001, max = 1, fmx = 10, s = 0.01, cw3 = [tSize,40,sSize] , label = "Offset" ,field =True)
|
||
|
cmds.intSliderGrp('segmentSliderPre', en=1, v = 2, min = 1 , max = 5, s = 1, cw3 = [tSize,40,sSize] , label = "Segments" ,field =True)
|
||
|
cmds.intSliderGrp('miteringSliderPre', en=1, v = 1, min = 0, max = 3, s = 1, cw3 = [tSize,40,sSize] , label = "Mitering " ,field =True)
|
||
|
cmds.setParent( '..' )
|
||
|
cmds.text(l ='')
|
||
|
cmds.separator( height=15, style='none' )
|
||
|
cmds.showWindow(jwSpeedCutBevelManger)
|
||
|
obNum = cmds.scriptJob ( p = 'jwSpeedCutBevelManger', event = ["SelectionChanged", reselctList])
|
||
|
##################################################################################################################
|
||
|
def baseMeshColorUpdate():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
shapes = cmds.listRelatives((beseMesh+'_bool'), shapes=True)
|
||
|
shadeEng = cmds.listConnections(shapes , type = 'shadingEngine')
|
||
|
if shadeEng:
|
||
|
colorData ={ 2 : (0.25, 0.25 , 0.25),
|
||
|
3 : (0.6 , 0.6 , 0.6 ),
|
||
|
4 : (0.61, 0 , 0.16),
|
||
|
5 : (0.0 , 0.02 , 0.38),
|
||
|
6 : (0.0 , 0 , 1 ),
|
||
|
7 : (0.0 , 0.28 , 0.1 ),
|
||
|
8 : (0.15, 0.0 , 0.26),
|
||
|
9 : (0.78, 0.0 , 0.78),
|
||
|
10 : (0.54, 0.28 , 0.2 ),
|
||
|
11 : (0.25, 0.14 , 0.12),
|
||
|
12 : (0.32 , 0.02 , 0.0 ),
|
||
|
15 : (0.0 , 0.26 , 0.6 ),
|
||
|
20 : (1.0 , 0.43 , 0.43),
|
||
|
21 : (0.9 , 0.68 , 0.47),
|
||
|
23 : (0.0 , 0.60 , 0.33),
|
||
|
24 : (0.63, 0.42 , 0.19),
|
||
|
25 : (0.62, 0.63 , 0.19),
|
||
|
26 : (0.41, 0.63 , 0.19),
|
||
|
27 : (0.19, 0.63 , 0.36),
|
||
|
28 : (0.19, 0.63 , 0.63),
|
||
|
29 : (0.19, 0.40 , 0.63),
|
||
|
30 : (0.44, 0.15 , 0.63),
|
||
|
31 : (0.63, 0.19 , 0.42),
|
||
|
}
|
||
|
score = list(colorData.items())
|
||
|
|
||
|
materials = cmds.ls(cmds.listConnections(shadeEng ), materials = True)
|
||
|
if materials[0] == (beseMesh+'_Shader'):
|
||
|
cmds.sets((beseMesh+'_bool'), e=True, forceElement = 'initialShadingGroup')
|
||
|
if cmds.objExists(beseMesh+'_Shader'):
|
||
|
cmds.delete(beseMesh+'_Shader')
|
||
|
if cmds.objExists(beseMesh+'_ShaderSG'):
|
||
|
cmds.delete(beseMesh+'_ShaderSG')
|
||
|
cmds.setAttr((beseMesh + '_BoolResult.color'),0)
|
||
|
cmds.setAttr((beseMesh + "BoolGrp.useOutlinerColor"), 0)
|
||
|
else:
|
||
|
if cmds.objExists(beseMesh+'_Shader') == 0:
|
||
|
shd = cmds.shadingNode('lambert', name=(beseMesh+'_Shader'), asShader=True)
|
||
|
shdSG = cmds.sets(name=(beseMesh+'_ShaderSG'), empty=True, renderable=True, noSurfaceShader=True)
|
||
|
cmds.connectAttr((shd +'.outColor'), (shdSG +'.surfaceShader'))
|
||
|
colorID = random.randint(0,(len(score)-1))
|
||
|
getInfo = score[colorID]
|
||
|
|
||
|
cmds.setAttr ((beseMesh +'_Shader.color'), getInfo[1][0],getInfo[1][1],getInfo[1][2], type = 'double3' )
|
||
|
cmds.sets((beseMesh+'_bool'), e=True, forceElement = (beseMesh+'_ShaderSG'))
|
||
|
cmds.setAttr((beseMesh + '_BoolResult.color'),getInfo[0])
|
||
|
|
||
|
|
||
|
cmds.setAttr((beseMesh + "BoolGrp.useOutlinerColor"), 1)
|
||
|
cmds.setAttr((beseMesh + "BoolGrp.outlinerColor"), getInfo[1][0],getInfo[1][1],getInfo[1][2])
|
||
|
|
||
|
|
||
|
else:
|
||
|
cmds.sets((beseMesh+'_bool'), e=True, forceElement = 'initialShadingGroup')
|
||
|
cmds.setAttr((beseMesh + '_BoolResult.color'),0)
|
||
|
cmds.setAttr((beseMesh + "BoolGrp.useOutlinerColor"), 0)
|
||
|
|
||
|
def hsv2rgb(h, s, v):
|
||
|
h, s, v = [float(x) for x in (h, s, v)]
|
||
|
hi = (h / 60) % 6
|
||
|
hi = int(round(hi))
|
||
|
f = (h / 60) - (h / 60)
|
||
|
p = v * (1 - s)
|
||
|
q = v * (1 - f * s)
|
||
|
t = v * (1 - (1 - f) * s)
|
||
|
if hi == 0:
|
||
|
return v, t, p
|
||
|
elif hi == 1:
|
||
|
return q, v, p
|
||
|
elif hi == 2:
|
||
|
return p, v, t
|
||
|
elif hi == 3:
|
||
|
return p, q, v
|
||
|
elif hi == 4:
|
||
|
return t, p, v
|
||
|
elif hi == 5:
|
||
|
return v, p, q
|
||
|
|
||
|
def toggleLayer():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkState = cmds.iconTextButton('meshLayerButton', q=1, image1= True )
|
||
|
if checkState == 'nodeGrapherModeSimple.svg':
|
||
|
cmds.iconTextButton('meshLayerButton', e=1, image1= 'nodeGrapherModeAll.svg')
|
||
|
BoolGrpList = cmds.ls('*BoolGrp')
|
||
|
cmds.showHidden(BoolGrpList)
|
||
|
else:
|
||
|
cmds.iconTextButton('meshLayerButton', e=1, image1= 'nodeGrapherModeSimple.svg')
|
||
|
BoolGrpList = cmds.ls('*BoolGrp')
|
||
|
cmds.hide(BoolGrpList)
|
||
|
cmds.showHidden(beseMesh+'BoolGrp')
|
||
|
|
||
|
def updateVisLayer():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkState = cmds.iconTextButton('meshLayerButton', q=1, image1= True )
|
||
|
if checkState == 'nodeGrapherModeSimple.svg':
|
||
|
BoolGrpList = cmds.ls('*BoolGrp')
|
||
|
cmds.hide(BoolGrpList)
|
||
|
cmds.showHidden(beseMesh+'BoolGrp')
|
||
|
else:
|
||
|
BoolGrpList = cmds.ls('*BoolGrp')
|
||
|
cmds.showHidden(BoolGrpList)
|
||
|
|
||
|
def cutterType(boolType):
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkButtonStateList = ['subsButton','unionButton','cutButton']
|
||
|
for c in checkButtonStateList:
|
||
|
buttonState = cmds.button( c ,e=1, bgc = [0.28,0.28,0.28] )
|
||
|
selCutter = cmds.ls(sl=1, fl=1, type='transform')
|
||
|
if len(selCutter) > 0:
|
||
|
selCutterCheck = cmds.ls(sl=1, fl=1, l=1, type='transform')
|
||
|
for s in selCutterCheck:
|
||
|
checkShortName = s.split("|")
|
||
|
shortName = checkShortName[-1]
|
||
|
cmds.select(s)
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
s = myType[0]
|
||
|
|
||
|
if 'boxCutter' in shortName:
|
||
|
cmds.setAttr((s+'.cutterOp'),boolType,type="string")
|
||
|
shapeNode = cmds.listRelatives(s, f = True, shapes=True)
|
||
|
if boolType == 'union':
|
||
|
cmds.setAttr( (shapeNode[0]+'.overrideColor'), 31)
|
||
|
elif boolType == 'subs':
|
||
|
cmds.setAttr( (shapeNode[0]+'.overrideColor'), 28)
|
||
|
elif boolType == 'cut':
|
||
|
cmds.setAttr( (shapeNode[0]+'.overrideColor'), 25)
|
||
|
fixBoolNodeConnection()
|
||
|
|
||
|
if boolType == 'union':
|
||
|
buttonState = cmds.button('unionButton',e=1, bgc = [0.3,0.5,0.6] )
|
||
|
elif boolType == 'subs':
|
||
|
buttonState = cmds.button('subsButton' ,e=1, bgc = [0.3,0.5,0.6] )
|
||
|
elif boolType == 'cut':
|
||
|
buttonState = cmds.button('cutButton' ,e=1, bgc = [0.3,0.5,0.6] )
|
||
|
|
||
|
def fixBoolNodeConnection():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
transNode = cmds.ls(sl=1,fl=1)
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
transNode[0] = myType[0]
|
||
|
|
||
|
checkNumber = ''.join([n for n in transNode[0].split('|')[-1] if n.isdigit()])
|
||
|
opType = cmds.getAttr(transNode[0]+'.cutterOp')
|
||
|
shapeNode = cmds.listRelatives(transNode[0], s=True ,f=True)
|
||
|
boolNode = ''
|
||
|
|
||
|
if 'subs' in opType:
|
||
|
boolNode = beseMesh+'_mySubs'
|
||
|
|
||
|
elif 'union' in opType:
|
||
|
boolNode = beseMesh+'_myUnion'
|
||
|
|
||
|
elif 'cut' in opType:
|
||
|
boolNode = beseMesh+'_myCut'
|
||
|
|
||
|
if len(shapeNode)>0:
|
||
|
listConnect = cmds.connectionInfo((shapeNode[0]+'.outMesh'), dfs=True )
|
||
|
if len(listConnect)>0:
|
||
|
for a in listConnect:
|
||
|
cmds.disconnectAttr((shapeNode[0]+'.outMesh'), a)
|
||
|
|
||
|
|
||
|
start_index = 0
|
||
|
while start_index < 1000:
|
||
|
listConnectMa = cmds.connectionInfo((shapeNode[0]+'.worldMatrix[' + str(start_index) + ']'), dfs=True )
|
||
|
if len(listConnectMa) > 0:
|
||
|
for a in listConnectMa:
|
||
|
try:
|
||
|
cmds.disconnectAttr((shapeNode[0]+'.worldMatrix[' + str(start_index) + ']'), a)
|
||
|
except:
|
||
|
pass
|
||
|
start_index += 1
|
||
|
|
||
|
|
||
|
cmds.connectAttr( (shapeNode[0]+".outMesh"), ((boolNode+'.inputPoly['+str(checkNumber)+']')),f=True)
|
||
|
cmds.connectAttr( (shapeNode[0]+".worldMatrix[0]"), ((boolNode+'.inputMat['+str(checkNumber)+']')),f=True)
|
||
|
|
||
|
if myType[1] != 'new':
|
||
|
cmds.select(transNode[0]+'*Grp')
|
||
|
grpName = cmds.ls(sl=True,fl=True)
|
||
|
transformList = cmds.listRelatives(grpName, c=True)
|
||
|
cleanList = []
|
||
|
if myType[1] == 'radial':
|
||
|
for t in transformList:
|
||
|
removeUnwant = t.replace('_Rot','')
|
||
|
cleanList.append(removeUnwant)
|
||
|
else:
|
||
|
cleanList = transformList
|
||
|
|
||
|
cleanList.remove(transNode[0])
|
||
|
|
||
|
for i in range(len(cleanList)):
|
||
|
checkNumber = ''.join([n for n in cleanList[i].split('|')[-1] if n.isdigit()])
|
||
|
cmds.connectAttr( (shapeNode[0]+".worldMatrix[" + str(int(i)+ int(1)) + "]"), ((boolNode+'.inputMat['+str(checkNumber)+']')),f=True)
|
||
|
cmds.connectAttr( (shapeNode[0]+".outMesh"), ((boolNode+'.inputPoly['+str(checkNumber)+']')),f=True)
|
||
|
|
||
|
def get_latest_free_multi_index( attr_name, start_index ):
|
||
|
'''Find the latest unconnected multi index starting at the passed in index.'''
|
||
|
listCuttersIndex = []
|
||
|
while start_index < 100:
|
||
|
if cmds.connectionInfo( '{}[{}]'.format(attr_name,start_index), sfd=True ):
|
||
|
listCuttersIndex.append(start_index)
|
||
|
start_index += 1
|
||
|
nextIndex = (listCuttersIndex[-1]+1)
|
||
|
return nextIndex
|
||
|
|
||
|
def nextCutterNumber():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
cutterGrpName = beseMesh + '_cutterGrp'
|
||
|
cmds.select(cutterGrpName,hi=True)
|
||
|
listAllCutter = cmds.ls('boxCutter*',type = 'transform')
|
||
|
cmds.select(cl=True)
|
||
|
checkNumber = 2
|
||
|
if len(listAllCutter) > 0:
|
||
|
newList = []
|
||
|
for l in listAllCutter:
|
||
|
if 'ArrayGrp' not in l:
|
||
|
newList.append(l)
|
||
|
else:
|
||
|
grpNumber = ''.join([n for n in l.split('|')[-1] if n.isdigit()])
|
||
|
newList.append(grpNumber)
|
||
|
checkNumber = ''.join([n for n in newList[-1].split('|')[-1] if n.isdigit()])
|
||
|
checkNumber = int(checkNumber) + 1
|
||
|
return checkNumber
|
||
|
|
||
|
def get_latest_free_multi_index( attr_name, start_index ):
|
||
|
'''Find the latest unconnected multi index starting at the passed in index.'''
|
||
|
listCuttersIndex = []
|
||
|
while start_index < 100:
|
||
|
if cmds.connectionInfo( '{}[{}]'.format(attr_name,start_index), sfd=True ):
|
||
|
listCuttersIndex.append(start_index)
|
||
|
start_index += 1
|
||
|
nextIndex = (listCuttersIndex[-1]+1)
|
||
|
return nextIndex
|
||
|
|
||
|
def get_next_free_multi_index( attr_name, start_index ):
|
||
|
'''Find the next unconnected multi index starting at the passed in index.'''
|
||
|
# assume a max of 100 connections
|
||
|
while start_index < 100:
|
||
|
if len( cmds.connectionInfo( '{}[{}]'.format(attr_name,start_index), sfd=True ) or [] ) == 0:
|
||
|
return start_index
|
||
|
start_index += 1
|
||
|
return 0
|
||
|
|
||
|
#################################################################################################
|
||
|
def goDraw():
|
||
|
hideAllCutter()
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
snapMesh = beseMesh + '_bool'
|
||
|
cmds.optionVar(iv = ('inViewMessageEnable', 0))
|
||
|
cmds.makeLive(snapMesh)
|
||
|
xrayOn()
|
||
|
cmds.evalDeferred('drawBoxRun()')
|
||
|
|
||
|
def drawBoxRun():
|
||
|
cmds.setToolTo( "CreatePolyCubeCtx" )
|
||
|
cmds.scriptJob ( runOnce=True, event = ["PostToolChanged", xrayOff])
|
||
|
|
||
|
def xrayOn():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
snapMesh = beseMesh + '_bool'
|
||
|
cmds.displaySurface(snapMesh , x =1)
|
||
|
|
||
|
def xrayOff():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
snapMesh = beseMesh + '_bool'
|
||
|
cmds.displaySurface(snapMesh , x =0)
|
||
|
cmds.makeLive( none=True )
|
||
|
newCut = cmds.ls(sl=1,tr=1)
|
||
|
cmds.select(newCut, r=1)
|
||
|
cmds.evalDeferred('useOwnCutterShape()')
|
||
|
newCut = cmds.ls(sl=1,tr=1)
|
||
|
cmds.setAttr((newCut[0]+".scaleX") ,1.01)
|
||
|
cmds.setAttr((newCut[0]+".scaleY") ,1.01)
|
||
|
cmds.setAttr((newCut[0]+".scaleZ") ,1.01)
|
||
|
|
||
|
#####################################################################################################
|
||
|
def rdMirrorCurrentState():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
rdMAxis = ''
|
||
|
rdMPol = ''
|
||
|
divSide = 3
|
||
|
divOffset = 10
|
||
|
bcv = cmds.button('rMirrorXButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX < 0.27:
|
||
|
rdMAxis = 'x'
|
||
|
bcv = cmds.button('rMirrorYButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX < 0.27:
|
||
|
rdMAxis = 'y'
|
||
|
bcv = cmds.button('rMirrorZButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX < 0.27:
|
||
|
rdMAxis = 'z'
|
||
|
checkV = cmds.button('rMirrorPosButton', q=1 , bgc = 1)
|
||
|
if checkV[0] > 0.30 :
|
||
|
rdMPol = 'p'
|
||
|
checkV = cmds.button('rMirrorNegButton', q=1 , bgc = 1)
|
||
|
if checkV[0] > 0.30 :
|
||
|
rdMPol = 'n'
|
||
|
divSide = cmds.intSliderGrp('rMirrorSideSlider', q=1 , v = 1)
|
||
|
divOffset = cmds.intSliderGrp('rMirrorOffsetSlider', q=1 , v = 1)
|
||
|
return rdMAxis, rdMPol, divSide, divOffset
|
||
|
|
||
|
def rdMirrorUIUpdate():
|
||
|
answer = ['','','','']
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
answer[0]= cmds.getAttr(beseMesh + '_rMirrorGrp.rdMAxis')
|
||
|
answer[1]= cmds.getAttr(beseMesh + '_rMirrorGrp.rdMHalf')
|
||
|
answer[2]= cmds.getAttr(beseMesh + '_rMirrorGrp.rdMSide')
|
||
|
answer[3]= cmds.getAttr(beseMesh + '_rMirrorGrp.rdMOffset')
|
||
|
rdMirrorReset()
|
||
|
if answer[0] == 'x':
|
||
|
cmds.button('rMirrorXButton',e=1, bgc = [0.34, 0.14, 0.14])
|
||
|
elif answer[0] == 'y':
|
||
|
cmds.button('rMirrorYButton',e=1, bgc = [0.14, 0.34, 0.14])
|
||
|
elif answer[0] == 'z':
|
||
|
cmds.button('rMirrorZButton',e=1, bgc = [0.14, 0.14, 0.34])
|
||
|
if answer[1] == 'p':
|
||
|
cmds.button('rMirrorPosButton', e=1 , bgc = [0.3, 0.5, 0.6])
|
||
|
elif answer[1] == 'n':
|
||
|
cmds.button('rMirrorNegButton', e=1 , bgc = [0.3, 0.5, 0.6])
|
||
|
cmds.intSliderGrp('rMirrorSideSlider', e=1 , v = answer[2] )
|
||
|
cmds.intSliderGrp('rMirrorOffsetSlider', e=1 , v = answer[3] )
|
||
|
else:
|
||
|
rdMirrorReset()
|
||
|
|
||
|
def rdMirrorReset():
|
||
|
cmds.button('rMirrorXButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorYButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorZButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorNegButton', e=1 , bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorPosButton', e=1 , bgc = [0.28,0.28,0.28])
|
||
|
cmds.intSliderGrp('rMirrorSideSlider', e=1 , v = 3)
|
||
|
|
||
|
def rdMirrorOffsetUpdate():
|
||
|
rMirrorList = cmds.ls('*_rMirrorGrp')
|
||
|
offsetV = cmds.intSliderGrp('rMirrorOffsetSlider',q=1,v=1)
|
||
|
for r in rMirrorList:
|
||
|
cmds.move((-1.0*offsetV), 0, 0 ,r , a=1, os=1, wd=1)
|
||
|
cmds.setAttr((r + '.rdMOffset'),offsetV)
|
||
|
|
||
|
def rdMirrorOutput():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
insList = cmds.ls((beseMesh + "_ringGrp*"),fl=1)
|
||
|
cmds.select(beseMesh + "_ringGrp")
|
||
|
collectList = []
|
||
|
for i in insList:
|
||
|
new = cmds.duplicate((beseMesh + "_ringGrp"),rr=1)
|
||
|
collectList.append(new)
|
||
|
cmds.select(new,i)
|
||
|
cmds.matchTransform(pos=1,rot=1)
|
||
|
cmds.delete(insList)
|
||
|
cmds.select(beseMesh + "_rMirrorGrp")
|
||
|
cmds.polyUnite(ch=0, objectPivot=1)
|
||
|
cmds.rename(beseMesh + "_rMirrorGeo")
|
||
|
cmds.delete(beseMesh + "_rMirrorGrp")
|
||
|
cmds.polyMergeVertex(d=0.01, am=1, ch=0)
|
||
|
cmds.select(beseMesh + "_rMirrorGeo")
|
||
|
cmds.button('rMirrorPosButton', e=1 ,bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorNegButton', e=1 ,bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorXButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorYButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorZButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.intSliderGrp('rMirrorSideSlider', e=1 , v = 3)
|
||
|
|
||
|
def rdMirrorHalf(side):
|
||
|
buttonXOn = 1
|
||
|
buttonYOn = 1
|
||
|
buttonZOn = 1
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
bcv = cmds.button('rMirrorXButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX > 0.27:
|
||
|
buttonXOn = 0
|
||
|
|
||
|
bcv = cmds.button('rMirrorYButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX > 0.27:
|
||
|
buttonYOn = 0
|
||
|
|
||
|
bcv = cmds.button('rMirrorZButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX > 0.27:
|
||
|
buttonZOn = 0
|
||
|
if buttonXOn == 0 and buttonYOn == 0 and buttonZOn == 0:
|
||
|
if cmds.objExists(beseMesh + "_rMirrorGrp"):
|
||
|
cmds.delete(beseMesh + "_rMirrorGrp")
|
||
|
else:
|
||
|
if side == 'p':
|
||
|
checkV = cmds.button('rMirrorPosButton', q=1 , bgc = 1)
|
||
|
if checkV[0] < 0.30 :
|
||
|
cmds.button('rMirrorPosButton', e=1 , bgc = [0.3, 0.5, 0.6])
|
||
|
else:
|
||
|
cmds.button('rMirrorPosButton', e=1 , bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorNegButton', e=1 , bgc = [0.28,0.28,0.28])
|
||
|
elif side == 'n':
|
||
|
checkV = cmds.button('rMirrorNegButton', q=1 , bgc = 1)
|
||
|
if checkV[0] < 0.30 :
|
||
|
cmds.button('rMirrorNegButton', e=1 , bgc = [0.3, 0.5, 0.6])
|
||
|
else:
|
||
|
cmds.button('rMirrorNegButton', e=1 , bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorPosButton', e=1 , bgc = [0.28,0.28,0.28])
|
||
|
rdMirrorUpdate()
|
||
|
|
||
|
def rdMirror(axis):
|
||
|
currentSel = cmds.ls(sl=1)
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if len(beseMesh) > 0:
|
||
|
divSide = cmds.intSliderGrp('rMirrorSideSlider', q=1 , v = 1)
|
||
|
divAngle = 360.0 / divSide
|
||
|
commnadA = ''
|
||
|
commnadC = ''
|
||
|
commnadD = ''
|
||
|
commnadG = ''
|
||
|
rotV = 90 - (360.0 / divSide / 2)
|
||
|
createMirror = 1
|
||
|
halfOn = 0
|
||
|
checkVP = cmds.button('rMirrorPosButton', q=1 , bgc = 1)
|
||
|
checkVN = cmds.button('rMirrorNegButton', q=1 , bgc = 1)
|
||
|
if (checkVP[1]+ checkVN[1]) > 0.57:
|
||
|
halfOn = 1
|
||
|
|
||
|
buttonXOn = 1
|
||
|
buttonYOn = 1
|
||
|
buttonZOn = 1
|
||
|
bcv = cmds.button('rMirrorXButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX > 0.27:
|
||
|
buttonXOn = 0
|
||
|
|
||
|
bcv = cmds.button('rMirrorYButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX > 0.27:
|
||
|
buttonYOn = 0
|
||
|
|
||
|
bcv = cmds.button('rMirrorZButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX > 0.27:
|
||
|
buttonZOn = 0
|
||
|
if buttonXOn == 0 and buttonYOn == 0 and buttonZOn == 0:
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
cmds.delete((beseMesh + "_rMirrorGrp"))
|
||
|
|
||
|
if axis == 'x':
|
||
|
if buttonXOn == 1:
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
cmds.delete((beseMesh + "_rMirrorGrp"))
|
||
|
cmds.button('rMirrorXButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
createMirror = 0
|
||
|
else:
|
||
|
if buttonYOn == 1 or buttonZOn == 1:
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
cmds.delete((beseMesh + "_rMirrorGrp"))
|
||
|
commnadA = 'polyMirrorCut 0.001 0 1;'
|
||
|
commnadC = 'rotate -r ' + str(divAngle) + ' 0 0;'
|
||
|
|
||
|
if halfOn == 1:
|
||
|
if checkVP[1] > 0.30:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(90) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(rotV) + ');'
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(90) + ');'
|
||
|
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(rotV) + ');'
|
||
|
cmds.button('rMirrorXButton',e=1, bgc = [0.34, 0.14, 0.14])
|
||
|
cmds.button('rMirrorYButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorZButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
|
||
|
elif axis == 'y':
|
||
|
if buttonYOn == 1:
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
cmds.delete((beseMesh + "_rMirrorGrp"))
|
||
|
cmds.button('rMirrorYButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
createMirror = 0
|
||
|
else:
|
||
|
if buttonXOn == 1 or buttonZOn == 1:
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
cmds.delete((beseMesh + "_rMirrorGrp"))
|
||
|
commnadA = 'polyMirrorCut 0 0.001 1;'
|
||
|
commnadC = 'rotate -r 0 ' + str(divAngle) + ' 0;'
|
||
|
if halfOn == 1:
|
||
|
if checkVP[1] > 0.30:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateY (' + str(90) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateY (-1.0 * ' + str(rotV) + ');'
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateY (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateY (-1.0 * ' + str(90) + ');'
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateY (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateY (-1.0 * ' + str(rotV) + ');'
|
||
|
cmds.button('rMirrorXButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorYButton',e=1, bgc = [0.14, 0.34, 0.14])
|
||
|
cmds.button('rMirrorZButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
else:
|
||
|
if buttonZOn == 1:
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
cmds.delete((beseMesh + "_rMirrorGrp"))
|
||
|
cmds.button('rMirrorZButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
createMirror = 0
|
||
|
else:
|
||
|
if buttonXOn == 1 or buttonYOn == 1:
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
cmds.delete((beseMesh + "_rMirrorGrp"))
|
||
|
|
||
|
commnadA = 'polyMirrorCut 1 0 0.001;'
|
||
|
commnadC = 'rotate -r 0 0 ' + str(divAngle) + ';'
|
||
|
|
||
|
if halfOn == 1:
|
||
|
|
||
|
if checkVP[1] > 0.30:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(90) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(rotV) + ');'
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(90) + ');'
|
||
|
else:
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(rotV) + ');'
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(rotV) + ');'
|
||
|
cmds.button('rMirrorXButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorYButton',e=1, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('rMirrorZButton',e=1, bgc = [0.14, 0.14, 0.34])
|
||
|
|
||
|
if createMirror == 1:
|
||
|
rmSource = beseMesh+ '_bool'
|
||
|
newRing = cmds.duplicate(rmSource)
|
||
|
cmds.rename(newRing , (beseMesh + '_ringGeo'))
|
||
|
cmds.connectAttr( (rmSource+'Shape.outMesh') ,(beseMesh + '_ringGeoShape.inMesh'),f=1)
|
||
|
cmds.select(beseMesh + '_ringGeo')
|
||
|
mel.eval(commnadA)
|
||
|
cmds.rename(beseMesh + '_cutPlaneA')
|
||
|
cmds.select((beseMesh + '_ringGeo'),add=1)
|
||
|
cmds.matchTransform(pos=1)
|
||
|
list = cmds.listConnections((beseMesh + '_cutPlaneA'),t= "transform")
|
||
|
cmds.delete(list[0])
|
||
|
mel.eval(commnadD)
|
||
|
cmds.select(beseMesh + '_ringGeo')
|
||
|
mel.eval(commnadA)
|
||
|
cmds.rename(beseMesh + '_cutPlaneB')
|
||
|
cmds.select((beseMesh + '_ringGeo'),add=1)
|
||
|
cmds.matchTransform(pos=1)
|
||
|
mel.eval(commnadG)
|
||
|
list = cmds.listConnections((beseMesh + '_cutPlaneB'),t= "transform")
|
||
|
|
||
|
if halfOn == 1:
|
||
|
cmds.rename(list[0], (beseMesh + '_ringGeoMirror'))
|
||
|
cmds.group((beseMesh + '_ringGeo'),(beseMesh + '_ringGeoMirror'))
|
||
|
else:
|
||
|
cmds.delete(list[0])
|
||
|
cmds.group((beseMesh + '_ringGeo'))
|
||
|
cmds.rename(beseMesh + '_ringGrp')
|
||
|
getTrans = cmds.xform((beseMesh + '_cutPlaneA'), q=1, piv=1, a=1, ws=1)
|
||
|
cmds.move(getTrans[0], getTrans[1], getTrans[2],(beseMesh + '_ringGrp.scalePivot'), (beseMesh + '_ringGrp.rotatePivot'), a=1, ws=1)
|
||
|
cmds.instance()
|
||
|
mel.eval(commnadC)
|
||
|
for i in range(divSide-2):
|
||
|
cmds.instance(st=1)
|
||
|
cmds.group((beseMesh + '_cutPlane*'),(beseMesh + '_ringGrp*'))
|
||
|
cmds.rename(beseMesh + "_rMirrorGrp")
|
||
|
offsetV = cmds.intSliderGrp('rMirrorOffsetSlider',q=1,v=1)
|
||
|
cmds.move((-1.0*offsetV), 0, 0 ,r=1, os=1, wd=1)
|
||
|
cmds.setAttr((beseMesh + '_cutPlaneA.visibility'),0)
|
||
|
cmds.setAttr((beseMesh + '_cutPlaneB.visibility'),0)
|
||
|
cmds.parent((beseMesh + "_rMirrorGrp"),(beseMesh + "BoolGrp"))
|
||
|
cmds.select(d=1)
|
||
|
if not cmds.attributeQuery('rdMAxis', node = (beseMesh + '_rMirrorGrp'), ex=True ):
|
||
|
cmds.addAttr((beseMesh + '_rMirrorGrp'), ln='rdMAxis' ,dt= 'string')
|
||
|
if not cmds.attributeQuery('rdMHalf', node = (beseMesh + '_rMirrorGrp'), ex=True ):
|
||
|
cmds.addAttr((beseMesh + '_rMirrorGrp'), ln='rdMHalf' ,dt= 'string')
|
||
|
if not cmds.attributeQuery('rdMSide', node = (beseMesh + '_rMirrorGrp'), ex=True ):
|
||
|
cmds.addAttr((beseMesh + '_rMirrorGrp'),at='long' , dv = 0 ,ln='rdMSide')
|
||
|
if not cmds.attributeQuery('rdMOffset', node = (beseMesh + '_rMirrorGrp'), ex=True ):
|
||
|
cmds.addAttr((beseMesh + '_rMirrorGrp'),at='long' , dv = 0 ,ln='rdMOffset')
|
||
|
answer = rdMirrorCurrentState()
|
||
|
cmds.setAttr((beseMesh + '_rMirrorGrp.rdMAxis'), answer[0], type="string")
|
||
|
cmds.setAttr((beseMesh + '_rMirrorGrp.rdMHalf'), answer[1], type="string")
|
||
|
cmds.setAttr((beseMesh + '_rMirrorGrp.rdMSide'), answer[2])
|
||
|
cmds.setAttr((beseMesh + '_rMirrorGrp.rdMOffset'), answer[3])
|
||
|
else:
|
||
|
rdMirrorReset()
|
||
|
if currentSel:
|
||
|
cmds.select(currentSel)
|
||
|
cmds.MoveTool()
|
||
|
|
||
|
def rdMirrorUpdate():
|
||
|
currentSel = cmds.ls(sl=1)
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if len(beseMesh) > 0:
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
divSide = cmds.intSliderGrp('rMirrorSideSlider', q=1 , v = 1)
|
||
|
divAngle = 360.0 / divSide
|
||
|
commnadA = ''
|
||
|
commnadC = ''
|
||
|
commnadD = ''
|
||
|
commnadG = ''
|
||
|
rotV = 90 - (360.0 / divSide / 2)
|
||
|
createMirror = 1
|
||
|
halfOn = 0
|
||
|
checkVP = cmds.button('rMirrorPosButton', q=1 , bgc = 1)
|
||
|
checkVN = cmds.button('rMirrorNegButton', q=1 , bgc = 1)
|
||
|
if (checkVP[1]+ checkVN[1]) > 0.57:
|
||
|
halfOn = 1
|
||
|
buttonXOn = 1
|
||
|
buttonYOn = 1
|
||
|
buttonZOn = 1
|
||
|
bcv = cmds.button('rMirrorXButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX > 0.27:
|
||
|
buttonXOn = 0
|
||
|
bcv = cmds.button('rMirrorYButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX > 0.27:
|
||
|
buttonYOn = 0
|
||
|
bcv = cmds.button('rMirrorZButton',q=1, bgc =1)
|
||
|
totalBcVX = (bcv[0]+ bcv[1]+ bcv[2])/3
|
||
|
if totalBcVX > 0.27:
|
||
|
buttonZOn = 0
|
||
|
if buttonXOn == 1 or buttonYOn == 1 or buttonZOn == 1:
|
||
|
if cmds.objExists((beseMesh + "_rMirrorGrp")):
|
||
|
cmds.delete((beseMesh + "_rMirrorGrp"))
|
||
|
if buttonXOn == 1:
|
||
|
commnadA = 'polyMirrorCut 0.001 0 1;'
|
||
|
commnadC = 'rotate -r ' + str(divAngle) + ' 0 0;'
|
||
|
if halfOn == 1:
|
||
|
if checkVP[1] > 0.30:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(90) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(rotV) + ');'
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(90) + ');'
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(rotV) + ');'
|
||
|
elif buttonYOn == 1:
|
||
|
commnadA = 'polyMirrorCut 0 0.001 1;'
|
||
|
commnadC = 'rotate -r 0 ' + str(divAngle) + ' 0;'
|
||
|
if halfOn == 1:
|
||
|
if checkVP[1] > 0.30:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateY (' + str(90) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateY (-1.0 * ' + str(rotV) + ');'
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateY (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateY (-1.0 * ' + str(90) + ');'
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateY (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateY (-1.0 * ' + str(rotV) + ');'
|
||
|
|
||
|
elif buttonZOn == 1:
|
||
|
commnadA = 'polyMirrorCut 1 0 0.001;'
|
||
|
commnadC = 'rotate -r 0 0 ' + str(divAngle) + ';'
|
||
|
if halfOn == 1:
|
||
|
if checkVP[1] > 0.30:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(90) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(rotV) + ');'
|
||
|
else:
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(rotV) + ');'
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(90) + ');'
|
||
|
else:
|
||
|
commnadD = 'setAttr ' + beseMesh + '_cutPlaneA.rotateX (-1.0 * ' + str(rotV) + ');'
|
||
|
commnadG = 'setAttr ' + beseMesh + '_cutPlaneB.rotateX (' + str(rotV) + ');'
|
||
|
|
||
|
|
||
|
if createMirror == 1:
|
||
|
rmSource = beseMesh+ '_bool'
|
||
|
newRing = cmds.duplicate(rmSource)
|
||
|
cmds.rename(newRing , (beseMesh + '_ringGeo'))
|
||
|
cmds.connectAttr( (rmSource+'Shape.outMesh') ,(beseMesh + '_ringGeoShape.inMesh'),f=1)
|
||
|
cmds.select(beseMesh + '_ringGeo')
|
||
|
mel.eval(commnadA)
|
||
|
cmds.rename(beseMesh + '_cutPlaneA')
|
||
|
cmds.select((beseMesh + '_ringGeo'),add=1)
|
||
|
cmds.matchTransform(pos=1)
|
||
|
list = cmds.listConnections((beseMesh + '_cutPlaneA'),t= "transform")
|
||
|
cmds.delete(list[0])
|
||
|
mel.eval(commnadD)
|
||
|
cmds.select(beseMesh + '_ringGeo')
|
||
|
mel.eval(commnadA)
|
||
|
cmds.rename(beseMesh + '_cutPlaneB')
|
||
|
cmds.select((beseMesh + '_ringGeo'),add=1)
|
||
|
cmds.matchTransform(pos=1)
|
||
|
mel.eval(commnadG)
|
||
|
list = cmds.listConnections((beseMesh + '_cutPlaneB'),t= "transform")
|
||
|
|
||
|
if halfOn == 1:
|
||
|
cmds.rename(list[0], (beseMesh + '_ringGeoMirror'))
|
||
|
cmds.group((beseMesh + '_ringGeo'),(beseMesh + '_ringGeoMirror'))
|
||
|
else:
|
||
|
cmds.delete(list[0])
|
||
|
cmds.group((beseMesh + '_ringGeo'))
|
||
|
cmds.rename(beseMesh + '_ringGrp')
|
||
|
getTrans = cmds.xform((beseMesh + '_cutPlaneA'), q=1, piv=1, a=1, ws=1)
|
||
|
cmds.move(getTrans[0], getTrans[1], getTrans[2],(beseMesh + '_ringGrp.scalePivot'), (beseMesh + '_ringGrp.rotatePivot'), a=1, ws=1)
|
||
|
cmds.instance()
|
||
|
mel.eval(commnadC)
|
||
|
for i in range(divSide-2):
|
||
|
cmds.instance(st=1)
|
||
|
cmds.group((beseMesh + '_cutPlane*'),(beseMesh + '_ringGrp*'))
|
||
|
cmds.rename(beseMesh + "_rMirrorGrp")
|
||
|
offsetV = cmds.intSliderGrp('rMirrorOffsetSlider',q=1,v=1)
|
||
|
cmds.move((-1.0*offsetV), 0, 0 ,r=1, os=1, wd=1)
|
||
|
cmds.setAttr((beseMesh + '_cutPlaneA.visibility'),0)
|
||
|
cmds.setAttr((beseMesh + '_cutPlaneB.visibility'),0)
|
||
|
cmds.parent((beseMesh + "_rMirrorGrp"),(beseMesh + "BoolGrp"))
|
||
|
cmds.select(d=1)
|
||
|
if not cmds.attributeQuery('rdMAxis', node = (beseMesh + '_rMirrorGrp'), ex=True ):
|
||
|
cmds.addAttr((beseMesh + '_rMirrorGrp'), ln='rdMAxis' ,dt= 'string')
|
||
|
if not cmds.attributeQuery('rdMHalf', node = (beseMesh + '_rMirrorGrp'), ex=True ):
|
||
|
cmds.addAttr((beseMesh + '_rMirrorGrp'), ln='rdMHalf' ,dt= 'string')
|
||
|
if not cmds.attributeQuery('rdMSide', node = (beseMesh + '_rMirrorGrp'), ex=True ):
|
||
|
cmds.addAttr((beseMesh + '_rMirrorGrp'),at='long' , dv = 0 ,ln='rdMSide')
|
||
|
if not cmds.attributeQuery('rdMOffset', node = (beseMesh + '_rMirrorGrp'), ex=True ):
|
||
|
cmds.addAttr((beseMesh + '_rMirrorGrp'),at='long' , dv = 0 ,ln='rdMOffset')
|
||
|
answer = rdMirrorCurrentState()
|
||
|
cmds.setAttr((beseMesh + '_rMirrorGrp.rdMAxis'), answer[0], type="string")
|
||
|
cmds.setAttr((beseMesh + '_rMirrorGrp.rdMHalf'), answer[1], type="string")
|
||
|
cmds.setAttr((beseMesh + '_rMirrorGrp.rdMSide'), answer[2])
|
||
|
cmds.setAttr((beseMesh + '_rMirrorGrp.rdMOffset'), answer[3])
|
||
|
else:
|
||
|
rdMirrorReset()
|
||
|
|
||
|
if currentSel:
|
||
|
cmds.select(currentSel)
|
||
|
cmds.MoveTool()
|
||
|
|
||
|
#####################################################################################################
|
||
|
def symmetryCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
getSymX = 0
|
||
|
getSymY = 0
|
||
|
getSymZ = 0
|
||
|
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 1)
|
||
|
mirrorPivot = cmds.objectCenter(beseMesh, gl=True)
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 0)
|
||
|
|
||
|
if cmds.attributeQuery('symmetryX', node = beseMesh, ex=True ):
|
||
|
getSymX = cmds.getAttr(beseMesh+'.symmetryX')
|
||
|
if cmds.attributeQuery('symmetryY', node = beseMesh, ex=True ):
|
||
|
getSymY = cmds.getAttr(beseMesh+'.symmetryY')
|
||
|
if cmds.attributeQuery('symmetryZ', node = beseMesh, ex=True ):
|
||
|
getSymZ = cmds.getAttr(beseMesh+'.symmetryZ')
|
||
|
|
||
|
if getSymX != 0 or getSymY != 0 or getSymZ != 0:
|
||
|
#mirror all cutter
|
||
|
cmds.select((beseMesh+'_bakeStep'), hi=True)
|
||
|
cmds.select((beseMesh+'_bakeStep'),d=True)
|
||
|
cmds.select((beseMesh+'_bakeBaseMesh'),d=True)
|
||
|
restoreCutter = cmds.ls(sl=1,fl=1,type='transform')
|
||
|
for r in restoreCutter:
|
||
|
if getSymX == 1:
|
||
|
cmds.polyMirrorFace(r, cutMesh = 1, axis = 0 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
elif getSymX == -1:
|
||
|
cmds.polyMirrorFace(r, cutMesh = 1, axis = 0 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
|
||
|
if getSymY == 1:
|
||
|
cmds.polyMirrorFace(r, cutMesh = 1, axis = 1 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
elif getSymY == -1:
|
||
|
cmds.polyMirrorFace(r, cutMesh = 1, axis = 1 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
|
||
|
if getSymZ == 1:
|
||
|
cmds.polyMirrorFace(r, cutMesh = 1, axis = 2 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
elif getSymZ == -1:
|
||
|
cmds.polyMirrorFace(r, cutMesh = 1, axis = 2 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
|
||
|
def fadeOutCage():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists(beseMesh+'_cageGrp'):
|
||
|
cmds.setAttr((beseMesh+'_cageGrp.visibility'),1)
|
||
|
storeCurrent = cmds.floatSlider('CageTransparentSlider',q=1 ,value=True)
|
||
|
val = storeCurrent
|
||
|
i = 0.005
|
||
|
while val < 1:
|
||
|
i += 0.005
|
||
|
val = 0.5 + i
|
||
|
cmds.setAttr("CageShader.transparencyB", val)
|
||
|
cmds.setAttr("CageShader.transparencyR", val)
|
||
|
cmds.setAttr("CageShader.transparencyG", val)
|
||
|
cmds.refresh(cv=True,f=True)
|
||
|
|
||
|
cmds.setAttr((beseMesh+'_cageGrp.visibility'),0)
|
||
|
cmds.setAttr("CageShader.transparencyB", storeCurrent)
|
||
|
cmds.setAttr("CageShader.transparencyR", storeCurrent)
|
||
|
cmds.setAttr("CageShader.transparencyG", storeCurrent)
|
||
|
|
||
|
def updateCageColor():
|
||
|
if cmds.objExists('CageShader'):
|
||
|
checkColor = cmds.colorSliderGrp('CageColorSlider', q=True, rgb=True )
|
||
|
cmds.setAttr('CageShader.color', checkColor[0], checkColor[1], checkColor[2] , type= 'double3')
|
||
|
|
||
|
def updateCageTransparent():
|
||
|
if cmds.objExists('CageShader'):
|
||
|
checkTransp = 0
|
||
|
checkTransp = cmds.floatSlider('CageTransparentSlider',q=True, value=True)
|
||
|
cmds.setAttr('CageShader.transparency', checkTransp, checkTransp, checkTransp, type= 'double3')
|
||
|
|
||
|
def cageVisToggle():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
listAllCageGrps = cmds.ls('*_cageGrp')
|
||
|
if cmds.objExists(beseMesh+'_cageGrp'):
|
||
|
checkState = cmds.getAttr(beseMesh+'_cageGrp.visibility')
|
||
|
cmds.hide(listAllCageGrps)
|
||
|
if checkState == 0:
|
||
|
cmds.setAttr((beseMesh+'_cageGrp.visibility'),1)
|
||
|
else:
|
||
|
cmds.setAttr((beseMesh+'_cageGrp.visibility'),0)
|
||
|
else:
|
||
|
cmds.hide(listAllCageGrps)
|
||
|
|
||
|
def boolSymmetryCage():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists(beseMesh +'_cageGrp'):
|
||
|
cmds.delete(beseMesh +'_cageGrp')
|
||
|
if cmds.objExists(beseMesh +'_cageA*'):
|
||
|
cmds.delete(beseMesh +'_cageA*')
|
||
|
tempLattice = cmds.lattice(beseMesh,divisions =(2, 2, 2), objectCentered = True, ldv = (2, 2 ,2))
|
||
|
BBcenter = cmds.xform(tempLattice[1],q =True, t=True)
|
||
|
BBrotate = cmds.xform(tempLattice[1],q =True, ro=True)
|
||
|
BBscale = cmds.xform(tempLattice[1],q =True, r=True, s=True)
|
||
|
BBcube = cmds.polyCube(w =1, h =1, d =1, sx= 1, sy= 1, sz= 1, ax= (0, 1, 0), ch = 0)
|
||
|
cmds.xform(BBcube[0], t = (BBcenter[0], BBcenter[1],BBcenter[2]))
|
||
|
cmds.xform(BBcube[0], ro = (BBrotate[0], BBrotate[1],BBrotate[2]))
|
||
|
cmds.xform(BBcube[0], s = (BBscale[0], BBscale[1],BBscale[2]))
|
||
|
cmds.delete(tempLattice)
|
||
|
cmds.rename(BBcube[0],(beseMesh+'_cageA'))
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 1)
|
||
|
mirrorPivot = cmds.objectCenter(beseMesh, gl=True)
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 0)
|
||
|
cutDir = {'X','Y','Z'}
|
||
|
for c in cutDir:
|
||
|
cutPlane= cmds.polyCut((beseMesh + '_cageA'), ws = True, cd = c , df = True , ch =True)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterX'), mirrorPivot[0])
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterY'), mirrorPivot[1])
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterZ'), mirrorPivot[2])
|
||
|
cmds.DeleteHistory(beseMesh + '_cageA')
|
||
|
cmds.move(mirrorPivot[0],mirrorPivot[1],mirrorPivot[2], (beseMesh + '_cageA.scalePivot'),(beseMesh + '_cageA.rotatePivot'), absolute=True)
|
||
|
cmds.makeIdentity((beseMesh + '_cageA'),apply= True, t= 1, r =1, s =1, n= 0,pn=1)
|
||
|
cmds.setAttr((beseMesh + '_cageA.scaleX'), 1.01)
|
||
|
cmds.setAttr((beseMesh + '_cageA.scaleY'), 1.01)
|
||
|
cmds.setAttr((beseMesh + '_cageA.scaleZ'), 1.01)
|
||
|
cmds.setAttr((beseMesh + '_cageA.visibility'), 0)
|
||
|
cmds.setAttr((beseMesh + '_cageAShape.castsShadows'), 0)
|
||
|
cmds.setAttr((beseMesh + '_cageAShape.receiveShadows'), 0)
|
||
|
cmds.makeIdentity((beseMesh + '_cageA'),apply= True, t= 1, r =1, s =1, n= 0,pn=1)
|
||
|
if not cmds.objExists('CageShader'):
|
||
|
lambertNode = cmds.shadingNode("lambert", asShader=1)
|
||
|
cmds.rename(lambertNode,('CageShader'))
|
||
|
sgNode = cmds.sets(renderable=1, noSurfaceShader=1, empty=1, name= 'CageShaderSG')
|
||
|
cmds.connectAttr('CageShader.color', sgNode+".surfaceShader",f=1)
|
||
|
cmds.connectControl( 'CageColorSlider', 'CageShader.color')
|
||
|
cmds.colorSliderGrp('CageColorSlider', e=True, rgb=(0.5, 0, 0))
|
||
|
cageColor = cmds.colorSliderGrp('CageColorSlider', q=True, rgb=True)
|
||
|
cageTrans = cmds.floatSlider('CageTransparentSlider', q=True, value = True)
|
||
|
cmds.setAttr('CageShader.transparency', cageTrans,cageTrans,cageTrans, type= 'double3')
|
||
|
cmds.setAttr('CageShader.color', cageColor[0],cageColor[1],cageColor[2], type= 'double3')
|
||
|
cmds.sets((beseMesh +'_cageA'), e=1, fe= 'CageShaderSG')
|
||
|
cmds.modelEditor('modelPanel4', e=True, udm=False )
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'_cageGrp'))
|
||
|
cmds.parent((beseMesh +'_cageA'), (beseMesh +'_cageGrp'))
|
||
|
cmds.parent((beseMesh +'_cageGrp'), (beseMesh +'BoolGrp'))
|
||
|
if not cmds.objExists('BoolSymmetryCage'):
|
||
|
cmds.createDisplayLayer(name = ('BoolSymmetryCage'))
|
||
|
cmds.editDisplayLayerMembers( ('BoolSymmetryCage'),(beseMesh +'_cageGrp'))
|
||
|
cmds.setAttr(('BoolSymmetryCage.displayType'),2)
|
||
|
|
||
|
newNode = cmds.duplicate((beseMesh + '_cageA'),rr=True)
|
||
|
cmds.setAttr((newNode[0]+'.scaleX'), -1)
|
||
|
newNode = cmds.duplicate((beseMesh + '_cageA'),rr=True)
|
||
|
cmds.setAttr((newNode[0]+'.scaleY'), -1)
|
||
|
newNode = cmds.duplicate((beseMesh + '_cageA'),rr=True)
|
||
|
cmds.setAttr((newNode[0]+'.scaleZ'), -1)
|
||
|
newNode = cmds.duplicate((beseMesh + '_cageA'),rr=True)
|
||
|
cmds.setAttr((newNode[0]+'.scaleX'), -1)
|
||
|
cmds.setAttr((newNode[0]+'.scaleY'), -1)
|
||
|
newNode = cmds.duplicate((beseMesh + '_cageA'),rr=True)
|
||
|
cmds.setAttr((newNode[0]+'.scaleX'), -1)
|
||
|
cmds.setAttr((newNode[0]+'.scaleZ'), -1)
|
||
|
newNode = cmds.duplicate((beseMesh + '_cageA'),rr=True)
|
||
|
cmds.setAttr((newNode[0]+'.scaleY'), -1)
|
||
|
cmds.setAttr((newNode[0]+'.scaleZ'), -1)
|
||
|
newNode = cmds.duplicate((beseMesh + '_cageA'),rr=True)
|
||
|
cmds.setAttr((newNode[0]+'.scaleX'), -1)
|
||
|
cmds.setAttr((newNode[0]+'.scaleY'), -1)
|
||
|
cmds.setAttr((newNode[0]+'.scaleZ'), -1)
|
||
|
|
||
|
|
||
|
if cmds.attributeQuery('symmetryX', node = beseMesh, ex=True ):
|
||
|
getSymX = cmds.getAttr(beseMesh+'.symmetryX')
|
||
|
if cmds.attributeQuery('symmetryY', node = beseMesh, ex=True ):
|
||
|
getSymY = cmds.getAttr(beseMesh+'.symmetryY')
|
||
|
if cmds.attributeQuery('symmetryZ', node = beseMesh, ex=True ):
|
||
|
getSymZ = cmds.getAttr(beseMesh+'.symmetryZ')
|
||
|
|
||
|
if getSymX != 0 or getSymY != 0 or getSymZ != 0:
|
||
|
cageList = cmds.ls((beseMesh + '_cageA*'),type='transform')
|
||
|
|
||
|
if getSymX == 1:
|
||
|
for c in cageList:
|
||
|
checkX = cmds.getAttr(c+'.scaleX')
|
||
|
if checkX == -1:
|
||
|
cmds.setAttr((c+'.visibility'),1)
|
||
|
|
||
|
|
||
|
elif getSymX == -1:
|
||
|
for c in cageList:
|
||
|
checkX = cmds.getAttr(c+'.scaleX')
|
||
|
if checkX == 1:
|
||
|
cmds.setAttr((c+'.visibility'),1)
|
||
|
|
||
|
|
||
|
if getSymY == 1:
|
||
|
for c in cageList:
|
||
|
checkY = cmds.getAttr(c+'.scaleY')
|
||
|
if checkY == -1:
|
||
|
cmds.setAttr((c+'.visibility'),1)
|
||
|
|
||
|
|
||
|
elif getSymY == -1:
|
||
|
for c in cageList:
|
||
|
checkY = cmds.getAttr(c+'.scaleY')
|
||
|
if checkY == 1:
|
||
|
cmds.setAttr((c+'.visibility'),1)
|
||
|
|
||
|
if getSymZ == 1:
|
||
|
for c in cageList:
|
||
|
checkY = cmds.getAttr(c+'.scaleZ')
|
||
|
if checkY == -1:
|
||
|
cmds.setAttr((c+'.visibility'),1)
|
||
|
|
||
|
|
||
|
elif getSymZ == -1:
|
||
|
for c in cageList:
|
||
|
checkY = cmds.getAttr(c+'.scaleZ')
|
||
|
if checkY == 1:
|
||
|
cmds.setAttr((c+'.visibility'),1)
|
||
|
cmds.select(cl=True)
|
||
|
|
||
|
def boolSymmetryReset():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
symmNode = cmds.listConnections(cmds.listHistory((beseMesh+'_bool'),af=1),type='polyMirror')
|
||
|
if symmNode != None :
|
||
|
if len(symmNode)>0:
|
||
|
cmds.delete(symmNode)
|
||
|
|
||
|
resetBoolSymmetryUI()
|
||
|
if cmds.objExists(beseMesh +'_cageGrp'):
|
||
|
cmds.delete(beseMesh +'_cageGrp')
|
||
|
|
||
|
def resetBoolSymmetryUI():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
|
||
|
if not cmds.attributeQuery('symmetryX', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryX', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),0)
|
||
|
if not cmds.attributeQuery('symmetryY', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryY', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),0)
|
||
|
if not cmds.attributeQuery('symmetryZ', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryZ', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),0)
|
||
|
cmds.button('symmXButtonP',e=True, bgc = [0.14, 0.14, 0.14])
|
||
|
cmds.button('symmYButtonP',e=True, bgc = [0.14, 0.14, 0.14])
|
||
|
cmds.button('symmZButtonP',e=True, bgc = [0.14, 0.14, 0.14])
|
||
|
cmds.button('symmXButtonN',e=True, bgc = [0.14, 0.14, 0.14])
|
||
|
cmds.button('symmYButtonN',e=True, bgc = [0.14, 0.14, 0.14])
|
||
|
cmds.button('symmZButtonN',e=True, bgc = [0.14, 0.14, 0.14])
|
||
|
|
||
|
def boolSymmetryFreeze():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
symmNode = cmds.listConnections(cmds.listHistory((beseMesh+'_bool'),af=1),type='polyMirror')
|
||
|
if symmNode != None and len(symmNode)>0:
|
||
|
bakeCutter('all')
|
||
|
symmetryCutter()
|
||
|
symmetryBase()
|
||
|
cmds.select(cl=True)
|
||
|
restoreCutter()
|
||
|
resetBoolSymmetryUI()
|
||
|
if cmds.objExists(beseMesh +'_cageGrp'):
|
||
|
cmds.delete(beseMesh +'_cageGrp')
|
||
|
|
||
|
def symmetryBase():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
getSymX = 0
|
||
|
getSymY = 0
|
||
|
getSymZ = 0
|
||
|
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 1)
|
||
|
mirrorPivot = cmds.objectCenter(beseMesh, gl=True)
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 0)
|
||
|
|
||
|
|
||
|
if cmds.attributeQuery('symmetryX', node = beseMesh, ex=True ):
|
||
|
getSymX = cmds.getAttr(beseMesh+'.symmetryX')
|
||
|
if cmds.attributeQuery('symmetryY', node = beseMesh, ex=True ):
|
||
|
getSymY = cmds.getAttr(beseMesh+'.symmetryY')
|
||
|
if cmds.attributeQuery('symmetryZ', node = beseMesh, ex=True ):
|
||
|
getSymZ = cmds.getAttr(beseMesh+'.symmetryZ')
|
||
|
|
||
|
if getSymX != 0 or getSymY != 0 or getSymZ != 0:
|
||
|
if getSymX == 1:
|
||
|
cmds.polyMirrorFace(beseMesh, cutMesh = 1, axis = 0 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
elif getSymX == -1:
|
||
|
cmds.polyMirrorFace(beseMesh, cutMesh = 1, axis = 0 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
|
||
|
if getSymY == 1:
|
||
|
cmds.polyMirrorFace(beseMesh, cutMesh = 1, axis = 1 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
elif getSymY == -1:
|
||
|
cmds.polyMirrorFace(beseMesh, cutMesh = 1, axis = 1 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
|
||
|
if getSymZ == 1:
|
||
|
cmds.polyMirrorFace(beseMesh, cutMesh = 1, axis = 2 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
elif getSymZ == -1:
|
||
|
cmds.polyMirrorFace(beseMesh, cutMesh = 1, axis = 2 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =1, p = mirrorPivot)
|
||
|
cmds.DeleteHistory()
|
||
|
|
||
|
def boolSymmetry(axis,dir):
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selPoly = beseMesh+'_bool'
|
||
|
|
||
|
if not cmds.attributeQuery('symmetryX', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryX', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),0)
|
||
|
if not cmds.attributeQuery('symmetryY', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryY', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),0)
|
||
|
if not cmds.attributeQuery('symmetryZ', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryZ', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),0)
|
||
|
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 1)
|
||
|
mirrorPivot = cmds.objectCenter(beseMesh, gl=True)
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 0)
|
||
|
|
||
|
|
||
|
mirrorName = []
|
||
|
checkSymm = 0
|
||
|
symmNode = cmds.listConnections(cmds.listHistory((selPoly),af=1),type='polyMirror')
|
||
|
if axis == 'x' :
|
||
|
checkDirState=[]
|
||
|
if symmNode != None:
|
||
|
for s in symmNode:
|
||
|
if 'symmetryX' in s:
|
||
|
checkSymm = 1
|
||
|
checkDirState = s
|
||
|
if checkSymm == 0:
|
||
|
if dir == 1:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 0 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),1)
|
||
|
cmds.button('symmXButtonP',e=True, bgc = [0.34, 0.14, 0.14])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryXP'))
|
||
|
else:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 0 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),-1)
|
||
|
cmds.button('symmXButtonN',e=True, bgc = [0.34, 0.14, 0.14])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryXN'))
|
||
|
else:
|
||
|
if cmds.objExists((beseMesh +'_symmetryXP')):
|
||
|
cmds.delete(beseMesh + '_symmetryXP')
|
||
|
if cmds.objExists((beseMesh +'_symmetryXN')):
|
||
|
cmds.delete(beseMesh + '_symmetryXN')
|
||
|
cmds.button('symmXButtonP',e=True, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('symmXButtonN',e=True, bgc = [0.28,0.28,0.28])
|
||
|
if dir == 1:
|
||
|
if checkDirState == (beseMesh + '_symmetryXP'):# same button press, remove it
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),0)
|
||
|
else:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 0 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),1)
|
||
|
cmds.button('symmXButtonP',e=True, bgc = [0.34, 0.14, 0.14])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryXP'))
|
||
|
else:
|
||
|
if checkDirState == (beseMesh + '_symmetryXN'):# same button press, remove it
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),0)
|
||
|
else:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 0 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),-1)
|
||
|
cmds.button('symmXButtonN',e=True, bgc = [0.34, 0.14, 0.14])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryXN'))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
elif axis == 'y' :
|
||
|
checkDirState=[]
|
||
|
if symmNode != None:
|
||
|
for s in symmNode:
|
||
|
if 'symmetryY' in s:
|
||
|
checkSymm = 1
|
||
|
checkDirState = s
|
||
|
if checkSymm == 0:
|
||
|
if dir == 1:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 1 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),1)
|
||
|
cmds.button('symmYButtonP',e=True, bgc = [0.14, 0.34, 0.14])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryYP'))
|
||
|
else:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 1 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),-1)
|
||
|
cmds.button('symmYButtonN',e=True, bgc = [0.14, 0.34, 0.14])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryYN'))
|
||
|
|
||
|
|
||
|
else:
|
||
|
if cmds.objExists((beseMesh +'_symmetryYP')):
|
||
|
cmds.delete(beseMesh + '_symmetryYP')
|
||
|
if cmds.objExists((beseMesh +'_symmetryYN')):
|
||
|
cmds.delete(beseMesh + '_symmetryYN')
|
||
|
cmds.button('symmYButtonP',e=True, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('symmYButtonN',e=True, bgc = [0.28,0.28,0.28])
|
||
|
if dir == 1:
|
||
|
if checkDirState == (beseMesh + '_symmetryYP'):# same button press, remove it
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),0)
|
||
|
else:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 1 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),1)
|
||
|
cmds.button('symmYButtonP',e=True, bgc = [0.14, 0.34, 0.14])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryYP'))
|
||
|
else:
|
||
|
if checkDirState == (beseMesh + '_symmetryYN'):# same button press, remove it
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),0)
|
||
|
else:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 1 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),-1)
|
||
|
cmds.button('symmYButtonN',e=True, bgc = [0.14, 0.34, 0.14])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryYN'))
|
||
|
|
||
|
|
||
|
else:
|
||
|
checkDirState=[]
|
||
|
if symmNode != None:
|
||
|
for s in symmNode:
|
||
|
if 'symmetryZ' in s:
|
||
|
checkSymm = 1
|
||
|
checkDirState = s
|
||
|
if checkSymm == 0:
|
||
|
if dir == 1:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 2 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),1)
|
||
|
cmds.button('symmZButtonP',e=True, bgc = [0.14, 0.14, 0.34])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryZP'))
|
||
|
else:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 2 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),-1)
|
||
|
cmds.button('symmZButtonN',e=True, bgc = [0.14, 0.14, 0.34])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryZN'))
|
||
|
|
||
|
else:
|
||
|
if cmds.objExists((beseMesh +'_symmetryZP')):
|
||
|
cmds.delete(beseMesh + '_symmetryZP')
|
||
|
if cmds.objExists((beseMesh +'_symmetryZN')):
|
||
|
cmds.delete(beseMesh + '_symmetryZN')
|
||
|
cmds.button('symmZButtonP',e=True, bgc = [0.28,0.28,0.28])
|
||
|
cmds.button('symmZButtonN',e=True, bgc = [0.28,0.28,0.28])
|
||
|
if dir == 1:
|
||
|
if checkDirState == (beseMesh + '_symmetryZP'):# same button press, remove it
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),0)
|
||
|
else:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 2 , axisDirection = 1 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),1)
|
||
|
cmds.button('symmZButtonP',e=True, bgc = [0.14, 0.14, 0.34])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryZP'))
|
||
|
else:
|
||
|
if checkDirState == (beseMesh + '_symmetryZN'):# same button press, remove it
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),0)
|
||
|
else:
|
||
|
mirrorName = cmds.polyMirrorFace(selPoly, cutMesh = 1, axis = 2 , axisDirection = 0 , mergeMode = 1 , mergeThresholdType = 0 , mergeThreshold = 0.001 , mirrorAxis = 2, mirrorPosition= 0, smoothingAngle = 30, flipUVs = 0, ch=1, ws =True, p = mirrorPivot)
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),-1)
|
||
|
cmds.button('symmZButtonN',e=True, bgc = [0.14, 0.14, 0.34])
|
||
|
cmds.rename(mirrorName[0],(beseMesh + '_symmetryZN'))
|
||
|
|
||
|
|
||
|
boolSymmetryCage()
|
||
|
|
||
|
def loadSymmetryState():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
symmNode = cmds.listConnections(cmds.listHistory((beseMesh+'_bool'),af=1),type='polyMirror')
|
||
|
cmds.button('symmXButtonP',e=True, bgc = [0.28, 0.28, 0.28])
|
||
|
cmds.button('symmYButtonP',e=True, bgc = [0.28, 0.28, 0.28])
|
||
|
cmds.button('symmZButtonP',e=True, bgc = [0.28, 0.28, 0.28])
|
||
|
cmds.button('symmXButtonN',e=True, bgc = [0.28, 0.28, 0.28])
|
||
|
cmds.button('symmYButtonN',e=True, bgc = [0.28, 0.28, 0.28])
|
||
|
cmds.button('symmZButtonN',e=True, bgc = [0.28, 0.28, 0.28])
|
||
|
|
||
|
checkState = 0
|
||
|
if symmNode != None:
|
||
|
for s in symmNode:
|
||
|
if 'symmetryXP' in s :
|
||
|
cmds.button('symmXButtonP',e=True, bgc = [0.34, 0.14, 0.14])
|
||
|
checkState = 1
|
||
|
elif 'symmetryXN' in s :
|
||
|
cmds.button('symmXButtonN',e=True, bgc = [0.34, 0.14, 0.14])
|
||
|
checkState = 1
|
||
|
elif 'symmetryYP' in s :
|
||
|
cmds.button('symmYButtonP',e=True, bgc = [0.14, 0.34, 0.14])
|
||
|
checkState = 1
|
||
|
elif 'symmetryYN' in s :
|
||
|
cmds.button('symmYButtonN',e=True, bgc = [0.14, 0.34, 0.14])
|
||
|
checkState = 1
|
||
|
elif 'symmetryZP' in s :
|
||
|
cmds.button('symmZButtonP',e=True, bgc = [0.14, 0.14, 0.34])
|
||
|
checkState = 1
|
||
|
elif 'symmetryZN' in s :
|
||
|
cmds.button('symmZButtonN',e=True, bgc = [0.14, 0.14, 0.34])
|
||
|
checkState = 1
|
||
|
|
||
|
def screenRes():
|
||
|
windowUnder = cmds.getPanel(withFocus=True)
|
||
|
if 'modelPanel' not in windowUnder:
|
||
|
windowUnder = 'modelPanel4'
|
||
|
viewNow = omui.M3dView()
|
||
|
omui.M3dView.getM3dViewFromModelEditor(windowUnder, viewNow)
|
||
|
screenW = omui.M3dView.portWidth(viewNow)
|
||
|
screenH = omui.M3dView.portHeight(viewNow)
|
||
|
return screenW,screenH
|
||
|
|
||
|
def worldSpaceToImageSpace(cameraName, worldPoint):
|
||
|
resWidth,resHeight = screenRes()
|
||
|
selList = om.MSelectionList()
|
||
|
selList.add(cameraName)
|
||
|
dagPath = om.MDagPath()
|
||
|
selList.getDagPath(0,dagPath)
|
||
|
dagPath.extendToShape()
|
||
|
camInvMtx = dagPath.inclusiveMatrix().inverse()
|
||
|
fnCam = om.MFnCamera(dagPath)
|
||
|
mFloatMtx = fnCam.projectionMatrix()
|
||
|
projMtx = om.MMatrix(mFloatMtx.matrix)
|
||
|
mPoint = om.MPoint(worldPoint[0],worldPoint[1],worldPoint[2]) * camInvMtx * projMtx;
|
||
|
x = (mPoint[0] / mPoint[3] / 2 + .5) * resWidth
|
||
|
y = (mPoint[1] / mPoint[3] / 2 + .5) * resHeight
|
||
|
|
||
|
return [x,y]
|
||
|
|
||
|
def evenObjLineUp(dir):
|
||
|
lineupList = cmds.ls(sl=1,fl=1)
|
||
|
#collect 2d posision
|
||
|
view = omui.M3dView.active3dView()
|
||
|
cam = om.MDagPath()
|
||
|
view.getCamera(cam)
|
||
|
camPath = cam.fullPathName()
|
||
|
cameraTrans = cmds.listRelatives(camPath,type='transform',p=True)
|
||
|
dataX = {}
|
||
|
dataY = {}
|
||
|
for l in lineupList:
|
||
|
bbox = cmds.xform(l, q=True, ws=True, piv=True)
|
||
|
pos2D = worldSpaceToImageSpace(cameraTrans[0],(bbox[0],bbox[1],bbox[2]))
|
||
|
dataX.update( {l : pos2D[0]} )
|
||
|
dataY.update( {l : pos2D[1]} )
|
||
|
|
||
|
if dir == 'x' :
|
||
|
score = OrderedDict(sorted(dataX.items(), key = lambda fd: fd[1],reverse = False))
|
||
|
else:
|
||
|
score = OrderedDict(sorted(dataY.items(), key = lambda fd: fd[1],reverse = False))
|
||
|
|
||
|
#use fd[0] to get name order, fd[1] to get key order
|
||
|
orderList = []
|
||
|
for key in score:
|
||
|
orderList.append(key)
|
||
|
# get distanceGap
|
||
|
posStart = cmds.xform(orderList[0], q=True, ws=True, piv=True)
|
||
|
posEnd = cmds.xform(orderList[-1], q=True, ws=True, piv=True)
|
||
|
gapX = (posEnd[0] - posStart[0]) / (len(orderList) - 1)
|
||
|
gapY = (posEnd[1] - posStart[1]) / (len(orderList) - 1)
|
||
|
gapZ = (posEnd[2] - posStart[2]) / (len(orderList) - 1)
|
||
|
|
||
|
|
||
|
rotStartX = cmds.getAttr(orderList[0]+'.rotateX')
|
||
|
rotStartY = cmds.getAttr(orderList[0]+'.rotateY')
|
||
|
rotStartZ = cmds.getAttr(orderList[0]+'.rotateZ')
|
||
|
rotEndX = cmds.getAttr(orderList[-1]+'.rotateX')
|
||
|
rotEndY = cmds.getAttr(orderList[-1]+'.rotateY')
|
||
|
rotEndZ = cmds.getAttr(orderList[-1]+'.rotateZ')
|
||
|
|
||
|
rotX = (rotEndX - rotStartX) / (len(orderList) - 1)
|
||
|
rotY = (rotEndY - rotStartY) / (len(orderList) - 1)
|
||
|
rotZ = (rotEndZ - rotStartZ) / (len(orderList) - 1)
|
||
|
|
||
|
|
||
|
|
||
|
for i in range(1,(len(orderList)-1)):
|
||
|
cmds.move( (posStart[0] + (i *gapX)) , (posStart[1] + (i *gapY)), (posStart[2] + (i *gapZ)), orderList[i], rpr = True ,absolute=True )
|
||
|
cmds.setAttr( (orderList[i] + '.rotateX'), ((i *rotX)+ rotStartX) )
|
||
|
cmds.setAttr( (orderList[i] + '.rotateY'), ((i *rotY)+ rotStartY) )
|
||
|
cmds.setAttr( (orderList[i] + '.rotateZ'), ((i *rotZ)+ rotStartZ) )
|
||
|
|
||
|
def borderAlginBBoxDivUpdate():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if not cmds.objExists(beseMesh +'_borderBox'):
|
||
|
borderAlginBBoxCreate()
|
||
|
checkDiv = cmds.intSliderGrp('bboxDivSlider', q=True, v = True)
|
||
|
cmds.setAttr((beseMesh + '_bbox.subdivisionsDepth') , checkDiv)
|
||
|
cmds.setAttr((beseMesh + '_bbox.subdivisionsWidth') , checkDiv)
|
||
|
cmds.setAttr((beseMesh + '_bbox.subdivisionsHeight'), checkDiv)
|
||
|
|
||
|
def borderAlginBBoxCreate():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selStore = cmds.ls(sl=True,fl=True)
|
||
|
checkDiv = cmds.intSliderGrp('bboxDivSlider', q=True, v = True)
|
||
|
if not cmds.objExists(beseMesh +'_borderBoxGrp') and not cmds.objExists(beseMesh +'_borderBox'):
|
||
|
tempLattice = cmds.lattice(beseMesh,divisions =(2, 2, 2), objectCentered = True, ldv = (2, 2 ,2))
|
||
|
BBcenter = cmds.xform(tempLattice[1],q =True, t=True)
|
||
|
BBrotate = cmds.xform(tempLattice[1],q =True, ro=True)
|
||
|
BBscale = cmds.xform(tempLattice[1],q =True, r=True, s=True)
|
||
|
BBcube = cmds.polyCube(w =1, h =1, d =1, sx= checkDiv, sy= checkDiv, sz= checkDiv, ax= (0, 1, 0), ch = 1)
|
||
|
cmds.rename(BBcube[0],(beseMesh+'_borderBox'))
|
||
|
cmds.rename(BBcube[1],(beseMesh+'_bbox'))
|
||
|
|
||
|
cmds.xform((beseMesh+'_borderBox'), t = (BBcenter[0], BBcenter[1],BBcenter[2]))
|
||
|
cmds.xform((beseMesh+'_borderBox'), ro = (BBrotate[0], BBrotate[1],BBrotate[2]))
|
||
|
cmds.xform((beseMesh+'_borderBox'), s = (BBscale[0], BBscale[1],BBscale[2]))
|
||
|
cmds.delete(tempLattice)
|
||
|
|
||
|
cmds.group()
|
||
|
cmds.rename(beseMesh+'_borderBoxGrp')
|
||
|
cmds.parent((beseMesh+'_borderBoxGrp'), (beseMesh+'BoolGrp'))
|
||
|
if not cmds.objExists('BorderBox'):
|
||
|
cmds.createDisplayLayer(name = ('BorderBox'))
|
||
|
cmds.editDisplayLayerMembers( ('BorderBox'),(beseMesh+'_borderBoxGrp'))
|
||
|
cmds.setAttr(('BorderBox.displayType'),1)
|
||
|
cmds.select(selStore)
|
||
|
|
||
|
def borderAlginBBoxToggle():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selStore = cmds.ls(sl=True,fl=True)
|
||
|
if not cmds.objExists(beseMesh +'_borderBoxGrp') and not cmds.objExists(beseMesh +'_borderBox'):
|
||
|
borderAlginBBoxCreate()
|
||
|
cmds.button('borderAlginButton',e=True, bgc = [0.3,0.5,0.6])
|
||
|
cmds.makeLive( beseMesh +'_borderBox' )
|
||
|
cmds.manipMoveContext('Move',e=True, snapLivePoint= True)
|
||
|
else:
|
||
|
cmds.delete(beseMesh +'_borderBoxGrp')
|
||
|
cmds.button('borderAlginButton',e=True, bgc = [0.28,0.28,0.28])
|
||
|
cmds.makeLive( none=True )
|
||
|
cmds.manipMoveContext('Move',e=True, snapLivePoint= False)
|
||
|
cmds.select(selStore)
|
||
|
|
||
|
def toggleAxisButton(dir):
|
||
|
if dir == "X":
|
||
|
checkStateX = cmds.button('toggleAxisX', q=True , bgc =True )
|
||
|
if (checkStateX[0] < 0.285):
|
||
|
cmds.button('toggleAxisX', e=True , bgc = [.3, 0, 0] )
|
||
|
cmds.button('toggleAxisXYZ', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
else:
|
||
|
cmds.button('toggleAxisX', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
if dir == "Y":
|
||
|
checkStateY = cmds.button('toggleAxisY', q=True , bgc =True )
|
||
|
if (checkStateY[1] < 0.285):
|
||
|
cmds.button('toggleAxisY', e=True , bgc = [0, 0.3, 0] )
|
||
|
cmds.button('toggleAxisXYZ', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
else:
|
||
|
cmds.button('toggleAxisY', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
if dir == "Z":
|
||
|
checkStateZ = cmds.button('toggleAxisZ', q=True , bgc =True )
|
||
|
if (checkStateZ[2] < 0.285):
|
||
|
cmds.button('toggleAxisZ', e=True , bgc = [0, 0, 0.3] )
|
||
|
cmds.button('toggleAxisXYZ', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
else:
|
||
|
cmds.button('toggleAxisZ', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
|
||
|
if dir == "XYZ":
|
||
|
checkState = cmds.button('toggleAxisXYZ', q=True , bgc =True )
|
||
|
if (checkState[0] < 0.285):
|
||
|
cmds.button('toggleAxisXYZ', e=True , bgc = [0.3, 0.5, 0.6] )
|
||
|
cmds.button('toggleAxisX', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
cmds.button('toggleAxisY', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
cmds.button('toggleAxisZ', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
|
||
|
else:
|
||
|
cmds.button('toggleAxisXYZ', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
cmds.button('toggleAxisX', e=True , bgc = [.3, 0, 0] )
|
||
|
|
||
|
checkStateX = cmds.button('toggleAxisX', q=True , bgc =True )
|
||
|
checkStateY = cmds.button('toggleAxisY', q=True , bgc =True )
|
||
|
checkStateZ = cmds.button('toggleAxisZ', q=True , bgc =True )
|
||
|
if (checkStateX[0] < 0.285) and (checkStateY[1] < 0.285) and (checkStateZ[2] < 0.285):
|
||
|
cmds.button('toggleAxisXYZ', e=True , bgc = [0.3, 0.5, 0.6] )
|
||
|
elif (checkStateX[0] > 0.285) and (checkStateY[1] > 0.285) and (checkStateZ[2] > 0.285):
|
||
|
cmds.button('toggleAxisXYZ', e=True , bgc = [0.3, 0.5, 0.6] )
|
||
|
cmds.button('toggleAxisX', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
cmds.button('toggleAxisY', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
cmds.button('toggleAxisZ', e=True ,bgc = [0.28,0.28,0.28] )
|
||
|
|
||
|
def alignSelCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
cutterList = cmds.ls(type='transform',os=1)
|
||
|
if len(cutterList) == 2:
|
||
|
currentX = cmds.getAttr(cutterList[0]+'.translateX')
|
||
|
currentY = cmds.getAttr(cutterList[0]+'.translateY')
|
||
|
currentZ = cmds.getAttr(cutterList[0]+'.translateZ')
|
||
|
cmds.select(cutterList[0],cutterList[1],r=True)
|
||
|
cmds.MatchTranslation()
|
||
|
checkState = cmds.button('toggleAxisXYZ', q=True , bgc =True )
|
||
|
if checkState[0] < 0.285:
|
||
|
checkStateX = cmds.button('toggleAxisX', q=True , bgc =True )
|
||
|
if checkStateX[0] <0.285:
|
||
|
cmds.setAttr((cutterList[0]+'.translateX'),currentX)
|
||
|
|
||
|
checkStateY = cmds.button('toggleAxisY', q=True , bgc =True )
|
||
|
if checkStateY[1] <0.285:
|
||
|
cmds.setAttr((cutterList[0]+'.translateY'),currentY)
|
||
|
checkStateZ = cmds.button('toggleAxisZ', q=True , bgc =True )
|
||
|
if checkStateZ[2] <0.285:
|
||
|
cmds.setAttr((cutterList[0]+'.translateZ'),currentZ)
|
||
|
cmds.select(cutterList[0])
|
||
|
|
||
|
def alignLastCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selCutter = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(beseMesh+'_cutterGrp')
|
||
|
cmds.select(hi=True)
|
||
|
cmds.select((beseMesh+'_cutterGrp'),d=True)
|
||
|
cmds.select(selCutter,d=True)
|
||
|
cutterList = cmds.ls(sl=1,fl=1,type='transform')
|
||
|
if len(cutterList) > 0:
|
||
|
lastCutter = cutterList[-1]
|
||
|
for s in selCutter:
|
||
|
currentX = cmds.getAttr(s+'.translateX')
|
||
|
currentY = cmds.getAttr(s+'.translateY')
|
||
|
currentZ = cmds.getAttr(s+'.translateZ')
|
||
|
cmds.select(s,lastCutter,r=True)
|
||
|
cmds.MatchTranslation()
|
||
|
checkState = cmds.button('toggleAxisXYZ', q=True , bgc =True )
|
||
|
if checkState[0] < 0.285:
|
||
|
checkStateX = cmds.button('toggleAxisX', q=True , bgc =True )
|
||
|
if checkStateX[0] <0.285:
|
||
|
cmds.setAttr((s+'.translateX'),currentX)
|
||
|
|
||
|
checkStateY = cmds.button('toggleAxisY', q=True , bgc =True )
|
||
|
if checkStateY[1] <0.285:
|
||
|
cmds.setAttr((s+'.translateY'),currentY)
|
||
|
checkStateZ = cmds.button('toggleAxisZ', q=True , bgc =True )
|
||
|
if checkStateZ[2] <0.285:
|
||
|
cmds.setAttr((s+'.translateZ'),currentZ)
|
||
|
cmds.select(selCutter)
|
||
|
|
||
|
def alignCutterToBase():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selCutters = cmds.ls(sl=True,fl=True)
|
||
|
if len(selCutters) > 0:
|
||
|
if cmds.objExists('tempSnap'):
|
||
|
cmds.delete('tempSnap')
|
||
|
if cmds.objExists(beseMesh+'_borderBox') == 0:
|
||
|
borderAlginBBoxToggle()
|
||
|
|
||
|
borderBox = beseMesh + '_borderBox'
|
||
|
cvNo = cmds.polyEvaluate(borderBox, v=True )
|
||
|
|
||
|
for s in selCutters:
|
||
|
checkMinDistance = 10000000
|
||
|
cutterPosition = cmds.xform(s, q =True, sp=True,ws=True)
|
||
|
closetestPos = [0,0,0]
|
||
|
currentX = cmds.getAttr(s+'.translateX')
|
||
|
currentY = cmds.getAttr(s+'.translateY')
|
||
|
currentZ = cmds.getAttr(s+'.translateZ')
|
||
|
for i in range(cvNo):
|
||
|
cvBboxPosition = cmds.pointPosition(borderBox+'.vtx[' + str(i) + ']',w=1)
|
||
|
checkDistance = math.sqrt( ((cutterPosition[0] - cvBboxPosition[0])**2) + ((cutterPosition[1] - cvBboxPosition[1])**2) + ((cutterPosition[2] - cvBboxPosition[2])**2))
|
||
|
if checkDistance < checkMinDistance:
|
||
|
checkMinDistance = checkDistance
|
||
|
closetestPos = cvBboxPosition
|
||
|
cmds.spaceLocator( p=(closetestPos[0], closetestPos[1], closetestPos[2]),n='tempSnap')
|
||
|
cmds.CenterPivot()
|
||
|
cmds.select(s,'tempSnap',r=True)
|
||
|
cmds.MatchTranslation()
|
||
|
cmds.delete('tempSnap')
|
||
|
checkState = cmds.button('toggleAxisXYZ', q=True , bgc =True )
|
||
|
if checkState[0] < 0.285:
|
||
|
checkStateX = cmds.button('toggleAxisX', q=True , bgc =True )
|
||
|
if checkStateX[0] <0.285:
|
||
|
cmds.setAttr((s+'.translateX'),currentX)
|
||
|
|
||
|
checkStateY = cmds.button('toggleAxisY', q=True , bgc =True )
|
||
|
if checkStateY[1] <0.285:
|
||
|
cmds.setAttr((s+'.translateY'),currentY)
|
||
|
|
||
|
checkStateZ = cmds.button('toggleAxisZ', q=True , bgc =True )
|
||
|
if checkStateZ[2] <0.285:
|
||
|
cmds.setAttr((s+'.translateZ'),currentZ)
|
||
|
borderAlginBBoxToggle()
|
||
|
cmds.select(selCutters)
|
||
|
|
||
|
def combineSelCutters():#work with different type of OP, but mixing type may be cause unexpect result
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selList = cmds.ls(sl=True,fl=True)
|
||
|
restoreMissingGrps()
|
||
|
getOpType = ''
|
||
|
if len(selList) > 1:
|
||
|
#bake array
|
||
|
for s in selList:
|
||
|
if cmds.objExists(s):
|
||
|
cmds.select(s)
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
instBake()
|
||
|
newNode = cmds.ls(sl=1,fl=1)
|
||
|
selList.append(newNode[0])
|
||
|
subsGrp = []
|
||
|
unionGrp = []
|
||
|
cutGrp = []
|
||
|
for b in selList:
|
||
|
longName = '|' + beseMesh + 'BoolGrp' + '|' + beseMesh+'_cutterGrp|' + b
|
||
|
if cmds.objExists(longName):
|
||
|
checkOP = cmds.getAttr(longName + '.cutterOp')
|
||
|
if checkOP == 'subs':
|
||
|
subsGrp.append(b)
|
||
|
elif checkOP == 'union':
|
||
|
unionGrp.append(b)
|
||
|
elif checkOP == 'cut':
|
||
|
cutGrp.append(b)
|
||
|
if (len(subsGrp) + len(unionGrp) + len(cutGrp))>1:
|
||
|
#union each type
|
||
|
selList = subsGrp
|
||
|
if len(selList)> 0:
|
||
|
cmds.select(selList)
|
||
|
while len(selList) > 1:
|
||
|
cmds.polyCBoolOp(selList[0], selList[1], op=1, ch=1, preserveColor=0, classification=1, name=selList[0])
|
||
|
cmds.DeleteHistory()
|
||
|
if cmds.objExists(selList[1]):
|
||
|
cmds.delete(selList[1])
|
||
|
cmds.rename(selList[0])
|
||
|
selList.remove(selList[1])
|
||
|
cmds.rename('subsMesh')
|
||
|
|
||
|
selList = unionGrp
|
||
|
if len(selList)> 0:
|
||
|
cmds.select(selList)
|
||
|
while len(selList) > 1:
|
||
|
cmds.polyCBoolOp(selList[0], selList[1], op=1, ch=1, preserveColor=0, classification=1, name=selList[0])
|
||
|
cmds.DeleteHistory()
|
||
|
if cmds.objExists(selList[1]):
|
||
|
cmds.delete(selList[1])
|
||
|
cmds.rename(selList[0])
|
||
|
selList.remove(selList[1])
|
||
|
cmds.rename('unionMesh')
|
||
|
|
||
|
selList = cutGrp
|
||
|
if len(selList)> 0:
|
||
|
cmds.select(selList)
|
||
|
while len(selList) > 1:
|
||
|
cmds.polyCBoolOp(selList[0], selList[1], op=1, ch=1, preserveColor=0, classification=1, name=selList[0])
|
||
|
cmds.DeleteHistory()
|
||
|
if cmds.objExists(selList[1]):
|
||
|
cmds.delete(selList[1])
|
||
|
cmds.rename(selList[0])
|
||
|
selList.remove(selList[1])
|
||
|
cmds.rename('cutMesh')
|
||
|
|
||
|
if cmds.objExists('subsMesh'):
|
||
|
if cmds.objExists('unionMesh'):
|
||
|
cmds.polyCBoolOp('subsMesh', 'unionMesh', op=2, ch=1, preserveColor=0, classification=1, name='outMesh')
|
||
|
if cmds.objExists('cutMesh'):
|
||
|
cmds.polyCBoolOp('outMesh', 'cutMesh', op=1, ch=1, preserveColor=0, classification=1, name='outMesh')
|
||
|
else:
|
||
|
if cmds.objExists('cutMesh'):
|
||
|
cmds.polyCBoolOp('subsMesh', 'cutMesh', op=1, ch=1, preserveColor=0, classification=1, name='outMesh')
|
||
|
newCutter = cmds.ls(sl=1,fl=1)
|
||
|
cmds.DeleteHistory('outMesh')
|
||
|
useOwnCutterShape()
|
||
|
cutterType('subs')
|
||
|
|
||
|
else:
|
||
|
if cmds.objExists('unionMesh'):
|
||
|
if cmds.objExists('cutMesh'):
|
||
|
cmds.polyCBoolOp('unionMesh', 'cutMesh', op=2, ch=1, preserveColor=0, classification=1, name='outMesh')
|
||
|
newCutter = cmds.ls(sl=1,fl=1)
|
||
|
cmds.DeleteHistory('outMesh')
|
||
|
useOwnCutterShape()
|
||
|
cutterType('union')
|
||
|
|
||
|
cleanList = ['subsMesh','cutMesh','unionMesh','outMesh']
|
||
|
for l in cleanList:
|
||
|
if cmds.objExists(l):
|
||
|
cmds.delete(l)
|
||
|
else:
|
||
|
print('need more then one cutter!')
|
||
|
|
||
|
def recreateBool():
|
||
|
#recreate bool
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
|
||
|
cleanList = ['_mySubs','_myUnion','_preSubBox','_preUnionBox','_myBoolUnion','_afterSubBox','_myBoolSub','_myCut']
|
||
|
for l in cleanList:
|
||
|
if cmds.objExists(beseMesh + l):
|
||
|
cmds.delete(beseMesh + l)
|
||
|
if cmds.objExists((beseMesh +'_bool')) ==0:
|
||
|
cmds.polyCube(w = 0.0001, h=0.0001, d=0.0001 ,sx =1 ,sy= 1, sz= 1)
|
||
|
cmds.rename(beseMesh +'_preSubBox')
|
||
|
|
||
|
cmds.polyCube(w = 0.0001, h=0.0001, d=0.0001 ,sx =1 ,sy= 1, sz= 1)
|
||
|
cmds.rename(beseMesh +'_afterSubBox')
|
||
|
|
||
|
cmds.polyCube(w = 0.0001, h=0.0001, d=0.0001 ,sx =1 ,sy= 1, sz= 1)
|
||
|
cmds.rename(beseMesh +'_preUnionBox')
|
||
|
|
||
|
subNode= cmds.polyCBoolOp((beseMesh ), (beseMesh +'_preSubBox') , op= 2, ch= 1, preserveColor= 0, classification= 1, name= (beseMesh +'_bool'))
|
||
|
cmds.rename(subNode[0],(beseMesh +'_myBoolSub'))
|
||
|
|
||
|
unionNode = cmds.polyCBoolOp((beseMesh +'_myBoolSub'), (beseMesh +'_preUnionBox') , op= 1, ch= 1, preserveColor= 0, classification= 1, name= (beseMesh +'_union'))
|
||
|
cmds.rename(unionNode[0],(beseMesh +'_myBoolUnion'))
|
||
|
|
||
|
subNode= cmds.polyCBoolOp((beseMesh +'_myBoolUnion'), (beseMesh +'_afterSubBox') , op= 2, ch= 1, preserveColor= 0, classification= 1, name= (beseMesh +'_bool'))
|
||
|
cmds.rename(subNode[0],(beseMesh +'_bool'))
|
||
|
|
||
|
boolNode = cmds.listConnections(cmds.listHistory((beseMesh +'_bool'),f=1,ac=1),type='polyCBoolOp')
|
||
|
boolNode = set(boolNode)
|
||
|
|
||
|
#hack it by check '_', this is used by other group
|
||
|
listClean = []
|
||
|
for b in boolNode:
|
||
|
if '_' not in b:
|
||
|
listClean.append(b)
|
||
|
|
||
|
if len(listClean) == 3:
|
||
|
for l in listClean:
|
||
|
checkOp = cmds.getAttr( l +'.operation')
|
||
|
if checkOp == 2:
|
||
|
if cmds.objExists(beseMesh +'_mySubs'):
|
||
|
cmds.rename(l,(beseMesh +'_myCut'))
|
||
|
else:
|
||
|
cmds.rename(l,(beseMesh +'_mySubs'))
|
||
|
else:
|
||
|
cmds.rename(l,(beseMesh +'_myUnion'))
|
||
|
|
||
|
cmds.setAttr((beseMesh + '.visibility'), 0)
|
||
|
cmds.setAttr((beseMesh+'Shape.intermediateObject'), 0)
|
||
|
|
||
|
baseShapeNode = cmds.listRelatives(beseMesh, f = True)
|
||
|
cmds.parent(baseShapeNode, beseMesh+'BoolGrp')
|
||
|
cmds.delete(beseMesh)
|
||
|
cmds.rename(beseMesh)
|
||
|
|
||
|
cmds.editDisplayLayerMembers( (beseMesh +'_BoolResult'),(beseMesh +'_bool')) # store my selection into the display layer
|
||
|
cmds.setAttr((beseMesh +'_BoolResult.displayType'),2)
|
||
|
|
||
|
checkList = ['_cutterGrp','_preSubBox','_preUnionBox','_myBoolUnion','_bool', '', '_afterSubBox','_myBoolSub' ]
|
||
|
for c in checkList:
|
||
|
checkGrp = cmds.ls((beseMesh + c), l=True)
|
||
|
if 'BoolGrp' not in checkGrp[0]:
|
||
|
cmds.parent(checkGrp[0],(beseMesh +'BoolGrp'))
|
||
|
|
||
|
cmds.select(cl=True)
|
||
|
meshBBox()
|
||
|
|
||
|
def bakeCutter(mode):
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selectedCutter = cmds.ls(sl=1,fl=1)
|
||
|
checkGrp = cmds.ls(sl=1,fl=1,l=1)
|
||
|
if mode == 'unselect' and len(selectedCutter) == 0:
|
||
|
print('nothing selected!')
|
||
|
else:
|
||
|
#store any symmtry
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 1)
|
||
|
mirrorPivot = cmds.objectCenter(beseMesh, gl=True)
|
||
|
cmds.setAttr((beseMesh+'.visibility'), 0)
|
||
|
getSymX = 0
|
||
|
getSymY = 0
|
||
|
getSymZ = 0
|
||
|
if cmds.attributeQuery('symmetryX', node = beseMesh, ex=True ):
|
||
|
getSymX = cmds.getAttr(beseMesh+'.symmetryX')
|
||
|
if cmds.attributeQuery('symmetryY', node = beseMesh, ex=True ):
|
||
|
getSymY = cmds.getAttr(beseMesh+'.symmetryY')
|
||
|
if cmds.attributeQuery('symmetryZ', node = beseMesh, ex=True ):
|
||
|
getSymZ = cmds.getAttr(beseMesh+'.symmetryZ')
|
||
|
#flatten all cutters
|
||
|
flattenAlllCutter()
|
||
|
if mode == 'unselect':
|
||
|
if beseMesh in checkGrp[0]:#check if cutter in current base mesh
|
||
|
#getList after flattern
|
||
|
cleanList = []
|
||
|
for s in selectedCutter:
|
||
|
if 'ArrayGrp' in s:
|
||
|
s = s.replace("ArrayGrp", "")
|
||
|
if cmds.objExists(s.split('|')[-1]):
|
||
|
cleanList.append(s.split('|')[-1])
|
||
|
cmds.select(cleanList)
|
||
|
#disconnect from bool
|
||
|
for c in cleanList:
|
||
|
shapeNode = cmds.listRelatives(c, f = True, shapes=True)
|
||
|
if len(shapeNode)>0:
|
||
|
listConnect = cmds.connectionInfo((shapeNode[0]+'.outMesh'), dfs=True )
|
||
|
if len(listConnect)>0:
|
||
|
for a in listConnect:
|
||
|
cmds.disconnectAttr((shapeNode[0]+'.outMesh'), a)
|
||
|
listConnectMa = cmds.connectionInfo((shapeNode[0]+'.worldMatrix[0]'), dfs=True )
|
||
|
if len(listConnectMa)>0:
|
||
|
for b in listConnectMa:
|
||
|
cmds.disconnectAttr((shapeNode[0]+'.worldMatrix[0]'), b)
|
||
|
# move to temp grp
|
||
|
if cmds.objExists((beseMesh +'_tempStoreGrp')) == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'_tempStoreGrp'))
|
||
|
cmds.parent((beseMesh +'_tempStoreGrp'), (beseMesh+'BoolGrp'))
|
||
|
cmds.parent(cleanList , (beseMesh +'_tempStoreGrp'))
|
||
|
|
||
|
#make bool mesh as new base mesh
|
||
|
newMesh = cmds.duplicate((beseMesh+'_bool'),rr=1)
|
||
|
cmds.delete(beseMesh+'_bool')
|
||
|
#create Step up Group
|
||
|
if cmds.objExists((beseMesh +'_bakeStep')) == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'_bakeStep'))
|
||
|
cmds.parent((beseMesh +'_bakeStep'), (beseMesh+'BoolGrp'))
|
||
|
cmds.setAttr((beseMesh +'_bakeStep.visibility'),0)
|
||
|
|
||
|
if cmds.objExists((beseMesh +'_bakeBaseMesh')) == 0:
|
||
|
#bake base mesh
|
||
|
bakeMesh = cmds.duplicate(beseMesh, rr=1)
|
||
|
cmds.delete(beseMesh)
|
||
|
cmds.parent(bakeMesh,(beseMesh +'_bakeStep'))
|
||
|
cmds.rename(bakeMesh,(beseMesh +'_bakeBaseMesh'))
|
||
|
bakeShape = cmds.listRelatives((beseMesh +'_bakeBaseMesh'), shapes=True,f=True)
|
||
|
#cmds.setAttr((bakeShape[0] + '.overrideShading'), 1)
|
||
|
cmds.rename(newMesh,beseMesh)
|
||
|
else:
|
||
|
cmds.delete(beseMesh)
|
||
|
cmds.rename(newMesh,beseMesh)
|
||
|
if cmds.objExists(beseMesh +'_myBool'):
|
||
|
cmds.delete(beseMesh+'_myBool')
|
||
|
#reNumber
|
||
|
cmds.select((beseMesh+'_bakeStep'), hi=True)
|
||
|
cmds.select((beseMesh+'_bakeStep'),(beseMesh +'_bakeBaseMesh'),d=True)
|
||
|
existCutterList = cmds.ls(sl=1,fl=1,type='transform')
|
||
|
#start rename old cutters
|
||
|
cmds.select((beseMesh+'_cutterGrp'), hi=True)
|
||
|
cmds.select((beseMesh+'_cutterGrp'),d=True)
|
||
|
oldCutterList = cmds.ls(sl=1,fl=1,type='transform')
|
||
|
initalIndex = len(existCutterList) + 2
|
||
|
for o in oldCutterList:
|
||
|
newName = ('bakeCutter' + str(initalIndex))
|
||
|
cmds.rename(o, newName)
|
||
|
initalIndex += 1
|
||
|
newList= cmds.ls(sl=1,fl=1,type='transform')
|
||
|
if len(newList)>0:
|
||
|
cmds.parent(newList,(beseMesh +'_bakeStep'))
|
||
|
|
||
|
#unlock connection
|
||
|
shape = cmds.listRelatives(beseMesh, shapes=True,f=True)
|
||
|
checkConnection = cmds.listConnections((shape[0]+'.drawOverride'),c=1,p=1)
|
||
|
if checkConnection != None:
|
||
|
cmds.disconnectAttr(checkConnection[1],checkConnection[0])
|
||
|
|
||
|
#recreate bool
|
||
|
recreateBool()
|
||
|
cmds.move(mirrorPivot[0],mirrorPivot[1],mirrorPivot[2], (beseMesh + ".scalePivot"),(beseMesh + ".rotatePivot"), absolute=True)
|
||
|
|
||
|
if mode == 'unselect':
|
||
|
|
||
|
#reconnect selected Cutters
|
||
|
newCutterList = []
|
||
|
for c in cleanList:
|
||
|
cmds.select(c)
|
||
|
fixBoolNodeConnection()
|
||
|
newC = cmds.ls(sl=1)
|
||
|
newCutterList.append(newC[0])
|
||
|
|
||
|
cmds.parent(newCutterList , (beseMesh +'_cutterGrp'))
|
||
|
if cmds.objExists((beseMesh +'_tempStoreGrp')):
|
||
|
cmds.delete((beseMesh +'_tempStoreGrp'))
|
||
|
|
||
|
setCutterBaseMesh()
|
||
|
if mode == 'unselect':
|
||
|
cmds.select(selectedCutter)
|
||
|
|
||
|
#restore symmetry
|
||
|
if not cmds.attributeQuery('symmetryX', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryX', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),getSymX)
|
||
|
if not cmds.attributeQuery('symmetryY', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryY', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),getSymY)
|
||
|
if not cmds.attributeQuery('symmetryZ', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryZ', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),getSymZ)
|
||
|
|
||
|
#checkSymmetryState
|
||
|
checkSymX = cmds.getAttr(beseMesh+'.symmetryX')
|
||
|
checkSymY = cmds.getAttr(beseMesh+'.symmetryY')
|
||
|
checkSymZ = cmds.getAttr(beseMesh+'.symmetryZ')
|
||
|
|
||
|
if checkSymX == 1:
|
||
|
boolSymmetry('x',1)
|
||
|
elif checkSymX == -1:
|
||
|
boolSymmetry('x',2)
|
||
|
|
||
|
if checkSymY == 1:
|
||
|
boolSymmetry('y',1)
|
||
|
elif checkSymY == -1:
|
||
|
boolSymmetry('y',2)
|
||
|
|
||
|
if checkSymZ == 1:
|
||
|
boolSymmetry('z',1)
|
||
|
elif checkSymZ == -1:
|
||
|
boolSymmetry('z',2)
|
||
|
|
||
|
#hide all cage
|
||
|
if cmds.objExists(beseMesh + '_cageGrp'):
|
||
|
cmds.hide(beseMesh + '_cageGrp')
|
||
|
#cageList = cmds.ls((beseMesh + '_cage*'),type='transform')
|
||
|
#for c in cageList:
|
||
|
# cmds.setAttr((c+'.visibility'),0)
|
||
|
cmds.optionMenu('baseMeshMenu', e = True, value = beseMesh)
|
||
|
restoreMissingGrps()
|
||
|
|
||
|
def restoreCutterWithSymmtry():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
#check current
|
||
|
shapes = cmds.listRelatives((beseMesh+'_bool'), shapes=True)
|
||
|
shadeEng = cmds.listConnections(shapes , type = 'shadingEngine')
|
||
|
materials = cmds.ls(cmds.listConnections(shadeEng ), materials = True)
|
||
|
checkX1 = cmds.button('symmXButtonP', q=1 , bgc = 1)
|
||
|
checkX2 = cmds.button('symmXButtonN', q=1 , bgc = 1)
|
||
|
checkY1 = cmds.button('symmYButtonP', q=1 , bgc = 1)
|
||
|
checkY2 = cmds.button('symmYButtonN', q=1 , bgc = 1)
|
||
|
checkZ1 = cmds.button('symmZButtonP', q=1 , bgc = 1)
|
||
|
checkZ2 = cmds.button('symmZButtonN', q=1 , bgc = 1)
|
||
|
restoreCutter()
|
||
|
if checkX1[0]>0.29:
|
||
|
boolSymmetry("x" ,1)
|
||
|
if checkX2[0]>0.29:
|
||
|
boolSymmetry("x" ,2)
|
||
|
|
||
|
if checkY1[1]>0.29:
|
||
|
boolSymmetry("y" ,1)
|
||
|
if checkY2[1]>0.29:
|
||
|
boolSymmetry("y" ,2)
|
||
|
|
||
|
if checkZ1[2]>0.29:
|
||
|
boolSymmetry("z" ,1)
|
||
|
if checkZ2[2]>0.29:
|
||
|
boolSymmetry("z" ,2)
|
||
|
#resotre shader
|
||
|
if materials[0] == (beseMesh+'_Shader'):
|
||
|
cmds.sets((beseMesh+'_bool'), e=True, forceElement = (beseMesh+'_ShaderSG'))
|
||
|
else:
|
||
|
cmds.sets((beseMesh+'_bool'), e=True, forceElement = 'initialShadingGroup')
|
||
|
|
||
|
def restoreCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists((beseMesh +'_cutterGrp')) == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'_cutterGrp'))
|
||
|
cmds.parent((beseMesh +'_cutterGrp'),(beseMesh +'BoolGrp'))
|
||
|
|
||
|
if cmds.objExists((beseMesh +'_bool')) ==0:
|
||
|
cmds.polyCube(w = 0.01, h=0.01, d=0.01 ,sx =1 ,sy= 1, sz= 1)
|
||
|
cmds.rename(beseMesh +'_preSubBox')
|
||
|
cmds.polyCube(w = 0.01, h=0.01, d=0.01 ,sx =1 ,sy= 1, sz= 1)
|
||
|
cmds.rename(beseMesh +'_preUnionBox')
|
||
|
unionNode = cmds.polyCBoolOp(beseMesh, (beseMesh +'_preUnionBox') , op= 1, ch= 1, preserveColor= 0, classification= 1, name= (beseMesh +'_union'))
|
||
|
cmds.rename(unionNode[0],(beseMesh +'_myBoolUnion'))
|
||
|
subNode= cmds.polyCBoolOp((beseMesh +'_myBoolUnion'), (beseMesh +'_preSubBox') , op= 2, ch= 1, preserveColor= 0, classification= 1, name= (beseMesh +'_bool'))
|
||
|
cmds.rename(subNode[0],(beseMesh +'_bool'))
|
||
|
boolNode = cmds.listConnections(cmds.listHistory((beseMesh +'_bool'),f=1,ac=1),type='polyCBoolOp')
|
||
|
boolNode = set(boolNode)
|
||
|
|
||
|
#hack it by check '_', this is used by other group
|
||
|
listClean = []
|
||
|
for b in boolNode:
|
||
|
if '_' not in b:
|
||
|
listClean.append(b)
|
||
|
|
||
|
|
||
|
if len(listClean) == 3:
|
||
|
for l in listClean:
|
||
|
checkOp = cmds.getAttr( l +'.operation')
|
||
|
if checkOp == 2:
|
||
|
if cmds.objExists(beseMesh +'_mySubs'):
|
||
|
cmds.rename(l,(beseMesh +'_myCut'))
|
||
|
else:
|
||
|
cmds.rename(l,(beseMesh +'_mySubs'))
|
||
|
else:
|
||
|
cmds.rename(l,(beseMesh +'_myUnion'))
|
||
|
|
||
|
cmds.setAttr((beseMesh + '.visibility'), 0)
|
||
|
baseNodes = cmds.listRelatives(beseMesh, ad = True, f = True)
|
||
|
baseTransNode = cmds.ls(baseNodes,type = 'transform')
|
||
|
baseMeshNode = cmds.ls(baseNodes,type = 'mesh')
|
||
|
cmds.setAttr((baseMeshNode[0]+'.intermediateObject'), 0)
|
||
|
cmds.parent(baseMeshNode[0],(beseMesh +'BoolGrp'))
|
||
|
cmds.delete(beseMesh)
|
||
|
cmds.rename(beseMesh)
|
||
|
|
||
|
bakeCutter('all')
|
||
|
cmds.delete(beseMesh+'_bool')
|
||
|
cmds.delete(beseMesh)
|
||
|
cmds.parent((beseMesh +'_bakeBaseMesh'), (beseMesh+'BoolGrp'))
|
||
|
cmds.rename((beseMesh +'_bakeBaseMesh'), beseMesh)
|
||
|
baseShape = cmds.listRelatives((beseMesh), shapes=True,f=True)
|
||
|
checkAtt = cmds.getAttr(baseShape[0] + '.overrideShading')
|
||
|
if checkAtt == 0:
|
||
|
cmds.setAttr((baseShape[0] + '.overrideShading'), 1)
|
||
|
#recreate bool
|
||
|
recreateBool()
|
||
|
#restore cutters
|
||
|
cmds.select((beseMesh+'_bakeStep'), hi=True)
|
||
|
cmds.select((beseMesh+'_bakeStep'),d=True)
|
||
|
restoreCutterList = cmds.ls(sl=1,fl=1,type='transform')
|
||
|
for r in restoreCutterList:
|
||
|
shapeNode = cmds.listRelatives(r, f = True, shapes=True)
|
||
|
cmds.setAttr( (shapeNode[0]+".overrideEnabled") , 1)
|
||
|
cmds.setAttr( (shapeNode[0]+".overrideShading") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".castsShadows") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".receiveShadows") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".primaryVisibility") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".visibleInReflections") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".visibleInRefractions") , 0)
|
||
|
cmds.select(r)
|
||
|
fixBoolNodeConnection()
|
||
|
name = r.split('|')[-1]
|
||
|
checkNumber = ''.join([n for n in name.split('|')[-1] if n.isdigit()])
|
||
|
cmds.rename(r ,('boxCutter' + str(checkNumber)))
|
||
|
|
||
|
if cmds.objExists((beseMesh +'_cutterGrp')):
|
||
|
cmds.delete(beseMesh +'_cutterGrp')
|
||
|
|
||
|
cmds.rename((beseMesh +'_bakeStep'),(beseMesh +'_cutterGrp'))
|
||
|
cmds.select(cl=True)
|
||
|
showAllCutter()
|
||
|
fixShadowLink()
|
||
|
|
||
|
def flattenAlllCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
cmds.select((beseMesh+'_cutterGrp'), hi=True)
|
||
|
cmds.select((beseMesh+'_cutterGrp'),d=True)
|
||
|
if cmds.objExists('bakeCutter*'):
|
||
|
cmds.select('bakeCutter*',d=True)
|
||
|
selList = cmds.ls(sl=1,fl=1,type='transform')
|
||
|
if len(selList) > 1:
|
||
|
#bake array
|
||
|
for s in selList:
|
||
|
if cmds.objExists(s):
|
||
|
cmds.select(s)
|
||
|
myType = checkInstType()
|
||
|
if myType[1] != 'new':
|
||
|
instBake()
|
||
|
newNode = cmds.ls(sl=1,fl=1)
|
||
|
selList.append(newNode[0])
|
||
|
|
||
|
def freeResultMesh():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists((beseMesh+'_Done')) == 0 :
|
||
|
bakeCutter("all")
|
||
|
resultMesh = beseMesh +'_bool'
|
||
|
cmds.select(resultMesh)
|
||
|
cmds.duplicate(rr=True)
|
||
|
cmds.rename(beseMesh+'_Done')
|
||
|
newNode = cmds.ls(sl=True,fl=True)
|
||
|
shapeNew = cmds.listRelatives(newNode[0], s=True )
|
||
|
cmds.parent(w=True)
|
||
|
cmds.layerButton((beseMesh +'_BoolResult'), e=True ,lv=0)
|
||
|
cmds.setAttr((beseMesh +'BoolGrp.visibility'),0)
|
||
|
cmds.disconnectAttr((beseMesh+'_BoolResult.drawInfo'), (shapeNew[0]+'.drawOverride'))
|
||
|
cmds.editDisplayLayerMembers('defaultLayer',newNode)
|
||
|
cmds.hide(beseMesh+'BoolGrp')
|
||
|
|
||
|
def drawCurveNow():
|
||
|
cmds.snapMode(grid=1)
|
||
|
cmds.CVCurveTool()
|
||
|
|
||
|
def makeDrawBlock():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
curveSel = cmds.ls(sl=1,fl=1)
|
||
|
if len(curveSel) == 1 :
|
||
|
cmds.snapMode(grid=0)
|
||
|
shapeNode = cmds.listRelatives(curveSel[0], f = True, shapes=True)
|
||
|
checkOpen = cmds.getAttr(shapeNode[0]+'.form')
|
||
|
if checkOpen == 0:
|
||
|
cmds.closeCurve( curveSel[0], ch=True, rpo=True )
|
||
|
|
||
|
cmds.select(curveSel)
|
||
|
cmds.duplicate()
|
||
|
cmds.group(w=True)
|
||
|
cmds.rename('tempMirrorGrp')
|
||
|
|
||
|
cmds.parent('tempMirrorGrp','lineDrawPlaneOffset')
|
||
|
cmds.FreezeTransformations()
|
||
|
getPresize = cmds.floatField( 'cuterPreSize' , q=1, value = True)
|
||
|
setScale = cmds.floatSliderGrp('cutterScaleSlider', q=1, value = True)
|
||
|
cmds.setAttr('tempMirrorGrp.translateZ',(getPresize*setScale*0.5*-1))
|
||
|
|
||
|
cmds.Ungroup()
|
||
|
cmds.select(curveSel,add=1)
|
||
|
cmds.FreezeTransformations()
|
||
|
curveSel = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(curveSel)
|
||
|
loftNode = cmds.loft(ch =1, u=1, c= 0, ar= 1, d= 3, ss= 1, rn= 0, po =1, rsn= True)
|
||
|
list = cmds.listConnections(loftNode, type = 'nurbsTessellate')
|
||
|
|
||
|
cmds.setAttr((list[0]+'.polygonType'), 1)
|
||
|
checkCurveType = cmds.getAttr(curveSel[0]+'.degree')
|
||
|
if checkCurveType > 1:
|
||
|
cmds.setAttr((list[0]+'.format'), 0)
|
||
|
else:
|
||
|
cmds.setAttr((list[0]+'.format'), 2)
|
||
|
cmds.setAttr((list[0]+'.uNumber'), 1)
|
||
|
cmds.setAttr((list[0]+'.vNumber'), 1)
|
||
|
cmds.FillHole()
|
||
|
cmds.delete(curveSel)
|
||
|
cmds.rename('drawBlock')
|
||
|
blockSel = cmds.listRelatives(cmds.listRelatives(f = True, shapes=True), parent=1 , f=1 )
|
||
|
cmds.CenterPivot()
|
||
|
cmds.polyMergeVertex(blockSel,d = 0.01, am= 1,ch=0)
|
||
|
cmds.polySetToFaceNormal()
|
||
|
renew = cmds.listRelatives(cmds.listRelatives(f = True, shapes=True), parent=1 , f=1 )
|
||
|
cmds.DeleteHistory()
|
||
|
#fix normal direction
|
||
|
checkNormalMehs = cmds.ls(sl=1,fl=1,l=1)
|
||
|
cmds.polyExtrudeFacet(constructionHistory = 1, keepFacesTogether= 1, ltz = 0.001)
|
||
|
cmds.polySeparate(checkNormalMehs,ch=0)
|
||
|
testMesh = cmds.ls(sl=1,fl=1)
|
||
|
|
||
|
worldFaceA = cmds.polyEvaluate(testMesh[0],wa=True)
|
||
|
worldFaceB = cmds.polyEvaluate(testMesh[1],wa=True)
|
||
|
if worldFaceA > worldFaceB:
|
||
|
cmds.delete(testMesh[1])
|
||
|
else:
|
||
|
cmds.delete(testMesh[0])
|
||
|
|
||
|
cmds.parent(w=True)
|
||
|
cmds.delete(checkNormalMehs[0])
|
||
|
cmds.rename('drawBlock1')
|
||
|
newBlock = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(newBlock[0])
|
||
|
|
||
|
#remove unwant edgeLoop
|
||
|
if checkCurveType > 1:
|
||
|
cmds.polySelectConstraint(m=3,t=0x0008,sz=3)
|
||
|
cmds.polySelectConstraint(disable =True)
|
||
|
ngon = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(ngon)
|
||
|
cmds.ConvertSelectionToEdges()
|
||
|
hardEdge = cmds.ls(sl=1,fl=1)
|
||
|
cmds.SelectEdgeRingSp()
|
||
|
cmds.select(hardEdge,d=1)
|
||
|
cmds.polyDelEdge(cv=1)
|
||
|
cmds.select(newBlock[0])
|
||
|
|
||
|
cmds.parent(newBlock[0],'drawPlaneGrp')
|
||
|
cmds.FreezeTransformations()
|
||
|
cmds.CenterPivot()
|
||
|
cmds.parent(newBlock[0],w=True)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.ScaleTool()
|
||
|
|
||
|
def goPressDraw():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
snapMesh = (beseMesh +'_bool')
|
||
|
if cmds.objExists('snapLive*'):
|
||
|
cmds.delete('snapLive*')
|
||
|
cmds.duplicate(snapMesh,n='snapLive')
|
||
|
cmds.setAttr('snapLive.visibility',0)
|
||
|
global ctxCutter
|
||
|
if cmds.draggerContext(ctxCutter, exists=True):
|
||
|
cmds.deleteUI(ctxCutter)
|
||
|
cmds.draggerContext(ctxCutter, pressCommand = onPressDrawGrid, dragCommand = onDragDrawGridCMD, rc = offPressDrawGrid, name=ctxCutter, cursor='crossHair',undoMode='all')
|
||
|
cmds.setToolTo(ctxCutter)
|
||
|
|
||
|
def onDragDrawGridCMD():
|
||
|
cmds.undoInfo(swf=0)
|
||
|
onDragDrawGrid()
|
||
|
cmds.undoInfo(swf=1)
|
||
|
|
||
|
def onDragDrawGrid():
|
||
|
global ctxCutter
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctxCutter, query=True, dragPoint=True)
|
||
|
screenX = vpX
|
||
|
screenY = vpY
|
||
|
pos = om.MPoint()
|
||
|
dir = om.MVector()
|
||
|
hitpoint = om.MFloatPoint()
|
||
|
omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, dir)
|
||
|
pos2 = om.MFloatPoint(pos.x, pos.y, pos.z)
|
||
|
#current camera
|
||
|
view = omui.M3dView.active3dView()
|
||
|
cam = om.MDagPath()
|
||
|
view.getCamera(cam)
|
||
|
camPath = cam.fullPathName()
|
||
|
cameraTrans = cmds.listRelatives(camPath,type='transform',p=True)
|
||
|
cameraPosition = cmds.xform(cameraTrans,q=1,ws=1,rp=1)
|
||
|
checkHit = 0
|
||
|
finalMesh = []
|
||
|
finalX = []
|
||
|
finalY = []
|
||
|
finalZ = []
|
||
|
shortDistance = 10000000000
|
||
|
distanceBetween = 1000000000
|
||
|
hitFacePtr = om.MScriptUtil().asIntPtr()
|
||
|
hitFace = []
|
||
|
checkList = []
|
||
|
checkList.append('snapLive')
|
||
|
for mesh in checkList:
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add(mesh)
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
fnMesh = om.MFnMesh(dagPath)
|
||
|
|
||
|
intersection = fnMesh.closestIntersection(
|
||
|
om.MFloatPoint(pos2),
|
||
|
om.MFloatVector(dir),
|
||
|
None,
|
||
|
None,
|
||
|
False,
|
||
|
om.MSpace.kWorld,
|
||
|
99999,
|
||
|
False,
|
||
|
None,
|
||
|
hitpoint,
|
||
|
None,
|
||
|
hitFacePtr,
|
||
|
None,
|
||
|
None,
|
||
|
None)
|
||
|
|
||
|
if intersection:
|
||
|
x = hitpoint.x
|
||
|
y = hitpoint.y
|
||
|
z = hitpoint.z
|
||
|
distanceBetween = math.sqrt( ((float(cameraPosition[0]) - x)**2) + ((float(cameraPosition[1]) - y)**2) + ((float(cameraPosition[2]) - z)**2))
|
||
|
if distanceBetween < shortDistance:
|
||
|
shortDistance = distanceBetween
|
||
|
finalMesh = mesh
|
||
|
finalX = x
|
||
|
finalY = y
|
||
|
finalZ = z
|
||
|
hitFace = om.MScriptUtil(hitFacePtr).asInt()
|
||
|
hitFaceName = (mesh + '.f[' + str(hitFace) +']')
|
||
|
rx, ry, rz = getFaceAngle(hitFaceName)
|
||
|
cmds.move(finalX,finalY,finalZ,'drawPlaneGrp',absolute=1)
|
||
|
tz = cmds.floatSliderGrp('snapGirdOffset', q=True, v = True)
|
||
|
cmds.setAttr('drawPlaneGrp.rotateX', rx)
|
||
|
cmds.setAttr('drawPlaneGrp.rotateY', ry)
|
||
|
cmds.setAttr('drawPlaneGrp.rotateZ', rz)
|
||
|
#cmds.setAttr('lineDrawPlaneOffset.translateX', 0)
|
||
|
#cmds.setAttr('lineDrawPlaneOffset.translateY', 0)
|
||
|
cmds.setAttr('lineDrawPlaneOffset.translateZ',tz)
|
||
|
cmds.refresh(cv=True,f=True)
|
||
|
|
||
|
def offPressDrawGrid():
|
||
|
if cmds.objExists('snapLive*'):
|
||
|
cmds.delete('snapLive*')
|
||
|
cmds.setToolTo('moveSuperContext')
|
||
|
|
||
|
def onPressDrawGrid():
|
||
|
global ctxCutter
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctxCutter, query=True, anchorPoint=True)
|
||
|
screenX = vpX
|
||
|
screenY = vpY
|
||
|
pos = om.MPoint()
|
||
|
dir = om.MVector()
|
||
|
hitpoint = om.MFloatPoint()
|
||
|
omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, dir)
|
||
|
pos2 = om.MFloatPoint(pos.x, pos.y, pos.z)
|
||
|
#current camera
|
||
|
view = omui.M3dView.active3dView()
|
||
|
cam = om.MDagPath()
|
||
|
view.getCamera(cam)
|
||
|
camPath = cam.fullPathName()
|
||
|
cameraTrans = cmds.listRelatives(camPath,type='transform',p=True)
|
||
|
cameraPosition = cmds.xform(cameraTrans,q=1,ws=1,rp=1)
|
||
|
checkHit = 0
|
||
|
finalMesh = []
|
||
|
finalX = []
|
||
|
finalY = []
|
||
|
finalZ = []
|
||
|
shortDistance = 10000000000
|
||
|
distanceBetween = 1000000000
|
||
|
hitFacePtr = om.MScriptUtil().asIntPtr()
|
||
|
hitFace = []
|
||
|
checkList = []
|
||
|
checkList.append('snapLive')
|
||
|
for mesh in checkList:
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add(mesh)
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
fnMesh = om.MFnMesh(dagPath)
|
||
|
|
||
|
intersection = fnMesh.closestIntersection(
|
||
|
om.MFloatPoint(pos2),
|
||
|
om.MFloatVector(dir),
|
||
|
None,
|
||
|
None,
|
||
|
False,
|
||
|
om.MSpace.kWorld,
|
||
|
99999,
|
||
|
False,
|
||
|
None,
|
||
|
hitpoint,
|
||
|
None,
|
||
|
hitFacePtr,
|
||
|
None,
|
||
|
None,
|
||
|
None)
|
||
|
|
||
|
if intersection:
|
||
|
x = hitpoint.x
|
||
|
y = hitpoint.y
|
||
|
z = hitpoint.z
|
||
|
distanceBetween = math.sqrt( ((float(cameraPosition[0]) - x)**2) + ((float(cameraPosition[1]) - y)**2) + ((float(cameraPosition[2]) - z)**2))
|
||
|
if distanceBetween < shortDistance:
|
||
|
shortDistance = distanceBetween
|
||
|
finalMesh = mesh
|
||
|
finalX = x
|
||
|
finalY = y
|
||
|
finalZ = z
|
||
|
hitFace = om.MScriptUtil(hitFacePtr).asInt()
|
||
|
hitFaceName = (mesh + '.f[' + str(hitFace) +']')
|
||
|
rx, ry, rz = getFaceAngle(hitFaceName)
|
||
|
if cmds.objExists('lineDrawPlane'):
|
||
|
cmds.delete('lineDrawPlane')
|
||
|
if cmds.objExists('drawPlaneGrp'):
|
||
|
cmds.delete('drawPlaneGrp')
|
||
|
mesh = (beseMesh +'_bool')
|
||
|
bbox= cmds.xform(mesh, q=1, ws=1, bb=1)
|
||
|
length=math.sqrt((math.pow(bbox[0]-bbox[3],2)+math.pow(bbox[1]-bbox[4],2)+math.pow(bbox[2]-bbox[5],2))/3)
|
||
|
length = int(length *1.1 )
|
||
|
cmds.plane(s=length, r=[0,0,0])
|
||
|
cmds.rename('lineDrawPlane')
|
||
|
cmds.group('lineDrawPlane')
|
||
|
cmds.rename('lineDrawPlaneOffset')
|
||
|
cmds.makeIdentity( apply=True, t=1, r=1, s=1, n=0, pn=1 )
|
||
|
cmds.group('lineDrawPlaneOffset')
|
||
|
cmds.rename('lineDrawPlaneOffsetFreeze')
|
||
|
cmds.setAttr(("lineDrawPlaneOffsetFreeze.rotateX"), -90)
|
||
|
cmds.group('lineDrawPlaneOffsetFreeze')
|
||
|
cmds.rename('drawPlaneGrp')
|
||
|
cmds.move(finalX,finalY,finalZ,'drawPlaneGrp',absolute=1)
|
||
|
cmds.setAttr('drawPlaneGrp.rotateX', rx)
|
||
|
cmds.setAttr('drawPlaneGrp.rotateY', ry)
|
||
|
cmds.setAttr('drawPlaneGrp.rotateZ', rz)
|
||
|
|
||
|
cmds.makeLive('lineDrawPlane')
|
||
|
cmds.snapMode(grid=1)
|
||
|
resizeSnapGrid()
|
||
|
offsetSnapGrid()
|
||
|
|
||
|
def resizeSnapGrid():
|
||
|
if cmds.objExists('lineDrawPlane'):
|
||
|
gridData= cmds.intSliderGrp('snapGirdSize', q = True, v =True)
|
||
|
cmds.makeLive(n=True)
|
||
|
cmds.grid( spacing=10, d= gridData )
|
||
|
cmds.makeLive('lineDrawPlane')
|
||
|
cmds.snapMode(grid=1)
|
||
|
|
||
|
def rotateSnapGrid():
|
||
|
if cmds.objExists('lineDrawPlane'):
|
||
|
checkRot = cmds.intSliderGrp('snapGirdRot',q=True, v = True)
|
||
|
cmds.setAttr("lineDrawPlane.rotateZ", checkRot)
|
||
|
|
||
|
def offsetSnapGrid():
|
||
|
if cmds.objExists('lineDrawPlane'):
|
||
|
checkOffset = cmds.floatSliderGrp('snapGirdOffset',q=True, v = True)
|
||
|
cmds.setAttr("lineDrawPlaneOffset.translateZ", checkOffset)
|
||
|
|
||
|
def snapGridCamera():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkOffset = cmds.floatSliderGrp('snapGirdOffset', q=True, v = True)
|
||
|
cmds.intSliderGrp('snapGirdRot',e=True, v = 0)
|
||
|
curPanel = cmds.getPanel(wf=1)
|
||
|
if not 'modelPanel' in curPanel:
|
||
|
curPanel = 'modelPanel4'
|
||
|
cmds.modelEditor( curPanel,e=1, planes=1)
|
||
|
curCam = cmds.modelPanel(curPanel,q=1, cam=1)
|
||
|
cameraPos = cmds.xform(curCam,q=1,ws=1,t=1)
|
||
|
orthoValue = cmds.camera(curCam,q=1, o=1)
|
||
|
cameraUsed=[]
|
||
|
planePos=[]
|
||
|
if orthoValue ==0:
|
||
|
camRot = cmds.camera(curCam,q=1, rot=1)
|
||
|
camRotFixed = []
|
||
|
for i in range(2):
|
||
|
camRotTemp = camRot[i] / 360
|
||
|
intOfTemp = int(camRotTemp)
|
||
|
rotOver = 360 * intOfTemp
|
||
|
camRotFixed.append( camRot[i] - rotOver)
|
||
|
|
||
|
for i in range(2):
|
||
|
if camRotFixed[i] < 0 :
|
||
|
camRotFixed[i]= camRotFixed[i] +360;
|
||
|
|
||
|
cameraUsed=[]
|
||
|
if (camRotFixed[0] >= 45 and camRotFixed[0] < 135):
|
||
|
cameraUsed = 'buttom'
|
||
|
elif (camRotFixed[0] >= 225 and camRotFixed[0] < 315):
|
||
|
cameraUsed = 'top'
|
||
|
elif (camRotFixed[1] < 45):
|
||
|
cameraUsed = 'front'
|
||
|
elif (camRotFixed[1] >= 315 ):
|
||
|
cameraUsed = 'front'
|
||
|
elif (camRotFixed[1] >= 45 and camRotFixed[1] < 135):
|
||
|
cameraUsed = 'right'
|
||
|
elif (camRotFixed[1] >= 135 and camRotFixed[1] < 225):
|
||
|
cameraUsed = 'back'
|
||
|
elif (camRotFixed[1] >= 225 and camRotFixed[1] < 315):
|
||
|
cameraUsed = 'left'
|
||
|
|
||
|
mesh = (beseMesh +'_bool')
|
||
|
bbox= cmds.xform(mesh, q=1, ws=1, bb=1)
|
||
|
length=math.sqrt((math.pow(bbox[0]-bbox[3],2)+math.pow(bbox[1]-bbox[4],2)+math.pow(bbox[2]-bbox[5],2))/3)
|
||
|
length = int(length *1.1 )
|
||
|
meshCOORD = cmds.objectCenter(mesh,gl=True)
|
||
|
constructionPlanePos=[]
|
||
|
if cmds.objExists('lineDrawPlane'):
|
||
|
cmds.delete('lineDrawPlane')
|
||
|
if cmds.objExists('drawPlaneGrp'):
|
||
|
cmds.delete('drawPlaneGrp')
|
||
|
|
||
|
if cameraUsed == 'front' or cameraUsed == 'back':
|
||
|
if cameraUsed == 'front':
|
||
|
planePos = bbox[5]
|
||
|
elif cameraUsed == 'back':
|
||
|
if (bbox[2] - cameraPos[2]) > 0:
|
||
|
planePos = bbox[2]
|
||
|
constructionPlanePos = [meshCOORD[0],meshCOORD[1],planePos]
|
||
|
|
||
|
elif cameraUsed == 'top' or cameraUsed == 'buttom':# check y asix
|
||
|
if cameraUsed == 'top':
|
||
|
planePos = bbox[4]
|
||
|
elif cameraUsed == 'buttom':
|
||
|
planePos = bbox[1]
|
||
|
constructionPlanePos = [meshCOORD[0],planePos,meshCOORD[2]]
|
||
|
|
||
|
elif cameraUsed == 'left' or cameraUsed == 'right':# check x asix
|
||
|
if cameraUsed == 'right':
|
||
|
planePos = bbox[3]
|
||
|
elif cameraUsed == 'left':
|
||
|
planePos = bbox[0]
|
||
|
constructionPlanePos = [planePos,meshCOORD[1],meshCOORD[2]]
|
||
|
|
||
|
cmds.plane(s=length, r=[0,0,0])
|
||
|
cmds.rename('lineDrawPlane')
|
||
|
cmds.group('lineDrawPlane')
|
||
|
cmds.rename('lineDrawPlaneOffset')
|
||
|
cmds.move(constructionPlanePos[0],constructionPlanePos[1],constructionPlanePos[2],absolute=1)
|
||
|
cmds.makeIdentity( apply=True, t=1, r=1, s=1, n=0, pn=1 )
|
||
|
cmds.group('lineDrawPlaneOffset')
|
||
|
cmds.rename('drawPlaneGrp')
|
||
|
|
||
|
if cameraUsed == 'front':
|
||
|
cmds.setAttr("drawPlaneGrp.rotateZ", -90)
|
||
|
elif cameraUsed == 'back':
|
||
|
cmds.setAttr("drawPlaneGrp.rotateX", 180)
|
||
|
|
||
|
elif cameraUsed == 'top':
|
||
|
cmds.setAttr("drawPlaneGrp.rotateX", -90)
|
||
|
elif cameraUsed == 'buttom':
|
||
|
cmds.setAttr("drawPlaneGrp.rotateX", 90)
|
||
|
|
||
|
elif cameraUsed == 'left':
|
||
|
cmds.setAttr("drawPlaneGrp.rotateY", -90)
|
||
|
elif cameraUsed == 'right':
|
||
|
cmds.setAttr("drawPlaneGrp.rotateY", 90)
|
||
|
|
||
|
cmds.makeLive('lineDrawPlane')
|
||
|
cmds.snapMode(grid=1)
|
||
|
resizeSnapGrid()
|
||
|
offsetSnapGrid()
|
||
|
|
||
|
def drawGirdOff():
|
||
|
if cmds.objExists('lineDrawPlane'):
|
||
|
cmds.delete('lineDrawPlane*')
|
||
|
if cmds.objExists('tempScaleOffset'):
|
||
|
cmds.delete('tempScaleOffset*')
|
||
|
if cmds.objExists('drawPlaneGrp'):
|
||
|
cmds.delete('drawPlaneGrp*')
|
||
|
cmds.snapMode(grid=0)
|
||
|
cmds.MoveTool()
|
||
|
|
||
|
def drawGirdOn():
|
||
|
cmds.CVCurveTool()
|
||
|
cmds.curveCVCtx(cmds.currentCtx(), e=True, d=1, bez= 0)
|
||
|
|
||
|
def removeGap():
|
||
|
newCutter = cmds.ls(sl=True,fl=True,type = 'transform')
|
||
|
for n in newCutter:
|
||
|
if 'boxCutter' in n:
|
||
|
if 'ArrayGrp' in n:
|
||
|
n = n.replace('ArrayGrp','')
|
||
|
extrudeNode = cmds.listConnections(cmds.listHistory(n,ac=1),type='polyExtrudeFace')
|
||
|
if extrudeNode != None:
|
||
|
cmds.delete(extrudeNode)
|
||
|
cmds.setAttr((n+'.statePanel'),0)
|
||
|
cmds.setAttr((n+'.preBevel'),1)
|
||
|
|
||
|
def makeGap():
|
||
|
newCutter = cmds.ls(sl=True,fl=True,type = 'transform')
|
||
|
for n in newCutter:
|
||
|
if 'boxCutter' in n:
|
||
|
if 'ArrayGrp' in n:
|
||
|
n = n.replace('ArrayGrp','')
|
||
|
extrudeNode = cmds.listConnections(cmds.listHistory(n,ac=1),type='polyExtrudeFace')
|
||
|
if extrudeNode != None:
|
||
|
cmds.delete(extrudeNode)
|
||
|
gapV = []
|
||
|
storeX = cmds.getAttr( n + '.scaleX')
|
||
|
gapV = cmds.floatSliderGrp('gapSlider', q=True, v = True)
|
||
|
if gapV < 0.01:
|
||
|
gapV = 0.01
|
||
|
cmds.floatSliderGrp('gapSlider', e = True, v=0.01)
|
||
|
cmds.setAttr((n+'.panelGap'),gapV)
|
||
|
cmds.setAttr((n+'.intPanelGap'),gapV)
|
||
|
cmds.setAttr((n+'.intScaleX'),storeX)
|
||
|
cmds.select(n)
|
||
|
extNode = cmds.polyExtrudeFacet( constructionHistory=True, keepFacesTogether = True, smoothingAngle=30, tk = gapV )
|
||
|
cmdText = (extNode[0] + '.thickness = ' + n + '.intScaleX/' + n + '.scaleX*' + str(gapV) + '*' + n + '.panelGap/' + n + '.intPanelGap')
|
||
|
cmds.expression( s = cmdText, o = extNode[0], ae = True, uc = all)
|
||
|
cmds.setAttr((n+'.statePanel'),1)
|
||
|
cmds.setAttr((n+'.preBevel'),0)
|
||
|
cmds.select(newCutter)
|
||
|
|
||
|
def hideAllCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
getCutters = cmds.ls((beseMesh+'_cutterGrp|boxCutter*'),type = 'transform',l=True)
|
||
|
cmds.hide(getCutters)
|
||
|
|
||
|
def showLastCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
currentOne = cmds.ls(sl=True,fl=True)
|
||
|
getCutters = cmds.ls((beseMesh+'_cutterGrp|boxCutter*'),type = 'transform')
|
||
|
checkVis = []
|
||
|
if len(getCutters) > 0:
|
||
|
for g in getCutters:
|
||
|
checkme = cmds.getAttr(g+'.visibility')
|
||
|
if checkme == 1:
|
||
|
checkVis.append(g)
|
||
|
if len(currentOne) > 0:
|
||
|
checkCutter = []
|
||
|
for c in currentOne:
|
||
|
if 'boxCutter' in c:
|
||
|
checkCutter.append(c)
|
||
|
if len(checkCutter)>0:
|
||
|
checkSel = cmds.getAttr(checkCutter[0]+'.visibility')
|
||
|
cmds.hide(getCutters)
|
||
|
if checkSel == 0:
|
||
|
cmds.setAttr((checkCutter[0]+'.visibility'), 1)
|
||
|
else:
|
||
|
if len(checkVis) > 1:
|
||
|
cmds.select(checkCutter[0])
|
||
|
cmds.showHidden(checkCutter[0])
|
||
|
elif len(checkVis) == 1:
|
||
|
preCutter = 0
|
||
|
for i in range(len(getCutters)):
|
||
|
if getCutters[i] == checkCutter[0]:
|
||
|
preCutter = i - 1
|
||
|
cmds.select(getCutters[preCutter])
|
||
|
cmds.showHidden(getCutters[preCutter])
|
||
|
else:
|
||
|
cmds.select(getCutters[-1])
|
||
|
cmds.showHidden(getCutters[-1])
|
||
|
else:
|
||
|
cmds.hide(getCutters)
|
||
|
cmds.select(getCutters[-1])
|
||
|
cmds.showHidden(getCutters[-1])
|
||
|
cmds.setAttr((beseMesh+'_cutterGrp.visibility'), 1)
|
||
|
|
||
|
def showAllCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
getCutters = cmds.ls((beseMesh+'_cutterGrp|boxCutter*'),type = 'transform',l=True)
|
||
|
checkAllCutterGrps = cmds.ls(('*_cutterGrp'),type = 'transform',l=True)
|
||
|
cmds.hide(checkAllCutterGrps)
|
||
|
cmds.showHidden(getCutters)
|
||
|
if cmds.objExists((beseMesh +'_cutterGrp')) == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'_cutterGrp'))
|
||
|
cmds.parent((beseMesh +'_cutterGrp'),(beseMesh +'BoolGrp'))
|
||
|
|
||
|
cmds.setAttr((beseMesh+'_cutterGrp.visibility'), 1)
|
||
|
|
||
|
def hideUnSelectedCutters():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
currentSel = cmds.ls(sl= True)
|
||
|
getCutters = cmds.ls((beseMesh+'_cutterGrp|boxCutter*'),type = 'transform',l=True)
|
||
|
checkVisList = []
|
||
|
for g in getCutters:
|
||
|
state = cmds.getAttr(g+'.visibility')
|
||
|
if state == 1:
|
||
|
checkVisList.append(g)
|
||
|
if len(checkVisList) == len(currentSel):
|
||
|
showAllCutter()
|
||
|
else:
|
||
|
cmds.hide(getCutters)
|
||
|
cmds.showHidden(currentSel)
|
||
|
cmds.select(currentSel)
|
||
|
|
||
|
def attributeGapSlider():
|
||
|
newCutter = cmds.ls(sl=True,fl=True,type = 'transform')
|
||
|
checkSlider = cmds.floatSliderGrp('gapSlider',q=True, v= True )
|
||
|
if len(newCutter) > 0:
|
||
|
for n in newCutter:
|
||
|
if 'ArrayGrp' in n:
|
||
|
n = n.replace('ArrayGrp','')
|
||
|
checkGap = cmds.getAttr(n +'.statePanel')
|
||
|
if checkGap == 1:
|
||
|
cmds.setAttr((n +'.panelGap'),checkSlider)
|
||
|
|
||
|
def attributeIntSlider(attributName):
|
||
|
newCutter = cmds.ls(sl=True,fl=True,type = 'transform')
|
||
|
sliderName = (str(attributName)+'Slider')
|
||
|
checkSlider = cmds.intSliderGrp(sliderName,q=True, v= True )
|
||
|
if len(newCutter) > 0:
|
||
|
for n in newCutter:
|
||
|
if 'ArrayGrp' in n:
|
||
|
n = n.replace('ArrayGrp','')
|
||
|
bevelNode = cmds.listConnections(cmds.listHistory(n),type='polyBevel3')
|
||
|
if bevelNode != None:
|
||
|
cmds.setAttr((bevelNode[0] +'.' + attributName),checkSlider)
|
||
|
|
||
|
def attributeFloatSlider(attributName):
|
||
|
newCutter = cmds.ls(sl=True,fl=True,type = 'transform')
|
||
|
sliderName = (str(attributName)+'Slider')
|
||
|
checkSlider = cmds.floatSliderGrp(sliderName,q=True, v= True )
|
||
|
if len(newCutter) > 0:
|
||
|
for n in newCutter:
|
||
|
if 'ArrayGrp' in n:
|
||
|
n = n.replace('ArrayGrp','')
|
||
|
bevelNode = cmds.listConnections(cmds.listHistory(n),type='polyBevel3')
|
||
|
if bevelNode != None:
|
||
|
cmds.setAttr((bevelNode[0] +'.' + attributName),checkSlider)
|
||
|
|
||
|
def cutterMirrorOver(direction):
|
||
|
listSel = cmds.ls(sl=True, fl=True ,l=True)
|
||
|
if len(listSel) > 0 and 'boxCutter' in listSel[0] and 'ArrayGrp' not in listSel[0]:
|
||
|
cmds.duplicate(rr=True, un=True)
|
||
|
cmds.group()
|
||
|
if cmds.objExists('tempPivot'):
|
||
|
cmds.delete('tempPivot')
|
||
|
cmds.rename('tempPivot')
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
meshCOORD = cmds.objectCenter(beseMesh,gl=True)
|
||
|
cmds.xform(ws=True, pivots =[meshCOORD[0],meshCOORD[1],meshCOORD[2]])
|
||
|
|
||
|
if direction == 'x':
|
||
|
cmds.setAttr( ('tempPivot.scaleX'),-1)
|
||
|
if direction == 'y':
|
||
|
cmds.setAttr( ('tempPivot.scaleY'),-1)
|
||
|
if direction == 'z':
|
||
|
cmds.setAttr( ('tempPivot.scaleZ'),-1)
|
||
|
cmds.FreezeTransformations()
|
||
|
|
||
|
cmds.select(cmds.listRelatives('tempPivot', c=True, f = True, typ='transform'))
|
||
|
cmds.select((beseMesh+'_cutterGrp'), add=True)
|
||
|
cmds.parent()
|
||
|
listNew = cmds.ls(sl=True, fl=True ,l=True)
|
||
|
fixBoolNodeConnection()
|
||
|
|
||
|
cmds.delete('tempPivot')
|
||
|
for s in listSel:
|
||
|
cmds.setAttr((s+'.visibility'),0)
|
||
|
cmds.select(listNew)
|
||
|
|
||
|
def cutterMirror(axis):
|
||
|
newCutter = cmds.ls(sl=True,fl=True,type = 'transform')
|
||
|
dulCutter = []
|
||
|
if len(newCutter) > 0:
|
||
|
for n in newCutter:
|
||
|
if 'Cutter' in n:
|
||
|
cmds.FreezeTransformations()
|
||
|
bboxObj = cmds.xform(n , q = True, ws =True, bb=True)
|
||
|
|
||
|
mirrorMode = 0
|
||
|
|
||
|
if axis == 'x' :
|
||
|
if bboxObj[3] > 0 and bboxObj[0] > 0:
|
||
|
mirrorMode = 1
|
||
|
elif bboxObj[3] < 0 and bboxObj[0] < 0:
|
||
|
mirrorMode = 1
|
||
|
|
||
|
elif axis == 'y' :
|
||
|
if bboxObj[4] > 0 and bboxObj[1] > 0:
|
||
|
mirrorMode = 1
|
||
|
elif bboxObj[4] < 0 and bboxObj[1] < 0:
|
||
|
mirrorMode = 1
|
||
|
|
||
|
elif axis == 'z' :
|
||
|
if bboxObj[5] > 0 and bboxObj[2] > 0:
|
||
|
mirrorMode = 1
|
||
|
elif bboxObj[5] < 0 and bboxObj[2] < 0:
|
||
|
mirrorMode = 1
|
||
|
|
||
|
if mirrorMode == 1:
|
||
|
cmds.select(n)
|
||
|
cutterMirrorOver(axis)
|
||
|
newC = cmds.ls(sl=1)
|
||
|
dulCutter.append(newC[0])
|
||
|
else:
|
||
|
|
||
|
lengthObj=math.sqrt((math.pow(bboxObj[0]-bboxObj[3],2)+math.pow(bboxObj[1]-bboxObj[4],2)+math.pow(bboxObj[2]-bboxObj[5],2))/3)
|
||
|
closeRange = lengthObj / 100
|
||
|
|
||
|
bboxSel = cmds.xform(n , q = True, ws =True, bb=True)
|
||
|
midX = (bboxSel[3]+bboxSel[0])/2
|
||
|
midY = (bboxSel[4]+bboxSel[1])/2
|
||
|
midZ = (bboxSel[5]+bboxSel[2])/2
|
||
|
inRangeCv = []
|
||
|
vNo = cmds.polyEvaluate(n, v = True )
|
||
|
checkPoint = 0
|
||
|
if axis == 'x' :
|
||
|
checkPoint = 0
|
||
|
elif axis == 'y' :
|
||
|
checkPoint = 1
|
||
|
else:
|
||
|
checkPoint = 2
|
||
|
for i in range(vNo):
|
||
|
positionV = cmds.pointPosition((n +'.vtx[' + str(i) + ']') , w = True)
|
||
|
length= math.sqrt(math.pow(positionV[checkPoint],2))
|
||
|
if length <= closeRange:
|
||
|
inRangeCv.append((n +'.vtx[' + str(i) + ']'))
|
||
|
cmds.select(inRangeCv, r=True)
|
||
|
|
||
|
# push those point off center a bit then mirror cut
|
||
|
if axis == 'x' :
|
||
|
for n in inRangeCv:
|
||
|
posiV = cmds.pointPosition(n , w = True)
|
||
|
if midX >= 0:
|
||
|
cmds.move((closeRange * -1.5) , posiV[1], posiV[2], n ,absolute=1)
|
||
|
else:
|
||
|
cmds.move( (closeRange * 1.5) , posiV[1], posiV[2], n ,absolute=1)
|
||
|
cutPlane= cmds.polyCut(n, ws = True, cd = 'X' , df = True , ch =True)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterX'), 0)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterY'), 0)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterZ'), 0)
|
||
|
if midX > 0:
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneRotateY'), 90)
|
||
|
cmds.polyMirrorFace(n,cutMesh =1, axis = 0, axisDirection = 1, mergeMode = 1, mergeThresholdType = 1, mergeThreshold =0.001, mirrorAxis = 0 ,mirrorPosition = 0 ,smoothingAngle= 30 ,flipUVs =0 ,ch = 0)
|
||
|
else:
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneRotateY'), -90)
|
||
|
cmds.polyMirrorFace(n,cutMesh =1, axis = 0, axisDirection = 0, mergeMode = 1, mergeThresholdType = 1, mergeThreshold =0.001, mirrorAxis = 0 ,mirrorPosition = 0 ,smoothingAngle= 30 ,flipUVs =0 ,ch = 0)
|
||
|
|
||
|
if axis == 'y' :
|
||
|
for n in inRangeCv:
|
||
|
posiV = cmds.pointPosition(n , w = True)
|
||
|
if midY >= 0:
|
||
|
cmds.move(posiV[0], (closeRange * -1.5) , posiV[2], n ,absolute=1)
|
||
|
else:
|
||
|
cmds.move(posiV[0], (closeRange * 1.5) , posiV[2], n ,absolute=1)
|
||
|
cutPlane= cmds.polyCut(n, ws = True, cd = 'Y' , df = True , ch =True)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterX'), 0)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterY'), 0)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterZ'), 0)
|
||
|
if midY > 0:
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneRotateX'), -90)
|
||
|
cmds.polyMirrorFace(n,cutMesh =1, axis = 1, axisDirection = 1, mergeMode = 1, mergeThresholdType = 1, mergeThreshold =0.001, mirrorAxis = 0 ,mirrorPosition = 0 ,smoothingAngle= 30 ,flipUVs =0 ,ch = 0)
|
||
|
else:
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneRotateX'), 90)
|
||
|
cmds.polyMirrorFace(n,cutMesh =1, axis = 1, axisDirection = 0, mergeMode = 1, mergeThresholdType = 1, mergeThreshold =0.001, mirrorAxis = 0 ,mirrorPosition = 0 ,smoothingAngle= 30 ,flipUVs =0 ,ch = 0)
|
||
|
|
||
|
if axis == 'z' :
|
||
|
for n in inRangeCv:
|
||
|
posiV = cmds.pointPosition(n , w = True)
|
||
|
if midZ >= 0:
|
||
|
cmds.move(posiV[0], posiV[1],(closeRange * -1.5), n ,absolute=1)
|
||
|
else:
|
||
|
cmds.move(posiV[0], posiV[1],(closeRange * 1.5), n ,absolute=1)
|
||
|
cutPlane= cmds.polyCut(n, ws = True, cd = 'Z' , df = True , ch =True)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterX'), 0)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterY'), 0)
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneCenterZ'), 0)
|
||
|
if midZ > 0:
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneRotateY'), 0)
|
||
|
cmds.polyMirrorFace(n,cutMesh =1, axis = 2, axisDirection = 1, mergeMode = 1, mergeThresholdType = 1, mergeThreshold =0.001, mirrorAxis = 0 ,mirrorPosition = 0 ,smoothingAngle= 30 ,flipUVs =0 ,ch = 0)
|
||
|
else:
|
||
|
cmds.setAttr((cutPlane[0]+'.cutPlaneRotateY'), 180)
|
||
|
cmds.polyMirrorFace(n,cutMesh =1, axis = 2, axisDirection = 0, mergeMode = 1, mergeThresholdType = 1, mergeThreshold =0.001, mirrorAxis = 0 ,mirrorPosition = 0 ,smoothingAngle= 30 ,flipUVs =0 ,ch = 0)
|
||
|
cmds.select(n)
|
||
|
dulCutter.append(n)
|
||
|
cmds.BakeNonDefHistory()
|
||
|
cmds.select(dulCutter)
|
||
|
|
||
|
def useOwnCutterShape():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
ownCutter = cmds.ls(sl=True, fl=True ,l=True)
|
||
|
restoreMissingGrps()
|
||
|
o = ownCutter[0]
|
||
|
if len(ownCutter) > 0:
|
||
|
for o in ownCutter:
|
||
|
if ('_cutterGrp') in o:
|
||
|
print('shape already been used')
|
||
|
else:
|
||
|
if cmds.objExists(beseMesh + '_BoolResult') == 0:
|
||
|
restoreCutterWithSymmtry()
|
||
|
cmds.select(o)
|
||
|
cmds.parent(o,(beseMesh+'_cutterGrp'))
|
||
|
ownCutter = cmds.ls(sl=True, fl=True ,l=True)
|
||
|
newNumber = nextCutterNumber()
|
||
|
newName = 'boxCutter'+str(newNumber)
|
||
|
cmds.select(ownCutter)
|
||
|
cmds.rename(newName)
|
||
|
newCutter = cmds.ls(sl=True, fl=True)
|
||
|
shapeNode = cmds.listRelatives(newCutter, f = True, shapes=True)
|
||
|
cmds.setAttr( (shapeNode[0]+".overrideEnabled") , 1)
|
||
|
cmds.setAttr( (shapeNode[0]+".overrideShading") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".castsShadows") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".receiveShadows") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".primaryVisibility") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".visibleInReflections") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".visibleInRefractions") , 0)
|
||
|
checkButtonStateList = ['subsButton','unionButton','cutButton']
|
||
|
getCurrentType = ''
|
||
|
for c in checkButtonStateList:
|
||
|
buttonState = cmds.button( c ,q=1, bgc = True )
|
||
|
if buttonState[1] > 0.4:
|
||
|
getCurrentType = c
|
||
|
setType = getCurrentType.replace('Button','')
|
||
|
if setType == 'subs':
|
||
|
cmds.setAttr( (shapeNode[0]+'.overrideColor'), 28)
|
||
|
elif setType == 'union':
|
||
|
cmds.setAttr( (shapeNode[0]+'.overrideColor'), 31)
|
||
|
else:
|
||
|
cmds.setAttr( (shapeNode[0]+'.overrideColor'), 25)
|
||
|
cmds.connectAttr( (shapeNode[0]+".worldMatrix[0]"), ((beseMesh +'_my' + setType.title() +'.inputMat['+str(newNumber)+']')),f=True)
|
||
|
cmds.connectAttr( (shapeNode[0]+".outMesh"), ((beseMesh +'_my' + setType.title() + '.inputPoly['+str(newNumber)+']')),f=True)
|
||
|
|
||
|
if not cmds.attributeQuery('cutterDir', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='cutterDir', dt= 'string')
|
||
|
if not cmds.attributeQuery('cutterType', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='cutterType', dt= 'string')
|
||
|
cmds.setAttr((newCutter[0]+'.cutterDir'),e=True, keyable=True)
|
||
|
cmds.setAttr((newCutter[0]+'.cutterType'),e=True, keyable=True)
|
||
|
|
||
|
if not cmds.attributeQuery('cutterOp', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='cutterOp', dt= 'string')
|
||
|
cmds.setAttr((newCutter[0]+'.cutterOp'),e=True, keyable=True)
|
||
|
cmds.setAttr((newCutter[0]+'.cutterOp'),setType,type="string")
|
||
|
|
||
|
if not cmds.attributeQuery('statePanel', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='statePanel', at = "float" )
|
||
|
if not cmds.attributeQuery('panelGap', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='panelGap', at = "float" )
|
||
|
if not cmds.attributeQuery('intPanelGap', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='intPanelGap', at = "float" )
|
||
|
if not cmds.attributeQuery('intScaleX', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='intScaleX', at = "float" )
|
||
|
|
||
|
if not cmds.attributeQuery('preBevel', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='preBevel', at = "float" )
|
||
|
|
||
|
cmds.setAttr((newCutter[0]+'.statePanel'),0)
|
||
|
cmds.setAttr((newCutter[0]+'.preBevel'),1)
|
||
|
cmds.select(newCutter[0])
|
||
|
cmds.setAttr((newCutter[0]+'.cutterType'),'custom' ,type="string")
|
||
|
else:
|
||
|
print('nothing select!')
|
||
|
|
||
|
def cutterDulpicate():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
dulCutter = cmds.ls(sl=True, fl=True , l=True)
|
||
|
newCutterList = []
|
||
|
if len(dulCutter) > 0:
|
||
|
for d in dulCutter:
|
||
|
checkParent = d.split('|')
|
||
|
if len(checkParent)>2 and 'boxCutter' in d and 'cutterGrp' in d:
|
||
|
newNumber = nextCutterNumber()
|
||
|
newName = 'boxCutter'+str(newNumber)
|
||
|
cmds.select(d)
|
||
|
cmds.duplicate(rr = True, un=True)
|
||
|
cmds.rename(newName)
|
||
|
newCutter = cmds.ls(sl=True, fl=True)
|
||
|
shapeNode = cmds.listRelatives(newCutter[0], f = True, shapes=True)
|
||
|
cmds.setAttr( (shapeNode[0]+".overrideEnabled") , 1)
|
||
|
cmds.setAttr( (shapeNode[0]+".overrideShading") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".castsShadows") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".receiveShadows") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".primaryVisibility") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".visibleInReflections") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".visibleInRefractions") , 0)
|
||
|
boolNode = cmds.listConnections(cmds.listHistory((beseMesh +'_bool'),f=1),type='polyCBoolOp')
|
||
|
if boolNode != None:
|
||
|
cmds.connectAttr( (shapeNode[0]+".worldMatrix[0]"), ((boolNode[0]+'.inputMat['+str(newNumber)+']')),f=True)
|
||
|
cmds.connectAttr( (shapeNode[0]+".outMesh"), ((boolNode[0]+'.inputPoly['+str(newNumber)+']')),f=True)
|
||
|
cmds.select(newCutter[0])
|
||
|
fixBoolNodeConnection()
|
||
|
newCutterList.append(newCutter[0])
|
||
|
else:
|
||
|
print(d + 'is not a cutter!!')
|
||
|
cmds.select(newCutterList)
|
||
|
else:
|
||
|
print('nothing selected!')
|
||
|
|
||
|
def QChangeCutterDir(dir):
|
||
|
selObj = cmds.ls(sl=1, fl=1,l=True, type='transform')
|
||
|
if len(selObj) == 1:
|
||
|
|
||
|
checkMasterDir = []
|
||
|
checkMasterNumber = []
|
||
|
checkMasterDis = []
|
||
|
arraySample = []
|
||
|
myType = checkInstType()
|
||
|
if 'ArrayGrp' in selObj[0]:
|
||
|
myType = checkInstType()
|
||
|
arraySample = myType[0]
|
||
|
if myType[1] != 'new':
|
||
|
checkMasterDir = cmds.getAttr(arraySample+'.arrayDirection')
|
||
|
checkMasterNumber = cmds.getAttr(arraySample+'.arrayNumber')
|
||
|
checkMasterDis = cmds.getAttr(arraySample+'.arrayOffset')
|
||
|
checkMasterType = myType[1]
|
||
|
if myType[1] == 'radial':
|
||
|
removeRadArray()
|
||
|
else:
|
||
|
instRemove()
|
||
|
selObj = cmds.ls(sl=1, fl=1,l=True, type='transform')
|
||
|
cmds.setAttr((selObj[0]+'.rotateX'), 0)
|
||
|
cmds.setAttr((selObj[0]+'.rotateY'), 0)
|
||
|
cmds.setAttr((selObj[0]+'.rotateZ'), 0)
|
||
|
cutterDirection = cmds.getAttr(selObj[0]+'.cutterDir')
|
||
|
|
||
|
if dir == 'X':
|
||
|
dir = 'Z'
|
||
|
elif dir == 'Y':
|
||
|
pass
|
||
|
else:
|
||
|
dir = 'X'
|
||
|
|
||
|
parnetGrp = cmds.listRelatives(selObj[0], parent =1, f=1)
|
||
|
cmds.group(em=True, name = (selObj[0]+'_offset'),parent = parnetGrp[0])
|
||
|
newNode = cmds.ls(sl=True,fl=True)
|
||
|
cmds.FreezeTransformations()
|
||
|
sourcePivot = cmds.xform(selObj[0], q=1, ws=1 ,rp=1)
|
||
|
cmds.xform(newNode ,ws=1, piv = (sourcePivot[0],sourcePivot[1],sourcePivot[2]))
|
||
|
cmds.parent(selObj[0],newNode)
|
||
|
cmds.setAttr((newNode[0]+'.rotate' + dir), 90)
|
||
|
newNode = cmds.ls(sl=True,fl=True)
|
||
|
parnetGrpRemove = cmds.listRelatives(newNode[0], parent =1, f=1)
|
||
|
cmds.parent(newNode[0],parnetGrp)
|
||
|
cmds.delete(parnetGrpRemove)
|
||
|
newNode = cmds.ls(sl=True,fl=True)
|
||
|
if myType[1] != 'new':
|
||
|
if myType[1] == 'radial':
|
||
|
instRadAdd(checkMasterDir)
|
||
|
else:
|
||
|
instLinearAdd(checkMasterDir)
|
||
|
cmds.setAttr((newNode[0]+'.arrayNumber'),checkMasterNumber)
|
||
|
cmds.setAttr((newNode[0]+'.arrayOffset'),checkMasterDis)
|
||
|
|
||
|
def QBoxSmooth():
|
||
|
newCutter = cmds.ls(sl=True,fl=True,type = 'transform')
|
||
|
if len(newCutter) > 0:
|
||
|
for n in newCutter:
|
||
|
if 'Cutter' in n:
|
||
|
if 'ArrayGrp' in n:
|
||
|
myType = checkInstType()
|
||
|
n = (myType[0])
|
||
|
#in case gap exist
|
||
|
extrudeNode = cmds.listConnections(cmds.listHistory(n,ac=1),type='polyExtrudeFace')
|
||
|
if extrudeNode != None:
|
||
|
cmds.delete(extrudeNode)
|
||
|
bevelNode = cmds.listConnections(cmds.listHistory(n,ac=1),type='polyBevel3')
|
||
|
bevelType = []
|
||
|
getFrac = []
|
||
|
getSeg = []
|
||
|
getDep = []
|
||
|
cmds.select(n)
|
||
|
if bevelNode != None:
|
||
|
cmds.makeIdentity( n, apply=True, scale=True )
|
||
|
#record old setting
|
||
|
getFrac = cmds.getAttr(bevelNode[0]+'.fraction')
|
||
|
getSeg = cmds.getAttr(bevelNode[0]+'.segments')
|
||
|
getDep = cmds.getAttr(bevelNode[0]+'.depth')
|
||
|
cmds.delete(bevelNode)
|
||
|
cmds.DeleteHistory()
|
||
|
bevelNodeNew = cmds.polyBevel3(n, mv = 1, mvt =0.001, fn = 1, fraction = 0.5, offsetAsFraction = 1, autoFit = 1, depth = 1, mitering = 0, miterAlong = 0, chamfer = 1, segments = 5, ch = 1)
|
||
|
cmds.floatSliderGrp('fractionSlider', e=True , v = 0.5)
|
||
|
cmds.intSliderGrp('segmentsSlider', e=True , v = 5)
|
||
|
cmds.floatSliderGrp('depthSlider', e=True , v = 1)
|
||
|
if bevelNode != None:
|
||
|
cmds.setAttr((bevelNodeNew[0]+'.fraction'),getFrac)
|
||
|
cmds.setAttr((bevelNodeNew[0]+'.segments'),getSeg)
|
||
|
cmds.setAttr((bevelNodeNew[0]+'.depth'),getDep)
|
||
|
cmds.floatSliderGrp('fractionSlider', e=True , v = getFrac)
|
||
|
cmds.intSliderGrp('segmentsSlider', e=True , v = getSeg)
|
||
|
cmds.floatSliderGrp('depthSlider', e=True , v = getDep)
|
||
|
cmds.setAttr((n+'.cutterType'),'smooth',type="string")
|
||
|
checkGapState = cmds.getAttr(n+'.statePanel')
|
||
|
if checkGapState == 1:
|
||
|
cmds.select(n)
|
||
|
makeGap()
|
||
|
cmds.select(newCutter)
|
||
|
|
||
|
def QBoxBevel():
|
||
|
newCutter = cmds.ls(sl=True,fl=True,type = 'transform')
|
||
|
if len(newCutter) > 0:
|
||
|
for n in newCutter:
|
||
|
if 'Cutter' in n:
|
||
|
if 'ArrayGrp' in n:
|
||
|
myType = checkInstType()
|
||
|
n = (myType[0])
|
||
|
#in case gap exist
|
||
|
extrudeNode = cmds.listConnections(cmds.listHistory(n,ac=1),type='polyExtrudeFace',s=True)
|
||
|
if extrudeNode != None:
|
||
|
cmds.delete(extrudeNode)
|
||
|
bevelNode = cmds.listConnections(cmds.listHistory(n,ac=1),type='polyBevel3')
|
||
|
bevelList = []
|
||
|
bevelType = []
|
||
|
getFrac = []
|
||
|
getSeg = []
|
||
|
getDep = []
|
||
|
cmds.select(n)
|
||
|
cmds.makeIdentity( n, apply=True, scale=True )
|
||
|
if bevelNode != None:
|
||
|
#record old setting
|
||
|
getFrac = cmds.getAttr(bevelNode[0]+'.fraction')
|
||
|
getSeg = cmds.getAttr(bevelNode[0]+'.segments')
|
||
|
getDep = cmds.getAttr(bevelNode[0]+'.depth')
|
||
|
cmds.delete(bevelNode)
|
||
|
cmds.DeleteHistory()
|
||
|
|
||
|
cmds.select(n)
|
||
|
cmds.polySelectConstraint(mode = 3, type = 0x0008, size=1)
|
||
|
cmds.polySelectConstraint(disable =True)
|
||
|
triFind = cmds.ls(sl=1,fl=1)
|
||
|
cmds.select(n)
|
||
|
cmds.polySelectConstraint(mode = 3, type = 0x0008, size=3)
|
||
|
cmds.polySelectConstraint(disable =True)
|
||
|
ngonFind = cmds.ls(sl=1,fl=1)
|
||
|
|
||
|
if len(triFind) == 2 and len(ngonFind) == 0:# case is triprism
|
||
|
bevelList = str(n + '.e[6:8]')
|
||
|
|
||
|
elif len(triFind) > 0 or len(ngonFind) > 0:
|
||
|
if len(triFind) > 0:
|
||
|
cmds.select(triFind)
|
||
|
cmds.InvertSelection()#added - usless
|
||
|
else:
|
||
|
cmds.select(ngonFind)
|
||
|
cmds.select(n)
|
||
|
cmds.ConvertSelectionToFaces()
|
||
|
cmds.select(ngonFind,d=True)
|
||
|
cmds.ConvertSelectionToContainedEdges()
|
||
|
bevelList = cmds.ls(sl=1,fl=1)
|
||
|
else:#case is cube
|
||
|
checkNoCustom = cmds.getAttr(n+'.cutterType')
|
||
|
if checkNoCustom == 'custom':
|
||
|
cmds.select(str(n + '.e[4:5]'))
|
||
|
cmds.select(str(n + '.e[8:9]'), add =1 )
|
||
|
bevelList = cmds.ls(sl=1,fl=1)
|
||
|
else:
|
||
|
bevelList = str(n + '.e[8:11]')
|
||
|
|
||
|
bevelNodeNew = cmds.polyBevel3(bevelList, mv = 1, mvt =0.001, fn = 1, fraction = 0.5, offsetAsFraction = 1, autoFit = 1, depth = 1, mitering = 0, miterAlong = 0, chamfer = 1, segments = 5, ch = 1)
|
||
|
cmds.floatSliderGrp('fractionSlider', e=True , v = 0.5)
|
||
|
cmds.intSliderGrp('segmentsSlider', e=True , v = 5)
|
||
|
cmds.floatSliderGrp('depthSlider', e=True , v = 1)
|
||
|
if bevelNode != None:
|
||
|
cmds.setAttr((bevelNodeNew[0]+'.fraction'),getFrac)
|
||
|
cmds.setAttr((bevelNodeNew[0]+'.segments'),getSeg)
|
||
|
cmds.setAttr((bevelNodeNew[0]+'.depth'),getDep)
|
||
|
cmds.floatSliderGrp('fractionSlider', e=True , v = getFrac)
|
||
|
cmds.intSliderGrp('segmentsSlider', e=True , v = getSeg)
|
||
|
cmds.floatSliderGrp('depthSlider', e=True , v = getDep)
|
||
|
if extrudeNode != None:
|
||
|
makeGap()
|
||
|
cmds.setAttr((n+'.cutterType'),'bevel',type="string")
|
||
|
checkGapState = cmds.getAttr(n+'.statePanel')
|
||
|
if checkGapState == 1:
|
||
|
cmds.select(n)
|
||
|
makeGap()
|
||
|
cmds.select(newCutter)
|
||
|
|
||
|
else:
|
||
|
cmds.ConvertSelectionToEdges()
|
||
|
selEdges =cmds.filterExpand(ex =1, sm =32)
|
||
|
if len(selEdges)>0:
|
||
|
geoList = cmds.ls(hl=1)
|
||
|
for g in geoList:
|
||
|
cmds.setAttr((g+'.cutterType'),'bevel',type="string")
|
||
|
checkEdge = []
|
||
|
for s in selEdges:
|
||
|
if g in s:
|
||
|
checkEdge.append(s)
|
||
|
bevelNodeNew = cmds.polyBevel3(checkEdge, mv = 1, mvt =0.001, fn = 1, fraction = 0.5, offsetAsFraction = 1, autoFit = 1, depth = 1, mitering = 0, miterAlong = 0, chamfer = 1, segments = 5, ch = 1)
|
||
|
cmds.select(geoList)
|
||
|
cmds.floatSliderGrp('fractionSlider', e=True , v = 0.5)
|
||
|
cmds.intSliderGrp('segmentsSlider', e=True , v = 5)
|
||
|
cmds.floatSliderGrp('depthSlider', e=True , v = 1)
|
||
|
|
||
|
def QBoxBevelRemove():
|
||
|
newCutter = cmds.ls(sl=True,fl=True,type = 'transform')
|
||
|
if len(newCutter) > 0:
|
||
|
for n in newCutter:
|
||
|
if 'Cutter' in n:
|
||
|
if 'ArrayGrp' in n:
|
||
|
myType = checkInstType()
|
||
|
n = (myType[0])
|
||
|
checkNoCustom = cmds.getAttr(n+'.cutterType')
|
||
|
if checkNoCustom == 'bevel' or checkNoCustom == 'smooth':
|
||
|
cmds.makeIdentity( n, apply=True, scale=True )
|
||
|
shapeNode = cmds.listRelatives(n, f = True, shapes=True)
|
||
|
bevelNode = cmds.listConnections(cmds.listHistory(shapeNode,ac=1),type='polyBevel3')
|
||
|
if bevelNode != None:
|
||
|
checkGapState = cmds.getAttr(n+'.statePanel')
|
||
|
if checkGapState == 1:
|
||
|
extrudeNode = cmds.listConnections(cmds.listHistory(n,ac=1),type='polyExtrudeFace')
|
||
|
if extrudeNode != None:
|
||
|
cmds.delete(extrudeNode)
|
||
|
cmds.delete(bevelNode)
|
||
|
cmds.select(n)
|
||
|
cmds.DeleteHistory()
|
||
|
cmds.setAttr((n+'.cutterType'),'none',type="string")
|
||
|
checkGapState = cmds.getAttr(n+'.statePanel')
|
||
|
if checkGapState == 1:
|
||
|
cmds.select(n)
|
||
|
makeGap()
|
||
|
cmds.select(newCutter)
|
||
|
|
||
|
def scrapeCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
selCutter = cmds.ls(sl=1, fl=1, type='transform')
|
||
|
myType = checkInstType()
|
||
|
if len(selCutter) == 1 and 'boxCutter' in selCutter[0] and myType[1] == 'new':
|
||
|
shapeNode = cmds.listRelatives(selCutter[0], f = True, shapes=True)
|
||
|
checkConnection = cmds.listConnections(shapeNode[0]+'.worldMatrix',d=1,p=1)
|
||
|
cmds.disconnectAttr((shapeNode[0]+'.worldMatrix'), checkConnection[0])
|
||
|
checkConnection = cmds.listConnections(shapeNode[0]+'.outMesh',d=1,p=1)
|
||
|
cmds.disconnectAttr((shapeNode[0]+'.outMesh'), checkConnection[0])
|
||
|
|
||
|
newNode = cmds.duplicate((beseMesh+'_bool'),rr=1)
|
||
|
cmds.polyExtrudeFacet(newNode,constructionHistory = 1, keepFacesTogether= 1, tk = 0.1)
|
||
|
cmds.polySeparate(newNode, ch=0)
|
||
|
testMesh = cmds.ls(sl=1,fl=1)
|
||
|
worldFaceA = cmds.polyEvaluate(testMesh[0],wa=True)
|
||
|
worldFaceB = cmds.polyEvaluate(testMesh[1],wa=True)
|
||
|
|
||
|
if worldFaceA > worldFaceB:
|
||
|
cmds.delete(testMesh[1])
|
||
|
else:
|
||
|
cmds.delete(testMesh[0])
|
||
|
cmds.rename(selCutter[0] + '_skinMesh')
|
||
|
|
||
|
if cmds.objExists(selCutter[0] + 'skinGrp') == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename(selCutter[0] +'skinGrp')
|
||
|
|
||
|
cmds.parent((selCutter[0] + '_skinMesh'),(selCutter[0] +'skinGrp'))
|
||
|
cmds.delete(newNode)
|
||
|
cmds.ReversePolygonNormals()
|
||
|
cmds.DeleteHistory()
|
||
|
|
||
|
|
||
|
#create intersection boolean
|
||
|
subNode= cmds.polyCBoolOp(selCutter[0],(selCutter[0] + '_skinMesh') , op= 3, ch= 1, preserveColor= 0, classification= 1, name= 'skinCutter')
|
||
|
cmds.DeleteHistory()
|
||
|
|
||
|
#add cutter back
|
||
|
extNode = cmds.polyExtrudeFacet( constructionHistory=True, keepFacesTogether = True, smoothingAngle=30, tk = 1 )
|
||
|
if cmds.objExists((beseMesh +'_cutterGrp')) == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'_cutterGrp'))
|
||
|
cmds.parent((beseMesh +'_cutterGrp'),(beseMesh +'BoolGrp'))
|
||
|
|
||
|
cmds.select('skinCutter')
|
||
|
useOwnCutterShape()
|
||
|
#add skin attribute
|
||
|
selCutter = cmds.ls(sl=1, fl=1, type='transform')
|
||
|
if not cmds.attributeQuery('skinOffset', node = selCutter[0], ex=True ):
|
||
|
cmds.addAttr(selCutter[0], ln='skinOffset', at = "float" )
|
||
|
cmds.setAttr((selCutter[0]+'.skinOffset'),0.5)
|
||
|
|
||
|
cmds.setAttr((selCutter[0]+'.cutterType'),'scrape',type="string")
|
||
|
cmds.connectAttr((selCutter[0] +'.skinOffset'), (extNode[0] +'.thickness'),f=True)
|
||
|
#link slider
|
||
|
cmds.connectControl('scrapeSlider', (selCutter[0] +'.skinOffset'))
|
||
|
|
||
|
def addBevelDirectionAttr():
|
||
|
newCutter = cmds.ls(sl=True, fl=True)
|
||
|
cmds.setAttr((newCutter[0]+'.cutterDir'),'x',type="string")
|
||
|
cmds.setAttr((newCutter[0]+'.cutterType'),'bevel',type="string")
|
||
|
|
||
|
def offPressCutter():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
checkNoSnapX = cmds.getAttr('sampleLoc.translateX')
|
||
|
checkNoSnapY = cmds.getAttr('sampleLoc.translateY')
|
||
|
checkNoSnapZ = cmds.getAttr('sampleLoc.translateZ')
|
||
|
if checkNoSnapX !=0 and checkNoSnapY !=0 and checkNoSnapZ !=0:
|
||
|
cmds.select('sampleLoc')
|
||
|
cmds.pickWalk(d='down')
|
||
|
newCutter = cmds.ls(sl=1,fl=1)
|
||
|
cmds.parent(newCutter,(beseMesh+'_cutterGrp'))
|
||
|
if cmds.objExists('sampleLoc*'):
|
||
|
cmds.delete('sampleLoc*')
|
||
|
if cmds.objExists('snapLive*'):
|
||
|
cmds.delete('snapLive*')
|
||
|
cmds.setToolTo('moveSuperContext')
|
||
|
|
||
|
def goPressCutter(boxSide):
|
||
|
global currentScaleRecord
|
||
|
global currentCutterName
|
||
|
hideAllCutter()
|
||
|
if cmds.objExists('sampleLoc*'):
|
||
|
cmds.delete('sampleLoc*')
|
||
|
if cmds.objExists('snapLive*'):
|
||
|
cmds.delete('snapLive*')
|
||
|
#create cutter
|
||
|
sideNumber = boxSide
|
||
|
preRotAngle = []
|
||
|
if sideNumber == 3:
|
||
|
preRotAngle = 60
|
||
|
elif sideNumber == 4:
|
||
|
preRotAngle = 45
|
||
|
elif sideNumber == 5:
|
||
|
preRotAngle = 72
|
||
|
elif sideNumber == 6:
|
||
|
preRotAngle = 30
|
||
|
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists(beseMesh + '_BoolResult') == 0:
|
||
|
restoreCutterWithSymmtry()
|
||
|
nextIndex = nextCutterNumber()
|
||
|
member =cmds.editDisplayLayerMembers((beseMesh+'_BoolResult'),q=True)
|
||
|
snapMesh =[]
|
||
|
if member != None:
|
||
|
snapMesh = member[0]
|
||
|
cmds.setToolTo('moveSuperContext')
|
||
|
getPresize = cmds.floatField( 'cuterPreSize' , q=1, value = True)
|
||
|
setScale = cmds.floatSliderGrp('cutterScaleSlider', q=1, value = True)
|
||
|
cmds.polyCylinder(r = getPresize, h= (1.5*getPresize) ,sx= boxSide, sy =0, sz=0, rcp= 0 , cuv =3 ,ch=1)
|
||
|
cmds.rename('boxCutter'+str(nextIndex))
|
||
|
newCutter = cmds.ls(sl=True, fl=True)
|
||
|
currentCutterName = newCutter[0]
|
||
|
cmds.setAttr( (newCutter[0]+'.rotateY'), preRotAngle)
|
||
|
cmds.makeIdentity((newCutter[0]),apply =1, t = 0, r = 1, s =0, n =0, pn= 1)
|
||
|
cmds.setAttr( (newCutter[0]+'.scaleX'),(setScale))
|
||
|
cmds.setAttr( (newCutter[0]+'.scaleZ'),(setScale))
|
||
|
cmds.setAttr( (newCutter[0]+'.scaleY'),(setScale))
|
||
|
currentScaleRecord = setScale
|
||
|
#cmds.CenterPivot()
|
||
|
cmds.group()
|
||
|
cmds.rename('sampleLoc')
|
||
|
cmds.xform(ws =True, piv =(0,0,0))
|
||
|
cmds.setAttr('sampleLoc.scaleX', 0.001)
|
||
|
cmds.setAttr('sampleLoc.scaleY', 0.001)
|
||
|
cmds.setAttr('sampleLoc.scaleZ', 0.001)
|
||
|
refTopNode = cmds.ls(sl = True,fl =True, type= 'transform')[0]
|
||
|
transDownNode = cmds.listRelatives('sampleLoc', c=True,f=True )
|
||
|
#cutter in position
|
||
|
#add attr
|
||
|
shapeNode = cmds.listRelatives(newCutter[0], shapes=True ,f =True)
|
||
|
cmds.setAttr( (shapeNode[0]+".overrideEnabled") , 1)
|
||
|
cmds.setAttr( (shapeNode[0]+".overrideShading") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".castsShadows") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".receiveShadows") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".primaryVisibility") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".visibleInReflections") , 0)
|
||
|
cmds.setAttr( (shapeNode[0]+".visibleInRefractions") , 0)
|
||
|
|
||
|
if not cmds.attributeQuery('cutterDir', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='cutterDir', dt= 'string')
|
||
|
if not cmds.attributeQuery('cutterType', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='cutterType', dt= 'string')
|
||
|
cmds.setAttr((newCutter[0]+'.cutterDir'),e=True, keyable=True)
|
||
|
cmds.setAttr((newCutter[0]+'.cutt erType'),e=True, keyable=True)
|
||
|
|
||
|
if not cmds.attributeQuery('cutterOp', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='cutterOp', dt= 'string')
|
||
|
cmds.setAttr((newCutter[0]+'.cutterOp'),e=True, keyable=True)
|
||
|
|
||
|
checkButtonStateList = ['subsButton','unionButton','cutButton']
|
||
|
getCurrentType = ''
|
||
|
for c in checkButtonStateList:
|
||
|
buttonState = cmds.button( c ,q=1, bgc = True )
|
||
|
if buttonState[1] > 0.4:
|
||
|
getCurrentType = c
|
||
|
|
||
|
setType = getCurrentType.replace('Button','')
|
||
|
cmds.setAttr((newCutter[0]+'.cutterOp'),setType,type="string")
|
||
|
if setType == 'subs':
|
||
|
cmds.setAttr( (shapeNode[0]+'.overrideColor'), 28)
|
||
|
elif setType == 'union':
|
||
|
cmds.setAttr( (shapeNode[0]+'.overrideColor'), 31)
|
||
|
else:
|
||
|
cmds.setAttr( (shapeNode[0]+'.overrideColor'), 25)
|
||
|
|
||
|
if not cmds.attributeQuery('statePanel', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='statePanel', at = "float" )
|
||
|
if not cmds.attributeQuery('panelGap', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='panelGap', at = "float" )
|
||
|
if not cmds.attributeQuery('intPanelGap', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='intPanelGap', at = "float" )
|
||
|
if not cmds.attributeQuery('intScaleX', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='intScaleX', at = "float" )
|
||
|
if not cmds.attributeQuery('preBevel', node = newCutter[0], ex=True ):
|
||
|
cmds.addAttr(newCutter[0], ln='preBevel', at = "float" )
|
||
|
cmds.setAttr((newCutter[0]+'.statePanel'),0)
|
||
|
cmds.setAttr((newCutter[0]+'.preBevel'),1)
|
||
|
cmds.select(('boxCutter'+str(nextIndex)))
|
||
|
fixBoolNodeConnection()
|
||
|
addBevelDirectionAttr()
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
snapMesh = (beseMesh +'_bool')
|
||
|
cmds.duplicate(snapMesh,n='snapLive')
|
||
|
cmds.setAttr('snapLive.visibility',0)
|
||
|
cmds.select(cl=1)
|
||
|
##### undo ######
|
||
|
global ctxCutter
|
||
|
ctxCutter = 'ctxCutter'
|
||
|
cmds.intSliderGrp('cutterSideSlider', e=1, v = boxSide)
|
||
|
if cmds.draggerContext(ctxCutter, exists=True):
|
||
|
cmds.deleteUI(ctxCutter)
|
||
|
cmds.draggerContext(ctxCutter, pressCommand = onPressCutter, rc = offPressCutter, dragCommand = onDragCutterCMD, name=ctxCutter, cursor='crossHair', undoMode='all')
|
||
|
cmds.setToolTo(ctxCutter)
|
||
|
|
||
|
def onDragCutterCMD():
|
||
|
cmds.undoInfo(swf=0)
|
||
|
onDragCutter()
|
||
|
cmds.undoInfo(swf=1)
|
||
|
|
||
|
def onDragCutter():
|
||
|
global ctxCutter
|
||
|
global screenX,screenY
|
||
|
global currentScaleRecord
|
||
|
global currentCutterName
|
||
|
selSample = 'sampleLoc'
|
||
|
modifiers = cmds.getModifiers()
|
||
|
if (modifiers == 1):
|
||
|
#print('shift Press'
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctxCutter, query=True, dragPoint=True)
|
||
|
distanceA = (vpX - screenX)
|
||
|
rotateRun = (distanceA) /4
|
||
|
if rotateRun > 360 :
|
||
|
rotateRun = 360
|
||
|
elif rotateRun < -360 :
|
||
|
rotateRun = -360
|
||
|
|
||
|
cmds.setAttr((currentCutterName + '.rotateY'),rotateRun)
|
||
|
cmds.refresh(cv=True,f=True)
|
||
|
|
||
|
elif(modifiers == 4):
|
||
|
#print('ctrl selSample'
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctxCutter, query=True, dragPoint=True)
|
||
|
distanceB = vpX - screenX
|
||
|
scaleCheck = distanceB / 100
|
||
|
scaleRun = currentScaleRecord + scaleCheck
|
||
|
if scaleRun > 5:
|
||
|
scaleRun = 5
|
||
|
elif scaleRun < 0:
|
||
|
scaleRun = 0.1
|
||
|
cmds.floatSliderGrp('cutterScaleSlider', e=1 ,v = scaleRun )
|
||
|
cmds.setAttr(('sampleLoc.scaleX'),scaleRun)
|
||
|
cmds.setAttr(('sampleLoc.scaleY'),scaleRun)
|
||
|
cmds.setAttr(('sampleLoc.scaleZ'),scaleRun)
|
||
|
cmds.refresh(cv=True,f=True)
|
||
|
elif(modifiers == 8):
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctxCutter, query=True, dragPoint=True)
|
||
|
pos = om.MPoint()
|
||
|
dir = om.MVector()
|
||
|
hitpoint = om.MFloatPoint()
|
||
|
omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, dir)
|
||
|
pos2 = om.MFloatPoint(pos.x, pos.y, pos.z)
|
||
|
#current camera
|
||
|
view = omui.M3dView.active3dView()
|
||
|
cam = om.MDagPath()
|
||
|
view.getCamera(cam)
|
||
|
camPath = cam.fullPathName()
|
||
|
cameraTrans = cmds.listRelatives(camPath,type='transform',p=True)
|
||
|
cameraPosition = cmds.xform(cameraTrans,q=1,ws=1,rp=1)
|
||
|
checkHit = 0
|
||
|
finalMesh = []
|
||
|
finalX = 0
|
||
|
finalY = 0
|
||
|
finalZ = 0
|
||
|
shortDistance = 10000000000
|
||
|
distanceBetween = 1000000000
|
||
|
meshNode = cmds.listRelatives(selSample, fullPath=True ,ad=True)
|
||
|
myShape = cmds.listRelatives(meshNode, shapes=True,f=True)
|
||
|
hitFacePtr = om.MScriptUtil().asIntPtr()
|
||
|
hitFace = []
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
member =cmds.editDisplayLayerMembers((beseMesh+'_BoolResult'),q=True)
|
||
|
snapMesh = (beseMesh +'_boolShape')
|
||
|
checkList = []
|
||
|
checkList.append('snapLive')
|
||
|
for mesh in checkList:
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add(mesh)
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
fnMesh = om.MFnMesh(dagPath)
|
||
|
intersection = fnMesh.closestIntersection(
|
||
|
om.MFloatPoint(pos2),
|
||
|
om.MFloatVector(dir),
|
||
|
None,
|
||
|
None,
|
||
|
False,
|
||
|
om.MSpace.kWorld,
|
||
|
99999,
|
||
|
False,
|
||
|
None,
|
||
|
hitpoint,
|
||
|
None,
|
||
|
hitFacePtr,
|
||
|
None,
|
||
|
None,
|
||
|
None)
|
||
|
if intersection:
|
||
|
x = hitpoint.x
|
||
|
y = hitpoint.y
|
||
|
z = hitpoint.z
|
||
|
distanceBetween = math.sqrt( ((float(cameraPosition[0]) - x)**2) + ((float(cameraPosition[1]) - y)**2) + ((float(cameraPosition[2]) - z)**2))
|
||
|
if distanceBetween < shortDistance:
|
||
|
shortDistance = distanceBetween
|
||
|
finalMesh = mesh
|
||
|
hitFace = om.MScriptUtil(hitFacePtr).asInt()
|
||
|
|
||
|
hitFaceName = (mesh + '.f[' + str(hitFace) +']')
|
||
|
|
||
|
cpX,cpY,cpZ = getPolyFaceCenter(hitFaceName)
|
||
|
# bug, for some reason it doesn't like value is 0
|
||
|
if cpX == 0:
|
||
|
cpX = 0.000001
|
||
|
if cpY == 0:
|
||
|
cpY = 0.000001
|
||
|
if cpZ == 0:
|
||
|
cpZ = 0.000001
|
||
|
cmds.setAttr(('sampleLoc.translateX'),cpX)
|
||
|
cmds.setAttr(('sampleLoc.translateY'),cpY)
|
||
|
cmds.setAttr(('sampleLoc.translateZ'),cpZ)
|
||
|
cmds.refresh(cv=True,f=True)
|
||
|
else:
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctxCutter, query=True, dragPoint=True)
|
||
|
currentSX = vpX
|
||
|
currentSY = vpY
|
||
|
pos = om.MPoint()
|
||
|
dir = om.MVector()
|
||
|
hitpoint = om.MFloatPoint()
|
||
|
omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, dir)
|
||
|
pos2 = om.MFloatPoint(pos.x, pos.y, pos.z)
|
||
|
#current camera
|
||
|
view = omui.M3dView.active3dView()
|
||
|
cam = om.MDagPath()
|
||
|
view.getCamera(cam)
|
||
|
camPath = cam.fullPathName()
|
||
|
|
||
|
cameraTrans = cmds.listRelatives(camPath,type='transform',p=True)
|
||
|
cameraPosition = cmds.xform(cameraTrans,q=1,ws=1,rp=1)
|
||
|
|
||
|
checkHit = 0
|
||
|
finalMesh = []
|
||
|
finalX = 0
|
||
|
finalY = 0
|
||
|
finalZ = 0
|
||
|
shortDistance = 10000000000
|
||
|
distanceBetween = 1000000000
|
||
|
meshNode = cmds.listRelatives(selSample, fullPath=True ,ad=True)
|
||
|
myShape = cmds.listRelatives(meshNode, shapes=True,f=True)
|
||
|
|
||
|
hitFacePtr = om.MScriptUtil().asIntPtr()
|
||
|
hitFace = []
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
member =cmds.editDisplayLayerMembers((beseMesh+'_BoolResult'),q=True)
|
||
|
snapMesh = (beseMesh +'_boolShape')
|
||
|
checkList = []
|
||
|
checkList.append('snapLive')
|
||
|
for mesh in checkList:
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add(mesh)
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
fnMesh = om.MFnMesh(dagPath)
|
||
|
intersection = fnMesh.closestIntersection(
|
||
|
om.MFloatPoint(pos2),
|
||
|
om.MFloatVector(dir),
|
||
|
None,
|
||
|
None,
|
||
|
False,
|
||
|
om.MSpace.kWorld,
|
||
|
99999,
|
||
|
False,
|
||
|
None,
|
||
|
hitpoint,
|
||
|
None,
|
||
|
hitFacePtr,
|
||
|
None,
|
||
|
None,
|
||
|
None)
|
||
|
if intersection:
|
||
|
x = hitpoint.x
|
||
|
y = hitpoint.y
|
||
|
z = hitpoint.z
|
||
|
distanceBetween = math.sqrt( ((float(cameraPosition[0]) - x)**2) + ((float(cameraPosition[1]) - y)**2) + ((float(cameraPosition[2]) - z)**2))
|
||
|
if distanceBetween < shortDistance:
|
||
|
shortDistance = distanceBetween
|
||
|
finalMesh = mesh
|
||
|
hitFace = om.MScriptUtil(hitFacePtr).asInt()
|
||
|
finalX = x
|
||
|
finalY = y
|
||
|
finalZ = z
|
||
|
# bug, for some reason it doesn't like value is 0
|
||
|
if finalX == 0:
|
||
|
finalX = 0.000001
|
||
|
if finalY == 0:
|
||
|
finalY = 0.000001
|
||
|
if finalZ == 0:
|
||
|
finalZ = 0.000001
|
||
|
cmds.setAttr('sampleLoc.translateX', finalX)
|
||
|
cmds.setAttr('sampleLoc.translateY', finalY)
|
||
|
cmds.setAttr('sampleLoc.translateZ',finalZ)
|
||
|
hitFaceName = (mesh + '.f[' + str(hitFace) +']')
|
||
|
rx, ry, rz = getFaceAngle(hitFaceName)
|
||
|
cmds.setAttr('sampleLoc.rotateX', rx)
|
||
|
cmds.setAttr('sampleLoc.rotateY', ry)
|
||
|
cmds.setAttr('sampleLoc.rotateZ', rz)
|
||
|
cmds.select('sampleLoc')
|
||
|
cmds.refresh(cv=True,f=True)
|
||
|
|
||
|
def onPressCutter():
|
||
|
global ctxCutter
|
||
|
global screenX,screenY
|
||
|
vpX, vpY, _ = cmds.draggerContext(ctxCutter, query=True, anchorPoint=True)
|
||
|
screenX = vpX
|
||
|
screenY = vpY
|
||
|
pos = om.MPoint()
|
||
|
dir = om.MVector()
|
||
|
hitpoint = om.MFloatPoint()
|
||
|
omui.M3dView().active3dView().viewToWorld(int(vpX), int(vpY), pos, dir)
|
||
|
pos2 = om.MFloatPoint(pos.x, pos.y, pos.z)
|
||
|
#current camera
|
||
|
view = omui.M3dView.active3dView()
|
||
|
cam = om.MDagPath()
|
||
|
view.getCamera(cam)
|
||
|
camPath = cam.fullPathName()
|
||
|
cameraTrans = cmds.listRelatives(camPath,type='transform',p=True)
|
||
|
cameraPosition = cmds.xform(cameraTrans,q=1,ws=1,rp=1)
|
||
|
checkHit = 0
|
||
|
finalMesh = []
|
||
|
finalX = []
|
||
|
finalY = []
|
||
|
finalZ = []
|
||
|
shortDistance = 10000000000
|
||
|
distanceBetween = 1000000000
|
||
|
hitFacePtr = om.MScriptUtil().asIntPtr()
|
||
|
hitFace = []
|
||
|
checkList = []
|
||
|
checkList.append('snapLive')
|
||
|
for mesh in checkList:
|
||
|
selectionList = om.MSelectionList()
|
||
|
selectionList.add(mesh)
|
||
|
dagPath = om.MDagPath()
|
||
|
selectionList.getDagPath(0, dagPath)
|
||
|
fnMesh = om.MFnMesh(dagPath)
|
||
|
|
||
|
intersection = fnMesh.closestIntersection(
|
||
|
om.MFloatPoint(pos2),
|
||
|
om.MFloatVector(dir),
|
||
|
None,
|
||
|
None,
|
||
|
False,
|
||
|
om.MSpace.kWorld,
|
||
|
99999,
|
||
|
False,
|
||
|
None,
|
||
|
hitpoint,
|
||
|
None,
|
||
|
hitFacePtr,
|
||
|
None,
|
||
|
None,
|
||
|
None)
|
||
|
|
||
|
if intersection:
|
||
|
x = hitpoint.x
|
||
|
y = hitpoint.y
|
||
|
z = hitpoint.z
|
||
|
distanceBetween = math.sqrt( ((float(cameraPosition[0]) - x)**2) + ((float(cameraPosition[1]) - y)**2) + ((float(cameraPosition[2]) - z)**2))
|
||
|
if distanceBetween < shortDistance:
|
||
|
shortDistance = distanceBetween
|
||
|
finalMesh = mesh
|
||
|
finalX = x
|
||
|
finalY = y
|
||
|
finalZ = z
|
||
|
hitFace = om.MScriptUtil(hitFacePtr).asInt()
|
||
|
cmds.setAttr('sampleLoc.translateX', finalX)
|
||
|
cmds.setAttr('sampleLoc.translateY', finalY)
|
||
|
cmds.setAttr('sampleLoc.translateZ',finalZ)
|
||
|
hitFaceName = (mesh + '.f[' + str(hitFace) +']')
|
||
|
rx, ry, rz = getFaceAngle(hitFaceName)
|
||
|
cmds.setAttr('sampleLoc.rotateX', rx)
|
||
|
cmds.setAttr('sampleLoc.rotateY', ry)
|
||
|
cmds.setAttr('sampleLoc.rotateZ', rz)
|
||
|
cmds.setAttr('sampleLoc.scaleX', 1)
|
||
|
cmds.setAttr('sampleLoc.scaleY', 1)
|
||
|
cmds.setAttr('sampleLoc.scaleZ', 1)
|
||
|
cmds.select('sampleLoc')
|
||
|
cmds.refresh(cv=True,f=True)
|
||
|
|
||
|
def getFaceAngle(faceName):
|
||
|
shapeNode = cmds.listRelatives(faceName, fullPath=True , parent=True )
|
||
|
transformNode = cmds.listRelatives(shapeNode[0], fullPath=True , parent=True )
|
||
|
obj_matrix = OpenMaya.MMatrix(cmds.xform(transformNode, query=True, worldSpace=True, matrix=True))
|
||
|
face_normals_text = cmds.polyInfo(faceName, faceNormals=True)[0]
|
||
|
face_normals = [float(digit) for digit in re.findall(r'-?\d*\.\d*', face_normals_text)]
|
||
|
v = OpenMaya.MVector(face_normals) * obj_matrix
|
||
|
upvector = OpenMaya.MVector (0,1,0)
|
||
|
getHitNormal = v
|
||
|
quat = OpenMaya.MQuaternion(upvector, getHitNormal)
|
||
|
quatAsEuler = OpenMaya.MEulerRotation()
|
||
|
quatAsEuler = quat.asEulerRotation()
|
||
|
rx, ry, rz = math.degrees(quatAsEuler.x), math.degrees(quatAsEuler.y), math.degrees(quatAsEuler.z)
|
||
|
return rx, ry, rz
|
||
|
|
||
|
def reTarget():
|
||
|
newTarget = cmds.ls(sl=1,fl=1)
|
||
|
if len(newTarget) == 1:
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
|
||
|
#record symmetry
|
||
|
getSymX = 0
|
||
|
getSymY = 0
|
||
|
getSymZ = 0
|
||
|
|
||
|
if cmds.attributeQuery('symmetryX', node = beseMesh, ex=True ):
|
||
|
getSymX = cmds.getAttr(beseMesh+'.symmetryX')
|
||
|
if cmds.attributeQuery('symmetryY', node = beseMesh, ex=True ):
|
||
|
getSymY = cmds.getAttr(beseMesh+'.symmetryY')
|
||
|
if cmds.attributeQuery('symmetryZ', node = beseMesh, ex=True ):
|
||
|
getSymZ = cmds.getAttr(beseMesh+'.symmetryZ')
|
||
|
|
||
|
|
||
|
bakeCutter("all")
|
||
|
cmds.parent(newTarget, (beseMesh+'_bakeStep'))
|
||
|
#cmds.delete((beseMesh+'_bakeBaseMesh'))
|
||
|
cmds.rename((beseMesh+'_bakeBaseMesh'),(beseMesh+'_temp'))
|
||
|
cmds.parent((beseMesh+'_temp'),w=1)
|
||
|
cmds.rename(newTarget, (beseMesh+'_bakeBaseMesh'))
|
||
|
cmds.rename((beseMesh+'_temp'), (beseMesh+'_old'))
|
||
|
restoreCutter()
|
||
|
|
||
|
|
||
|
#apply to new target
|
||
|
if not cmds.attributeQuery('symmetryX', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryX', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryX'),getSymX)
|
||
|
if not cmds.attributeQuery('symmetryY', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryY', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryY'),getSymY)
|
||
|
if not cmds.attributeQuery('symmetryZ', node = beseMesh, ex=True ):
|
||
|
cmds.addAttr(beseMesh, ln='symmetryZ', at = "long" )
|
||
|
cmds.setAttr((beseMesh+'.symmetryZ'),getSymZ)
|
||
|
|
||
|
#hide all cage
|
||
|
cageList = cmds.ls((beseMesh + '_cage*'),type='transform')
|
||
|
for c in cageList:
|
||
|
cmds.setAttr((c+'.visibility'),0)
|
||
|
|
||
|
#checkSymmetryState
|
||
|
checkSymX = cmds.getAttr(beseMesh+'.symmetryX')
|
||
|
checkSymY = cmds.getAttr(beseMesh+'.symmetryY')
|
||
|
checkSymZ = cmds.getAttr(beseMesh+'.symmetryZ')
|
||
|
|
||
|
if checkSymX == 1:
|
||
|
boolSymmetry('x',1)
|
||
|
elif checkSymX == -1:
|
||
|
boolSymmetry('x',2)
|
||
|
|
||
|
if checkSymY == 1:
|
||
|
boolSymmetry('y',1)
|
||
|
elif checkSymY == -1:
|
||
|
boolSymmetry('y',2)
|
||
|
|
||
|
if checkSymZ == 1:
|
||
|
boolSymmetry('z',1)
|
||
|
elif checkSymZ == -1:
|
||
|
boolSymmetry('z',2)
|
||
|
|
||
|
def getPolyFaceCenter(faceName):
|
||
|
meshFaceName = faceName.split('.')[0]
|
||
|
findVtx = cmds.polyInfo(faceName, fv=1)
|
||
|
getNumber = []
|
||
|
checkNumber = ((findVtx[0].split(':')[1]).split('\n')[0]).split(' ')
|
||
|
for c in checkNumber:
|
||
|
findNumber = ''.join([n for n in c.split('|')[-1] if n.isdigit()])
|
||
|
if findNumber:
|
||
|
getNumber.append(findNumber)
|
||
|
centerX = 0
|
||
|
centerY = 0
|
||
|
centerZ = 0
|
||
|
for g in getNumber:
|
||
|
x,y,z = cmds.pointPosition((meshFaceName + '.vtx['+g + ']'),w=1)
|
||
|
centerX = centerX + x
|
||
|
centerY = centerY + y
|
||
|
centerZ = centerZ + z
|
||
|
|
||
|
centerX = centerX/len(getNumber)
|
||
|
centerY = centerY/len(getNumber)
|
||
|
centerZ = centerZ/len(getNumber)
|
||
|
return centerX,centerY,centerZ
|
||
|
|
||
|
def meshBBox():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if beseMesh is not None:
|
||
|
mesh = (beseMesh +'_bool')
|
||
|
if cmds.objExists(mesh):
|
||
|
bbox= cmds.xform(mesh, q=1, ws=1, bb=1)
|
||
|
length=math.sqrt((math.pow(bbox[0]-bbox[3],2)+math.pow(bbox[1]-bbox[4],2)+math.pow(bbox[2]-bbox[5],2))/3)
|
||
|
bestV = length / 10
|
||
|
cmds.floatField( 'cuterPreSize' , e=True ,value=bestV )
|
||
|
loadSymmetryState()
|
||
|
|
||
|
def checkBaseMeshList():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query=True, ils=True)
|
||
|
if beseMesh is not None:
|
||
|
for c in beseMesh:
|
||
|
if not 'NoBaseMeshMenu' in c:
|
||
|
meshName = c.replace('Menu', 'BoolGrp')
|
||
|
if cmds.objExists(meshName) == 0:
|
||
|
cmds.deleteUI(c)
|
||
|
beseMeshCheck = cmds.ls('*BoolGrp', type='transform')
|
||
|
if len(beseMeshCheck) > 0:
|
||
|
checkBaseList = cmds.optionMenu('baseMeshMenu', query=True, ils=True)
|
||
|
for b in beseMeshCheck:
|
||
|
removeGrp = b.replace('BoolGrp', '')
|
||
|
checkSelMesh = cmds.menuItem((removeGrp + "Menu"), q=True, ex=True)
|
||
|
if checkSelMesh == 0:
|
||
|
cmds.menuItem((removeGrp + "Menu"), label=removeGrp, p='baseMeshMenu')
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query=True, ils=True)
|
||
|
if beseMesh is not None:
|
||
|
if len(beseMesh) > 1:
|
||
|
checkNoBase = cmds.menuItem('NoBaseMeshMenu', q=True, ex=True)
|
||
|
if checkNoBase == 1:
|
||
|
cmds.deleteUI("NoBaseMeshMenu")
|
||
|
else:
|
||
|
cmds.menuItem("NoBaseMeshMenu", label='No Base Mesh', p='baseMeshMenu')
|
||
|
meshBBox()
|
||
|
allLayers = cmds.ls(type='displayLayer')
|
||
|
for a in allLayers:
|
||
|
if not 'defaultLayer' in a:
|
||
|
members = cmds.editDisplayLayerMembers(a, query=True)
|
||
|
if members == None:
|
||
|
cmds.delete(a)
|
||
|
|
||
|
|
||
|
def updateSnapState():
|
||
|
#check snap border state
|
||
|
cmds.makeLive( none=True )
|
||
|
cmds.manipMoveContext('Move',e=True, snapLivePoint= False)
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
cmds.button('borderAlginButton',e=True, bgc = [0.28,0.28,0.28])
|
||
|
if cmds.objExists(beseMesh +'_borderBoxGrp') and cmds.objExists(beseMesh +'_borderBox'):
|
||
|
cmds.button('borderAlginButton',e=True, bgc = [0.3,0.5,0.6])
|
||
|
cmds.makeLive( beseMesh +'_borderBox' )
|
||
|
cmds.manipMoveContext('Move',e=True, snapLivePoint= True)
|
||
|
|
||
|
def restoreMissingGrps():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if cmds.objExists((beseMesh +'_cutterGrp')) == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'_cutterGrp'))
|
||
|
cmds.parent((beseMesh +'_cutterGrp'),(beseMesh +'BoolGrp'))
|
||
|
|
||
|
|
||
|
def setCutterBaseMesh():
|
||
|
beseMesh = cmds.ls(sl=True,fl=True,type='transform')
|
||
|
if len(beseMesh) == 1:
|
||
|
cmds.delete(beseMesh[0],ch=1)
|
||
|
#cmds.makeIdentity(beseMesh[0],apply= True, t= 1, r =1, s =1, n= 0,pn=1)
|
||
|
cmds.editDisplayLayerMembers('defaultLayer',beseMesh[0])
|
||
|
topNode = mel.eval('rootOf '+beseMesh[0])
|
||
|
meshName = []
|
||
|
if 'BoolGrp' in topNode:
|
||
|
removeGrp = topNode.replace('BoolGrp','')
|
||
|
removeParent = removeGrp.replace('|','')
|
||
|
meshName = removeParent
|
||
|
else:
|
||
|
meshName = beseMesh[0]
|
||
|
meshName = meshName.replace('|','')
|
||
|
checkSelMesh = cmds.menuItem((meshName +"Menu"), q=True, ex = True)
|
||
|
if checkSelMesh == 0:
|
||
|
cmds.menuItem((meshName +"Menu"), label = meshName ,p = 'baseMeshMenu')
|
||
|
#cmds.optionMenu('baseMeshMenu|OptionMenu', q=True, v=True) # to get the name of the current value
|
||
|
#cmds.optionMenu('baseMeshMenu|OptionMenu', q=True, sl=True) # to get the current index
|
||
|
#cmds.optionMenu('baseMeshMenu|OptionMenu', e=True, sl = 3 )# to change the current value
|
||
|
cmds.optionMenu('baseMeshMenu', e=True, v = meshName )# to change the current value
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if beseMesh != 'No Base Mesh':
|
||
|
if cmds.objExists(beseMesh):
|
||
|
checkPivot = cmds.xform(beseMesh, q =True, sp=True,ws=True)
|
||
|
if cmds.objExists((beseMesh +'_cutterGrp')) == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'_cutterGrp'))
|
||
|
if cmds.objExists((beseMesh +'BoolGrp')) == 0:
|
||
|
cmds.CreateEmptyGroup()
|
||
|
cmds.rename((beseMesh +'BoolGrp'))
|
||
|
if cmds.objExists((beseMesh +'_bool')) ==0:
|
||
|
cmds.polyCube(w = 0.0001, h=0.0001, d=0.0001 ,sx =1 ,sy= 1, sz= 1)
|
||
|
cmds.rename(beseMesh +'_preSubBox')
|
||
|
cmds.polyCube(w = 0.0001, h=0.0001, d=0.0001 ,sx =1 ,sy= 1, sz= 1)
|
||
|
cmds.rename(beseMesh +'_afterSubBox')
|
||
|
cmds.polyCube(w = 0.0001, h=0.0001, d=0.0001 ,sx =1 ,sy= 1, sz= 1)
|
||
|
cmds.rename(beseMesh +'_preUnionBox')
|
||
|
#move pre box to base mesh center prevent error
|
||
|
bbox= cmds.xform(beseMesh, q=1, ws=1, bb=1)
|
||
|
bX = (bbox[3]-bbox[0])/2 + bbox[0]
|
||
|
bY = (bbox[4]-bbox[1])/2 + bbox[1]
|
||
|
bZ = (bbox[5]-bbox[2])/2 + bbox[2]
|
||
|
attrList = ['translateX','translateY','translateZ']
|
||
|
preBoxList = [(beseMesh +'_preSubBox'),(beseMesh +'_afterSubBox'),(beseMesh +'_preUnionBox')]
|
||
|
posList = [bX,bY,bZ]
|
||
|
for p in preBoxList:
|
||
|
for i in range(0,3):
|
||
|
cmds.setAttr(( p + '.' + attrList[i]),posList[i])
|
||
|
subNode= cmds.polyCBoolOp((beseMesh ), (beseMesh +'_preSubBox') , op= 2, ch= 1, preserveColor= 0, classification= 1, name= (beseMesh +'_bool'))
|
||
|
cmds.rename(subNode[0],(beseMesh +'_myBoolSub'))
|
||
|
unionNode = cmds.polyCBoolOp((beseMesh +'_myBoolSub'), (beseMesh +'_preUnionBox') , op= 1, ch= 1, preserveColor= 0, classification= 1, name= (beseMesh +'_union'))
|
||
|
cmds.rename(unionNode[0],(beseMesh +'_myBoolUnion'))
|
||
|
subNode= cmds.polyCBoolOp((beseMesh +'_myBoolUnion'), (beseMesh +'_afterSubBox') , op= 2, ch= 1, preserveColor= 0, classification= 1, name= (beseMesh +'_bool'))
|
||
|
cmds.rename(subNode[0],(beseMesh +'_bool'))
|
||
|
boolNode = cmds.listConnections(cmds.listHistory((beseMesh +'_bool'),f=1,ac=1),type='polyCBoolOp')
|
||
|
boolNode = set(boolNode)
|
||
|
#hack it by check '_', this is used by other group
|
||
|
listClean = []
|
||
|
for b in boolNode:
|
||
|
if '_' not in b:
|
||
|
listClean.append(b)
|
||
|
|
||
|
for l in listClean:
|
||
|
checkNodeType = cmds.nodeType(l)
|
||
|
if checkNodeType == 'polyCBoolOp':
|
||
|
checkOp = cmds.getAttr( l +'.operation')
|
||
|
if checkOp == 2:
|
||
|
if cmds.objExists(beseMesh +'_mySubs'):
|
||
|
cmds.rename(l,(beseMesh +'_myCut'))
|
||
|
else:
|
||
|
cmds.rename(l,(beseMesh +'_mySubs'))
|
||
|
else:
|
||
|
cmds.rename(l,(beseMesh +'_myUnion'))
|
||
|
|
||
|
baseNodes = cmds.listRelatives(beseMesh, ad = True, f = True)
|
||
|
baseTransNode = cmds.ls(baseNodes,type = 'transform')
|
||
|
baseMeshNode = cmds.ls(baseNodes,type = 'mesh')
|
||
|
cmds.setAttr((baseMeshNode[0]+'.intermediateObject'), 0)
|
||
|
cmds.parent(baseMeshNode[0],(beseMesh +'BoolGrp'),s=True)
|
||
|
cmds.delete(beseMesh)
|
||
|
cmds.pickWalk(d='up')
|
||
|
cmds.rename(beseMesh)
|
||
|
cmds.setAttr((beseMesh + '.visibility'), 0)
|
||
|
if not cmds.objExists((beseMesh +'_BoolResult')):
|
||
|
cmds.createDisplayLayer(name = (beseMesh +'_BoolResult'))
|
||
|
cmds.editDisplayLayerMembers( (beseMesh +'_BoolResult'),(beseMesh +'_bool')) # store my selection into the display layer
|
||
|
cmds.setAttr((beseMesh +'_BoolResult.displayType'),2)
|
||
|
|
||
|
checkList = ['_cutterGrp','_preSubBox','_preUnionBox','_myBoolUnion','_bool', '', '_afterSubBox','_myBoolSub' ]
|
||
|
for c in checkList:
|
||
|
checkGrp = cmds.ls((beseMesh + c), l=True)
|
||
|
if len(checkGrp)>0:
|
||
|
if 'BoolGrp' not in checkGrp[0]:
|
||
|
cmds.parent(checkGrp[0],(beseMesh +'BoolGrp'))
|
||
|
|
||
|
cmds.select(cl=True)
|
||
|
cmds.setAttr((beseMesh +'BoolGrp.visibility'),1)
|
||
|
cmds.move(checkPivot[0],checkPivot[1],checkPivot[2], (beseMesh + ".scalePivot"),(beseMesh + ".rotatePivot"), absolute=True)
|
||
|
meshBBox()
|
||
|
else:
|
||
|
removeNotExistBaseMesh()
|
||
|
|
||
|
def removeNotExistBaseMesh():
|
||
|
beseMesh = cmds.optionMenu('baseMeshMenu', query = True, v = True)
|
||
|
if beseMesh is not None:
|
||
|
if cmds.objExists(beseMesh):
|
||
|
cmds.delete(beseMesh)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
run()
|