#include <E57Format.h>
Public Member Functions | |
void | checkInvariant (bool doRecurse=true, bool doUpcast=true) |
Check whether StructureNode class invariant is true. More... | |
int64_t | childCount () const |
Return number of child nodes contained by this StructureNode. More... | |
ImageFile | destImageFile () const |
Get the ImageFile that was declared as the destination for the node when it was created. More... | |
void | dump (int indent=0, std::ostream &os=std::cout) const |
Diagnostic function to print internal state of object to output stream in an indented format. More... | |
ustring | elementName () const |
Get elementName string, that identifies the node in its parent. More... | |
Node | get (const ustring &pathName) const |
Get a child by path name. More... | |
Node | get (int64_t index) const |
Get a child element by positional index. More... | |
bool | isAttached () const |
Has node been attached into the tree of an ImageFile. More... | |
bool | isDefined (const ustring &pathName) const |
Is the given pathName defined relative to this node. More... | |
bool | isRoot () const |
Is this a root node. More... | |
operator Node () const | |
Upcast a StructureNode handle to a generic Node handle. More... | |
Node | parent () const |
Return parent of node, or self if a root node. More... | |
ustring | pathName () const |
Get absolute pathname of node. More... | |
void | set (const ustring &pathName, const Node &n) |
Add a new child at a given path. More... | |
StructureNode ()=delete | |
StructureNode (const Node &n) | |
Downcast a generic Node handle to a StructureNode handle. More... | |
StructureNode (ImageFile destImageFile) | |
Create an empty StructureNode. More... | |
|
delete |
StructureNode::StructureNode | ( | ImageFile | destImageFile | ) |
Create an empty StructureNode.
[in] | destImageFile | The ImageFile where the new node will eventually be stored. |
A StructureNode is a container for collections of named E57 nodes. The destImageFile indicates which ImageFile the StructureNode will eventually be attached to. A node is attached to an ImageFile by adding it underneath the predefined root of the ImageFile (gotten from ImageFile::root). It is not an error to fail to attach the StructureNode to the destImageFile. It is an error to attempt to attach the StructureNode to a different ImageFile.
E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
|
explicit |
Downcast a generic Node handle to a StructureNode handle.
[in] | n | The generic handle to downcast. |
The handle n must be for an underlying StructureNode, otherwise an exception is thrown. In designs that need to avoid the exception, use Node::type() to determine the actual type of the n before downcasting. This function must be explicitly called (c++ compiler cannot insert it automatically).
E57_ERROR_BAD_NODE_DOWNCAST |
Set our shared_ptr to the downcast shared_ptr
References e57::E57_ERROR_BAD_NODE_DOWNCAST, e57::E57_STRUCTURE, and e57::toString().
Check whether StructureNode class invariant is true.
[in] | doRecurse | If true, also check invariants of all children or sub-objects recursively. |
[in] | doUpcast | If true, also check invariants of the generic Node class. |
This function checks at least the assertions in the documented class invariant description (see class reference page for this object). Other internal invariants that are implementation-dependent may also be checked. If any invariant clause is violated, an E57Exception with errorCode of E57_ERROR_INVARIANCE_VIOLATION is thrown.
Checking the invariant recursively may be expensive if the tree is large, so should be used judiciously, in debug versions of the application.
E57_ERROR_INVARIANCE_VIOLATION | or any other E57 ErrorCode |
References e57::Node::checkInvariant(), childCount(), destImageFile(), e57::E57_ERROR_INVARIANCE_VIOLATION, e57::Node::elementName(), get(), isDefined(), and e57::Node::parent().
Referenced by e57::ImageFile::checkInvariant().
int64_t StructureNode::childCount | ( | ) | const |
Return number of child nodes contained by this StructureNode.
E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
Referenced by checkInvariant(), e57::ReaderImpl::ReadData3DGroupsData(), and e57::ReaderImpl::SetUpData3DPointsData().
ImageFile StructureNode::destImageFile | ( | ) | const |
Get the ImageFile that was declared as the destination for the node when it was created.
The first argument of the constructors of each of the 8 types of nodes is an ImageFile that indicates which ImageFile the node will eventually be attached to. This function returns that constructor argument. It is an error to attempt to attach the node to a different ImageFile. However it is not an error to not attach the node to any ImageFile (it's just wasteful). Use Node::isAttached to check if the node actually did get attached.
Referenced by checkInvariant().
void StructureNode::dump | ( | int | indent = 0 , |
std::ostream & | os = std::cout |
||
) | const |
Diagnostic function to print internal state of object to output stream in an indented format.
[in] | indent | Number of spaces to indent all the printed lines of this object. |
[in] | os | Output stream to print on. |
All objects in the E57 Foundation API (with exception of E57Exception) support a dump() function. These functions print out to the console a detailed listing of the internal state of objects. The content of these printouts is not documented, and is really of interest only to implementation developers/maintainers or the really adventurous users. In implementations of the API other than the Reference Implementation, the dump() functions may produce no output (although the functions should still be defined). The output format may change from version to version.
No | E57Exceptions |
ustring StructureNode::elementName | ( | ) | const |
Get elementName string, that identifies the node in its parent.
The elementName is a string associated with each parent-child link between nodes. For a given parent, the elementName uniquely identifies each of its children. Thus, any node in a tree can be identified by a sequence of elementNames that form a path from the tree's root node (see Node::pathName for more details).
Three types of nodes (the container node types) can be parents: StructureNode, VectorNode, and CompressedVectorNode. The children of a StructureNode are explicitly given unique elementNames when they are attached to the parent (using StructureNode::set). The children of VectorNode and CompressedVectorNode are implicitly given elementNames based on their position in the list (starting at "0"). In a CompressedVectorNode, the elementName can become quite large: "1000000000" or more. However in a CompressedVectorNode, the elementName string is not stored in the file and is deduced by the position of the child.
E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
Get a child by path name.
[in] | pathName | The absolute pathname, or pathname relative to this object, of the object to get. The pathName may be relative to this node, or absolute (starting with a "/"). The origin of the absolute path name is the root of the tree that contains this StructureNode. If this StructureNode is not attached to an ImageFile, the pathName origin root will not the root node of an ImageFile. |
E57_ERROR_BAD_PATH_NAME | |
E57_ERROR_PATH_UNDEFINED | |
E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
References pathName().
Referenced by draftguitools.gui_trackers.editTracker::move().
Node StructureNode::get | ( | int64_t | index | ) | const |
Get a child element by positional index.
[in] | index | The index of child element to get, starting at 0. |
The order of children is not specified, and may be different than order the children were added to the StructureNode. The order of children may change if more children are added to the StructureNode.
E57_ERROR_CHILD_INDEX_OUT_OF_BOUNDS | |
E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
Referenced by e57::Node::checkInvariant(), checkInvariant(), e57::ReaderImpl::GetData3DSizes(), e57::ReaderImpl::GetE57Root(), draftguitools.gui_trackers.editTracker::move(), e57::WriterImpl::NewData3D(), Points::E57Reader::read(), e57::ReaderImpl::ReadData3D(), e57::ReaderImpl::ReadData3DGroupsData(), e57::ReaderImpl::ReadImage2D(), e57::WriterImpl::SetUpData3DPointsData(), e57::ReaderImpl::SetUpData3DPointsData(), and e57::WriterImpl::WriteData3DGroupsData().
bool StructureNode::isAttached | ( | ) | const |
Has node been attached into the tree of an ImageFile.
Nodes are attached into an ImageFile tree by inserting them as children (directly or indirectly) of the ImageFile's root node. Nodes can also be attached to an ImageFile if they are used in the codecs
or prototype
trees of an CompressedVectorNode that is attached. Attached nodes will be saved to disk when the ImageFile is closed, and restored when the ImageFile is read back in from disk. Unattached nodes will not be saved to disk. It is not recommended to create nodes that are not eventually attached to the ImageFile.
true
if node is child of (or in codecs or prototype of a child CompressedVectorNode of) the root node of an ImageFile. E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
Is the given pathName defined relative to this node.
[in] | pathName | The absolute pathname, or pathname relative to this object, to check. |
The pathName may be relative to this node, or absolute (starting with a "/"). The origin of the absolute path name is the root of the tree that contains this StructureNode. If this StructureNode is not attached to an ImageFile, the pathName origin root will not the root node of an ImageFile.
E57_ERROR_BAD_PATH_NAME | |
E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
References pathName().
Referenced by e57::Node::checkInvariant(), checkInvariant(), e57::ReaderImpl::GetData3DSizes(), e57::ReaderImpl::GetE57Root(), Points::E57Reader::read(), e57::ReaderImpl::ReadData3D(), e57::ReaderImpl::ReadData3DGroupsData(), e57::ReaderImpl::ReadImage2D(), e57::WriterImpl::SetUpData3DPointsData(), e57::ReaderImpl::SetUpData3DPointsData(), and e57::WriterImpl::WriteData3DGroupsData().
bool StructureNode::isRoot | ( | ) | const |
Is this a root node.
A root node has itself as a parent (it is not a child of any node). Newly constructed nodes (before they are inserted into an ImageFile tree) start out as root nodes. It is possible to temporarily create small trees that are unattached to any ImageFile. In these temporary trees, the top-most node will be a root node. After the tree is attached to the ImageFile tree, the only root node will be the pre-created one of the ImageTree (the one returned by ImageFile::root). The concept of attachment is slightly larger than that of the parent-child relationship (see Node::isAttached and CompressedVectorNode::CompressedVectorNode for more details).
E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
StructureNode::operator Node | ( | ) | const |
Upcast a StructureNode handle to a generic Node handle.
An upcast is always safe, and the compiler can automatically insert it for initializations of Node variables and Node function arguments.
No | E57Exceptions. |
Implicitly upcast from shared_ptr<StructureNodeImpl> to SharedNodeImplPtr and construct a Node object
Node StructureNode::parent | ( | ) | const |
Return parent of node, or self if a root node.
Nodes are organized into trees (acyclic graphs) with a distinguished node (the "top-most" node) called the root node. A parent-child relationship is established between nodes to form a tree. Nodes can have zero or one parent. Nodes with zero parents are called root nodes. In the API, if a node has zero parents it is represented by having itself as a parent. Due to the set-once design of the API, a parent-child relationship cannot be modified once established. A child node can be any of the 8 node types, but a parent node can only be one of the 3 container node types (E57_STRUCTURE, E57_VECTOR, and E57_COMPRESSED_VECTOR). Each parent-child link has a string name (the elementName) associated with it (See Node::elementName for more details). More than one tree can be formed at any given time. Typically small trees are temporarily constructed before attachment to an ImageFile so that they will be written to the disk.
Warning: user algorithms that use this function to walk the tree must take care to handle the case where a node is its own parent (it is a root node). Use Node::isRoot to avoid infinite loops or infinite recursion.
E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
Referenced by PathScripts.PathSimulatorGui.CAMSimTaskUi::accept(), Mod.PartDesign.WizardShaft.Shaft.Shaft::equilibrium(), PathScripts.PathSimulatorGui.CAMSimTaskUi::reject(), and PathScripts.PathOpGui.TaskPanelPage::setParent().
ustring StructureNode::pathName | ( | ) | const |
Get absolute pathname of node.
Nodes are organized into trees (acyclic graphs) by a parent-child relationship between nodes. Each parent-child relationship has an associated elementName string that is unique for a given parent. Any node in a given tree can be identified by a sequence of elementNames of how to get to the node from the root of the tree. An absolute pathname string that is formed by arranging this sequence of elementNames separated by the "/" character with a leading "/" prepended.
Some example absolute pathNames: "/data3D/0/points/153/cartesianX", "/data3D/0/points", "/cameraImages/1/pose/rotation/w", and "/". These examples have probably been attached to an ImageFile. Here is an example absolute pathName of a node in a pose tree that has not yet been attached to an ImageFile: "/pose/rotation/w".
A technical aside: the elementName of a root node does not appear in absolute pathnames, since the "path" is between the staring node (the root) and the ending node. By convention, in this API, a root node has the empty string ("") as its elementName.
E57_ERROR_IMAGEFILE_NOT_OPEN | |
E57_ERROR_INTERNAL | All objects in undocumented state |
Referenced by get(), isDefined(), and set().
Add a new child at a given path.
[in] | pathName | The absolute pathname, or pathname relative to this object, that the child object n will be given. |
[in] | n | The node to be added to the tree with given pathName. |
The pathName may be relative to this node, or absolute (starting with a "/"). The origin of the absolute path name is the root of the tree that contains this StructureNode. If this StructureNode is not attached to an ImageFile, the pathName origin root will not the root node of an ImageFile.
The path name formed from all element names in pathName except the last must exist. If the pathName identifies the child of a VectorNode, then the last element name in pathName must be numeric, and be equal to the childCount of that VectorNode (the request is equivalent to VectorNode::append). The StructureNode must not be a descendent of a homogeneous VectorNode with more than one child.
The element naming grammar specified by the ASTM E57 format standard are not enforced in this function. This would be very difficult to do dynamically, as some of the naming rules involve combinations of names.
References pathName().
Referenced by draftguitools.gui_trackers.editTracker::move(), e57::WriterImpl::NewData3D(), e57::WriterImpl::NewImage2D(), and e57::WriterImpl::WriterImpl().