📄 dxffile.cpp
字号:
/* 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 sectionsshort 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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -