Skip to content

Instantly share code, notes, and snippets.

@boredstiff
Created December 3, 2014 23:56
Show Gist options
  • Save boredstiff/aba47f406ae542fc9c48 to your computer and use it in GitHub Desktop.
Save boredstiff/aba47f406ae542fc9c48 to your computer and use it in GitHub Desktop.
pyramids.py
import csv
import pymel.core as pm
import math
import random
import re
import maya.mel
pm.setAttr('perspShape.farClipPlane', 10000000)
file = '/Users/widenale/Desktop/MayaProject/NewYorkSorted.csv'
class AwNewYorkCSV():
def __init__(self):
self.rowInfo = []
def _distributeObjects(self, objects, tS):
pm.select(tS, r=True)
Nface = pm.polyEvaluate(f=True)
print objects
for x in range(0, len(objects), 1):
target = tS[0]
face = target + '.f[' + str(x) + ']'
pm.select(face, r=True)
verts = []
vertStuff = pm.polyInfo(fv=True)
verts = re.findall(r"[\w']+", vertStuff[0])
del verts[:2]
avgvrtloc = []
vPos1 = pm.pointPosition(target + '.vtx[' + verts[0] + ']')
vPos2 = pm.pointPosition(target + '.vtx[' + verts[1] + ']')
vPos3 = pm.pointPosition(target + '.vtx[' + verts[2] + ']')
vPos4 = pm.pointPosition(target + '.vtx[' + verts[3] + ']')
avgX = (vPos1[0] + vPos2[0] + vPos3[0])/4
avgY = (vPos1[1] + vPos2[1] + vPos3[1])/4
avgZ = (vPos1[2] + vPos2[2] + vPos3[2])/4
avgvrtloc.append(avgX)
avgvrtloc.append(avgY)
avgvrtloc.append(avgZ)
obj = objects[x]
obj.translateX.set(avgX)
obj.translateY.set(avgY)
obj.translateZ.set(avgZ)
grp = pm.group(objects)
def main(self):
with open(file, 'rU') as csvfile:
remover = csv.reader(csvfile, delimiter=',', quotechar='|')
for row in remover:
self.rowInfo.append(row)
print ', '.join(row)
priceTotal = 0
numItems = 0
objects = []
for each in self.rowInfo:
numSold = each[0]
price = each[1].replace('$', '')
priceFloat = float(price)
name = 'pyr_' + str(numSold)
color = self._hex_to_rgb(each[2])
pyr= pm.polyPyramid(w=priceFloat, ns=4, ax=(0, 1, 0), sc=0, cuv=3, ch=1)
loc = pm.spaceLocator()
objects.append(loc)
pm.select(pyr[0] + '.vtx[4]')
pm.move(0, numSold, 0, r=True, os=True, wd=True)
pm.select(pyr[0] + '.vtx[0:3]')
pPos1 = pm.pointPosition(pyr[0] + '.vtx[0]')
pPos2 = pm.pointPosition(pyr[0] + '.vtx[1]')
pPos3 = pm.pointPosition(pyr[0] + '.vtx[2]')
pPos4 = pm.pointPosition(pyr[0] + '.vtx[3]')
posAvg = (pPos1 + pPos2 + pPos3 + pPos4)/4
pm.xform(pyr, piv=posAvg)
pm.select(cl=1)
pc = pm.pointConstraint(loc, pyr, mo=0)
priceTotal += priceFloat
numItems += 1
shader = pm.shadingNode('mia_material_x', asShader=True, name='mat_' + numSold)
gc = pm.shadingNode('gammaCorrect', asUtility=True)
f=255.0
gc.value.set([(color[0]/f), (color[1]/f), (color[2]/f)])
gc.gammaX.set(0.45454)
gc.gammaY.set(0.45454)
gc.gammaZ.set(0.45454)
gc.outValue >> shader.diffuse
myShader = pm.sets(renderable=True, noSurfaceShader=True, empty=True, name=name + 'shaderMat_' + numSold)
shader.message >> myShader.miPhotonShader
shader.message >> myShader.miShadowShader
shader.message >> myShader.miMaterialShader
maya.mel.eval('applyPresetToNode "%s" "" "" "/Applications/Autodesk/mentalrayForMaya2014/presets/attrPresets/mia_material_x/MatteFinish.mel" 1;' % shader)
#shader.outColor >> myShader.surfaceShader
pm.sets(myShader, edit=True, forceElement=pyr)
extraArea = ((20*20)*numItems)
totalarea = extraArea + priceTotal
sqrt = math.sqrt(totalarea)
# even or odd
# If odd, increase by 1
if not numItems % 2 == 0:
numItems += 1
numSq = (math.sqrt(numItems)) + 1
pm.polyPlane(n='target', w=totalarea, h=totalarea, sx=numSq, sy=numSq, ax=(0, 1, 0), cuv=2, ch=1)
pm.select('target', r=True)
targetSurface = pm.ls(sl=1)
self._distributeObjects(objects, targetSurface)
def _hex_to_rgb(self, v):
v = v.lstrip('#')
l = len(v)
return tuple(int(v[i:i+l/3], 16) for i in range(0, l, l/3))
if __name__ == '__main__':
AwNewYorkCSV().main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment