[dia] PyDia inline API documentation overhaul



commit 8ab80c0955b4f2fe4178ae611935ed4310308d35
Author: Hans Breuer <hans breuer org>
Date:   Tue Nov 24 21:40:40 2009 +0100

    PyDia inline API documentation overhaul
    
    Now the PyDia API documentation should be almost complete including member documentation. There are two new modes in pydiadoc using it:
     - <Diagram>/Help/PyDia Update Docs: to update existing diagram preserving the layout
     - <Toolbox>/Help/PyDia HTML Docs: using the standard pydoc/help facility to export to $tmp/dia.html

 plug-ins/python/diamodule.c         |   36 +-
 plug-ins/python/pydia-color.c       |   45 +-
 plug-ins/python/pydia-cpoint.c      |   24 +-
 plug-ins/python/pydia-diagram.c     |  102 +++-
 plug-ins/python/pydia-diagramdata.c |   66 +++-
 plug-ins/python/pydia-display.c     |   64 ++-
 plug-ins/python/pydia-export.c      |   26 +-
 plug-ins/python/pydia-font.c        |   25 +-
 plug-ins/python/pydia-geometry.c    |  130 ++++--
 plug-ins/python/pydia-handle.c      |   32 ++-
 plug-ins/python/pydia-image.c       |   29 ++-
 plug-ins/python/pydia-layer.c       |   63 ++-
 plug-ins/python/pydia-object.c      |   93 +++-
 plug-ins/python/pydia-paperinfo.c   |   27 +-
 plug-ins/python/pydia-properties.c  |   23 +-
 plug-ins/python/pydia-property.c    |   26 +-
 plug-ins/python/pydia-text.c        |   29 ++-
 plug-ins/python/pydiadoc.py         |   83 +++-
 samples/Self/PyDiaObjects.dia       |  902 ++++++++++++++++++-----------------
 19 files changed, 1206 insertions(+), 619 deletions(-)
---
diff --git a/plug-ins/python/diamodule.c b/plug-ins/python/diamodule.c
index aa50c9e..4719c81 100644
--- a/plug-ins/python/diamodule.c
+++ b/plug-ins/python/diamodule.c
@@ -494,36 +494,44 @@ PyDia_Message (PyObject *self, PyObject *args)
 
 static PyMethodDef dia_methods[] = {
     { "group_create", PyDia_GroupCreate, METH_VARARGS,
-      "create a group containing the given list of dia.Object(s)" },
+      "group_create(List of Object: objs) -> Object."
+      "  Create a group containing the given list of dia.Object(s)" },
     { "diagrams", PyDia_Diagrams, METH_VARARGS,
-      "returns the list of currently open diagrams" },
+      "diagrams() -> List of Diagram.  Returns the list of currently open diagrams" },
     { "load", PyDia_Load, METH_VARARGS,
-      "loads a diagram from the given filename" },
+      "load(string: name) -> Diagram.  Loads a diagram from the given filename" },
     { "message", PyDia_Message, METH_VARARGS,
-      "popup a dialog with given message" },
+      "message(int: type, string: msg) -> None.  Popup a dialog with given message" },
     { "new", PyDia_New, METH_VARARGS,
-      "create an empty diagram" },
+      "new(string: name) -> Diagram.  Create an empty diagram" },
     { "get_object_type", PyDia_GetObjectType, METH_VARARGS,
-      "from a type name like \"Standard - Line\" return the factory to create objects of that type, see: DiaObjectType" },
+      "get_object_type(string: type) -> ObjectType."
+      "  From a type name like \"Standard - Line\" return the factory to create objects of that type, see: DiaObjectType" },
     { "registered_types", PyDia_RegisteredTypes, METH_VARARGS,
-      "a dictionary of all registered object factories, aka. DiaObjectType" },
+      "registered_types() -> Dict of ObjectType indexed by their name."
+      "  A dictionary of all registered object factories, aka. DiaObjectType" },
     { "active_display", PyDia_ActiveDisplay, METH_VARARGS,
-      "delivers the currently active display 'dia.Display' or None" },
+      "active_display() -> Display.  Delivers the currently active display 'dia.Display' or None" },
     { "update_all", PyDia_UpdateAll, METH_VARARGS,
-      "force a global update of all existing diagrams" },
+      "update_all() -> None.  Force an asynchronous update of all existing diagram displays" },
     { "register_export", PyDia_RegisterExport, METH_VARARGS,
-      "allows to register an export filter written in Python. It needs to conform to the DiaRenderer interface." },
+      "register_export(string: name, string: extension, Renderer: r) -> None."
+      "  Allows to register an export filter written in Python. It needs to conform to the DiaRenderer interface." },
     { "register_import", PyDia_RegisterImport, METH_VARARGS,
-      "allows to register an import filter written in Python, that is mainly a callback function which fills the"
+      "register_import(string: name, string: extension, Callback: func) -> None."
+      "  Allows to register an import filter written in Python, that is mainly a callback function which fills the"
       "given DiaDiagramData from the given filename" },
     { "register_callback", PyDia_RegisterCallback, METH_VARARGS,
-      "register a callback function which appears in the menu. Depending on the menu path used during registration"
+      "register_callback(string: description, string: menupath, Callback: func) -> None."
+      "  Register a callback function which appears in the menu. Depending on the menu path used during registration"
       "the callback gets called with the current DiaDiagramData object" },
     { "register_action", PyDia_RegisterAction, METH_VARARGS,
-      "register a callback function which appears in the menu. Depending on the menu path used during registration"
+      "register_action(string: action, string: description, string: menupath, Callback: func) -> None."
+      "  Register a callback function which appears in the menu. Depending on the menu path used during registration"
       "the callback gets called with the current DiaDiagramData object" },
     { "register_plugin", PyDia_RegisterPlugin, METH_VARARGS,
-      "registers a single plug-in given its filename" },
+      "register_plugin(string: filename) -> None."
+      "  Registers a single plug-in given its filename, that is load a dynamic module." },
     { NULL, NULL }
 };
 
diff --git a/plug-ins/python/pydia-color.c b/plug-ins/python/pydia-color.c
index 7bcf30d..5ac746c 100644
--- a/plug-ins/python/pydia-color.c
+++ b/plug-ins/python/pydia-color.c
@@ -22,6 +22,8 @@
 #include "pydia-object.h"
 #include "pydia-color.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 /*
  * New
  */
@@ -66,25 +68,6 @@ PyDiaColor_Hash(PyObject *self)
 }
 
 /*
- * GetAttr
- */
-static PyObject *
-PyDiaColor_GetAttr(PyDiaColor *self, gchar *attr)
-{
-  if (!strcmp(attr, "__members__"))
-    return Py_BuildValue("[sss]", "red", "green", "blue");
-  else if (!strcmp(attr, "red"))
-    return PyFloat_FromDouble(self->color.red);
-  else if (!strcmp(attr, "green"))
-    return PyFloat_FromDouble(self->color.green);
-  else if (!strcmp(attr, "blue"))
-    return PyFloat_FromDouble(self->color.blue);
-
-  PyErr_SetString(PyExc_AttributeError, attr);
-  return NULL;
-}
-
-/*
  * Repr / _Str
  */
 static PyObject *
@@ -100,6 +83,15 @@ PyDiaColor_Str(PyDiaColor *self)
   return py_s;
 }
 
+static PyMemberDef PyDiaColor_Members[] = {
+    { "red", T_DOUBLE, offsetof(PyDiaColor, color.red), 0,
+      "double: red color component [0 .. 1.0]" },
+    { "green", T_DOUBLE, offsetof(PyDiaColor, color.green), 0,
+      "double: green color component [0 .. 1.0]" },
+    { "blue", T_DOUBLE, offsetof(PyDiaColor, color.blue), 0,
+      "double: blue color component [0 .. 1.0]" },
+    { NULL }
+};
 /*
  * Python objetcs
  */
@@ -111,7 +103,7 @@ PyTypeObject PyDiaColor_Type = {
     0,
     (destructor)PyDiaColor_Dealloc,
     (printfunc)0,
-    (getattrfunc)PyDiaColor_GetAttr,
+    (getattrfunc)0,
     (setattrfunc)0,
     (cmpfunc)PyDiaColor_Compare,
     (reprfunc)0,
@@ -121,10 +113,19 @@ PyTypeObject PyDiaColor_Type = {
     (hashfunc)PyDiaColor_Hash,
     (ternaryfunc)0,
     (reprfunc)PyDiaColor_Str,
-    (getattrofunc)0,
+    PyObject_GenericGetAttr, /* tp_getattro */
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
     "A color either defined by a color string or by a tuple with three elements "
-    "(r, g, b) with type float 0.0 ... 1.0 or range int 0 ... 65535"
+    "(r, g, b) with type float 0.0 ... 1.0 or range int 0 ... 65535",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaColor_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-cpoint.c b/plug-ins/python/pydia-cpoint.c
index d69969c..edcf941 100644
--- a/plug-ins/python/pydia-cpoint.c
+++ b/plug-ins/python/pydia-cpoint.c
@@ -23,6 +23,8 @@
 #include "pydia-cpoint.h"
 #include "pydia-object.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 PyObject *
 PyDiaConnectionPoint_New(ConnectionPoint *cpoint)
 {
@@ -80,6 +82,17 @@ PyDiaConnectionPoint_GetAttr(PyDiaConnectionPoint *self, gchar *attr)
     return NULL;
 }
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->cpoint indirection */
+static PyMemberDef PyDiaConnectionPoint_Members[] = {
+    { "connected", T_INVALID, 0, RESTRICTED|READONLY,
+      "List of Object: read-only list of connected objects" },
+    { "object", T_INVALID, 0, RESTRICTED|READONLY,
+      "Object: the object owning this connection point" },
+    { "pos", T_INVALID, 0, RESTRICTED|READONLY,
+      "Point: read-only position of the connection point" },
+    { NULL }
+};
+
 PyTypeObject PyDiaConnectionPoint_Type = {
     PyObject_HEAD_INIT(&PyType_Type)
     0,
@@ -103,5 +116,14 @@ PyTypeObject PyDiaConnectionPoint_Type = {
     (PyBufferProcs *)0,
     0L, /* Flags */
     "One of the major features of Dia are connectable objects. They work by this type accesible "
-    "through dia.Object.connections[]."
+    "through dia.Object.connections[].",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaConnectionPoint_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-diagram.c b/plug-ins/python/pydia-diagram.c
index e925ace..f337b76 100644
--- a/plug-ins/python/pydia-diagram.c
+++ b/plug-ins/python/pydia-diagram.c
@@ -30,6 +30,8 @@
 #include "pydia-geometry.h"
 #include "pydia-color.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 #include "app/load_save.h"
 #include "app/connectionpoint_ops.h"
 
@@ -270,13 +272,13 @@ PyDiaDiagram_FindClosestConnectionPoint(PyDiaDiagram *self, PyObject *args)
     double dist;
     ConnectionPoint *cpoint;
     PyObject *ret;
-    PyDiaObject *obj;
+    PyDiaObject *obj = NULL;
 
-    if (!PyArg_ParseTuple(args, "ddO!:Diagram.find_closest_connectionpoint",
+    if (!PyArg_ParseTuple(args, "dd|O!:Diagram.find_closest_connectionpoint",
 			  &p.x, &p.y, PyDiaObject_Type, &obj))
 	return NULL;
     dist = diagram_find_closest_connectionpoint(self->dia, &cpoint, &p, 
-						obj->object);
+						obj ? obj->object : NULL);
     ret = PyTuple_New(2);
     PyTuple_SetItem(ret, 0, PyFloat_FromDouble(dist));
     if (cpoint)
@@ -465,30 +467,73 @@ PyDiaDiagram_ConnectAfter(PyDiaDiagram *self, PyObject *args)
 }
 
 static PyMethodDef PyDiaDiagram_Methods[] = {
-    {"select", (PyCFunction)PyDiaDiagram_Select, 1},
-    {"is_selected", (PyCFunction)PyDiaDiagram_IsSelected, 1},
-    {"unselect", (PyCFunction)PyDiaDiagram_Unselect, 1},
-    {"remove_all_selected", (PyCFunction)PyDiaDiagram_RemoveAllSelected, 1},
-    {"update_extents", (PyCFunction)PyDiaDiagram_UpdateExtents, 1},
-    {"get_sorted_selected", (PyCFunction)PyDiaDiagram_GetSortedSelected, 1},
+    {"select", (PyCFunction)PyDiaDiagram_Select, METH_VARARGS,
+     "select(Object: o) -> None.  Add the given object to the selection."},
+    {"is_selected", (PyCFunction)PyDiaDiagram_IsSelected, METH_VARARGS,
+     "is_selected(Object: o) -> bool.  True if the given object is already selected."},
+    {"unselect", (PyCFunction)PyDiaDiagram_Unselect, METH_VARARGS,
+     "unselect(Object: o) -> None.  Remove the given object from the selection)"},
+    {"remove_all_selected", (PyCFunction)PyDiaDiagram_RemoveAllSelected, METH_VARARGS,
+     "remove_all_selected() -> None.  Delete all selected objects."},
+    {"update_extents", (PyCFunction)PyDiaDiagram_UpdateExtents, METH_VARARGS,
+     "update_extents() -> None.  Force recaculation of the diagram extents."},
+    {"get_sorted_selected", (PyCFunction)PyDiaDiagram_GetSortedSelected, METH_VARARGS,
+     "get_sorted_selected() -> list.  Return the current selection sorted by Z-Order."},
     {"get_sorted_selected_remove",
-     (PyCFunction)PyDiaDiagram_GetSortedSelectedRemove, 1},
-    {"add_update", (PyCFunction)PyDiaDiagram_AddUpdate, 1},
-    {"add_update_all", (PyCFunction)PyDiaDiagram_AddUpdateAll, 1},
-    {"update_connections", (PyCFunction)PyDiaDiagram_UpdateConnections, 1},
-    {"flush", (PyCFunction)PyDiaDiagram_Flush, 1},
-    {"find_clicked_object", (PyCFunction)PyDiaDiagram_FindClickedObject, 1},
-    {"find_closest_handle", (PyCFunction)PyDiaDiagram_FindClosestHandle, 1},
+     (PyCFunction)PyDiaDiagram_GetSortedSelectedRemove, METH_VARARGS,
+     "get_sorted_selected_remove() -> list."
+     "  Return sorted selection and remove it from the diagram."},
+    {"add_update", (PyCFunction)PyDiaDiagram_AddUpdate, METH_VARARGS,
+     "add_update(real: top, real: left, real: bottom, real: right) -> None."
+     "  Add the given rectangle to the update queue."},
+    {"add_update_all", (PyCFunction)PyDiaDiagram_AddUpdateAll, METH_VARARGS,
+     "add_update_all() -> None.  Add the diagram visible area to the update queue."},
+    {"update_connections", (PyCFunction)PyDiaDiagram_UpdateConnections, METH_VARARGS,
+     "update_connections(Object: o) -> None."
+     "  Update all connections of the given object. Might move connected objects."},
+    {"flush", (PyCFunction)PyDiaDiagram_Flush, METH_VARARGS,
+     "flush() -> None.  If no display update is queued, queue update."},
+    {"find_clicked_object", (PyCFunction)PyDiaDiagram_FindClickedObject, METH_VARARGS,
+     "find_clicked_object(real[2]: point, real: distance) -> Object."
+     "  Find an object in the given distance of the given point."},
+    {"find_closest_handle", (PyCFunction)PyDiaDiagram_FindClosestHandle, METH_VARARGS,
+     "find_closest_handle(real[2]: point) -> (real: distance, Handle: h, Object: o)."
+     "  Find the closest handle from point and return a tuple of the search results. "
+     " Handle and Object might be None."},
     {"find_closest_connectionpoint",
-     (PyCFunction)PyDiaDiagram_FindClosestConnectionPoint, 1},
-    {"group_selected", (PyCFunction)PyDiaDiagram_GroupSelected, 1},
-    {"ungroup_selected", (PyCFunction)PyDiaDiagram_UngroupSelected, 1},
-    {"save", (PyCFunction)PyDiaDiagram_Save, 1},
-    {"display", (PyCFunction)PyDiaDiagram_Display, 1},
-    {"connect_after", (PyCFunction)PyDiaDiagram_ConnectAfter, 1},
+     (PyCFunction)PyDiaDiagram_FindClosestConnectionPoint, METH_VARARGS,
+     "find_closest_connectionpoint(real: x, real: y[, Object: o]) -> (real: dist, ConnectionPoint: cp)."
+     "  Given a point and an optional object to exclude, return the distance and closest connection point or None."},
+    {"group_selected", (PyCFunction)PyDiaDiagram_GroupSelected, METH_VARARGS,
+     "group_selected() -> None.  Turn the current selection into a group object."},
+    {"ungroup_selected", (PyCFunction)PyDiaDiagram_UngroupSelected, METH_VARARGS,
+     "ungroup_selected() -> None.  Split all groups in the current selection into single objects."},
+    {"save", (PyCFunction)PyDiaDiagram_Save, METH_VARARGS,
+     "save(string: filename) -> None.  Save the diagram under the given filename."},
+    {"display", (PyCFunction)PyDiaDiagram_Display, METH_VARARGS,
+     "display() -> Display.  Create a new display of the diagram."},
+    {"connect_after", (PyCFunction)PyDiaDiagram_ConnectAfter, METH_VARARGS,
+     "connect_after(string: signal_name, Callback: func) -> None.  Listen to diagram events in ['removed', 'selection_changed']."},
     {NULL, 0, 0, NULL}
 };
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->handle indirection */
+static PyMemberDef PyDiaDiagram_Members[] = {
+    { "data", T_INVALID, 0, RESTRICTED|READONLY, /* can't allow direct access due to pyobject->dia indirection */
+      "Backward-compatible base-class access" },
+    { "displays", T_INVALID, 0, RESTRICTED|READONLY,
+      "The list of current displays of this diagram." },
+    { "filename", T_INVALID, 0, RESTRICTED|READONLY,
+      "Filename in utf-8 encoding." },
+    { "modified", T_INVALID, 0, RESTRICTED|READONLY,
+      "Modification state." },
+    { "selected", T_INVALID, 0, RESTRICTED|READONLY,
+      "The current object selection." },
+    { "unsaved", T_INVALID, 0, RESTRICTED|READONLY,
+      "True if the diagram was not saved yet." },
+    { NULL }
+};
+
 static PyObject *
 PyDiaDiagram_GetAttr(PyDiaDiagram *self, gchar *attr)
 {
@@ -497,7 +542,7 @@ PyDiaDiagram_GetAttr(PyDiaDiagram *self, gchar *attr)
 			     "data", "displays", "filename",
 			     "modified", "selected", "unsaved");
     else if (!strcmp(attr, "data"))
-      return PyDiaDiagramData_New (self->dia->data);
+        return PyDiaDiagramData_New (self->dia->data);
     else if (!strcmp(attr, "filename"))
 	return PyString_FromString(self->dia->filename);
     else if (!strcmp(attr, "unsaved"))
@@ -548,5 +593,14 @@ PyTypeObject PyDiaDiagram_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "Subclass of dia.DiagramData (at least in the C implmentation) adding interfacing the GUI elements."
+    "Subclass of dia.DiagramData (at least in the C implementation) adding interfacing the GUI elements.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    PyDiaDiagram_Methods, /* tp_methods */
+    PyDiaDiagram_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-diagramdata.c b/plug-ins/python/pydia-diagramdata.c
index 8e5722d..250bedd 100644
--- a/plug-ins/python/pydia-diagramdata.c
+++ b/plug-ins/python/pydia-diagramdata.c
@@ -28,6 +28,8 @@
 #include "pydia-color.h"
 #include "pydia-paperinfo.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 #include "app/diagram.h"
 
 PyObject *
@@ -178,7 +180,7 @@ PyDiaDiagramData_DeleteLayer(PyDiaDiagramData *self, PyObject *args)
     return Py_None;
 }
 
-/* 
+/*! 
  *  Callback for "object_add" and "object_remove "signal, used by the connect_after method,
  *  it's a proxy for the python function, creating the values it needs.
  *  Params are those of the signals on the Diagram object.
@@ -287,17 +289,52 @@ PyDiaDiagramData_ConnectAfter(PyDiaDiagramData *self, PyObject *args)
 
 
 static PyMethodDef PyDiaDiagramData_Methods[] = {
-    {"update_extents", (PyCFunction)PyDiaDiagramData_UpdateExtents, 1},
-    {"get_sorted_selected", (PyCFunction)PyDiaDiagramData_GetSortedSelected, 1},
-    {"add_layer", (PyCFunction)PyDiaDiagramData_AddLayer, 1},
-    {"raise_layer", (PyCFunction)PyDiaDiagramData_RaiseLayer, 1},
-    {"lower_layer", (PyCFunction)PyDiaDiagramData_LowerLayer, 1},
-    {"set_active_layer", (PyCFunction)PyDiaDiagramData_SetActiveLayer, 1},
-    {"delete_layer", (PyCFunction)PyDiaDiagramData_DeleteLayer, 1},
-    {"connect_after", (PyCFunction)PyDiaDiagramData_ConnectAfter, 1},
+    {"update_extents", (PyCFunction)PyDiaDiagramData_UpdateExtents, METH_VARARGS,
+     "update_extents() -> None.  Recalculation of the diagram extents."},
+    {"get_sorted_selected", (PyCFunction)PyDiaDiagramData_GetSortedSelected, METH_VARARGS,
+     "get_sorted_selected() -> list.  Return the current selection sorted by Z-Order."},
+    {"add_layer", (PyCFunction)PyDiaDiagramData_AddLayer, METH_VARARGS,
+     "add_layer(Layer: layer[, int: position]) -> Layer."
+     "  Add a layer to the diagram at the top or the given position counting from bottom."},
+    {"raise_layer", (PyCFunction)PyDiaDiagramData_RaiseLayer, METH_VARARGS,
+     "raise_layer() -> None.  Move the layer towards the top."},
+    {"lower_layer", (PyCFunction)PyDiaDiagramData_LowerLayer, METH_VARARGS,
+     "lower_layer() -> None.  Move the layer towards the bottom."},
+    {"set_active_layer", (PyCFunction)PyDiaDiagramData_SetActiveLayer, METH_VARARGS,
+     "set_active_layer(Layer: layer) -> None.  Make the given layer the active one."},
+    {"delete_layer", (PyCFunction)PyDiaDiagramData_DeleteLayer, METH_VARARGS,
+     "delete_layer(Layer: layer) -> None.  Remove the given layer from the diagram."},
+    {"connect_after", (PyCFunction)PyDiaDiagramData_ConnectAfter, METH_VARARGS,
+     "connect_after(string: signal_name, Callback: func) -> None."
+     "  Listen to diagram events in ['object_add', 'object_remove']."},
     {NULL, 0, 0, NULL}
 };
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->data indirection */
+static PyMemberDef PyDiaDiagramData_Members[] = {
+    { "extents", T_INVALID, 0, RESTRICTED|READONLY,
+      "Rectangle covering all object's bounding boxes." },
+    { "bg_color", T_INVALID, 0, RESTRICTED|READONLY,
+      "Color of the diagram's background."},
+    { "paper", T_INVALID, 0, RESTRICTED|READONLY,
+      "Paperinfo of the diagram."},
+    { "layers", T_INVALID, 0, RESTRICTED|READONLY,
+      "Read-only list of the diagrams layers."},
+    { "active_layer", T_INVALID, 0, RESTRICTED|READONLY,
+      "Layer currently active in the diagram."},
+    { "grid_width", T_INVALID, 0, RESTRICTED|READONLY,
+      "Tuple(real: x, real: y) : describing the grid size."},
+    { "grid_visible", T_INVALID, 0, RESTRICTED|READONLY,
+      "bool: visibility of the grid."},
+    { "hguides", T_INVALID, 0, RESTRICTED|READONLY,
+      "List of real: horizontal guides."},
+    { "vguides", T_INVALID, 0, RESTRICTED|READONLY,
+      "List of real: vertical guides."},
+    { "selected", T_INVALID, 0, RESTRICTED|READONLY,
+      "List of Object: current selection."},
+    { NULL }
+};
+
 static PyObject *
 PyDiaDiagramData_GetAttr(PyDiaDiagramData *self, gchar *attr)
 {
@@ -399,5 +436,14 @@ PyTypeObject PyDiaDiagramData_Type = {
     0L, /* Flags */
     "The 'low level' diagram object. It contains everything to manipulate diagrams from im- and export "
     "filters as well as from the UI. It does not provide any access to GUI elements related to the diagram."
-    "Use the subclass dia.Diagram object for such matters."
+    "Use the subclass dia.Diagram object for such matters.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    PyDiaDiagramData_Methods, /* tp_methods */
+    PyDiaDiagramData_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-display.c b/plug-ins/python/pydia-display.c
index 2ff597b..1e8b063 100644
--- a/plug-ins/python/pydia-display.c
+++ b/plug-ins/python/pydia-display.c
@@ -23,6 +23,8 @@
 #include "pydia-diagram.h"
 #include "pydia-object.h" /* for PyObject_HEAD_INIT */
 
+#include <structmember.h> /* PyMemberDef */
+
 PyObject *
 PyDiaDisplay_New(DDisplay *disp)
 {
@@ -195,21 +197,48 @@ PyDiaDisplay_ScrollRight(PyDiaDisplay *self, PyObject *args)
 }
 
 static PyMethodDef PyDiaDisplay_Methods[] = {
-    {"add_update_all", (PyCFunction)PyDiaDisplay_AddUpdateAll, 1},
-    {"flush", (PyCFunction)PyDiaDisplay_Flush, 1},
-    {"set_origion", (PyCFunction)PyDiaDisplay_SetOrigion, 1},
-    {"zoom", (PyCFunction)PyDiaDisplay_Zoom, 1},
-    {"resize_canvas", (PyCFunction)PyDiaDisplay_ResizeCanvas, 1},
-    {"close", (PyCFunction)PyDiaDisplay_Close, 1},
-    {"set_title", (PyCFunction)PyDiaDisplay_SetTitle, 1},
-    {"scroll", (PyCFunction)PyDiaDisplay_Scroll, 1},
-    {"scroll_up", (PyCFunction)PyDiaDisplay_ScrollUp, 1},
-    {"scroll_down", (PyCFunction)PyDiaDisplay_ScrollDown, 1},
-    {"scroll_left", (PyCFunction)PyDiaDisplay_ScrollLeft, 1},
-    {"scroll_right", (PyCFunction)PyDiaDisplay_ScrollRight, 1},
+    {"add_update_all", (PyCFunction)PyDiaDisplay_AddUpdateAll, METH_VARARGS,
+     "add_update_all() -> None.  Add the diagram visible area to the update queue."},
+    {"flush", (PyCFunction)PyDiaDisplay_Flush, METH_VARARGS,
+     "flush() -> None.  If no display update is queued, queue update."},
+    {"set_origion", (PyCFunction)PyDiaDisplay_SetOrigion, METH_VARARGS,
+     "set_origion(real: x, real, y) -> None."
+     "  Move the given diagram point to the top-left corner of the visible area."},
+    {"zoom", (PyCFunction)PyDiaDisplay_Zoom, METH_VARARGS,
+     "zoom(real[2]: point, real: factor) -> None.  Zoom around the given point."},
+    {"resize_canvas", (PyCFunction)PyDiaDisplay_ResizeCanvas, METH_VARARGS,
+     "resize_canvas(int: width, int: height) -> None."
+     "  BEWARE: Changing the drawing area but not the window size."},
+    {"close", (PyCFunction)PyDiaDisplay_Close, METH_VARARGS,
+     "close() -> None.  Close the display possibly asking to save."},
+    {"set_title", (PyCFunction)PyDiaDisplay_SetTitle, METH_VARARGS,
+     "set_title(string: title) -> None.  Temporary change of the diagram title."},
+    {"scroll", (PyCFunction)PyDiaDisplay_Scroll, METH_VARARGS,
+     "scroll(real: dx, real: dy) -> None.  Scroll the visible area by the given delta."},
+    {"scroll_up", (PyCFunction)PyDiaDisplay_ScrollUp, METH_VARARGS,
+     "scroll_up() -> None. Scroll upwards by a fixed amount."},
+    {"scroll_down", (PyCFunction)PyDiaDisplay_ScrollDown, METH_VARARGS,
+     "scroll_down() -> None. Scroll downwards by a fixed amount."},
+    {"scroll_left", (PyCFunction)PyDiaDisplay_ScrollLeft, METH_VARARGS,
+     "scroll_left() -> None. Scroll to the left by a fixed amount."},
+    {"scroll_right", (PyCFunction)PyDiaDisplay_ScrollRight, METH_VARARGS,
+     "scroll_right() -> None. Scroll to the right by a fixed amount."},
     {NULL, 0, 0, NULL}
 };
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->data indirection */
+static PyMemberDef PyDiaDisplay_Members[] = {
+    { "diagram", T_INVALID, 0, RESTRICTED|READONLY, /* can't allow direct access due to pyobject->disp indirection */
+      "Diagram displayed." },
+    { "origin", T_INVALID, 0, RESTRICTED|READONLY,
+      "Point in diagram coordinates of the top-left corner of the visible area."},
+    { "zoom_factor", T_INVALID, 0, RESTRICTED|READONLY,
+      "Real: zoom-factor"},
+    { "visible", T_INVALID, 0, RESTRICTED|READONLY,
+      "Tuple(real: top, real: left, real: bottom, real: right) : visible area"},
+    { NULL }
+};
+
 static PyObject *
 PyDiaDisplay_GetAttr(PyDiaDisplay *self, gchar *attr)
 {
@@ -254,5 +283,14 @@ PyTypeObject PyDiaDisplay_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "A Diagram can have multiple displays but every Display has just one Diagram."
+    "A Diagram can have multiple displays but every Display has just one Diagram.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    PyDiaDisplay_Methods, /* tp_methods */
+    PyDiaDisplay_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-export.c b/plug-ins/python/pydia-export.c
index 178cfc7..04fe377 100644
--- a/plug-ins/python/pydia-export.c
+++ b/plug-ins/python/pydia-export.c
@@ -22,6 +22,8 @@
 #include "pydia-object.h"
 #include "pydia-export.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 PyObject *
 PyDiaExportFilter_New(DiaExportFilter *filter)
 {
@@ -68,13 +70,24 @@ static PyMethodDef PyDiaExportFilter_Methods[] = {
     {NULL, 0, 0, NULL}
 };
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->data indirection */
+static PyMemberDef PyDiaExportFilter_Members[] = {
+    { "name", T_INVALID, 0, RESTRICTED|READONLY,
+      "The description for the filter." },
+    { "unique_name", T_INVALID, 0, RESTRICTED|READONLY,
+      "A uniqe name within filters to allow disambiguation.", },
+    { NULL }
+};
+
 static PyObject *
 PyDiaExportFilter_GetAttr(PyDiaExportFilter *self, gchar *attr)
 {
     if (!strcmp(attr, "__members__"))
-	return Py_BuildValue("[s]", "name");
+	return Py_BuildValue("[ss]", "name");
     else if (!strcmp(attr, "name"))
 	return PyString_FromString(self->filter->description);
+    else if (!strcmp(attr, "unique_name"))
+	return PyString_FromString(self->filter->unique_name);
 
     return Py_FindMethod(PyDiaExportFilter_Methods, (PyObject *)self, attr);
 }
@@ -101,5 +114,14 @@ PyTypeObject PyDiaExportFilter_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "returned by dia.register_export() but not used otherwise yet."
+    "returned by dia.register_export() but not used otherwise yet.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    PyDiaExportFilter_Methods, /* tp_methods */
+    PyDiaExportFilter_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-font.c b/plug-ins/python/pydia-font.c
index 8b25515..21e2ef8 100644
--- a/plug-ins/python/pydia-font.c
+++ b/plug-ins/python/pydia-font.c
@@ -22,6 +22,8 @@
 #include "pydia-object.h"
 #include "pydia-font.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 /*
  * New
  */
@@ -121,10 +123,19 @@ PyDiaFont_Str(PyDiaFont *self)
   return ret;
 }
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->cpoint indirection */
+static PyMemberDef PyDiaFont_Members[] = {
+    { "family", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: family name of the font" },
+    { "name", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: legacy name of the font" },
+    { "style", T_INVALID, 0, RESTRICTED|READONLY,
+      "int: style flags" },
+    { NULL }
+};
 /*
  * Python objetc
  */
-
 PyTypeObject PyDiaFont_Type = {
     PyObject_HEAD_INIT(&PyType_Type)
     0,
@@ -147,6 +158,14 @@ PyTypeObject PyDiaFont_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "Provides access to the some objects font property."
+    "Provides access to some objects font property.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaFont_Members, /* tp_members */
+    0
 };
-
diff --git a/plug-ins/python/pydia-geometry.c b/plug-ins/python/pydia-geometry.c
index a7504c0..bb31eb8 100644
--- a/plug-ins/python/pydia-geometry.c
+++ b/plug-ins/python/pydia-geometry.c
@@ -22,6 +22,7 @@
 #include "pydia-object.h"
 #include "pydia-geometry.h"
 
+#include <structmember.h> /* PyMemberDef */
 
 /* Implements wrappers for Point, Rectangle, IntRectangle, BezPoint */
 
@@ -187,23 +188,6 @@ PyDiaGeometry_Hash(PyObject *self)
     return (long)self;
 }
 
-/*
- * GetAttr
- */
-static PyObject *
-PyDiaPoint_GetAttr(PyDiaPoint *self, gchar *attr)
-{
-  if (!strcmp(attr, "__members__"))
-    return Py_BuildValue("[ss]", "x", "y");
-  else if (!strcmp(attr, "x"))
-    return PyFloat_FromDouble(self->pt.x);
-  else if (!strcmp(attr, "y"))
-    return PyFloat_FromDouble(self->pt.y);
-
-  PyErr_SetString(PyExc_AttributeError, attr);
-  return NULL;
-}
-
 static PyObject *
 PyDiaRectangle_GetAttr(PyDiaRectangle *self, gchar *attr)
 {
@@ -246,22 +230,6 @@ PyDiaBezPoint_GetAttr(PyDiaBezPoint *self, gchar *attr)
   return NULL;
 }
 
-static PyObject *
-PyDiaArrow_GetAttr(PyDiaArrow *self, gchar *attr)
-{
-  if (!strcmp(attr, "__members__"))
-    return Py_BuildValue("[sss]", "type", "width", "length");
-  else if (!strcmp(attr, "type"))
-    return PyInt_FromLong(self->arrow.type);
-  else if (!strcmp(attr, "width"))
-    return PyFloat_FromDouble(self->arrow.width);
-  else if (!strcmp(attr, "length"))
-    return PyFloat_FromDouble(self->arrow.length);
-
-  PyErr_SetString(PyExc_AttributeError, attr);
-  return NULL;
-}
-
 /*
  * SetAttr
  */
@@ -360,8 +328,8 @@ static PyObject *
 point_item(PyDiaPoint* self, int i)
 {
   switch (i) {
-  case 0 : return PyDiaPoint_GetAttr(self, "x");
-  case 1 : return PyDiaPoint_GetAttr(self, "y");
+  case 0 : return PyFloat_FromDouble(self->pt.x);
+  case 1 : return PyFloat_FromDouble(self->pt.y);
   default :
     PyErr_SetString(PyExc_IndexError, "PyDiaPoint index out of range");
     return NULL;
@@ -448,6 +416,13 @@ static PySequenceMethods rect_as_sequence = {
 	(objobjproc)0 /*sq_contains*/
 };
 
+static PyMemberDef PyDiaPoint_Members[] = {
+    { "x", T_DOUBLE, offsetof(PyDiaPoint, pt.x), 0,
+      "double: coordinate horizontal part" },
+    { "y", T_DOUBLE, offsetof(PyDiaPoint, pt.y), 0,
+      "double: coordinate vertical part" },
+    { NULL }
+};
 /*
  * Python objetcs
  */
@@ -459,7 +434,7 @@ PyTypeObject PyDiaPoint_Type = {
     0,
     (destructor)PyDiaGeometry_Dealloc,
     (printfunc)0,
-    (getattrfunc)PyDiaPoint_GetAttr,
+    (getattrfunc)0,
     (setattrfunc)0,
     (cmpfunc)PyDiaPoint_Compare,
     (reprfunc)0,
@@ -469,13 +444,33 @@ PyTypeObject PyDiaPoint_Type = {
     (hashfunc)PyDiaGeometry_Hash,
     (ternaryfunc)0,
     (reprfunc)PyDiaPoint_Str,
-    (getattrofunc)0,
+    PyObject_GenericGetAttr, /* tp_getattro */
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "The dia.Point does not only provide access trough it's members but also via a sequence interface."
+    "The dia.Point does not only provide access trough it's members but also via a sequence interface.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaPoint_Members, /* tp_members */
+    0
+};
+#define T_INVALID -1 /* can't allow direct access due to pyobject->is_int */
+static PyMemberDef PyDiaRect_Members[] = {
+    { "top", T_INVALID, 0, RESTRICTED|READONLY,
+      "int or double: upper edge y coordinate" },
+    { "left", T_INVALID, 0, RESTRICTED|READONLY,
+      "int or double: left edge x coordinate" },
+    { "bottom", T_INVALID, 0, RESTRICTED|READONLY,
+      "int or double: lower edge y coordinate" },
+    { "right", T_INVALID, 0, RESTRICTED|READONLY,
+      "int or double: right edge x coordinate" },
+    { NULL }
 };
-
 PyTypeObject PyDiaRectangle_Type = {
     PyObject_HEAD_INIT(&PyType_Type)
     0,
@@ -498,9 +493,29 @@ PyTypeObject PyDiaRectangle_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "The dia.Rectangle does not only provide access trough it's members but also via a sequence interface."
+    "The dia.Rectangle does not only provide access trough it's members but also via a sequence interface.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaRect_Members, /* tp_members */
+    0
 };
 
+static PyMemberDef PyDiaBezPoint_Members[] = {
+    { "type", T_INT, offsetof(PyDiaBezPoint, bpn.type), 0,
+      "int: MOVETO, LINETO using p1 only;  CURVETO all 3 points" },
+    { "p1", T_INVALID, offsetof(PyDiaBezPoint, bpn.p1), 0, /* T_INVALID for Python not knowing Point */
+      "Point: first control point for CURVETO" },
+    { "p2", T_INVALID, offsetof(PyDiaBezPoint, bpn.p2), 0,
+      "Point: second control point for CURVETO" },
+    { "p3", T_INVALID, offsetof(PyDiaBezPoint, bpn.p3), 0,
+      "Point: target point for CURVETO" },
+    { NULL }
+};
 PyTypeObject PyDiaBezPoint_Type = {
     PyObject_HEAD_INIT(&PyType_Type)
     0,
@@ -523,9 +538,27 @@ PyTypeObject PyDiaBezPoint_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "A dia.Point, a bezier type and two control points (dia.Point) make a bezier point."
+    "A dia.Point, a bezier type and two control points (dia.Point) make a bezier point.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaBezPoint_Members, /* tp_members */
+    0
 };
 
+static PyMemberDef PyDiaArrow_Members[] = {
+    { "type", T_INT, offsetof(PyDiaArrow, arrow.type), 0,
+      "int: the shape of the arrow" },
+    { "width", T_DOUBLE, offsetof(PyDiaPoint, pt.x), 0,
+      "double: corresponding to line width" },
+    { "length", T_DOUBLE, offsetof(PyDiaPoint, pt.y), 0,
+      "double: length along the line" },
+    { NULL }
+};
 PyTypeObject PyDiaArrow_Type = {
     PyObject_HEAD_INIT(&PyType_Type)
     0,
@@ -534,7 +567,7 @@ PyTypeObject PyDiaArrow_Type = {
     0,
     (destructor)PyDiaGeometry_Dealloc,
     (printfunc)0,
-    (getattrfunc)PyDiaArrow_GetAttr,
+    (getattrfunc)0,
     (setattrfunc)0,
     (cmpfunc)PyDiaArrow_Compare,
     (reprfunc)0,
@@ -544,9 +577,18 @@ PyTypeObject PyDiaArrow_Type = {
     (hashfunc)PyDiaGeometry_Hash,
     (ternaryfunc)0,
     (reprfunc)PyDiaArrow_Str,
-    (getattrofunc)0,
+    PyObject_GenericGetAttr, /* tp_getattro */
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "Dia's line objects usually ends with an dia.Arrow"
+    "Dia's line objects usually ends with an dia.Arrow",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaArrow_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-handle.c b/plug-ins/python/pydia-handle.c
index 08646ea..4c84d7d 100644
--- a/plug-ins/python/pydia-handle.c
+++ b/plug-ins/python/pydia-handle.c
@@ -24,6 +24,8 @@
 #include "pydia-geometry.h"
 #include "pydia-object.h" /* for PyObject_HEAD_INIT */
 
+#include <structmember.h> /* PyMemberDef */
+
 PyObject *
 PyDiaHandle_New(Handle *handle, DiaObject *owner)
 {
@@ -83,10 +85,27 @@ PyDiaHandle_Connect(PyDiaHandle *self, PyObject *args)
 }
 
 static PyMethodDef PyDiaHandle_Methods[] = {
-    { "connect", (PyCFunction)PyDiaHandle_Connect, 1 },
+    { "connect", (PyCFunction)PyDiaHandle_Connect, METH_VARARGS, 
+      "connect(ConnectionPoint: cp) -> None."
+      "  Connect object A's handle with object B's connection point. To disconnect a handle pass in None." },
     { NULL, 0, 0, NULL }
 };
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->handle indirection */
+static PyMemberDef PyDiaHandle_Members[] = {
+    { "connect_type", T_INVALID, 0, RESTRICTED|READONLY,
+      "NONCONNECTABLE=0." },
+    { "connected_to", T_INVALID, 0, RESTRICTED|READONLY,
+      "The connected ConnectionPoint object or None." },
+    { "id", T_INVALID, 0, RESTRICTED|READONLY,
+      "Can be used to derive preferred directions from it." },
+    { "pos", T_INVALID, 0, RESTRICTED|READONLY,
+      "The position of the connection point." },
+    { "type", T_INVALID, 0, RESTRICTED|READONLY,
+      "NON_MOVABLE=0, MAJOR_CONTROL=1, MINOR_CONTROL=2" },
+    { NULL }
+};
+
 static PyObject *
 PyDiaHandle_GetAttr(PyDiaHandle *self, gchar *attr)
 {
@@ -133,5 +152,14 @@ PyTypeObject PyDiaHandle_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "A handle is used to connect objects or for object resizing."
+    "A handle is used to connect objects or for object resizing.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    PyDiaHandle_Methods, /* tp_methods */
+    PyDiaHandle_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-image.c b/plug-ins/python/pydia-image.c
index 0ae84c2..c4bc805 100644
--- a/plug-ins/python/pydia-image.c
+++ b/plug-ins/python/pydia-image.c
@@ -22,6 +22,8 @@
 #include "pydia-object.h"
 #include "pydia-image.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 /*
  * New
  */
@@ -134,6 +136,22 @@ PyDiaImage_Str(PyDiaImage *self)
   return py_s;
 }
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->cpoint indirection */
+static PyMemberDef PyDiaImage_Members[] = {
+    { "width", T_INVALID, 0, RESTRICTED|READONLY,
+      "int: pixel width of the image" },
+    { "height", T_INVALID, 0, RESTRICTED|READONLY,
+      "int: pixel height of the image" },
+    { "rgb_data", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: array of packed rgb pixel values" },
+    { "mask_data", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: array of alpha pixel values" },
+    { "filename", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: utf-8 encoded filename of the image" },
+    { "uri", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: Uniform Resource Identifier of the image" },
+    { NULL }
+};
 /*
  * Python objetcs
  */
@@ -159,5 +177,14 @@ PyTypeObject PyDiaImage_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "dia.Image gets passed into DiaRenderer.draw_image"
+    "dia.Image gets passed into DiaRenderer.draw_image",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaImage_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-layer.c b/plug-ins/python/pydia-layer.c
index 245ad99..84ee479 100644
--- a/plug-ins/python/pydia-layer.c
+++ b/plug-ins/python/pydia-layer.c
@@ -23,6 +23,8 @@
 #include "pydia-object.h"
 #include "pydia-cpoint.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 PyObject *
 PyDiaLayer_New(Layer *layer)
 {
@@ -158,11 +160,12 @@ PyDiaLayer_FindClosestConnectionPoint(PyDiaLayer *self, PyObject *args)
     Point pos;
     real dist;
     PyObject *ret;
+    PyDiaObject *obj;
 
-    if (!PyArg_ParseTuple(args, "dd:Layer.find_closest_connection_point",
-			  &pos.x, &pos.y))
+    if (!PyArg_ParseTuple(args, "dd|O!:Layer.find_closest_connection_point",
+			  &pos.x, &pos.y, PyDiaObject_Type, &obj))
 	return NULL;
-    dist = layer_find_closest_connectionpoint(self->layer, &cpoint, &pos, NULL);
+    dist = layer_find_closest_connectionpoint(self->layer, &cpoint, &pos, obj ? obj->object : NULL);
 
     ret = PyTuple_New(2);
     PyTuple_SetItem(ret, 0, PyFloat_FromDouble(dist));
@@ -194,19 +197,46 @@ PyDiaLayer_UpdateExtents(PyDiaLayer *self, PyObject *args)
  */
 
 static PyMethodDef PyDiaLayer_Methods[] = {
-    {"destroy", (PyCFunction)PyDiaLayer_Destroy, 1},
-    {"object_get_index", (PyCFunction)PyDiaLayer_ObjectGetIndex, 1},
-    {"add_object", (PyCFunction)PyDiaLayer_AddObject, 1},
-    {"remove_object", (PyCFunction)PyDiaLayer_RemoveObject, 1},
+    {"destroy", (PyCFunction)PyDiaLayer_Destroy, METH_VARARGS,
+     "Release the layer. Must not be called when already added to a diagram."},
+    {"object_get_index", (PyCFunction)PyDiaLayer_ObjectGetIndex, METH_VARARGS,
+     "object_get_index(Object: o) -> int."
+     "  Returns the index of the object in the layers list of objects."},
+    {"add_object", (PyCFunction)PyDiaLayer_AddObject, METH_VARARGS,
+     "add_object(Object: o[, int: position]) -> None."
+     "  Add the object to the layer at the top or the given position counting from bottom."},
+    {"remove_object", (PyCFunction)PyDiaLayer_RemoveObject, METH_VARARGS,
+     "remove_object(Object: o) -> None"
+     "  Remove the object from the layer and delete it."},
     {"find_objects_in_rectangle",
-     (PyCFunction)PyDiaLayer_FindObjectsInRectangle, 1},
-    {"find_closest_object", (PyCFunction)PyDiaLayer_FindClosestObject, 1},
+     (PyCFunction)PyDiaLayer_FindObjectsInRectangle, METH_VARARGS,
+     "find_objects_in_rectangle(real: top, real left, real: bottom, real: right) -> Objects"
+     "  Returns a list of objects found in the given rectangle."},
+    {"find_closest_object", (PyCFunction)PyDiaLayer_FindClosestObject, METH_VARARGS,
+     "find_closest_object(real: x, real: y, real: maxdist) -> Object."
+     "  Find an object in the given maximum distance of the given point."},
     {"find_closest_connection_point",
-     (PyCFunction)PyDiaLayer_FindClosestConnectionPoint, 1},
-    {"update_extents", (PyCFunction)PyDiaLayer_UpdateExtents, 1},
+     (PyCFunction)PyDiaLayer_FindClosestConnectionPoint, METH_VARARGS,
+     "find_closest_connectionpoint(real: x, real: y[, Object: o]) -> (real: dist, ConnectionPoint: cp)."
+     "  Given a point and an optional object to exclude return the distance and the closest connection point or None."},
+    {"update_extents", (PyCFunction)PyDiaLayer_UpdateExtents, METH_VARARGS,
+     "update_extents() -> None.  Force recaculation of the layer extents."},
     {NULL, 0, 0, NULL}
 };
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->data indirection */
+static PyMemberDef PyDiaLayer_Members[] = {
+    { "extents", T_INVALID, 0, RESTRICTED|READONLY,
+      "Rectangle covering all object's bounding boxes." },
+    { "name", T_INVALID, 0, RESTRICTED|READONLY,
+      "The name of the layer." },
+    { "objects", T_INVALID, 0, RESTRICTED|READONLY,
+      "The list of objects in the layer." },
+    { "visible", T_INVALID, 0, RESTRICTED|READONLY,
+      "The visibility of the layer." },
+    { NULL }
+};
+
 static PyObject *
 PyDiaLayer_GetAttr(PyDiaLayer *self, gchar *attr)
 {
@@ -257,5 +287,14 @@ PyTypeObject PyDiaLayer_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "A Layer is part of a Diagram and can contain objects."
+    "A Layer is part of a Diagram and can contain objects.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    PyDiaLayer_Methods, /* tp_methods */
+    PyDiaLayer_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-object.c b/plug-ins/python/pydia-object.c
index e99f886..28adc7c 100644
--- a/plug-ins/python/pydia-object.c
+++ b/plug-ins/python/pydia-object.c
@@ -25,6 +25,8 @@
 #include "pydia-geometry.h"
 #include "pydia-properties.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 PyObject *
 PyDiaObject_New(DiaObject *object)
 {
@@ -131,6 +133,7 @@ static PyObject *
 PyDiaObject_Move(PyDiaObject *self, PyObject *args)
 {
     Point point;
+    ObjectChange *change;
 
     if (!PyArg_ParseTuple(args, "dd:Object.move", &point.x, &point.y))
 	return NULL;
@@ -140,7 +143,10 @@ PyDiaObject_Move(PyDiaObject *self, PyObject *args)
 	return NULL;
     }
 
-    self->object->ops->move(self->object, &point);
+    change = self->object->ops->move(self->object, &point);
+    if (G_UNLIKELY(change)) /* TODO: return the change? */
+        change->free(change);
+
     Py_INCREF(Py_None);
     return Py_None;
 }
@@ -150,10 +156,11 @@ PyDiaObject_MoveHandle(PyDiaObject *self, PyObject *args)
 {
     PyDiaHandle *handle;
     Point point;
-    HandleMoveReason reason;
-    ModifierKeys modifiers;
+    HandleMoveReason reason = 0;
+    ModifierKeys modifiers = 0;
+    ObjectChange *change;
 
-    if (!PyArg_ParseTuple(args, "O!(dd)ii:Object.move_handle",
+    if (!PyArg_ParseTuple(args, "O!(dd)|ii:Object.move_handle",
 			  &PyDiaHandle_Type, &handle, &point.x, &point.y,
 			  &reason, &modifiers))
 	return NULL;
@@ -163,21 +170,51 @@ PyDiaObject_MoveHandle(PyDiaObject *self, PyObject *args)
 	return NULL;
     }
 
-    self->object->ops->move_handle(self->object, handle->handle, &point,
-				   NULL, reason, modifiers);
+    change = self->object->ops->move_handle(self->object, handle->handle, &point,
+				            NULL, reason, modifiers);
+
+    if (G_UNLIKELY(change)) /* TODO: return the change? */
+        change->free(change);
+
     Py_INCREF(Py_None);
     return Py_None;
 }
 
 static PyMethodDef PyDiaObject_Methods[] = {
-    { "destroy", (PyCFunction)PyDiaObject_Destroy, 1 },
-    { "distance_from", (PyCFunction)PyDiaObject_DistanceFrom, 1 },
-    { "copy", (PyCFunction)PyDiaObject_Copy, 1 },
-    { "move", (PyCFunction)PyDiaObject_Move, 1 },
-    { "move_handle", (PyCFunction)PyDiaObject_MoveHandle, 1 },
+    { "destroy", (PyCFunction)PyDiaObject_Destroy, METH_VARARGS,
+      "destroy() -> None."
+      "  Release the object. Must not be called when already added to a group or layer." },
+    { "distance_from", (PyCFunction)PyDiaObject_DistanceFrom, METH_VARARGS,
+      "distance_from(real: x, real: y) -> real."
+      "  Calculate the object's distance from the given point." },
+    { "copy", (PyCFunction)PyDiaObject_Copy, METH_VARARGS,
+      "copy() -> Object.  Create a new object copy." },
+    { "move", (PyCFunction)PyDiaObject_Move, METH_VARARGS,
+      "move(real: x, real: y) -> None."
+      "  Move the entire object. The given point is the new object.obj_pos." },
+    { "move_handle", (PyCFunction)PyDiaObject_MoveHandle, METH_VARARGS,
+      "move_handle(Handle: h, (real: x, real: y)[int: reason, int: modifiers]) -> None."
+      "  Move the given handle of the object to the given position"},
     { NULL, 0, 0, NULL }
 };
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->data indirection */
+static PyMemberDef PyDiaObject_Members[] = {
+    { "bounding_box", T_INVALID, 0, RESTRICTED|READONLY,
+      "Box covering all the object." },
+    { "connections", T_INVALID, 0, RESTRICTED|READONLY,
+      "Vector of connection points." },
+    { "handles", T_INVALID, 0, RESTRICTED|READONLY,
+      "Vector of handles." },
+    { "parent", T_INVALID, 0, RESTRICTED|READONLY,
+      "The parent object when parenting is in place, None otherwise." },
+    { "properties", T_INVALID, 0, RESTRICTED|READONLY,
+      "Dictionary of object properties." },
+    { "type", T_INVALID, 0, RESTRICTED|READONLY,
+      "The dia.ObjectType of the object" },
+    { NULL }
+};
+
 static PyObject *
 PyDiaObject_GetAttr(PyDiaObject *self, gchar *attr)
 {
@@ -239,7 +276,16 @@ PyTypeObject PyDiaObject_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "The main building block of diagrams."
+    "The main building block of diagrams.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    PyDiaObject_Methods, /* tp_methods */
+    PyDiaObject_Members, /* tp_members */
+    0
 };
 
 PyObject *
@@ -332,10 +378,20 @@ PyDiaObjectType_Create(PyDiaObjectType *self, PyObject *args)
 }
 
 static PyMethodDef PyDiaObjectType_Methods[] = {
-    { "create", (PyCFunction)PyDiaObjectType_Create, 1 },
+    { "create", (PyCFunction)PyDiaObjectType_Create, METH_VARARGS,
+      "create(real: x, real: y) -> (Object: o, Handle: h1, Handle: h2)"
+      "  Create a new object of this type. Returns a tuple containing the new object and up to two handles." },
     { NULL, 0, 0, NULL }
 };
 
+static PyMemberDef PyDiaObjectType_Members[] = {
+    { "name", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: the unique type indentifier of the object type." },
+    { "version", T_INVALID, 0, RESTRICTED|READONLY,
+      "int: version number" },
+    { NULL }
+};
+
 static PyObject *
 PyDiaObjectType_GetAttr(PyDiaObjectType *self, gchar *attr)
 {
@@ -372,6 +428,15 @@ PyTypeObject PyDiaObjectType_Type = {
     (PyBufferProcs *)0,
     0L, /* Flags */
     "The dia.Object factory. Allows to create objects of the specific type. "
-    "Use: factory = get_object_type(<type name>) to get a grip on it."
+    "Use: factory = get_object_type(<type name>) to get a grip on it.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    PyDiaObjectType_Methods, /* tp_methods */
+    PyDiaObjectType_Members, /* tp_members */
+    0
 };
 
diff --git a/plug-ins/python/pydia-paperinfo.c b/plug-ins/python/pydia-paperinfo.c
index 3d42f70..d4453e2 100644
--- a/plug-ins/python/pydia-paperinfo.c
+++ b/plug-ins/python/pydia-paperinfo.c
@@ -22,6 +22,8 @@
 #include "pydia-paperinfo.h"
 #include "pydia-object.h" /* for PyObject_HEAD_INIT */
 
+#include <structmember.h> /* PyMemberDef */
+
 /*
  * New
  */
@@ -107,6 +109,20 @@ PyDiaPaperinfo_Str(PyDiaPaperinfo *self)
   return py_s;
 }
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->paper indirection */
+static PyMemberDef PyDiaPaperinfo_Members[] = {
+    { "name", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: paper name, e.g. A4 or Letter" },
+    { "is_portrait", T_INVALID, 0, RESTRICTED|READONLY,
+      "int: paper orientation" },
+    { "scaling", T_INVALID, 0, RESTRICTED|READONLY,
+      "real: factor to zoom the diagram on the paper" },
+    { "width", T_INVALID, 0, RESTRICTED|READONLY,
+      "real: width of the drawable area (sans margins)" },
+    { "height", T_INVALID, 0, RESTRICTED|READONLY,
+      "real: height of the drawable area (sans margins)" },
+    { NULL }
+};
 /*
  * Python objetcs
  */
@@ -132,5 +148,14 @@ PyTypeObject PyDiaPaperinfo_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "dia.Paperinfo is part of dia.DiagramData describing the paper"
+    "dia.Paperinfo is part of dia.DiagramData describing the paper",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaPaperinfo_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-properties.c b/plug-ins/python/pydia-properties.c
index a3ec901..3ee57bf 100644
--- a/plug-ins/python/pydia-properties.c
+++ b/plug-ins/python/pydia-properties.c
@@ -22,6 +22,8 @@
 #include "pydia-object.h"
 #include "pydia-properties.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 /*
  * New
  */
@@ -253,20 +255,26 @@ static PyMappingMethods PyDiaProperties_AsMapping = {
 	(objobjargproc)PyDiaProperties_AssSub, /*mp_ass_subscript*/
 };
 
-static PyMethodDef mapp_methods[] = {
+static PyMethodDef PyDiaProperties_Methods[] = {
+	/* duck-typing dictionary */
 	{"get",     (PyCFunction)PyDiaProperties_Get,     METH_VARARGS},
 	{"has_key", (PyCFunction)PyDiaProperties_HasKey,  METH_VARARGS},
 	{"keys",    (PyCFunction)PyDiaProperties_Keys},
 	{NULL,		NULL}		/* sentinel */
 };
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->handle indirection */
+static PyMemberDef PyDiaProperties_Members[] = {
+	{ NULL }
+};
+
 /*
  * GetAttr
  */
 static PyObject*
 PyDiaProperties_GetAttr(PyDiaProperties *self, gchar *attr)
 {
-  return Py_FindMethod(mapp_methods, (PyObject *)self, attr);
+  return Py_FindMethod(PyDiaProperties_Methods, (PyObject *)self, attr);
 }
 
 /*
@@ -296,5 +304,14 @@ PyTypeObject PyDiaProperties_Type = {
     0L, /* Flags */
     "A dictionary interface to dia.Object's standard properties. Many properties"
     "can be get and set through this. If there is a specific method to change an"
-    "objects property like o.move() or o.move_handle() use that instead."
+    "objects property like o.move() or o.move_handle() use that instead.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    PyDiaProperties_Methods, /* tp_methods */
+    PyDiaProperties_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-property.c b/plug-ins/python/pydia-property.c
index e445d41..7568746 100644
--- a/plug-ins/python/pydia-property.c
+++ b/plug-ins/python/pydia-property.c
@@ -31,6 +31,8 @@
 #include "pydia-color.h"
 #include "pydia-text.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 /* include mess: propinternals.h needs tree.h, we don't */
 #include "prop_inttypes.h"
 #include "prop_geomtypes.h"
@@ -851,6 +853,19 @@ PyDiaProperty_Str(PyDiaProperty *self)
   return py_s;
 }
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->property indirection */
+static PyMemberDef PyDiaProperty_Members[] = {
+    { "name", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: the name of the property" },
+    { "type", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: the type name of the object" },
+    { "value", T_INVALID, 0, RESTRICTED|READONLY,
+      "various: the value is of type char, bool, dict, int, real, string, Text, Point, BezPoint, "
+      "Rect, Arrow, Color or a tuple or list, possibly containing tuple of varying types." },
+    { "visible", T_INVALID, 0, RESTRICTED|READONLY,
+      "bool: visibility of the property" },
+    { NULL }
+};
 /*
  * Python object
  */
@@ -877,5 +892,14 @@ PyTypeObject PyDiaProperty_Type = {
     (PyBufferProcs *)0,
     0L, /* Flags */
     "Interface to so called StdProps, the mechanism to control "
-    "most of Dia's canvas objects properties. "
+    "most of Dia's canvas objects properties. ",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaProperty_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydia-text.c b/plug-ins/python/pydia-text.c
index cfe0246..ab5feed 100644
--- a/plug-ins/python/pydia-text.c
+++ b/plug-ins/python/pydia-text.c
@@ -26,6 +26,8 @@
 #include "pydia-font.h"
 #include "pydia-geometry.h"
 
+#include <structmember.h> /* PyMemberDef */
+
 /*
  * New
  */
@@ -116,6 +118,22 @@ PyDiaText_Str(PyDiaText *self)
   return ret;
 }
 
+#define T_INVALID -1 /* can't allow direct access due to pyobject->text indirection */
+static PyMemberDef PyDiaText_Members[] = {
+    { "text", T_INVALID, 0, RESTRICTED|READONLY,
+      "string: text data" },
+    { "font", T_INVALID, 0, RESTRICTED|READONLY,
+      "Font: read-only reference to font used" },
+    { "height", T_INVALID, 0, RESTRICTED|READONLY,
+      "real: height of the font" },
+    { "position", T_INVALID, 0, RESTRICTED|READONLY,
+      "Point: alignment position of the text" },
+    { "color", T_INVALID, 0, RESTRICTED|READONLY,
+      "Color: color of the text" },
+    { "alignment", T_INVALID, 0, RESTRICTED|READONLY,
+      "int: alignment out of LEFT=0, CENTER=1, RIGHT=2" },
+    { NULL }
+};
 /*
  * Python objetcs
  */
@@ -141,5 +159,14 @@ PyTypeObject PyDiaText_Type = {
     (setattrofunc)0,
     (PyBufferProcs *)0,
     0L, /* Flags */
-    "Many objects (dia.Object) having text to display provide this property."
+    "Many objects (dia.Object) having text to display provide this property.",
+    (traverseproc)0,
+    (inquiry)0,
+    (richcmpfunc)0,
+    0, /* tp_weakliszoffset */
+    (getiterfunc)0,
+    (iternextfunc)0,
+    0, /* tp_methods */
+    PyDiaText_Members, /* tp_members */
+    0
 };
diff --git a/plug-ins/python/pydiadoc.py b/plug-ins/python/pydiadoc.py
index 3ddc024..c22e8a1 100644
--- a/plug-ins/python/pydiadoc.py
+++ b/plug-ins/python/pydiadoc.py
@@ -54,7 +54,23 @@ def distribute_objects (objs) :
 			x = 0.0
 			y += height
 
-def autodoc_cb (data, flags) :
+def find_class (data, name) :
+	"Find an UML-Class with the given class-name"
+	if not data :
+		return None
+	for la in data.layers :
+		for o in la.objects :
+			if o.type.name == 'UML - Class' and o.properties['name'].value == name :
+				return o
+	return None
+
+def autodoc_fresh_cb (data, flags) :
+	return autodoc_cb(data, flags, 0)
+def autodoc_update_cb (data, flags) :
+	return autodoc_cb(data, flags, data != None)
+
+def autodoc_cb (data, flags, update) :
+	show_comments = 1 # maybe this should be selectable
 	if not data : # not set when called by the toolbox menu
 		diagram = dia.new("PyDiaObjects.dia")
 		# passed in data is not necessary valid - we are called from the Toolbox menu
@@ -117,6 +133,7 @@ def autodoc_cb (data, flags) :
 	# add UML classes for every object in dir
 	#print theTypes
 
+	fresh = [] # list of newly created objects
 	theGlobals = []
 	# remove all objects prefixed with '__'
 	for s in theDir :
@@ -129,10 +146,19 @@ def autodoc_cb (data, flags) :
 		if is_a :
 			theGlobals.append((s,doc))
 			continue
-		o, h1, h2 = oType.create (0,0) # p.x, p.y
+		# search the class we would create in the diagram and if found, modify rather than create
+		o = None
+		if update :
+			o = find_class(data, s)
+			h1 = h2 = None
+			if o :
+				show_comments = o.properties["visible_comments"].value
+		if not o :
+			o, h1, h2 = oType.create (0,0) # p.x, p.y
+			layer.add_object (o)
+			fresh.append(o)
 		if doc :
 			o.properties["comment"] = doc
-		layer.add_object (o)
 		# set the objects name
 		o.properties["name"] = s
 		# now populate the object with ...
@@ -172,8 +198,11 @@ def autodoc_cb (data, flags) :
 					except AttributeError, msg :
 						print m, msg # No constructor defined
 				try :
-					doc = eval("t." + m + ".__doc__")
-				except :
+					# try to get the member's docstring from the type
+					doc = eval("dia." + s + "." + m + ".__doc__")
+					# fallback to object?
+					#doc = eval("t." + m + ".__doc__")
+				except AttributeError :
 					doc = str(t) + "." + m
 				if is_m : # (name, type, comment, stereotype, visibility, inheritance_type, query,class_scope, params)
 					methods.append((m,tt,doc,'',0,0,0,0,()))
@@ -181,22 +210,33 @@ def autodoc_cb (data, flags) :
 					attributes.append((m,tt,'',doc,0,0,0))
 			o.properties["operations"] = methods
 			o.properties["attributes"] = attributes
+			o.properties["comment_line_length"] = 120
+			o.properties["visible_comments"] = show_comments
 			if stereotype != "" :
 				o.properties["stereotype"] = stereotype
-	# build the module object
-	o, h1, h2 = oType.create (0,0) # p.x, p.y
-	layer.add_object (o)
-	# set the objects name
-	o.properties["name"] = "dia"
+	o = None
+	if update :
+		o = find_class(data, 'dia')
+	if o :
+		show_comments = o.properties["visible_comments"].value
+	else :
+		# build the module object
+		o, h1, h2 = oType.create (0,0) # p.x, p.y
+		layer.add_object (o)
+		# set the objects name
+		o.properties["name"] = "dia"
+		fresh.append(o)
 	o.properties["comment"] = eval("dia.__doc__")
+	o.properties["comment_line_length"] = 120
+	o.properties["visible_comments"] = show_comments
 	methods = []
 	for s in theGlobals :
 		if string.find(s[0], "swigregister") >= 0 :
 			continue # just noise
 		methods.append((s[0],'',s[1],'',0,0,0,1,()))
 	o.properties["operations"] = methods
-	# all objects got there bounding box, distribute them
-	distribute_objects (layer.objects)
+	# all objects got there bounding box, distribute the fresh ones
+	distribute_objects (fresh)
 
 	if diagram :
 		diagram.update_extents()
@@ -204,6 +244,23 @@ def autodoc_cb (data, flags) :
 	# work with bindings test
 	return data
 
+def autodoc_html_cb (data, flags) :
+	import pydoc
+	import os
+	try :
+		path = os.environ["TEMP"]
+		os.chdir(path)
+		pydoc.writedoc(dia)
+		dia.message(0, path + os.path.sep + "dia.html saved.")
+	except :
+		pass
+
+dia.register_action ("HelpPydia2", "PyDia HTML Docs", 
+                       "/ToolboxMenu/Help/HelpExtensionStart", 
+                       autodoc_html_cb)
 dia.register_action ("HelpPydia", "PyDia Docs", 
                        "/ToolboxMenu/Help/HelpExtensionStart", 
-                       autodoc_cb)
+                       autodoc_fresh_cb)
+dia.register_action ("UpdatePydia", "PyDia Docs Update", 
+                       "/DisplayMenu/Help/HelpExtensionStart", 
+                       autodoc_update_cb)
diff --git a/samples/Self/PyDiaObjects.dia b/samples/Self/PyDiaObjects.dia
index 0205867..963f46b 100644
--- a/samples/Self/PyDiaObjects.dia
+++ b/samples/Self/PyDiaObjects.dia
@@ -113,7 +113,7 @@
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -181,9 +181,7 @@
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#double: blue color component [0 .. 1.0]#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -206,9 +204,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#double: green color component [0 .. 1.0]#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -231,9 +227,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#double: red color component [0 .. 1.0]#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -302,7 +296,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -370,10 +364,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#List of Object: read-only list of connected objects#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -396,7 +387,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#The main building block of diagrams.#</dia:string>
+            <dia:string>#Object: the object owning this connection point#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -419,7 +410,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#&lt;dia.ConnectionPoint object at 0x02C39CC0&gt;.pos#</dia:string>
+            <dia:string>#Point: read-only position of the connection point#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -443,7 +434,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
         <dia:point val="14.6201,26.392"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="14.5701,26.342;27.1051,47.442"/>
+        <dia:rectangle val="14.5701,26.342;27.1051,48.242"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
         <dia:point val="14.6201,26.392"/>
@@ -452,7 +443,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
         <dia:real val="12.434999999999999"/>
       </dia:attribute>
       <dia:attribute name="elem_height">
-        <dia:real val="21.000000000000007"/>
+        <dia:real val="21.800000000000004"/>
       </dia:attribute>
       <dia:attribute name="name">
         <dia:string>#Diagram#</dia:string>
@@ -461,7 +452,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
         <dia:string>##</dia:string>
       </dia:attribute>
       <dia:attribute name="comment">
-        <dia:string>#Subclass of dia.DiagramData (at least in the C implmentation) adding interfacing the GUI elements.#</dia:string>
+        <dia:string>#Subclass of dia.DiagramData (at least in the C implementation) adding interfacing the GUI elements.#</dia:string>
       </dia:attribute>
       <dia:attribute name="abstract">
         <dia:boolean val="false"/>
@@ -488,7 +479,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -556,7 +547,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#The 'low level' diagram object. It contains everything to manipulate diagrams from im- and export filters as well as from the UI. It does not provide any access to GUI elements related to the diagram.Use the subclass dia.Diagram object for such matters.#</dia:string>
+            <dia:string>#Backward-compatible base-class access#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -579,10 +570,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#The list of current displays of this diagram.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -605,10 +593,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#str(object) -&gt; string
-
-Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.#</dia:string>
+            <dia:string>#Filename in utf-8 encoding.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -631,14 +616,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#Modification state.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -661,10 +639,30 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#The current object selection.#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#unsaved#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>#True if the diagram was not saved yet.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -692,7 +690,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#add_update(real: top, real: left, real: bottom, real: right) -&gt; None.  Add the given rectangle to the update queue.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -722,7 +720,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#add_update_all() -&gt; None.  Add the diagram visible area to the update queue.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -752,7 +750,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#connect_after(string: signal_name, Callback: func) -&gt; None.  Listen to diagram events in ['removed', 'selection_changed'].#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -782,7 +780,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#display() -&gt; Display.  Create a new display of the diagram.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -812,7 +810,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#find_clicked_object(real[2]: point, real: distance) -&gt; Object.  Find an object in the given distance of the given point.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -842,7 +840,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#find_closest_connectionpoint(real: x, real: y[, Object: o]) -&gt; (real: dist, ConnectionPoint: cp).  Given a point and an optional object to exclude, return the distance and closest connection point or None.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -872,7 +870,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#find_closest_handle(real[2]: point) -&gt; (real: distance, Handle: h, Object: o).  Find the closest handle from point and return a tuple of the search results.  Handle and Object might be None.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -902,7 +900,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#flush() -&gt; None.  If no display update is queued, queue update.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -932,7 +930,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#get_sorted_selected() -&gt; list.  Return the current selection sorted by Z-Order.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -962,7 +960,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#get_sorted_selected_remove() -&gt; list.  Return sorted selection and remove it from the diagram.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -992,7 +990,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#group_selected() -&gt; None.  Turn the current selection into a group object.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1022,7 +1020,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#is_selected(Object: o) -&gt; bool.  True if the given object is already selected.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1052,7 +1050,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#remove_all_selected() -&gt; None.  Delete all selected objects.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1082,7 +1080,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#save(string: filename) -&gt; None.  Save the diagram under the given filename.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1112,7 +1110,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#select(Object: o) -&gt; None.  Add the given object to the selection.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1142,7 +1140,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#ungroup_selected() -&gt; None.  Split all groups in the current selection into single objects.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1172,7 +1170,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#unselect(Object: o) -&gt; None.  Remove the given object from the selection)#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1202,7 +1200,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#update_connections(Object: o) -&gt; None.  Update all connections of the given object. Might move connected objects.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1232,7 +1230,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#update_extents() -&gt; None.  Force recaculation of the diagram extents.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1304,7 +1302,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -1372,7 +1370,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#A Layer is part of a Diagram and can contain objects.#</dia:string>
+            <dia:string>#Layer currently active in the diagram.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1395,7 +1393,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#&lt;PyDiaDiagramData 02C39C50&gt;.bg_color#</dia:string>
+            <dia:string>#Color of the diagram's background.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1418,7 +1416,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#&lt;PyDiaDiagramData 02C39C50&gt;.extents#</dia:string>
+            <dia:string>#Rectangle covering all object's bounding boxes.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1441,10 +1439,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#bool: visibility of the grid.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1467,10 +1462,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#Tuple(real: x, real: y) : describing the grid size.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1493,10 +1485,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#List of real: horizontal guides.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1519,10 +1508,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#Read-only list of the diagrams layers.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1545,7 +1531,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#Paperinfo of the diagram.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1568,10 +1554,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#List of Object: current selection.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1594,10 +1577,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#List of real: vertical guides.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1625,7 +1605,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#add_layer(Layer: layer[, int: position]) -&gt; Layer.  Add a layer to the diagram at the top or the given position counting from bottom.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1655,7 +1635,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#connect_after(string: signal_name, Callback: func) -&gt; None.  Listen to diagram events in ['object_add', 'object_remove'].#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1685,7 +1665,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#delete_layer(Layer: layer) -&gt; None.  Remove the given layer from the diagram.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1715,7 +1695,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#get_sorted_selected() -&gt; list.  Return the current selection sorted by Z-Order.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1745,7 +1725,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#lower_layer() -&gt; None.  Move the layer towards the bottom.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1775,7 +1755,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#raise_layer() -&gt; None.  Move the layer towards the top.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1805,7 +1785,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#set_active_layer(Layer: layer) -&gt; None.  Make the given layer the active one.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1835,7 +1815,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#update_extents() -&gt; None.  Recalculation of the diagram extents.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -1907,7 +1887,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -1975,7 +1955,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#Subclass of dia.DiagramData (at least in the C implmentation) adding interfacing the GUI elements.#</dia:string>
+            <dia:string>#Diagram displayed.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -1998,10 +1978,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#Point in diagram coordinates of the top-left corner of the visible area.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -2024,10 +2001,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#Tuple(real: top, real: left, real: bottom, real: right) : visible area#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -2050,9 +2024,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#Real: zoom-factor#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -2080,7 +2052,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#add_update_all() -&gt; None.  Add the diagram visible area to the update queue.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2110,7 +2082,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#close() -&gt; None.  Close the display possibly asking to save.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2140,7 +2112,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#flush() -&gt; None.  If no display update is queued, queue update.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2170,7 +2142,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#resize_canvas(int: width, int: height) -&gt; None.  BEWARE: Changing the drawing area but not the window size.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2200,7 +2172,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#scroll(real: dx, real: dy) -&gt; None.  Scroll the visible area by the given delta.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2230,7 +2202,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#scroll_down() -&gt; None. Scroll downwards by a fixed amount.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2260,7 +2232,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#scroll_left() -&gt; None. Scroll to the left by a fixed amount.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2290,7 +2262,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#scroll_right() -&gt; None. Scroll to the right by a fixed amount.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2320,7 +2292,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#scroll_up() -&gt; None. Scroll upwards by a fixed amount.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2350,7 +2322,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#set_origion(real: x, real, y) -&gt; None.  Move the given diagram point to the top-left corner of the visible area.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2380,7 +2352,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#set_title(string: title) -&gt; None.  Temporary change of the diagram title.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2410,7 +2382,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#zoom(real[2]: point, real: factor) -&gt; None.  Zoom around the given point.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2482,7 +2454,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -2547,19 +2519,19 @@ Convert a string or number to a floating point number, if possible.#</dia:string
     </dia:object>
     <dia:object type="UML - Class" version="0" id="O6">
       <dia:attribute name="obj_pos">
-        <dia:point val="2.23349,35.3833"/>
+        <dia:point val="2.1558,35.2279"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="2.18349,35.3333;7.54099,37.6333"/>
+        <dia:rectangle val="2.1058,35.1779;7.4633,38.8779"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="2.23349,35.3833"/>
+        <dia:point val="2.1558,35.2279"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
         <dia:real val="5.2575000000000003"/>
       </dia:attribute>
       <dia:attribute name="elem_height">
-        <dia:real val="2.1999999999999997"/>
+        <dia:real val="3.6000000000000001"/>
       </dia:attribute>
       <dia:attribute name="name">
         <dia:string>#ExportFilter#</dia:string>
@@ -2595,7 +2567,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -2651,7 +2623,54 @@ Convert a string or number to a floating point number, if possible.#</dia:string
       <dia:attribute name="comment_font_height">
         <dia:real val="0.69999999999999996"/>
       </dia:attribute>
-      <dia:attribute name="attributes"/>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#name#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>#The description for the filter.#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#unique_name#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>#A uniqe name within filters to allow disambiguation.#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
       <dia:attribute name="operations"/>
       <dia:attribute name="template">
         <dia:boolean val="false"/>
@@ -2708,7 +2727,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -2776,14 +2795,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#NONCONNECTABLE=0.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -2806,7 +2818,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#The connected ConnectionPoint object or None.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -2829,14 +2841,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#Can be used to derive preferred directions from it.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -2859,7 +2864,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#&lt;dia.Handle object at 0x02C39C90&gt;.pos#</dia:string>
+            <dia:string>#The position of the connection point.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -2882,14 +2887,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#NON_MOVABLE=0, MAJOR_CONTROL=1, MINOR_CONTROL=2#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -2917,7 +2915,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#connect(ConnectionPoint: cp) -&gt; None.  Connect object A's handle with object B's connection point. To disconnect a handle pass in None.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -2989,7 +2987,7 @@ will be returned instead.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -3057,10 +3055,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#Rectangle covering all object's bounding boxes.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3083,10 +3078,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#str(object) -&gt; string
-
-Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.#</dia:string>
+            <dia:string>#The name of the layer.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3109,10 +3101,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#The list of objects in the layer.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3135,14 +3124,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#The visibility of the layer.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3170,7 +3152,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#add_object(Object: o[, int: position]) -&gt; None.  Add the object to the layer at the top or the given position counting from bottom.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3200,7 +3182,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#Release the layer. Must not be called when already added to a diagram.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3230,7 +3212,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#find_closest_connectionpoint(real: x, real: y[, Object: o]) -&gt; (real: dist, ConnectionPoint: cp).  Given a point and an optional object to exclude return the distance and the closest connection point or None.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3260,7 +3242,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#find_closest_object(real: x, real: y, real: maxdist) -&gt; Object.  Find an object in the given maximum distance of the given point.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3290,7 +3272,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#find_objects_in_rectangle(real: top, real left, real: bottom, real: right) -&gt; Objects  Returns a list of objects found in the given rectangle.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3308,7 +3290,7 @@ will be returned instead.#</dia:string>
         </dia:composite>
         <dia:composite type="umloperation">
           <dia:attribute name="name">
-            <dia:string>#object_index#</dia:string>
+            <dia:string>#object_get_index#</dia:string>
           </dia:attribute>
           <dia:attribute name="stereotype">
             <dia:string>##</dia:string>
@@ -3320,7 +3302,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#object_get_index(Object: o) -&gt; int.  Returns the index of the object in the layers list of objects.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3350,7 +3332,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#remove_object(Object: o) -&gt; None  Remove the object from the layer and delete it.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3380,7 +3362,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#update_extents() -&gt; None.  Force recaculation of the layer extents.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3452,7 +3434,7 @@ will be returned instead.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -3520,7 +3502,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#&lt;DiaObject of type "Standard - Image" at 2dd9958&gt;.bounding_box#</dia:string>
+            <dia:string>#Box covering all the object.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3543,10 +3525,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#Vector of connection points.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3569,10 +3548,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#tuple() -&gt; an empty tuple
-tuple(sequence) -&gt; tuple initialized from sequence's items
-
-If the argument is a tuple, the return value is the same object.#</dia:string>
+            <dia:string>#Vector of handles.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3586,7 +3562,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
         </dia:composite>
         <dia:composite type="umlattribute">
           <dia:attribute name="name">
-            <dia:string>#properties#</dia:string>
+            <dia:string>#parent#</dia:string>
           </dia:attribute>
           <dia:attribute name="type">
             <dia:string>##</dia:string>
@@ -3595,7 +3571,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#A dictionary interface to dia.Object's standard properties. Many propertiescan be get and set through this. If there is a specific method to change anobjects property like o.move() or o.move_handle() use that instead.#</dia:string>
+            <dia:string>#The parent object when parenting is in place, None otherwise.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3609,7 +3585,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
         </dia:composite>
         <dia:composite type="umlattribute">
           <dia:attribute name="name">
-            <dia:string>#type#</dia:string>
+            <dia:string>#properties#</dia:string>
           </dia:attribute>
           <dia:attribute name="type">
             <dia:string>##</dia:string>
@@ -3618,7 +3594,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#The dia.Object factory. Allows to create objects of the specific type. Use: factory = get_object_type(&lt;type name&gt;) to get a grip on it.#</dia:string>
+            <dia:string>#Dictionary of object properties.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3646,7 +3622,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#copy() -&gt; Object.  Create a new object copy.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3676,7 +3652,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#destroy() -&gt; None.  Release the object. Must not be called when already added to a group or layer.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3706,7 +3682,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#distance_from(real: x, real: y) -&gt; real.  Calculate the object's distance from the given point.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3736,7 +3712,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#move(real: x, real: y) -&gt; None.  Move the entire object. The given point is the new object.obj_pos.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3766,7 +3742,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#move_handle(Handle: h, (real: x, real: y)[int: reason, int: modifiers]) -&gt; None.  Move the given handle of the object to the given position#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -3838,7 +3814,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -3906,10 +3882,7 @@ If the argument is a tuple, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#str(object) -&gt; string
-
-Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.#</dia:string>
+            <dia:string>#string: the unique type indentifier of the object type.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3932,14 +3905,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#int: version number#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -3967,7 +3933,7 @@ will be returned instead.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>##</dia:string>
+            <dia:string>#create(real: x, real: y) -&gt; (Object: o, Handle: h1, Handle: h2)  Create a new object of this type. Returns a tuple containing the new object and up to two handles.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -4039,7 +4005,7 @@ will be returned instead.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -4107,9 +4073,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#int or double: lower edge y coordinate#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -4132,9 +4096,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#int or double: left edge x coordinate#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -4157,9 +4119,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#int or double: right edge x coordinate#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -4182,9 +4142,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#int or double: upper edge y coordinate#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -4569,7 +4527,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:point val="61.2344,23.9356"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="34.1129,23.1356;65.0364,35.9309"/>
+        <dia:rectangle val="34.1129,23.1356;65.0364,34.9309"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
@@ -4579,7 +4537,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:point val="64.9864,23.9356"/>
         <dia:point val="64.9864,32.7761"/>
         <dia:point val="34.9129,32.7761"/>
-        <dia:point val="34.9129,35.1309"/>
+        <dia:point val="34.9129,34.1309"/>
       </dia:attribute>
       <dia:attribute name="orth_orient">
         <dia:enum val="0"/>
@@ -4639,27 +4597,25 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:boolean val="true"/>
       </dia:attribute>
       <dia:attribute name="obj_pos">
-        <dia:point val="45.0452,42.5042"/>
+        <dia:point val="43.8798,41.4265"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="44.2952,40.852;66.6011,43.3042"/>
+        <dia:rectangle val="43.1298,40.6265;56.8263,43.8"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
       </dia:attribute>
       <dia:attribute name="orth_points">
-        <dia:point val="45.0452,42.5042"/>
-        <dia:point val="62.0611,42.5042"/>
-        <dia:point val="62.0611,41.652"/>
-        <dia:point val="66.5511,41.652"/>
+        <dia:point val="43.8798,41.4265"/>
+        <dia:point val="56.0262,41.4265"/>
+        <dia:point val="56.0262,43"/>
       </dia:attribute>
       <dia:attribute name="orth_orient">
         <dia:enum val="0"/>
         <dia:enum val="1"/>
-        <dia:enum val="0"/>
       </dia:attribute>
       <dia:attribute name="orth_autoroute">
-        <dia:boolean val="false"/>
+        <dia:boolean val="true"/>
       </dia:attribute>
       <dia:attribute name="text_colour">
         <dia:color val="#000000"/>
@@ -4669,18 +4625,18 @@ Convert a string or number to a floating point number, if possible.#</dia:string
       </dia:attribute>
       <dia:connections>
         <dia:connection handle="0" to="O25" connection="13"/>
-        <dia:connection handle="1" to="O20" connection="3"/>
+        <dia:connection handle="1" to="O20" connection="1"/>
       </dia:connections>
     </dia:object>
     <dia:object type="UML - Class" version="0" id="O19">
       <dia:attribute name="obj_pos">
-        <dia:point val="55.3726,44.6806"/>
+        <dia:point val="65,43"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="55.3226,44.6306;58.6176,49.1306"/>
+        <dia:rectangle val="64.95,42.95;68.245,47.45"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="55.3726,44.6806"/>
+        <dia:point val="65,43"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
         <dia:real val="3.1949999999999998"/>
@@ -4722,7 +4678,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -4790,9 +4746,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#double: length along the line#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -4815,14 +4769,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#int: the shape of the arrow#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -4845,9 +4792,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#double: corresponding to line width#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -4868,13 +4813,13 @@ Convert a string or number to a floating point number, if possible.#</dia:string
     </dia:object>
     <dia:object type="UML - Class" version="0" id="O20">
       <dia:attribute name="obj_pos">
-        <dia:point val="66.5511,40.952"/>
+        <dia:point val="54,43"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="66.5011,40.902;70.6536,46.202"/>
+        <dia:rectangle val="53.95,42.95;58.1025,48.25"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="66.5511,40.952"/>
+        <dia:point val="54,43"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
         <dia:real val="4.0525000000000002"/>
@@ -4916,7 +4861,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -4984,7 +4929,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#MOVE_TO.p1#</dia:string>
+            <dia:string>#Point: first control point for CURVETO#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5007,7 +4952,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#MOVE_TO.p2#</dia:string>
+            <dia:string>#Point: second control point for CURVETO#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5030,7 +4975,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#MOVE_TO.p3#</dia:string>
+            <dia:string>#Point: target point for CURVETO#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5053,14 +4998,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#int: MOVETO, LINETO using p1 only;  CURVETO all 3 points#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5081,13 +5019,13 @@ will be returned instead.#</dia:string>
     </dia:object>
     <dia:object type="UML - Class" version="0" id="O21">
       <dia:attribute name="obj_pos">
-        <dia:point val="61.4358,43.9551"/>
+        <dia:point val="60,43"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="61.3858,43.9051;64.6808,48.4051"/>
+        <dia:rectangle val="59.95,42.95;63.245,47.45"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="61.4358,43.9551"/>
+        <dia:point val="60,43"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
         <dia:real val="3.1949999999999998"/>
@@ -5102,7 +5040,7 @@ will be returned instead.#</dia:string>
         <dia:string>##</dia:string>
       </dia:attribute>
       <dia:attribute name="comment">
-        <dia:string>#Provides access to the some objects font property.#</dia:string>
+        <dia:string>#Provides access to some objects font property.#</dia:string>
       </dia:attribute>
       <dia:attribute name="abstract">
         <dia:boolean val="false"/>
@@ -5129,7 +5067,7 @@ will be returned instead.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -5197,10 +5135,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#str(object) -&gt; string
-
-Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.#</dia:string>
+            <dia:string>#string: family name of the font#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5223,10 +5158,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#str(object) -&gt; string
-
-Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.#</dia:string>
+            <dia:string>#string: legacy name of the font#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5249,14 +5181,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#int: style flags#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5277,19 +5202,19 @@ will be returned instead.#</dia:string>
     </dia:object>
     <dia:object type="UML - Class" version="0" id="O22">
       <dia:attribute name="obj_pos">
-        <dia:point val="46.8085,45.6036"/>
+        <dia:point val="70,32"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="46.7585,45.5536;49.966,47.8536"/>
+        <dia:rectangle val="69.95,31.95;74.4,38.85"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="46.8085,45.6036"/>
+        <dia:point val="70,32"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
-        <dia:real val="3.1074999999999999"/>
+        <dia:real val="4.3499999999999996"/>
       </dia:attribute>
       <dia:attribute name="elem_height">
-        <dia:real val="2.1999999999999997"/>
+        <dia:real val="6.8000000000000007"/>
       </dia:attribute>
       <dia:attribute name="name">
         <dia:string>#Image#</dia:string>
@@ -5325,7 +5250,7 @@ will be returned instead.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -5381,7 +5306,146 @@ will be returned instead.#</dia:string>
       <dia:attribute name="comment_font_height">
         <dia:real val="0.69999999999999996"/>
       </dia:attribute>
-      <dia:attribute name="attributes"/>
+      <dia:attribute name="attributes">
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#filename#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>#string: utf-8 encoded filename of the image#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#height#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>#int: pixel height of the image#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#mask_data#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>#string: array of alpha pixel values#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#rgb_data#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>#string: array of packed rgb pixel values#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#uri#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>#string: Uniform Resource Identifier of the image#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+        <dia:composite type="umlattribute">
+          <dia:attribute name="name">
+            <dia:string>#width#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="type">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="value">
+            <dia:string>##</dia:string>
+          </dia:attribute>
+          <dia:attribute name="comment">
+            <dia:string>#int: pixel width of the image#</dia:string>
+          </dia:attribute>
+          <dia:attribute name="visibility">
+            <dia:enum val="0"/>
+          </dia:attribute>
+          <dia:attribute name="abstract">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+          <dia:attribute name="class_scope">
+            <dia:boolean val="false"/>
+          </dia:attribute>
+        </dia:composite>
+      </dia:attribute>
       <dia:attribute name="operations"/>
       <dia:attribute name="template">
         <dia:boolean val="false"/>
@@ -5390,25 +5454,25 @@ will be returned instead.#</dia:string>
     </dia:object>
     <dia:object type="UML - Class" version="0" id="O23">
       <dia:attribute name="obj_pos">
-        <dia:point val="51.0873,45.0807"/>
+        <dia:point val="47,43"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="51.0373,45.0307;53.7448,48.7307"/>
+        <dia:rectangle val="46.95,42.95;52.17,47.45"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="51.0873,45.0807"/>
+        <dia:point val="47,43"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
-        <dia:real val="2.6074999999999999"/>
+        <dia:real val="5.1200000000000001"/>
       </dia:attribute>
       <dia:attribute name="elem_height">
-        <dia:real val="3.6000000000000001"/>
+        <dia:real val="4.4000000000000004"/>
       </dia:attribute>
       <dia:attribute name="name">
         <dia:string>#Point#</dia:string>
       </dia:attribute>
       <dia:attribute name="stereotype">
-        <dia:string>##</dia:string>
+        <dia:string>#sequence#</dia:string>
       </dia:attribute>
       <dia:attribute name="comment">
         <dia:string>#The dia.Point does not only provide access trough it's members but also via a sequence interface.#</dia:string>
@@ -5438,7 +5502,7 @@ will be returned instead.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -5506,9 +5570,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#double: coordinate horizontal part#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5531,9 +5593,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#double: coordinate vertical part#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5554,13 +5614,13 @@ Convert a string or number to a floating point number, if possible.#</dia:string
     </dia:object>
     <dia:object type="UML - Class" version="0" id="O24">
       <dia:attribute name="obj_pos">
-        <dia:point val="32.5854,35.1309"/>
+        <dia:point val="32.5854,34.1309"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="32.5354,35.0809;37.2904,39.5809"/>
+        <dia:rectangle val="32.5354,34.0809;37.2904,38.5809"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="32.5854,35.1309"/>
+        <dia:point val="32.5854,34.1309"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
         <dia:real val="4.6549999999999994"/>
@@ -5602,7 +5662,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -5758,13 +5818,13 @@ Convert a string or number to a floating point number, if possible.#</dia:string
     </dia:object>
     <dia:object type="UML - Class" version="0" id="O25">
       <dia:attribute name="obj_pos">
-        <dia:point val="41.0602,39.0042"/>
+        <dia:point val="39.8948,37.9265"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="41.0102,38.9542;45.0952,44.2542"/>
+        <dia:rectangle val="39.8448,37.8765;43.9298,43.1765"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="41.0602,39.0042"/>
+        <dia:point val="39.8948,37.9265"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
         <dia:real val="3.9850000000000003"/>
@@ -5806,7 +5866,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -5874,10 +5934,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#str(object) -&gt; string
-
-Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.#</dia:string>
+            <dia:string>#string: the name of the property#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5900,10 +5957,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#str(object) -&gt; string
-
-Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.#</dia:string>
+            <dia:string>#string: the type name of the object#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5926,7 +5980,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#&lt;DiaProperty at 02C39CF0, "obj_pos", point&gt;.value#</dia:string>
+            <dia:string>#various: the value is of type char, bool, dict, int, real, string, Text, Point, BezPoint, Rect, Arrow, Color or a tuple or list, possibly containing tuple of varying types.#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5949,14 +6003,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#bool: visibility of the property#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -5977,13 +6024,13 @@ will be returned instead.#</dia:string>
     </dia:object>
     <dia:object type="UML - Class" version="0" id="O26">
       <dia:attribute name="obj_pos">
-        <dia:point val="68.431,33.285"/>
+        <dia:point val="70,40"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="68.381,33.235;72.446,39.335"/>
+        <dia:rectangle val="69.95,39.95;74.015,46.05"/>
       </dia:attribute>
       <dia:attribute name="elem_corner">
-        <dia:point val="68.431,33.285"/>
+        <dia:point val="70,40"/>
       </dia:attribute>
       <dia:attribute name="elem_width">
         <dia:real val="3.9649999999999999"/>
@@ -6025,7 +6072,7 @@ will be returned instead.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="0"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -6093,7 +6140,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#&lt;DiaText "none" at 2d6ab60&gt;.color#</dia:string>
+            <dia:string>#Color: color of the text#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -6116,7 +6163,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#&lt;DiaText "none" at 2d6ab60&gt;.font#</dia:string>
+            <dia:string>#Font: read-only reference to font used#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -6139,9 +6186,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#real: height of the font#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -6164,7 +6209,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#&lt;DiaText "none" at 2d6ab60&gt;.position#</dia:string>
+            <dia:string>#Point: alignment position of the text#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -6187,10 +6232,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#str(object) -&gt; string
-
-Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.#</dia:string>
+            <dia:string>#string: text data#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -6247,25 +6289,27 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
       <dia:attribute name="obj_pos">
-        <dia:point val="45.0452,42.5042"/>
+        <dia:point val="43.8798,41.4265"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="44.2952,41.7042;49.1623,46.4036"/>
+        <dia:rectangle val="43.1298,31.9;70.05,42.2265"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
       </dia:attribute>
       <dia:attribute name="orth_points">
-        <dia:point val="45.0452,42.5042"/>
-        <dia:point val="48.3623,42.5042"/>
-        <dia:point val="48.3623,45.6036"/>
+        <dia:point val="43.8798,41.4265"/>
+        <dia:point val="66,41.4265"/>
+        <dia:point val="66,32.7"/>
+        <dia:point val="70,32.7"/>
       </dia:attribute>
       <dia:attribute name="orth_orient">
         <dia:enum val="0"/>
         <dia:enum val="1"/>
+        <dia:enum val="0"/>
       </dia:attribute>
       <dia:attribute name="orth_autoroute">
-        <dia:boolean val="true"/>
+        <dia:boolean val="false"/>
       </dia:attribute>
       <dia:attribute name="text_colour">
         <dia:color val="#000000"/>
@@ -6275,7 +6319,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
       </dia:attribute>
       <dia:connections>
         <dia:connection handle="0" to="O25" connection="13"/>
-        <dia:connection handle="1" to="O22" connection="1"/>
+        <dia:connection handle="1" to="O22" connection="3"/>
       </dia:connections>
     </dia:object>
     <dia:object type="UML - Association" version="2" id="O28">
@@ -6316,18 +6360,18 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
       <dia:attribute name="obj_pos">
-        <dia:point val="45.0452,42.5042"/>
+        <dia:point val="43.8798,41.4265"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="44.2952,41.7042;53.1911,45.8807"/>
+        <dia:rectangle val="43.1298,40.6265;50.36,43.8"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
       </dia:attribute>
       <dia:attribute name="orth_points">
-        <dia:point val="45.0452,42.5042"/>
-        <dia:point val="52.3911,42.5042"/>
-        <dia:point val="52.3911,45.0807"/>
+        <dia:point val="43.8798,41.4265"/>
+        <dia:point val="49.56,41.4265"/>
+        <dia:point val="49.56,43"/>
       </dia:attribute>
       <dia:attribute name="orth_orient">
         <dia:enum val="0"/>
@@ -6385,18 +6429,18 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
       <dia:attribute name="obj_pos">
-        <dia:point val="45.0452,42.5042"/>
+        <dia:point val="43.8798,41.4265"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="44.2952,41.7042;57.7701,45.4806"/>
+        <dia:rectangle val="43.1298,40.6265;67.3975,43.8"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
       </dia:attribute>
       <dia:attribute name="orth_points">
-        <dia:point val="45.0452,42.5042"/>
-        <dia:point val="56.9701,42.5042"/>
-        <dia:point val="56.9701,44.6806"/>
+        <dia:point val="43.8798,41.4265"/>
+        <dia:point val="66.5975,41.4265"/>
+        <dia:point val="66.5975,43"/>
       </dia:attribute>
       <dia:attribute name="orth_orient">
         <dia:enum val="0"/>
@@ -6454,27 +6498,25 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
       <dia:attribute name="obj_pos">
-        <dia:point val="45.0452,42.5042"/>
+        <dia:point val="43.8798,41.4265"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="44.2952,41.7042;61.4858,45.4551"/>
+        <dia:rectangle val="43.1298,40.6265;62.3975,43.8"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
       </dia:attribute>
       <dia:attribute name="orth_points">
-        <dia:point val="45.0452,42.5042"/>
-        <dia:point val="59.7664,42.5042"/>
-        <dia:point val="59.7664,44.6551"/>
-        <dia:point val="61.4358,44.6551"/>
+        <dia:point val="43.8798,41.4265"/>
+        <dia:point val="61.5975,41.4265"/>
+        <dia:point val="61.5975,43"/>
       </dia:attribute>
       <dia:attribute name="orth_orient">
         <dia:enum val="0"/>
         <dia:enum val="1"/>
-        <dia:enum val="0"/>
       </dia:attribute>
       <dia:attribute name="orth_autoroute">
-        <dia:boolean val="false"/>
+        <dia:boolean val="true"/>
       </dia:attribute>
       <dia:attribute name="text_colour">
         <dia:color val="#000000"/>
@@ -6484,7 +6526,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
       </dia:attribute>
       <dia:connections>
         <dia:connection handle="0" to="O25" connection="13"/>
-        <dia:connection handle="1" to="O21" connection="3"/>
+        <dia:connection handle="1" to="O21" connection="1"/>
       </dia:connections>
     </dia:object>
     <dia:object type="UML - Association" version="2" id="O31">
@@ -6525,19 +6567,19 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
       <dia:attribute name="obj_pos">
-        <dia:point val="45.0452,42.5042"/>
+        <dia:point val="43.8798,41.4265"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="44.2952,33.185;68.481,43.3042"/>
+        <dia:rectangle val="43.1298,39.9;70.05,42.2265"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
       </dia:attribute>
       <dia:attribute name="orth_points">
-        <dia:point val="45.0452,42.5042"/>
-        <dia:point val="59.7665,42.5042"/>
-        <dia:point val="59.7665,33.985"/>
-        <dia:point val="68.431,33.985"/>
+        <dia:point val="43.8798,41.4265"/>
+        <dia:point val="68,41.4265"/>
+        <dia:point val="68,40.7"/>
+        <dia:point val="70,40.7"/>
       </dia:attribute>
       <dia:attribute name="orth_orient">
         <dia:enum val="0"/>
@@ -6596,18 +6638,18 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:boolean val="true"/>
       </dia:attribute>
       <dia:attribute name="obj_pos">
-        <dia:point val="37.2404,37.4309"/>
+        <dia:point val="37.2404,36.4309"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="37.1904,36.6309;43.9854,39.8042"/>
+        <dia:rectangle val="37.1904,35.6309;43.9854,38.7265"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
       </dia:attribute>
       <dia:attribute name="orth_points">
-        <dia:point val="37.2404,37.4309"/>
-        <dia:point val="43.0527,37.4309"/>
-        <dia:point val="43.0527,39.0042"/>
+        <dia:point val="37.2404,36.4309"/>
+        <dia:point val="41.8873,36.4309"/>
+        <dia:point val="41.8873,37.9265"/>
       </dia:attribute>
       <dia:attribute name="orth_orient">
         <dia:enum val="0"/>
@@ -7035,7 +7077,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:point val="59.045,2.9"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="10.9737,2.1;77.906,49.7353"/>
+        <dia:rectangle val="10.9737,2.1;77.906,50.05"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
@@ -7043,8 +7085,8 @@ If the argument is a string, the return value is the same object.#</dia:string>
       <dia:attribute name="orth_points">
         <dia:point val="59.045,2.9"/>
         <dia:point val="77.856,2.9"/>
-        <dia:point val="77.856,49.6853"/>
-        <dia:point val="11.0237,49.6853"/>
+        <dia:point val="77.856,50"/>
+        <dia:point val="11.0237,50"/>
         <dia:point val="11.0237,27.092"/>
         <dia:point val="14.6201,27.092"/>
       </dia:attribute>
@@ -7321,7 +7363,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:point val="61.2344,24.7356"/>
       </dia:attribute>
       <dia:attribute name="obj_bb">
-        <dia:rectangle val="0.634475,16.9;64.2093,48.5977"/>
+        <dia:rectangle val="0.634475,16.9;64.2093,49.05"/>
       </dia:attribute>
       <dia:attribute name="meta">
         <dia:composite type="dict"/>
@@ -7331,8 +7373,8 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:point val="64.1593,24.7356"/>
         <dia:point val="64.1593,31.9992"/>
         <dia:point val="30.4407,31.9992"/>
-        <dia:point val="30.4407,48.5477"/>
-        <dia:point val="0.684475,48.5477"/>
+        <dia:point val="30.4407,49"/>
+        <dia:point val="0.684475,49"/>
         <dia:point val="0.684475,17.7"/>
         <dia:point val="4,17.7"/>
       </dia:attribute>
@@ -7409,7 +7451,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="17"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -7481,7 +7523,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#delivers the currently active display 'dia.Display' or None#</dia:string>
+            <dia:string>#active_display() -&gt; Display.  Delivers the currently active display 'dia.Display' or None#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7511,7 +7553,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#returns the list of currently open diagrams#</dia:string>
+            <dia:string>#diagrams() -&gt; List of Diagram.  Returns the list of currently open diagrams#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7541,7 +7583,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#from a type name like "Standard - Line" return the factory to create objects of that type, see: DiaObjectType#</dia:string>
+            <dia:string>#get_object_type(string: type) -&gt; ObjectType.  From a type name like "Standard - Line" return the factory to create objects of that type, see: DiaObjectType#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7571,7 +7613,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#create a group containing the given list of dia.Object(s)#</dia:string>
+            <dia:string>#group_create(List of Object: objs) -&gt; Object.  Create a group containing the given list of dia.Object(s)#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7601,7 +7643,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#loads a diagram from the given filename#</dia:string>
+            <dia:string>#load(string: name) -&gt; Diagram.  Loads a diagram from the given filename#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7631,7 +7673,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#popup a dialog with given message#</dia:string>
+            <dia:string>#message(int: type, string: msg) -&gt; None.  Popup a dialog with given message#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7661,7 +7703,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#create an empty diagram#</dia:string>
+            <dia:string>#new(string: name) -&gt; Diagram.  Create an empty diagram#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7691,7 +7733,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#register a callback function which appears in the menu. Depending on the menu path used during registrationthe callback gets called with the current DiaDiagramData object#</dia:string>
+            <dia:string>#register_action(string: action, string: description, string: menupath, Callback: func) -&gt; None.  Register a callback function which appears in the menu. Depending on the menu path used during registrationthe callback gets called with the current DiaDiagramData object#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7721,7 +7763,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#register a callback function which appears in the menu. Depending on the menu path used during registrationthe callback gets called with the current DiaDiagramData object#</dia:string>
+            <dia:string>#register_callback(string: description, string: menupath, Callback: func) -&gt; None.  Register a callback function which appears in the menu. Depending on the menu path used during registrationthe callback gets called with the current DiaDiagramData object#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7751,7 +7793,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#allows to register an export filter written in Python. It needs to conform to the DiaRenderer interface.#</dia:string>
+            <dia:string>#register_export(string: name, string: extension, Renderer: r) -&gt; None.  Allows to register an export filter written in Python. It needs to conform to the DiaRenderer interface.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7781,7 +7823,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#allows to register an import filter written in Python, that is mainly a callback function which fills thegiven DiaDiagramData from the given filename#</dia:string>
+            <dia:string>#register_import(string: name, string: extension, Callback: func) -&gt; None.  Allows to register an import filter written in Python, that is mainly a callback function which fills thegiven DiaDiagramData from the given filename#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7811,7 +7853,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#registers a single plug-in given its filename#</dia:string>
+            <dia:string>#register_plugin(string: filename) -&gt; None.  Registers a single plug-in given its filename, that is load a dynamic module.#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7841,7 +7883,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#a dictionary of all registered object factories, aka. DiaObjectType#</dia:string>
+            <dia:string>#registered_types() -&gt; Dict of ObjectType indexed by their name.  A dictionary of all registered object factories, aka. DiaObjectType#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7871,7 +7913,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:enum val="0"/>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#force a global update of all existing diagrams#</dia:string>
+            <dia:string>#update_all() -&gt; None.  Force an asynchronous update of all existing diagram displays#</dia:string>
           </dia:attribute>
           <dia:attribute name="abstract">
             <dia:boolean val="true"/>
@@ -7943,7 +7985,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
         <dia:int val="40"/>
       </dia:attribute>
       <dia:attribute name="comment_line_length">
-        <dia:int val="17"/>
+        <dia:int val="120"/>
       </dia:attribute>
       <dia:attribute name="comment_tagging">
         <dia:boolean val="false"/>
@@ -8011,9 +8053,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#real: height of the drawable area (sans margins)#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -8036,14 +8076,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#int(x[, base]) -&gt; integer
-
-Convert a string or number to an integer, if possible.  A floating point
-argument will be truncated towards zero (this does not include a string
-representation of a floating point number!)  When converting a string, use
-the optional base.  It is an error to supply a base when converting a
-non-string. If the argument is outside the integer range a long object
-will be returned instead.#</dia:string>
+            <dia:string>#int: paper orientation#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -8066,10 +8099,7 @@ will be returned instead.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#str(object) -&gt; string
-
-Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.#</dia:string>
+            <dia:string>#string: paper name, e.g. A4 or Letter#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -8092,9 +8122,7 @@ If the argument is a string, the return value is the same object.#</dia:string>
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#real: factor to zoom the diagram on the paper#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>
@@ -8117,9 +8145,7 @@ Convert a string or number to a floating point number, if possible.#</dia:string
             <dia:string>##</dia:string>
           </dia:attribute>
           <dia:attribute name="comment">
-            <dia:string>#float(x) -&gt; floating point number
-
-Convert a string or number to a floating point number, if possible.#</dia:string>
+            <dia:string>#real: width of the drawable area (sans margins)#</dia:string>
           </dia:attribute>
           <dia:attribute name="visibility">
             <dia:enum val="0"/>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]