]> Shamusworld >> Repos - architektonas/blob - src/forms/dlgoptionsdrawing.cpp
Initial import
[architektonas] / src / forms / dlgoptionsdrawing.cpp
1 // dlgoptionsdrawing.cpp
2 //
3 // Originally part of QCad Community Edition by Andrew Mustun
4 // Extensively rewritten and refactored by James L. Hammons
5 // (C) 2010 Underground Software
6 //
7 // JLH = James L. Hammons <jlhamm@acm.org>
8 //
9 // Who  When        What
10 // ---  ----------  -----------------------------------------------------------
11 // JLH  05/18/2010  Added this text. :-)
12 //
13
14 #include "dlgoptionsdrawing.h"
15
16 #include "rs.h"
17 #include "rs_debug.h"
18 #include "rs_filterdxf.h"
19 #include "rs_graphic.h"
20 #include "rs_math.h"
21 #include "rs_units.h"
22 #include "vector.h"
23
24 DlgOptionsDrawing::DlgOptionsDrawing(QWidget * parent/*= 0*/, Qt::WindowFlags flags/*= 0*/):
25         QDialog(parent, flags)
26 {
27         ui.setupUi(this);
28
29         graphic = NULL;
30
31         // precision list:
32         QString s;
33         QString format;
34
35         for(int i=0; i<=8; i++)
36         {
37                 format.sprintf("%%.0%df", i);
38                 s.sprintf(format.toAscii().data(), 0.0);
39                 listPrec1 << s;
40         }
41
42         // Main drawing unit:
43         for(int i=RS2::None; i<RS2::LastUnit; i++)
44 //              ui.cbUnit->insertItem(RS_Units::unitToString((RS2::Unit)i));
45                 ui.cbUnit->addItem(RS_Units::unitToString((RS2::Unit)i));
46
47         // init units combobox:
48         QStringList unitList;
49         unitList << tr("Scientific")
50                 << tr("Decimal")
51                 << tr("Engineering")
52                 << tr("Architectural")
53                 << tr("Fractional");
54 //      ui.cbLengthFormat->insertStringList(unitList);
55         ui.cbLengthFormat->addItems(unitList);
56
57         // init angle units combobox:
58         QStringList aunitList;
59         aunitList << tr("Decimal Degrees")
60                 << tr("Deg/min/sec")
61                 << tr("Gradians")
62                 << tr("Radians")
63                 << tr("Surveyor's units");
64 //      ui.cbAngleFormat->insertStringList(aunitList);
65         ui.cbAngleFormat->addItems(aunitList);
66
67         // Paper format:
68         for(int i=RS2::Custom; i<=RS2::NPageSize; i++)
69 //              ui.cbPaperFormat->insertItem(RS_Units::paperFormatToString((RS2::PaperFormat)i));
70                 ui.cbPaperFormat->addItem(RS_Units::paperFormatToString((RS2::PaperFormat)i));
71
72         // Encodings:
73         /*
74         QStringList encodingList;
75         encodingList << "Latin1"
76         << "Big5"
77         << "Big5-HKSCS"
78         << "eucJP"
79         << "eucKR"
80         << "GB2312"
81         << "GBK"
82         << "GB18030"
83         << "JIS7"
84         << "Shift-JIS"
85         << "TSCII"
86         << "utf88-bit "
87         << "utf16"
88         << "KOI8-R"
89         << "KOI8-U"
90         << "ISO8859-1"
91         << "ISO8859-2"
92         << "ISO8859-3"
93         << "ISO8859-4"
94         << "ISO8859-5"
95         << "ISO8859-6"
96         << "ISO8859-7"
97         << "ISO8859-8"
98         << "ISO8859-8-i"
99         << "ISO8859-9"
100         << "ISO8859-10 "
101         << "ISO8859-13 "
102         << "ISO8859-14 "
103         << "ISO8859-15"
104         << "IBM 850 "
105         << "IBM 866 "
106         << "CP874 "
107         << "CP1250"
108         << "CP1251"
109         << "CP1252"
110         << "CP1253"
111         << "CP1254"
112         << "CP1255"
113         << "CP1256"
114         << "CP1257"
115         << "CP1258 "
116         << "Apple Roman "
117         << "TIS-620";
118         cbEncoding->insertStringList(encodingList);
119         */
120 }
121
122 DlgOptionsDrawing::~DlgOptionsDrawing()
123 {
124 }
125
126 /**
127 * Sets the graphic and updates the GUI to match the drawing.
128 */
129 void DlgOptionsDrawing::setGraphic(RS_Graphic * g)
130 {
131         graphic = g;
132
133         if (graphic == NULL)
134                 return;
135
136         // main drawing unit:
137         int insunits = graphic->getVariableInt("$INSUNITS", 0);
138 //      ui.cbUnit->setCurrentText(RS_Units::unitToString(RS_FilterDXF::numberToUnit(insunits)));
139         ui.cbUnit->setItemText(ui.cbUnit->currentIndex(),
140                 RS_Units::unitToString(RS_FilterDXF::numberToUnit(insunits)));
141
142         // units / length format:
143         int lunits = graphic->getVariableInt("$LUNITS", 2);
144 //      ui.cbLengthFormat->setCurrentItem(lunits - 1);
145         ui.cbLengthFormat->setCurrentIndex(lunits - 1);
146
147         // units length precision:
148         int luprec = graphic->getVariableInt("$LUPREC", 4);
149         updateLengthPrecision();
150 //      ui.cbLengthPrecision->setCurrentItem(luprec);
151         ui.cbLengthPrecision->setCurrentIndex(luprec);
152
153         // units / angle format:
154         int aunits = graphic->getVariableInt("$AUNITS", 0);
155 //      ui.cbAngleFormat->setCurrentItem(aunits);
156         ui.cbAngleFormat->setCurrentIndex(aunits);
157
158         // units angle precision:
159         int auprec = graphic->getVariableInt("$AUPREC", 2);
160         updateAnglePrecision();
161 //      ui.cbAnglePrecision->setCurrentItem(auprec);
162         ui.cbAnglePrecision->setCurrentIndex(auprec);
163
164         // paper format:
165         bool landscape;
166         RS2::PaperFormat format = graphic->getPaperFormat(&landscape);
167         RS_DEBUG->print("DlgOptionsDrawing::setGraphic: paper format is: %d", (int)format);
168 //      ui.cbPaperFormat->setCurrentItem((int)format);
169         ui.cbPaperFormat->setCurrentIndex((int)format);
170
171         // paper orientation:
172         if (landscape)
173                 ui.rbLandscape->setChecked(true);
174         else
175                 ui.rbPortrait->setChecked(true);
176
177         // Grid:
178         ui.cbGridOn->setChecked(graphic->isGridOn());
179
180         Vector spacing = graphic->getVariableVector("$GRIDUNIT", Vector(0.0, 0.0));
181 //      ui.cbXSpacing->setCurrentText(QString("%1").arg(spacing.x));
182 //      ui.cbYSpacing->setCurrentText(QString("%1").arg(spacing.y));
183         ui.cbXSpacing->setItemText(ui.cbXSpacing->currentIndex(), QString("%1").arg(spacing.x));
184         ui.cbYSpacing->setItemText(ui.cbYSpacing->currentIndex(), QString("%1").arg(spacing.y));
185
186         if (ui.cbXSpacing->currentText() == "0")
187 //              ui.cbXSpacing->setCurrentText(tr("auto"));
188                 ui.cbXSpacing->setItemText(ui.cbXSpacing->currentIndex(), tr("auto"));
189
190         if (ui.cbYSpacing->currentText() == "0")
191 //              ui.cbYSpacing->setCurrentText(tr("auto"));
192                 ui.cbYSpacing->setItemText(ui.cbYSpacing->currentIndex(), tr("auto"));
193
194         // dimension text height:
195         RS2::Unit unit = (RS2::Unit)ui.cbUnit->currentIndex();
196
197         double dimtxt = graphic->getVariableDouble("$DIMTXT", RS_Units::convert(2.5, RS2::Millimeter, unit));
198 //      ui.cbDimTextHeight->setCurrentText(QString("%1").arg(dimtxt));
199         ui.cbDimTextHeight->setItemText(ui.cbDimTextHeight->currentIndex(), QString("%1").arg(dimtxt));
200
201         // dimension extension line extension:
202         double dimexe = graphic->getVariableDouble("$DIMEXE", RS_Units::convert(1.25, RS2::Millimeter, unit));
203 //      ui.cbDimExe->setCurrentText(QString("%1").arg(dimexe));
204         ui.cbDimExe->setItemText(ui.cbDimExe->currentIndex(), QString("%1").arg(dimexe));
205
206         // dimension extension line offset:
207         double dimexo = graphic->getVariableDouble("$DIMEXO", RS_Units::convert(0.625, RS2::Millimeter, unit));
208 //      ui.cbDimExo->setCurrentText(QString("%1").arg(dimexo));
209         ui.cbDimExo->setItemText(ui.cbDimExo->currentIndex(), QString("%1").arg(dimexo));
210
211         // dimension line gap:
212         double dimgap = graphic->getVariableDouble("$DIMGAP", RS_Units::convert(0.625, RS2::Millimeter, unit));
213 //      ui.cbDimGap->setCurrentText(QString("%1").arg(dimgap));
214         ui.cbDimGap->setItemText(ui.cbDimGap->currentIndex(), QString("%1").arg(dimgap));
215
216         // dimension arrow size:
217         double dimasz = graphic->getVariableDouble("$DIMASZ", RS_Units::convert(2.5, RS2::Millimeter, unit));
218 //      ui.cbDimAsz->setCurrentText(QString("%1").arg(dimasz));
219         ui.cbDimAsz->setItemText(ui.cbDimAsz->currentIndex(), QString("%1").arg(dimasz));
220
221         // spline line segments per patch:
222         int splinesegs = graphic->getVariableInt("$SPLINESEGS", 8);
223 //      ui.cbSplineSegs->setCurrentText(QString("%1").arg(splinesegs));
224         ui.cbSplineSegs->setItemText(ui.cbSplineSegs->currentIndex(), QString("%1").arg(splinesegs));
225
226         RS_DEBUG->print("DlgOptionsDrawing::setGraphic: splinesegs is: %d", splinesegs);
227
228         // encoding:
229         /*
230         QString encoding = graphic->getVariableString("$DWGCODEPAGE",
231                                                                                                 "ANSI_1252");
232         encoding=RS_System::getEncoding(encoding);
233         cbEncoding->setCurrentText(encoding);
234         */
235
236         updatePaperSize();
237         updatePreview();
238         updateUnitLabels();
239 }
240
241 /**
242 * Called when OK is clicked.
243 */
244 void DlgOptionsDrawing::validate()
245 {
246         RS2::LinearFormat f = (RS2::LinearFormat)ui.cbLengthFormat->currentIndex();
247
248         if (f == RS2::Engineering || f == RS2::Architectural)
249         {
250                 if (RS_Units::stringToUnit(ui.cbUnit->currentText()) != RS2::Inch)
251                 {
252                         QMessageBox::warning( this, tr("Options"),
253                                 tr("For the length formats 'Engineering' and 'Architectural', the unit must be set to Inch."), QMessageBox::Ok, Qt::NoButton);
254                         return;
255                 }
256         }
257
258         if (graphic != NULL)
259         {
260                 // units:
261                 graphic->setUnit((RS2::Unit)ui.cbUnit->currentIndex());
262
263                 graphic->addVariable("$LUNITS", ui.cbLengthFormat->currentIndex() + 1, 70);
264                 graphic->addVariable("$DIMLUNIT", ui.cbLengthFormat->currentIndex() + 1, 70);
265                 graphic->addVariable("$LUPREC", ui.cbLengthPrecision->currentIndex(), 70);
266
267                 graphic->addVariable("$AUNITS", ui.cbAngleFormat->currentIndex(), 70);
268                 graphic->addVariable("$DIMAUNIT", ui.cbAngleFormat->currentIndex(), 70);
269                 graphic->addVariable("$AUPREC", ui.cbAnglePrecision->currentIndex(), 70);
270                 graphic->addVariable("$DIMADEC", ui.cbAnglePrecision->currentIndex(), 70);
271
272                 // paper:
273                 graphic->setPaperFormat((RS2::PaperFormat)ui.cbPaperFormat->currentIndex(),
274                         ui.rbLandscape->isChecked());
275
276                 // custom paper size:
277                 if ((RS2::PaperFormat)ui.cbPaperFormat->currentIndex() == RS2::Custom)
278                 {
279                         graphic->setPaperSize(Vector(RS_Math::eval(ui.lePaperWidth->text()),
280                                 RS_Math::eval(ui.lePaperHeight->text())));
281                 }
282
283                 // grid:
284                 //graphic->addVariable("$GRIDMODE", (int)cbGridOn->isChecked() , 70);
285                 graphic->setGridOn(ui.cbGridOn->isChecked());
286                 Vector spacing(0.0, 0.0, 0.0);
287
288                 if (ui.cbXSpacing->currentText() == tr("auto"))
289                         spacing.x = 0.0;
290                 else
291                 {
292                         spacing.x = ui.cbXSpacing->currentText().toDouble();
293                 }
294
295                 if (ui.cbYSpacing->currentText() == tr("auto"))
296                         spacing.y = 0.0;
297                 else
298                 {
299                         spacing.y = ui.cbYSpacing->currentText().toDouble();
300                 }
301
302                 graphic->addVariable("$GRIDUNIT", spacing, 10);
303
304                 // dim:
305                 graphic->addVariable("$DIMTXT", RS_Math::eval(ui.cbDimTextHeight->currentText()), 40);
306                 graphic->addVariable("$DIMEXE", RS_Math::eval(ui.cbDimExe->currentText()), 40);
307                 graphic->addVariable("$DIMEXO", RS_Math::eval(ui.cbDimExo->currentText()), 40);
308                 graphic->addVariable("$DIMGAP", RS_Math::eval(ui.cbDimGap->currentText()), 40);
309                 graphic->addVariable("$DIMASZ", RS_Math::eval(ui.cbDimAsz->currentText()), 40);
310
311                 // splines:
312                 graphic->addVariable("$SPLINESEGS", (int)RS_Math::eval(ui.cbSplineSegs->currentText()), 70);
313
314                 RS_DEBUG->print("DlgOptionsDrawing::validate: splinesegs is: %s",
315                         ui.cbSplineSegs->currentText().toLatin1().data());
316
317                 // update all dimension and spline entities in the graphic to match the new settings:
318                 graphic->updateDimensions();
319                 graphic->updateSplines();
320
321                 graphic->setModified(true);
322         }
323
324         accept();
325 }
326
327 /**
328 * Updates the length precision combobox
329 */
330 void DlgOptionsDrawing::updateLengthPrecision()
331 {
332         int index = ui.cbLengthPrecision->currentIndex();
333         ui.cbLengthPrecision->clear();
334
335         switch (ui.cbLengthFormat->currentIndex())
336         {
337                 // scientific
338         case 0:
339                 ui.cbLengthPrecision->addItem("0E+01");
340                 ui.cbLengthPrecision->addItem("0.0E+01");
341                 ui.cbLengthPrecision->addItem("0.00E+01");
342                 ui.cbLengthPrecision->addItem("0.000E+01");
343                 ui.cbLengthPrecision->addItem("0.0000E+01");
344                 ui.cbLengthPrecision->addItem("0.00000E+01");
345                 ui.cbLengthPrecision->addItem("0.000000E+01");
346                 ui.cbLengthPrecision->addItem("0.0000000E+01");
347                 ui.cbLengthPrecision->addItem("0.00000000E+01");
348                 break;
349
350                 // decimal
351                 //   (0, 0.1, 0.01, ...)
352         case 1:
353                 ui.cbLengthPrecision->addItems(listPrec1);
354                 break;
355
356                 // architectural:
357         case 3:
358                 ui.cbLengthPrecision->addItem("0'-0\"");
359                 ui.cbLengthPrecision->addItem("0'-0 1/2\"");
360                 ui.cbLengthPrecision->addItem("0'-0 1/4\"");
361                 ui.cbLengthPrecision->addItem("0'-0 1/8\"");
362                 ui.cbLengthPrecision->addItem("0'-0 1/16\"");
363                 ui.cbLengthPrecision->addItem("0'-0 1/32\"");
364                 ui.cbLengthPrecision->addItem("0'-0 1/64\"");
365                 ui.cbLengthPrecision->addItem("0'-0 1/128\"");
366                 break;
367
368                 // engineering:
369         case 2:
370                 ui.cbLengthPrecision->addItem("0'-0\"");
371                 ui.cbLengthPrecision->addItem("0'-0.0\"");
372                 ui.cbLengthPrecision->addItem("0'-0.00\"");
373                 ui.cbLengthPrecision->addItem("0'-0.000\"");
374                 ui.cbLengthPrecision->addItem("0'-0.0000\"");
375                 ui.cbLengthPrecision->addItem("0'-0.00000\"");
376                 ui.cbLengthPrecision->addItem("0'-0.000000\"");
377                 ui.cbLengthPrecision->addItem("0'-0.0000000\"");
378                 ui.cbLengthPrecision->addItem("0'-0.00000000\"");
379                 break;
380
381                 // fractional
382         case 4:
383                 ui.cbLengthPrecision->addItem("0");
384                 ui.cbLengthPrecision->addItem("0 1/2");
385                 ui.cbLengthPrecision->addItem("0 1/4");
386                 ui.cbLengthPrecision->addItem("0 1/8");
387                 ui.cbLengthPrecision->addItem("0 1/16");
388                 ui.cbLengthPrecision->addItem("0 1/32");
389                 ui.cbLengthPrecision->addItem("0 1/64");
390                 ui.cbLengthPrecision->addItem("0 1/128");
391                 break;
392
393         default:
394                 RS_DEBUG->print(RS_Debug::D_ERROR,
395                         "DlgOptionsDrawing::updateLengthPrecision: error");
396                 break;
397         }
398
399 //      ui.cbLengthPrecision->setCurrentItem(index);
400         ui.cbLengthPrecision->setCurrentIndex(index);
401 }
402
403 /**
404 * Updates the angle precision combobox
405 */
406 void DlgOptionsDrawing::updateAnglePrecision()
407 {
408         int index = ui.cbAnglePrecision->currentIndex();
409         ui.cbAnglePrecision->clear();
410
411         switch (ui.cbAngleFormat->currentIndex())
412         {
413                 // decimal degrees:
414         case 0:
415                 ui.cbAnglePrecision->addItems(listPrec1);
416                 break;
417
418                 // deg/min/sec:
419         case 1:
420                 ui.cbAnglePrecision->addItem(QString("0%1").arg(QChar(0xB0)));
421                 ui.cbAnglePrecision->addItem(QString("0%100'").arg(QChar(0xB0)));
422                 ui.cbAnglePrecision->addItem(QString("0%100'00\"").arg(QChar(0xB0)));
423                 ui.cbAnglePrecision->addItem(QString("0%100'00.0\"").arg(QChar(0xB0)));
424                 ui.cbAnglePrecision->addItem(QString("0%100'00.00\"").arg(QChar(0xB0)));
425                 ui.cbAnglePrecision->addItem(QString("0%100'00.000\"").arg(QChar(0xB0)));
426                 ui.cbAnglePrecision->addItem(QString("0%100'00.0000\"").arg(QChar(0xB0)));
427                 break;
428
429                 // gradians:
430         case 2:
431                 ui.cbAnglePrecision->addItem("0g");
432                 ui.cbAnglePrecision->addItem("0.0g");
433                 ui.cbAnglePrecision->addItem("0.00g");
434                 ui.cbAnglePrecision->addItem("0.000g");
435                 ui.cbAnglePrecision->addItem("0.0000g");
436                 ui.cbAnglePrecision->addItem("0.00000g");
437                 ui.cbAnglePrecision->addItem("0.000000g");
438                 ui.cbAnglePrecision->addItem("0.0000000g");
439                 ui.cbAnglePrecision->addItem("0.00000000g");
440                 break;
441
442                 // radians:
443         case 3:
444                 ui.cbAnglePrecision->addItem("0r");
445                 ui.cbAnglePrecision->addItem("0.0r");
446                 ui.cbAnglePrecision->addItem("0.00r");
447                 ui.cbAnglePrecision->addItem("0.000r");
448                 ui.cbAnglePrecision->addItem("0.0000r");
449                 ui.cbAnglePrecision->addItem("0.00000r");
450                 ui.cbAnglePrecision->addItem("0.000000r");
451                 ui.cbAnglePrecision->addItem("0.0000000r");
452                 ui.cbAnglePrecision->addItem("0.00000000r");
453                 break;
454
455                 // surveyor's units:
456         case 4:
457                 ui.cbAnglePrecision->addItem("N 0d E");
458                 ui.cbAnglePrecision->addItem("N 0d00' E");
459                 ui.cbAnglePrecision->addItem("N 0d00'00\" E");
460                 ui.cbAnglePrecision->addItem("N 0d00'00.0\" E");
461                 ui.cbAnglePrecision->addItem("N 0d00'00.00\" E");
462                 ui.cbAnglePrecision->addItem("N 0d00'00.000\" E");
463                 ui.cbAnglePrecision->addItem("N 0d00'00.0000\" E");
464                 break;
465
466         default:
467                 break;
468         }
469
470         ui.cbAnglePrecision->setCurrentIndex(index);
471 }
472
473 /**
474 * Updates the preview of unit display.
475 */
476 void DlgOptionsDrawing::updatePreview()
477 {
478         QString prev;
479         prev = RS_Units::formatLinear(14.43112351,
480                 (RS2::Unit)ui.cbUnit->currentIndex(),
481                 (RS2::LinearFormat)(ui.cbLengthFormat->currentIndex()),
482                 ui.cbLengthPrecision->currentIndex());
483         ui.lLinear->setText(prev);
484
485         prev = RS_Units::formatAngle(0.5327714,
486                 (RS2::AngleFormat)ui.cbAngleFormat->currentIndex(),
487                 ui.cbAnglePrecision->currentIndex());
488         ui.lAngular->setText(prev);
489 }
490
491 /**
492 * Updates the paper size. Called for initialisation as well as when the
493 * paper format changes.
494 */
495 void DlgOptionsDrawing::updatePaperSize()
496 {
497         RS2::PaperFormat format = (RS2::PaperFormat)ui.cbPaperFormat->currentIndex();
498
499         if (format == RS2::Custom)
500         {
501                 Vector s = graphic->getPaperSize();
502                 //Vector plimmin = graphic->getVariableVector("$PLIMMIN", Vector(0,0));
503                 //Vector plimmax = graphic->getVariableVector("$PLIMMAX", Vector(100,100));
504                 ui.lePaperWidth->setText(QString("%1").arg(s.x));
505                 ui.lePaperHeight->setText(QString("%1").arg(s.y));
506         }
507         else
508         {
509                 Vector s = RS_Units::paperFormatToSize(format);
510                 ui.lePaperWidth->setText(QString("%1").arg(s.x));
511                 ui.lePaperHeight->setText(QString("%1").arg(s.y));
512         }
513
514         if (ui.cbPaperFormat->currentIndex() == 0)
515         {
516                 ui.lePaperWidth->setEnabled(true);
517                 ui.lePaperHeight->setEnabled(true);
518         }
519         else
520         {
521                 ui.lePaperWidth->setEnabled(false);
522                 ui.lePaperHeight->setEnabled(false);
523         }
524 }
525
526 /**
527 * Updates all unit labels that depend on the global unit.
528 */
529 void DlgOptionsDrawing::updateUnitLabels()
530 {
531         RS2::Unit u = (RS2::Unit)ui.cbUnit->currentIndex();
532         QString sign = RS_Units::unitToSign(u);
533         ui.lDimUnit1->setText(sign);
534         ui.lDimUnit2->setText(sign);
535         ui.lDimUnit3->setText(sign);
536         ui.lDimUnit4->setText(sign);
537         ui.lDimUnit5->setText(sign);
538 }