← Back to team overview

yade-dev team mailing list archive

[Branch ~yade-dev/yade/trunk] Rev 2067: 1. Doc fixes

 

------------------------------------------------------------
revno: 2067
committer: eudoxos <eudoxos@frigo>
branch nick: trunk
timestamp: Tue 2010-03-09 15:20:36 +0100
message:
  1. Doc fixes
  2. Change prototype for Funtor::getFunctor, since it doesn't seem to work from python now (perhaps it's that Functors don't inherit from Functor in python universe, actually?!)
  3. Fix some stuff with class indices for GenericSpheresContact. (It doesn't seem to help, though, either)
modified:
  core/Dispatcher.hpp
  pkg/dem/DataClass/InteractionGeometry/DemXDofGeom.hpp
  pkg/dem/DataClass/InteractionGeometry/ScGeom.hpp
  py/_packSpheres.cpp
  py/_utils.cpp
  py/log.cpp
  py/pack.py
  py/plot.py
  py/post2d.py
  py/timing.py
  py/utils.py
  py/yadeWrapper/yadeWrapper.cpp


--
lp:yade
https://code.launchpad.net/~yade-dev/yade/trunk

Your team Yade developers is subscribed to branch lp:yade.
To unsubscribe from this branch go to https://code.launchpad.net/~yade-dev/yade/trunk/+edit-subscription.
=== modified file 'core/Dispatcher.hpp'
--- core/Dispatcher.hpp	2010-02-09 16:50:30 +0000
+++ core/Dispatcher.hpp	2010-03-09 14:20:36 +0000
@@ -149,7 +149,7 @@
 		typedef FunctorType functorType;
 		typedef DynLibDispatcher<TYPELIST_1(baseClass),FunctorType,FunctorReturnType,FunctorArguments,autoSymmetry> dispatcherBase;
 
-		shared_ptr<FunctorType> getFunctor(shared_ptr<baseClass>& arg){ return getExecutor(arg); }
+		shared_ptr<FunctorType> getFunctor(shared_ptr<baseClass> arg){ return getExecutor(arg); }
 		python::dict dump(bool convertIndicesToNames){
 			python::dict ret;
 			FOREACH(const DynLibDispatcher_Item1D& item, dispatcherBase::dataDispatchMatrix1D()){
@@ -233,7 +233,7 @@
 		typedef baseClass2 argType2;
 		typedef FunctorType functorType;
 		typedef DynLibDispatcher<TYPELIST_2(baseClass1,baseClass2),FunctorType,FunctorReturnType,FunctorArguments,autoSymmetry> dispatcherBase;
-		shared_ptr<FunctorType> getFunctor(shared_ptr<baseClass1>& arg1, shared_ptr<baseClass2>& arg2){ return getExecutor(arg1,arg2); }
+		shared_ptr<FunctorType> getFunctor(shared_ptr<baseClass1> arg1, shared_ptr<baseClass2> arg2){ return getExecutor(arg1,arg2); }
 		python::dict dump(bool convertIndicesToNames){
 			python::dict ret;
 			FOREACH(const DynLibDispatcher_Item2D& item, dispatcherBase::dataDispatchMatrix2D()){

=== modified file 'pkg/dem/DataClass/InteractionGeometry/DemXDofGeom.hpp'
--- pkg/dem/DataClass/InteractionGeometry/DemXDofGeom.hpp	2010-02-18 21:08:54 +0000
+++ pkg/dem/DataClass/InteractionGeometry/DemXDofGeom.hpp	2010-03-09 14:20:36 +0000
@@ -6,12 +6,15 @@
 	created for the purposes of GlobalStiffnessTimeStepper.
 	It might be removed in the future. */
 class GenericSpheresContact: public InteractionGeometry{
-	YADE_CLASS_BASE_DOC_ATTRS(GenericSpheresContact,InteractionGeometry,
+	YADE_CLASS_BASE_DOC_ATTRS_CTOR(GenericSpheresContact,InteractionGeometry,
 		"Class uniting :yref:`ScGeom` and :yref:`Dem3DofGeom`, for the purposes of :yref:`GlobalStiffnessTimeStepper`. (It might be removed inthe future). Do not use this class directly.",
 		((Vector3r,normal,,"Unit vector oriented along the interaction. |yupdate|"))
 		((Real,refR1,,"Reference radius of particle #1. |ycomp|"))
-		((Real,refR2,,"Reference radius of particle #2. |ycomp|"))
+		((Real,refR2,,"Reference radius of particle #2. |ycomp|")),
+		createIndex();
 	);
+	REGISTER_CLASS_INDEX(GenericSpheresContact,InteractionGeometry);
+
 	virtual ~GenericSpheresContact(); // vtable
 };
 REGISTER_SERIALIZABLE(GenericSpheresContact);

=== modified file 'pkg/dem/DataClass/InteractionGeometry/ScGeom.hpp'
--- pkg/dem/DataClass/InteractionGeometry/ScGeom.hpp	2010-02-18 21:08:54 +0000
+++ pkg/dem/DataClass/InteractionGeometry/ScGeom.hpp	2010-03-09 14:20:36 +0000
@@ -40,7 +40,7 @@
 		/* ctor */ createIndex();,
 		/* py */
 	);
-	REGISTER_CLASS_INDEX(ScGeom,InteractionGeometry);
+	REGISTER_CLASS_INDEX(ScGeom,GenericSpheresContact);
 };
 REGISTER_SERIALIZABLE(ScGeom);
 

=== modified file 'py/_packSpheres.cpp'
--- py/_packSpheres.cpp	2010-03-01 12:58:22 +0000
+++ py/_packSpheres.cpp	2010-03-09 14:20:36 +0000
@@ -6,13 +6,13 @@
 BOOST_PYTHON_MODULE(_packSpheres){
 	python::scope().attr("__doc__")="Creation, manipulation, IO for generic sphere packings.";
 	YADE_SET_DOCSTRING_OPTS;
-	python::class_<SpherePack>("SpherePack","Set of spheres as centers and radii",python::init<python::optional<python::list> >(python::args("list"),"Empty constructor, optionally taking list [ ((cx,cy,cz),r), … ] for initial data." ))
+	python::class_<SpherePack>("SpherePack","Set of spheres represented as centers and radii. This class is returned by :yref:`yade.pack.randomDensePack`, :yref:`yade.pack.randomPeriPack` and others. The object supports iteration over spheres, as in \n\n\t>>> sp=SpherePack()\n\t>>> for center,radius in sp: print center,radius\n\n\t>>> for sphere in sp: print sphere[0],sphere[1]   ## same, but without unpacking the tuple automatically\n\n\t>>> for i in range(0,len(sp)): print sp[i][0], sp[i][1]   ## same, but accessing spheres by index\n",python::init<python::optional<python::list> >(python::args("list"),"Empty constructor, optionally taking list [ ((cx,cy,cz),r), … ] for initial data." ))
 		.def("add",&SpherePack::add,"Add single sphere to packing, given center as 3-tuple and radius")
 		.def("toList",&SpherePack::toList,"Return packing data as python list.")
 		.def("toList_pointsAsTuples",&SpherePack::toList_pointsAsTuples,"Return packing data as python list, but using only pure-python data types (3-tuples instead of Vector3) (for pickling with cPickle)")
 		.def("fromList",&SpherePack::fromList,"Make packing from given list, same format as for constructor. Discards current data.")
-		.def("load",&SpherePack::fromFile,"Load packing from external text file (current data will be discarded).")
-		.def("save",&SpherePack::toFile,"Save packing to external text file (will be overwritten).")
+		.def("load",&SpherePack::fromFile,(python::arg("fileName")),"Load packing from external text file (current data will be discarded).")
+		.def("save",&SpherePack::toFile,(python::arg("fileName")),"Save packing to external text file (will be overwritten).")
 		.def("fromSimulation",&SpherePack::fromSimulation,"Make packing corresponding to the current simulation. Discards current data.")
 			.def("makeCloud",&SpherePack::makeCloud,(python::arg("minCorner"),python::arg("maxCorner"),python::arg("rMean"),python::arg("rRelFuzz"),python::arg("num")=-1,python::arg("periodic")=false,python::arg("porosity")=-1),"Create random packing enclosed in box given by minCorner and maxCorner, containing num spheres. Returns number of created spheres, which can be < num if the packing is too tight. If porosity>0, recompute meanRadius (porosity>0.65 recommended) and try generating this porosity with num spheres.")
 		.def("aabb",&SpherePack::aabb_py,"Get axis-aligned bounding box coordinates, as 2 3-tuples.")

=== modified file 'py/_utils.cpp'
--- py/_utils.cpp	2010-02-26 23:29:53 +0000
+++ py/_utils.cpp	2010-03-09 14:20:36 +0000
@@ -425,28 +425,28 @@
 		def("convexHull2d",convexHull2d,"Return 2d convex hull of list of 2d points, as list of polygon vertices.");
 	#endif
 	def("coordsAndDisplacements",coordsAndDisplacements,coordsAndDisplacements_overloads(args("Aabb"),"Return tuple of 2 same-length lists for coordinates and displacements (coordinate minus reference coordinate) along given axis (1st arg); if the Aabb=((x_min,y_min,z_min),(x_max,y_max,z_max)) box is given, only bodies within this box will be considered."));
-	def("setRefSe3",setRefSe3,"Set reference positions and orientation of all bodies equal to their current ones.");
+	def("setRefSe3",setRefSe3,"Set reference :yref:`positions<State::refPos>` and :yref:`orientations<State::refOri>` of all :yref:`bodies<Body>` equal to their current :yref:`positions<State::pos>` and :yref:`orientations<State::ori>`.");
 	def("interactionAnglesHistogram",interactionAnglesHistogram,interactionAnglesHistogram_overloads(args("axis","mask","bins","aabb")));
 	def("bodyNumInteractionsHistogram",bodyNumInteractionsHistogram,bodyNumInteractionsHistogram_overloads(args("aabb")));
 	def("elasticEnergy",elasticEnergyInAABB);
-	def("inscribedCircleCenter",inscribedCircleCenter);
+	def("inscribedCircleCenter",inscribedCircleCenter,(python::arg("v1"),python::arg("v2"),python::arg("v3")),"Return center of inscribed circle for triangle given by its vertices *v1*, *v2*, *v3*.");
 	def("getViscoelasticFromSpheresInteraction",getViscoelasticFromSpheresInteraction);
 	def("unbalancedForce",&Shop::unbalancedForce,unbalancedForce_overloads(args("useMaxForce")));
 	def("kineticEnergy",Shop__kineticEnergy);
 	def("sumForces",sumForces);
 	def("sumTorques",sumTorques);
 	def("sumFacetNormalForces",sumFacetNormalForces,(python::arg("axis")=-1));
-	def("forcesOnPlane",forcesOnPlane);
+	def("forcesOnPlane",forcesOnPlane,(python::arg("planePt"),python::arg("normal")),"Find all interactions deriving from :yref:`NormShearPhys` that cross given plane and sum forces (both normal and shear) on them.\n\n:Parameters:\n\t`planePt`: Vector3\n\t\tAny point on the plane\n\t`normal`: Vector3\n\t\tPlane normal (may not be normalized).\n");
 	def("forcesOnCoordPlane",forcesOnCoordPlane);
 	def("totalForceInVolume",Shop__totalForceInVolume,"Return summed forces on all interactions and average isotropic stiffness, as tuple (Vector3,float)");
-	def("createInteraction",Shop__createExplicitInteraction);
+	def("createInteraction",Shop__createExplicitInteraction,(python::arg("id1"),python::arg("id2")),"Create interaction between given bodies by hand.\n\nCurrent engines are searched for :yref:`InteractionGeometryDispatcher` and :yref:`InteractionPhysicsDispatcher` (might be both hidden in :yref:`InteractionDispatchers`). Geometry is created using ``force`` parameter of the :yref:`geometry dispatcher<InteractionGeometryDispatcher>`, wherefore the interaction will exist even if bodies do not spatially overlap and the functor would return ``false`` under normal circumstances. \n\n.. warning::\n\tThis function will very likely behave incorrectly for periodic simulations (though it could be extended it to handle it farily easily).");
 	def("spiralProject",spiralProject,(python::arg("pt"),python::arg("dH_dTheta"),python::arg("axis")=2,python::arg("periodStart")=std::numeric_limits<Real>::quiet_NaN(),python::arg("theta0")=0));
 	def("pointInsidePolygon",pointInsidePolygon);
 	def("scalarOnColorScale",Shop::scalarOnColorScale);
-	def("highlightNone",highlightNone);
-	def("wireAll",wireAll);
-	def("wireNone",wireNone);
-	def("wireNoSpheres",wireNoSpheres);
+	def("highlightNone",highlightNone,"Reset :yref:`highlight<Shape::highlight>` on all bodies.");
+	def("wireAll",wireAll,"Set :yref:`Shape::wire` on all bodies to True, rendering them with wireframe only.");
+	def("wireNone",wireNone,"Set :yref:`Shape::wire` on all bodies to False, rendering them as solids.");
+	def("wireNoSpheres",wireNoSpheres,"Set :yref:`Shape::wire` to True on non-spherical bodies (:yref:`Facets<Facet>`, :yref:`Walls<Wall>`).");
 	def("flipCell",&Shop::flipCell,(python::arg("flip")=Matrix3r::ZERO));
 }
 

=== modified file 'py/log.cpp'
--- py/log.cpp	2009-11-29 11:03:25 +0000
+++ py/log.cpp	2010-03-09 14:20:36 +0000
@@ -1,6 +1,7 @@
 #include<boost/python.hpp>
 #include<string>
 #include<yade/lib-base/Logging.hpp>
+#include<yade/lib-pyutil/doc_opts.hpp>
 using namespace boost;
 enum{ll_TRACE,ll_DEBUG,ll_INFO,ll_WARN,ll_ERROR,ll_FATAL};
 
@@ -51,8 +52,11 @@
 
 BOOST_PYTHON_MODULE(log){
 	python::scope().attr("__doc__") = "Acess and manipulation of log4cxx loggers.";
-	python::def("setLevel",logSetLevel,"Set minimum severity level (constants TRACE,DEBUG,INFO,WARN,ERROR,FATAL) for given logger\nleading 'yade.' will be appended automatically to the logger name; if logger is '', the root logger 'yade' will be operated on.");
-	python::def("loadConfig",logLoadConfig,"Load configuration from file (log4cxx::PropertyConfigurator::configure)");
+
+	YADE_SET_DOCSTRING_OPTS;
+
+	python::def("setLevel",logSetLevel,(python::arg("logger"),python::arg("level")),"Set minimum severity *level* (constants ``TRACE``, ``DEBUG``, ``INFO``, ``WARN``, ``ERROR``, ``FATAL``) for given logger. \nLeading 'yade.' will be appended automatically to the logger name; if logger is '', the root logger 'yade' will be operated on.");
+	python::def("loadConfig",logLoadConfig,(python::arg("fileName")),"Load configuration from file (log4cxx::PropertyConfigurator::configure)");
 	python::scope().attr("TRACE")=(int)ll_TRACE;
 	python::scope().attr("DEBUG")=(int)ll_DEBUG;
 	python::scope().attr("INFO")= (int)ll_INFO;

=== modified file 'py/pack.py'
--- py/pack.py	2010-01-13 20:13:59 +0000
+++ py/pack.py	2010-03-09 14:20:36 +0000
@@ -1,16 +1,19 @@
 # encoding: utf-8
 # 2009 © Václav Šmilauer <eudoxos@xxxxxxxx>
+
 """
 Creating packings and filling volumes defined by boundary representation or constructive solid geometry.
 
 For examples, see
-	- scripts/test/gts-horse.py
-	- scripts/test/gts-operators.py
-	- scripts/test/gts-random-pack-obb.py
-	- scripts/test/gts-random-pack.py
-	- scripts/test/pack-cloud.py
-	- scripts/test/pack-predicates.py
-	- scripts/test/regular-sphere-pack.py
+
+* :ysrc:`scripts/test/gts-horse.py`
+* :ysrc:`scripts/test/gts-operators.py`
+* :ysrc:`scripts/test/gts-random-pack-obb.py`
+* :ysrc:`scripts/test/gts-random-pack.py`
+* :ysrc:`scripts/test/pack-cloud.py`
+* :ysrc:`scripts/test/pack-predicates.py`
+* :ysrc:`scripts/test/regular-sphere-pack.py`
+
 """
 
 import itertools,warnings
@@ -19,7 +22,8 @@
 from yade import utils
 
 from miniWm3Wrap import *
-from yade import *
+from yade.wrapper import *
+
 
 ## compatibility hack for python 2.5 (21/8/2009)
 ## can be safely removed at some point
@@ -58,9 +62,10 @@
 		surf=gts.read(open('horse.gts'))
 		inGtsSurface(surf)
 
-	Note: padding is optionally supported by testing 6 points along the axes in the pad distance. This
-	must be enabled in the ctor by saying doSlowPad=True. If it is not enabled and pad is not zero,
-	warning is issued.
+	.. note::
+		Padding is optionally supported by testing 6 points along the axes in the pad distance. This
+		must be enabled in the ctor by saying doSlowPad=True. If it is not enabled and pad is not zero,
+		warning is issued.
 	"""
 	def __init__(self,surf,noPad=False):
 		# call base class ctor; necessary for virtual methods to work as expected.

=== modified file 'py/plot.py'
--- py/plot.py	2010-02-02 12:26:33 +0000
+++ py/plot.py	2010-03-09 14:20:36 +0000
@@ -33,7 +33,7 @@
 
 
 plotDataCollector=None
-from yade import *
+from yade.wrapper import *
 
 # no longer used
 maxDataLen=1000

=== modified file 'py/post2d.py'
--- py/post2d.py	2010-01-24 16:27:40 +0000
+++ py/post2d.py	2010-03-09 14:20:36 +0000
@@ -54,7 +54,7 @@
  pylab.show()
 
 """
-from yade import *
+from yade.wrapper import *
 
 class Flatten:
 	"""Abstract class for converting 3d point into 2d. Used by post2d.data2d."""
@@ -71,11 +71,18 @@
 	"""Class converting 3d point to 2d based on projection from spiral.
 	The y-axis in the projection corresponds to the rotation axis"""
 	def __init__(self,useRef,thetaRange,dH_dTheta,axis=2,periodStart=0):
-		"""@param useRef: use reference positions rather than actual positions
-		@param thetaRange: (thetaMin,thetaMax) tuple; bodies outside this range will be discarded
-		@param dH_dTheta: inclination of the spiral (per radian)
-		@param axis: axis of rotation of the spiral
-		@param periodStart: height of the spiral for zero angle
+		"""
+		:parameters:
+			`useRef`: bool
+				use reference positions rather than actual positions
+			`thetaRange`: (thetaMin,thetaMax) tuple
+				bodies outside this range will be discarded
+			`dH_dTheta`:float
+				inclination of the spiral (per radian)
+			`axis`: {0,1,2}
+				axis of rotation of the spiral
+			`periodStart`: float
+				height of the spiral for zero angle
 		"""
 		self.useRef,self.thetaRange,self.dH_dTheta,self.axis,self.periodStart=useRef,thetaRange,dH_dTheta,axis,periodStart
 		self.ax1,self.ax2=(axis+1)%3,(axis+2)%3
@@ -102,8 +109,9 @@
 	The y-axis in the projection corresponds to the rotation axis; the x-axis is distance form the axis.
 	"""
 	def __init__(self,useRef,axis=2):
-		"""@param useRef: use reference positions rather than actual positions.
-		@param axis of the cylinder (0, 1 or 2)
+		"""
+		:param useRef: (bool) use reference positions rather than actual positions
+		:param axis: axis of the cylinder, ∈{0,1,2}
 		"""
 		if axis not in (0,1,2): raise IndexError("axis must be one of 0,1,2 (not %d)"%axis)
 		self.useRef,self.axis=useRef,axis
@@ -128,8 +136,13 @@
 
 class AxisFlatten(Flatten):
 	def __init__(self,useRef,axis=2):
-		"""@param useRef: use reference positions rather than actual positions.
-		@param axis: axis normal to the plane (0, 1 or 2); the return value will be simply position with this component dropped."""
+		"""
+		:parameters:
+			`useRef`: bool
+				use reference positions rather than actual positions.
+			`axis`: {0,1,2}
+				axis normal to the plane; the return value will be simply position with this component dropped.
+		"""
 		if axis not in (0,1,2): raise IndexError("axis must be one of 0,1,2 (not %d)"%axis)
 		self.useRef,self.axis=useRef,axis
 		self.ax1,self.ax2=(self.axis+1)%3,(self.axis+2)%3
@@ -146,18 +159,29 @@
 	return either discrete array of positions and values, or smoothed data, depending on whether the stDev
 	value is specified.
 
-	@param extractor: callable object that receives Body instance; it should return scalar, a 2-tuple (vector fields) or None (to skip that body)
-	@param flattener: callable object that receives Body instance and returns its 2d coordinates or None (to skip that body)
-	@param onlyDynamic: skip all non-dynamic bodies
-	@param stDev: standard deviation for averaging, enables smoothing; None (default) means raw mode.
-	@param relThreshold: threshold for the gaussian weight function relative to stDev (smooth mode only)
-	@param div: 2-tuple specifying number of cells for the gaussian grid (smooth mode only)
-	@param margin: 2-tuple specifying margin around bounding box for data (smooth mode only)
-	@return: Dictionary always containing keys 'type' (one of 'rawScalar','rawVector','smoothScalar','smoothVector', depending on value of smooth and on return value from extractor), 'x', 'y', 'bbox'.
-	
-		Raw data further contains 'radii'.
+	:parameters:
+		`extractor`: callable
+			receives Body instance, should return scalar, a 2-tuple (vector fields) or None (to skip that body)
+		`flattener`: callable
+			receives Body instance and returns its 2d coordinates or None (to skip that body)
+		`onlyDynamic`: bool
+			skip all non-dynamic bodies
+		`stDev`: float or *None*
+			standard deviation for averaging, enables smoothing; None (default) means raw mode.
+		`relThreshold`: float
+			threshold for the gaussian weight function relative to stDev (smooth mode only)
+		`div`: (int,int)
+			number of cells for the gaussian grid (smooth mode only)
+		`margin`: (float,float)
+			margin around bounding box for data (smooth mode only)
 
-		Scalar fields contain 'val' (value from extractor), vector fields have 'valX' and 'valY' (2 components returned by the extractor).
+	:return: dictionary
+	
+	Returned dictionary always containing keys 'type' (one of 'rawScalar','rawVector','smoothScalar','smoothVector', depending on value of smooth and on return value from extractor), 'x', 'y', 'bbox'.
+	
+	Raw data further contains 'radii'.
+	
+	Scalar fields contain 'val' (value from *extractor*), vector fields have 'valX' and 'valY' (2 components returned by the *extractor*).
 	"""
 	from miniWm3Wrap import Vector3
 	xx,yy,dd1,dd2,rr=[],[],[],[],[]
@@ -211,10 +235,15 @@
 
 	For vector data (raw or smooth), plot quiver (vector field), with arrows colored by the magnitude.
 
-	@param axes: matplotlib.axes instance to plot to; if None, will be created from scratch
-	@param data: return value from post2d.data
-	@param clabel: show contour labels (smooth mode only)
-	@return: tuple of (axes,mappable); mappable can be used in further calls to pylab.colorbar
+	:parameters:
+		`axes`: matplotlib.axes instance
+			axes where the figure will be plotted; if None, will be created from scratch.
+		`data`:
+			value returned by :yref:`yade.post2d.data`
+		`clable`: bool
+			show contour labels (smooth mode only)
+
+	:return: tuple of (axes,mappable); mappable can be used in further calls to pylab.colorbar.
 	"""
 	import pylab,math
 	if not axes: axes=pylab.gca()

=== modified file 'py/timing.py'
--- py/timing.py	2010-02-21 00:04:22 +0000
+++ py/timing.py	2010-03-09 14:20:36 +0000
@@ -1,10 +1,12 @@
 # encoding: utf-8
 # 2008 © Václav Šmilauer <eudoxos@xxxxxxxx>
 """Functions for accessing timing information stored in engines and functors.
-See https://yade.hmg.inpg.fr/index.php/Speed_profiling_using_TimingInfo_and_TimingDeltas_classes
-for more details on usage."""
-
-from yade import *
+
+See :ref:`timing` section of the programmer's manual, `wiki page <http://yade-dem.org/index.php/Speed_profiling_using_TimingInfo_and_TimingDeltas_classes>`_ for some examples.
+
+"""
+
+from yade.wrapper import *
 
 
 def _resetEngine(e):
@@ -67,8 +69,10 @@
 	return lines
 
 def stats():
-	"""Print summary table of timing information from engines and functors. Absolute times as well as percentages are given. Sample output::
-	
+	"""Print summary table of timing information from engines and functors. Absolute times as well as percentages are given. Sample output:
+
+	.. code-block:: none
+
 		Name                                                    Count                 Time            Rel. time
 		-------------------------------------------------------------------------------------------------------
 		ForceResetter                      400               9449μs                0.01%      
@@ -88,6 +92,7 @@
 		"plotDataCollector"                                 160              64284μs                0.06%      
 		"damageChecker"                                       9               3272μs                0.00%      
 		TOTAL                                                            102077490μs              100.00%      
+
 	"""
 	print 'Name'.ljust(_statCols['label'])+' '+'Count'.rjust(_statCols['count'])+' '+'Time'.rjust(_statCols['time'])+' '+'Rel. time'.rjust(_statCols['relTime'])
 	print '-'*(sum([_statCols[k] for k in _statCols])+len(_statCols)-1)

=== modified file 'py/utils.py'
--- py/utils.py	2010-03-01 12:58:22 +0000
+++ py/utils.py	2010-03-09 14:20:36 +0000
@@ -60,7 +60,7 @@
 
 def SpherePWaveTimeStep(radius,density,young):
 	r"""Compute P-wave critical timestep for a single (presumably representative) sphere, using formula for P-Wave propagation speed :math:`\Delta t_{c}=\frac{r}{\sqrt{E/\rho}}`.
-	If you want to compute minimum critical timestep for all spheres in the simulation, use utils.PWaveTimeStep() instead.
+	If you want to compute minimum critical timestep for all spheres in the simulation, use :yref:`yade.utils.PWaveTimeStep` instead.
 	
 	>>> SpherePWaveTimeStep(1e-3,2400,30e9)
 	2.8284271247461903e-07
@@ -177,7 +177,7 @@
 		`extents`: Vector3
 			half-sizes along x,y,z axes
 	
-	See utils.sphere's documentation for meaning of other parameters."""
+	See :yref:`yade.utils.sphere`'s documentation for meaning of other parameters."""
 	b=Body()
 	b.shape=Shape('Box',extents=extents,diffuseColor=color if color else randomColor(),wire=wire,highlight=highlight)
 	V=8*extents[0]*extents[1]*extents[2]
@@ -198,7 +198,7 @@
 		`sense`: ∈{-1,0,1}
 			sense in which to interact (0: both, -1: negative, +1: positive; see Wall reference documentation)
 
-	See utils.sphere's documentation for meaning of other parameters."""
+	See :yref:`yade.utils.sphere`'s documentation for meaning of other parameters."""
 	b=Body()
 	b.shape=Wall(sense=sense,axis=axis,diffuseColor=color if color else randomColor())
 	_commonBodySetup(b,0,Vector3(0,0,0),material)
@@ -218,7 +218,7 @@
 		`noBound`:
 			do not assign Body().bound
 	
-	See utils.sphere's documentation for meaning of other parameters."""
+	See :yref:`yade.utils.sphere`'s documentation for meaning of other parameters."""
 	b=Body()
 	center=inscribedCircleCenter(vertices[0],vertices[1],vertices[2])
 	vertices=Vector3(vertices[0])-center,Vector3(vertices[1])-center,Vector3(vertices[2])-center
@@ -230,11 +230,11 @@
 	b.dynamic=dynamic
 	return b
 
-def facetBox(center,extents,orientation=[1,0,0,0],wallMask=63,**kw):
+def facetBox(center,extents,orientation=Quaternion.IDENTITY,wallMask=63,**kw):
 	"""
 	Create arbitrarily-aligned box composed of facets, with given center, extents and orientation.
 	If any of the box dimensions is zero, corresponding facets will not be created. The facets are oriented outwards from the box.
-	Return list of facets forming the box;
+
 	
 	:Parameters:
 			`center`: Vector3
@@ -247,6 +247,8 @@
 				determines which walls will be created, in the order -x (1), +x (2), -y (4), +y (8), -z (16), +z (32). The numbers are ANDed; the default 63 means to create all walls;
 			`**kw`: (unused keyword arguments)
 				passed to utils.facet
+
+	:Returns: list of facets forming the box.
 	"""
 	
 	
@@ -455,7 +457,10 @@
 
 	:parameters:
 		`frameSpec`: wildcard | sequence of filenames
-			If string, wildcard in format understood by GStreamer's multifilesrc plugin (e.g. '/tmp/frame-%04d.png'). If list or tuple, filenames to be encoded in given order. B{Warning:} GStreamer is picky about the wildcard; if you pass a wrong one, if will not complain, but silently stall.
+			If string, wildcard in format understood by GStreamer's multifilesrc plugin (e.g. '/tmp/frame-%04d.png'). If list or tuple, filenames to be encoded in given order.
+			
+			.. warning::
+				GStreamer is picky about the wildcard; if you pass a wrong one, if will not complain, but silently stall.
 		`out`: filename
 			file to save video into
 		`renameNotOverwrite`: bool
@@ -601,6 +606,8 @@
 Empty lines within the file are ignored (although counted); ``#`` starts comment till the end of line. Number of blank-separated columns must be the same for all non-empty lines.
 
 A special value ``=`` can be used instead of parameter value; value from the previous non-empty line will be used instead (works recursively).
+
+This class is used by :yref:`yade.utils.readParamsFromTable`.
 	"""
 	def __init__(self,file):
 		"Setup the reader class, read data into memory."
@@ -676,7 +683,7 @@
 
 	Assigned tags:
 
-	* *description* column is assigned to Omega().tags['description']; this column is synthesized if absent (see :ref:`TableParamReader`)
+	* *description* column is assigned to Omega().tags['description']; this column is synthesized if absent (see :yref:`yade.utils.TableParamReader`)
 	* Omega().tags['params']="name1=val1,name2=val2,…"
 	* Omega().tags['defaultParams']="unassignedName1=defaultValue1,…"
 

=== modified file 'py/yadeWrapper/yadeWrapper.cpp'
--- py/yadeWrapper/yadeWrapper.cpp	2010-02-09 16:50:30 +0000
+++ py/yadeWrapper/yadeWrapper.cpp	2010-03-09 14:20:36 +0000
@@ -641,11 +641,6 @@
 	// expose indexable class, with access to the index
 	#define EXPOSE_CXX_CLASS_IX(className) EXPOSE_CXX_CLASS(className).add_property("dispIndex",&Indexable_getClassIndex<className>,"Return class index of this instance.").def("dispHierarchy",&Indexable_getClassIndices<className>,(python::arg("names")=true),"Return list of dispatch classes (from down upwards), starting with the class instance itself, top-level indexable at last. If names is true (default), return class names rather than numerical indices.")
 
-#if 0
-	EXPOSE_CXX_CLASS(FileGenerator)
-		.def("generate",&FileGenerator_generate,"Generate scene, save to file")
-		.def("load",&FileGenerator_load,"Generate scene, save to temporary file and load immediately");
-#endif
 	python::scope().attr("O")=pyOmega();
 }