def writeObj(self, file_name, progress = False, show_msg = True, scale = core.scene_scale()): all_parts = self.parts() part_num = len(all_parts) if progress: window = mc.window(t = 'Writing %s to obj' % self.set_name) mc.columnLayout() progressControl = mc.progressBar(maxValue = part_num, width = 300) mc.showWindow(window) f = open(file_name, 'w') vo = 1 vto = 1 vno = 1 for i in range(len(all_parts)): part = all_parts[i] # part.toObjStream(f, group = part.name(reformat = True), v_offset = vo, vt_offset = vto, vn_offset = vno, show_msg = not progress) part.toObjStream(f, group = part.partName(), v_offset = vo, vt_offset = vto, vn_offset = vno, show_msg = not progress, scale = scale) vo += part.numPoints() vto += part.numUVs() vno += part.numNormals() if progress: mc.progressBar(progressControl, edit=True, step=1) f.close() if progress: mc.deleteUI(window) if show_msg: print "Write %s to obj done." % self.set_name return True
def allpoints(self, scale = core.scene_scale()): points = [] for part in self.parts(): mps = part.points() for i in range(mps.length()): point = mps[i] points.append([point[0] * scale, point[1] * scale, point[2] * scale]) return points
def addFrame(self, frame = None, scale = core.scene_scale()): ''' Houdini chanal list: tx ty tz rx ry rz focallength Nuke chanal list: frame tx ty tz rx ry rz fov ''' t = self.getTranslate(scale = scale) r = self.getRotation() fl = self.getFocalLength() self.frames.append(t + r + [fl]) # add nuke frame if gien the frame parm if frame: vf = self.getVfov() self.nuke_frames.append([frame] + t + r + [vf]) return True
def writeObjs(self, folder, progress = False, show_msg = True, scale = core.scene_scale()): all_parts = self.parts() part_num = len(all_parts) if progress: window = mc.window(t = 'Writing %s to obj' % self.set_name) mc.columnLayout() progressControl = mc.progressBar(maxValue = part_num, width = 300) mc.showWindow(window) for i in range(part_num): part = all_parts[i] part_obj_name = os.path.join(folder, '%s.obj' % part.partName()) part.writeObj(part_obj_name, scale = scale) if progress: mc.progressBar(progressControl, edit=True, step=1) if progress: mc.deleteUI(window) if show_msg: print "Write %s to obj done." % self.set_name return True
def getTranslate(self, worldspace = True, scale = core.scene_scale()): t = mc.xform(self.name, q = True, t = True, ws = worldspace) return [t[0] * scale, t[1] * scale, t[2] * scale]
def writeObj(self, file_name, scale = core.scene_scale()): f = open(file_name, 'w') self.toObjStream(f, group = self.name(reformat = True), scale = scale) f.close()
def toObjStream(self, file_handle, group = None, v_offset = 1, vt_offset = 1, vn_offset = 1, show_msg = False, scale = core.scene_scale()): # write points 'v tx ty tz' hasUV = True points = self.points() for i in range(self.numPoints()): point = points[i] file_handle.write("v %f %f %f\n" % (point[0] * scale, point[1] * scale, point[2] * scale)) # write uvs 'vt u v' u_list = mo.MFloatArray() v_list = mo.MFloatArray() self.fnMesh.getUVs(u_list, v_list) if u_list.length(): for i in range(u_list.length()): file_handle.write("vt %f %f\n" % (u_list[i], v_list[i])) else: hasUV = False for i in range(self.numPoints()): file_handle.write("vt %f %f\n" % (0, 0)) # write normals 'vn nx ny nz' normals = mo.MFloatVectorArray() self.fnMesh.getNormals(normals) for i in range(normals.length()): normal = normals[i] file_handle.write("vn %f %f %f\n" % (normal[0], normal[1], normal[2])) # write group 'g group_name' if group: file_handle.write("g %s\n" % group) # write faces 'f P1/uv1/N1 P2/uv2/N2 P3/uv3/N3' for fnum in range(self.numFaces()): verts = mo.MIntArray() self.fnMesh.getPolygonVertices(fnum, verts) nid = mo.MIntArray() self.fnMesh.getFaceNormalIds(fnum, nid) file_handle.write("f") for vnum in range(verts.length()): if hasUV: try: uv_util = mo.MScriptUtil(0) uv_ptr = uv_util.asIntPtr() self.fnMesh.getPolygonUVid(fnum, vnum, uv_ptr) uvid = uv_util.getInt(uv_ptr) except: print '%s uv is wrong' % self.fullname uvid = 0 file_handle.write(" %d/%d/%d" % (verts[vnum] + v_offset, uvid + vt_offset, nid[vnum] + vn_offset)) else: file_handle.write(" %d/%d/%d" % (verts[vnum] + v_offset, verts[vnum] + vt_offset, nid[vnum] + vn_offset)) file_handle.write("\n") if show_msg: print "Write %s done" % self.name() return True
def channels(self, frame = None, scale = core.scene_scale()): '''chanal list: tx ty tz rx ry rz px py pz''' t = self.getTranslate(scale = scale) r = self.getRotation() s = self.getScale() return t + r + s