+++ /dev/null
-// units.cpp
-//
-// Part of the Architektonas Project
-// Originally part of QCad Community Edition by Andrew Mustun
-// Extensively rewritten and refactored by James L. Hammons
-// Portions copyright (C) 2001-2003 RibbonSoft
-// Copyright (C) 2010 Underground Software
-// See the README and GPLv2 files for licensing and warranty information
-//
-// JLH = James L. Hammons <jlhamm@acm.org>
-//
-// Who When What
-// --- ---------- -----------------------------------------------------------
-// JLH 05/05/2010 Moved implementation from header to this file. :-)
-//
-
-#include "units.h"
-
-#include <stdio.h>
-#include "mathextra.h"
-#include "debug.h"
-
-/**
- * Converts a DXF integer () to a Unit enum.
- */
-RS2::Unit Units::dxfint2unit(int dxfint)
-{
- return (RS2::Unit)dxfint;
-
- /*switch(dxfint) {
- default:
- case 0:
- return RS2::None;
- case 1:
- return RS2::Inch;
- case 2:
- return RS2::Foot;
- case 3:
- return RS2::Mile;
- case 4:
- return RS2::Millimeter;
- case 5:
- return RS2::Centimeter;
- case 6:
- return RS2::Meter;
- case 7:
- return RS2::Kilometer;
- case 8:
- return RS2::Microinch;
- case 9:
- return RS2::Mil;
- case 10:
- return RS2::Yard;
- case 11:
- return RS2::Angstrom;
- case 12:
- return RS2::Nanometer;
- case 13:
- return RS2::Micron;
- case 14:
- return RS2::Decimeter;
- case 15:
- return RS2::Decameter;
- case 16:
- return RS2::Hectometer;
- case 17:
- return RS2::Gigameter;
- case 18:
- return RS2::Astro;
- case 19:
- return RS2::Lightyear;
- case 20:
- return RS2::Parsec;
-}*/
-}
-
-/**
- * @return a short string representing the given unit (e.g. "mm")
- */
-QString Units::unitToSign(RS2::Unit u)
-{
- QString ret = "";
-
- switch (u)
- {
- case RS2::None:
- ret = "";
- break;
- case RS2::Inch:
- ret = "\"";
- break;
- case RS2::Foot:
- ret = "'";
- break;
- case RS2::Mile:
- ret = "mi";
- break;
- case RS2::Millimeter:
- ret = "mm";
- break;
- case RS2::Centimeter:
- ret = "cm";
- break;
- case RS2::Meter:
- ret = "m";
- break;
- case RS2::Kilometer:
- ret = "km";
- break;
- case RS2::Microinch:
- ret = "�\"";
- break;
- case RS2::Mil:
- ret = "mil";
- break;
- case RS2::Yard:
- ret = "yd";
- break;
- case RS2::Angstrom:
- ret = "A";
- break;
- case RS2::Nanometer:
- ret = "nm";
- break;
- case RS2::Micron:
- ret = "�m";
- break;
- case RS2::Decimeter:
- ret = "dm";
- break;
- case RS2::Decameter:
- ret = "dam";
- break;
- case RS2::Hectometer:
- ret = "hm";
- break;
- case RS2::Gigameter:
- ret = "Gm";
- break;
- case RS2::Astro:
- ret = "astro";
- break;
- case RS2::Lightyear:
- ret = "ly";
- break;
- case RS2::Parsec:
- ret = "pc";
- break;
-
- default:
- ret = "";
- break;
- }
-
- return ret;
-}
-
-/**
- * @return a string representing the given unit (e.g. "Millimeter").
- * translated if @a t is true (the default).
- */
-QString Units::unitToString(RS2::Unit u, bool t)
-{
- QString ret = "";
-
- switch (u)
- {
- case RS2::None:
- ret = t ? QObject::tr("None") : QString("None");
- break;
- case RS2::Inch:
- ret = t ? QObject::tr("Inch") : QString("Inch");
- break;
- case RS2::Foot:
- ret = t ? QObject::tr("Foot") : QString("Foot");
- break;
- case RS2::Mile:
- ret = t ? QObject::tr("Mile") : QString("Mile");
- break;
- case RS2::Millimeter:
- ret = t ? QObject::tr("Millimeter") : QString("Millimeter");
- break;
- case RS2::Centimeter:
- ret = t ? QObject::tr("Centimeter") : QString("Centimeter");
- break;
- case RS2::Meter:
- ret = t ? QObject::tr("Meter") : QString("Meter");
- break;
- case RS2::Kilometer:
- ret = t ? QObject::tr("Kilometer") : QString("Kilometer");
- break;
- case RS2::Microinch:
- ret = t ? QObject::tr("Microinch") : QString("Microinch");
- break;
- case RS2::Mil:
- ret = t ? QObject::tr("Mil") : QString("Mil");
- break;
- case RS2::Yard:
- ret = t ? QObject::tr("Yard") : QString("Yard");
- break;
- case RS2::Angstrom:
- ret = t ? QObject::tr("Angstrom") : QString("Angstrom");
- break;
- case RS2::Nanometer:
- ret = t ? QObject::tr("Nanometer") : QString("Nanometer");
- break;
- case RS2::Micron:
- ret = t ? QObject::tr("Micron") : QString("Micron");
- break;
- case RS2::Decimeter:
- ret = t ? QObject::tr("Decimeter") : QString("Decimeter");
- break;
- case RS2::Decameter:
- ret = t ? QObject::tr("Decameter") : QString("Decameter");
- break;
- case RS2::Hectometer:
- ret = t ? QObject::tr("Hectometer") : QString("Hectometer");
- break;
- case RS2::Gigameter:
- ret = t ? QObject::tr("Gigameter") : QString("Gigameter");
- break;
- case RS2::Astro:
- ret = t ? QObject::tr("Astro") : QString("Astro");
- break;
- case RS2::Lightyear:
- ret = t ? QObject::tr("Lightyear") : QString("Lightyear");
- break;
- case RS2::Parsec:
- ret = t ? QObject::tr("Parsec") : QString("Parsec");
- break;
-
- default:
- ret = "";
- break;
- }
-
- return ret;
-}
-
-/**
- * Converts a string into a unit enum.
- */
-RS2::Unit Units::stringToUnit(const QString & u)
-{
- RS2::Unit ret = RS2::None;
-
- if (u == "None")
- ret = RS2::None;
- else if (u == QObject::tr("Inch"))
- ret = RS2::Inch;
- else if (u == QObject::tr("Foot"))
- ret = RS2::Foot;
- else if (u == QObject::tr("Mile"))
- ret = RS2::Mile;
- else if (u == QObject::tr("Millimeter"))
- ret = RS2::Millimeter;
- else if (u == QObject::tr("Centimeter"))
- ret = RS2::Centimeter;
- else if (u == QObject::tr("Meter"))
- ret = RS2::Meter;
- else if (u == QObject::tr("Kilometer"))
- ret = RS2::Kilometer;
- else if (u == QObject::tr("Microinch"))
- ret = RS2::Microinch;
- else if (u == QObject::tr("Mil"))
- ret = RS2::Mil;
- else if (u == QObject::tr("Yard"))
- ret = RS2::Yard;
- else if (u == QObject::tr("Angstrom"))
- ret = RS2::Angstrom;
- else if (u == QObject::tr("Nanometer"))
- ret = RS2::Nanometer;
- else if (u == QObject::tr("Micron"))
- ret = RS2::Micron;
- else if (u == QObject::tr("Decimeter"))
- ret = RS2::Decimeter;
- else if (u == QObject::tr("Decameter"))
- ret = RS2::Decameter;
- else if (u == QObject::tr("Hectometer"))
- ret = RS2::Hectometer;
- else if (u == QObject::tr("Gigameter"))
- ret = RS2::Gigameter;
- else if (u == QObject::tr("Astro"))
- ret = RS2::Astro;
- else if (u == QObject::tr("Lightyear"))
- ret = RS2::Lightyear;
- else if (u == QObject::tr("Parsec"))
- ret = RS2::Parsec;
-
- return ret;
-}
-
-/**
- * @return true: the unit is metric, false: the unit is imperial.
- */
-bool Units::isMetric(RS2::Unit u)
-{
- if (u == RS2::Millimeter || u == RS2::Centimeter || u == RS2::Meter
- || u == RS2::Kilometer || u == RS2::Angstrom || u == RS2::Nanometer
- || u == RS2::Micron || u == RS2::Decimeter || u == RS2::Decameter
- || u == RS2::Hectometer || u == RS2::Gigameter || u == RS2::Astro
- || u == RS2::Lightyear || u == RS2::Parsec)
- return true;
-
- return false;
-}
-
-/**
- * @return factor to convert the given unit to Millimeters.
- */
-double Units::getFactorToMM(RS2::Unit u)
-{
- double ret = 1.0;
-
- switch (u)
- {
- case RS2::None:
- ret = 1.0;
- break;
- case RS2::Inch:
- ret = 25.4;
- break;
- case RS2::Foot:
- ret = 304.8;
- break;
- case RS2::Mile:
- ret = 1609344;
- break;
- case RS2::Millimeter:
- ret = 1.0;
- break;
- case RS2::Centimeter:
- ret = 10;
- break;
- case RS2::Meter:
- ret = 1000;
- break;
- case RS2::Kilometer:
- ret = 1000000;
- break;
- case RS2::Microinch:
- ret = 0.0000254;
- break;
- case RS2::Mil:
- ret = 0.0254;
- break;
- case RS2::Yard:
- ret = 914.4;
- break;
- case RS2::Angstrom:
- ret = 0.0000001;
- break;
- case RS2::Nanometer:
- ret = 0.000001;
- break;
- case RS2::Micron:
- ret = 0.001;
- break;
- case RS2::Decimeter:
- ret = 100.0;
- break;
- case RS2::Decameter:
- ret = 10000.0;
- break;
- case RS2::Hectometer:
- ret = 100000.0;
- break;
- case RS2::Gigameter:
- ret = 1000000000.0;
- break;
- case RS2::Astro:
- ret = 149600000000000.0;
- break;
- case RS2::Lightyear:
- ret = 9460731798000000000.0;
- break;
- case RS2::Parsec:
- ret = 30857000000000000000.0;
- break;
- default:
- ret = 1.0;
- break;
- }
-
- return ret;
-}
-
-/**
- * Converts the given value 'val' from unit 'src' to unit 'dest'.
- */
-double Units::convert(double val, RS2::Unit src, RS2::Unit dest)
-{
- if (getFactorToMM(dest) > 0.0)
- {
- return (val * getFactorToMM(src)) / getFactorToMM(dest);
- }
- else
- {
- DEBUG->print(Debug::D_WARNING, "Units::convert: invalid factor");
- return val;
- }
-}
-
-/**
- * Converts the given vector 'val' from unit 'src' to unit 'dest'.
- */
-Vector Units::convert(const Vector val, RS2::Unit src, RS2::Unit dest)
-{
- return Vector(convert(val.x, src, dest), convert(val.y, src, dest), convert(val.z, src, dest));
-}
-
-/**
- * Formats the given length in the given format.
- *
- * @param length The length in the current unit of the drawing.
- * @param format Format of the string.
- * @param prec Precisision of the value (e.g. 0.001 or 1/128 = 0.0078125)
- & @param showUnit Append unit to the value.
- */
-QString Units::formatLinear(double length, RS2::Unit unit, RS2::LinearFormat format,
- int prec, bool showUnit)
-{
- QString ret;
-
- // unit appended to value (e.g. 'mm'):
- /*QString unitString = "";
- if (showUnit) {
- unitString = unitToSign(unit);
-}*/
-
- // Barbarian display: Show as fraction:
- switch (format)
- {
- case RS2::Scientific:
- ret = formatScientific(length, unit, prec, showUnit);
- break;
-
- case RS2::Decimal:
- ret = formatDecimal(length, unit, prec, showUnit);
- break;
-
- case RS2::Engineering:
- ret = formatEngineering(length, unit, prec, showUnit);
- break;
-
- case RS2::Architectural:
- ret = formatArchitectural(length, unit, prec, showUnit);
- break;
-
- case RS2::Fractional:
- ret = formatFractional(length, unit, prec, showUnit);
- break;
-
- default:
- DEBUG->print(Debug::D_WARNING,
- "Units::formatLinear: Unknown format");
- ret = "";
- break;
- }
-
- return ret;
-}
-
-/**
- * Formats the given length in scientific format (e.g. 2.5E7).
- *
- * @param length The length in the current unit of the drawing.
- * @param prec Precisision of the value (e.g. 0.001 or 1/128 = 0.0078125)
- & @param showUnit Append unit to the value.
- */
-QString Units::formatScientific(double length, RS2::Unit unit, int prec, bool showUnit)
-{
- QString ret;
-
- // unit appended to value (e.g. 'mm'):
- QString unitString = "";
-
- if (showUnit)
- unitString = unitToSign(unit);
-
- char format[128];
- sprintf(format, "%%.%dE%%s", prec);
- ret.sprintf(format, length, (const char *)unitString.toLocal8Bit());
-
- return ret;
-}
-
-/**
- * Formats the given length in decimal (normal) format (e.g. 2.5).
- *
- * @param length The length in the current unit of the drawing.
- * @param prec Precisision of the value (e.g. 0.001)
- & @param showUnit Append unit to the value.
- */
-QString Units::formatDecimal(double length, RS2::Unit unit, int prec, bool showUnit)
-{
- QString ret;
-
- // unit appended to value (e.g. 'mm'):
- QString unitString = "";
-
- if (showUnit)
- unitString = unitToSign(unit);
-
- ret = Math::doubleToString(length, prec);
-
- if (showUnit)
- ret += unitString;
-
- return ret;
-}
-
-/**
- * Formats the given length in engineering format (e.g. 5' 4.5").
- *
- * @param length The length in the current unit of the drawing.
- * @param prec Precisision of the value (e.g. 0.001 or 1/128 = 0.0078125)
- & @param showUnit Append unit to the value.
- */
-QString Units::formatEngineering(double length, RS2::Unit /*unit*/, int prec, bool /*showUnit*/)
-{
- QString ret;
-
- bool sign = (length < 0.0);
- int feet = (int)floor(fabs(length) / 12);
- double inches = fabs(length) - feet * 12;
-
- QString sInches = Math::doubleToString(inches, prec);
-
- if (sInches == "12")
- {
- feet++;
- sInches = "0";
- }
-
- if (feet != 0)
- {
- ret.sprintf("%d'-%s\"", feet, (const char *)sInches.toLocal8Bit());
- }
- else
- {
- ret.sprintf("%s\"", (const char *)sInches.toLocal8Bit());
- }
-
- if (sign)
- ret = "-" + ret;
-
- return ret;
-}
-
-/**
- * Formats the given length in architectural format (e.g. 5' 4 1/2").
- *
- * @param length The length in the current unit of the drawing.
- * @param prec Precisision of the value (e.g. 0.001 or 1/128 = 0.0078125)
- & @param showUnit Append unit to the value.
- */
-QString Units::formatArchitectural(double length, RS2::Unit /*unit*/, int prec, bool showUnit)
-{
- QString ret;
- bool neg = (length < 0.0);
- int feet = (int)floor(fabs(length) / 12);
- double inches = fabs(length) - feet * 12;
-
- QString sInches = formatFractional(inches, RS2::Inch, prec, showUnit);
-
- if (sInches == "12")
- {
- feet++;
- sInches = "0";
- }
-
- if (neg)
- {
- ret.sprintf("-%d'-%s\"", feet, (const char *)sInches.toLocal8Bit());
- }
- else
- {
- ret.sprintf("%d'-%s\"", feet, (const char *)sInches.toLocal8Bit());
- }
-
- return ret;
-}
-
-/**
- * Formats the given length in fractional (barbarian) format (e.g. 5' 3 1/64").
- *
- * @param length The length in the current unit of the drawing.
- * @param unit Should be inches.
- * @param prec Precisision of the value (e.g. 0.001 or 1/128 = 0.0078125)
- & @param showUnit Append unit to the value.
- */
-QString Units::formatFractional(double length, RS2::Unit /*unit*/, int prec, bool /*showUnit*/)
-{
- QString ret;
-
- int num; // number of complete inches (num' 7/128")
- int nominator; // number of fractions (nominator/128)
- int denominator; // (4/denominator)
-
- // sign:
- QString neg = "";
-
- if (length < 0)
- {
- neg = "-";
- length = fabs(length);
- }
-
- num = (int)floor(length);
-
- denominator = (int)Math::pow(2, prec);
- nominator = Math::round((length - num) * denominator);
-
- // fraction rounds up to 1:
- if (nominator == denominator)
- {
- nominator = 0;
- denominator = 0;
- ++num;
- }
-
- // Simplify the fraction
- if (nominator != 0 && denominator != 0)
- {
- int gcd = Math::findGCD(nominator, denominator);
-
- if (gcd != 0)
- {
- nominator = nominator / gcd;
- denominator = denominator / gcd;
- }
- else
- {
- DEBUG->print(Debug::D_WARNING, "Units::formatFractional: invalid gcd");
- nominator = 0;
- denominator = 0;
- }
- }
-
- if (num != 0 && nominator != 0)
- {
- ret.sprintf("%s%d %d/%d", (const char *)neg.toLocal8Bit(), num, nominator, denominator);
- }
- else if (nominator != 0)
- {
- ret.sprintf("%s%d/%d", (const char *)neg.toLocal8Bit(), nominator, denominator);
- }
- else if (num != 0)
- {
- ret.sprintf("%s%d", (const char *)neg.toLocal8Bit(), num);
- }
- else
- {
- ret.sprintf("0");
- }
-
- return ret;
-}
-
-/**
- * Formats the given angle with the given format.
- *
- * @param angle The angle (always in rad).
- * @param format Format of the string.
- * @param prec Precisision of the value (e.g. 0.001 or 1/128 = 0.0078125)
- *
- * @ret String with the formatted angle.
- */
-QString Units::formatAngle(double angle, RS2::AngleFormat format, int prec)
-{
- QString ret;
- double value;
-
- switch (format)
- {
- case RS2::DegreesDecimal:
- case RS2::DegreesMinutesSeconds:
- value = Math::rad2deg(angle);
- break;
- case RS2::Radians:
- value = angle;
- break;
- case RS2::Gradians:
- value = Math::rad2gra(angle);
- break;
- default:
- DEBUG->print(Debug::D_WARNING, "Units::formatAngle: Unknown Angle Unit");
- return "";
- break;
- }
-
- switch (format)
- {
- case RS2::DegreesDecimal:
- case RS2::Radians:
- case RS2::Gradians:
- ret = Math::doubleToString(value, prec);
-
- if (format == RS2::DegreesDecimal)
- ret += QChar(0xB0);
- if (format == RS2::Radians)
- ret += "r";
- if (format == RS2::Gradians)
- ret += "g";
- break;
-
- case RS2::DegreesMinutesSeconds:
- {
- int vDegrees, vMinutes;
- double vSeconds;
- QString degrees, minutes, seconds;
-
- vDegrees = (int)floor(value);
- vMinutes = (int)floor((value - vDegrees) * 60.0);
- vSeconds = (value - vDegrees - (vMinutes / 60.0)) * 3600.0;
-
- seconds = Math::doubleToString(vSeconds, (prec > 1 ? prec - 2 : 0));
-
- if (seconds == "60")
- {
- seconds = "0";
- ++vMinutes;
-
- if (vMinutes == 60)
- {
- vMinutes = 0;
- ++vDegrees;
- }
- }
-
- if (prec == 0 && vMinutes >= 30.0)
- {
- vDegrees++;
- }
- else if (prec == 1 && vSeconds >= 30.0)
- {
- vMinutes++;
- }
-
- degrees.setNum(vDegrees);
- minutes.setNum(vMinutes);
-
- switch (prec)
- {
- case 0:
- ret = degrees + QChar(0xB0);
- break;
- case 1:
- ret = degrees + QChar(0xB0) + " " + minutes + "'";
- break;
- default:
- ret = degrees + QChar(0xB0) + " " + minutes + "' " + seconds + "\"";
- break;
- }
- }
- break;
-
- default:
- break;
- }
-
- return ret;
-}
-
-/**
- * @return Size of the given paper format.
- */
-Vector Units::paperFormatToSize(RS2::PaperFormat p)
-{
- Vector ret(false);
-
- switch (p)
- {
- case RS2::Custom:
- ret = Vector(0.0, 0.0);
- break;
- case RS2::Letter:
- ret = Vector(215.9, 279.4);
- break;
- case RS2::Legal:
- ret = Vector(215.9, 355.6);
- break;
- case RS2::Executive:
- ret = Vector(190.5, 254.0);
- break;
- case RS2::A0:
- ret = Vector(841.0, 1189.0);
- break;
- case RS2::A1:
- ret = Vector(594.0, 841.0);
- break;
- case RS2::A2:
- ret = Vector(420.0, 594.0);
- break;
- case RS2::A3:
- ret = Vector(297.0, 420.0);
- break;
- case RS2::A4:
- ret = Vector(210.0, 297.0);
- break;
- case RS2::A5:
- ret = Vector(148.0, 210.0);
- break;
- case RS2::A6:
- ret = Vector(105.0, 148.0);
- break;
- case RS2::A7:
- ret = Vector(74.0, 105.0);
- break;
- case RS2::A8:
- ret = Vector(52.0, 74.0);
- break;
- case RS2::A9:
- ret = Vector(37.0, 52.0);
- break;
- /*case RS2::A10:
- ret = Vector(26.0, 37.0);
- break;*/
- case RS2::B0:
- ret = Vector(1000.0, 1414.0);
- break;
- case RS2::B1:
- ret = Vector(707.0, 1000.0);
- break;
- case RS2::B2:
- ret = Vector(500.0, 707.0);
- break;
- case RS2::B3:
- ret = Vector(353.0, 500.0);
- break;
- case RS2::B4:
- ret = Vector(250.0, 353.0);
- break;
- case RS2::B5:
- ret = Vector(176.0, 250.0);
- break;
- case RS2::B6:
- ret = Vector(125.0, 176.0);
- break;
- case RS2::B7:
- ret = Vector(88.0, 125.0);
- break;
- case RS2::B8:
- ret = Vector(62.0, 88.0);
- break;
- case RS2::B9:
- ret = Vector(44.0, 62.0);
- break;
- case RS2::B10:
- ret = Vector(31.0, 44.0);
- break;
- /*
- case RS2::C0:
- ret = Vector(917.0, 1297.0);
- break;
- case RS2::C1:
- ret = Vector(648.0, 917.0);
- break;
- case RS2::C2:
- ret = Vector(458.0, 648.0);
- break;
- case RS2::C3:
- ret = Vector(324.0, 458.0);
- break;
- case RS2::C4:
- ret = Vector(229.0, 324.0);
- break;
- case RS2::C5:
- ret = Vector(162.0, 229.0);
- break;
- case RS2::C6:
- ret = Vector(114.0, 162.0);
- break;
- case RS2::C7:
- ret = Vector(81.0, 114.0);
- break;
- case RS2::C8:
- ret = Vector(57.0, 81.0);
- break;
- case RS2::C9:
- ret = Vector(40.0, 57.0);
- break;
- case RS2::C10:
- ret = Vector(28.0, 40.0);
- break;
- */
- case RS2::C5E:
- ret = Vector(163.0, 229.0);
- break;
- case RS2::Comm10E:
- ret = Vector(105.0, 241.0);
- break;
- case RS2::DLE:
- ret = Vector(110.0, 220.0);
- break;
- case RS2::Folio:
- ret = Vector(210.0, 330.0);
- break;
- //case RS2::Ledger:
- // ret = Vector(432.0, 279.0);
- // break;
- case RS2::Tabloid:
- ret = Vector(279.0, 432.0);
- break;
- case RS2::NPageSize:
- ret = Vector(0.0, 0.0);
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-/**
- * Gets the paper format which matches the given size. If no
- * format matches, RS2::Custom is returned.
- */
-RS2::PaperFormat Units::paperSizeToFormat(const Vector s)
-{
- Vector ts1;
- Vector ts2;
-
- for(int i=(int)RS2::Custom; i<=(int)RS2::NPageSize; ++i)
- {
- ts1 = Units::paperFormatToSize((RS2::PaperFormat)i);
- ts2 = Vector(ts1.y, ts1.x);
-
- if (ts1.distanceTo(s) < 1.0e-4 || ts2.distanceTo(s) < 1.0e-4)
- return (RS2::PaperFormat)i;
- }
-
- return RS2::Custom;
-}
-
-/**
- * Converts a paper format to a string (e.g. for a combobox).
- */
-QString Units::paperFormatToString(RS2::PaperFormat p)
-{
- QString ret = "";
-
- switch (p)
- {
- case RS2::Custom:
- ret = "Custom";
- break;
- case RS2::Letter:
- ret = "Letter";
- break;
- case RS2::Legal:
- ret = "Legal";
- break;
- case RS2::Executive:
- ret = "Executive";
- break;
- case RS2::A0:
- ret = "A0";
- break;
- case RS2::A1:
- ret = "A1";
- break;
- case RS2::A2:
- ret = "A2";
- break;
- case RS2::A3:
- ret = "A3";
- break;
- case RS2::A4:
- ret = "A4";
- break;
- case RS2::A5:
- ret = "A5";
- break;
- case RS2::A6:
- ret = "A6";
- break;
- case RS2::A7:
- ret = "A7";
- break;
- case RS2::A8:
- ret = "A8";
- break;
- case RS2::A9:
- ret = "A9";
- break;
- case RS2::B0:
- ret = "B0";
- break;
- case RS2::B1:
- ret = "B1";
- break;
- case RS2::B2:
- ret = "B2";
- break;
- case RS2::B3:
- ret = "B3";
- break;
- case RS2::B4:
- ret = "B4";
- break;
- case RS2::B5:
- ret = "B5";
- break;
- case RS2::B6:
- ret = "B6";
- break;
- case RS2::B7:
- ret = "B7";
- break;
- case RS2::B8:
- ret = "B8";
- break;
- case RS2::B9:
- ret = "B9";
- break;
- case RS2::B10:
- ret = "B10";
- break;
- /*
- case RS2::C0:
- ret = "C0";
- break;
- case RS2::C1:
- ret = "C1";
- break;
- case RS2::C2:
- ret = "C2";
- break;
- case RS2::C3:
- ret = "C3";
- break;
- case RS2::C4:
- ret = "C4";
- break;
- case RS2::C5:
- ret = "C5";
- break;
- case RS2::C6:
- ret = "C6";
- break;
- case RS2::C7:
- ret = "C7";
- break;
- case RS2::C8:
- ret = "C8";
- break;
- case RS2::C9:
- ret = "C9";
- break;
- case RS2::C10:
- ret = "C10";
- break;
- */
- case RS2::C5E:
- ret = "C5E";
- break;
- case RS2::Comm10E:
- ret = "Comm10E";
- break;
- case RS2::DLE:
- ret = "DLE";
- break;
- case RS2::Folio:
- ret = "Folio";
- break;
- //case RS2::Ledger:
- // ret = "Ledger";
- // break;
- case RS2::Tabloid:
- ret = "Tabloid";
- break;
- case RS2::NPageSize:
- ret = "NPageSize";
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-/**
- * Converts a string to a paper format.
- */
-RS2::PaperFormat Units::stringToPaperFormat(const QString & p)
-{
- QString ls = p.toLower();
- RS2::PaperFormat ret = RS2::Custom;
-
- if (p == "custom")
- ret = RS2::Custom;
- else if (p == "letter")
- ret = RS2::Letter;
- else if (p == "legal")
- ret = RS2::Legal;
- else if (p == "executive")
- ret = RS2::Executive;
- else if (p == "a0")
- ret = RS2::A0;
- else if (p == "a1")
- ret = RS2::A1;
- else if (p == "a2")
- ret = RS2::A2;
- else if (p == "a3")
- ret = RS2::A3;
- else if (p == "a4")
- ret = RS2::A4;
- else if (p == "a5")
- ret = RS2::A5;
- else if (p == "a6")
- ret = RS2::A6;
- else if (p == "a7")
- ret = RS2::A7;
- else if (p == "a8")
- ret = RS2::A8;
- else if (p == "a9")
- ret = RS2::A9;
- else if (p == "b0")
- ret = RS2::B0;
- else if (p == "b1")
- ret = RS2::B1;
- else if (p == "b2")
- ret = RS2::B2;
- else if (p == "b3")
- ret = RS2::B3;
- else if (p == "b4")
- ret = RS2::B4;
- else if (p == "b5")
- ret = RS2::B5;
- else if (p == "b6")
- ret = RS2::B6;
- else if (p == "b7")
- ret = RS2::B7;
- else if (p == "b8")
- ret = RS2::B8;
- else if (p == "b9")
- ret = RS2::B9;
- else if (p == "b10")
- ret = RS2::B10;
- /*else if (p=="c0") {
- ret = RS2::C0;
- } else if (p=="c1") {
- ret = RS2::C1;
- } else if (p=="c2") {
- ret = RS2::C2;
- } else if (p=="c3") {
- ret = RS2::C3;
- } else if (p=="c4") {
- ret = RS2::C4;
- } else if (p=="c5") {
- ret = RS2::C5;
- } else if (p=="c6") {
- ret = RS2::C6;
- } else if (p=="c7") {
- ret = RS2::C7;
- } else if (p=="c8") {
- ret = RS2::C8;
- } else if (p=="c9") {
- ret = RS2::C9;
- } else if (p=="c10") {
- ret = RS2::C10;
- }*/
- else if (p == "c5e")
- ret = RS2::C5E;
- else if (p == "comm10e")
- ret = RS2::Comm10E;
- else if (p == "dle")
- ret = RS2::DLE;
- else if (p == "folio")
- ret = RS2::Folio;
- //else if (p=="ledger")
- // ret = RS2::Ledger;
- else if (p == "tabloid")
- ret = RS2::Tabloid;
- else if (p == "npagesize")
- ret = RS2::NPageSize;
-
- return ret;
-}
-
-/**
- * Performs some testing for the math class.
- */
-void Units::test()
-{
- QString s;
- double v;
-
- /*
- std::cout << "Units::test: formatLinear (decimal):\n";
- v = 0.1;
- s = Units::formatLinear(v, RS2::Millimeter, RS2::Decimal,
- 3, false);
- std::cout << "s: " << s << "\n";
- assert(s=="0.1");
- v = 0.01;
- s = Units::formatLinear(v, RS2::Millimeter, RS2::Decimal,
- 3, false);
- std::cout << "s: " << s << "\n";
- assert(s=="0.01");
- v = 0.001;
- s = Units::formatLinear(v, RS2::Millimeter, RS2::Decimal,
- 3, false);
- std::cout << "s: " << s << "\n";
- assert(s=="0.001");
- v = 0.009;
- s = Units::formatLinear(v, RS2::Millimeter, RS2::Decimal,
- 2, false);
- std::cout << "s: " << s << "\n";
- assert(s=="0.01");
- v = 0.005;
- s = Units::formatLinear(v, RS2::Millimeter, RS2::Decimal,
- 2, false);
- std::cout << "s: " << s << "\n";
- assert(s=="0.01");
- v = 0.0049999;
- s = Units::formatLinear(v, RS2::Millimeter, RS2::Decimal,
- 2, false);
- std::cout << "s: " << s << "\n";
- assert(s=="0");
-
- v = 0.1;
- s = Units::formatLinear(v, RS2::Millimeter, RS2::Decimal,
- 4, true);
- std::cout << "s: " << s << "\n";
- assert(s=="0.1mm");
-
-
- std::cout << "Units::test: formatLinear (fractional):\n";
- v = 1.2;
- s = Units::formatLinear(v, RS2::Inch, RS2::Fractional,
- 6, false);
- std::cout << "s: " << s << "\n";
- assert(s=="1 13/64");
-
- v = 1.2;
- s = Units::formatLinear(v, RS2::Inch, RS2::Fractional,
- 8, false);
- std::cout << "s: " << s << "\n";
- assert(s=="1 51/256");
-
- v = 0.2;
- s = Units::formatLinear(v, RS2::Inch, RS2::Fractional,
- 8, false);
- std::cout << "s: " << s << "\n";
- assert(s=="51/256");
-
- v = 4.5;
- s = Units::formatLinear(v, RS2::Inch, RS2::Fractional,
- 6, true);
- std::cout << "s: " << s << "\n";
- assert(s=="4 1/2");
-
- v = 0.001;
- s = Units::formatLinear(v, RS2::Inch, RS2::Fractional,
- 0, false);
- std::cout << "s: " << s << "\n";
- assert(s=="0");
-
- v = 0.01;
- s = Units::formatLinear(v, RS2::Inch, RS2::Fractional,
- 8, false);
- std::cout << "s: " << s << "\n";
- assert(s=="3/256");
-
- v = 0.0078125;
- s = Units::formatLinear(v, RS2::Inch, RS2::Fractional,
- 8, false);
- std::cout << "s: " << s << "\n";
- assert(s=="1/128");
-
- v = 0.001;
- s = Units::formatLinear(v, RS2::Inch, RS2::Fractional,
- 8, false);
- std::cout << "s: " << s << "\n";
- assert(s=="0");
-
- v = 9.9999;
- s = Units::formatLinear(v, RS2::Inch, RS2::Fractional,
- 6, false);
- std::cout << "s: " << s << "\n";
- assert(s=="10");
- */
-
- for(v=11.9999; v<12.0001; v+=0.0000001)
- {
- for(int prec=0; prec<=6; ++prec)
- {
- s = Units::formatLinear(v, RS2::Inch, RS2::Architectural, prec, true);
- std::cout << "prec: " << prec << " v: " << v << " s: " << s.toAscii().data() << "\n";
- }
- }
-
- /*for (v=0.0; v<10.0; v+=0.001) {
- s = Units::formatLinear(v, RS2::Foot, RS2::Fractional,
- 1.0/128.0, true);
- std::cout << "v: " << v << " s: " << s << "\n";
-}*/
-
- /*
- std::cout << "Units::test: formatLinear (scientific):\n";
- v = 0.001;
- s = Units::formatLinear(v, RS2::Millimeter, RS2::Scientific,
- 0.0001, false);
- std::cout << "s: " << s << "\n";
- assert(s=="1.0e-3");
- */
-
-
- /*
- std::cout << "Units::test: formatAngle (deg / decimal):\n";
- v = 0.0261799;
- s = Units::formatAngle(v, RS2::DegreesDecimal, 2);
- std::cout << "s: " << s << "\n";
- assert(s=="1.5�");
-
- v = 0;
- s = Units::formatAngle(v, RS2::DegreesDecimal, 2);
- std::cout << "s: " << s << "\n";
- assert(s=="0�");
-
- v = 1.5707963;
- s = Units::formatAngle(v, RS2::DegreesDecimal, 2);
- std::cout << "s: " << s << "\n";
- assert(s=="90�");
-
- std::cout << "Units::test: formatAngle (deg / d/m/s):\n";
-
- v = 0.0260926;
- s = Units::formatAngle(v, RS2::DegreesMinutesSeconds, 1);
- std::cout << "s: " << s << "\n";
- assert(s=="1� 29' 42\"");
-
- v = 0.0261799;
- s = Units::formatAngle(v, RS2::DegreesMinutesSeconds, 1);
- std::cout << "s: " << s << "\n";
- assert(s=="1� 30' 0\"");
- */
-}