121 lines
3.0 KiB
C++
121 lines
3.0 KiB
C++
/* dxfReader for OpenSceneGraph Copyright (C) 2005 by GraphArchitecture ( grapharchitecture.com )
|
|
* Programmed by Paul de Repentigny <pdr@grapharchitecture.com>
|
|
*
|
|
* OpenSceneGraph is (C) 2004 Robert Osfield
|
|
*
|
|
* This library is provided as-is, without support of any kind.
|
|
*
|
|
* Read DXF docs or OSG docs for any related questions.
|
|
*
|
|
* You may contact the author if you have suggestions/corrections/enhancements.
|
|
*/
|
|
|
|
#include "dxfFile.h"
|
|
#include "dxfReader.h"
|
|
#include "dxfBlock.h"
|
|
#include "dxfEntity.h"
|
|
#include "dxfDataTypes.h"
|
|
#include "scene.h"
|
|
#include "codeValue.h"
|
|
|
|
#include <osg/Group>
|
|
|
|
using namespace std;
|
|
|
|
bool
|
|
dxfFile::parseFile()
|
|
{
|
|
if (_fileName == "") return false;
|
|
_reader = new dxfReader;
|
|
|
|
if (_reader->openFile(_fileName)) {
|
|
codeValue cv;
|
|
while(_reader->nextGroupCode(cv)) {
|
|
short result = assign(cv);
|
|
if (result < 0)
|
|
return false;
|
|
else if (result == 0) {
|
|
return true;
|
|
}
|
|
}
|
|
// we did not reach 0 EOF
|
|
return false;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
osg::Group*
|
|
dxfFile::dxf2osg()
|
|
{
|
|
if (!_entities) return NULL;
|
|
if (!_tables) { // a dxfTable is needed to create undefined layers
|
|
_tables = new dxfTables;
|
|
}
|
|
osg::ref_ptr<dxfLayerTable> layerTable = _tables->getOrCreateLayerTable();
|
|
// to do: should be more general and pass a pointer to ourselves
|
|
// which in turn should be able to feed any information
|
|
// the scene might need
|
|
_scene = new scene(layerTable.get());
|
|
_entities->drawScene(_scene.get());
|
|
osg::Group* g = _scene->scene2osg();
|
|
return g;
|
|
}
|
|
|
|
dxfBlock*
|
|
dxfFile::findBlock(std::string name)
|
|
{
|
|
if (_blocks.get())
|
|
return _blocks->findBlock(name);
|
|
return NULL;
|
|
}
|
|
|
|
/// not used. if you want to know what a header variable
|
|
/// contains, call this. pass the complete variable name
|
|
/// including "$", for example: "$EXTMAX"
|
|
VariableList
|
|
dxfFile::getVariable(std::string var)
|
|
{
|
|
return _header->getVariable(var);
|
|
}
|
|
|
|
/// parse the dxf sections
|
|
short
|
|
dxfFile::assign(codeValue& cv)
|
|
{
|
|
std::string s = cv._string;
|
|
if (cv._groupCode == 0 && s == std::string("ENDSEC")) {
|
|
_isNewSection = false;
|
|
_current = _unknown.get();
|
|
} else if (cv._groupCode == 0 && s == std::string("SECTION")) {
|
|
_isNewSection = true;
|
|
} else if (cv._groupCode == 0 && s == std::string("EOF")) {
|
|
return 0;
|
|
} else if (cv._groupCode == 2 && _isNewSection) {
|
|
_isNewSection = false;
|
|
// std::cout << "Reading section " << s << std::endl;
|
|
if (s =="HEADER") {
|
|
_header = new dxfHeader;
|
|
_current = _header.get();
|
|
} else if (s =="TABLES") {
|
|
_tables = new dxfTables;
|
|
_current = _tables.get();
|
|
} else if (s =="BLOCKS") {
|
|
_blocks = new dxfBlocks;
|
|
_current = _blocks.get();
|
|
} else if (s =="ENTITIES") {
|
|
_entities = new dxfEntities;
|
|
_current = _entities.get();
|
|
} else {
|
|
_current = _unknown.get();
|
|
}
|
|
} else if (_isNewSection) {
|
|
// problem. a 0/SECTION should be followed by a 2/SECTION_NAME
|
|
std::cout << "No groupcode for changing section " << cv._groupCode << " value: " << s << std::endl;
|
|
return -1;
|
|
} else if (_current.get()) {
|
|
_current->assign(this, cv);
|
|
}
|
|
return 1;
|
|
}
|