#!/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()