remove python bindings references from Docs
This commit is contained in:
@@ -1,158 +0,0 @@
|
|||||||
##################################################
|
|
||||||
# Getting Started
|
|
||||||
##################################################
|
|
||||||
|
|
||||||
from openmesh import *
|
|
||||||
|
|
||||||
mesh = TriMesh()
|
|
||||||
|
|
||||||
|
|
||||||
##################################################
|
|
||||||
# Adding Items to a Mesh
|
|
||||||
##################################################
|
|
||||||
|
|
||||||
# add a a couple of vertices to the mesh
|
|
||||||
vh0 = mesh.add_vertex(TriMesh.Point(0, 1, 0))
|
|
||||||
vh1 = mesh.add_vertex(TriMesh.Point(1, 0, 0))
|
|
||||||
vh2 = mesh.add_vertex(TriMesh.Point(2, 1, 0))
|
|
||||||
vh3 = mesh.add_vertex(TriMesh.Point(0,-1, 0))
|
|
||||||
vh4 = mesh.add_vertex(TriMesh.Point(2,-1, 0))
|
|
||||||
|
|
||||||
# add a couple of faces to the mesh
|
|
||||||
fh0 = mesh.add_face(vh0, vh1, vh2)
|
|
||||||
fh1 = mesh.add_face(vh1, vh3, vh4)
|
|
||||||
fh2 = mesh.add_face(vh0, vh3, vh1)
|
|
||||||
|
|
||||||
# add another face to the mesh, this time using a list
|
|
||||||
vh_list = [vh2, vh1, vh4]
|
|
||||||
fh3 = mesh.add_face(vh_list)
|
|
||||||
|
|
||||||
# 0 ==== 2
|
|
||||||
# |\ 0 /|
|
|
||||||
# | \ / |
|
|
||||||
# |2 1 3|
|
|
||||||
# | / \ |
|
|
||||||
# |/ 1 \|
|
|
||||||
# 3 ==== 4
|
|
||||||
|
|
||||||
|
|
||||||
##################################################
|
|
||||||
# Iterators
|
|
||||||
##################################################
|
|
||||||
|
|
||||||
# iterate over all vertices
|
|
||||||
for vh in mesh.vertices():
|
|
||||||
print vh.idx()
|
|
||||||
|
|
||||||
# iterate over all halfedges
|
|
||||||
for heh in mesh.halfedges():
|
|
||||||
print heh.idx()
|
|
||||||
|
|
||||||
# iterate over all edges
|
|
||||||
for eh in mesh.edges():
|
|
||||||
print eh.idx()
|
|
||||||
|
|
||||||
# iterate over all faces
|
|
||||||
for fh in mesh.faces():
|
|
||||||
print fh.idx()
|
|
||||||
|
|
||||||
|
|
||||||
##################################################
|
|
||||||
# Circulators
|
|
||||||
##################################################
|
|
||||||
|
|
||||||
# iterate over all neighboring vertices
|
|
||||||
for vh in mesh.vv(vh1):
|
|
||||||
print vh.idx()
|
|
||||||
|
|
||||||
# iterate over all incoming halfedges
|
|
||||||
for heh in mesh.vih(vh1):
|
|
||||||
print heh.idx()
|
|
||||||
|
|
||||||
# iterate over all outgoing halfedges
|
|
||||||
for heh in mesh.voh(vh1):
|
|
||||||
print heh.idx()
|
|
||||||
|
|
||||||
# iterate over all adjacent edges
|
|
||||||
for eh in mesh.ve(vh1):
|
|
||||||
print eh.idx()
|
|
||||||
|
|
||||||
# iterate over all adjacent faces
|
|
||||||
for fh in mesh.vf(vh1):
|
|
||||||
print fh.idx()
|
|
||||||
|
|
||||||
# iterate over the face's vertices
|
|
||||||
for vh in mesh.fv(fh0):
|
|
||||||
print vh.idx()
|
|
||||||
|
|
||||||
# iterate over the face's halfedges
|
|
||||||
for heh in mesh.fh(fh0):
|
|
||||||
print heh.idx()
|
|
||||||
|
|
||||||
# iterate over the face's edges
|
|
||||||
for eh in mesh.fe(fh0):
|
|
||||||
print eh.idx()
|
|
||||||
|
|
||||||
# iterate over all edge-neighboring faces
|
|
||||||
for fh in mesh.ff(fh0):
|
|
||||||
print fh.idx()
|
|
||||||
|
|
||||||
|
|
||||||
##################################################
|
|
||||||
# Properties
|
|
||||||
##################################################
|
|
||||||
|
|
||||||
prop_handle = VPropHandle()
|
|
||||||
mesh.add_property(prop_handle, "cogs")
|
|
||||||
|
|
||||||
for vh in mesh.vertices():
|
|
||||||
cog = TriMesh.Point(0,0,0)
|
|
||||||
valence = 0
|
|
||||||
for neighbor in mesh.vv(vh):
|
|
||||||
cog += mesh.point(neighbor)
|
|
||||||
valence += 1
|
|
||||||
mesh.set_property(prop_handle, vh, cog / valence)
|
|
||||||
|
|
||||||
mesh.remove_property(prop_handle)
|
|
||||||
|
|
||||||
|
|
||||||
##################################################
|
|
||||||
# Property Managers
|
|
||||||
##################################################
|
|
||||||
|
|
||||||
prop_man = VPropertyManager(mesh, "cogs")
|
|
||||||
|
|
||||||
prop_man.set_range(mesh.vertices(), TriMesh.Point(0,0,0))
|
|
||||||
|
|
||||||
for vh in mesh.vertices():
|
|
||||||
valence = 0
|
|
||||||
for neighbor in mesh.vv(vh):
|
|
||||||
prop_man[vh] += mesh.point(neighbor)
|
|
||||||
valence += 1
|
|
||||||
prop_man[vh] /= valence
|
|
||||||
|
|
||||||
|
|
||||||
##################################################
|
|
||||||
# I/O
|
|
||||||
##################################################
|
|
||||||
|
|
||||||
mesh = TriMesh()
|
|
||||||
|
|
||||||
read_mesh(mesh, "bunny.obj")
|
|
||||||
# modify mesh ...
|
|
||||||
write_mesh(mesh, "bunny.obj")
|
|
||||||
|
|
||||||
|
|
||||||
mesh = TriMesh()
|
|
||||||
mesh.request_halfedge_normals()
|
|
||||||
mesh.request_vertex_normals()
|
|
||||||
|
|
||||||
options = Options()
|
|
||||||
options += Options.VertexNormal
|
|
||||||
|
|
||||||
result = read_mesh(mesh, "bunny.obj", options)
|
|
||||||
|
|
||||||
if result:
|
|
||||||
print "everything worked"
|
|
||||||
else:
|
|
||||||
print "something went wrong"
|
|
||||||
@@ -87,14 +87,6 @@ repeatedly replacing each vertex' position by the center of gravity
|
|||||||
|
|
||||||
<br /><br />
|
<br /><br />
|
||||||
|
|
||||||
\section python_and_om OpenMesh Python interface
|
|
||||||
OpenMesh itself is written in C++. We also provide a python interface
|
|
||||||
to use OpenMesh. A detailed description of the interface can be found
|
|
||||||
in the following tutorial:
|
|
||||||
\li \subpage python_tutorial
|
|
||||||
|
|
||||||
<br /><br />
|
|
||||||
|
|
||||||
\subpage additional_information
|
\subpage additional_information
|
||||||
|
|
||||||
\li \ref mesh_first_to_read
|
\li \ref mesh_first_to_read
|
||||||
|
|||||||
@@ -1,288 +0,0 @@
|
|||||||
/** \page python_tutorial Python Tutorial
|
|
||||||
|
|
||||||
This tutorial will introduce the basic concepts behind the %OpenMesh Python
|
|
||||||
Bindings. We will cover the following topics:
|
|
||||||
|
|
||||||
\li How to build the Python Bindings
|
|
||||||
\li How to create an empty mesh
|
|
||||||
\li How to add vertices and faces to a mesh
|
|
||||||
\li How to navigate on a mesh using iterators and circulators
|
|
||||||
\li How to add and remove custom properties
|
|
||||||
\li How to read and write meshes from files
|
|
||||||
|
|
||||||
In addition, we will briefly discuss some of the differences between the Python
|
|
||||||
Bindings and the original C++ implementation of %OpenMesh.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section python_build Building the Python Bindings
|
|
||||||
|
|
||||||
The Python Bindings depend on the following libraries:
|
|
||||||
|
|
||||||
\li Python (2.7 or later)
|
|
||||||
\li Boost Python (1.54.0 or later)
|
|
||||||
|
|
||||||
\note Make sure that your Boost Python and Python versions match, i.e. that
|
|
||||||
Boost Python was linked against the correct Python version.
|
|
||||||
|
|
||||||
The Python Bindings are automatically built with %OpenMesh. The generated files are written to the
|
|
||||||
Build/python subdirectory of the build tree. For more information on how to build %OpenMesh see
|
|
||||||
\ref compiling.
|
|
||||||
|
|
||||||
If CMake does not find your Python installation (or finds the wrong one) you can
|
|
||||||
explicitly specify an installation by setting the following variables:
|
|
||||||
|
|
||||||
\verbatim
|
|
||||||
PYTHON_LIBRARY - Path to the python library
|
|
||||||
PYTHON_INCLUDE_DIR - Path to where Python.h is found
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
Similarly, if CMake does not find your Boost Python installation, set the
|
|
||||||
following variables:
|
|
||||||
|
|
||||||
\verbatim
|
|
||||||
BOOST_ROOT - Preferred installation prefix
|
|
||||||
BOOST_INCLUDEDIR - Preferred include directory e.g. <prefix>/include
|
|
||||||
BOOST_LIBRARYDIR - Preferred library directory e.g. <prefix>/lib
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section python_start Getting Started
|
|
||||||
|
|
||||||
To use the %OpenMesh Python Bindings we first need to import the openmesh module:
|
|
||||||
|
|
||||||
\dontinclude python_tutorial.py
|
|
||||||
\skipline from
|
|
||||||
|
|
||||||
The module provides two mesh classes: One for polygonal meshes (PolyMesh) and
|
|
||||||
one for triangle meshes (TriMesh). You should use triangle meshes whenever
|
|
||||||
possible, since they are usually more efficient. In addition, some algorithms
|
|
||||||
are only implemented for triangle meshes while triangle meshes inherit the full
|
|
||||||
functionality of polygonal meshes.
|
|
||||||
|
|
||||||
The following code creates a new triangle mesh:
|
|
||||||
|
|
||||||
\skipline mesh
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section python_add Adding Items to a Mesh
|
|
||||||
|
|
||||||
We can add a new vertex to the mesh by calling the add_vertex() member function.
|
|
||||||
This function gets a coordinate and returns a handle to the newly inserted
|
|
||||||
vertex.
|
|
||||||
|
|
||||||
\skipline vh0
|
|
||||||
\until vh4
|
|
||||||
|
|
||||||
To add a new face to the mesh we have to call add_face(). This function gets the
|
|
||||||
handles of the vertices that make up the new face and returns a handle to the
|
|
||||||
newly inserted face:
|
|
||||||
|
|
||||||
\skipline fh0
|
|
||||||
\until fh2
|
|
||||||
|
|
||||||
We can also use a Python list to add a face to the mesh:
|
|
||||||
|
|
||||||
\skipline vh_list
|
|
||||||
\until fh3
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section python_iterators Iterators and Circulators
|
|
||||||
|
|
||||||
Now that we have added a couple of vertices to the mesh, we can iterate over
|
|
||||||
them and print out their indices:
|
|
||||||
|
|
||||||
\skipline for
|
|
||||||
\until vh.idx()
|
|
||||||
|
|
||||||
We can also iterate over halfedges, edges and faces by calling mesh.halfedges(),
|
|
||||||
mesh.edges() and mesh.faces() respectively:
|
|
||||||
|
|
||||||
\skipline iterate
|
|
||||||
\until fh.idx()
|
|
||||||
|
|
||||||
To iterate over the items adjacent to another item we can use one of the
|
|
||||||
circulator functions. For example, to iterate over the vertices adjacent to
|
|
||||||
another vertex we can call mesh.vv() and pass the handle of the center vertex:
|
|
||||||
|
|
||||||
\skipline for
|
|
||||||
\until vh.idx()
|
|
||||||
|
|
||||||
We can also iterate over the adjacent halfedges, edges and faces:
|
|
||||||
|
|
||||||
\skipline iterate
|
|
||||||
\until fh.idx()
|
|
||||||
|
|
||||||
To iterate over the items adjacent to a face we can use the following functions:
|
|
||||||
|
|
||||||
\skipline iterate
|
|
||||||
\until fh.idx()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section python_props Properties
|
|
||||||
|
|
||||||
%OpenMesh allows us to dynamically add custom properties to a mesh. We can add
|
|
||||||
properties to vertices, halfedges, edges, faces and the mesh itself. To
|
|
||||||
add a property to a mesh (and later access its value) we have to use a property
|
|
||||||
handle of the appropriate type:
|
|
||||||
|
|
||||||
\li VPropHandle (for vertex properties)
|
|
||||||
\li HPropHandle (for halfedge properties)
|
|
||||||
\li EPropHandle (for edge properties)
|
|
||||||
\li FPropHandle (for face properties)
|
|
||||||
\li MPropHandle (for mesh properties)
|
|
||||||
|
|
||||||
The following code shows how to add a vertex property to a mesh:
|
|
||||||
|
|
||||||
\skipline prop_handle
|
|
||||||
\until mesh
|
|
||||||
|
|
||||||
The second parameter of the function add_property() is optional. The parameter
|
|
||||||
is used to specify a name for the new property. This name can later be used
|
|
||||||
to retrieve a handle to the property using the get_property_handle() member
|
|
||||||
function.
|
|
||||||
|
|
||||||
Now that we have added a vertex property to the mesh we can set and get its
|
|
||||||
value. Here we will use the property to store the center of gravity of each
|
|
||||||
vertex' neighborhood:
|
|
||||||
|
|
||||||
\skipline for
|
|
||||||
\until mesh.set_property
|
|
||||||
|
|
||||||
Properties use Python's type system. This means that we can use the same
|
|
||||||
property to store values of different types (e.g. store both strings and
|
|
||||||
integers using the same vertex property). Properties are initialized to the
|
|
||||||
Python built-in constant None.
|
|
||||||
|
|
||||||
To remove a property we have to call remove_property() with the appropriate
|
|
||||||
property handle:
|
|
||||||
|
|
||||||
\skipline mesh.remove_property
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section python_propman Property Managers
|
|
||||||
|
|
||||||
Another way to add and remove a property is to use a property manager. A
|
|
||||||
Property manager encapsulates a property and manages its lifecycle. A Property
|
|
||||||
manager also provides a number of convenience functions to access the enclosed
|
|
||||||
property.
|
|
||||||
|
|
||||||
There are four different types of property managers. One for each type of mesh
|
|
||||||
item:
|
|
||||||
|
|
||||||
\li VPropertyManager (for vertex properties)
|
|
||||||
\li HPropertyManager (for halfedge properties)
|
|
||||||
\li EPropertyManager (for edge properties)
|
|
||||||
\li FPropertyManager (for face properties)
|
|
||||||
|
|
||||||
Property managers automatically add a new property to a mesh when they are
|
|
||||||
initialized. Thus the following code not only creates a new vertex property
|
|
||||||
manager, but also adds a new vertex property to the mesh:
|
|
||||||
|
|
||||||
\skipline prop_man
|
|
||||||
|
|
||||||
Property managers allow us to conveniently set the property value for an entire
|
|
||||||
range of mesh items:
|
|
||||||
|
|
||||||
\skipline prop_man
|
|
||||||
|
|
||||||
They also allow us to use the subscript operator to set and get property values.
|
|
||||||
Here we will once again use a property to store the center of gravity of each
|
|
||||||
vertex' neighborhood:
|
|
||||||
|
|
||||||
\skipline for
|
|
||||||
\until prop_man[vh] /= valence
|
|
||||||
|
|
||||||
Properties that are encapsulated by a property manager are automatically removed
|
|
||||||
from the mesh when the property manager goes out of scope (i.e. the property
|
|
||||||
manager is garbage collected).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section python_io Read and write meshes from files
|
|
||||||
|
|
||||||
You can read and write meshes from files using the read_mesh() and write_mesh()
|
|
||||||
functions:
|
|
||||||
|
|
||||||
\skipline mesh
|
|
||||||
\until write_mesh(mesh, "bunny.obj")
|
|
||||||
|
|
||||||
The file type is automatically deduced from the file extension. %OpenMesh
|
|
||||||
currently supports four file types: .off, .obj, .stl and .om
|
|
||||||
|
|
||||||
The behaviour of the I/O functions can be controlled by passing an instance of
|
|
||||||
the Options class to either read_mesh() or write_mesh(). The class controls the
|
|
||||||
behaviour of the I/O functions by means of enabled/disabled bits in a bitset:
|
|
||||||
|
|
||||||
\skipline mesh
|
|
||||||
\until print "something went wrong"
|
|
||||||
|
|
||||||
Other available option bits include:
|
|
||||||
|
|
||||||
-# mode bits - control binary reading/writing
|
|
||||||
- Options.Binary
|
|
||||||
- Options.MSB
|
|
||||||
- Options.LSB
|
|
||||||
- Options.Swap (MSB|LSB)
|
|
||||||
-# property bits - controls which standard properties to read/write
|
|
||||||
- Options.VertexNormal
|
|
||||||
- Options.VertexTexCoord
|
|
||||||
- Options.VertexColor
|
|
||||||
- Options.FaceNormal
|
|
||||||
- Options.FaceColor
|
|
||||||
- Options.ColorAlpha
|
|
||||||
- Options.ColorFloat
|
|
||||||
|
|
||||||
\note You have to pass an instance of the Options class to the I/O functions,
|
|
||||||
i.e. you cannot directly pass one of the option bits. For example, directly
|
|
||||||
passing Options.Binary to either one of the functions will cause an error.
|
|
||||||
|
|
||||||
When reading a file the options are used as hints, i.e. depending on the format
|
|
||||||
we can help the reader to interpret the data correctly.
|
|
||||||
|
|
||||||
\note If you want to read a property from a file the property must have been
|
|
||||||
requested prior to reading the file.
|
|
||||||
|
|
||||||
When writing the mesh the mode bits control whether to use the binary variant of
|
|
||||||
the respective file format and the desired byte-ordering.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section python_examples Additional Code Examples
|
|
||||||
|
|
||||||
You can use our unit tests to learn more about the %OpenMesh Python Bindings.
|
|
||||||
They are located in the src/Python/Unittests subdirectory.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\section python_cpp Python and C++
|
|
||||||
|
|
||||||
The interface of the Python Bindings is to a large extent identical to the
|
|
||||||
interface of the original C++ implementation of %OpenMesh. You should therefore
|
|
||||||
be able to use the C++ documentation as a reference for the Python Bindings. In
|
|
||||||
particular, the classes KernelT, PolyMeshT and TriMeshT provide a good overview
|
|
||||||
of the available mesh member functions. That being said, there are a number of
|
|
||||||
small differences. For example, whenever the C++ implementation returns a
|
|
||||||
reference to an object that is managed by %OpenMesh, the Python Bindings will
|
|
||||||
return a copy of that object. This is due to the fact that Python does not have
|
|
||||||
a language feature that is analogous to C++ references. One example of such a
|
|
||||||
function is the point() member function of the PolyMesh and TriMesh classes.
|
|
||||||
Unlike its C++ counterpart, the function does not return a reference to the
|
|
||||||
requested point. It instead returns a copy of the point. This implies that you
|
|
||||||
have to use the set_point() member function to change the value of a point. The
|
|
||||||
same applies to the following functions: normal(), color(), property(),
|
|
||||||
status(), etc.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<br>The complete source looks like this:
|
|
||||||
|
|
||||||
\include python_tutorial.py
|
|
||||||
|
|
||||||
|
|
||||||
**/
|
|
||||||
Reference in New Issue
Block a user