933 lines
36 KiB
Python
933 lines
36 KiB
Python
# Blender.Mesh module and the Mesh PyType object
|
|
|
|
"""
|
|
The Blender.Mesh submodule.
|
|
|
|
B{New}:
|
|
|
|
Mesh Data
|
|
=========
|
|
|
|
This module provides access to B{Mesh Data} objects in Blender. It differs
|
|
from the NMesh module by allowing direct access to the actual Blender data,
|
|
so that changes are done immediately without need to update or put the data
|
|
back into the original mesh. The result is faster operations with less memory
|
|
usage. The example below creates a simple pyramid, and sets some of the
|
|
face's attributes (the vertex color):
|
|
|
|
Example::
|
|
|
|
from Blender import *
|
|
|
|
editmode = Window.EditMode() # are we in edit mode? If so ...
|
|
if editmode: Window.EditMode(0) # leave edit mode before getting the mesh
|
|
|
|
# define vertices and faces for a pyramid
|
|
coords=[ [-1,-1,-1], [1,-1,-1], [1,1,-1], [-1,1,-1], [0,0,1] ]
|
|
faces= [ [3,2,1,0], [0,1,4], [1,2,4], [2,3,4], [3,0,4] ]
|
|
|
|
me = Mesh.New('myMesh') # create a new mesh
|
|
|
|
me.verts.extend(coords) # add vertices to mesh
|
|
me.faces.extend(faces) # add faces to the mesh (also adds edges)
|
|
|
|
me.vertexColors = 1 # enable vertex colors
|
|
me.faces[1].col[0].r = 255 # make each vertex a different color
|
|
me.faces[1].col[1].g = 255
|
|
me.faces[1].col[2].b = 255
|
|
|
|
ob = Object.New('Mesh','myObj') # link mesh to an object
|
|
ob.link(me)
|
|
|
|
sc = Scene.GetCurrent() # link object to current scene
|
|
sc.link(ob)
|
|
|
|
if editmode: Window.EditMode(1) # optional, just being nice
|
|
|
|
Vertices, edges and faces are added to a mesh using the .extend() methods.
|
|
For best speed and efficiency, gather all vertices, edges or faces into a
|
|
list and call .extend() once as in the above example. Similarly, deleting
|
|
from the mesh is done with the .delete() methods and are most efficient when
|
|
done once.
|
|
|
|
@type Modes: readonly dictionary
|
|
@type FaceFlags: readonly dictionary
|
|
@type FaceModes: readonly dictionary
|
|
@type FaceTranspModes: readonly dictionary
|
|
@var Modes: The available mesh modes.
|
|
- NOVNORMALSFLIP - no flipping of vertex normals during render.
|
|
- TWOSIDED - double sided mesh.
|
|
- AUTOSMOOTH - turn auto smoothing of faces "on".
|
|
- SUBSURF - turn Catmull-Clark subdivision of surfaces "on".
|
|
- OPTIMAL - optimal drawing of edges when "SubSurf" is "on".
|
|
@var FaceFlags: The available *texture face* (uv face select mode) selection
|
|
flags. Note: these refer to TexFace faces, available if nmesh.hasFaceUV()
|
|
returns true.
|
|
- SELECT - selected.
|
|
- HIDE - hidden.
|
|
- ACTIVE - the active face.
|
|
@var FaceModes: The available *texture face* modes. Note: these are only
|
|
meaningful if nmesh.hasFaceUV() returns true, since in Blender this info is
|
|
stored at the TexFace (TexFace button in Edit Mesh buttons) structure.
|
|
- ALL - set all modes at once.
|
|
- BILLBOARD - always orient after camera.
|
|
- HALO - halo face, always point to camera.
|
|
- DYNAMIC - respond to collisions.
|
|
- INVISIBLE - invisible face.
|
|
- LIGHT - dynamic lighting.
|
|
- OBCOL - use object color instead of vertex colors.
|
|
- SHADOW - shadow type.
|
|
- SHAREDVERT - apparently unused in Blender.
|
|
- SHAREDCOL - shared vertex colors (per vertex).
|
|
- TEX - has texture image.
|
|
- TILES - uses tiled image.
|
|
- TWOSIDE - two-sided face.
|
|
@var FaceTranspModes: The available face transparency modes. Note: these are
|
|
enumerated values (enums), they can't be combined (and'ed, or'ed, etc) like a bit vector.
|
|
- SOLID - draw solid.
|
|
- ADD - add to background (halo).
|
|
- ALPHA - draw with transparency.
|
|
- SUB - subtract from background.
|
|
@var EdgeFlags: The available edge flags.
|
|
- SELECT - selected (B{deprecated}). Use edge.sel attribute instead.
|
|
- EDGEDRAW - edge is drawn out of edition mode.
|
|
# - EDGERENDER - edge is drawn out of edition mode.
|
|
- SEAM - edge is a seam for UV unwrapping
|
|
- FGON - edge is part of a F-Gon.
|
|
@type AssignModes: readonly dictionary.
|
|
@var AssignModes: The available vertex group assignment modes, used by
|
|
L{mesh.assignVertsToGroup()<Mesh.Mesh.assignVertsToGroup>}.
|
|
- ADD: if the vertex in the list is not assigned to the group
|
|
already, this creates a new association between this vertex and the
|
|
group with the weight specified, otherwise the weight given is added to
|
|
the current weight of an existing association between the vertex and
|
|
group.
|
|
- SUBTRACT: will attempt to subtract the weight passed from a vertex
|
|
already associated with a group, else it does nothing.\n
|
|
- REPLACE: attempts to replace a weight with the new weight value
|
|
for an already associated vertex/group, else it does nothing.
|
|
@type SelectModes: readonly dictionary.
|
|
@var SelectModes: The available edit select modes.
|
|
- VERTEX: vertex select mode.
|
|
- EDGE: edge select mode.
|
|
- FACE: face select mode.
|
|
"""
|
|
|
|
AssignModes = {'REPLACE':1}
|
|
|
|
def Get(name=None):
|
|
"""
|
|
Get the mesh data object called I{name} from Blender.
|
|
@type name: string
|
|
@param name: The name of the mesh data object.
|
|
@rtype: Mesh
|
|
@return: If a name is given, it returns either the requested mesh or None.
|
|
If no parameter is given, it returns all the meshs in the current scene.
|
|
"""
|
|
|
|
def New(name='Mesh'):
|
|
"""
|
|
Create a new mesh data object called I{name}.
|
|
@type name: string
|
|
@param name: The name of the mesh data object.
|
|
@rtype: Mesh
|
|
@return: a new Blender mesh.
|
|
"""
|
|
|
|
def Mode(mode=0):
|
|
"""
|
|
Get and/or set the selection modes for mesh editing. These are the modes
|
|
visible in the 3D window when a mesh is in Edit Mode.
|
|
@type mode: int
|
|
@param mode: The desired selection mode. See L{SelectModes} for values.
|
|
Modes can be combined. If omitted, the selection mode is not changed.
|
|
@rtype: int
|
|
@return: the current selection mode.
|
|
@note: The selection mode is an attribute of the current scene. If the
|
|
scene is changed, the selection mode may not be the same.
|
|
"""
|
|
|
|
class MCol:
|
|
"""
|
|
The MCol object
|
|
===============
|
|
This object is four ints representing an RGBA color.
|
|
@ivar r: The Red component in [0, 255].
|
|
@type r: int
|
|
@ivar g: The Green component in [0, 255].
|
|
@type g: int
|
|
@ivar b: The Blue component in [0, 255].
|
|
@type b: int
|
|
@ivar a: The Alpha (transparency) component in [0, 255].
|
|
@type a: int
|
|
"""
|
|
|
|
class MVert:
|
|
"""
|
|
The MVert object
|
|
================
|
|
This object holds mesh vertex data.
|
|
@ivar co: The vertex coordinates (x, y, z).
|
|
@type co: vector (WRAPPED DATA)
|
|
@ivar no: The vertex's unit normal vector (x, y, z). Read-only. B{Note}:
|
|
if vertex coordinates are changed, it may be necessary to use
|
|
L{Mesh.calcNormals()} to update the vertex normals.
|
|
@type no: vector
|
|
@ivar uvco: (MVerts only). The vertex texture "sticky" coordinates (x, y),
|
|
if present.
|
|
Use L{Mesh.vertexUV} to test for presence before trying to access;
|
|
otherwise an exception will may be thrown.
|
|
(Sticky coordinates can be set when the object is in the Edit mode;
|
|
from the Editing Panel (F9), look under the "Mesh" properties for the
|
|
"Sticky" button).
|
|
@type uvco: vector (WRAPPED DATA)
|
|
@ivar index: (MVerts only). The vertex's index within the mesh. Read-only.
|
|
@type index: int
|
|
@ivar sel: The vertex's selection state (selected=1).
|
|
B{Note}: a Mesh will return the selection state of the mesh when EditMode
|
|
was last exited. A Python script operating in EditMode must exit EditMode
|
|
before getting the current selection state of the mesh.
|
|
@type sel: int
|
|
@warn: There are two kinds of UV texture coordinates in Blender: per vertex
|
|
("sticky") and per face vertex (UV in L{MFace}). In the first, there's
|
|
only one UV pair of coordinates for each vertex in the mesh. In the
|
|
second, for each face it belongs to, a vertex can have different UV
|
|
coordinates. This makes the per face option more flexible, since two
|
|
adjacent faces won't have to be mapped to a continuous region in an image:
|
|
each face can be independently mapped to any part of its texture.
|
|
"""
|
|
|
|
def __init__(coord):
|
|
"""
|
|
Create a new PVert object.
|
|
|
|
@note: PVert-type objects are designed to be used for creating and
|
|
modifying a mesh's vertex list, but since they do not "wrap" any Blender
|
|
data there are some differences. The B{index} and B{uvco} attributes
|
|
are not defined for PVerts, and the B{no} attribute contains valid
|
|
data only if the PVert was created from an MVert (using a slice
|
|
operation on the mesh's vertex list.) PVerts also cannot be used as an
|
|
argument to any method which expects data wrapping a Blender mesh, such
|
|
as L{MVertSeq.delete()}.
|
|
|
|
Example::
|
|
v = Blender.Mesh.MVert(1,0,0)
|
|
v = Blender.Mesh.MVert(Blender.Mathutils.Vector([1,0,0]))
|
|
|
|
m = Blender.Mesh.Get('Mesh')
|
|
vlist = m.verts[:] # slice operation also returns PVerts
|
|
|
|
@type coord: three floats or a Vector object
|
|
@param coord: the coordinate values for the new vertex
|
|
@rtype: PVert
|
|
@return: a new PVert object
|
|
|
|
"""
|
|
|
|
class MVertSeq:
|
|
"""
|
|
The MVertSeq object
|
|
===================
|
|
This object provides sequence and iterator access to the mesh's vertices.
|
|
Access and assignment of single items and slices are also supported.
|
|
When a single item in the vertex list is accessed, the operator[] returns
|
|
a MVert object which "wraps" the actual vertex in the mesh; changing any
|
|
of the vertex's attributes will immediately change the data in the mesh.
|
|
When a slice of the vertex list is accessed, however, the operator[]
|
|
returns a list of PVert objects which are copies of the mesh's vertex
|
|
data. Changes to these objects have no effect on the mesh; they must be
|
|
assigned back to the mesh's vertex list.
|
|
|
|
Slice assignments cannot change the vertex list size. The size of the
|
|
list being assigned must be the same as the specified slice; otherwise an
|
|
exception is thrown.
|
|
|
|
Example::
|
|
import Blender
|
|
from Blender import Mesh
|
|
|
|
me = Mesh.Get("Plane") # get the mesh data called "Plane"
|
|
vert = me.verts[0] # vert accesses actual mesh data
|
|
vert.co[0] += 2 # change the vertex's X location
|
|
pvert = me.verts[-2:] # pvert is COPY of mesh's last two verts
|
|
pvert[0].co[0] += 2 # change the vertex's X location
|
|
pvert[1].co[0] += 2 # change the vertex's X location
|
|
me.verts[-1] = pvert[1] # put change to second vertex into mesh
|
|
|
|
@note: The mesh can be "cleared" by assigning B{None} to the mesh's vertex
|
|
list. This does not delete the Blender mesh object, it only deletes all
|
|
the memory allocated to the mesh. The result is equivalent to calling
|
|
Mesh.New(). The intent is to allow users writing exporters to free memory
|
|
after it is used in a quick and simple way.
|
|
|
|
Example::
|
|
import Blender
|
|
from Blender import Mesh
|
|
|
|
me = Mesh.Get("Plane") # get the mesh data called "Plane"
|
|
me.verts = None # delete all the mesh's attributes
|
|
|
|
"""
|
|
|
|
def extend(coords):
|
|
"""
|
|
Append zero or more vertices to the mesh. Unlike L{MEdgeSeq.extend()} and
|
|
L{MFaceSeq.extend()} no attempt is made to check for duplicate vertices in
|
|
the parameter list, or for vertices already in the mesh.
|
|
|
|
Example::
|
|
import Blender
|
|
from Blender import Mesh
|
|
from Blender.Mathutils import Vector
|
|
|
|
me = Mesh.Get("Plane") # get the mesh data called "Plane"
|
|
me.verts.extend(1,1,1) # add one vertex
|
|
l=[(.1,.1,.1),Vector([2,2,.5])]
|
|
me.verts.extend(l) # add multiple vertices
|
|
|
|
@type coords: sequences(s) of floats or vectors
|
|
@param coords: coords can be
|
|
- a sequence of three floats,
|
|
- a 3D vector, or
|
|
- a sequence (list or tuple) of either of the above.
|
|
"""
|
|
|
|
def delete(verts):
|
|
"""
|
|
Deletes one or more vertices from the mesh. Any edge or face which
|
|
uses the specified vertices are also deleted.
|
|
|
|
@type verts: multiple ints or MVerts
|
|
@param verts: can be
|
|
- a single MVert belonging to the mesh (B{note:} will not work with
|
|
PVerts)
|
|
- a single integer, specifying an index into the mesh's vertex list
|
|
- a sequence (list or tuple) containing two or more of either of
|
|
the above.
|
|
"""
|
|
|
|
def selected():
|
|
"""
|
|
Get selected vertices.
|
|
@return: a list of the indices for all vertices selected in edit mode.
|
|
@rtype: list of ints
|
|
"""
|
|
|
|
class MEdge:
|
|
"""
|
|
The MEdge object
|
|
================
|
|
This object holds mesh edge data.
|
|
@ivar v1: The first vertex of the edge.
|
|
@type v1: MVert
|
|
@ivar v2: The second vertex of the edge.
|
|
@type v2: MVert
|
|
@ivar crease: The crease value of the edge. It is in the range [0,255].
|
|
@type crease: int
|
|
@ivar flag: The bitfield describing edge properties. See L{EdgeFlags}.
|
|
@type flag: int
|
|
@ivar index: The edge's index within the mesh. Read-only.
|
|
@type index: int
|
|
@ivar sel: The edge's B{edit mode} selection state (selected=1).
|
|
@type sel: int
|
|
"""
|
|
|
|
def __iter__():
|
|
"""
|
|
Iterator for MEdge. It iterates over the MVerts of the edge, returning
|
|
v1 then v2.
|
|
@return: one of the edge's vertices
|
|
@rtype: MVert
|
|
"""
|
|
|
|
class MEdgeSeq:
|
|
"""
|
|
The MEdgeSeq object
|
|
===================
|
|
This object provides sequence and iterator access to the mesh's edges.
|
|
"""
|
|
|
|
def extend(vertseq):
|
|
"""
|
|
Add zero or more edges to the mesh. Edges which already exist in the
|
|
mesh or with both vertices the same are ignored. If three or four verts
|
|
are specified in any sequence, an edge is also created between the first
|
|
and last vertices (this is useful when adding faces).
|
|
|
|
Example::
|
|
import Blender
|
|
from Blender import Mesh
|
|
|
|
me = Mesh.Get("Plane") # get the mesh data called "Plane"
|
|
v = me.verts # get vertices
|
|
if len(v) >= 6: # if there are enough vertices...
|
|
me.edges.extend(v[0],v[1]) # add a single edge
|
|
l=[(v[1],v[2],v[3]),[0,2,4,5]]
|
|
me.edges.extend(l) # add multiple edges
|
|
|
|
@type vertseq: sequence(s) of ints or MVerts
|
|
@param vertseq: either two to four ints or MVerts, or sequence
|
|
(list or tuple) of sequences each containing two to four ints or MVerts.
|
|
"""
|
|
|
|
def delete(edges):
|
|
"""
|
|
Deletes one or more edges from the mesh. In addition, also delete:
|
|
- any faces which uses the specified edge(s)
|
|
- any "orphan" vertices (belonging only to specified edge(s))
|
|
|
|
@type edges: multiple ints or MEdges
|
|
@param edges: can be
|
|
- a single MEdge belonging to the mesh
|
|
- a single integer, specifying an index into the mesh's edge list
|
|
- a sequence (list or tuple) containing two or more of either of
|
|
the above.
|
|
"""
|
|
|
|
def selected():
|
|
"""
|
|
Get selected edges.
|
|
Selected edges are those for which both vertices are selected.
|
|
@return: a list of the indices for all edges selected in edit mode.
|
|
@rtype: list of ints
|
|
"""
|
|
|
|
class MFace:
|
|
"""
|
|
The MFace object
|
|
================
|
|
This object holds mesh face data.
|
|
|
|
Example::
|
|
import Blender
|
|
from Blender import Mesh, Window
|
|
|
|
in_emode = Window.EditMode()
|
|
if in_emode: Window.EditMode(0)
|
|
|
|
me = Mesh.Get("Mesh")
|
|
faces = me.faces
|
|
|
|
## Example for editmode faces selection:
|
|
selected_faces = []
|
|
for f in faces:
|
|
if f.sel:
|
|
selected_faces.append(f)
|
|
# ... unselect selected and select all the others:
|
|
for f in faces:
|
|
f.sel = 1 - f.sel # 1 becomes 0, 0 becomes 1
|
|
|
|
## Example for UV textured faces selection:
|
|
selected_faces = []
|
|
SEL = Mesh.FaceFlags['SELECT']
|
|
# get selected faces:
|
|
for f in faces:
|
|
if f.flag & SEL:
|
|
selected_faces.append(f)
|
|
# ... unselect selected and select all the others:
|
|
for f in faces:
|
|
if f.flag & SEL:
|
|
f.flag &= ~SEL # unselect these
|
|
else:
|
|
f.flag |= SEL # and select these
|
|
|
|
if in_emode: Window.EditMode(1)
|
|
Blender.Redraw()
|
|
|
|
@ivar verts: The face's vertices. Each face has 3 or 4 vertices.
|
|
@type verts: list of MVerts
|
|
@ivar v: Same as L{verts}. This attribute is only for compatibility with
|
|
NMesh scripts and will probably be deprecated in the future.
|
|
@ivar sel: The face's B{edit mode} selection state (selected=1).
|
|
This is not the same as the selection state of
|
|
the textured faces (see L{flag}).
|
|
@type sel: int
|
|
@ivar hide: The face's B{edit mode} visibility state (hidden=1).
|
|
This is not the same as the visibility state of
|
|
the textured faces (see L{flag}).
|
|
@type hide: int
|
|
@ivar smooth: If set, the vertex normals are averaged to make this
|
|
face look smooth. (This is the same as choosing "Set Smooth" in the
|
|
Editing Panel (F9) under "Link and Material" properties).
|
|
@type smooth: int
|
|
@ivar col: The face's vertex colors, if defined. Each vertex has its own
|
|
color.
|
|
Will throw an exception if the mesh does not have UV faces or vertex
|
|
colors; use L{Mesh.faceUV} and L{Mesh.vertexColors} to test. B{Note}:
|
|
if a mesh has i{both} UV faces and vertex colors, the colors stored in
|
|
the UV faces will be used here.
|
|
@type col: sequence of MCols
|
|
@ivar mat: The face's index into the mesh's materials
|
|
list. It is in the range [0,15].
|
|
@type mat: int
|
|
@ivar image: The Image used as a texture for this face.
|
|
Setting this attribute will create UV faces if they do not exist.
|
|
Getting this attribute throw an exception if the mesh does not have
|
|
UV faces; use L{Mesh.faceUV} to test.
|
|
Assigning an image will automatically set the TEX attribute of the
|
|
L{mode} bitfield.
|
|
@type image: Image
|
|
@ivar mode: The texture mode bitfield (see L{FaceModes}).
|
|
Will throw an exception if the mesh does not have UV faces; use
|
|
L{Mesh.faceUV} to test.
|
|
@type mode: int
|
|
@ivar index: The face's index within the mesh. Read-only.
|
|
@type index: int
|
|
|
|
@ivar flag: The face's B{texture mode} flags; indicates the selection,
|
|
active , and visibility states of a textured face (see
|
|
L{FaceFlags} for values).
|
|
This is not the same as the selection or visibility states of
|
|
the faces in edit mode (see L{sel} and L{hide}).
|
|
To set the active face, use
|
|
the L{Mesh.activeFace} attribute instead.
|
|
Will throw an exception if the mesh does not have UV faces; use
|
|
L{Mesh.faceUV} to test.
|
|
|
|
@ivar transp: Transparency mode. It is one of the values in
|
|
L{FaceTranspModes}).
|
|
Will throw an exception if the mesh does not have UV faces; use
|
|
L{Mesh.faceUV} to test.
|
|
@type transp: int
|
|
|
|
@ivar uv: The face's UV coordinates. Each vertex has its own UV coordinate.
|
|
Setting this attribute will create UV faces if they do not exist.
|
|
Getting this attribute throw an exception if the mesh does not have
|
|
UV faces; use L{Mesh.faceUV} to test.
|
|
@type uv: list of vectors (WRAPPED DATA)
|
|
@ivar uvSel: The face's UV coordinates seletion state; a 1 indicates the
|
|
vertex is selected. Each vertex has its own UV coordinate select state
|
|
(this is not the same as the vertex's edit mode selection state).
|
|
Setting this attribute will create UV faces if they do not exist.
|
|
Getting this attribute throw an exception if the mesh does not have
|
|
UV faces; use L{Mesh.faceUV} to test.
|
|
@type uvSel: list of ints
|
|
@ivar no: The face's normal vector (x, y, z). Read-only.
|
|
@type no: vector
|
|
@note: there are regular faces and textured faces in Blender, both currently
|
|
with their own selection and visibility states, due to a mix of old and new
|
|
code. To (un)select or (un)hide regular faces (visible in EditMode), use
|
|
L{MFace.sel} and L{MFace.hide} attributes. For textured faces (UV Face
|
|
Select and Paint modes in Blender) use the L{MFace.flag} attribute.
|
|
Check the example above and note L{Window.EditMode}.
|
|
@note: Assigning UV textures to mesh faces in Blender works like this:
|
|
1. Select your mesh.
|
|
2. Enter face select mode (press f) and select at least some face(s).
|
|
3. In the UV/Image Editor window, load / select an image.
|
|
4. Play in both windows (better split the screen to see both at the same
|
|
time) until the UV coordinates are where you want them. Hint: in the
|
|
3D window, the 'u' key opens a menu of default UV choices and the 'r'
|
|
key lets you rotate the UV coords.
|
|
5. Leave face select mode (press f).
|
|
"""
|
|
|
|
def __iter__():
|
|
"""
|
|
Iterator for MVert. It iterates over the MVerts of the face, returning
|
|
v1, v2, v3 (and optionally v4);
|
|
@return: one of the face's vertices
|
|
@rtype: MVert
|
|
"""
|
|
|
|
class MFaceSeq:
|
|
"""
|
|
The MFaceSeq object
|
|
===================
|
|
This object provides sequence and iterator access to the mesh's faces.
|
|
"""
|
|
|
|
def extend(vertseq):
|
|
"""
|
|
Add zero or more faces and edges to the mesh. Faces which already exist
|
|
in the mesh, or faces which contain the same vertex multiple times are
|
|
ignored. Sequences of two vertices are accepted, but no face will be
|
|
created.
|
|
|
|
Example::
|
|
import Blender
|
|
from Blender import Mesh
|
|
|
|
me = Mesh.Get("Plane") # get the mesh data called "Plane"
|
|
v = me.verts # get vertices
|
|
if len(v) >= 6: # if there are enough vertices...
|
|
me.faces.extend(v[1],v[2],v[3]) # add a single edge
|
|
l=[(v[0],v[1]),[0,2,4,5]]
|
|
me.faces.extend(l) # add another face
|
|
|
|
@type vertseq: sequence(s) of MVerts
|
|
@param vertseq: either two to four ints or MVerts, or sequence (list or
|
|
tuple) of sequences each containing two to four ints or MVerts.
|
|
"""
|
|
|
|
def delete(deledges, faces):
|
|
"""
|
|
Deletes one or more faces (and optionally the edges associated with
|
|
the face(s)) from the mesh.
|
|
|
|
@type deledges: int
|
|
@param deledges: controls whether just the faces (deledges=0)
|
|
or the faces and edges (deledges=1) are deleted. These correspond to the
|
|
"Only Faces" and "Edges & Faces" options in the Edit Mode pop-up menu
|
|
@type faces: multiple ints or MFaces
|
|
@param faces: a sequence (list or tuple) containing one or more of:
|
|
- an MEdge belonging to the mesh
|
|
- a integer, specifying an index into the mesh's face list
|
|
"""
|
|
|
|
def selected():
|
|
"""
|
|
Get selected faces.
|
|
mode.
|
|
@return: a list of the indices for all faces selected in edit mode.
|
|
@rtype: list of ints
|
|
"""
|
|
|
|
class Mesh:
|
|
"""
|
|
The Mesh Data object
|
|
====================
|
|
This object gives access to mesh data in Blender.
|
|
@note: the verts, edges and faces attributes are implemented as sequences.
|
|
The operator[] and len() are defined for these sequences. You cannot
|
|
assign to an item in the sequence, but you can assign to most of the
|
|
attributes of individual items.
|
|
@ivar edges: The mesh's edges.
|
|
@type edges: sequence of MEdges
|
|
@ivar faces: The mesh's faces.
|
|
@type faces: sequence of MFaces
|
|
@ivar verts: The mesh's vertices.
|
|
@type verts: sequence of MVerts
|
|
|
|
@ivar materials: The mesh's materials. Each mesh can reference up to
|
|
16 materials. Empty slots in the mesh's list are represented by B{None}.
|
|
B{Note}: L{Object.colbits<Object.Object.colbits>} needs to be set correctly
|
|
for each object in order for these materials to be used instead of
|
|
the object's materials.
|
|
B{Note}: Making the material list shorter does not change the faces material indicies,
|
|
take care when using the faces material indices to reference a material in the materials list.
|
|
@type materials: list of Materials
|
|
@ivar degr: The max angle for auto smoothing in [1,80].
|
|
@type degr: int
|
|
@ivar maxSmoothAngle: Same as L{degr}. This attribute is only for
|
|
compatibility with NMesh scripts and will probably be deprecated in
|
|
the future.
|
|
@ivar mode: The mesh's mode bitfield. See L{Modes}.
|
|
@type mode: int
|
|
|
|
@ivar name: The Mesh name. It's common to use this field to store extra
|
|
data about the mesh (to be exported to another program, for example).
|
|
@type name: str
|
|
@ivar subDivLevels: The [display, rendering] subdivision levels in [1, 6].
|
|
@type subDivLevels: list of 2 ints
|
|
@ivar users: The number of Objects using (linked to) this mesh.
|
|
@type users: int
|
|
|
|
@ivar faceUV: The mesh contains UV-mapped textured faces. Enabling faceUV
|
|
does not initialize the face colors like the Blender UI does; this must
|
|
be done in the script. B{Note}: if faceUV is set, L{vertexColors} cannot
|
|
be set. Furthermore, if vertexColors is already set when faceUV is set,
|
|
vertexColors is cleared. This is because the vertex color information
|
|
is stored with UV faces, so enabling faceUV implies enabling vertexColors.
|
|
In addition, faceUV cannot be set when the mesh has no faces defined
|
|
(this is the same behavior as the UI). Attempting to do so will throw
|
|
a RuntimeError exception.
|
|
@type faceUV: bool
|
|
@ivar vertexColors: The mesh contains vertex colors. See L{faceUV} for the
|
|
use of vertex colors when UV-mapped texture faces are enabled.
|
|
@type vertexColors: bool
|
|
@ivar vertexUV: The mesh contains "sticky" per-vertex UV coordinates.
|
|
@type vertexUV: bool
|
|
@ivar activeFace: Index of the mesh's active face in UV Face Select and
|
|
Paint modes. Only one face can be active at a time. Note that this is
|
|
independent of the selected faces in Face Select and Edit modes.
|
|
Will throw an exception if the mesh does not have UV faces; use
|
|
L{faceUV} to test.
|
|
@type activeFace: int
|
|
@ivar activeGroup: The mesh's active vertex group. The mesh must be
|
|
linked to an object (read the comment in L{addVertGroup} for more info).
|
|
@type activeGroup: string
|
|
"""
|
|
|
|
def getFromObject(name,cage=0):
|
|
"""
|
|
Replace the mesh's existing data with the raw mesh data from a Blender
|
|
Object. This method supports all the geometry based objects (mesh, text,
|
|
curve, surface, and meta). If the object has modifiers, they will be
|
|
applied before to the object before extracting the vertex data unless
|
|
the B{cage} parameter is 1.
|
|
@note: The mesh coordinates are in I{local space}, not the world space of
|
|
its object. For world space vertex coordinates, each vertex location must
|
|
be multiplied by the object's 4x4 transform matrix (see L{transform}).
|
|
@note: The objects materials will not be copied into the existing mesh,
|
|
however the face material indices will match the material list of the original data.
|
|
@type name: string
|
|
@param name: name of the Blender object which contains the geometry data.
|
|
@type cage: int
|
|
@param cage: determines whether the original vertices or derived vertices
|
|
(for objects with modifiers) are used. The default is derived vertices.
|
|
"""
|
|
|
|
def calcNormals():
|
|
"""
|
|
Recalculates the vertex normals using face data.
|
|
"""
|
|
|
|
def transform(matrix, recalc_normals = False):
|
|
"""
|
|
Transforms the mesh by the specified 4x4 matrix (such as returned by
|
|
L{Object.Object.getMatrix}). The matrix should be invertible.
|
|
Ideal usage for this is exporting to an external file where
|
|
global vertex locations are required for each object.
|
|
Sometimes external renderers or file formats do not use vertex normals.
|
|
In this case, you can skip transforming the vertex normals by leaving
|
|
the optional parameter recalc_normals as False or 0 (the default value).
|
|
|
|
Example::
|
|
# This script outputs deformed meshes worldspace vertex locations
|
|
# for a selected object without changing the object
|
|
import Blender
|
|
from Blender import Mesh, Object
|
|
|
|
ob = Object.GetSelected()[0] # Get the first selected object
|
|
me = Mesh.New() # Create a new mesh
|
|
me.getFromObject(ob.name) # Get the object's mesh data
|
|
verts = me.verts[:] # Save a copy of the vertices
|
|
me.transform(ob.matrix) # Convert verts to world space
|
|
for v in me.verts:
|
|
print 'worldspace vert', v.co
|
|
me.verts = verts # Restore the original verts
|
|
|
|
@type matrix: Py_Matrix
|
|
@param matrix: 4x4 Matrix which can contain location, scale and rotation.
|
|
@type recalc_normals: int
|
|
@param recalc_normals: if True or 1, also transform vertex normals.
|
|
@warn: unlike L{NMesh.transform()<NMesh.NMesh.transform>}, this method
|
|
I{will immediately modify the mesh data} when it is used. If you
|
|
transform the mesh using the object's matrix to get the vertices'
|
|
world positions, the result will be a "double transform". To avoid
|
|
this you either need to set the object's matrix to the identity
|
|
matrix, perform the inverse transform after outputting the transformed
|
|
vertices, or make a copy of the vertices prior to using this method
|
|
and restore them after outputting the transformed vertices (as shown
|
|
in the example).
|
|
"""
|
|
|
|
def vertexShade(object):
|
|
"""
|
|
Colors vertices based on the current lighting setup, like when there
|
|
are no vertex colors and no textured faces and a user enters Vertex Paint
|
|
Mode in Blender (only lamps in visible layers account). An exception is
|
|
thrown if called while in EditMode.
|
|
@type object: Object
|
|
@param object: The Blender Object linked to the mesh.
|
|
"""
|
|
|
|
def update():
|
|
"""
|
|
Update display lists after changes to mesh. B{Note}: with changes taking
|
|
place for using a directed acyclic graph (DAG) for scene and object
|
|
updating, this method may be only temporary and may be removed in future
|
|
releases.
|
|
"""
|
|
|
|
def findEdges(edges):
|
|
"""
|
|
Quickly search for the location of an edges.
|
|
@type edges: sequence(s) of ints or MVerts
|
|
@param edges: can be tuples of MVerts or integer indexes (B{note:} will
|
|
not work with PVerts) or a sequence (list or tuple) containing two or
|
|
more sequences.
|
|
@rtype: int, None or list
|
|
@return: if an edge is found, its index is returned; otherwise None is
|
|
returned. If a sequence of edges is passed, a list is returned.
|
|
"""
|
|
|
|
def addVertGroup(group):
|
|
"""
|
|
Add a named and empty vertex (deform) group to the object this mesh is
|
|
linked to. The mesh must first be linked to an object (with object.link()
|
|
or object.getData() ) so the method knows which object to update.
|
|
This is because vertex groups in Blender are stored in I{the object} --
|
|
not in the mesh, which may be linked to more than one object.
|
|
@type group: string
|
|
@param group: the name for the new group.
|
|
"""
|
|
|
|
def removeVertGroup(group):
|
|
"""
|
|
Remove a named vertex (deform) group from the object linked to this mesh.
|
|
All vertices assigned to the group will be removed (just from the group,
|
|
not deleted from the mesh), if any. If this mesh was newly created, it
|
|
must first be linked to an object (read the comment in L{addVertGroup} for
|
|
more info).
|
|
@type group: string
|
|
@param group: the name of a vertex group.
|
|
"""
|
|
|
|
def assignVertsToGroup(group, vertList, weight, assignmode = AssignModes['REPLACE']):
|
|
"""
|
|
Adds an array (a Python list) of vertex points to a named vertex group
|
|
associated with a mesh. The vertex list is a list of vertex indices from
|
|
the mesh. You should assign vertex points to groups only when the mesh has
|
|
all its vertex points added to it and is already linked to an object.
|
|
|
|
I{B{Example:}}
|
|
The example here adds a new set of vertex indices to a sphere primitive::
|
|
import Blender
|
|
sphere = Blender.Object.Get('Sphere')
|
|
replace = Blender.Mesh.AssignModes.REPLACE
|
|
mesh = sphere.getData(mesh=True)
|
|
mesh.addVertGroup('firstGroup')
|
|
vertList = []
|
|
for x in range(300):
|
|
if x % 3 == 0:
|
|
vertList.append(x)
|
|
mesh.assignVertsToGroup('firstGroup', vertList, 0.5, replace)
|
|
|
|
@type group: string
|
|
@param group: the name of the group.
|
|
@type vertList: list of ints
|
|
@param vertList: a list of vertex indices.
|
|
@type weight: float
|
|
@param weight: the deform weight for (which means: the amount of influence
|
|
the group has over) the given vertices. It should be in the range
|
|
[0.0, 1.0]. If weight <= 0, the given vertices are removed from the
|
|
group. If weight > 1, it is clamped.
|
|
@type assignmode: module constant
|
|
@param assignmode: Three choices: REPLACE, ADD or SUBTRACT.
|
|
See L{AssignModes} for a complete description.
|
|
"""
|
|
|
|
def removeVertsFromGroup(group, vertList = None):
|
|
"""
|
|
Remove a list of vertices from the given group. If this nmesh was newly
|
|
created, it must first be linked to an object (check L{addVertGroup}).
|
|
@type group: string
|
|
@param group: the name of a vertex group
|
|
@type vertList: list of ints
|
|
@param vertList: a list of vertex indices to be removed from I{group}.
|
|
If None, all vertices are removed -- the group is emptied.
|
|
"""
|
|
|
|
def getVertsFromGroup(group, weightsFlag = 0, vertList = None):
|
|
"""
|
|
Return a list of vertex indices associated with the passed group. This
|
|
method can be used to test whether a vertex index is part of a group and
|
|
if so, what its weight is.
|
|
|
|
I{B{Example:}}
|
|
Append this to the example from L{assignVertsToGroup}::
|
|
# ...
|
|
print "Vertex indices from group %s :" % groupName
|
|
print mesh.getVertsFromGroup('firstGroup')
|
|
print "Again, with weights:"
|
|
print mesh.getVertsFromGroup('firstGroup',1)
|
|
print "Again, with weights and restricted to the given indices:"
|
|
print mesh.getVertsFromGroup('firstGroup',1,[1,2,3,4,5,6])
|
|
|
|
@type group: string
|
|
@param group: the group name.
|
|
@type weightsFlag: bool
|
|
@param weightsFlag: if 1, the weight is returned along with the index.
|
|
@type vertList: list of ints
|
|
@param vertList: if given, only those vertex points that are both in the
|
|
list and group passed in are returned.
|
|
"""
|
|
|
|
def renameVertGroup(groupName, newName):
|
|
"""
|
|
Renames a vertex group.
|
|
@type groupName: string
|
|
@param groupName: the vertex group name to be renamed.
|
|
@type newName: string
|
|
@param newName: the name to replace the old name.
|
|
"""
|
|
|
|
def getVertGroupNames():
|
|
"""
|
|
Return a list of all vertex group names.
|
|
@rtype: list of strings
|
|
@return: returns a list of strings representing all vertex group
|
|
associated with the mesh's object
|
|
"""
|
|
|
|
def getVertexInfluences(index):
|
|
"""
|
|
Get the bone influences for a specific vertex.
|
|
@type index: int
|
|
@param index: The index of a vertex.
|
|
@rtype: list of lists
|
|
@return: List of pairs [name, weight], where name is the bone name (string)
|
|
and weight is a float value.
|
|
"""
|
|
|
|
def smooth():
|
|
"""
|
|
Flattens angle of selected faces. Experimental mesh tool.
|
|
An exception is thrown if called while in EditMode.
|
|
"""
|
|
|
|
def flipNormals():
|
|
"""
|
|
Toggles the direction of selected face's normals. Experimental mesh tool.
|
|
An exception is thrown if called while in EditMode.
|
|
"""
|
|
|
|
def toSphere():
|
|
"""
|
|
Moves selected vertices outward in a spherical shape. Experimental mesh
|
|
tool.
|
|
An exception is thrown if called while in EditMode.
|
|
"""
|
|
|
|
def fill():
|
|
"""
|
|
Scan fill a closed selected edge loop. Experimental mesh tool.
|
|
An exception is thrown if called while in EditMode.
|
|
"""
|
|
|
|
def triangleToQuad():
|
|
"""
|
|
Convert selected triangles to quads. Experimental mesh tool.
|
|
An exception is thrown if called while in EditMode.
|
|
"""
|
|
|
|
def quadToTriangle(mode=0):
|
|
"""
|
|
Convert selected quads to triangles. Experimental mesh tool.
|
|
An exception is thrown if called while in EditMode.
|
|
@type mode: int
|
|
@param mode: specifies whether a to add the new edge between the
|
|
closest (=0) or farthest(=1) vertices.
|
|
"""
|
|
|
|
def subdivide(beauty=0):
|
|
"""
|
|
Subdivide selected edges in a mesh. Experimental mesh tool.
|
|
An exception is thrown if called while in EditMode.
|
|
@type beauty: int
|
|
@param beauty: specifies whether a "beauty" subdivide should be
|
|
enabled (disabled is default). Value must be in the range [0,1].
|
|
"""
|
|
|
|
def remDoubles(limit):
|
|
"""
|
|
Removes duplicates from selected vertices. Experimental mesh tool.
|
|
An exception is thrown if called while in EditMode.
|
|
@type limit: float
|
|
@param limit: specifies the maximum distance considered for vertices
|
|
to be "doubles". Value is clamped to the range [0.0,1.0].
|
|
@rtype: int
|
|
@return: the number of vertices deleted
|
|
"""
|
|
|
|
def recalcNormals(direction=0):
|
|
"""
|
|
Recalculates inside or outside normals for selected faces. Experimental
|
|
mesh tool.
|
|
An exception is thrown if called while in EditMode.
|
|
@type direction: int
|
|
@param direction: specifies outward (0) or inward (1) normals. Outward
|
|
is the default. Value must be in the range [0,1].
|
|
"""
|