The dimeModel class organizes a model. More...
#include <dime/Model.h>
Public Member Functions | |
dimeModel (const bool usememhandler=false) | |
~dimeModel () | |
dimeModel * | copy () const |
bool | init () |
bool | read (dimeInput *const in) |
bool | write (dimeOutput *const out) |
int | countRecords () const |
bool | traverseEntities (dimeCallback callback, void *userdata=NULL, bool traverseBlocksSection=false, bool explodeInserts=true, bool traversePolylineVertices=false) |
const char * | addReference (const char *const name, void *id) |
void * | findReference (const char *const name) const |
const char * | findRefStringPtr (const char *const name) const |
void | removeReference (const char *const name) |
class dimeMemHandler * | getMemHandler () |
int | getNumLayers () const |
class dimeLayer * | getLayer (const int idx) const |
class dimeLayer * | getLayer (const char *const layername) const |
class dimeLayer * | addLayer (const char *const layername, const int16 colnum=7, const int16 flags=0) |
const char * | getDxfVersion () const |
const char * | addBlock (const char *const blockname, dimeBlock *const block) |
class dimeBlock * | findBlock (const char *const blockname) |
class dimeSection * | findSection (const char *const sectionname) |
class dimeSection * | findSection (const char *const sectionname) const |
int | getNumSections () const |
class dimeSection * | getSection (const int idx) |
void | insertSection (dimeSection *const section, const int idx=-1) |
void | removeSection (const int idx) |
void | registerHandle (const int handle) |
void | registerHandle (const char *const handle) |
int | getUniqueHandle () |
const char * | getUniqueHandle (char *buf, const int bufsize) |
void | addEntity (dimeEntity *entity) |
Static Public Member Functions | |
static const char * | getVersionString () |
static void | getVersion (int &major, int &minor) |
The dimeModel class organizes a model.
The constructor accepts a boolean value which specifies whether or not a memory handler should be used. The special purpose memory handler used in Coin can be used if you're just going to read a file and write the file, and not do too much dynamic work on the model. The memory handler yields very fast allocation/deallocation, and has virtually no overhead when allocating. This is important if you have large files with millions of records. The disadvantage is that memory will not be freed until the model is destructed, so if you modify your model, e.g. remove or replace an entity, the memory for the now unused entity will not be freed until the model is destructed. Then all used memory will be freed at once.
Also, if you plan to implement your own entities, it takes a bit of extra care to support the memory handler. In short, you should always check if a memory allocator should be used before allocating memory, since the destructor for entities will never be called when a memory handler is used. See the documentation in dimeEntity for more information about how to create your own entities and how to support the memory handler.
dimeModel::dimeModel | ( | const bool | usememhandler = false ) |
Constructor. If usememhandler is TRUE, the dimeMemHandler will be used to allocate entities and records.
References init().
Referenced by copy().
dimeModel::~dimeModel | ( | ) |
Destructor.
References dimeArray< T >::count().
const char * dimeModel::addBlock | ( | const char *const | blockname, |
dimeBlock *const | block | ||
) |
Use this to add a block to the model. Make sure you also add it in the BLOCKS section.
References dimeDict::enter().
Referenced by dimeBlock::copy(), and dimeBlock::read().
void dimeModel::addEntity | ( | dimeEntity * | entity) |
Convenience function
References findSection(), and dimeEntitiesSection::insertEntity().
const dimeLayer * dimeModel::addLayer | ( | const char *const | name, |
const int16 | colnum = 7 , |
||
const int16 | flags = 0 |
||
) |
Adds a layer to the list of layers. If the layer allready exists, a pointer to the existing layer will be returned.
References dimeArray< T >::count(), dimeDict::enter(), and dimeDict::find().
Referenced by dimeEntity::copyRecords(), dimeEntity::read(), and dimeLayerTable::registerLayer().
const char * dimeModel::addReference | ( | const char *const | name, |
void * | id | ||
) |
Adds a reference in this model's dictionary. Used by BLOCK and INSERT entities to resolve references, but can also be used for other purposes.
References dimeDict::enter().
Referenced by dimeInsert::copy(), and dimeInsert::read().
dimeModel * dimeModel::copy | ( | ) | const |
Returns a copy of the model.
References dimeArray< T >::count(), dimeModel(), findSection(), dimeBlocksSection::fixReferences(), dimeEntitiesSection::fixReferences(), and init().
int dimeModel::countRecords | ( | ) | const |
Counts the number of records in the file. Useful if you need progress information while writing the file to disk.
References dimeArray< T >::count().
dimeBlock * dimeModel::findBlock | ( | const char *const | blockname) |
Returns a pointer to the block with name blockname, or NULL if no block with that name exists.
References dimeDict::find().
void * dimeModel::findReference | ( | const char *const | name) | const |
Finds a reference from the dictionary.
References dimeDict::find().
Referenced by dimeInsert::copy(), dimeInsert::fixReferences(), and dimeInsert::read().
const char * dimeModel::findRefStringPtr | ( | const char *const | name) | const |
Finds a pointer to a string in the dictionary.
References dimeDict::find().
Referenced by dimeInsert::copy(), and dimeInsert::read().
dimeSection * dimeModel::findSection | ( | const char *const | sectionname) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
References dimeArray< T >::count().
Referenced by addEntity(), copy(), dxfConverter::findHeaderVariables(), getDxfVersion(), read(), traverseEntities(), and write().
const dimeSection * dimeModel::findSection | ( | const char *const | sectionname) | const |
Finds the section with section sectionname. Currently (directly) supported sections are HEADER, CLASSES, TABLES, BLOCKS, ENTITIES and OBJECTS.
References dimeArray< T >::count().
const char * dimeModel::getDxfVersion | ( | ) | const |
Returns the AutoCAD drawing database version number. This function return NULL if no version number is found in the file. Currently (directly) supported versions are: r10, r11/r12, r13 and r14.
References findSection(), and dimeHeaderSection::getVariable().
const dimeLayer * dimeModel::getLayer | ( | const int | idx) | const |
Returns the layer at index idx.
References dimeArray< T >::count().
const dimeLayer * dimeModel::getLayer | ( | const char *const | layername) | const |
Returns the layer with name layername. Returns NULL if no layer by that name is found.
References dimeDict::find().
dimeMemHandler * dimeModel::getMemHandler | ( | ) |
Returns a pointer to the memory handler used for this model.
Referenced by dimeLWPolyline::copy(), dimeUnknownEntity::copy(), dimeUnknownClass::copy(), dimeLine::copy(), dimePoint::copy(), dimeTrace::copy(), dimeSolid::copy(), dime3DFace::copy(), dimeCircle::copy(), dimeInsert::copy(), dimeArc::copy(), dimeVertex::copy(), dimeEllipse::copy(), dimeBlock::copy(), dimeSpline::copy(), dimePolyline::copy(), dimeEntity::copyEntityArray(), dimeTableEntry::copyRecords(), dimeObject::copyRecords(), dimeClass::copyRecords(), dimeEntity::copyRecords(), dimeInput::getMemHandler(), and write().
int dimeModel::getNumLayers | ( | ) | const |
Returns the number of layers in the model. A default layer will always be created. It is called "Default DIME layer", and it has layer id number 0. All other layers are assigned running numbers from 1.
References dimeArray< T >::count().
int dimeModel::getNumSections | ( | ) | const |
Returns the number of sections in the model.
References dimeArray< T >::count().
dimeSection * dimeModel::getSection | ( | const int | idx) |
Returns the section at index idx.
References dimeArray< T >::count().
|
static |
This method returns a string saying which version of DIME is used.j
bool dimeModel::init | ( | ) |
Should be called before you start working with the model. Will be called by read() so if you're reading a model from a file you will not have to worry about this.
The method cleans up the old data structures and creates new data structures for the new model.
References dimeArray< T >::setCount().
Referenced by copy(), dimeModel(), and read().
void dimeModel::insertSection | ( | dimeSection *const | section, |
const int | idx = -1 |
||
) |
Inserts a new section to the list of sections. The argument idx, specifies the target position of the new section in the list of sections. If idx is negative, the section will be placed at the end of the list.
Sections shold never be allocated on the stack. Use the new/delete operators to create/destroy section instances.
References dimeArray< T >::count().
bool dimeModel::read | ( | dimeInput *const | in) |
Reads the model file into the internal structures.
References dimeRecord::createRecord(), dimeSection::createSection(), findSection(), dimeBlocksSection::fixReferences(), dimeEntitiesSection::fixReferences(), dimeInput::getFilePosition(), dimeInput::getMemHandler(), init(), dimeInput::readGroupCode(), and dimeInput::readString().
void dimeModel::registerHandle | ( | const int | handle) |
Newer DXF files has stupid handles (groupcode 5) for all entities, tables etc. I can't undestand they have no real purpose, but all handles must be unique when the file is loaded back into AutoCAD...
Referenced by dimeInput::readString(), and registerHandle().
void dimeModel::registerHandle | ( | const char *const | handle) |
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
References registerHandle().
void dimeModel::removeReference | ( | const char *const | name) |
Removes a reference from the dictionary.
References dimeDict::remove().
void dimeModel::removeSection | ( | const int | idx) |
Removes a section from the list of sections.
References dimeArray< T >::count(), and dimeArray< T >::removeElem().
bool dimeModel::traverseEntities | ( | dimeCallback | callback, |
void * | userdata = NULL , |
||
bool | traverseBlocksSection = false , |
||
bool | explodeInserts = true , |
||
bool | traversePolylineVertices = false |
||
) |
Traverses all entities in the model.
References findSection(), dimeBlocksSection::getBlock(), dimeEntitiesSection::getEntity(), dimeBlocksSection::getNumBlocks(), dimeEntitiesSection::getNumEntities(), dimeBlock::traverse(), and dimeEntity::traverse().
Referenced by dxfConverter::doConvert().
bool dimeModel::write | ( | dimeOutput *const | out) |
Writes the model to file. Currently only DXF files are supported, but hopefullt DWG will be supported soon.
References dimeArray< T >::count(), findSection(), getMemHandler(), dimeHeaderSection::getVariable(), dimeHeaderSection::setVariable(), dimeOutput::writeGroupCode(), dimeOutput::writeHeader(), and dimeOutput::writeString().