Meshop Edge Methods

The following methods exposed by the meshOp Struct provide advanced access to the mesh edges.

Methods:

Chamfer, Extrude, Collapse Edges

 meshop.chamferEdges <Mesh mesh> <edgelist> <float amount> 

Chamfers the specified edges by the specified amount.

EXAMPLE

   obj = Box()
   convertToMesh obj
   meshop.chamferEdges obj #{7,8,11,14,17} 5
   update obj

meshop.extrudeEdges<Mesh mesh> <edgelist> <float height> dir:<{<point3 dir> | #independent | #common}=#independent> node:<node=unsupplied>      

Creates new edges corresponding to the specified edges, and then moves the new edges by <height>.

The direction the edges are moved is determined by <dir>. If <dir> is a point3 value, the edges will be moved in that direction. (If <mesh> is a node, or if <mesh> is an Editable Mesh or a Mesh value and node: is specified, the direction is in the current coordinate system context. If <mesh> is an Editable Mesh or a Mesh value and node: is not specified, the direction is in the mesh's local coordinate system.)

If dir:#independent is specified, the edges are moved based on the normals of the faces using the edge. If dir:#common is specified, the edges are moved based on the normals of the face clusters using the edge.

EXAMPLE

   obj = Box() --create a Box
   convertToMesh obj --collapse to EMesh
   meshop.extrudeEdges obj #{5,7,14,17} 10.0 --extrude edges
   update obj --update the mesh
   addmodifier obj (normalmodifier unify:true) --unify normals
   addmodifier obj (smooth auto:true) --auto-smooth
   convertToMesh obj --collapse to EMesh

meshop.collapseEdges <Mesh mesh> <edgelist> 

Collapses the specified edges.

EXAMPLE

   obj = Box()
   convertToMesh obj
   meshop.collapseEdges obj #{14,17}
   update obj

Clone and Delete Edges

meshop.cloneEdges <Mesh mesh> <edgelist> 

Clones the specified edges.

meshop.deleteEdges <Mesh mesh> <edgelist> delIsoVerts:<boolean=true> 

Deletes the specified edges.

If delIsoVerts: is true , any isolated vertices are deleted.

Divide Edges

meshop.divideEdge <Mesh mesh> <int edgeIndex> <float edgef> visDiag1:<boolean=false> visDiag2:<boolean=false> fixNeighbors:<boolean=true> split:<boolean=false> 

Divides the specified edge at a fractional distance of <edgef> along its length.

visDiag1: and visDiag2: specify whether each of the two new edges will be visible.

If fixNeighbors: is true , the face on the other side of this edge, that is, the "reverse face", should be divided as well to prevent the introduction of a seam.

If split: is true , separate vertices for the two halves of the edge will be created, splitting the mesh open along the diagonal(s).

EXAMPLE

   obj = Box() --create a Box
   convertToMesh obj --collapse to EMesh
   meshop.divideEdge obj 5 0.33 --divide bottom edge at 1/3
   meshop.divideEdge obj 5 0.5 --divide remaining 2/3 at half -> 2 * 1/3
   update obj --update the mesh
   obj.vertexTicks = True --show the vertices
   obj.allEdges=True --show all edges

meshop.divideEdges <Mesh mesh> <edgelist> 

Divides all the specified edges in half, creating new points and subdividing faces.

EXAMPLE

   obj = Box() --create a Box
   convertToMesh obj --collapse to EMesh
   meshop.divideEdges obj #{5,7,14,17} --divide edges
   update obj --update the mesh
   obj.vertexTicks = True --show the vertices
   obj.allEdges=True --show all edges

meshop.edgeTessellate <Mesh mesh> <facelist> <float tension> 

Tessellates the specified edges. This algorithm is exactly the one used in the Tessellate modifier, when operating on Faces and Edge SO elements.

<tension> specifies the tension for the edge tessellation. This value should be fairly small, between 0 and .5, and corresponds to the value in the Tessellate, Edit Mesh, or Editable Mesh UI's divided by 400.

EXAMPLE

   obj = Box() --create a Box
   convertToMesh obj --collapse to EMesh
   meshop.EdgeTessellate obj #{5,6} 0.0 --tessellate faces based on edges
   update obj --update the mesh

meshop.turnEdge <Mesh mesh> <int edgeIndex> 

Turns the specified edge. Only works on edges that have a face on both sides. These two faces are considered as a quad, where this edge is the diagonal, and remapped so that the diagonal flows the other way, between the vertices that were opposite this edge on each face.

Get A Using B...

meshop.getVertsUsingEdge <Mesh mesh> <edgelist> 

Returns a bitarray of size=(#vertices in mesh) with bits set for all vertices that are used by the specified edges.

SCRIPT

   macroScript Edge2VertSel category:"MXS Help"
   (
   --make sure a single EMesh object is selected
   on isEnabled return
   selection.count == 1 and classof selection[1] == Editable_Mesh
   on execute do
   (
   obj = selection[1]--get selected object
   edgeSel = getEdgeSelection obj --get selected Edges
   --get Verts of selected Edges:
   vertsSel = meshop.getVertsUsingEdge obj edgeSel
   setVertSelection obj vertsSel --select the Verts
   max modify mode --switch to Modify panel
   subObjectLevel =1--set Vertex SO level
   ) --end on
   ) --end macro

meshop.getFacesUsingEdge <Mesh mesh> <edgelist> 

Returns a bitarray of size=(#faces in mesh) with bits set for all faces that use the specified edges.

SCRIPT

   macroScript Edge2FaceSel category:"MXS Help"
   (
   --make sure a single EMesh object is selected
   on isEnabled return
   selection.count == 1 and classof selection[1] == Editable_Mesh
   on execute do
   (
   obj = selection[1] --get selected object
   edgeSel = getEdgeSelection obj --get selected Edges
   --get Faces of selected Edges:
   faceSel = meshop.getFacesUsingEdge obj edgeSel
   setFaceSelection obj faceSel --select the Faces
   maxmodify mode --switch to Modify panel
   subObjectLevel =3 --set Face SO level
   ) --end on
   ) --end macro

meshop.getPolysUsingEdge <Mesh mesh> <edgelist> ignoreVisEdges:<boolean=false> threshhold:<float=45.> 

Returns a bitarray of size equal to the number of faces in mesh with bits set for all faces that are in 'polygons' containing the specified edges.

The definition of a polygon is all faces sharing invisible edges with edge angles below the threshhold angle. The default threshhold angle is 45 degrees.

If ignoreVisEdges: is set to true , the edge visibility is ignored but the threshhold is still relevant.

SCRIPT

   macroScript Edge2PolySel category:"MXS Help"
   (
   --make sure a single EMesh object is selected
   on isEnabled return
   selection.count == 1 and classof selection[1] == Editable_Mesh
   on execute do
   (
   obj = selection[1] --get selected object
   edgeSel = getEdgeSelection obj --get selected Edges
   --get Polygons of selected Edges:
   faceSel = meshop.getPolysUsingEdge obj edgeSel
   setFaceSelection obj faceSel --select the Faces
   max modify mode --switch to Modify panel
   subObjectLevel =4 --set Polygon SO level
   ) --end on
   ) --end macro

meshop.getEdgesUsingVert <Mesh mesh> <vertlist> 

Returns a bitarray of size=(#edges in mesh) with bits set for all edges that use the specified vertices.

SCRIPT

   macroScript Vert2EdgeSel category:"MXS Help"
   (
   --make sure a single EMesh object is selected
   on isEnabled return
   selection.count == 1 and classof selection[1] == Editable_Mesh
   on execute do
   (
   obj = selection[1] --get selected object
   vertsSel = getVertSelection obj --get selected Verts
   --get Edges of selected Verts:
   edgeSel = meshop.getEdgesUsingVert obj vertsSel
   setEdgeSelection obj edgeSel --select the edges
   max modify mode --switch to Modify panel
   subObjectLevel =2 --set Edge SO level
   )
   ) --end macro

meshop.getEdgesReverseEdge <Mesh mesh> <edgelist> 

Returns a bitarray of size=(#edges in mesh) with bits set for all additional edges that use the same vertices as the specified edges. These are edges on the adjacent faces.

EXAMPLE

   Plane length:100 width:100 isSelected:on
   convertTo $ TriMeshGeometry
   max modify mode
   subobjectLevel = 1
   select $.verts[13]
   --get edges that use vertex 13
   edges = meshop.getEdgesUsingVert $ (getVertSelection $)
   --select the vertices used by those edges
   $.selectedVerts = meshop.getVertsUsingEdge $ edges
   update $
   --not what we wanted, really want all vertices
   -- "surrounding" vertex 13
   faces = meshop.getPolysUsingVert $ 13
   $.selectedVerts = meshop.getVertsUsingFace $ faces
   update $
   --or ...
   faces = meshop.getFacesUsingVert $ #(13)
   edges = meshop.getEdgesUsingFace $ faces
   --turn off all visible edges
   for e in edges do edges[e]=not (getEdgeVis $ (1+(e-1)/3)(1+mod (e-1) 3))
   --get the edges on the adjacent faces that are the "reverse" of these edges
   --"OR" that bitarray with the initial edges bitarray
   edges = (meshop.getEdgesReverseEdge $ edges) + edges
   --get the faces that use the edges, and "OR" that bitarray with the initial
   --face bitarray
   faces = (meshop.getFacesUsingEdge $ edges) + faces
   $.selectedVerts = meshop.getVertsUsingFace $ faces
   update $
meshop.getOpenEdges <Mesh mesh> 

Returns a bitarray of size=(#edges in mesh ) with bits set for all edges that are used by a single face.

SCRIPT

   macroScript SelOpenEdges category:"MXS Help"
   (
   --make sure a single EMesh object is selected
   on isEnabled return
   selection.count == 1 and classof selection[1] == Editable_Mesh
   on execute do
   (
   obj = selection[1] --get selected object
   max modify mode --switch to Modify panel
   subObjectLevel =2 --set Edge SO level
   openEdges = meshop.getOpenEdges obj --get open edges
   setEdgeSelection obj openEdges --select the open edges
   )
   ) --end macro

AutoEdge Visibility

meshop.autoEdge <Mesh mesh> <edgelist> <float threshold> type:<{#SetClear| #Set| #Clear}=#SetClear> 

Sets/clears the edge visibility for the specified edges based on the threshold angle.

Note:

For an edge to be autoEdged, both it and the "reverse" edge on the face sharing the same vertices must be specified in the edge specification.

For more mesh-related methods, see

Editable_Mesh : GeometryClass and TriMesh : Value