root/OpenSceneGraph/trunk/src/osgPlugins/dxf/dxfReader.cpp @ 13041

Revision 13041, 4.9 kB (checked in by robert, 3 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/* dxfReader for OpenSceneGraph  Copyright (C) 2005 by GraphArchitecture ( grapharchitecture.com )
2 * Programmed by Paul de Repentigny <pdr@grapharchitecture.com>
3 *
4 * OpenSceneGraph is (C) 2004 Robert Osfield
5 *
6 * This library is provided as-is, without support of any kind.
7 *
8 * Read DXF docs or OSG docs for any related questions.
9 *
10 * You may contact the author if you have suggestions/corrections/enhancements.
11 */
12#include "dxfReader.h"
13#include "dxfDataTypes.h"
14#include "codeValue.h"
15
16#include <map>
17#include <vector>
18#include <iostream>
19#include <utility>
20#include <sstream>
21#include <math.h>
22#include <iomanip>
23
24using namespace std;
25
26static
27std::string
28trim(const string& str)
29{
30    if (!str.size()) return str;
31    string::size_type first = str.find_first_not_of(" \t");
32    string::size_type last = str.find_last_not_of("  \t\r\n");
33    return str.substr(first, last-first+1);
34}
35
36/*
37************** readerBase
38*/
39bool readerBase::readGroup(std::ifstream& f, codeValue& cv)
40{
41    cv.reset();
42    if (readGroupCode(f, cv._groupCode)) {
43        cv._type = dxfDataType::typeForCode(cv._groupCode);
44        switch (cv._type) {
45            case dxfDataType::BOOL:
46                return readValue(f, cv._bool);
47                break;
48            case dxfDataType::SHORT:
49                return readValue(f, cv._short);
50                break;
51            case dxfDataType::INT:
52                return readValue(f, cv._int);
53                break;
54            case dxfDataType::LONG:
55                return readValue(f, cv._long);
56                break;
57            case dxfDataType::DOUBLE:
58                return readValue(f, cv._double);
59                break;
60            case dxfDataType::UNKNOWN:
61            case dxfDataType::STRING:
62            case dxfDataType::HEX:
63            default: // to do: default case an error
64                return readValue(f, cv._string);
65                break;
66
67        }
68    } else {
69        cv._type = dxfDataType::UNKNOWN;
70        cv._groupCode = -1;
71    }
72    return false;
73}
74
75/*
76************** readerText
77*/
78
79bool readerText::success(bool inSuccess, string type)
80{
81    if (!inSuccess)
82        cout << "Error converting line " << _lineCount << " to type " << type << endl;
83    return inSuccess;
84}
85
86bool readerText::getTrimmedLine(std::ifstream& f)
87{
88    static string line = "";
89    if (getline(f, line, _delim)) {
90        ++_lineCount;
91        _str.clear();
92        _str.str(trim(line));
93        return true;
94    }
95    return false;
96}
97
98
99bool readerText::readGroupCode(std::ifstream& f, int &groupcode)
100{
101    if (getTrimmedLine(f)) {
102        _str >> groupcode;
103        return success(!_str.fail(), "int");
104    } else {
105        return false;
106    }
107}
108bool readerText::readValue(std::ifstream& f, string &s)
109{
110    if (getTrimmedLine(f)) {
111        getline(_str, s);
112        // empty string is valid
113        return success((!_str.fail() || s == ""), "string");
114    } else {
115        return false;
116    }
117}
118bool readerText::readValue(std::ifstream& f, bool &b)
119{
120    if (getTrimmedLine(f)) {
121        _str >> b;
122        return success(!_str.fail(), "bool");
123    } else {
124        return false;
125    }
126}
127bool readerText::readValue(std::ifstream& f, short &s)
128{
129    if (getTrimmedLine(f)) {
130        _str >> s;
131        return success(!_str.fail(), "short");
132    } else {
133        return false;
134    }
135}
136bool readerText::readValue(std::ifstream& f, int &i)
137{
138    if (getTrimmedLine(f)) {
139        _str >> i;
140        return success(!_str.fail(), "int");
141    } else {
142        return false;
143    }
144}
145
146bool readerText::readValue(std::ifstream& f, long &l)
147{
148    if (getTrimmedLine(f)) {
149        _str >> l;
150        return success(!_str.fail(), "long");
151    } else {
152        return false;
153    }
154}
155bool readerText::readValue(std::ifstream& f, double &d)
156{
157    if (getTrimmedLine(f)) {
158        _str >> d;
159        return success(!_str.fail(), "double");
160    } else {
161        return false;
162    }
163}
164
165/*
166************** dxfReader
167*/
168
169
170bool
171dxfReader::openFile(std::string fileName)
172{
173    if (fileName.size() == 0) return false;
174    _ifs.open(fileName.c_str(), ios::binary); // found mac autocad with \r delimiters
175    if (!_ifs) {
176            cout << " Can't open " << fileName << endl;
177            return false;
178    }
179    // A binary file starts with "AutoCAD Binary DXF<CR><LF><SUB><NULL>"
180
181    char buf[255];
182    _ifs.get(buf, 255);
183    string sentinel(buf);
184    if (trim(sentinel) == "AutoCAD Binary DXF") {
185        cout << " Binary DXF not supported. For now. Come back soon." << endl;
186        return false;
187    }
188    //string::size_type lf = sentinel.find('\n');
189    //string::size_type cr = sentinel.find('\r');
190    // gossage. un mac peut mettre juste CR. ca fonctionne pas:
191//    if (cr > 0 && (!lf || lf > cr + 1))
192//        _reader = new readerText('\r');
193//    else
194        _reader = new readerText;
195    _ifs.seekg(0, ios::beg);
196    return true;
197}
198
199bool
200dxfReader::nextGroupCode(codeValue& cv)
201{
202    return (_reader->readGroup(_ifs, cv));
203}
Note: See TracBrowser for help on using the browser.