⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs_units.cpp

📁 qcad2.05可用于windows和linux的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
RS_String RS_Units::formatLinear(double length, RS2::Unit unit,                                 RS2::LinearFormat format,                                 int prec, bool showUnit) {    RS_String ret;    // unit appended to value (e.g. 'mm'):    /*RS_String 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:        RS_DEBUG->print(RS_Debug::D_WARNING,			"RS_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. */RS_String RS_Units::formatScientific(double length, RS2::Unit unit,                                     int prec, bool showUnit) {    RS_String ret;    // unit appended to value (e.g. 'mm'):    RS_String unitString = "";    if (showUnit) {        unitString = unitToSign(unit);    }    char format[128];    sprintf(format, "%%.%dE%%s", prec);    ret.sprintf(format, length, (const char*)unitString.local8Bit());    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. */RS_String RS_Units::formatDecimal(double length, RS2::Unit unit,                                  int prec, bool showUnit) {    RS_String ret;    // unit appended to value (e.g. 'mm'):    RS_String unitString = "";    if (showUnit) {        unitString = unitToSign(unit);    }    ret = RS_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. */RS_String RS_Units::formatEngineering(double length, RS2::Unit /*unit*/,                                      int prec, bool /*showUnit*/) {    RS_String ret;    bool sign = (length<0.0);    int feet = (int)floor(fabs(length)/12);    double inches = fabs(length) - feet*12;    RS_String sInches = RS_Math::doubleToString(inches, prec);    if (sInches=="12") {        feet++;        sInches="0";    }    if (feet!=0) {        ret.sprintf("%d'-%s\"", feet, (const char*)sInches.local8Bit());    } else {        ret.sprintf("%s\"", (const char*)sInches.local8Bit());    }    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. */RS_String RS_Units::formatArchitectural(double length, RS2::Unit /*unit*/,                                        int prec, bool showUnit) {    RS_String ret;    bool neg = (length<0.0);    int feet = (int)floor(fabs(length)/12);    double inches = fabs(length) - feet*12;    RS_String sInches = formatFractional(inches, RS2::Inch, prec, showUnit);    if (sInches=="12") {        feet++;        sInches = "0";    }    if (neg) {        ret.sprintf("-%d'-%s\"", feet, (const char*)sInches.local8Bit());    } else {        ret.sprintf("%d'-%s\"", feet, (const char*)sInches.local8Bit());    }    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. */RS_String RS_Units::formatFractional(double length, RS2::Unit /*unit*/,                                     int prec, bool /*showUnit*/) {    RS_String ret;    int num;            // number of complete inches (num' 7/128")    int nominator;      // number of fractions (nominator/128)    int denominator;    // (4/denominator)    // sign:    RS_String neg = "";    if(length < 0) {        neg = "-";        length = fabs(length);    }    num = (int)floor(length);    denominator = (int)RS_Math::pow(2, prec);    nominator = RS_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 = RS_Math::findGCD(nominator, denominator);        if (gcd!=0) {            nominator = nominator / gcd;            denominator = denominator / gcd;        } else {            RS_DEBUG->print(RS_Debug::D_WARNING,				"RS_Units::formatFractional: invalid gcd");            nominator = 0;            denominator = 0;        }    }    if( num!=0 && nominator!=0 ) {        ret.sprintf("%s%d %d/%d",                    (const char*)neg.local8Bit(), num,                    nominator, denominator);    } else if(nominator!=0) {        ret.sprintf("%s%d/%d",                    (const char*)neg.local8Bit(),                    nominator, denominator);    } else if(num!=0) {        ret.sprintf("%s%d",                    (const char*)neg.local8Bit(),                    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. */RS_String RS_Units::formatAngle(double angle, RS2::AngleFormat format,                                int prec) {    RS_String ret;    double value;    switch (format) {    case RS2::DegreesDecimal:    case RS2::DegreesMinutesSeconds:        value = RS_Math::rad2deg(angle);        break;    case RS2::Radians:        value = angle;        break;    case RS2::Gradians:        value = RS_Math::rad2gra(angle);        break;    default:        RS_DEBUG->print(RS_Debug::D_WARNING,			"RS_Units::formatAngle: Unknown Angle Unit");        return "";        break;    }    switch (format) {    case RS2::DegreesDecimal:    case RS2::Radians:    case RS2::Gradians:        ret = RS_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;            RS_String degrees, minutes, seconds;            vDegrees = (int)floor(value);            vMinutes = (int)floor((value - vDegrees) * 60.0);            vSeconds = (value - vDegrees - (vMinutes/60.0)) * 3600.0;            seconds = RS_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. */RS_Vector RS_Units::paperFormatToSize(RS2::PaperFormat p) {    RS_Vector ret(false);    switch (p) {    case RS2::Custom:        ret = RS_Vector(0.0, 0.0);        break;    case RS2::Letter:        ret = RS_Vector(215.9, 279.4);        break;    case RS2::Legal:        ret = RS_Vector(215.9, 355.6);        break;    case RS2::Executive:        ret = RS_Vector(190.5, 254.0);        break;    case RS2::A0:        ret = RS_Vector(841.0, 1189.0);        break;    case RS2::A1:        ret = RS_Vector(594.0, 841.0);        break;    case RS2::A2:        ret = RS_Vector(420.0, 594.0);        break;    case RS2::A3:        ret = RS_Vector(297.0, 420.0);        break;    case RS2::A4:        ret = RS_Vector(210.0, 297.0);        break;    case RS2::A5:        ret = RS_Vector(148.0, 210.0);        break;    case RS2::A6:        ret = RS_Vector(105.0, 148.0);        break;    case RS2::A7:        ret = RS_Vector(74.0, 105.0);        break;    case RS2::A8:        ret = RS_Vector(52.0, 74.0);        break;    case RS2::A9:        ret = RS_Vector(37.0, 52.0);        break;        /*case RS2::A10:            ret = RS_Vector(26.0, 37.0);            break;*/    case RS2::B0:        ret = RS_Vector(1000.0, 1414.0);        break;    case RS2::B1:        ret = RS_Vector(707.0, 1000.0);        break;    case RS2::B2:        ret = RS_Vector(500.0, 707.0);        break;    case RS2::B3:        ret = RS_Vector(353.0, 500.0);        break;    case RS2::B4:        ret = RS_Vector(250.0, 353.0);        break;    case RS2::B5:        ret = RS_Vector(176.0, 250.0);        break;    case RS2::B6:        ret = RS_Vector(125.0, 176.0);        break;    case RS2::B7:        ret = RS_Vector(88.0, 125.0);        break;    case RS2::B8:        ret = RS_Vector(62.0, 88.0);        break;    case RS2::B9:        ret = RS_Vector(44.0, 62.0);        break;    case RS2::B10:        ret = RS_Vector(31.0, 44.0);        break;        /*          case RS2::C0:              ret = RS_Vector(917.0, 1297.0);              break;          case RS2::C1:              ret = RS_Vector(648.0, 917.0);              break;          case RS2::C2:              ret = RS_Vector(458.0, 648.0);              break;          case RS2::C3:              ret = RS_Vector(324.0, 458.0);              break;          case RS2::C4:              ret = RS_Vector(229.0, 324.0);              break;          case RS2::C5:              ret = RS_Vector(162.0, 229.0);              break;          case RS2::C6:              ret = RS_Vector(114.0, 162.0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -