From Paul de Repentinguy, DXF loader plugin. Ported to Linux by Robert Osfield.
This commit is contained in:
120
src/osgPlugins/dxf/dxfFile.cpp
Normal file
120
src/osgPlugins/dxf/dxfFile.cpp
Normal file
@@ -0,0 +1,120 @@
|
||||
/* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user