def maximize_perspective(): '''Setup perspective for the render''' rt.viewport.setLayout(rt.Name('layout_1')) rt.viewport.setType(rt.Name('view_persp_user')) rt.viewport.setTM( rt.matrix3(rt.point3(0.707107, 0.353553, -0.612372), rt.point3(-0.707107, 0.353553, -0.612372), rt.point3(0, 0.866025, 0.5), rt.point3(-0.00967026, -70.3466, -552.481)))
def layout_objects(title, cases, y_position, x_offset_text=-45): """Layout a list of nodes in a line""" create_text(rt.Point3(x_offset_text, y_position, 0), title) x_position = 0.0 for gen in cases: gen.Position = rt.point3(x_position, y_position, 0) x_position += X_STEP if (x_position % 260.0) < 0.001: x_position = 0.0 y_position += Y_STEP return y_position
def make_pyramid_mesh(side=20.0): '''Construct a pyramid from vertices and faces.''' halfside = side / 2.0 return rt.mesh(vertices=[ rt.point3(0.0, 0.0, side), rt.point3(-halfside, -halfside, 0.0), rt.point3(-halfside, halfside, 0.0), rt.point3(halfside, 0.0, 0.0) ], faces=[ rt.point3(1, 2, 3), rt.point3(1, 3, 4), rt.point3(1, 4, 2), rt.point3(2, 3, 4), ])
def pickPoints(self): self.geo = self.geometry() self.hide() try: mxs.unregisterRedrawViewsCallback(self.debugView) except: pass try: self.pos1 = mxs.pickPoint( snap=mxs.readvalue(mxs.StringStream('#3D'))) self.pos2 = mxs.pickPoint( snap=mxs.readvalue(mxs.StringStream('#3D'))) self.moveVector = self.pos2 - self.pos1 vector = self.moveVector X = mxs.normalize(vector) Z = mxs.point3(0, 0, 1) Y = mxs.normalize(mxs.cross(Z, X)) Z = mxs.normalize(mxs.cross(X, Y)) self.transform = mxs.matrix3(Z, Y, X, mxs.point3(0, 0, 0)) mxs.WorkingPivot.SetTM(self.transform) mxs.execute("max tti") mxs.registerRedrawViewsCallback(self.debugView) mxs.execute("max move") mxs.execute("toolMode.coordsys #working_pivot") self.show() self.setGeometry(self.geo) except: print("Point Picking Cancelled")
def volume_based_transform(obj): """ creates a transform matrix by running a SVD operation on the verts that make up the mesh :param type obj: a max node... :returns: a transform matrix :rtype: mxs.matrix3 """ mesh = mxs.snapshotAsMesh(obj) # let's work in world space :D print('collecting verts') verts = [[mesh.verts[i].pos.x, mesh.verts[i].pos.y, mesh.verts[i].pos.z] for i in range(mesh.verts.count)] print('making convexhull') hull = ConvexHull(verts) center = hull.points.mean(axis=0) print('centering points ch points') hull_verts = [hull.points[vert] - center for vert in hull.vertices] print('working out svd') pcloud = matrix(hull_verts) _, _, vh = svd(pcloud) print('building matrix') xaxis, yaxis, zaxis = vh.tolist() xaxis = mxs.point3(*map(float, xaxis)) yaxis = mxs.point3(*map(float, yaxis)) zaxis = mxs.point3(*map(float, zaxis)) transform = mxs.matrix3(mxs.normalize(xaxis), mxs.normalize(yaxis), mxs.normalize(zaxis), mxs.point3(*map(float, center))) return transform
mySelection = rt.selection for each in mySelection: print each.name #get first selected firstItem = rt.selection[0] print firstItem.name #create simple object rt.sphere(radius=50, position=rt.point3(25, 25, 25), segments=8) #select all objects rt.select(rt.objects) # with MaxPlus MaxPlus.Core.GetRootNode().Children #clear selection rt.clearselection() rt.select(firstItem)
def execute(): # Define the target object my_target = mxs.selection[0] # Reset the pivot my_target.pivot = my_target.center # Define the grid object my_grid = mxs.grid() # Define the vector vector = my_target.transform.position - mxs.inverse( mxs.viewport.getTM()).position # Define the length of the target distance = (mxs.length(my_target.min - my_target.max) / 2) # Normalize + UP vector (Z) X = mxs.normalize(vector) Z = mxs.point3(0, 0, 1) Y = mxs.normalize(mxs.cross(Z, X)) Z = mxs.normalize(mxs.cross(X, Y)) # Define a new transform based on vector my_transform = mxs.matrix3(Z, Y, X, my_target.transform.position) # Edit the position of the transform new_position = my_transform.position - (X * distance) my_transform = mxs.matrix3(Z, Y, X, new_position) # Assign the transform to the grid my_grid.transform = my_transform # Activate the grid mxs.activegrid = my_grid # Define spline method def setMode(name): name.curveType = 1 try: # Set iso view mxs.execute("max vpt iso user") # Define user draw curves curves = mxs.startObjectCreation(mxs.FreehandSpline, returnNewNodes=True, newNodeCallback=setMode) # Define modifiers noise_mod = mxs.Noisemodifier() quad_mod = mxs.Quadify_Mesh() extrude_mod = mxs.Extrude() # Change the parameters extrude_mod.amount = distance * 2 quad_mod.quadsize = 2 noise_mod.scale = 10 noise_mod.fractal = True noise_mod.strength = mxs.point3(2, 10, 2) # Add the modifiers mxs.addmodifier(curves, extrude_mod) mxs.addmodifier(curves, quad_mod) mxs.addmodifier(curves, noise_mod) # Define cutter splines mxs.ProCutter.CreateCutter(curves, 1, True, True, False, True, True) # Define stock object mxs.ProCutter.AddStocks(curves[0], my_target, 1, 1) # Set perspective view mxs.execute("max vpt persp user") # Deactivate and delete the grid mxs.activegrid = None mxs.delete(my_grid) except: # Set perspective view mxs.execute("max vpt persp user") # Deactivate and delete the grid mxs.activegrid = None mxs.delete(my_grid) print("cancled")
def recreate(self): defaultSize = 2 bones = mxs.Array() if len(self.result) > 0: self.newNodes = [] self.dict = {} temp = mxs.Array() lastNode = None index = 0 rootNode = mxs.BoneSys.createBone(mxs.point3(0, 0, 0), mxs.point3(0, 1, 0), mxs.point3(0, 1, 0)) rootNode.transform = mxs.Matrix3(1) rootNode.size = 2 rootNode.name = "rootBone" mxs.join(temp, rootNode) def new_create_constraints(node, nNode): posList = mxs.position_list() # Create Pos_List const = mxs.Position_Constraint() # Create Pos_Constraint const.appendTarget(nNode, 100) # Add target to Constraint secsub = mxs.setPropertyController(node.controller, "Position", posList) # Add PosList to node mxs.setPropertyController(secsub, 'Available', const) posList = mxs.rotation_list() # Create Pos_List const = mxs.Orientation_Constraint() # Create Pos_Constraint const.appendTarget(nNode, 100) # Add target to Constraint secsub = mxs.setPropertyController(node.controller, "Rotation", posList) # Add PosList to node mxs.setPropertyController(secsub, 'Available', const) def create_constraints(nNode, node): # Position posList = mxs.position_list() # Create Pos_List const = mxs.Position_Constraint() # Create Pos_Constraint const.appendTarget(nNode, 100) # Add target to Constraint secsub = mxs.setPropertyController(node.controller, "Position", posList) # Add PosList to node mxs.setPropertyController(secsub, 'Available', const) # Rotation posList = mxs.rotation_list() # Create Pos_List const = mxs.Orientation_Constraint() # Create Pos_Constraint const.appendTarget(nNode, 100) # Add target to Constraint secsub = mxs.setPropertyController(node.controller, "Rotation", posList) # Add PosList to node mxs.setPropertyController(secsub, 'Available', const) for obj in self.result: endPos = mxs.point3(0, 0, 0) if obj.children.count > 0: endPos = obj.children[0].transform.pos else: endPos = (mxs.transmatrix(mxs.point3(defaultSize, 0, 0)) * obj.transform).pos zPos = (mxs.transmatrix(mxs.point3(0, 0, 1)) * obj.transform).pos d = mxs.BoneSys.createBone(obj.transform.pos, endPos, zPos) d.transform = obj.transform d.name = obj.name d.wirecolor = obj.wirecolor mxs.join(bones, d) self.dict[obj] = d self.newNodes.append(obj) # Create parent connections if mxs.isValidNode(obj.parent): d.parent = self.dict[obj.parent] else: d.parent = rootNode create_constraints(obj, d) mxs.select(bones) mxs.selectmore(rootNode) mxs.redrawViews()