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