Skip to content

Instantly share code, notes, and snippets.

@nrtkbb
Last active August 29, 2015 14:17
Show Gist options
  • Save nrtkbb/4b98b82bb0becbd03267 to your computer and use it in GitHub Desktop.
Save nrtkbb/4b98b82bb0becbd03267 to your computer and use it in GitHub Desktop.
nurbsSurfaceと同じ階層にnurbsToPolyするやつ
  • nurbsSufaceを選んで実行すると、polygonにコンバートされる。
  • その際に元のnurbsSurfaceはプリフィックスとサフィックスがつく。
  • コンバートされたpolygonにもとのnurbsSurfaceの名前がつく。
  • もとのnurbsSurfaceと同じ階層に作られる。
  • nurbsSufaceのアトリビュートでTessellateする。
  • polygonTypeがTriangles > Quadsになる。
  • グループを選んで実行すると、グループとそれ以下のnurbsSurfaceに対して実行される。
# -*- coding: utf-8 -*-
import pymel.core as pm
import os
import json
class OptionsWindow(object):
"""
optionsWindow base class.
"""
@classmethod
def showUI(cls):
win = cls()
win.create()
return win
def __init__(self):
self.name = u'optionsWindow'
self.title = u'Options Window'
self.supportsToolAction = False
self.actionName = u'Apply and Close'
def create(self):
if pm.window(self.name, ex=True):
pm.deleteUI(self.name)
self.window = pm.window(
self.name,
title=self.title,
menuBar=True
)
self.commonMenu()
with self.window:
self.mainForm = pm.formLayout()
with self.mainForm:
self.commonButtons(self.mainForm)
self.optionsBorder = pm.tabLayout(
scrollable=True,
tabsVisible=False,
height=1,
childResizable=True
)
with self.optionsBorder:
self.optionsForm = pm.formLayout()
with self.optionsForm:
self.displayOptions()
pm.formLayout(self.mainForm, edit=True,
attachForm=(
(self.optionsBorder, 'top', 0),
(self.optionsBorder, 'left', 0),
(self.optionsBorder, 'right', 0)
),
attachControl=(
(self.optionsBorder, 'bottom', 5, self.applyBtn)
)
)
def commonMenu(self):
self.editMenu = pm.menu(label='Edit')
self.editMenuSave = pm.menuItem(
label='Save Settings',
command=self.editMenuSaveCmd
)
self.editMenuReset = pm.menuItem(
label='Reset Settings',
command=self.editMenuResetCmd
)
self.editMenuDiv = pm.menuItem(divider=True)
self.editMenuRadio = pm.radioMenuItemCollection()
self.editMenuTool = pm.menuItem(
label='As Tool',
radioButton=True,
enable=self.supportsToolAction,
command=self.editMenuToolCmd
)
self.editMenuAction = pm.menuItem(
label='As Action',
radioButton=True,
enable=self.supportsToolAction,
command=self.editMenuActionCmd
)
self.helpMenu = pm.menu(label='Help')
self.helpMenuItem = pm.menuItem(
label='Help on %s' % self.title,
command=self.helpMenuCmd
)
def helpMenuCmd(self, *args):
pm.launch(web='https://github.com/nrtkbb/')
def commonButtons(self, form):
self.cmnBtnSize = dict(height=26)
self.actionBtn = pm.button(
label=self.actionName,
height=self.cmnBtnSize['height'],
command=self.actionBtnCmd
)
self.applyBtn = pm.button(
label='Apply',
height=self.cmnBtnSize['height'],
command=self.applyBtnCmd
)
self.closeBtn = pm.button(
label='Close',
height=self.cmnBtnSize['height'],
command=self.closeBtnCmd
)
pm.formLayout(form, edit=True,
attachForm=(
(self.actionBtn, 'left', 5),
(self.actionBtn, 'bottom', 5),
(self.applyBtn, 'bottom', 5),
(self.closeBtn, 'bottom', 5),
(self.closeBtn, 'right', 5)
),
attachPosition=(
(self.actionBtn, 'right', 1, 33),
(self.closeBtn, 'left', 0, 67)
),
attachControl=(
(self.applyBtn, 'left', 4, self.actionBtn),
(self.applyBtn, 'right', 4, self.closeBtn )
),
attachNone=(
(self.actionBtn, 'top'),
(self.applyBtn, 'top'),
(self.closeBtn, 'top')
)
)
def displayOptions(self):
pass
def editMenuSaveCmd(self, *args):
pass
def editMenuResetCmd(self, *args):
pass
def editMenuToolCmd(self, *args):
pass
def editMenuActionCmd(self, *args):
pass
def actionBtnCmd(self, *args):
self.applyBtnCmd()
self.closeBtnCmd()
def applyBtnCmd(self, *args):
pass
def closeBtnCmd(self, *args):
pm.deleteUI(self.name, window=True)
class JsonFile(object):
def __init__(self, file_name):
self.file_name = file_name
def save(self, **kwds):
try:
with open(self.file_name, mode='w') as f:
data = json.dumps(kwds)
f.write(data)
except IOError:
print u'Not allowed to write files to this path "%s".' % self.file_name
def load(self):
try:
with open(self.file_name, mode='r') as f:
return json.load(f)
except IOError:
return None
def delete(self):
if os.path.exists(self.file_name):
os.remove(self.file_name)
class NurbsToPolySpOptionsWindow(OptionsWindow):
def __init__(self):
super(NurbsToPolySpOptionsWindow, self).__init__()
self.name = u'nurbsToPolySpOptionsWindow'
self.title = u'Nurbs to poly SP Options Window'
self.jsonFile = JsonFile(NurbsToPolySpOptionsWindow.getFilePath())
self.pre = None
self.post = None
self.prefix = None
self.suffix = None
@classmethod
def getFilePath(cls):
p = os.path.abspath(os.path.dirname(__file__))
return os.path.join(p, u'nurbsToPolySpOptionsWindow.json')
def displayOptions(self):
self.setSelfFromFile()
layout = pm.columnLayout()
with layout:
self.prefix = pm.textFieldGrp(
label=u'Prefix',
text=self.pre
)
self.suffix = pm.textFieldGrp(
label=u'Suffix',
text=self.post
)
def setSelfFromUI(self):
self.pre = pm.textFieldGrp(self.prefix, query=True, text=True)
self.post = pm.textFieldGrp(self.suffix, query=True, text=True)
def setSelfFromFile(self):
data = self.jsonFile.load()
if data is None:
data = dict(pre=u'', post=u'Nrb')
self.pre = data[u'pre']
self.post = data[u'post']
def applyBtnCmd(self, *args):
self.editMenuSaveCmd()
nurbsToPolySp(prefix=self.pre, suffix=self.post)
def editMenuSaveCmd(self, *args):
self.setSelfFromUI()
self.jsonFile.save(
pre=self.pre,
post=self.post
)
def editMenuResetCmd(self, *args):
pm.textFieldGrp(self.prefix, edit=True, text=u'')
pm.textFieldGrp(self.suffix, edit=True, text=u'Nrb')
self.jsonFile.delete()
def nurbsToPolySp(*args, **kwds):
"""
nurbsToPolySp v0.0.1
- Select nurbsSurface or transform what have nurbsSurfaces before execute this function.
- Converted polygon's name will change to nurbsSurface's name.
- NurbsSurface's name will add prefix and add suffix.
- Converted polygon parent will nurbsSurface's parent.
- Converted polygon's polygonType to Quads.
- Converted polygon's tessellate will nurbsSurface's matchRenderTesselation.
"""
# get options from args.
selected = False
before_sels = None
if len(args) > 0:
sels = pm.ls(args)
before_sels = pm.ls(sl=True)
else:
sels = pm.ls(sl=True)
selected = True
if 1 > len(sels):
raise Exception(u'Please select one or more what is group have nurbsSurface.')
# get options from kwds.
if u'prefix' in kwds:
prefix = kwds[u'prefix']
else:
prefix = u''
if u'suffix' in kwds:
suffix = kwds[u'suffix']
else:
suffix = u'Nrb'
# main compute.
message = []
for sel in sels:
nurbs_shapes = pm.listRelatives(sel, allDescendents=True, type=u'nurbsSurface')
if 1 > len(nurbs_shapes):
message.append(u'{0} have not nurbsSurface. skipped.'.format(sel))
continue
for nurbs_shape in nurbs_shapes:
mesh_name = pm.nurbsToPoly(nurbs_shape,
matchRenderTessellation=True,
constructionHistory=True)
mesh = pm.ls(mesh_name)[0]
mesh_shape = mesh.getShape()
tessellate = mesh_shape.inputs()[0]
tessellate.setAttr('polygonType', lock=False)
tessellate.setAttr('polygonType', 1)
nurbs = nurbs_shape.getParent()
nurbs_parent = nurbs.getParent()
if nurbs_parent is not None:
pm.parent(mesh, nurbs_parent)
name = nurbs.name()
pm.rename(nurbs, prefix + name + suffix)
message.append(u'NurbsSurface renamed: "{0}" -> "{1}"'.format(name, prefix + name + suffix))
pm.rename(mesh, name)
message.append(u'Create polygon mesh:"{0}"'.format(name))
if selected:
pm.select(sels)
else:
pm.select(before_sels)
print '\n'.join(message)
print u'Finished nurbsToPolySp!!'
import nurbsToPolySp as np
np.NurbsToPolySpOptionsWindow.showUI()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment