0027191: Documentation - redesign of information architecture -- revision (user guides)
[occt.git] / dox / user_guides / tobj / tobj.md
diff --git a/dox/user_guides/tobj/tobj.md b/dox/user_guides/tobj/tobj.md
deleted file mode 100644 (file)
index 155091b..0000000
+++ /dev/null
@@ -1,910 +0,0 @@
-TObj Package  {#occt_user_guides__tobj}
-==================
-
-@tableofcontents
-
-@section occt_tobj_1 Introduction
-
-This document describes the package TObj, which is an add-on 
-to the Open CASCADE Application Framework (OCAF).
-
-This package provides a set of classes and auxiliary tools facilitating 
-the creation of object-oriented data models on top of low-level OCAF data structures. 
-This includes: 
-
-  * Definition of classes representing data objects. Data objects store their data using primitive OCAF attributes, taking advantage of OCAF mechanisms for Undo/Redo and persistence. At the same time they provide a higher level abstraction over the pure OCAF document structure (labels / attributes).
-  * Organization of the data model as a hierarchical (tree-like) structure of objects.
-  * Support of cross-references between objects within one model or among different models. In case of cross-model references the models should depend hierarchically.
-  * Persistence mechanism for storing *TObj* objects in OCAF files, which allows storing and retrieving objects of derived types without writing additional code to support persistence. 
-
-This document describes basic principles of logical and physical organization 
-of TObj-based data models and typical approaches to implementation of classes representing model objects.
-
-@subsection occt_tobj_1_1 Applicability
-
-The main purpose of the *TObj* data model is rapid development 
-of the object-oriented data models for applications, using the existing 
-functionality provided by OCAF (Undo/Redo and persistence) 
-without the necessity to redevelop such functionality from scratch.
-
-As opposed to using bare OCAF (at the level of labels and attributes), 
-TObj facilitates dealing with higher level abstracts, which are closer 
-to the application domain. It works best when the application data are naturally 
-organized in hierarchical structures, and is especially useful for complex data 
-models with dependencies between objects belonging to different parts of the model.
-
-It should be noted that *TObj* is efficient for representing data structures containing 
-a limited number of objects at each level of the data structure (typically less than 1000).
-A greater number of objects causes performance problems due to list-based organization of OCAF documents. Therefore, other methods of storage, such as arrays, are advisable for data models or their sub-parts containing a great number of uniform objects. However, these methods 
-can be combined with the usage of *TObj* to represent the high-level structure of the model.
-
-@section occt_tobj_2 TObj Model
-
-@subsection occt_tobj_2_1 TObj Model structure
-
-In the *TObj* data model the data are separated from the interfaces that manage them.
-
-It should be emphasized that *TObj* package defines only the interfaces and the basic structure of the model and objects, while the actual contents and structure of the model of a particular application are defined by its specific classes inherited from *TObj* classes. The implementation can add its own features or even change the default behaviour and the data layout, though this is not recommended. 
-
-Logically the *TObj* data model is represented as a tree of model objects, with upper-level objects typically being collections of other objects (called *partitions*, represented by the class *TObj_Partition*). The root object of the model is called the *Main partition* and is maintained by the model itself. This partition contains a list of sub-objects called its *children* each sub-object may contain its own children (according to its type), etc. 
-
-@figure{/user_guides/tobj/images/tobj_image003.png,"TObj Data Model",240}
-
-As the *TObj* Data Model is based on OCAF (Open CASCADE Application Framework) technology, 
-it stores its data in the underlying OCAF document. The OCAF document consists of a tree of 
-items called *labels*. Each label has some data attached to it in the form of *attributes*, 
-and may contain an arbitrary number of sub-labels. Each sub-label is identified by its sequential 
-number called the *tag*. The complete sequence of tag numbers of the label 
-and its parents starting from the document root constitutes the complete *entry* 
-of the label, which uniquely identifies its position in the document.
-
-Generally the structure of the OCAF tree of the *TObj* data 
-model corresponds to the logical structure of the model and can be presented as in the following picture: 
-
-@figure{/user_guides/tobj/images/tobj_image004.png,"TObj Data Model mapped on OCAF document",360}
-
-All data of the model are stored in the root label (0:1) of the OCAF document. 
-An attribute *TObj_TModel* is located in this root label. It 
-stores the object of type *TObj_Model*. This object serves as a main interface tool 
-to access all data and functionalities of the data model.
-
-In simple cases all data needed by the application may be 
-contained in a single data model. Moreover, *TObj* gives the possibility to 
-distribute the data between several interconnected data models. This can be 
-especially useful for the applications dealing with great amounts of data. because 
-only the data required for the current operation is loaded in the memory at one time. 
-It is presumed that the models have a hierarchical (tree-like) structure, 
-where the objects of the child models can refer to the objects of the parent 
-models, not vice-versa. Provided that the correct order of loading and closing 
-of the models is ensured, the *TObj* classes will maintain references between the objects automatically.
-
-@subsection occt_tobj_2_2 Data Model basic features
-
-The class *TObj_Model* describing the data model provides the following functionalities: 
-
-  * Loading and saving of the model from or in a file (methods *Load* and *Save*)
-  * Closing and removal of the model from memory (method *Close*)
-  * Definition of the full file name of the persistence storage for this model (method *GetFile*)
-  * Tools to organize data objects in partitions and iterate on objects (methods *GetObjects*, *GetMainPartition*, *GetChildren*, *getPartition*, *getElementPartition*)
-  * Mechanism to give unique names to model objects 
-  * Copy (*clone*) of the model (methods *NewEmpty* and *Paste*)
-  * Support of earlier model formats for proper conversion of a model loaded from a file written by a previous version of the application (methods *GetFormatVersion* and *SetFormatVersion*)
-  * Interface to check and update the model if necessary (method *Update*)
-  * Support of several data models in one application. For this feature use OCAF multi-transaction manager, unique names and GUIDs of the data model (methods *GetModelName*, *GetGUID*)
-
-@subsection occt_tobj_2_3 Model Persistence
-
-The persistent representation of any OCAF model is contained in an XML or a binary file, 
-which is defined by the format string returned by the method *GetFormat*. 
-The default implementation works with a binary OCAF document format (*BinOcaf*). 
-The other available format is *XmlOcaf*. The class **TObj_Model** declares and provides a default 
-implementation of two virtual methods: 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean Load (const char* theFile); 
-    virtual Standard_Boolean SaveAs (const char* theFile); 
-~~~~~
-
-which retrieve and store the model from or 
-in the OCAF file. The descendants 
-should define the following protected method to support Load and Save operations:
-
-~~~~~{.cpp}
-    virtual Standard_Boolean initNewModel (const Standard_Boolean IsNew); 
-~~~~~
-
-This method is called by *Load* after creation of a new model 
-or after its loading from the file; its purpose is to perform 
-the necessary initialization of the model (such as creation of necessary top-level 
-partitions, model update due to version changes etc.). Note that if 
-the specified file does not exist, method *Load* will create 
-a new document and call *initNewModel* with the argument **True**. 
-If the file has been normally loaded, the argument **False** is passed. 
-Thus, a new empty *TObj* model is created by calling *Load* with an empty 
-string or the path to a nonexistent file as argument. 
-
-The method *Load* returns **True** if the model has been retrieved successfully 
-(or created a new), or **False** if the model could not be loaded. 
-If no errors have been detected during initialization (model retrieval or creation),
-the virtual method *AfterRetrieval* is invoked for all objects of the model. 
-This method initializes or updates the objects immediately after the model initialization. 
-It could be useful when some object data should be imported from an OCAF attribute into transient 
-fields which could be changed outside of the OCAF transaction mechanism. 
-Such fields can be stored into OCAF attributes for saving into persistent storage during the save operation.
-
-To avoid memory leaks, the *TObj_Model* class destructor invokes *Close* method 
-which clears the OCAF document and removes all data from memory before the model is destroyed.
-
-For XML and binary persistence of the *TObj* data model the corresponding drivers are implemented 
-in *BinLDrivers*, *BinMObj* and *XmlLDrivers*, *XmlMObj* packages. 
-These packages contain retrieval and storage drivers for the model, model objects and custom attributes 
-from the *TObj* package. The schemas support persistence for the standard OCAF and *TObj* attributes. 
-This is sufficient for the implementation of simple data models, but 
-in some cases it can be reasonable to add specific OCAF attributes to 
-facilitate the storage of the data specific to the application. 
-In this case the schema should be extended using the standard OCAF mechanism. 
-
-@subsection occt_tobj_2_4 Access to the objects in the model
-
-All objects in the model are stored in the main partition and accessed by iterators.
-To access all model objects use: 
-
-~~~~~{.cpp}
-    virtual Handle(TObj_ObjectIterator) GetObjects () const; 
-~~~~~
-
-This method returns a recursive iterator on all objects stored in the model.
-
-~~~~~{.cpp}
-    virtual Handle(TObj_ObjectIterator) GetChildren () const; 
-~~~~~
-
-This method returns an iterator on child objects of the main partition.
-Use the following method to get the main partition: 
-
-~~~~~{.cpp}
-    Handle(TObj_Partition) GetMainPartition() const; 
-~~~~~
-
-To receive the iterator on objects of a specific type *AType* use the following call: 
-
-~~~~~{.cpp}
-    GetMainPartition()->GetChildren(STANDARD_TYPE(AType) ); 
-~~~~~
-
-The set of protected methods is provided for descendant classes to deal with partitions: 
-
-~~~~~{.cpp}
-    virtual Handle(TObj_Partition) getPartition (const TDF_Label, const Standard_Boolean  theHidden) const; 
-~~~~~
-
-This method returns (creating if necessary) a partition in the specified label of the document. 
-The partition can be created as hidden (*TObj_HiddenPartition* class). 
-A hidden partition can be useful to distinguish the data that 
-should not be visible to the user when browsing the model in the application. 
-
-The following two methods allow getting (creating) a partition 
-in the sub-label of the specified label in the document 
-(the label of the main partition for the second method) and with the given name: 
-
-~~~~~{.cpp}
-    virtual Handle(TObj_Partition) getPartition (const TDF_Label, const Standard_Integer theIndex, const TCollection_ExtendedString& theName, const Standard_Boolean  theHidden) const; 
-    virtual Handle(TObj_Partition) getPartition (const Standard_Integer theIndex, const TCollection_ExtendedString& theName, const Standard_Boolean  theHidden) const; 
-~~~~~
-
-If the default object naming and the name register mechanism 
-is turned on, the object can be found in the model by its unique name: 
-
-~~~~~{.cpp}
-    Handle(TObj_Object) FindObject (const Handle(TCollection_HExtendedString)& theName, const Handle(TObj_TNameContainer)& theDictionary) const; 
-~~~~~
-
-@subsection occt_tobj_2_5 Own model data
-
-The model object can store its own data in the Data label 
-of its main partition, however, there is no standard API for 
-setting and getting these data types. The descendants can add 
-their own data using standard OCAF methods. The enumeration DataTag is defined 
-in *TObj_Model* to avoid conflict of data labels used by this class 
-and its descendants, similarly to objects (see below). 
-
-@subsection occt_tobj_2_6 Object naming
-
-The basic implementation of *TObj_Model* provides the default 
-naming mechanism: all objects must have unique names, 
-which are registered automatically in the data model dictionary. 
-The dictionary is a *TObj_TNameContainer* 
-attribute whose instance is located in the model root label.
-If necessary, the developer can add several dictionaries into 
-the specific partitions, providing the name registration in the 
-correct name dictionary and restoring the name map after document is loaded from file.
-To ignore name registering it is necessary to redefine the methods *SetName*, 
-*AfterRetrieval* of the *TObj_Object* class and skip the registration of the object name. 
-Use the following methods for the naming mechanism: 
-
-~~~~~{.cpp}
-    Standard_Boolean IsRegisteredName (const Handle(TCollection_HExtendedString)& theName, const Handle(TObj_TNameContainer)& theDictionary ) const; 
-~~~~~
-
-Returns **True** if the object name is already registered in the indicated (or model) dictionary. 
-
-~~~~~{.cpp}
-    void RegisterName (const Handle(TCollection_HExtendedString)& theName, const TDF_Label& theLabel, const Handle(TObj_TNameContainer)& theDictionary ) const; 
-~~~~~
-
-Registers the object name with the indicated label where the object 
-is located in the OCAF document. Note that the default implementation 
-of the method *SetName* of the object registers the new name automatically 
-(if the name is not yet registered for any other object) 
-
-~~~~~{.cpp}
-    void UnRegisterName (const Handle(TCollection_HExtendedString)& theName, const Handle(TObj_TNameContainer)& theDictionary ) const; 
-~~~~~
-
-Unregisters the name from the dictionary. Ther names of *TObj* model 
-objects are removed from the dictionary when the objects are deleted from the model. 
-
-~~~~~{.cpp}
-    Handle(TObj_TNameContainer) GetDictionary() const;
-~~~~~
-
-Returns a default instance of the model dictionary (located at the model root label). 
-The default implementation works only with one dictionary. 
-If there are a necessity to have more than one dictionary for the model objects, 
-it is recommended to redefine the corresponding virtual method of TObj_Object 
-that returns the dictionary where names of objects should be registered.
-
-@subsection occt_tobj_2_7 API for transaction mechanism
-
-Class *TObj_Model* provides the API for transaction mechanism (supported by OCAF): 
-
-~~~~~{.cpp}
-    Standard_Boolean HasOpenCommand() const; 
-~~~~~
-
-Returns True if a Command transaction is open 
-
-~~~~~{.cpp}
-    void OpenCommand() const; 
-~~~~~
-
-Opens a new command transaction. 
-
-~~~~~{.cpp}
-    void CommitCommand() const; 
-~~~~~
-
-Commits the Command transaction. Does nothing If there is no open Command transaction. 
-
-~~~~~{.cpp}
-    void AbortCommand() const; 
-~~~~~
-
-Aborts the Command transaction. Does nothing if there is no open Command transaction. 
-
-~~~~~{.cpp}
-    Standard_Boolean IsModified() const; 
-~~~~~
-
-Returns True if the model document has a modified status (has changes after the last save) 
-
-~~~~~{.cpp}
-    void SetModified( const Standard_Boolean ); 
-~~~~~
-
-Changes the modified status by force. For synchronization of transactions 
-within several *TObj_Model* documents use class *TDocStd_MultiTransactionManager*. 
-
-@subsection occt_tobj_28 Model format and version
-
-Class *TObj_Model* provides the descendant classes with a means to control 
-the format of the persistent file by choosing the schema used to store or retrieve operations. 
-
-~~~~~{.cpp}
-    virtual TCollection_ExtendedString GetFormat () const; 
-~~~~~
-
-Returns the string *TObjBin* or *TObjXml* indicating 
-the current persistent mechanism. The default value is *TObjBin*. 
-Due to the evolution of functionality of the developed application, 
-the contents and the structure of its data model vary from version to version. 
-*TObj* package provides a basic mechanism supporting backward versions compatibility, 
-which means that newer versions of the application will be able to read 
-Data Model files created by previous versions (but not vice-versa) with a minimum loss of data. 
-For each type of Data Model, all known versions of the data format 
-should be enumerated in increasing order, incremented with every change 
-of the model format. The current version of the model 
-format is stored in the model file and can be checked upon retrieval. 
-
-~~~~~{.cpp}
-    Standard_Integer GetFormatVersion() const; 
-~~~~~
-
-Returns the format version stored in the model file 
-
-~~~~~{.cpp}
-    void SetFormatVersion(const Standard_Integer theVersion); 
-~~~~~
-
-Defines the format version used for save. 
-
-Upon loading a model, the method *initNewModel()*, called immediately 
-after opening a model from disk (on the level of the OCAF document), 
-provides a specific code that checks the format version stored in that model. 
-If it is older than the current version of the application, the data update can be performed. 
-Each model can have its own specific conversion code 
-that performs the necessary data conversion to make them compliant with the current version. 
-
-When the conversion ends the user is advised of that by the messenger interface 
-provided by the model (see messaging chapter for more details), 
-and the model version is updated. If the version of data model is not supported 
-(it is newer than the current or too old), the load operation should fail. 
-The program updating the model after version change can be implemented as static 
-methods directly in C++ files of the corresponding Data Model classes, 
-not exposing it to the other parts of the application. 
-These codes can use direct access to the model and objects data (attributes) 
-not using objects interfaces, because the data model API and object classes 
-could have already been changed. 
-
-Note that this mechanism has been designed to maintain version compatibility 
-for the changes of data stored in the model, not for the changes of 
-low-level format of data files (such as the storage format of a specific OCAF attribute). 
-If the format of data files changes, a specific treatment on a case-by-case basis will be required. 
-
-@subsection occt_tobj_2_9 Model update
-
-The following methods are used for model update to ensure its consistency 
-with respect to the other models in case of cross-model dependencies: 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean Update(); 
-~~~~~
-
-This method is usually called after loading of the model. 
-The default implementation does nothing and returns **True**. 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean initNewModel( const Standard_Boolean IsNew); 
-~~~~~
-
-This method performs model initialization, check and updates (as described above). 
-
-~~~~~{.cpp}
-    virtual void updateBackReferences( const Handle(TObj_Object)& theObj); 
-~~~~~
-
-This method is called from the previous method to update back references 
-of the indicated object after the retrieval of the model from file 
-(see data model - object relationship chapter for more details) 
-
-@subsection occt_tobj_2_10 Model copying
-
-To copy the model between OCAF documents use the following methods: 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean Paste (Handle(TObj_Model) theModel, Handle(TDF_RelocationTable) theRelocTable = 0 ); 
-~~~~~
-
-Pastes the current model to the new model. The relocation table 
-ensures correct copying of the sub-data shared by several parts of the model. 
-It stores a map of processed original objects of relevant types in their copies. 
-
-~~~~~{.cpp}
-    virtual Handle(TObj_Model) NewEmpty() = 0; 
-~~~~~
-
-Redefines a pure virtual method to create a new empty instance of the model. 
-
-~~~~~{.cpp}
-    void CopyReferences ( const Handle(TObj_Model)& theTarget, const Handle(TDF_RelocationTable)& theRelocTable); 
-~~~~~
-
-Copies the references from the current model to the target model. 
-
-@subsection occt_tobj_2_11 Messaging
-
-The messaging is organised using Open CASCADE Messenger from the package Message. 
-The messenger is stored as the field of the model instance 
-and can be set and retrieved by the following methods: 
-
-~~~~~{.cpp}
-    void SetMessenger( const Handle(Message_Messenger)& ); 
-    Handle(Message_Messenger) Messenger() const; 
-~~~~~
-
-A developer should create his own instance of the Messenger 
-bound to the application user interface, and attribute it to the model 
-for future usage. In particular the messenger is used for reporting 
-errors and warnings in the persistence mechanism. 
-Each message has a unique string identifier (key). 
-All message keys are stored in a special resource file TObj.msg. 
-This file should be loaded at the start of the application 
-by call to the appropriate method of the class *Message_MsgFile*. 
-
-@section occt_tobj_3 Model object
-
-Class *TObj_Object* provides basic interface and default implementation 
-of important features of *TObj* model objects. This implementation defines 
-basic approaches that are recommended for all descendants, 
-and provides tools to facilitate their usage. 
-
-@figure{/user_guides/tobj/images/tobj_image005.png,"TObj objects hierarchy",170}
-
-@subsection occt_tobj_3_1 Separation of data and interface
-
-In the *TObj* data model, the data are separated from the interfaces that manage them. 
-The data belonging to a model object are stored in its root label and sub-labels 
-in the form of standard OCAF attributes. This allows using standard OCAF mechanisms 
-for work with these data, and eases the implementation of the persistence mechanism. 
-
-The instance of the interface which serves as an API for managing object data 
-(e.g. represents the model object) is stored in the root label of the object, 
-and typically does not bring its own data. The interface classes are organized in a hierarchy 
-corresponding to the natural hierarchy of the model objects according to the application. 
-
-In the text below the term 'object' is used to denote either the instance 
-of the interface class or the object itself (both interface and data stored in OCAF). 
-
-The special type of attribute *TObj_TObject* is used for storing instances of objects interfaces 
-in the OCAF tree. *TObj_TObject* is a simple container for the object of type *TObj_Object*. 
-All objects (interfaces) of the data model  inherit this class. 
-
-@figure{/user_guides/tobj/images/tobj_image006.png,"TObj object stored on OCAF label",360}
-
-
-@subsection occt_tobj_3_2 Basic features
-
-The *TObj_Object* class provides some basic features that can be inherited (or, if necessary, redefined) by the descendants: 
-
-  * Gives access to the model to which the object belongs (method *GetModel*) and to the OCAF label in which the object is stored (method *GetLabel*). 
-  * Supports references (and back references) to other objects in the same or in another model (methods *getReference*, *setReference*, *addReference*, *GetReferences*, *GetBackReferences*, *AddBackReference*, *RemoveBackReference*, *ReplaceReference*)
-  * Provides the ability to contain child objects, as it is actual for partition objects (methods *GetChildren*, *GetFatherObject*)
-  * Organizes its data in the OCAF structure by separating the sub-labels of the main label intended for various kinds of data and providing tools to organize these data (see <a href="../../../../Documents%20and%20Settings/TEMP/obj-inher">below</a>). The kinds of data stored separately are: 
-         * Child objects stored in the label returned by the method *GetChildLabel* 
-         * References to other objects stored in the label returned by the method *GetReferenceLabel* 
-         * Other data, both common to all objects and specific for each subtype of the model object, are stored in the label returned by the method *GetDataLabel* 
-  * Provides unique names of all objects in the model (methods *GetDictionary*, *GetName*, *SetName*)
-  * Provides unified means to maintain persistence (implemented in descendants with the help of macros *DECLARE_TOBJOCAF_PERSISTENCE* and *IMPLEMENT_TOBJOCAF_PERSISTENCE*)
-  * Allows an object to remove itself from the OCAF document and check the depending objects can be deleted according to the  back references (method *Detach*)
-  * Implements methods for identification and versioning of objects 
-  * Manages the object interaction with OCAF Undo/Redo mechanism (method *IsAlive*, *AfterRetrieval*, *BeforeStoring*)
-  * Allows make a clone (methods *Clone*, *CopyReferences*, *CopyChildren*, *copyData*)
-  * Contains additional word of bit flags (methods *GetFlags*, *SetFlags*, *TestFlags*, *ClearFlags*)
-  * Defines the interface to sort the objects by rank (methods *GetOrder*, *SetOrder*)
-  * Provides a number of auxiliary methods for descendants to set/get the standard attribute values, such as int, double, string, arrays etc.
-
-An object can be received from the model by the following methods: 
-
-~~~~~{.cpp}
-    static Standard_Boolean GetObj ( const TDF_Label& theLabel, Handle(TObj_Object)& theResObject, const Standard_Boolean isSuper = Standard_False ); 
-~~~~~
-
-Returns *True* if the object has been found in the indicated label (or in the upper level label if *isSuper* is *True*). 
-
-~~~~~{.cpp}
-    Handle(TObj_Object) GetFatherObject ( const Handle(Standard_Type)& theType = NULL ) const; 
-~~~~~
-
-Returns the father object of the indicated type 
-for the current object (the direct father object if the type is NULL). 
-
-@subsection occt_tobj_3_3 Data layout and inheritance
-
-As far as the data objects are separated from the interfaces and stored in the OCAF tree, 
-the functionality to support inheritance is required. Each object has its own data 
-and references stored in the labels in the OCAF tree. All data are stored in the sub-tree 
-of the main object label. If it is necessary to inherit a class from the base class, 
-the descendant class should use different labels for data and references than its ancestor. 
-
-Therefore each *TObj* class can reserve the range of tags in each of 
-*Data*, *References*, and *Child* sub-labels. 
-The reserved range is declared by the enumeration defined 
-in the class scope (called DataTag, RefTag, and ChildTag, respectively). 
-The item *First* of the enumeration of each type is defined via the *Last* item 
-of the corresponding enumeration of the parent class, thus ensuring that the tag numbers 
-do not overlap. The item *Last* of the enumeration defines the last tag reserved by this class. 
-Other items of the enumeration define the tags used for storing particular data items of the object. 
-See the declaration of the TObj_Partition class for the example. 
-
-*TObj_Object* class provides a set of auxiliary methods for descendants 
-to access the data stored in sub-labels by their tag numbers: 
-
-~~~~~{.cpp}
-    TDF_Label getDataLabel (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; 
-    TDF_Label getReferenceLabel (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; 
-~~~~~
-
-Returns the label in *Data* or *References* sub-labels at a given tag number (theRank1). 
-The second argument, theRank2, allows accessing the next level of hierarchy 
-(theRank2-th sub-label of theRank1-th data label). 
-This is useful when the data to be stored are represented by multiple OCAF attributes 
-of the same type (e.g. sequences of homogeneous data or references). 
-
-The get/set methods allow easily accessing the data located in the specified data label 
-for the most widely used data types (*Standard_Real*, *Standard_Integer*, *TCollection_HExtendedString*,
- *TColStd_HArray1OfReal*, *TColStd_HArray1OfInteger*, *TColStd_HArray1OfExtendedString*). 
-For instance, methods provided for real numbers are: 
-
-~~~~~{.cpp}
-    Standard_Real getReal (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; 
-    Standard_Boolean setReal (const Standard_Real theValue, const Standard_Integer theRank1, const Standard_Integer theRank2 = 0, const Standard_Real theTolerance = 0.) const; 
-~~~~~
-
-Similar methods are provided to access references to other objects: 
-
-~~~~~{.cpp}
-    Handle(TObj_Object) getReference (const Standard_Integer theRank1, const Standard_Integer theRank2 = 0) const; 
-    Standard_Boolean setReference (const Handle(TObj_Object) &theObject, const Standard_Integer theRank1, const Standard_Integer theRank2 = 0); 
-~~~~~
-
-The method *addReference* gives an easy way to store a sequence of homogeneous references in one label. 
-
-~~~~~{.cpp}
-    TDF_Label addReference (const Standard_Integer theRank1, const Handle(TObj_Object) &theObject); 
-~~~~~
-
-Note that while references to other objects should be defined by descendant classes 
-individually according to the type of object, *TObj_Object* provides methods 
-to manipulate (check, remove, iterate) the existing references in the uniform way, as described below. 
-
-@subsection occt_tobj_3_4 Persistence
-
-The persistence of the *TObj* Data Model is implemented with the help 
-of standard OCAF mechanisms (a schema defining necessary plugins, drivers, etc.). 
-This implies the possibility to store/retrieve all data that are stored 
-as standard OCAF attributes., The corresponding handlers are added 
-to the drivers for *TObj*-specific attributes. 
-
-The special tool is provided for classes inheriting from *TObj_Object* 
-to add the new types of persistence without regeneration of the OCAF schema. 
-The class *TObj_Persistence* provides basic means for that: 
-
-  * automatic run-time registration of object types
-  * creation of a new object of the specified type (one of the registered types) 
-
-Two macros defined in the file TObj_Persistence.hxx have to be included in the definition 
-of each model object class inheriting TObj_Object to activate the persistence mechanism: 
-
-~~~~~{.cpp}
-    DECLARE_TOBJOCAF_PERSISTENCE (classname, ancestorname) 
-~~~~~
-
-Should be included in the private section of declaration of each class inheriting 
-*TObj_Object* (hxx file). This macro adds an additional constructor to the object class, 
-and declares an auxiliary (private) class inheriting *TObj_Persistence* 
-that provides a tool to create a new object of the proper type. 
-
-~~~~~{.cpp}
-    IMPLEMENT_TOBJOCAF_PERSISTENCE (classname) 
-~~~~~
-
-Should be included in .cxx file of each object class that should be saved and restored. 
-This is not needed for abstract types of objects. This macro implements the functions 
-declared by the previous macro and creates a static member 
-that automatically registers that type for persistence. 
-
-When the attribute *TObj_TObject* that contains the interface object is saved, 
-its persistence handler stores the runtime type of the object class. 
-When the type is restored the handler dynamically recognizes the type 
-and creates the corresponding object using mechanisms provided by *TObj_Persistence*. 
-
-@subsection occt_tobj_3_5 Names of objects
-
-All *TObj* model objects  have names by which the user can refer to the object. 
-Upon creation, each object receives a default name, constructed 
-from the prefix corresponding to the object type (more precisely, the prefix is defined 
-by the partition to which the object belongs), and the index of the object in the current partition. 
-The user has the possibility to change this name. The uniqueness of the name in the model is ensured 
-by the naming mechanism (if the name is already used, it cannot be attributed to another object). 
-This default implementation of *TObj* package works with a single instance of the name container (dictionary) 
-for name registration of objects and it is enough in most simple projects. 
-If necessary, it is easy to redefine a couple of object methods 
-(for instance *GetDictionary*()) and to take care of  construction and initialization of containers. 
-
-This functionality is provided by the following methods: 
-
-~~~~~{.cpp}
-    virtual Handle(TObj_TNameContainer) GetDictionary() const; 
-~~~~~
-
-Returns the name container where the name of object should be registered. 
-The default implementation returns the model name container. 
-
-~~~~~{.cpp}
-    Handle(TCollection_HExtendedString) GetName() const; 
-    Standard_Boolean GetName( TCollection_ExtendedString& theName ) const; 
-    Standard_Boolean GetName( TCollection_AsciiString& theName ) const; 
-~~~~~
-
-Returns the object name. The methods with in / out argument return False if the object name is not defined. 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean SetName ( const Handle(TCollection_HExtendedString)& theName ) const; 
-    Standard_Boolean SetName         ( const Handle(TCollection_HAsciiString)& theName ) const; 
-    Standard_Boolean SetName         ( const Standard_CString theName ) const; 
-~~~~~
-
-Attributes a new name to the object and returns **True** if the name has been attributed successfully. 
-Returns False if the name has been already attributed to another object. 
-The last two methods are short-cuts to the first one. 
-
-@subsection occt_tobj_3_6 References between objects 
-
-Class *TObj_Object* allows creating references to other objects in the model. 
-Such references describe relations among objects which are not adequately reflected 
-by the hierarchical objects structure in the model (parent-child relationship). 
-
-The references are stored internally using the attribute TObj_TReference. 
-This attribute is located in the sub-label of the referring object (called *master*) 
-and keeps reference to the main label of the referred object. 
-At the same time the referred object can maintain the back reference to the master object. 
-
-@figure{/user_guides/tobj/images/tobj_image007.png,"Objects relationship",360}
-
-
-
-The back references are stored not in the OCAF document but as a transient field 
-of the object; they are created when the model is restored from file, 
-and updated automatically when the references are manipulated. 
-The class *TObj_TReference* allows storing references between objects 
-from different *TObj* models, facilitating the construction of complex relations between objects. 
-
-The most used methods for work with references are: 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean HasReference( const Handle(TObj_Object)& theObject) const; 
-~~~~~
-
-Returns True if the current object refers to the indicated object. 
-
-~~~~~{.cpp}
-    virtual Handle(TObj_ObjectIterator) GetReferences ( const Handle(Standard_Type)& theType = NULL ) const; 
-~~~~~
-
-Returns an iterator on the object references. The optional argument *theType* 
-restricts the types of referred objects, or does not if it is NULL. 
-
-~~~~~{.cpp}
-    virtual void RemoveAllReferences(); 
-~~~~~
-
-Removes all references from the current object. 
-
-~~~~~{.cpp}
-    virtual void RemoveReference( const Handle(TObj_Object)& theObject ); 
-~~~~~
-
-Removes the reference to the indicated object. 
-
-~~~~~{.cpp}
-    virtual Handle(TObj_ObjectIterator) GetBackReferences ( const Handle(Standard_Type)& theType = NULL ) const; 
-~~~~~
-
-Returns an iterator on the object back references. 
-The argument theType restricts the types of master objects, or does not if it is NULL. 
-
-~~~~~{.cpp}
-    virtual void ReplaceReference  ( const Handle(TObj_Object)& theOldObject,  const Handle(TObj_Object)& theNewObject ); 
-~~~~~
-
-Replaces the reference to theOldObject by the reference to *theNewObject*. 
-The handle theNewObject may be NULL to remove the reference. 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean RelocateReferences  ( const TDF_Label& theFromRoot,  const TDF_Label& theToRoot, const Standard_Boolean theUpdateackRefs = Standard_True ); 
-~~~~~
-
-Replaces all references to a descendant label of *theFromRoot* 
-by the references to an equivalent label under *theToRoot*. 
-Returns **False** if the resulting reference does not point at a *TObj_Object*. 
-Updates back references if theUpdateackRefs is **True**. 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean CanRemoveReference ( const Handle(TObj_Object)& theObj) const; 
-~~~~~
-
-Returns **True** if the reference can be removed and the master object 
-will remain valid (*weak* reference). 
-Returns **False** if the master object cannot be valid without the referred object (*strong* reference). 
-This affects the behaviour of objects removal from the model -- if the reference cannot be removed, 
-either the referred object will not be removed, or both the referred 
-and the master objects will be removed (depends on the deletion mode in the method **Detach**) 
-
-@subsection occt_tobj_3_7 Creation and deletion of objects
-
-It is recommended that all objects inheriting from *TObj_Object*
- should implement the same approach to creation and deletion. 
-The object of the *TObj* data model cannot be created independently 
-of the model instance, as far as it stores the object data in OCAF data structures. 
-Therefore an object class cannot be created directly as its constructor is protected. 
-
-Instead, each object should provide a static method *Create*(), which accepts the model, 
-with the label, which stores the object and other type-dependent parameters 
-necessary for proper definition of the object. This method creates a new object with its data 
-(a set of OCAF attributes) in the specified label, and returns a handle to the object's interface. 
-
-The method *Detach*() is provided for deletion of objects from OCAF model. 
-Object data are deleted from the corresponding OCAF label; however, 
-the handle on object remains valid. The only operation available after object deletion 
-is the method *IsAlive*()  checking whether the object has been deleted or not, 
-which returns False if the object has been deleted. 
-
-When the object is deleted from the data model, the method checks 
-whether there are any alive references to the object. 
-Iterating on references the object asks each referring (master) object 
-whether the reference can be removed. If the master object can be unlinked, 
-the reference is removed, otherwise the master object will be removed too 
-or the referred object will be kept alive. This check is performed by the method *Detach* , 
-but the behavior depends on the deletion mode *TObj_DeletingMode*: 
-
-  * **TObj_FreeOnly** -- the object will be destroyed only if it is free, i.e. there are no references to it from other objects
-  * **TObj_KeepDepending** -- the object will be destroyed if there are no strong references to it from master objects (all references can be unlinked)
-  * **TObj_Force** -- the object and all depending master objects that have strong references to it will be destroyed.
-
-The most used methods for object removing are: 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean CanDetachObject (const TObj_DeletingMode theMode = TObj_FreeOnly ); 
-~~~~~
-
-Returns **True** if the object can be deleted with the indicated deletion mode. 
-
-~~~~~{.cpp}
-    virtual Standard_Boolean Detach ( const TObj_DeletingMode theMode = TObj_FreeOnly ); 
-~~~~~
-
-Removes the object from the document if possible 
-(according to the indicated deletion mode). 
-Unlinks references from removed objects. 
-Returns **True** if the objects have been successfully deleted. 
-
-@subsection occt_tobj_3_8 Transformation and replication of object data
-
-*TObj_Object* provides a number of special virtual methods  to support replications of objects. These methods should be redefined by descendants when necessary. 
-
-~~~~~{.cpp}
-    virtual Handle(TObj_Object) Clone (const TDF_Label& theTargetLabel, Handle(TDF_RelocationTable) theRelocTable = 0); 
-~~~~~
-
-Copies the object to theTargetLabel. The new object will have all references of its original. 
-Returns a handle to the new object (null handle if fail). The data are copied directly, 
-but the name is changed by adding the postfix *_copy*. 
-To assign different names to the copies redefine the method: 
-
-~~~~~{.cpp}
-    virtual Handle(TCollection_HExtendedString) GetNameForClone ( const Handle(TObj_Object)& ) const; 
-~~~~~
-
-Returns the name for a new object copy. It could be useful to return the same object name 
-if the copy will be in the other model or in the other partition with its own dictionary. 
-The method *Clone* uses the following public methods for object data replications: 
-
-~~~~~{.cpp}
-    virtual void CopyReferences (const const Handle(TObj_Object)& theTargetObject, const Handle(TDF_RelocationTable) theRelocTable); 
-~~~~~
-
-Adds to the copy of the original object its references. 
-
-~~~~~{.cpp}
-    virtual void CopyChildren (TDF_Label& theTargetLabel, const Handle(TDF_RelocationTable) theRelocTable); 
-~~~~~
-
-Copies the children of an object to the target child label. 
-
-@subsection occt_tobj_3_9 Object flags
-
-Each instance of *TObj_Object* stores a set of bit flags, 
-which facilitate the storage of auxiliary logical information assigned to the objects 
-(object state). Several typical state flags are defined in the enumeration *ObjectState*: 
-
-  * *ObjectState_Hidden* -- the object is marked as hidden
-  * *ObjectState_Saved* -- the object has (or should have) the corresponding saved file on disk
-  * *ObjectState_Imported* -- the object is imported from somewhere
-  * *ObjectState_ImportedByFile* -- the object has been imported from file and should be updated to have correct relations with other objects
-  * *ObjectState_Ordered* -- the partition contains objects that can be ordered.
-
-The user (developer) can define any new flags in descendant classes. 
-To set/get an object, the flags use the following methods: 
-
-~~~~~{.cpp}
-    Standard_Integer GetFlags() const; 
-    void SetFlags( const Standard_Integer theMask ); 
-    Stadnard_Boolean TestFlags( const Standard_Integer theMask ) const; 
-    void ClearFlags( const Standard_Integer theMask = 0 ); 
-~~~~~
-
-In addition, the generic virtual interface stores the logical properties 
-of the object class in the form of a set of bit flags. 
-Type flags can be received by the method: 
-
-~~~~~{.cpp}
-    virtual Standard_Integer GetTypeFlags() const; 
-~~~~~
-
-The default implementation returns the flag **Visible** 
-defined in the enumeration *TypeFlags*. This flag is used to define visibility 
-of the object for the user browsing the model (see class *TObj_HiddenPartition*). 
-Other flags can be added by the applications. 
-
-@subsection occt_tobj_310 Partitions
-
-The special kind of objects defined by the class *TObj_Partition* 
-(and its descendant *TObj_HiddenPartition*) is provided for partitioning 
-the model into a hierarchical structure. This object represents the container 
-of other objects. Each *TObj* model contains the main partition that is placed 
-in the same OCAF label as the model object, and serves as a root of the object's tree. 
-A hidden partition is a simple partition with a predefined hidden flag. 
-
-The main partition object methods: 
-
-~~~~~{.cpp}
-    TDF_Label NewLabel() const; 
-~~~~~
-
-Allocates and returns a new label for creation of a new child object. 
-
-~~~~~{.cpp}
-    void SetNamePrefix  ( const Handle(TCollection_HExtendedString)& thePrefix); 
-~~~~~
-
-Defines the prefix for automatic generation of names of the newly created objects. 
-
-~~~~~{.cpp}
-    Handle(TCollection_HExtendedString) GetNamePrefix() const; 
-~~~~~
-
-Returns the current name prefix. 
-
-~~~~~{.cpp}
-    Handle(TCollection_HExtendedString) GetNewName ( const Standard_Boolean theIsToChangeCount) const; 
-~~~~~
-
-Generates the new name and increases the internal counter of child objects if theIsToChangeCount is **True**. 
-
-~~~~~{.cpp}
-    Standard_Integer GetLastIndex() const; 
-~~~~~
-
-Returns the last reserved child index. 
-
-~~~~~{.cpp}
-    void SetLastIndex( const Standard_Integer theIndex ); 
-~~~~~
-
-Sets the last reserved index. 
-
-@section occt_tobj_4 Auxiliary classes
-
-Apart from the model and the object, package *TObj* provides a set of auxiliary classes: 
-
-  * *TObj_Application* -- defines OCAF application supporting existence and operation with *TObj* documents.
-  * *TObj_Assistant* -- class provides an interface to the static data to be used during save and load operations on models. In particular, in case of cross-model dependencies it allows passing information on the parent model to the OCAF loader to correctly resolve the references when loading a dependent model.
-  * *TObj_TReference* -- OCAF attribute describes the references between objects in the *TObj* model(s). This attribute stores the label of the referred model object, and provides transparent cross-model references. At runtime, these references are simple Handles; in persistence mode, the cross-model references are automatically detected and processed by the persistence mechanism of *TObj_TReference* attribute. 
-  * Other classes starting with *TObj_T...* -- define OCAF attributes used to store TObj-specific classes and some types of data on OCAF labels. 
-  * Iterators -- a set of classes implementing *TObj_ObjectIterator* interface, used for iterations on *TObj* objects:
-         * *TObj_ObjectIterator* -- a basic abstract class for other *TObj* iterators. Iterates on *TObj_Object* instances. 
-         * *TObj_LabelIterator* -- iterates on object labels in the *TObj* model document 
-         * *TObj_ModelIterator* -- iterates on all objects in the model. Works with sequences of other iterators. 
-         * *TObj_OcafObjectIterator* -- Iterates on *TObj* data model objects. Can iterate on objects of a specific type. 
-         * *TObj_ReferenceIterator* -- iterates on object references. 
-         * *TObj_SequenceIterator* -- iterates on a sequence of *TObj* objects. 
-         * *TObj_CheckModel* -- a tool that checks the internal consistency of the model. The basic implementation checks only the consistency of references between objects.
-
-The structure of *TObj* iterators hierarchy is presented below: 
-
-@figure{/user_guides/tobj/images/tobj_image008.png,"Hierarchy of iterators",420}
-
-
-@section occt_tobj_5 Packaging
-
-The *TObj* sources are distributed in the following packages: 
-
-  * *TObj* -- defines basic classes that implement *TObj* interfaces for OCAF-based modelers.
-  * *BinLDrivers, XmlLDrivers* -- binary and XML driver of *TObj* package
-  * *BinLPlugin, XmlLPlugin* -- plug-in for binary and XML persistence
-  * *BinMObj, XmlMObj* -- binary and XML drivers to store and retrieve specific *TObj* data to or from OCAF document
-  * *TKBinL, TKXmlL* -- toolkits of binary and XML persistence
-
-
-