1 // dlgoptionsdrawing.cpp
3 // Originally part of QCad Community Edition by Andrew Mustun
4 // Extensively rewritten and refactored by James L. Hammons
5 // (C) 2010 Underground Software
7 // JLH = James L. Hammons <jlhamm@acm.org>
10 // --- ---------- -----------------------------------------------------------
11 // JLH 05/18/2010 Added this text. :-)
14 #include "dlgoptionsdrawing.h"
18 #include "rs_filterdxf.h"
24 DlgOptionsDrawing::DlgOptionsDrawing(QWidget * parent/*= 0*/, Qt::WindowFlags flags/*= 0*/):
25 QDialog(parent, flags)
35 for(int i=0; i<=8; i++)
37 format.sprintf("%%.0%df", i);
38 s.sprintf(format.toAscii().data(), 0.0);
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));
47 // init units combobox:
49 unitList << tr("Scientific")
52 << tr("Architectural")
54 // ui.cbLengthFormat->insertStringList(unitList);
55 ui.cbLengthFormat->addItems(unitList);
57 // init angle units combobox:
58 QStringList aunitList;
59 aunitList << tr("Decimal Degrees")
63 << tr("Surveyor's units");
64 // ui.cbAngleFormat->insertStringList(aunitList);
65 ui.cbAngleFormat->addItems(aunitList);
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));
74 QStringList encodingList;
75 encodingList << "Latin1"
118 cbEncoding->insertStringList(encodingList);
122 DlgOptionsDrawing::~DlgOptionsDrawing()
127 * Sets the graphic and updates the GUI to match the drawing.
129 void DlgOptionsDrawing::setGraphic(Drawing * g)
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)));
142 // units / length format:
143 int lunits = graphic->getVariableInt("$LUNITS", 2);
144 // ui.cbLengthFormat->setCurrentItem(lunits - 1);
145 ui.cbLengthFormat->setCurrentIndex(lunits - 1);
147 // units length precision:
148 int luprec = graphic->getVariableInt("$LUPREC", 4);
149 updateLengthPrecision();
150 // ui.cbLengthPrecision->setCurrentItem(luprec);
151 ui.cbLengthPrecision->setCurrentIndex(luprec);
153 // units / angle format:
154 int aunits = graphic->getVariableInt("$AUNITS", 0);
155 // ui.cbAngleFormat->setCurrentItem(aunits);
156 ui.cbAngleFormat->setCurrentIndex(aunits);
158 // units angle precision:
159 int auprec = graphic->getVariableInt("$AUPREC", 2);
160 updateAnglePrecision();
161 // ui.cbAnglePrecision->setCurrentItem(auprec);
162 ui.cbAnglePrecision->setCurrentIndex(auprec);
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);
171 // paper orientation:
173 ui.rbLandscape->setChecked(true);
175 ui.rbPortrait->setChecked(true);
178 ui.cbGridOn->setChecked(graphic->isGridOn());
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));
186 if (ui.cbXSpacing->currentText() == "0")
187 // ui.cbXSpacing->setCurrentText(tr("auto"));
188 ui.cbXSpacing->setItemText(ui.cbXSpacing->currentIndex(), tr("auto"));
190 if (ui.cbYSpacing->currentText() == "0")
191 // ui.cbYSpacing->setCurrentText(tr("auto"));
192 ui.cbYSpacing->setItemText(ui.cbYSpacing->currentIndex(), tr("auto"));
194 // dimension text height:
195 RS2::Unit unit = (RS2::Unit)ui.cbUnit->currentIndex();
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));
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));
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));
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));
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));
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));
226 RS_DEBUG->print("DlgOptionsDrawing::setGraphic: splinesegs is: %d", splinesegs);
230 QString encoding = graphic->getVariableString("$DWGCODEPAGE",
232 encoding=RS_System::getEncoding(encoding);
233 cbEncoding->setCurrentText(encoding);
242 * Called when OK is clicked.
244 void DlgOptionsDrawing::validate()
246 RS2::LinearFormat f = (RS2::LinearFormat)ui.cbLengthFormat->currentIndex();
248 if (f == RS2::Engineering || f == RS2::Architectural)
250 if (RS_Units::stringToUnit(ui.cbUnit->currentText()) != RS2::Inch)
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);
261 graphic->setUnit((RS2::Unit)ui.cbUnit->currentIndex());
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);
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);
273 graphic->setPaperFormat((RS2::PaperFormat)ui.cbPaperFormat->currentIndex(),
274 ui.rbLandscape->isChecked());
276 // custom paper size:
277 if ((RS2::PaperFormat)ui.cbPaperFormat->currentIndex() == RS2::Custom)
279 graphic->setPaperSize(Vector(RS_Math::eval(ui.lePaperWidth->text()),
280 RS_Math::eval(ui.lePaperHeight->text())));
284 //graphic->addVariable("$GRIDMODE", (int)cbGridOn->isChecked() , 70);
285 graphic->setGridOn(ui.cbGridOn->isChecked());
286 Vector spacing(0.0, 0.0, 0.0);
288 if (ui.cbXSpacing->currentText() == tr("auto"))
292 spacing.x = ui.cbXSpacing->currentText().toDouble();
295 if (ui.cbYSpacing->currentText() == tr("auto"))
299 spacing.y = ui.cbYSpacing->currentText().toDouble();
302 graphic->addVariable("$GRIDUNIT", spacing, 10);
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);
312 graphic->addVariable("$SPLINESEGS", (int)RS_Math::eval(ui.cbSplineSegs->currentText()), 70);
314 RS_DEBUG->print("DlgOptionsDrawing::validate: splinesegs is: %s",
315 ui.cbSplineSegs->currentText().toLatin1().data());
317 // update all dimension and spline entities in the graphic to match the new settings:
318 graphic->updateDimensions();
319 graphic->updateSplines();
321 graphic->setModified(true);
328 * Updates the length precision combobox
330 void DlgOptionsDrawing::updateLengthPrecision()
332 int index = ui.cbLengthPrecision->currentIndex();
333 ui.cbLengthPrecision->clear();
335 switch (ui.cbLengthFormat->currentIndex())
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");
351 // (0, 0.1, 0.01, ...)
353 ui.cbLengthPrecision->addItems(listPrec1);
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\"");
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\"");
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");
394 RS_DEBUG->print(RS_Debug::D_ERROR,
395 "DlgOptionsDrawing::updateLengthPrecision: error");
399 // ui.cbLengthPrecision->setCurrentItem(index);
400 ui.cbLengthPrecision->setCurrentIndex(index);
404 * Updates the angle precision combobox
406 void DlgOptionsDrawing::updateAnglePrecision()
408 int index = ui.cbAnglePrecision->currentIndex();
409 ui.cbAnglePrecision->clear();
411 switch (ui.cbAngleFormat->currentIndex())
415 ui.cbAnglePrecision->addItems(listPrec1);
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)));
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");
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");
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");
470 ui.cbAnglePrecision->setCurrentIndex(index);
474 * Updates the preview of unit display.
476 void DlgOptionsDrawing::updatePreview()
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);
485 prev = RS_Units::formatAngle(0.5327714,
486 (RS2::AngleFormat)ui.cbAngleFormat->currentIndex(),
487 ui.cbAnglePrecision->currentIndex());
488 ui.lAngular->setText(prev);
492 * Updates the paper size. Called for initialisation as well as when the
493 * paper format changes.
495 void DlgOptionsDrawing::updatePaperSize()
497 RS2::PaperFormat format = (RS2::PaperFormat)ui.cbPaperFormat->currentIndex();
499 if (format == RS2::Custom)
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));
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));
514 if (ui.cbPaperFormat->currentIndex() == 0)
516 ui.lePaperWidth->setEnabled(true);
517 ui.lePaperHeight->setEnabled(true);
521 ui.lePaperWidth->setEnabled(false);
522 ui.lePaperHeight->setEnabled(false);
527 * Updates all unit labels that depend on the global unit.
529 void DlgOptionsDrawing::updateUnitLabels()
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);