📄 rs_units.cpp
字号:
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 + -