~librecad-dev/librecad/librecad

« back to all changes in this revision

Viewing changes to librecad/src/lib/filters/rs_filterdxf1.cpp

  • Committer: Scott Howard
  • Date: 2014-02-21 19:07:55 UTC
  • Revision ID: showard@debian.org-20140221190755-csjax9wb146hgdq4
first commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/****************************************************************************
 
2
**
 
3
** This file is part of the LibreCAD project, a 2D CAD program
 
4
**
 
5
** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl)
 
6
** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
 
7
**
 
8
**
 
9
** This file may be distributed and/or modified under the terms of the
 
10
** GNU General Public License version 2 as published by the Free Software 
 
11
** Foundation and appearing in the file gpl-2.0.txt included in the
 
12
** packaging of this file.
 
13
**
 
14
** This program is distributed in the hope that it will be useful,
 
15
** but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
17
** GNU General Public License for more details.
 
18
** 
 
19
** You should have received a copy of the GNU General Public License
 
20
** along with this program; if not, write to the Free Software
 
21
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
22
**
 
23
** This copyright notice MUST APPEAR in all copies of the script!  
 
24
**
 
25
**********************************************************************/
 
26
 
 
27
 
 
28
#include "rs_filterdxfrw.h"
 
29
#include "rs_filterdxf1.h"
 
30
 
 
31
#include <iostream>
 
32
 
 
33
#include "rs_font.h"
 
34
#include "rs_information.h"
 
35
#include "rs_utility.h"
 
36
#include "rs_system.h"
 
37
#include "rs_dimlinear.h"
 
38
#include "rs_dimaligned.h"
 
39
#include "rs_dimangular.h"
 
40
#include "rs_dimdiametric.h"
 
41
#include "rs_dimradial.h"
 
42
#include "rs_layer.h"
 
43
#include "rs_leader.h"
 
44
 
 
45
 
 
46
/**
 
47
 * Default constructor.
 
48
 */
 
49
RS_FilterDXF1::RS_FilterDXF1()
 
50
        :RS_FilterInterface() {
 
51
 
 
52
    RS_DEBUG->print("Setting up DXF 1 filter...");
 
53
 
 
54
        graphic = NULL;
 
55
}
 
56
 
 
57
/**
 
58
 * Implementation of the method used for RS_Import to communicate
 
59
 * with this filter.
 
60
 *
 
61
 * @param graphic The graphic in which the entities from the file
 
62
 * will be created or the graphics from which the entities are
 
63
 * taken to be stored in a file.
 
64
 */
 
65
bool RS_FilterDXF1::fileImport(RS_Graphic& g, const QString& file, RS2::FormatType /*type*/) {
 
66
    RS_DEBUG->print("DXF1 Filter: importing file '%s'...", file.toLatin1().data());
 
67
 
 
68
        this->graphic = &g;
 
69
 
 
70
    fPointer=0;
 
71
    fBuf=0;
 
72
    fBufP=0;
 
73
    fSize=0;
 
74
    dosFile=false;
 
75
    name = file;
 
76
 
 
77
    if(readFileInBuffer()) {
 
78
        separateBuf();
 
79
        return readFromBuffer();
 
80
    }
 
81
        
 
82
    return false;
 
83
}
 
84
 
 
85
 
 
86
 
 
87
/**
 
88
 * Reads a dxf1 file from buffer.
 
89
 */
 
90
bool RS_FilterDXF1::readFromBuffer() {
 
91
    RS_DEBUG->print( "\nDXF: Read from buffer" );
 
92
 
 
93
    bool      ret;                    // returned value
 
94
    QString   dxfLine;                // A line in the dxf file
 
95
    QString   dxfCode;                // A Code in the dxf file as string
 
96
    int       code=-1;                // Dxf-code as number
 
97
    double    vx1=0.0, vy1=0.0;       // Start point
 
98
    double    vx2=0.0, vy2=0.0;       // End point
 
99
    double    vcx=0.0, vcy=0.0;       // Centre
 
100
    double    vcr=0.0;                // Radius
 
101
    double    va1=0.0, va2=0.0;       // Start / End Angle
 
102
    //double    vab=0.0,                // Bulge
 
103
    //           vpx=0.0, vpy=0.0;       // First Polyline point
 
104
    //double    ax=0.0, ay=0.0;         // Current coordinate
 
105
    //bool      plClose=false;          // Polyline closed-flag
 
106
    QString lastLayer;              // Last used layer name (test adding only
 
107
    //   if the new layer!=lastLayer)
 
108
    //int       currentLayerNum=0;      // Current layer number
 
109
    RS_Layer* currentLayer=0;         // Pointer to current layer
 
110
    //QList<RGraphic> blockList;        // List of blocks
 
111
    //blockList.setAutoDelete( true );
 
112
    //bool      oldColorNumbers=false;  // use old color numbers (qcad<1.5.3)
 
113
    RS_Pen pen;
 
114
 
 
115
    ///if(!add) graphic->clearLayers();
 
116
 
 
117
    //graphic->addLayer(DEF_DEFAULTLAYER);
 
118
 
 
119
    //RS_DEBUG->print( "\nDefault layer added" );
 
120
 
 
121
    // Loaded graphics without unit information: load as unit less:
 
122
    //graphic->setUnit( None );
 
123
 
 
124
    RS_DEBUG->print( "\nUnit set" );
 
125
 
 
126
    resetBufP();
 
127
 
 
128
    if(fBuf) {
 
129
 
 
130
        RS_DEBUG->print( "\nBuffer OK" );
 
131
        RS_DEBUG->print( "\nBuffer: " );
 
132
        RS_DEBUG->print( fBuf );
 
133
 
 
134
        do {
 
135
            dxfLine=getBufLine();
 
136
            pen = RS_Pen(RS_Color(RS2::FlagByLayer), RS2::WidthByLayer, RS2::LineByLayer);
 
137
 
 
138
            RS_DEBUG->print( "\ndxfLine: " );
 
139
            RS_DEBUG->print( dxfLine.toLatin1().data() );
 
140
 
 
141
            // $-Setting in the header of DXF found
 
142
            // RVT_PORT changed all occurenses of if (dxfline && ....) to if (dxfline.size() ......)
 
143
            if( dxfLine.size() &&
 
144
                    dxfLine[0]=='$' ) {
 
145
 
 
146
 
 
147
                // Units:
 
148
                //
 
149
                if( dxfLine=="$INSUNITS" ) {
 
150
                                        dxfCode=getBufLine();
 
151
                    if(dxfCode.size()) {
 
152
                        if( dxfCode.toInt()==70 ) {
 
153
                                                        dxfLine=getBufLine() ;
 
154
                            if( dxfLine.size() ) {
 
155
                                graphic->addVariable("$INSUNITS", dxfLine, 70);
 
156
                                /*
 
157
                                            switch( dxfLine.toInt() ) {
 
158
                                              case  0: graphic->setUnit( RS2::None );       break;
 
159
                                              case  1: graphic->setUnit( RS2::Inch );       break;
 
160
                                              case  2: graphic->setUnit( RS2::Foot );       break;
 
161
                                              case  3: graphic->setUnit( RS2::Mile );       break;
 
162
                                              case  4: graphic->setUnit( RS2::Millimeter ); break;
 
163
                                              case  5: graphic->setUnit( RS2::Centimeter ); break;
 
164
                                              case  6: graphic->setUnit( RS2::Meter );      break;
 
165
                                              case  7: graphic->setUnit( RS2::Kilometer );  break;
 
166
                                              case  8: graphic->setUnit( RS2::Microinch );  break;
 
167
                                              case  9: graphic->setUnit( RS2::Mil );        break;
 
168
                                              case 10: graphic->setUnit( RS2::Yard );       break;
 
169
                                              case 11: graphic->setUnit( RS2::Angstrom );   break;
 
170
                                              case 12: graphic->setUnit( RS2::Nanometer );  break;
 
171
                                              case 13: graphic->setUnit( RS2::Micron );     break;
 
172
                                              case 14: graphic->setUnit( RS2::Decimeter );  break;
 
173
                                              case 15: graphic->setUnit( RS2::Decameter );  break;
 
174
                                              case 16: graphic->setUnit( RS2::Hectometer ); break;
 
175
                                              case 17: graphic->setUnit( RS2::Gigameter );  break;
 
176
                                              case 18: graphic->setUnit( RS2::Astro );      break;
 
177
                                              case 19: graphic->setUnit( RS2::Lightyear );  break;
 
178
                                              case 20: graphic->setUnit( RS2::Parsec );     break;
 
179
                                            }
 
180
 
 
181
                                            graphic->setDimensionUnit( graphic->getUnit() );
 
182
                                            //graphic->setGridUnit( graphic->getUnit() );
 
183
                                */
 
184
                            }
 
185
                        }
 
186
                    }
 
187
                }
 
188
 
 
189
                // Dimenison Units:
 
190
                //
 
191
                else if( dxfLine=="$DIMALT" ) {
 
192
                                        dxfCode=getBufLine();
 
193
                    if(dxfCode.size()) {
 
194
                        if( dxfCode.toInt()==70 ) {
 
195
                                                        dxfLine=getBufLine();
 
196
                            if( dxfLine.size() ) {
 
197
                                graphic->addVariable("$DIMALT", dxfLine, 70);
 
198
                                /*
 
199
                                            switch( dxfLine.toInt() ) {
 
200
                                              case  0: graphic->setDimensionUnit( RS2::None );       break;
 
201
                                              case  1: graphic->setDimensionUnit( RS2::Inch );       break;
 
202
                                              case  2: graphic->setDimensionUnit( RS2::Foot );       break;
 
203
                                              case  3: graphic->setDimensionUnit( RS2::Mile );       break;
 
204
                                              case  4: graphic->setDimensionUnit( RS2::Millimeter ); break;
 
205
                                              case  5: graphic->setDimensionUnit( RS2::Centimeter ); break;
 
206
                                              case  6: graphic->setDimensionUnit( RS2::Meter );      break;
 
207
                                              case  7: graphic->setDimensionUnit( RS2::Kilometer );  break;
 
208
                                              case  8: graphic->setDimensionUnit( RS2::Microinch );  break;
 
209
                                              case  9: graphic->setDimensionUnit( RS2::Mil );        break;
 
210
                                              case 10: graphic->setDimensionUnit( RS2::Yard );       break;
 
211
                                              case 11: graphic->setDimensionUnit( RS2::Angstrom );   break;
 
212
                                              case 12: graphic->setDimensionUnit( RS2::Nanometer );  break;
 
213
                                              case 13: graphic->setDimensionUnit( RS2::Micron );     break;
 
214
                                              case 14: graphic->setDimensionUnit( RS2::Decimeter );  break;
 
215
                                              case 15: graphic->setDimensionUnit( RS2::Decameter );  break;
 
216
                                              case 16: graphic->setDimensionUnit( RS2::Hectometer ); break;
 
217
                                              case 17: graphic->setDimensionUnit( RS2::Gigameter );  break;
 
218
                                              case 18: graphic->setDimensionUnit( RS2::Astro );      break;
 
219
                                              case 19: graphic->setDimensionUnit( RS2::Lightyear );  break;
 
220
                                              case 20: graphic->setDimensionUnit( RS2::Parsec );     break;
 
221
                                            }
 
222
                                */
 
223
                            }
 
224
                        }
 
225
                    }
 
226
                }
 
227
 
 
228
                // Dimension Format:
 
229
                //
 
230
                /*else if( dxfLine=="$DIMLUNIT" ) {
 
231
                  if(dxfCode=getBufLine()) {
 
232
                    if( dxfCode.toInt()==70 ) {
 
233
                      if( dxfLine=getBufLine() ) {
 
234
                        switch( dxfLine.toInt() ) {
 
235
                          case 1: graphic->setDimensionFormat( Scientific ); break;
 
236
                          case 2:
 
237
                          case 3: graphic->setDimensionFormat( Decimal ); break;
 
238
                          case 4:
 
239
                          case 5: graphic->setDimensionFormat( Fractional ); break;
 
240
                          default: break;
 
241
                        }
 
242
                      }
 
243
                    }
 
244
                  }
 
245
            }*/
 
246
 
 
247
                // Dimension Arrow Size:
 
248
                //
 
249
                else if( dxfLine=="$DIMASZ" ) {
 
250
                                        dxfCode=getBufLine();
 
251
                    if(dxfCode.size()) {
 
252
                        if( dxfCode.toInt()==40 ) {
 
253
                                                        dxfLine=getBufLine() ;
 
254
                            if( dxfLine.size()) {
 
255
                                graphic->addVariable("$DIMASZ", dxfLine, 40);
 
256
                                //graphic->setDimensionArrowSize( dxfLine.toDouble() );
 
257
                            }
 
258
                        }
 
259
                    }
 
260
                }
 
261
 
 
262
                // Dimension Scale:
 
263
                //
 
264
                /*
 
265
                else if( dxfLine=="$DIMSCALE" ) {
 
266
                  if(dxfCode=getBufLine()) {
 
267
                    if( dxfCode.toInt()==40 ) {
 
268
                      if( dxfLine=getBufLine() ) {
 
269
                        graphic->setDimensionScale( dxfLine.toDouble() );
 
270
                      }
 
271
                    }
 
272
                  }
 
273
            }
 
274
                */
 
275
 
 
276
                // Dimension Text Height:
 
277
                //
 
278
 
 
279
 
 
280
 
 
281
 
 
282
 
 
283
 
 
284
 
 
285
                else if( dxfLine=="$DIMTXT" ) {
 
286
                                        dxfLine=getBufLine();
 
287
                    if(dxfCode.size()) {
 
288
                        if( dxfCode.toInt()==40 ) {
 
289
                                                        dxfLine=getBufLine();
 
290
                            if( dxfLine.size() ) {
 
291
                                graphic->addVariable("$DIMTXT", dxfLine, 40);
 
292
                                //graphic->setDimensionTextHeight( dxfLine.toDouble() );
 
293
                            }
 
294
                        }
 
295
                    }
 
296
                }
 
297
 
 
298
                // Dimension exactness:
 
299
                //
 
300
 
 
301
 
 
302
 
 
303
 
 
304
 
 
305
 
 
306
 
 
307
                else if( dxfLine=="$DIMRND" ) {
 
308
                                        dxfLine=getBufLine();
 
309
                    if(dxfCode.size()) {
 
310
                        if( dxfCode.toInt()==40 ) {
 
311
                                                        dxfLine=getBufLine();
 
312
                            if( dxfLine.size() ) {
 
313
                                graphic->addVariable("$DIMRND", dxfLine, 40);
 
314
                                //if( dxfLine.toDouble()>0.000001 ) {
 
315
                                //graphic->setDimensionExactness( dxfLine.toDouble() );
 
316
                            }
 
317
                            //}
 
318
                        }
 
319
                    }
 
320
                }
 
321
 
 
322
                // Dimension over length:
 
323
                //
 
324
 
 
325
 
 
326
 
 
327
 
 
328
 
 
329
 
 
330
 
 
331
                else if( dxfLine=="$DIMEXE" ) {
 
332
                                        dxfLine=getBufLine();
 
333
                    if(dxfCode.size()) {
 
334
                        if( dxfCode.toInt()==40 ) {
 
335
                                                        dxfLine=getBufLine();
 
336
                            if( dxfLine.size() ) {
 
337
                                graphic->addVariable("$DIMEXE", dxfLine, 40);
 
338
                                //graphic->setDimensionOverLength( dxfLine.toDouble() );
 
339
                            }
 
340
                        }
 
341
                    }
 
342
                }
 
343
 
 
344
                // Dimension under length:
 
345
                //
 
346
 
 
347
 
 
348
 
 
349
 
 
350
 
 
351
 
 
352
 
 
353
                else if( dxfLine=="$DIMEXO" ) {
 
354
                                        dxfLine=getBufLine();
 
355
                    if(dxfCode.size()) {
 
356
                        if( dxfCode.toInt()==40 ) {
 
357
                                                        dxfLine=getBufLine();
 
358
                            if( dxfLine.size() ) {
 
359
                                graphic->addVariable("$DIMEXO", dxfLine, 40);
 
360
                                //graphic->setDimensionUnderLength( dxfLine.toDouble() );
 
361
                            }
 
362
                        }
 
363
                    }
 
364
                }
 
365
 
 
366
 
 
367
                // Angle dimension format:
 
368
                //
 
369
 
 
370
 
 
371
 
 
372
 
 
373
 
 
374
 
 
375
 
 
376
                else if( dxfLine=="$DIMAUNIT" ) {
 
377
                                        dxfLine=getBufLine();
 
378
                    if(dxfCode.size()) {
 
379
                        if( dxfCode.toInt()==70 ) {
 
380
                                                        dxfLine=getBufLine();
 
381
                            if( dxfLine.size() ) {
 
382
                                graphic->addVariable("$DIMAUNIT", dxfLine, 70);
 
383
                                /*
 
384
                                            switch( dxfLine.toInt() ) {
 
385
                                              case 0: graphic->setAngleDimensionFormat( DecimalDegrees ); break;
 
386
                                              case 1: graphic->setAngleDimensionFormat( DegreesMinutesSeconds ); break;
 
387
                                              case 2: graphic->setAngleDimensionFormat( Gradians ); break;
 
388
                                              case 3: graphic->setAngleDimensionFormat( Radians ); break;
 
389
                                              case 4: graphic->setAngleDimensionFormat( Surveyor ); break;
 
390
                                              default: break;
 
391
                                            }
 
392
                                */
 
393
                            }
 
394
                        }
 
395
                    }
 
396
                }
 
397
 
 
398
                // Angle dimension exactness:
 
399
                //
 
400
                else if( dxfLine=="$DIMADEC" ) {
 
401
                                        dxfLine=getBufLine();
 
402
                    if(dxfCode.size()) {
 
403
                        if( dxfCode.toInt()==70 ) {
 
404
                                                        dxfLine=getBufLine();
 
405
                            if( dxfLine.size() ) {
 
406
                                graphic->addVariable("$DIMADEC", dxfLine, 70);
 
407
                                //graphic->setAngleDimensionExactness( RS_Math::pow(0.1, dxfLine.toInt()) );
 
408
                            }
 
409
                        }
 
410
                    }
 
411
                }
 
412
 
 
413
                // Grid x/y:
 
414
                //
 
415
                else if( dxfLine=="$GRIDUNIT" ) {
 
416
                                        dxfLine=getBufLine();
 
417
                    if(dxfCode.size()) {
 
418
                        if( dxfCode.toInt()==10 ) {
 
419
                                                        dxfLine=getBufLine();
 
420
                            if (dxfLine.size()) {
 
421
                                double x = atof(dxfLine.toLatin1().data());
 
422
                                                                dxfLine=getBufLine();
 
423
                                if (dxfLine.size()) {
 
424
                                    double y = atof(dxfLine.toLatin1().data());
 
425
 
 
426
                                    graphic->addVariable("$GRIDUNIT", RS_Vector(x,y), 10);
 
427
                                }
 
428
                            }
 
429
                        }
 
430
                    }
 
431
                }
 
432
                /*
 
433
                            double gx=dxfLine.toDouble();
 
434
                            if (gx<0.0001) gx=0.0001;
 
435
                            graphic->setMinGridX(gx);
 
436
                            graphic->setGridFormat( Fractional );
 
437
 
 
438
                            for( double q=0.00000001; q<=100000.0; q*=10.0 ) {
 
439
                              if( mtCompFloat(gx, q, q/1000.0) ) {
 
440
                                graphic->setGridFormat( Decimal );
 
441
                                break;
 
442
                              }
 
443
                            }
 
444
 
 
445
                          }
 
446
                        }
 
447
                      }
 
448
                      if(dxfCode=getBufLine()) {
 
449
                        if( dxfCode.toInt()==20 ) {
 
450
                          if( dxfLine=getBufLine() ) {
 
451
                            double gy=dxfLine.toDouble();
 
452
                            if (gy<0.0001) gy=0.0001;
 
453
                            graphic->setMinGridY(gy);
 
454
                          }
 
455
                        }
 
456
                      }
 
457
                */
 
458
 
 
459
                // Page limits min x/y:
 
460
                //
 
461
                /*else if( dxfLine=="$PLIMMIN" ) {
 
462
                  if(dxfCode=getBufLine()) {
 
463
                    if( dxfCode.toInt()==10 ) {
 
464
                      if( dxfLine=getBufLine() ) {
 
465
                        graphic->setPageOriginX( dxfLine.toDouble() );
 
466
                      }
 
467
                    }
 
468
                  }
 
469
                  if(dxfCode=getBufLine()) {
 
470
                    if( dxfCode.toInt()==20 ) {
 
471
                      if( dxfLine=getBufLine() ) {
 
472
                        graphic->setPageOriginY( dxfLine.toDouble() );
 
473
                      }
 
474
                    }
 
475
                  }
 
476
            }
 
477
                */
 
478
 
 
479
                // Page limits min x/y:
 
480
                //
 
481
                /*
 
482
                      else if( dxfLine=="$PLIMMAX" ) {
 
483
                        if(dxfCode=getBufLine()) {
 
484
                          if( dxfCode.toInt()==10 ) {
 
485
                            if( dxfLine=getBufLine() ) {
 
486
                              graphic->setPageSizeX( dxfLine.toDouble() - graphic->getPageOriginX() );
 
487
                            }
 
488
                          }
 
489
                        }
 
490
                        if(dxfCode=getBufLine()) {
 
491
                          if( dxfCode.toInt()==20 ) {
 
492
                            if( dxfLine=getBufLine() ) {
 
493
                              graphic->setPageSizeY( dxfLine.toDouble() - graphic->getPageOriginY() );
 
494
                            }
 
495
                          }
 
496
                        }
 
497
                      }
 
498
                */
 
499
 
 
500
                // Paper space scale:
 
501
                //
 
502
                /*
 
503
                      else if( dxfLine=="$PSVPSCALE" ) {
 
504
                        if(dxfCode=getBufLine()) {
 
505
                          if( dxfCode.toInt()==40 ) {
 
506
                            if( dxfLine=getBufLine() ) {
 
507
                              graphic->setPaperSpace( dxfLine.toDouble() );
 
508
                            }
 
509
                          }
 
510
                        }
 
511
                      }
 
512
                */
 
513
 
 
514
            }
 
515
 
 
516
            // Entity
 
517
            //
 
518
            else if(dxfLine.size() &&
 
519
                    dxfLine[0]>='A' && dxfLine[0]<='Z') {
 
520
 
 
521
                if(dxfLine=="EOF") {
 
522
                    // End of file reached
 
523
                    //
 
524
                }
 
525
 
 
526
                // ------
 
527
                // Layer:
 
528
                // ------
 
529
                else if(dxfLine=="LAYER") {
 
530
                    currentLayer=0;
 
531
                    do {
 
532
                        dxfCode=getBufLine();
 
533
                        if(dxfCode.size())
 
534
                            code=dxfCode.toInt();
 
535
                        if(dxfCode.size() && code!=0) {
 
536
                            dxfLine=getBufLine();
 
537
                            if(dxfLine.size()) {
 
538
                                switch(code) {
 
539
                                case  2:  // Layer name
 
540
                                                                        if (dxfLine=="(null)" || dxfLine=="default") {
 
541
                                                                                dxfLine = "0";
 
542
                                                                        }
 
543
                                    graphic->addLayer(new RS_Layer(dxfLine));
 
544
                                    graphic->activateLayer(dxfLine);
 
545
                                    currentLayer = graphic->getActiveLayer();
 
546
                                    lastLayer=dxfLine;
 
547
                                    break;
 
548
                                case 70:  // Visibility
 
549
                                    /*
 
550
                                    if(dxfLine.toInt()&5) {
 
551
                                      if(currentLayerNum>=0 && currentLayerNum<DEF_MAXLAYERS) {
 
552
                                        graphic->layer[currentLayerNum].DelFlag(Y_VISIBLE);
 
553
                                      }
 
554
                                }
 
555
                                    */
 
556
                                    break;
 
557
                                case  6:  // style
 
558
                                    //if(currentLayer)
 
559
                                    //currentLayer->setStyle( graphic->nameToStyle(dxfLine) );
 
560
                                    pen.setLineType(RS_FilterDXFRW::nameToLineType(dxfLine));
 
561
                                    break;
 
562
                                case 39:  // Thickness
 
563
                                    //if(currentLayer) currentLayer->setWidth(dxfLine.toInt());
 
564
                                    pen.setWidth(numberToWidth(dxfLine.toInt()));
 
565
                                    break;
 
566
                                case 62:  // Color
 
567
                                    pen.setColor(RS_FilterDXFRW::numberToColor(dxfLine.toInt()));
 
568
                                    //if(currentLayer) {
 
569
                                    //  currentLayer->setColor( graphic->numberToColor(dxfLine.toInt(), !oldColorNumbers));
 
570
                                    //}
 
571
                                    break;
 
572
                                default:
 
573
                                    break;
 
574
                                }
 
575
                            }
 
576
                        }
 
577
                    } while(dxfCode.size() && code!=0);
 
578
                    if (currentLayer) {
 
579
                        currentLayer->setPen(pen);
 
580
                    }
 
581
                    //graphic->setStyle("CONTINOUS");
 
582
                    //graphic->setWidth(0);
 
583
                    //graphic->setColor(0, false);
 
584
                }
 
585
 
 
586
                // ------
 
587
                // Point:
 
588
                // ------
 
589
                else if(dxfLine=="POINT") {
 
590
                    do {
 
591
                        dxfCode=getBufLine();
 
592
                        if(dxfCode.size())
 
593
                            code=dxfCode.toInt();
 
594
                        if(dxfCode.size() && code!=0) {
 
595
                            dxfLine=getBufLine();
 
596
                            if(dxfLine.size()) {
 
597
                                switch(code) {
 
598
                                case  6:  // style
 
599
                                    pen.setLineType(RS_FilterDXFRW::nameToLineType(dxfLine));
 
600
                                    break;
 
601
                                case  8:  // Layer
 
602
                                    //if(dxfLine!=lastLayer) {
 
603
                                                                        if (dxfLine=="(null)" || dxfLine=="default") {
 
604
                                                                                dxfLine = "0";
 
605
                                                                        }
 
606
                                    graphic->activateLayer(dxfLine);
 
607
                                    //lastLayer=dxfLine;
 
608
                                    //}
 
609
                                    break;
 
610
                                case 10:  // X1
 
611
                                    dxfLine.replace( QRegExp(","), "." );
 
612
                                    vx1 = dxfLine.toDouble();
 
613
                                    break;
 
614
                                case 20:  // Y1
 
615
                                    dxfLine.replace( QRegExp(","), "." );
 
616
                                    vy1 = dxfLine.toDouble();
 
617
                                    break;
 
618
                                case 39:  // Thickness
 
619
                                    pen.setWidth(numberToWidth(dxfLine.toInt()));
 
620
                                    break;
 
621
                                case 62:  // Color
 
622
                                    pen.setColor(RS_FilterDXFRW::numberToColor(dxfLine.toInt()));
 
623
                                    break;
 
624
                                default:
 
625
                                    break;
 
626
                                }
 
627
                            }
 
628
                        }
 
629
                    } while(dxfCode.size() && code!=0);
 
630
                    graphic->setActivePen(pen);
 
631
                    graphic->addEntity(new RS_Point(graphic,
 
632
                                                    RS_PointData(RS_Vector(vx1, vy1))));
 
633
                }
 
634
 
 
635
                // -----
 
636
                // Line:
 
637
                // -----
 
638
                else if(dxfLine=="LINE") {
 
639
                    do {
 
640
                        dxfCode=getBufLine();
 
641
 
 
642
                        if(dxfCode.size())
 
643
                            code=dxfCode.toInt();
 
644
                        if(dxfCode.size() && code!=0) {
 
645
 
 
646
                            dxfLine=getBufLine();
 
647
 
 
648
                            if(dxfLine.size()) {
 
649
                                switch(code) {
 
650
                                case  6:  // style
 
651
                                    pen.setLineType(RS_FilterDXFRW::nameToLineType(dxfLine));
 
652
                                    break;
 
653
                                case  8:  // Layer
 
654
                                    //if(dxfLine!=lastLayer) {
 
655
                                                                        if (dxfLine=="(null)" || dxfLine=="default") {
 
656
                                                                                dxfLine = "0";
 
657
                                                                        }
 
658
                                    graphic->activateLayer(dxfLine);
 
659
                                    //lastLayer=dxfLine;
 
660
                                    //}
 
661
                                    break;
 
662
                                case 10:  // X1
 
663
                                    dxfLine.replace( QRegExp(","), "." );
 
664
                                    vx1 = dxfLine.toDouble();
 
665
                                    break;
 
666
                                case 20:  // Y1
 
667
                                    dxfLine.replace( QRegExp(","), "." );
 
668
                                    vy1 = dxfLine.toDouble();
 
669
                                    break;
 
670
                                case 11:  // X2
 
671
                                    dxfLine.replace( QRegExp(","), "." );
 
672
                                    vx2 = dxfLine.toDouble();
 
673
                                    break;
 
674
                                case 21:  // Y2
 
675
                                    dxfLine.replace( QRegExp(","), "." );
 
676
                                    vy2 = dxfLine.toDouble();
 
677
                                    break;
 
678
                                case 39:  // Thickness
 
679
                                    pen.setWidth(numberToWidth(dxfLine.toInt()));
 
680
                                    break;
 
681
                                case 62:  // Color
 
682
                                    pen.setColor(RS_FilterDXFRW::numberToColor(dxfLine.toInt()));
 
683
                                    break;
 
684
                                default:
 
685
                                    break;
 
686
                                }
 
687
                            }
 
688
                        }
 
689
                    } while(dxfCode.size() && code!=0);
 
690
 
 
691
                    //if(!mtCompFloat(vx1, vx2) || !mtCompFloat(vy1, vy2)) {
 
692
                    //graphic->addLine(vx1, vy1, vx2, vy2, currentLayerNum, add);
 
693
                    graphic->setActivePen(pen);
 
694
                    graphic->addEntity(new RS_Line(graphic,
 
695
                                                   RS_LineData(RS_Vector(vx1, vy1), RS_Vector(vx2, vy2))));
 
696
                    //}
 
697
                }
 
698
 
 
699
 
 
700
                // ----
 
701
                // Arc:
 
702
                // ----
 
703
                else if(dxfLine=="ARC") {
 
704
                    do {
 
705
                        dxfCode=getBufLine();
 
706
                        if(dxfCode.size())
 
707
                            code=dxfCode.toInt();
 
708
                        if(dxfCode.size() && code!=0) {
 
709
                            dxfLine=getBufLine();
 
710
                            if(dxfLine.size()) {
 
711
                                switch(code) {
 
712
                                case  6:  // style
 
713
                                    pen.setLineType(RS_FilterDXFRW::nameToLineType(dxfLine));
 
714
                                    break;
 
715
                                case  8:  // Layer
 
716
                                    //if(dxfLine!=lastLayer) {
 
717
                                                                        if (dxfLine=="(null)" || dxfLine=="default") {
 
718
                                                                                dxfLine = "0";
 
719
                                                                        }
 
720
                                    graphic->activateLayer(dxfLine);
 
721
                                    //lastLayer=dxfLine;
 
722
                                    //}
 
723
                                    break;
 
724
                                case 10:  // Centre X
 
725
                                    dxfLine.replace( QRegExp(","), "." );
 
726
                                    vcx = dxfLine.toDouble();
 
727
                                    break;
 
728
                                case 20:  // Centre Y
 
729
                                    dxfLine.replace( QRegExp(","), "." );
 
730
                                    vcy = dxfLine.toDouble();
 
731
                                    break;
 
732
                                case 40:  // Radius
 
733
                                    dxfLine.replace( QRegExp(","), "." );
 
734
                                    vcr = dxfLine.toDouble();
 
735
                                    break;
 
736
                                case 50:  // Start Angle
 
737
                                    dxfLine.replace( QRegExp(","), "." );
 
738
                                    va1 = RS_Math::correctAngle(dxfLine.toDouble()/ARAD);
 
739
                                    break;
 
740
                                case 51:  // End Angle
 
741
                                    dxfLine.replace( QRegExp(","), "." );
 
742
                                    va2 = RS_Math::correctAngle(dxfLine.toDouble()/ARAD);
 
743
                                    break;
 
744
                                case 39:  // Thickness
 
745
                                    pen.setWidth(numberToWidth(dxfLine.toInt()));
 
746
                                    break;
 
747
                                case 62:  // Color
 
748
                                    pen.setColor(RS_FilterDXFRW::numberToColor(dxfLine.toInt()));
 
749
                                    break;
 
750
                                default:
 
751
                                    break;
 
752
                                }
 
753
                            }
 
754
                        }
 
755
                    } while(dxfCode.size() && code!=0);
 
756
                    //if(vcr>0.0 && !mtCompFloat(va1, va2)) {
 
757
                    //  graphic->addArc(vcx, vcy, vcr, va1, va2, false, currentLayerNum, add);
 
758
                    //}
 
759
                    graphic->setActivePen(pen);
 
760
                    graphic->addEntity(new RS_Arc(graphic,
 
761
                                                  RS_ArcData(RS_Vector(vcx, vcy),
 
762
                                                             vcr, va1, va2, false)));
 
763
                }
 
764
 
 
765
                // -------
 
766
                // Circle:
 
767
                // -------
 
768
                else if(dxfLine=="CIRCLE") {
 
769
                    do {
 
770
                        dxfCode=getBufLine();
 
771
                        if(dxfCode.size())
 
772
                            code=dxfCode.toInt();
 
773
                        if(dxfCode.size() && code!=0) {
 
774
                            dxfLine=getBufLine();
 
775
                            if(dxfLine.size()) {
 
776
                                switch(code) {
 
777
                                case  6:  // style
 
778
                                    pen.setLineType(RS_FilterDXFRW::nameToLineType(dxfLine));
 
779
                                    break;
 
780
                                case  8:  // Layer
 
781
                                    //if(dxfLine!=lastLayer) {
 
782
                                                                        if (dxfLine=="(null)" || dxfLine=="default") {
 
783
                                                                                dxfLine = "0";
 
784
                                                                        }
 
785
                                    graphic->activateLayer(dxfLine);
 
786
                                    //lastLayer=dxfLine;
 
787
                                    //}
 
788
                                    break;
 
789
                                case 10:  // Centre X
 
790
                                    dxfLine.replace( QRegExp(","), "." );
 
791
                                    vcx = dxfLine.toDouble();
 
792
                                    break;
 
793
                                case 20:  // Centre Y
 
794
                                    dxfLine.replace( QRegExp(","), "." );
 
795
                                    vcy = dxfLine.toDouble();
 
796
                                    break;
 
797
                                case 40:  // Radius
 
798
                                    dxfLine.replace( QRegExp(","), "." );
 
799
                                    vcr = dxfLine.toDouble();
 
800
                                    break;
 
801
                                case 39:  // Thickness
 
802
                                    pen.setWidth(numberToWidth(dxfLine.toInt()));
 
803
                                    break;
 
804
                                case 62:  // Color
 
805
                                    pen.setColor(RS_FilterDXFRW::numberToColor(dxfLine.toInt()));
 
806
                                    break;
 
807
                                default:
 
808
                                    break;
 
809
                                }
 
810
                            }
 
811
                        }
 
812
                    } while(dxfCode.size() && code!=0);
 
813
                    /*if(vcr>0.0) {
 
814
                      graphic->addCircle(vcx, vcy, vcr, 0.0, 360.0, false, currentLayerNum, add);
 
815
                }*/
 
816
                    graphic->setActivePen(pen);
 
817
                    graphic->addEntity(new RS_Circle(graphic,
 
818
                                                     RS_CircleData(RS_Vector(vcx, vcy),
 
819
                                                                   vcr)));
 
820
                }
 
821
 
 
822
 
 
823
                // ------
 
824
                // Hatch:
 
825
                // ------
 
826
                /*
 
827
                if(dxfLine=="HATCH") {
 
828
                  do {
 
829
                    dxfCode=getBufLine();
 
830
                    if(dxfCode) code=dxfCode.toInt();
 
831
                    if(dxfCode && code!=0) {
 
832
                      dxfLine=getBufLine();
 
833
                      if(dxfLine) {
 
834
                        switch(code) {
 
835
                          case  8:  // Layer
 
836
                          //  if(dxfLine!=lastLayer) {
 
837
                                                                        if (dxfLine=="(null)" || dxfLine=="default") {
 
838
                                                                                dxfLine = "0";
 
839
                                                                        }
 
840
                              graphic->activateLayer(dxfLine);
 
841
                              //lastLayer=dxfLine;
 
842
                            //}
 
843
                            break;
 
844
                          case 10:  // X1
 
845
                            vx1 = dxfLine.toDouble();
 
846
                            break;
 
847
                          case 20:  // Y1
 
848
                            vy1 = dxfLine.toDouble();
 
849
                            //graphic->Vec[vc].CreatePoint(vy1, vx1, currentLayerNum);
 
850
                            //if(vc<vElements-1) ++vc;
 
851
                            break;
 
852
                          case 11:  // X2
 
853
                            vx2 = dxfLine.toDouble();
 
854
                            break;
 
855
                          case 21:  // Y2
 
856
                            vy2 = dxfLine.toDouble();
 
857
                            //graphic->Vec[vc].CreatePoint(vy2, vx2, currentLayerNum);
 
858
                            //if(vc<vElements-1) ++vc;
 
859
                            break;
 
860
                          default:
 
861
                            break;
 
862
                        }
 
863
                      }
 
864
                    }
 
865
                  }while(dxfCode && code!=0);
 
866
                  / *
 
867
                  if(!mt.CompFloat(vx1, vx2) || !mt.CompFloat(vy1, vy2)) {
 
868
                    graphic->Vec[vc].CreateLine(vx1, vy1, vx2, vy2, currentLayerNum);
 
869
                    if(vc<vElements-1) ++vc;
 
870
                  }
 
871
                  if(++updProgress==1000) {
 
872
                    np->getStateWin()->UpdateProgressBar((int)(pcFact*vc)+25);
 
873
                    updProgress=0;
 
874
                  }
 
875
                  * /
 
876
            }
 
877
                */
 
878
 
 
879
 
 
880
                // -----
 
881
                // Text:
 
882
                // -----
 
883
                else if(dxfLine=="TEXT") {
 
884
 
 
885
                    QString vtext;          // the text
 
886
                    char  vtextStyle[256];  // text style (normal_ro, cursive_ri, normal_st, ...)
 
887
                    double vheight=10.0;     // text height
 
888
                    double vtextAng=0.0;     // text angle
 
889
                    //double vradius=0.0;      // text radius
 
890
                    //double vletterspace=2.0; // Text letter space
 
891
                    //double vwordspace=6.0;   // Text wordspace
 
892
                    QString vfont;         // font "normal", "cursive", ...
 
893
                    RS_MTextData::HAlign vhalign=RS_MTextData::HALeft;
 
894
                    // alignment (0=left, 1=center, 2=right)
 
895
                    //int   vattachement=7;   // 1=top left, 2, 3, 4, 5, 6, 7, 8, 9=bottom right
 
896
                    //unsigned  vfl=0;            // special flags
 
897
//RLZ: unused                    bool  codeSeven=false;  // Have we found a code seven?
 
898
 
 
899
                    vtextStyle[0] = '\0';
 
900
                    vfont="normal";
 
901
 
 
902
                    do {
 
903
                        dxfCode=getBufLine();
 
904
                        if(dxfCode.size())
 
905
                            code=dxfCode.toInt();
 
906
                        if(dxfCode.size() && code!=0) {
 
907
                            if(code!=1 && code!=3 && code!=7)
 
908
                                dxfLine=getBufLine();
 
909
                            if(dxfLine.size() || code==1 || code==3 || code==7) {
 
910
 
 
911
                                switch(code) {
 
912
 
 
913
                                case  1:  // Text itself
 
914
                                    vtext=getBufLine();
 
915
                                    strDecodeDxfString(vtext);
 
916
                                    break;
 
917
 
 
918
                                case  3:  // Text parts (always 250 chars)
 
919
                                    vtext=getBufLine();
 
920
                                    break;
 
921
 
 
922
                                case  6:  // style
 
923
                                    pen.setLineType(RS_FilterDXFRW::nameToLineType(dxfLine));
 
924
                                    break;
 
925
 
 
926
                                case  7:  
 
927
                                                                    // Text style (normal_ro#50.0, 
 
928
                                                                        //    cursive_ri#20.0, normal_st)
 
929
                                    qstrncpy(vtextStyle, getBufLine().toLatin1().data(), 249);
 
930
 
 
931
                                    // get font typ:
 
932
                                    //
 
933
                                    {
 
934
                                        char dummy[256];
 
935
                                        sscanf(vtextStyle, "%[^_#\n]", dummy);
 
936
                                        vfont=dummy;
 
937
                                    }
 
938
 
 
939
                                    // get text style:
 
940
                                    //
 
941
                                    /*
 
942
                                                               if(strstr(vtextStyle, "_ro"))
 
943
                                                                   vfl=vfl|E_ROUNDOUT;
 
944
                                                               else if(strstr(vtextStyle, "_ri"))
 
945
                                                                   vfl=vfl|E_ROUNDIN;
 
946
                                                               else
 
947
                                                                   vfl=vfl|E_STRAIGHT;
 
948
                                    */
 
949
                                                                        
 
950
 
 
951
                                    /*if(strstr(vtextStyle, "_fix")) {
 
952
                                        vfl=vfl|E_FIXEDWIDTH;
 
953
                                }*/
 
954
 
 
955
                                    // get radius, letterspace, wordspace:
 
956
                                    //
 
957
                                    {
 
958
                                        char *ptr;  // pointer to value
 
959
                                        ptr = strchr(vtextStyle, '#');
 
960
                                        if(ptr) {
 
961
                                            // Parse radius
 
962
                                            /*if(vfl&E_ROUNDOUT || vfl&E_ROUNDIN) {
 
963
                                                ++ptr;
 
964
                                                if(ptr[0]) {
 
965
                                                    sscanf(ptr, "%lf", &vradius);
 
966
                                                }
 
967
                                                ptr = strchr(ptr, '#');
 
968
                                        }*/
 
969
                                            /*if(ptr) {
 
970
                                                // Parse letter space:
 
971
                                                ++ptr;
 
972
                                                if(ptr[0]) {
 
973
                                                    sscanf(ptr, "%lf", &vletterspace);
 
974
                                                }
 
975
                                                // Parse word space:
 
976
                                                ptr = strchr(ptr, '#');
 
977
                                                if(ptr) {
 
978
                                                    ++ptr;
 
979
                                                    if(ptr[0]) {
 
980
                                                        sscanf(ptr, "%lf", &vwordspace);
 
981
                                                    }
 
982
                                                }
 
983
                                        }*/
 
984
                                        }
 
985
                                    }
 
986
//RLZ: unused                                    codeSeven=true;
 
987
                                    break;
 
988
 
 
989
                                case  8:  // Layer
 
990
                                    //if(dxfLine!=lastLayer) {
 
991
                                                                        if (dxfLine=="(null)" || dxfLine=="default") {
 
992
                                                                                dxfLine = "0";
 
993
                                                                        }
 
994
                                    graphic->activateLayer(dxfLine);
 
995
                                    //lastLayer=dxfLine;
 
996
                                    //}
 
997
                                    break;
 
998
 
 
999
                                case 10:  // X1
 
1000
                                    dxfLine.replace( QRegExp(","), "." );
 
1001
                                    vx1 = dxfLine.toDouble();
 
1002
                                    break;
 
1003
                                case 20:  // Y1
 
1004
                                    dxfLine.replace( QRegExp(","), "." );
 
1005
                                    vy1 = dxfLine.toDouble();
 
1006
                                    break;
 
1007
                                case 40:  // height
 
1008
                                    dxfLine.replace( QRegExp(","), "." );
 
1009
                                    vheight = dxfLine.toDouble();
 
1010
                                    /*if(!codeSeven) {
 
1011
                                        vletterspace = vheight*0.2;
 
1012
                                        vwordspace = vheight*0.6;
 
1013
                                }*/
 
1014
                                    break;
 
1015
                                case 50:  // angle
 
1016
                                    dxfLine.replace( QRegExp(","), "." );
 
1017
                                    vtextAng = dxfLine.toDouble() / ARAD;
 
1018
                                    break;
 
1019
                                case 72:  {// alignment
 
1020
                                        //if(!mtext) {
 
1021
                                        int v = dxfLine.toInt();
 
1022
                                        if(v==1)
 
1023
                                            vhalign = RS_MTextData::HACenter;
 
1024
                                        else if(v==2)
 
1025
                                            vhalign = RS_MTextData::HARight;
 
1026
                                        else
 
1027
                                            vhalign = RS_MTextData::HALeft;
 
1028
                                        //}
 
1029
                                    }
 
1030
                                    break;
 
1031
                                case 39:  // Thickness
 
1032
                                    pen.setWidth(numberToWidth(dxfLine.toInt()));
 
1033
                                    break;
 
1034
                                case 62:  // Color
 
1035
                                    pen.setColor(RS_FilterDXFRW::numberToColor(dxfLine.toInt()));
 
1036
                                    break;
 
1037
                                default:
 
1038
                                    break;
 
1039
                                }
 
1040
                            }
 
1041
                        }
 
1042
                    } while(dxfCode.size() && code!=0);
 
1043
                    char* i=strchr(vtextStyle, '#');
 
1044
                    if (i!=NULL) {
 
1045
                        i[0] = '\0';
 
1046
                    }
 
1047
                    graphic->addEntity(
 
1048
                        new RS_MText(graphic,
 
1049
                                    RS_MTextData(
 
1050
                                        RS_Vector(vx1, vy1),
 
1051
                                        vheight,
 
1052
                                        100.0,
 
1053
                                        RS_MTextData::VABottom,
 
1054
                                        vhalign,
 
1055
                                        RS_MTextData::LeftToRight,
 
1056
                                        RS_MTextData::Exact,
 
1057
                                        1.0,
 
1058
                                        vtext,
 
1059
                                        vtextStyle,
 
1060
                                        vtextAng
 
1061
                                    )
 
1062
                                   )
 
1063
                    );
 
1064
                }
 
1065
 
 
1066
                // ----------
 
1067
                // Dimension:
 
1068
                // ----------
 
1069
                else if(dxfLine=="DIMENSION") {
 
1070
                    int typ=1;
 
1071
                    double v10=0.0, v20=0.0;
 
1072
                    double v13=0.0, v23=0.0;
 
1073
                    double v14=0.0, v24=0.0;
 
1074
                    double v15=0.0, v25=0.0;
 
1075
                    double v16=0.0, v26=0.0;
 
1076
                    double v40=0.0, v50=0.0;
 
1077
                    QString dimText;
 
1078
                    do {
 
1079
                        dxfCode=getBufLine();
 
1080
                        if(dxfCode.size()) {
 
1081
                            code=dxfCode.toInt();
 
1082
                        }
 
1083
                        if(dxfCode.size() && code!=0) {
 
1084
                            dxfLine=getBufLine();
 
1085
                            if(dxfLine.size()) {
 
1086
                                switch(code) {
 
1087
                                case  1:  // Text (if any)
 
1088
                                    dimText=dxfLine;
 
1089
 
 
1090
                                    // Mend unproper savings of older versions:
 
1091
                                    if(dimText==" " || dimText==";;")
 
1092
                                        dimText="";
 
1093
 
 
1094
                                    //else dimText.replace(QRegExp("%%c"), "¯");
 
1095
                                    else
 
1096
                                        strDecodeDxfString(dimText);
 
1097
                                    break;
 
1098
                                case  6:  // style
 
1099
                                    pen.setLineType(RS_FilterDXFRW::nameToLineType(dxfLine));
 
1100
                                    break;
 
1101
                                case  8:  // Layer
 
1102
                                    //if(dxfLine!=lastLayer) {
 
1103
                                                                        if (dxfLine=="(null)" || dxfLine=="default") {
 
1104
                                                                                dxfLine = "0";
 
1105
                                                                        }
 
1106
                                    graphic->activateLayer(dxfLine);
 
1107
                                    //lastLayer=dxfLine;
 
1108
                                    //}
 
1109
                                    break;
 
1110
                                case 10:  // line position x
 
1111
                                    dxfLine.replace( QRegExp(","), "." );
 
1112
                                    v10 = dxfLine.toDouble();
 
1113
                                    break;
 
1114
                                case 20:  // line position y
 
1115
                                    dxfLine.replace( QRegExp(","), "." );
 
1116
                                    v20 = dxfLine.toDouble();
 
1117
                                    break;
 
1118
                                case 13:  // X1
 
1119
                                    dxfLine.replace( QRegExp(","), "." );
 
1120
                                    v13 = dxfLine.toDouble();
 
1121
                                    break;
 
1122
                                case 23:  // Y1
 
1123
                                    dxfLine.replace( QRegExp(","), "." );
 
1124
                                    v23 = dxfLine.toDouble();
 
1125
                                    break;
 
1126
                                case 14:  // X2
 
1127
                                    dxfLine.replace( QRegExp(","), "." );
 
1128
                                    v14 = dxfLine.toDouble();
 
1129
                                    break;
 
1130
                                case 24:  // Y2
 
1131
                                    dxfLine.replace( QRegExp(","), "." );
 
1132
                                    v24 = dxfLine.toDouble();
 
1133
                                    break;
 
1134
                                case 15:  // X3
 
1135
                                    dxfLine.replace( QRegExp(","), "." );
 
1136
                                    v15 = dxfLine.toDouble();
 
1137
                                    break;
 
1138
                                case 25:  // Y3
 
1139
                                    dxfLine.replace( QRegExp(","), "." );
 
1140
                                    v25 = dxfLine.toDouble();
 
1141
                                    break;
 
1142
                                case 16:  // X4
 
1143
                                    dxfLine.replace( QRegExp(","), "." );
 
1144
                                    v16 = dxfLine.toDouble();
 
1145
                                    break;
 
1146
                                case 26:  // Y4
 
1147
                                    dxfLine.replace( QRegExp(","), "." );
 
1148
                                    v26 = dxfLine.toDouble();
 
1149
                                    break;
 
1150
                                case 40:
 
1151
                                    dxfLine.replace( QRegExp(","), "." );
 
1152
                                    v40 = dxfLine.toDouble();
 
1153
                                    break;
 
1154
                                case 50:
 
1155
                                    dxfLine.replace( QRegExp(","), "." );
 
1156
                                    v50 = dxfLine.toDouble();
 
1157
                                    break;
 
1158
                                case 70:  // Typ
 
1159
                                    typ = dxfLine.toInt();
 
1160
                                    break;
 
1161
                                case 39:  // Thickness
 
1162
                                    pen.setWidth(numberToWidth(dxfLine.toInt()));
 
1163
                                    break;
 
1164
                                case 62:  // Color
 
1165
                                    pen.setColor(RS_FilterDXFRW::numberToColor(dxfLine.toInt()));
 
1166
                                    break;
 
1167
 
 
1168
                                default:
 
1169
                                    break;
 
1170
                                }
 
1171
                            }
 
1172
                        }
 
1173
                    } while(dxfCode.size() && code!=0);
 
1174
                                        
 
1175
                    //double dist;
 
1176
 
 
1177
                    // Remove Bit values:
 
1178
                    if(typ>=128) {
 
1179
                        typ-=128;   // Location of Text
 
1180
                                        }
 
1181
                    if(typ>= 64) {
 
1182
                        typ-= 64;   // Ordinate
 
1183
                                        }
 
1184
 
 
1185
                    switch(typ) {
 
1186
                        // Horiz. / vert.:
 
1187
                    case 0: {
 
1188
                            RS_DimLinear* d =
 
1189
                                new RS_DimLinear(
 
1190
                                    graphic,
 
1191
                                    RS_DimensionData(
 
1192
                                        RS_Vector(v10, v20),
 
1193
                                        RS_Vector(0.0, 0.0),
 
1194
                                        RS_MTextData::VABottom,
 
1195
                                        RS_MTextData::HACenter,
 
1196
                                        RS_MTextData::Exact,
 
1197
                                        1.0,
 
1198
                                        dimText,
 
1199
                                        "ISO-25",
 
1200
                                        0.0
 
1201
                                    ),
 
1202
                                    RS_DimLinearData(
 
1203
                                        RS_Vector(v13, v23),
 
1204
                                        RS_Vector(v14, v24),
 
1205
                                        v50/ARAD,
 
1206
                                        0.0
 
1207
                                    )
 
1208
                                );
 
1209
                            d->update();
 
1210
                            graphic->addEntity(d);
 
1211
                        }
 
1212
                        break;
 
1213
 
 
1214
                        // Aligned:
 
1215
                    case 1: {
 
1216
                            double angle =
 
1217
                                RS_Vector(v13, v23).angleTo(RS_Vector(v10,v20));
 
1218
                            double dist =
 
1219
                                RS_Vector(v13, v23).distanceTo(RS_Vector(v10,v20));
 
1220
 
 
1221
                            RS_Vector defP;
 
1222
                            defP.setPolar(dist, angle);
 
1223
                            defP+=RS_Vector(v14, v24);
 
1224
 
 
1225
                            RS_DimAligned* d =
 
1226
                                new RS_DimAligned(
 
1227
                                    graphic,
 
1228
                                    RS_DimensionData(
 
1229
                                        defP,
 
1230
                                        RS_Vector(0.0, 0.0),
 
1231
                                        RS_MTextData::VABottom,
 
1232
                                        RS_MTextData::HACenter,
 
1233
                                        RS_MTextData::Exact,
 
1234
                                        1.0,
 
1235
                                        dimText,
 
1236
                                        "ISO-25",
 
1237
                                        0.0
 
1238
                                    ),
 
1239
                                    RS_DimAlignedData(
 
1240
                                        RS_Vector(v13, v23),
 
1241
                                        RS_Vector(v14, v24)
 
1242
                                    )
 
1243
                                );
 
1244
                            d->update();
 
1245
                            graphic->addEntity(d);
 
1246
                        }
 
1247
                        break;
 
1248
 
 
1249
                        // Angle:
 
1250
                    case 2: {
 
1251
                            RS_Line tl1(NULL,
 
1252
                                        RS_LineData(RS_Vector(v13, v23),
 
1253
                                                    RS_Vector(v14, v24)));
 
1254
                            RS_Line tl2(NULL,
 
1255
                                        RS_LineData(RS_Vector(v10, v20),
 
1256
                                                    RS_Vector(v15, v25)));
 
1257
 
 
1258
                            RS_VectorSolutions s;
 
1259
                            //bool inters=false;
 
1260
                            //tmpEl1.getIntersection(&tmpEl2,
 
1261
                            //                       &inters, &vcx, &vcy, 0,0,0,0, false);
 
1262
                            s = RS_Information::getIntersection(
 
1263
                                    &tl1, &tl2, false);
 
1264
 
 
1265
                            if (s.get(0).valid) {
 
1266
                                vcx = s.get(0).x;
 
1267
                                vcy = s.get(0).y;
 
1268
                                //vcr = RS_Vector(vcx, vcy).distanceTo(v16, v26);
 
1269
 
 
1270
                                /*if(RS_Vector(vcx,vcy).distanceTo(v13,v23)<vcr) {
 
1271
                                    va1 = tl1.getAngle1();
 
1272
                            } else {
 
1273
                                    va1 = tl2.getAngle2();
 
1274
                            }
 
1275
 
 
1276
                                if(RS_Vector(vcx,vcy).distanceTo(v10,v20)<vcr) {
 
1277
                                    va2 = tl2.getAngle1();
 
1278
                            } else {
 
1279
                                    va2 = tl2.getAngle2();
 
1280
                            }
 
1281
                                */
 
1282
                                /*
 
1283
                                graphic->addDimension(vcx, vcy, va1, va2,
 
1284
                                               mtGetDistance(vcx, vcy, v13, v23),
 
1285
                                               mtGetDistance(vcx, vcy, v10, v20),
 
1286
                                                      vcr,
 
1287
                                                      E_ROUNDOUT,
 
1288
                                                      currentLayerNum,
 
1289
                                                      add);
 
1290
                                */
 
1291
                                //RS_Vector dp4;
 
1292
                                //dp4.setPolar();
 
1293
                                RS_DimAngular* d =
 
1294
                                    new RS_DimAngular(
 
1295
                                        graphic,
 
1296
                                        RS_DimensionData(
 
1297
                                            RS_Vector(v10, v20),
 
1298
                                            RS_Vector(0.0, 0.0),
 
1299
                                            RS_MTextData::VABottom,
 
1300
                                            RS_MTextData::HACenter,
 
1301
                                            RS_MTextData::Exact,
 
1302
                                            1.0,
 
1303
                                            dimText,
 
1304
                                            "ISO-25",
 
1305
                                            0.0
 
1306
                                        ),
 
1307
                                        RS_DimAngularData(
 
1308
                                            RS_Vector(v13, v23),
 
1309
                                            RS_Vector(vcx, vcy),
 
1310
                                            RS_Vector(vcx, vcy),
 
1311
                                            RS_Vector(v16, v26)
 
1312
                                        )
 
1313
                                    );
 
1314
                                d->update();
 
1315
                                graphic->addEntity(d);
 
1316
                            }
 
1317
                        }
 
1318
                        break;
 
1319
 
 
1320
                        // Radius:
 
1321
                    case 4: {
 
1322
                            /*
 
1323
                                                graphic->addDimension(v10, v20, v15, v25,
 
1324
                                                                    0.0, 0.0,
 
1325
                                                                                      v40,
 
1326
                                                                                      E_STRAIGHT|E_RADIUS,
 
1327
                                                                                      currentLayerNum,
 
1328
                                                                                      add);
 
1329
                                                                                                */
 
1330
 
 
1331
                            double ang =
 
1332
                                RS_Vector(v10, v20)
 
1333
                                .angleTo(RS_Vector(v15, v25));
 
1334
                            RS_Vector v2;
 
1335
                            v2.setPolar(v40, ang);
 
1336
                            RS_DimRadial* d =
 
1337
                                new RS_DimRadial(
 
1338
                                    graphic,
 
1339
                                    RS_DimensionData(
 
1340
                                        RS_Vector(v10, v20),
 
1341
                                        RS_Vector(0.0, 0.0),
 
1342
                                        RS_MTextData::VABottom,
 
1343
                                        RS_MTextData::HACenter,
 
1344
                                        RS_MTextData::Exact,
 
1345
                                        1.0,
 
1346
                                        dimText,
 
1347
                                        "ISO-25",
 
1348
                                        0.0
 
1349
                                    ),
 
1350
                                    RS_DimRadialData(
 
1351
                                        RS_Vector(v10, v20) + v2,
 
1352
                                        0.0
 
1353
                                    )
 
1354
                                );
 
1355
                            d->update();
 
1356
                            graphic->addEntity(d);
 
1357
                        }
 
1358
                        break;
 
1359
 
 
1360
                        // Arrow:
 
1361
                    case 7: {
 
1362
                            /*
 
1363
                                           graphic->addDimension(v13, v23, v14, v24,
 
1364
                                                                 0.0, 0.0, 0.0,
 
1365
                                                                 E_STRAIGHT|E_ARROW,
 
1366
                                                                 currentLayerNum,
 
1367
                                                                 add);
 
1368
                            */
 
1369
                                                        /*
 
1370
                            double ang =
 
1371
                                RS_Vector(v10, v20)
 
1372
                                .angleTo(RS_Vector(v15, v25));
 
1373
                            RS_Vector v2;
 
1374
                            v2.setPolar(v40, ang);
 
1375
                            RS_DimDiametric* d =
 
1376
                                new RS_DimDiametric(
 
1377
                                    graphic,
 
1378
                                    RS_DimensionData(
 
1379
                                        RS_Vector(v10, v20),
 
1380
                                        RS_Vector(0.0, 0.0),
 
1381
                                        RS2::VAlignBottom,
 
1382
                                        RS2::HAlignCenter,
 
1383
                                        RS2::Exact,
 
1384
                                        1.0,
 
1385
                                        dimText,
 
1386
                                        "ISO-25",
 
1387
                                        0.0
 
1388
                                    ),
 
1389
                                    RS_DimDiametricData(
 
1390
                                        RS_Vector(v10, v20) + v2,
 
1391
                                        0.0
 
1392
                                    )
 
1393
                                );
 
1394
                            d->update();
 
1395
                            graphic->addEntity(d);
 
1396
                                                        */
 
1397
                                                        RS_LeaderData data(true);
 
1398
                                                        RS_Leader* d = 
 
1399
                                                                new RS_Leader(graphic, data);
 
1400
                                                        d->addVertex(RS_Vector(v14, v24));
 
1401
                                                        d->addVertex(RS_Vector(v10, v20));
 
1402
                                                        d->update();
 
1403
                                                        graphic->addEntity(d);
 
1404
                        }
 
1405
                        break;
 
1406
                    }
 
1407
                    //graphic->elementCurrent()->setText(dimText);
 
1408
                }
 
1409
 
 
1410
 
 
1411
 
 
1412
                // ---------
 
1413
                // Hatching:
 
1414
                // ---------
 
1415
                /*
 
1416
                      else if(dxfLine=="HATCH") {
 
1417
                        QString patternName="45";
 
1418
                        double patternScale=1.0;
 
1419
                        //int numPaths=1;
 
1420
                        //int numEdges=1;
 
1421
                        int nextObjectTyp=T_LINE;
 
1422
                        double v10=0.0, v20=0.0,
 
1423
                              v11=0.0, v21=0.0,
 
1424
                              v40=0.0, v50=0.0,
 
1425
                              v51=0.0;
 
1426
                        do {
 
1427
                          dxfCode=getBufLine();
 
1428
                          if(dxfCode) code=dxfCode.toInt();
 
1429
                          if(dxfCode && code!=0) {
 
1430
                            dxfLine=getBufLine();
 
1431
                            if(dxfLine) {
 
1432
                              switch(code) {
 
1433
                                case  2:
 
1434
                                  patternName = dxfLine;
 
1435
                                  break;
 
1436
                                case  6:  // style
 
1437
                                  pen.setLineType(RS_FilterDXF::nameToLineType(dxfLine));
 
1438
                                  break;
 
1439
                                case  8:  // Layer
 
1440
                                //  if(dxfLine!=lastLayer) {
 
1441
                                                                        if (dxfLine=="(null)" || dxfLine=="default") {
 
1442
                                                                                dxfLine = "0";
 
1443
                                                                        }
 
1444
                                    graphic->activateLayer(dxfLine);
 
1445
                                    //lastLayer=dxfLine;
 
1446
                                  //}
 
1447
                                  break;
 
1448
                                case 10:  // Start point/center of boundary line/arc
 
1449
                                  dxfLine.replace( QRegExp(","), "." );
 
1450
                                  v10=dxfLine.toDouble();
 
1451
                                  break;
 
1452
                                case 20:  // Start point/center of boundary line/arc
 
1453
                                  dxfLine.replace( QRegExp(","), "." );
 
1454
                                  v20=dxfLine.toDouble();
 
1455
                                  break;
 
1456
                                case 11:  // End point of boundary line
 
1457
                                  dxfLine.replace( QRegExp(","), "." );
 
1458
                                  v11=dxfLine.toDouble();
 
1459
                                  break;
 
1460
                                case 21:  // End point of boundary line
 
1461
                                  dxfLine.replace( QRegExp(","), "." );
 
1462
                                  v21=dxfLine.toDouble();
 
1463
                                  if(nextObjectTyp==T_LINE) {
 
1464
                                    int elnu=graphic->addLine(v10, v20, v11, v21, currentLayerNum, add);
 
1465
                                    graphic->elementAt(elnu)->setFlag(E_TAGGED);
 
1466
                                  }
 
1467
                                  break;
 
1468
                                case 40:  // Radius of boundary entity
 
1469
                                  dxfLine.replace( QRegExp(","), "." );
 
1470
                                  v40=dxfLine.toDouble();
 
1471
                                  break;
 
1472
                                case 50:  // Start angle
 
1473
                                  dxfLine.replace( QRegExp(","), "." );
 
1474
                                  v50=dxfLine.toDouble();
 
1475
                                  break;
 
1476
                                case 51:  // End angle
 
1477
                                  dxfLine.replace( QRegExp(","), "." );
 
1478
                                  v51=dxfLine.toDouble();
 
1479
                                  break;
 
1480
                                case 73:  // Counterclockwise?
 
1481
                                  if(nextObjectTyp==T_ARC) {
 
1482
                                    int elnu;
 
1483
                                    if( mtCompFloat( v50, 0.0 ) && mtCompFloat( v51, 0.0 ) ) {
 
1484
                                      elnu=graphic->addCircle(v10, v20, v40, 0.0, 360.0, (bool)dxfLine.toInt(), currentLayerNum, add);
 
1485
                                    }
 
1486
                                    else {
 
1487
                                      elnu=graphic->addArc(v10, v20, v40, v50, v51, (bool)dxfLine.toInt(), currentLayerNum, add);
 
1488
                                    }
 
1489
                                    graphic->elementAt(elnu)->setFlag(E_TAGGED);
 
1490
                                    //newEl = new RElement( graphic );
 
1491
                                    //newEl->createArc(v10, v20, v40, v50, v51, (bool)dxfLine.toInt());
 
1492
                                    //boundaryList.append(newEl);
 
1493
                                  }
 
1494
                                  break;
 
1495
                                case 41:  // Scale
 
1496
                                  dxfLine.replace( QRegExp(","), "." );
 
1497
                                  patternScale=dxfLine.toDouble();
 
1498
                                  break;
 
1499
                                case 52:  // Angle
 
1500
 
 
1501
                                  break;
 
1502
                                case 70:  // Solid (=1) or pattern (=0)
 
1503
 
 
1504
                                  break;
 
1505
                                case 39:  // Thickness
 
1506
                                  pen.setWidth(RS_FilterDXF::numberToWidth(dxfLine.toInt()));
 
1507
                                  break;
 
1508
                                case 62:  // Color
 
1509
                                  pen.setColor(RS_FilterDXF::numberToColor(dxfLine.toInt()));
 
1510
                                  break;
 
1511
                                case 91:  // Number of boundary paths (loops)
 
1512
                                  //numPaths=dxfLine.toInt();
 
1513
                                  break;
 
1514
                                case 92:  // Typ of boundary
 
1515
 
 
1516
                                  break;
 
1517
                                case 93:  // Number of edges in this boundary
 
1518
                                  //numEdges=dxfLine.toInt();
 
1519
                                  break;
 
1520
                                case 72:  // Edge typ
 
1521
                                  switch(dxfLine.toInt()) {
 
1522
                                    case 1: nextObjectTyp=T_LINE; break;
 
1523
                                    case 2: nextObjectTyp=T_ARC;  break;
 
1524
                                    default: break;
 
1525
                                  }
 
1526
                                  break;
 
1527
 
 
1528
                                default:
 
1529
                                  break;
 
1530
                              }
 
1531
                            }
 
1532
                          }
 
1533
                        }while(dxfCode && code!=0);
 
1534
 
 
1535
                        graphic->addHatching(patternScale,
 
1536
                                             patternName,
 
1537
                                             currentLayerNum,
 
1538
                                             add);
 
1539
 
 
1540
                        graphic->editDelete(false);
 
1541
 
 
1542
                      }
 
1543
                */
 
1544
 
 
1545
            }
 
1546
        }
 
1547
        while(dxfLine.size() && dxfLine!="EOF");
 
1548
 
 
1549
        //graphic->terminateAction();
 
1550
 
 
1551
        //graphic->debugElements();
 
1552
 
 
1553
        ret=true;
 
1554
    } else {
 
1555
        ret=false;
 
1556
    }
 
1557
 
 
1558
    return ret;
 
1559
}
 
1560
 
 
1561
 
 
1562
 
 
1563
 
 
1564
 
 
1565
 
 
1566
/**
 
1567
 * Resets  the whole object
 
1568
 *   (base class too)
 
1569
 */
 
1570
void RS_FilterDXF1::reset() {
 
1571
    file.reset();
 
1572
 
 
1573
    delBuffer();
 
1574
    fBufP=0;
 
1575
    fSize=0;
 
1576
    if(fPointer) {
 
1577
        fclose(fPointer);
 
1578
        fPointer=0;
 
1579
    }
 
1580
}
 
1581
 
 
1582
 
 
1583
 
 
1584
/**
 
1585
 * Reset buffer pointer to the beginning of the buffer:
 
1586
 */
 
1587
void RS_FilterDXF1::resetBufP() {
 
1588
    fBufP=0;
 
1589
}
 
1590
 
 
1591
 
 
1592
 
 
1593
/**
 
1594
 * Set buffer pointer to the given index:
 
1595
 */
 
1596
void RS_FilterDXF1::setBufP(int _fBufP) {
 
1597
    if(_fBufP<(int)fSize) {
 
1598
        fBufP = _fBufP;
 
1599
    }
 
1600
}
 
1601
 
 
1602
 
 
1603
/**
 
1604
 * delete buffer:
 
1605
 */
 
1606
void RS_FilterDXF1::delBuffer() {
 
1607
    if(fBuf) {
 
1608
        delete[] fBuf;
 
1609
        fBuf=0;
 
1610
    }
 
1611
}
 
1612
 
 
1613
 
 
1614
 
 
1615
/**
 
1616
 * Remove any 13-characters in the buffer:
 
1617
 */
 
1618
void RS_FilterDXF1::dos2unix() {
 
1619
    char *src = fBuf, *dst = fBuf;
 
1620
 
 
1621
    if (!fBuf)
 
1622
        return;
 
1623
 
 
1624
    while (*src != '\0') {
 
1625
        if (*src == '\r') {
 
1626
            dosFile = true;
 
1627
        } else {
 
1628
            *dst++ = *src;
 
1629
        }
 
1630
        src++;
 
1631
    }
 
1632
 
 
1633
    *dst = '\0';
 
1634
}
 
1635
 
 
1636
 
 
1637
// Get next line in the buffer:
 
1638
//   and overread ALL seperators
 
1639
//
 
1640
// return:  -Null-string: end of buffer
 
1641
//          -String which is the next line in buffer
 
1642
//
 
1643
QString RS_FilterDXF1::getBufLine() {
 
1644
    char *ret;
 
1645
    QString str;
 
1646
 
 
1647
    if (fBufP >= (int)fSize)
 
1648
        return QString::null;
 
1649
 
 
1650
    ret = &fBuf[fBufP];
 
1651
 
 
1652
    // Skip empty lines
 
1653
    /*if (*ret == '\0' && noEmptyLines) {
 
1654
        while (++fBufP < (int)fSize && fBuf[fBufP] == '\0')
 
1655
            ;
 
1656
        if (fBufP >= (int)fSize)
 
1657
            return QString::null;
 
1658
        ret = &fBuf[fBufP];
 
1659
}*/
 
1660
 
 
1661
    // Move fBufP pointer to the next line
 
1662
    while (fBufP < (int)fSize && fBuf[fBufP++] != '\0')
 
1663
        ;
 
1664
 
 
1665
    str = QString::fromLocal8Bit(ret).simplified();
 
1666
 
 
1667
    if (str.isNull()) {
 
1668
        return "";
 
1669
    } else {
 
1670
        return str;
 
1671
    }
 
1672
}
 
1673
 
 
1674
 
 
1675
 
 
1676
 
 
1677
// Get next line in the buffer:
 
1678
//   and overread ALL seperators
 
1679
//
 
1680
// return:  -Null-string: end of buffer
 
1681
//          -String which is the next line in buffer
 
1682
//
 
1683
char* RS_FilterDXF1::getBufLineCh() {
 
1684
    char *ret;
 
1685
 
 
1686
    if (fBufP >= (int)fSize)
 
1687
        return 0;
 
1688
 
 
1689
    ret = &fBuf[fBufP];
 
1690
 
 
1691
    // Skip empty lines
 
1692
    /*if (*ret == '\0' && noEmptyLines) {
 
1693
        while (++fBufP < (int)fSize && fBuf[fBufP] == '\0')
 
1694
            ;
 
1695
        if (fBufP >= (int)fSize)
 
1696
            return 0;
 
1697
        ret = &fBuf[fBufP];
 
1698
}*/
 
1699
 
 
1700
    // Move fBufP pointer to the next line
 
1701
    while (fBufP < (int)fSize && fBuf[fBufP++] != '\0')
 
1702
        ;
 
1703
 
 
1704
    return ret;
 
1705
}
 
1706
 
 
1707
 
 
1708
 
 
1709
// Copy buffer from a given string:
 
1710
//
 
1711
void RS_FilterDXF1::copyBufFrom(const char* _buf) {
 
1712
    if(_buf) {
 
1713
        fBuf = new char[strlen(_buf)+16];
 
1714
        strcpy(fBuf, _buf);
 
1715
    }
 
1716
}
 
1717
 
 
1718
 
 
1719
 
 
1720
// Go to the next '_lstr'-line in buffer:
 
1721
//
 
1722
// return: true:  line found
 
1723
//         false: end of buffer
 
1724
//
 
1725
bool RS_FilterDXF1::gotoBufLine(char* _lstr) {
 
1726
    QString l;
 
1727
    do {
 
1728
        l=getBufLine();
 
1729
    } while(!l.isNull() && l!=_lstr);
 
1730
 
 
1731
    if(!l.isNull())
 
1732
        return true;
 
1733
    return false;
 
1734
}
 
1735
 
 
1736
 
 
1737
 
 
1738
// Goto next line where the string _lstr appears:
 
1739
//
 
1740
// return: true:  string in line found
 
1741
//         false: end of buffer
 
1742
//
 
1743
//
 
1744
bool RS_FilterDXF1::gotoBufLineString(char* _lstr) {
 
1745
    QString l;
 
1746
    do {
 
1747
        l=getBufLine();
 
1748
    } while(!l.isNull() && l.contains(_lstr));
 
1749
 
 
1750
    if(!l.isNull())
 
1751
        return true;
 
1752
    return false;
 
1753
}
 
1754
 
 
1755
 
 
1756
 
 
1757
// Replace bynary Bytes (<32) by an other (given) byte:
 
1758
//
 
1759
void RS_FilterDXF1::replaceBinaryBytesBy(char _c) {
 
1760
    int bc;
 
1761
 
 
1762
    for(bc=0; bc<(int)fSize; ++bc) {
 
1763
        if(fBuf[bc]<32 && fBuf[bc]>=0) {
 
1764
            fBuf[bc] = _c;
 
1765
        }
 
1766
    }
 
1767
}
 
1768
 
 
1769
 
 
1770
 
 
1771
// Separate buffer (change chars sc1 and sc2 in '\0'
 
1772
//
 
1773
void RS_FilterDXF1::separateBuf(char _c1,
 
1774
                                char _c2,
 
1775
                                char _c3,
 
1776
                                char _c4) {
 
1777
    int bc;
 
1778
 
 
1779
    for(bc=0; bc<(int)fSize; ++bc) {
 
1780
        if(fBuf[bc]==_c1 || fBuf[bc]==_c2 ||
 
1781
                fBuf[bc]==_c3 || fBuf[bc]==_c4    ) {
 
1782
            fBuf[bc] = '\0';
 
1783
        }
 
1784
    }
 
1785
}
 
1786
 
 
1787
 
 
1788
 
 
1789
// remove comment between '_fc' and '_lc'
 
1790
//   comments get replaced by '\0'
 
1791
//
 
1792
void RS_FilterDXF1::removeComment(char _fc, char _lc) {
 
1793
    bool rem=false;   // Are we removing currrently?
 
1794
    int bc;           // counter
 
1795
 
 
1796
    for(bc=0; bc<(int)fSize; ++bc) {
 
1797
        if(fBuf[bc]==_fc)
 
1798
            rem=true;
 
1799
        if(fBuf[bc]==_lc) {
 
1800
            fBuf[bc]='\0';
 
1801
            rem=false;
 
1802
        }
 
1803
        if(rem)
 
1804
            fBuf[bc]='\0';
 
1805
    }
 
1806
}
 
1807
 
 
1808
 
 
1809
 
 
1810
// Read file '_name' in buffer (buf)
 
1811
//
 
1812
// '_bNum' : Max number of Bytes
 
1813
//         : -1: All
 
1814
// return: true: successful
 
1815
//         false: file not found
 
1816
//
 
1817
bool RS_FilterDXF1::readFileInBuffer(char* _name, int _bNum) {
 
1818
    file.setFileName(_name);
 
1819
    return readFileInBuffer(_bNum);
 
1820
}
 
1821
 
 
1822
 
 
1823
 
 
1824
// Read file in buffer (buf)
 
1825
//
 
1826
// 'bNum' : Max number of Bytes
 
1827
//        : -1: All
 
1828
// return: true: successful
 
1829
//         false: file not found
 
1830
//
 
1831
bool RS_FilterDXF1::readFileInBuffer(int _bNum) {
 
1832
    fPointer = fopen(name.toLatin1().data(), "rb");//RLZ verify with locales
 
1833
    if(fPointer!=NULL) {
 
1834
        if(file.open(fPointer, QIODevice::ReadOnly)) {
 
1835
            fSize=file.size();
 
1836
            if(_bNum==-1)
 
1837
                _bNum=fSize;
 
1838
 
 
1839
            fBuf = new char[_bNum+16];
 
1840
 
 
1841
            file.read(fBuf, _bNum);
 
1842
            fBuf[_bNum] = '\0';
 
1843
            file.close();
 
1844
        }
 
1845
        fclose(fPointer);
 
1846
 
 
1847
        // Convert 13/10 to 10
 
1848
        dos2unix();
 
1849
        fPointer=NULL;
 
1850
 
 
1851
        return true;
 
1852
    }
 
1853
    return false;
 
1854
}
 
1855
 
 
1856
 
 
1857
 
 
1858
// Decode a DXF string to the C-convention (special character \P is a \n)
 
1859
//
 
1860
void RS_FilterDXF1::strDecodeDxfString(QString& str) {
 
1861
    if (str.isEmpty())
 
1862
        return;
 
1863
    str.replace(QRegExp("%%c"), QChar(0xF8)); // Diameter
 
1864
    str.replace(QRegExp("%%d"), QChar(0xB0)); // Degree
 
1865
    str.replace(QRegExp("%%p"), QChar(0xB1)); // Plus/minus
 
1866
    str.replace(QRegExp("\\\\[pP]"), QChar('\n'));
 
1867
}
 
1868
 
 
1869
 
 
1870
 
 
1871
 
 
1872
// Compare two double values:
 
1873
//
 
1874
// return: true: values are equal
 
1875
//         false: values are not equal
 
1876
//
 
1877
bool RS_FilterDXF1::mtCompFloat(double _v1, double _v2, double _tol) {
 
1878
    double delta = _v2-_v1;
 
1879
 
 
1880
    if(delta>-_tol && delta<_tol)
 
1881
        return true;
 
1882
    else
 
1883
        return false;
 
1884
}
 
1885
 
 
1886
/**
 
1887
 * Converts a line width number (e.g. 1) into a RS2::LineWidth.
 
1888
 */
 
1889
RS2::LineWidth RS_FilterDXF1::numberToWidth(int num) {
 
1890
    switch (num) {
 
1891
    case -1:
 
1892
        return RS2::WidthByLayer;
 
1893
        break;
 
1894
    case -2:
 
1895
        return RS2::WidthByBlock;
 
1896
        break;
 
1897
    case -3:
 
1898
        return RS2::WidthDefault;
 
1899
        break;
 
1900
    default:
 
1901
        if (num<3) {
 
1902
            return RS2::Width00;
 
1903
        } else if (num<7) {
 
1904
            return RS2::Width01;
 
1905
        } else if (num<11) {
 
1906
            return RS2::Width02;
 
1907
        } else if (num<14) {
 
1908
            return RS2::Width03;
 
1909
        } else if (num<16) {
 
1910
            return RS2::Width04;
 
1911
        } else if (num<19) {
 
1912
            return RS2::Width05;
 
1913
        } else if (num<22) {
 
1914
            return RS2::Width06;
 
1915
        } else if (num<27) {
 
1916
            return RS2::Width07;
 
1917
        } else if (num<32) {
 
1918
            return RS2::Width08;
 
1919
        } else if (num<37) {
 
1920
            return RS2::Width09;
 
1921
        } else if (num<45) {
 
1922
            return RS2::Width10;
 
1923
        } else if (num<52) {
 
1924
            return RS2::Width11;
 
1925
        } else if (num<57) {
 
1926
            return RS2::Width12;
 
1927
        } else if (num<65) {
 
1928
            return RS2::Width13;
 
1929
        } else if (num<75) {
 
1930
            return RS2::Width14;
 
1931
        } else if (num<85) {
 
1932
            return RS2::Width15;
 
1933
        } else if (num<95) {
 
1934
            return RS2::Width16;
 
1935
        } else if (num<103) {
 
1936
            return RS2::Width17;
 
1937
        } else if (num<112) {
 
1938
            return RS2::Width18;
 
1939
        } else if (num<130) {
 
1940
            return RS2::Width19;
 
1941
        } else if (num<149) {
 
1942
            return RS2::Width20;
 
1943
        } else if (num<180) {
 
1944
            return RS2::Width21;
 
1945
        } else if (num<205) {
 
1946
            return RS2::Width22;
 
1947
        } else {
 
1948
            return RS2::Width23;
 
1949
        }
 
1950
        break;
 
1951
    }
 
1952
    return (RS2::LineWidth)num;
 
1953
}
 
1954
 
 
1955
 
 
1956
 
 
1957
/**
 
1958
 * Converts a RS2::LineWidth into an int width.
 
1959
 */
 
1960
int RS_FilterDXF1::widthToNumber(RS2::LineWidth width) {
 
1961
    switch (width) {
 
1962
    case RS2::WidthByLayer:
 
1963
        return -1;
 
1964
        break;
 
1965
    case RS2::WidthByBlock:
 
1966
        return -2;
 
1967
        break;
 
1968
    case RS2::WidthDefault:
 
1969
        return -3;
 
1970
        break;
 
1971
    default:
 
1972
        return (int)width;
 
1973
        break;
 
1974
    }
 
1975
    return (int)width;
 
1976
}
 
1977
 
 
1978
 
 
1979
// EOF
 
1980
 
 
1981
 
 
1982
 
 
1983
 
 
1984
 
 
1985
 
 
1986
 
 
1987
 
 
1988
 
 
1989
 
 
1990