- nurbsSufaceを選んで実行すると、polygonにコンバートされる。
- その際に元のnurbsSurfaceはプリフィックスとサフィックスがつく。
- コンバートされたpolygonにもとのnurbsSurfaceの名前がつく。
- もとのnurbsSurfaceと同じ階層に作られる。
- nurbsSufaceのアトリビュートでTessellateする。
- polygonTypeがTriangles > Quadsになる。
- グループを選んで実行すると、グループとそれ以下のnurbsSurfaceに対して実行される。
Last active
August 29, 2015 14:17
-
-
Save nrtkbb/4b98b82bb0becbd03267 to your computer and use it in GitHub Desktop.
nurbsSurfaceと同じ階層にnurbsToPolyするやつ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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!!' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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