| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:        dxfrenderer.cpp
 
- // Purpose:     DXF reader and renderer
 
- // Author:      Sandro Sigala
 
- // Modified by:
 
- // Created:     2005-11-10
 
- // Copyright:   (c) Sandro Sigala
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- // For compilers that support precompilation, includes "wx/wx.h".
 
- #include "wx/wxprec.h"
 
- #ifdef __BORLANDC__
 
- #pragma hdrstop
 
- #endif
 
- #ifndef WX_PRECOMP
 
- #include "wx/wx.h"
 
- #endif
 
- #include "wx/wfstream.h"
 
- #include "wx/txtstrm.h"
 
- #if !wxUSE_GLCANVAS
 
-     #error "OpenGL required: set wxUSE_GLCANVAS to 1 and rebuild the library"
 
- #endif
 
- #ifdef __DARWIN__
 
-     #include <OpenGL/glu.h>
 
- #else
 
-     #include <GL/glu.h>
 
- #endif
 
- #include <sstream>
 
- #include "dxfrenderer.h"
 
- #include "wx/listimpl.cpp"
 
- WX_DEFINE_LIST(DXFEntityList)
 
- WX_DEFINE_LIST(DXFLayerList)
 
- // Conversion table from AutoCAD ACI colours to RGB values
 
- static const struct { unsigned char r, g, b; } aci_to_rgb[256] = {
 
- /*   0 */ {255, 255, 255},
 
- /*   1 */ {255,   0,   0},
 
- /*   2 */ {255, 255,   0},
 
- /*   3 */ {  0, 255,   0},
 
- /*   4 */ {  0, 255, 255},
 
- /*   5 */ {  0,   0, 255},
 
- /*   6 */ {255,   0, 255},
 
- /*   7 */ {255, 255, 255},
 
- /*   8 */ {128, 128, 128},
 
- /*   9 */ {192, 192, 192},
 
- /*  10 */ {255,   0,   0},
 
- /*  11 */ {255, 127, 127},
 
- /*  12 */ {204,   0,   0},
 
- /*  13 */ {204, 102, 102},
 
- /*  14 */ {153,   0,   0},
 
- /*  15 */ {153,  76,  76},
 
- /*  16 */ {127,   0,   0},
 
- /*  17 */ {127,  63,  63},
 
- /*  18 */ { 76,   0,   0},
 
- /*  19 */ { 76,  38,  38},
 
- /*  20 */ {255,  63,   0},
 
- /*  21 */ {255, 159, 127},
 
- /*  22 */ {204,  51,   0},
 
- /*  23 */ {204, 127, 102},
 
- /*  24 */ {153,  38,   0},
 
- /*  25 */ {153,  95,  76},
 
- /*  26 */ {127,  31,   0},
 
- /*  27 */ {127,  79,  63},
 
- /*  28 */ { 76,  19,   0},
 
- /*  29 */ { 76,  47,  38},
 
- /*  30 */ {255, 127,   0},
 
- /*  31 */ {255, 191, 127},
 
- /*  32 */ {204, 102,   0},
 
- /*  33 */ {204, 153, 102},
 
- /*  34 */ {153,  76,   0},
 
- /*  35 */ {153, 114,  76},
 
- /*  36 */ {127,  63,   0},
 
- /*  37 */ {127,  95,  63},
 
- /*  38 */ { 76,  38,   0},
 
- /*  39 */ { 76,  57,  38},
 
- /*  40 */ {255, 191,   0},
 
- /*  41 */ {255, 223, 127},
 
- /*  42 */ {204, 153,   0},
 
- /*  43 */ {204, 178, 102},
 
- /*  44 */ {153, 114,   0},
 
- /*  45 */ {153, 133,  76},
 
- /*  46 */ {127,  95,   0},
 
- /*  47 */ {127, 111,  63},
 
- /*  48 */ { 76,  57,   0},
 
- /*  49 */ { 76,  66,  38},
 
- /*  50 */ {255, 255,   0},
 
- /*  51 */ {255, 255, 127},
 
- /*  52 */ {204, 204,   0},
 
- /*  53 */ {204, 204, 102},
 
- /*  54 */ {153, 153,   0},
 
- /*  55 */ {153, 153,  76},
 
- /*  56 */ {127, 127,   0},
 
- /*  57 */ {127, 127,  63},
 
- /*  58 */ { 76,  76,   0},
 
- /*  59 */ { 76,  76,  38},
 
- /*  60 */ {191, 255,   0},
 
- /*  61 */ {223, 255, 127},
 
- /*  62 */ {153, 204,   0},
 
- /*  63 */ {178, 204, 102},
 
- /*  64 */ {114, 153,   0},
 
- /*  65 */ {133, 153,  76},
 
- /*  66 */ { 95, 127,   0},
 
- /*  67 */ {111, 127,  63},
 
- /*  68 */ { 57,  76,   0},
 
- /*  69 */ { 66,  76,  38},
 
- /*  70 */ {127, 255,   0},
 
- /*  71 */ {191, 255, 127},
 
- /*  72 */ {102, 204,   0},
 
- /*  73 */ {153, 204, 102},
 
- /*  74 */ { 76, 153,   0},
 
- /*  75 */ {114, 153,  76},
 
- /*  76 */ { 63, 127,   0},
 
- /*  77 */ { 95, 127,  63},
 
- /*  78 */ { 38,  76,   0},
 
- /*  79 */ { 57,  76,  38},
 
- /*  80 */ { 63, 255,   0},
 
- /*  81 */ {159, 255, 127},
 
- /*  82 */ { 51, 204,   0},
 
- /*  83 */ {127, 204, 102},
 
- /*  84 */ { 38, 153,   0},
 
- /*  85 */ { 95, 153,  76},
 
- /*  86 */ { 31, 127,   0},
 
- /*  87 */ { 79, 127,  63},
 
- /*  88 */ { 19,  76,   0},
 
- /*  89 */ { 47,  76,  38},
 
- /*  90 */ {  0, 255,   0},
 
- /*  91 */ {127, 255, 127},
 
- /*  92 */ {  0, 204,   0},
 
- /*  93 */ {102, 204, 102},
 
- /*  94 */ {  0, 153,   0},
 
- /*  95 */ { 76, 153,  76},
 
- /*  96 */ {  0, 127,   0},
 
- /*  97 */ { 63, 127,  63},
 
- /*  98 */ {  0,  76,   0},
 
- /*  99 */ { 38,  76,  38},
 
- /* 100 */ {  0, 255,  63},
 
- /* 101 */ {127, 255, 159},
 
- /* 102 */ {  0, 204,  51},
 
- /* 103 */ {102, 204, 127},
 
- /* 104 */ {  0, 153,  38},
 
- /* 105 */ { 76, 153,  95},
 
- /* 106 */ {  0, 127,  31},
 
- /* 107 */ { 63, 127,  79},
 
- /* 108 */ {  0,  76,  19},
 
- /* 109 */ { 38,  76,  47},
 
- /* 110 */ {  0, 255, 127},
 
- /* 111 */ {127, 255, 191},
 
- /* 112 */ {  0, 204, 102},
 
- /* 113 */ {102, 204, 153},
 
- /* 114 */ {  0, 153,  76},
 
- /* 115 */ { 76, 153, 114},
 
- /* 116 */ {  0, 127,  63},
 
- /* 117 */ { 63, 127,  95},
 
- /* 118 */ {  0,  76,  38},
 
- /* 119 */ { 38,  76,  57},
 
- /* 120 */ {  0, 255, 191},
 
- /* 121 */ {127, 255, 223},
 
- /* 122 */ {  0, 204, 153},
 
- /* 123 */ {102, 204, 178},
 
- /* 124 */ {  0, 153, 114},
 
- /* 125 */ { 76, 153, 133},
 
- /* 126 */ {  0, 127,  95},
 
- /* 127 */ { 63, 127, 111},
 
- /* 128 */ {  0,  76,  57},
 
- /* 129 */ { 38,  76,  66},
 
- /* 130 */ {  0, 255, 255},
 
- /* 131 */ {127, 255, 255},
 
- /* 132 */ {  0, 204, 204},
 
- /* 133 */ {102, 204, 204},
 
- /* 134 */ {  0, 153, 153},
 
- /* 135 */ { 76, 153, 153},
 
- /* 136 */ {  0, 127, 127},
 
- /* 137 */ { 63, 127, 127},
 
- /* 138 */ {  0,  76,  76},
 
- /* 139 */ { 38,  76,  76},
 
- /* 140 */ {  0, 191, 255},
 
- /* 141 */ {127, 223, 255},
 
- /* 142 */ {  0, 153, 204},
 
- /* 143 */ {102, 178, 204},
 
- /* 144 */ {  0, 114, 153},
 
- /* 145 */ { 76, 133, 153},
 
- /* 146 */ {  0,  95, 127},
 
- /* 147 */ { 63, 111, 127},
 
- /* 148 */ {  0,  57,  76},
 
- /* 149 */ { 38,  66,  76},
 
- /* 150 */ {  0, 127, 255},
 
- /* 151 */ {127, 191, 255},
 
- /* 152 */ {  0, 102, 204},
 
- /* 153 */ {102, 153, 204},
 
- /* 154 */ {  0,  76, 153},
 
- /* 155 */ { 76, 114, 153},
 
- /* 156 */ {  0,  63, 127},
 
- /* 157 */ { 63,  95, 127},
 
- /* 158 */ {  0,  38,  76},
 
- /* 159 */ { 38,  57,  76},
 
- /* 160 */ {  0,  63, 255},
 
- /* 161 */ {127, 159, 255},
 
- /* 162 */ {  0,  51, 204},
 
- /* 163 */ {102, 127, 204},
 
- /* 164 */ {  0,  38, 153},
 
- /* 165 */ { 76,  95, 153},
 
- /* 166 */ {  0,  31, 127},
 
- /* 167 */ { 63,  79, 127},
 
- /* 168 */ {  0,  19,  76},
 
- /* 169 */ { 38,  47,  76},
 
- /* 170 */ {  0,   0, 255},
 
- /* 171 */ {127, 127, 255},
 
- /* 172 */ {  0,   0, 204},
 
- /* 173 */ {102, 102, 204},
 
- /* 174 */ {  0,   0, 153},
 
- /* 175 */ { 76,  76, 153},
 
- /* 176 */ {  0,   0, 127},
 
- /* 177 */ { 63,  63, 127},
 
- /* 178 */ {  0,   0,  76},
 
- /* 179 */ { 38,  38,  76},
 
- /* 180 */ { 63,   0, 255},
 
- /* 181 */ {159, 127, 255},
 
- /* 182 */ { 51,   0, 204},
 
- /* 183 */ {127, 102, 204},
 
- /* 184 */ { 38,   0, 153},
 
- /* 185 */ { 95,  76, 153},
 
- /* 186 */ { 31,   0, 127},
 
- /* 187 */ { 79,  63, 127},
 
- /* 188 */ { 19,   0,  76},
 
- /* 189 */ { 47,  38,  76},
 
- /* 190 */ {127,   0, 255},
 
- /* 191 */ {191, 127, 255},
 
- /* 192 */ {102,   0, 204},
 
- /* 193 */ {153, 102, 204},
 
- /* 194 */ { 76,   0, 153},
 
- /* 195 */ {114,  76, 153},
 
- /* 196 */ { 63,   0, 127},
 
- /* 197 */ { 95,  63, 127},
 
- /* 198 */ { 38,   0,  76},
 
- /* 199 */ { 57,  38,  76},
 
- /* 200 */ {191,   0, 255},
 
- /* 201 */ {223, 127, 255},
 
- /* 202 */ {153,   0, 204},
 
- /* 203 */ {178, 102, 204},
 
- /* 204 */ {114,   0, 153},
 
- /* 205 */ {133,  76, 153},
 
- /* 206 */ { 95,   0, 127},
 
- /* 207 */ {111,  63, 127},
 
- /* 208 */ { 57,   0,  76},
 
- /* 209 */ { 66,  38,  76},
 
- /* 210 */ {255,   0, 255},
 
- /* 211 */ {255, 127, 255},
 
- /* 212 */ {204,   0, 204},
 
- /* 213 */ {204, 102, 204},
 
- /* 214 */ {153,   0, 153},
 
- /* 215 */ {153,  76, 153},
 
- /* 216 */ {127,   0, 127},
 
- /* 217 */ {127,  63, 127},
 
- /* 218 */ { 76,   0,  76},
 
- /* 219 */ { 76,  38,  76},
 
- /* 220 */ {255,   0, 191},
 
- /* 221 */ {255, 127, 223},
 
- /* 222 */ {204,   0, 153},
 
- /* 223 */ {204, 102, 178},
 
- /* 224 */ {153,   0, 114},
 
- /* 225 */ {153,  76, 133},
 
- /* 226 */ {127,   0,  95},
 
- /* 227 */ {127,  63, 111},
 
- /* 228 */ { 76,   0,  57},
 
- /* 229 */ { 76,  38,  66},
 
- /* 230 */ {255,   0, 127},
 
- /* 231 */ {255, 127, 191},
 
- /* 232 */ {204,   0, 102},
 
- /* 233 */ {204, 102, 153},
 
- /* 234 */ {153,   0,  76},
 
- /* 235 */ {153,  76, 114},
 
- /* 236 */ {127,   0,  63},
 
- /* 237 */ {127,  63,  95},
 
- /* 238 */ { 76,   0,  38},
 
- /* 239 */ { 76,  38,  57},
 
- /* 240 */ {255,   0,  63},
 
- /* 241 */ {255, 127, 159},
 
- /* 242 */ {204,   0,  51},
 
- /* 243 */ {204, 102, 127},
 
- /* 244 */ {153,   0,  38},
 
- /* 245 */ {153,  76,  95},
 
- /* 246 */ {127,   0,  31},
 
- /* 247 */ {127,  63,  79},
 
- /* 248 */ { 76,   0,  19},
 
- /* 249 */ { 76,  38,  47},
 
- /* 250 */ { 51,  51,  51},
 
- /* 251 */ { 91,  91,  91},
 
- /* 252 */ {132, 132, 132},
 
- /* 253 */ {173, 173, 173},
 
- /* 254 */ {214, 214, 214},
 
- /* 255 */ {255, 255, 255}
 
- };
 
- inline DXFVector Cross(const DXFVector& v1, const DXFVector& v2)
 
- {
 
-     return DXFVector(v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x);
 
- }
 
- void DXFFace::CalculateNormal()
 
- {
 
-     DXFVector v01, v02;
 
-     v01.x = v0.x - v1.x;
 
-     v01.y = v0.y - v1.y;
 
-     v01.z = v0.z - v1.z;
 
-     v02.x = v0.x - v2.x;
 
-     v02.y = v0.y - v2.y;
 
-     v02.z = v0.z - v2.z;
 
-     n = Cross(v01, v02);
 
-     float mod = sqrt(n.x*n.x + n.y*n.y + n.z*n.z);
 
-     n.x /= mod;
 
-     n.y /= mod;
 
-     n.z /= mod;
 
- }
 
- // convert an AutoCAD ACI colour to wxWidgets RGB colour
 
- inline wxColour ACIColourToRGB(int col)
 
- {
 
-     wxASSERT(col >= 0 && col <= 255);
 
-     return wxColour(aci_to_rgb[col].r, aci_to_rgb[col].g, aci_to_rgb[col].b);
 
- }
 
- // DXFReader constructor
 
- DXFRenderer::DXFRenderer()
 
- {
 
-     m_loaded = false;
 
- }
 
- // DXFReader destructor
 
- DXFRenderer::~DXFRenderer()
 
- {
 
-     Clear();
 
- }
 
- // deallocate all the dynamic data
 
- void DXFRenderer::Clear()
 
- {
 
-     m_loaded = false;
 
-     {
 
-         for (DXFLayerList::compatibility_iterator node = m_layers.GetFirst(); node; node = node->GetNext())
 
-         {
 
-             DXFLayer *current = node->GetData();
 
-             delete current;
 
-         }
 
-     }
 
-     m_layers.Clear();
 
-     {
 
-         for (DXFEntityList::compatibility_iterator node = m_entities.GetFirst(); node; node = node->GetNext())
 
-         {
 
-             DXFEntity *current = node->GetData();
 
-             delete current;
 
-         }
 
-         m_entities.Clear();
 
-     }
 
- }
 
- int DXFRenderer::GetLayerColour(const wxString& layer) const
 
- {
 
-     for (DXFLayerList::compatibility_iterator node = m_layers.GetFirst(); node; node = node->GetNext())
 
-     {
 
-         DXFLayer *current = node->GetData();
 
-         if (current->name == layer)
 
-             return current->colour;
 
-     }
 
-     return 7;   // white
 
- }
 
- // read two sequential lines
 
- inline void GetLines(wxTextInputStream& text, wxString& line1, wxString& line2)
 
- {
 
-     line1 = text.ReadLine().Trim().Trim(false);
 
-     line2 = text.ReadLine().Trim().Trim(false);
 
- }
 
- // parse header section: just skip everything
 
- bool DXFRenderer::ParseHeader(wxInputStream& stream)
 
- {
 
-     wxTextInputStream text(stream);
 
-     wxString line1, line2;
 
-     while (stream.CanRead())
 
-     {
 
-         GetLines(text, line1, line2);
 
-         if (line1 == wxT("0") && line2 == wxT("ENDSEC"))
 
-             return true;
 
-     }
 
-     return false;
 
- }
 
- // parse tables section: save layers name and colour
 
- bool DXFRenderer::ParseTables(wxInputStream& stream)
 
- {
 
-     wxTextInputStream text(stream);
 
-     wxString line1, line2;
 
-     bool inlayer=false;
 
-     DXFLayer layer;
 
-     while (stream.CanRead())
 
-     {
 
-         GetLines(text, line1, line2);
 
-         if (line1 == wxT("0") && inlayer)
 
-         {
 
-             // flush layer
 
-             if (!layer.name.IsEmpty() && layer.colour != -1)
 
-             {
 
-                 DXFLayer *p = new DXFLayer;
 
-                 p->name = layer.name;
 
-                 p->colour = layer.colour;
 
-                 m_layers.Append(p);
 
-             }
 
-             layer = DXFLayer();
 
-             inlayer = false;
 
-         }
 
-         if (line1 == wxT("0") && line2 == wxT("ENDSEC"))
 
-             return true;
 
-         else if (line1 == wxT("0") && line2 == wxT("LAYER"))
 
-             inlayer = true;
 
-         else if (inlayer)
 
-         {
 
-             if (line1 == wxT("2")) // layer name
 
-                 layer.name = line2;
 
-             else if (line1 == wxT("62")) // ACI colour
 
-             {
 
-                 long l;
 
-                 line2.ToLong(&l);
 
-                 layer.colour = l;
 
-             }
 
-         }
 
-     }
 
-     return false;
 
- }
 
- // This method is used instead of numStr.ToDouble(d) because the latter
 
- // (wxString::ToDouble()) takes the systems proper locale into account,
 
- // whereas the implementation below works with the default locale.
 
- // (Converting numbers that are formatted in the default locale can fail
 
- //  with system locales that use e.g. the comma as the decimal separator.)
 
- static double ToDouble(const wxString& numStr)
 
- {
 
-     double             d;
 
-     std::string        numStr_(numStr.c_str());
 
-     std::istringstream iss(numStr_);
 
-     iss >> d;
 
-     return d;
 
- }
 
- // parse entities section: save 3DFACE and LINE entities
 
- bool DXFRenderer::ParseEntities(wxInputStream& stream)
 
- {
 
-     wxTextInputStream text(stream);
 
-     wxString line1, line2;
 
-     int state = 0;  // 0: none, 1: 3DFACE, 2: LINE
 
-     DXFVector v[4];
 
-     int colour = -1;
 
-     wxString layer;
 
-     while (stream.CanRead())
 
-     {
 
-         GetLines(text, line1, line2);
 
-         if (line1 == wxT("0") && state > 0)
 
-         {
 
-             // flush entity
 
-             if (state == 1) // 3DFACE
 
-             {
 
-                 DXFFace *p = new DXFFace;
 
-                 p->v0 = v[0];
 
-                 p->v1 = v[1];
 
-                 p->v2 = v[2];
 
-                 p->v3 = v[3];
 
-                 p->CalculateNormal();
 
-                 if (colour != -1)
 
-                     p->colour = colour;
 
-                 else
 
-                     p->colour = GetLayerColour(layer);
 
-                 m_entities.Append(p);
 
-                 colour = -1; layer = wxEmptyString;
 
-                 v[0] = v[1] = v[2] = v[3] = DXFVector();
 
-                 state = 0;
 
-             }
 
-             else if (state == 2) // LINE
 
-             {
 
-                 DXFLine *p = new DXFLine;
 
-                 p->v0 = v[0];
 
-                 p->v1 = v[1];
 
-                 if (colour != -1)
 
-                     p->colour = colour;
 
-                 else
 
-                     p->colour = GetLayerColour(layer);
 
-                 m_entities.Append(p);
 
-                 colour = -1; layer = wxEmptyString;
 
-                 v[0] = v[1] = v[2] = v[3] = DXFVector();
 
-                 state = 0;
 
-             }
 
-         }
 
-         if (line1 == wxT("0") && line2 == wxT("ENDSEC"))
 
-             return true;
 
-         else if (line1 == wxT("0") && line2 == wxT("3DFACE"))
 
-             state = 1;
 
-         else if (line1 == wxT("0") && line2 == wxT("LINE"))
 
-             state = 2;
 
-         else if (state > 0)
 
-         {
 
-             const double d=ToDouble(line2);
 
-             if (line1 == wxT("10"))
 
-                 v[0].x = d;
 
-             else if (line1 == wxT("20"))
 
-                 v[0].y = d;
 
-             else if (line1 == wxT("30"))
 
-                 v[0].z = d;
 
-             else if (line1 == wxT("11"))
 
-                 v[1].x = d;
 
-             else if (line1 == wxT("21"))
 
-                 v[1].y = d;
 
-             else if (line1 == wxT("31"))
 
-                 v[1].z = d;
 
-             else if (line1 == wxT("12"))
 
-                 v[2].x = d;
 
-             else if (line1 == wxT("22"))
 
-                 v[2].y = d;
 
-             else if (line1 == wxT("32"))
 
-                 v[2].z = d;
 
-             else if (line1 == wxT("13"))
 
-                 v[3].x = d;
 
-             else if (line1 == wxT("23"))
 
-                 v[3].y = d;
 
-             else if (line1 == wxT("33"))
 
-                 v[3].z = d;
 
-             else if (line1 == wxT("8"))  // layer
 
-                 layer = line2;
 
-             else if (line1 == wxT("62")) // colour
 
-             {
 
-                 long l;
 
-                 line2.ToLong(&l);
 
-                 colour = l;
 
-             }
 
-         }
 
-     }
 
-     return false;
 
- }
 
- // parse and load a DXF file
 
- // currently pretty limited, but knows enought do handle 3DFACEs and LINEs
 
- bool DXFRenderer::Load(wxInputStream& stream)
 
- {
 
-     Clear();
 
-     wxTextInputStream text(stream);
 
-     wxString line1, line2;
 
-     while (stream.CanRead())
 
-     {
 
-         GetLines(text, line1, line2);
 
-         if (line1 == wxT("999")) // comment
 
-             continue;
 
-         else if (line1 == wxT("0") && line2 == wxT("SECTION"))
 
-         {
 
-             GetLines(text, line1, line2);
 
-             if (line1 == wxT("2"))
 
-             {
 
-                 if (line2 == wxT("HEADER"))
 
-                 {
 
-                     if (!ParseHeader(stream))
 
-                         return false;
 
-                 }
 
-                 else if (line2 == wxT("TABLES"))
 
-                 {
 
-                     if (!ParseTables(stream))
 
-                         return false;
 
-                 }
 
-                 else if (line2 == wxT("ENTITIES"))
 
-                 {
 
-                     if (!ParseEntities(stream))
 
-                         return false;
 
-                 }
 
-             }
 
-         }
 
-     }
 
-     NormalizeEntities();
 
-     m_loaded = true;
 
-     return true;
 
- }
 
- inline float mymin(float x, float y) { return x < y ? x : y; }
 
- inline float mymax(float x, float y) { return x > y ? x : y; }
 
- // Scale object boundings to [-5,5]
 
- void DXFRenderer::NormalizeEntities()
 
- {
 
-     // calculate current min and max boundings of object
 
-     DXFVector minv(10e20f, 10e20f, 10e20f);
 
-     DXFVector maxv(-10e20f, -10e20f, -10e20f);
 
-     for (DXFEntityList::compatibility_iterator node = m_entities.GetFirst(); node; node = node->GetNext())
 
-     {
 
-         DXFEntity *p = node->GetData();
 
-         if (p->type == DXFEntity::Line)
 
-         {
 
-             DXFLine *line = (DXFLine *)p;
 
-             const DXFVector *v[2] = { &line->v0, &line->v1 };
 
-             for (int i = 0; i < 2; ++i)
 
-             {
 
-                 minv.x = mymin(v[i]->x, minv.x);
 
-                 minv.y = mymin(v[i]->y, minv.y);
 
-                 minv.z = mymin(v[i]->z, minv.z);
 
-                 maxv.x = mymax(v[i]->x, maxv.x);
 
-                 maxv.y = mymax(v[i]->y, maxv.y);
 
-                 maxv.z = mymax(v[i]->z, maxv.z);
 
-             }
 
-         } else if (p->type == DXFEntity::Face)
 
-         {
 
-             DXFFace *face = (DXFFace *)p;
 
-             const DXFVector *v[4] = { &face->v0, &face->v1, &face->v2, &face->v3 };
 
-             for (int i = 0; i < 4; ++i)
 
-             {
 
-                 minv.x = mymin(v[i]->x, minv.x);
 
-                 minv.y = mymin(v[i]->y, minv.y);
 
-                 minv.z = mymin(v[i]->z, minv.z);
 
-                 maxv.x = mymax(v[i]->x, maxv.x);
 
-                 maxv.y = mymax(v[i]->y, maxv.y);
 
-                 maxv.z = mymax(v[i]->z, maxv.z);
 
-             }
 
-        }
 
-     }
 
-     // rescale object down to [-5,5]
 
-     DXFVector span(maxv.x - minv.x, maxv.y - minv.y, maxv.z - minv.z);
 
-     float factor = mymin(mymin(10.0f / span.x, 10.0f / span.y), 10.0f / span.z);
 
-     for (DXFEntityList::compatibility_iterator node2 = m_entities.GetFirst(); node2; node2 = node2->GetNext())
 
-     {
 
-         DXFEntity *p = node2->GetData();
 
-         if (p->type == DXFEntity::Line)
 
-         {
 
-             DXFLine *line = (DXFLine *)p;
 
-             DXFVector *v[2] = { &line->v0, &line->v1 };
 
-             for (int i = 0; i < 2; ++i)
 
-             {
 
-                 v[i]->x -= minv.x + span.x/2; v[i]->x *= factor;
 
-                 v[i]->y -= minv.y + span.y/2; v[i]->y *= factor;
 
-                 v[i]->z -= minv.z + span.z/2; v[i]->z *= factor;
 
-             }
 
-         } else if (p->type == DXFEntity::Face)
 
-         {
 
-             DXFFace *face = (DXFFace *)p;
 
-             DXFVector *v[4] = { &face->v0, &face->v1, &face->v2, &face->v3 };
 
-             for (int i = 0; i < 4; ++i)
 
-             {
 
-                 v[i]->x -= minv.x + span.x/2; v[i]->x *= factor;
 
-                 v[i]->y -= minv.y + span.y/2; v[i]->y *= factor;
 
-                 v[i]->z -= minv.z + span.z/2; v[i]->z *= factor;
 
-             }
 
-        }
 
-     }
 
- }
 
- // OpenGL renderer for DXF entities
 
- void DXFRenderer::Render() const
 
- {
 
-     if (!m_loaded)
 
-         return;
 
-     for (DXFEntityList::compatibility_iterator node = m_entities.GetFirst(); node; node = node->GetNext())
 
-     {
 
-         DXFEntity *p = node->GetData();
 
-         wxColour c = ACIColourToRGB(p->colour);
 
-         if (p->type == DXFEntity::Line)
 
-         {
 
-             DXFLine *line = (DXFLine *)p;
 
-             glBegin(GL_LINES);
 
-             glColor3f(c.Red()/255.0,c.Green()/255.0,c.Blue()/255.0);
 
-             glVertex3f(line->v0.x, line->v0.y, line->v0.z);
 
-             glVertex3f(line->v1.x, line->v1.y, line->v1.z);
 
-             glEnd();
 
-         }
 
-         else if (p->type == DXFEntity::Face)
 
-         {
 
-             DXFFace *face = (DXFFace *)p;
 
-             glBegin(GL_TRIANGLES);
 
-             glColor3f(c.Red()/255.0,c.Green()/255.0,c.Blue()/255.0);
 
-             glNormal3f(face->n.x, face->n.y, face->n.z);
 
-             glVertex3f(face->v0.x, face->v0.y, face->v0.z);
 
-             glVertex3f(face->v1.x, face->v1.y, face->v1.z);
 
-             glVertex3f(face->v2.x, face->v2.y, face->v2.z);
 
-             glEnd();
 
-         }
 
-     }
 
- }
 
 
  |