static STATUS_T CmdCircle2( wAction_t action, coOrd pos ) { switch (action) { case C_START: InfoMessage( _("Place circle center") ); return C_CONTINUE; case C_DOWN: Dc2.pos = pos; InfoMessage( _("Drag to set radius") ); return C_CONTINUE; case C_MOVE: dc2.radius = ConstrainR( FindDistance( Dc2.pos, pos ) ); InfoMessage( "%s", FormatDistance(dc2.radius) ); return C_CONTINUE; case C_UP: curCommand = cmdCircle; InfoMessage( _("Place circle") ); return C_CONTINUE; default: return C_CONTINUE; } }
QString CMeasureDialog::formatDistance( double distance ) { QSettings settings; bool baseUnit = settings.value( "/qgis/measure/keepbaseunit", false ).toBool(); QGis::UnitType newDisplayUnits; convertMeasurement( distance, newDisplayUnits, false ); return FormatDistance( distance, mDecimalPlaces, newDisplayUnits, baseUnit ); }
Unit FormatDistanceSmart(TCHAR *buffer, fixed value, Unit unit, bool include_unit, fixed small_unit_threshold, fixed precision_threshold) { unit = GetBestDistanceUnit(value, unit, small_unit_threshold); int precision = GetBestDistancePrecision(value, unit, precision_threshold); FormatDistance(buffer, value, unit, include_unit, precision); return unit; }
void UpdateInfoBoxATCRadial(InfoBoxData &data) { const NMEAInfo &basic = CommonInterface::Basic(); const GeoPoint &reference = CommonInterface::GetComputerSettings().poi.atc_reference; if (!basic.location_available || !reference.IsValid()) { data.SetInvalid(); return; } const GeoVector vector(reference, basic.location); data.SetValue(vector.bearing); FormatDistance(data.comment.buffer(), vector.distance, Unit::NAUTICAL_MILES, true, 1); }
EXPORT STATUS_T CreateCurve( wAction_t action, coOrd pos, BOOL_T track, wDrawColor color, DIST_T width, long mode, curveMessageProc message ) { DIST_T d; ANGLE_T a; static coOrd pos0; int inx; switch ( action ) { case C_START: DYNARR_SET( trkSeg_t, tempSegs_da, 8 ); switch ( curveMode ) { case crvCmdFromEP1: InfoMessage( _("Drag from End-Point in direction of curve") ); break; case crvCmdFromTangent: InfoMessage( _("Drag from End-Point to Center") ); break; case crvCmdFromCenter: InfoMessage( _("Drag from Center to End-Point") ); break; case crvCmdFromChord: InfoMessage( _("Drag to other end of chord") ); break; } return C_CONTINUE; case C_DOWN: for ( inx=0; inx<8; inx++ ) { tempSegs(inx).color = wDrawColorBlack; tempSegs(inx).width = 0; } tempSegs_da.cnt = 0; SnapPos( &pos ); pos0 = pos; switch (mode) { case crvCmdFromEP1: tempSegs(0).type = (track?SEG_STRTRK:SEG_STRLIN); tempSegs(0).color = color; tempSegs(0).width = width; message( _("Drag to set angle") ); break; case crvCmdFromTangent: case crvCmdFromCenter: tempSegs(0).type = SEG_STRLIN; tempSegs(1).type = SEG_CRVLIN; tempSegs(1).u.c.radius = mainD.scale*0.05; tempSegs(1).u.c.a0 = 0; tempSegs(1).u.c.a1 = 360; tempSegs(2).type = SEG_STRLIN; message( mode==crvCmdFromTangent?_("Drag from End-Point to Center"):_("Drag from Center to End-Point") ); break; case crvCmdFromChord: tempSegs(0).type = (track?SEG_STRTRK:SEG_STRLIN); tempSegs(0).color = color; tempSegs(0).width = width; message( _("Drag to other end of chord") ); break; } tempSegs(0).u.l.pos[0] = pos; return C_CONTINUE; case C_MOVE: tempSegs(0).u.l.pos[1] = pos; d = FindDistance( pos0, pos ); a = FindAngle( pos0, pos ); switch ( mode ) { case crvCmdFromEP1: message( _("Angle=%0.3f"), PutAngle(a) ); tempSegs_da.cnt = 1; break; case crvCmdFromTangent: message( _("Radius=%s Angle=%0.3f"), FormatDistance(d), PutAngle(a) ); tempSegs(1).u.c.center = pos; DrawArrowHeads( &tempSegs(2), pos0, FindAngle(pos0,pos)+90, TRUE, wDrawColorBlack ); tempSegs_da.cnt = 7; break; case crvCmdFromCenter: message( _("Radius=%s Angle=%0.3f"), FormatDistance(d), PutAngle(a) ); tempSegs(1).u.c.center = pos0; DrawArrowHeads( &tempSegs(2), pos, FindAngle(pos,pos0)+90, TRUE, wDrawColorBlack ); tempSegs_da.cnt = 7; break; case crvCmdFromChord: message( _("Length=%s Angle=%0.3f"), FormatDistance(d), PutAngle(a) ); if ( d > mainD.scale*0.25 ) { pos.x = (pos.x+pos0.x)/2.0; pos.y = (pos.y+pos0.y)/2.0; DrawArrowHeads( &tempSegs(1), pos, FindAngle(pos,pos0)+90, TRUE, wDrawColorBlack ); tempSegs_da.cnt = 6; } else { tempSegs_da.cnt = 1; } break; } return C_CONTINUE; case C_UP: switch (mode) { case crvCmdFromEP1: DrawArrowHeads( &tempSegs(1), pos, FindAngle(pos,pos0)+90, TRUE, drawColorRed ); tempSegs_da.cnt = 6; break; case crvCmdFromChord: tempSegs(1).color = drawColorRed; case crvCmdFromTangent: case crvCmdFromCenter: tempSegs(2).color = drawColorRed; tempSegs(3).color = drawColorRed; tempSegs(4).color = drawColorRed; tempSegs(5).color = drawColorRed; tempSegs(6).color = drawColorRed; break; } message( _("Drag on Red arrows to adjust curve") ); return C_CONTINUE; default: return C_CONTINUE; } }
static STATUS_T CmdCircleCommon( wAction_t action, coOrd pos, BOOL_T helix ) { track_p t; static coOrd pos0; wControl_p controls[2]; char * labels[1]; switch (action) { case C_START: if (helix) { if (helixW == NULL) helixW = ParamCreateDialog( &helixPG, MakeWindowTitle(_("Helix")), NULL, NULL, HelixCancel, TRUE, NULL, 0, ComputeHelix ); ParamLoadControls( &helixPG ); ParamGroupRecord( &helixPG ); ComputeHelix( NULL, 6, NULL ); wShow( helixW ); memset( h_orders, 0, sizeof h_orders ); h_clock = 0; } else { ParamLoadControls( &circleRadiusPG ); ParamGroupRecord( &circleRadiusPG ); switch ( circleMode ) { case circleCmdFixedRadius: controls[0] = circleRadiusPLs[0].control; controls[1] = NULL; labels[0] = N_("Circle Radius"); InfoSubstituteControls( controls, labels ); break; case circleCmdFromTangent: InfoSubstituteControls( NULL, NULL ); InfoMessage( _("Click on Circle Edge") ); break; case circleCmdFromCenter: InfoSubstituteControls( NULL, NULL ); InfoMessage( _("Click on Circle Center") ); break; } } tempSegs_da.cnt = 0; return C_CONTINUE; case C_DOWN: DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); tempSegs_da.cnt = 0; if (helix) { if (helixRadius <= 0.0) { ErrorMessage( MSG_RADIUS_GTR_0 ); return C_ERROR; } if (helixTurns <= 0) { ErrorMessage( MSG_HELIX_TURNS_GTR_0 ); return C_ERROR; } ParamLoadData( &helixPG ); } else { ParamLoadData( &circleRadiusPG ); switch( circleMode ) { case circleCmdFixedRadius: if (circleRadius <= 0.0) { ErrorMessage( MSG_RADIUS_GTR_0 ); return C_ERROR; } break; case circleCmdFromTangent: InfoSubstituteControls( NULL, NULL ); InfoMessage( _("Drag to Center") ); break; case circleCmdFromCenter: InfoSubstituteControls( NULL, NULL ); InfoMessage( _("Drag to Edge") ); break; } } SnapPos( &pos ); tempSegs(0).u.c.center = pos0 = pos; tempSegs(0).color = wDrawColorBlack; tempSegs(0).width = 0; return C_CONTINUE; case C_MOVE: DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); SnapPos( &pos ); tempSegs(0).u.c.center = pos; if ( !helix ) { switch ( circleMode ) { case circleCmdFixedRadius: break; case circleCmdFromCenter: tempSegs(0).u.c.center = pos0; circleRadius = FindDistance( tempSegs(0).u.c.center, pos ); InfoMessage( _("Radius=%s"), FormatDistance(circleRadius) ); break; case circleCmdFromTangent: circleRadius = FindDistance( tempSegs(0).u.c.center, pos0 ); InfoMessage( _("Radius=%s"), FormatDistance(circleRadius) ); break; } } tempSegs(0).type = SEG_CRVTRK; tempSegs(0).u.c.radius = helix?helixRadius:circleRadius; tempSegs(0).u.c.a0 = 0.0; tempSegs(0).u.c.a1 = 360.0; tempSegs_da.cnt = 1; DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); return C_CONTINUE; case C_UP: DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); if ( helix ) { UndoStart( _("Create Helix Track"), "newHelix" ); t = NewCurvedTrack( tempSegs(0).u.c.center, helixRadius, 0.0, 0.0, helixTurns ); } else { if ( circleRadius <= 0 ) { ErrorMessage( MSG_RADIUS_GTR_0 ); return C_ERROR; } UndoStart( _("Create Circle Track"), "newCircle" ); t = NewCurvedTrack( tempSegs(0).u.c.center, circleRadius, 0.0, 0.0, 0 ); } UndoEnd(); DrawNewTrack(t); if (helix) wHide( helixW ); else InfoSubstituteControls( NULL, NULL ); tempSegs_da.cnt = 0; return C_TERMINATE; case C_REDRAW: DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); return C_CONTINUE; case C_CANCEL: if (helix) wHide( helixW ); else InfoSubstituteControls( NULL, NULL ); return C_CONTINUE; default: return C_CONTINUE; } }
static void ComputeHelix( paramGroup_p pg, int h_inx, void * data ) { DIST_T totTurns; DIST_T length; long updates = 0; if ( h_inx < 0 || h_inx >= sizeof h_orders/sizeof h_orders[0] ) return; ParamLoadData( &helixPG ); totTurns = helixTurns + helixAngSep/360.0; length = totTurns * helixRadius * (2 * M_PI); h_orders[h_inx] = ++h_clock; switch ( h_inx ) { case H_ELEV: if (h_orders[H_TURNS]<h_orders[H_VERTSEP] && origVertSep > 0.0) { helixTurns = (int)floor(helixElev/origVertSep - helixAngSep/360.0); totTurns = helixTurns + helixAngSep/360.0; updates |= (1<<H_TURNS); } if (totTurns > 0) { helixVertSep = helixElev/totTurns; updates |= (1<<H_VERTSEP); } break; case H_TURNS: case H_ANGSEP: helixVertSep = helixElev/totTurns; updates |= (1<<H_VERTSEP); break; case H_VERTSEP: if (helixVertSep > 0.0) { origVertSep = helixVertSep; helixTurns = (int)floor(helixElev/origVertSep - helixAngSep/360.0); updates |= (1<<H_TURNS); totTurns = helixTurns + helixAngSep/360.0; if (totTurns > 0) { helixVertSep = helixElev/totTurns; updates |= (1<<H_VERTSEP); } } break; case H_GRADE: case H_RADIUS: break; } if ( totTurns > 0.0 ) { if ( h_orders[H_RADIUS]>=h_orders[H_GRADE] || (helixGrade==0.0 && totTurns>0 && helixRadius>0) ) { if ( helixRadius > 0.0 ) { helixGrade = helixElev/(totTurns*helixRadius*(2*M_PI))*100.0; updates |= (1<<H_GRADE); } } else { if( helixGrade > 0.0 ) { helixRadius = helixElev/(totTurns*(helixGrade/100.0)*2.0*M_PI); updates |= (1<<H_RADIUS); } } } length = totTurns * helixRadius * (2 * M_PI); for ( h_inx=0; updates; h_inx++,updates>>=1 ) { if ( (updates&1) ) ParamLoadControl( &helixPG, h_inx ); } if (length > 0.0) sprintf( message, _("Total Length %s"), FormatDistance(length) ); else strcpy( message, " " ); ParamLoadMessage( &helixPG, I_HELIXMSG, message ); }
static STATUS_T CmdCurve( wAction_t action, coOrd pos ) { track_p t; DIST_T d; static int segCnt; STATUS_T rc = C_CONTINUE; switch (action) { case C_START: curveMode = (long)commandContext; Da.state = -1; tempSegs_da.cnt = 0; return CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); case C_TEXT: if ( Da.state == 0 ) return CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); else return C_CONTINUE; case C_DOWN: if ( Da.state == -1 ) { SnapPos( &pos ); Da.pos0 = pos; Da.state = 0; return CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); } else { tempSegs_da.cnt = segCnt; return C_CONTINUE; } case C_MOVE: mainD.funcs->options = wDrawOptTemp; DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); if ( Da.state == 0 ) { SnapPos( &pos ); Da.pos1 = pos; rc = CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); } else { SnapPos( &pos ); PlotCurve( curveMode, Da.pos0, Da.pos1, pos, &Da.curveData, TRUE ); if (Da.curveData.type == curveTypeStraight) { tempSegs(0).type = SEG_STRTRK; tempSegs(0).u.l.pos[0] = Da.pos0; tempSegs(0).u.l.pos[1] = Da.curveData.pos1; tempSegs_da.cnt = 1; InfoMessage( _("Straight Track: Length=%s Angle=%0.3f"), FormatDistance(FindDistance( Da.pos0, Da.curveData.pos1 )), PutAngle(FindAngle( Da.pos0, Da.curveData.pos1 )) ); } else if (Da.curveData.type == curveTypeNone) { tempSegs_da.cnt = 0; InfoMessage( _("Back") ); } else if (Da.curveData.type == curveTypeCurve) { tempSegs(0).type = SEG_CRVTRK; tempSegs(0).u.c.center = Da.curveData.curvePos; tempSegs(0).u.c.radius = Da.curveData.curveRadius; tempSegs(0).u.c.a0 = Da.curveData.a0; tempSegs(0).u.c.a1 = Da.curveData.a1; tempSegs_da.cnt = 1; d = D2R(Da.curveData.a1); if (d < 0.0) d = 2*M_PI+d; if ( d*Da.curveData.curveRadius > mapD.size.x+mapD.size.y ) { ErrorMessage( MSG_CURVE_TOO_LARGE ); tempSegs_da.cnt = 0; Da.curveData.type = curveTypeNone; mainD.funcs->options = 0; return C_CONTINUE; } InfoMessage( _("Curved Track: Radius=%s Angle=%0.3f Length=%s"), FormatDistance(Da.curveData.curveRadius), Da.curveData.a1, FormatDistance(Da.curveData.curveRadius*d) ); } } DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); mainD.funcs->options = 0; return rc; case C_UP: mainD.funcs->options = wDrawOptTemp; DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); if (Da.state == 0) { SnapPos( &pos ); Da.pos1 = pos; Da.state = 1; CreateCurve( action, pos, TRUE, wDrawColorBlack, 0, curveMode, InfoMessage ); DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); mainD.funcs->options = 0; segCnt = tempSegs_da.cnt; InfoMessage( _("Drag on Red arrows to adjust curve") ); return C_CONTINUE; } else { mainD.funcs->options = 0; tempSegs_da.cnt = 0; Da.state = -1; if (Da.curveData.type == curveTypeStraight) { if ((d=FindDistance( Da.pos0, Da.curveData.pos1 )) <= minLength) { ErrorMessage( MSG_TRK_TOO_SHORT, "Curved ", PutDim(fabs(minLength-d)) ); return C_TERMINATE; } UndoStart( _("Create Straight Track"), "newCurve - straight" ); t = NewStraightTrack( Da.pos0, Da.curveData.pos1 ); UndoEnd(); } else if (Da.curveData.type == curveTypeCurve) { if ((d= Da.curveData.curveRadius * Da.curveData.a1 *2.0*M_PI/360.0) <= minLength) { ErrorMessage( MSG_TRK_TOO_SHORT, "Curved ", PutDim(fabs(minLength-d)) ); return C_TERMINATE; } UndoStart( _("Create Curved Track"), "newCurve - curve" ); t = NewCurvedTrack( Da.curveData.curvePos, Da.curveData.curveRadius, Da.curveData.a0, Da.curveData.a1, 0 ); UndoEnd(); } else { return C_ERROR; } DrawNewTrack( t ); return C_TERMINATE; } case C_REDRAW: if ( Da.state >= 0 ) { mainD.funcs->options = wDrawOptTemp; DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); mainD.funcs->options = 0; } return C_CONTINUE; case C_CANCEL: if (Da.state == 1) { mainD.funcs->options = wDrawOptTemp; DrawSegs( &mainD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); mainD.funcs->options = 0; tempSegs_da.cnt = 0; } Da.state = -1; return C_CONTINUE; } return C_CONTINUE; }
void FormatUserDistance(fixed value, TCHAR *buffer, bool include_unit, int precision) { FormatDistance(buffer, value, Units::GetUserDistanceUnit(), include_unit, precision); }
static void PrintGaudyBox( coOrd roomSize ) { coOrd p00, p01, p10, p11; struct tm *tm; time_t clock; char dat[STR_SIZE]; wFont_p fp; DIST_T pageW, pageH; DIST_T smiggin; coOrd textsize; /*GetTitle();*/ time(&clock); tm = localtime(&clock); strftime( dat, STR_SIZE, "%x", tm ); smiggin = wDrawGetDPI( print_d.d ); if (smiggin>4.0) smiggin = 4.0/smiggin; pageW = currPrintGrid.size.x/print_d.scale; pageH = currPrintGrid.size.y/print_d.scale; /* Draw some lines */ p00.x = p01.x = 0.0; p00.y = p10.y = 0.0; p10.x = p11.x = pageW-smiggin; p01.y = p11.y = pageH+1.0-smiggin; DrawLine( &page_d, p00, p10, 0, wDrawColorBlack ); DrawLine( &page_d, p10, p11, 0, wDrawColorBlack ); DrawLine( &page_d, p11, p01, 0, wDrawColorBlack ); DrawLine( &page_d, p01, p00, 0, wDrawColorBlack ); p00.y = p10.y = 1.0; DrawLine( &page_d, p00, p10, 0, wDrawColorBlack ); p00.y = p10.y = 0.5; DrawLine( &page_d, p00, p10, 0, wDrawColorBlack ); p00.y = 0.5; p01.y = 1.0; p00.x = 0.05; p00.y = 0.5+0.05; fp = wStandardFont( F_TIMES, TRUE, TRUE ); DrawString( &page_d, p00, 0.0, sProdName, fp, 30.0, wDrawColorBlack ); p00.y = 0.5; p01.y = 1.0; p00.x = p01.x = (157.0/72.0)+0.1; DrawLine( &page_d, p00, p01, 0, wDrawColorBlack ); p00.x = p01.x = pageW-((157.0/72.0)+0.1); DrawLine( &page_d, p00, p01, 0, wDrawColorBlack ); fp = wStandardFont( F_TIMES, FALSE, FALSE ); p00.x = pageW-((157.0/72.0)+0.05); p00.y = 0.5+0.25+0.05; DrawString( &page_d, p00, 0.0, dat, fp, 16.0, wDrawColorBlack ); p00.y = 0.5+0.05; DrawTextSize( &mainD, Title1, fp, 16.0, FALSE, &textsize ); p00.x = (pageW/2.0)-(textsize.x/2.0); p00.y = 0.75+0.05; DrawString( &page_d, p00, 0.0, Title1, fp, 16.0, wDrawColorBlack ); DrawTextSize( &mainD, Title2, fp, 16.0, FALSE, &textsize ); p00.x = (pageW/2.0)-(textsize.x/2.0); p00.y = 0.50+0.05; DrawString( &page_d, p00, 0.0, Title2, fp, 16.0, wDrawColorBlack ); sprintf( dat, _("PrintScale 1:%ld Room %s x %s Model Scale %s File %s"), (long)printScale, FormatDistance( roomSize.x ), FormatDistance( roomSize.y ), curScaleName, curFileName ); p00.x = 0.05; p00.y = 0.25+0.05; DrawString( &page_d, p00, 0.0, dat, fp, 16.0, wDrawColorBlack ); }
static void TestDistance() { TCHAR buffer[256]; // Test FormatDistance() FormatDistance(buffer, 123.4, Unit::METER); ok1(StringIsEqual(buffer, _T("123 m"))); FormatDistance(buffer, 123.4, Unit::METER, false); ok1(StringIsEqual(buffer, _T("123"))); FormatDistance(buffer, 123.4, Unit::METER, true, 1); ok1(StringIsEqual(buffer, _T("123.4 m"))); FormatDistance(buffer, 123.4, Unit::METER, false, 1); ok1(StringIsEqual(buffer, _T("123.4"))); FormatDistance(buffer, 123.4, Unit::METER, true, 2); ok1(StringIsEqual(buffer, _T("123.40 m"))); FormatDistance(buffer, 123.4, Unit::METER, false, 2); ok1(StringIsEqual(buffer, _T("123.40"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::KILOMETER), Unit::KILOMETER); ok1(StringIsEqual(buffer, _T("123 km"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::KILOMETER), Unit::KILOMETER, false); ok1(StringIsEqual(buffer, _T("123"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::KILOMETER), Unit::KILOMETER, true, 1); ok1(StringIsEqual(buffer, _T("123.4 km"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::KILOMETER), Unit::KILOMETER, false, 1); ok1(StringIsEqual(buffer, _T("123.4"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::NAUTICAL_MILES), Unit::NAUTICAL_MILES); ok1(StringIsEqual(buffer, _T("123 NM"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::NAUTICAL_MILES), Unit::NAUTICAL_MILES, false); ok1(StringIsEqual(buffer, _T("123"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::NAUTICAL_MILES), Unit::NAUTICAL_MILES, true, 1); ok1(StringIsEqual(buffer, _T("123.4 NM"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::NAUTICAL_MILES), Unit::NAUTICAL_MILES, false, 1); ok1(StringIsEqual(buffer, _T("123.4"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::STATUTE_MILES), Unit::STATUTE_MILES); ok1(StringIsEqual(buffer, _T("123 mi"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::STATUTE_MILES), Unit::STATUTE_MILES, false); ok1(StringIsEqual(buffer, _T("123"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::STATUTE_MILES), Unit::STATUTE_MILES, true, 1); ok1(StringIsEqual(buffer, _T("123.4 mi"))); FormatDistance(buffer, Units::ToSysUnit(123.4, Unit::STATUTE_MILES), Unit::STATUTE_MILES, false, 1); ok1(StringIsEqual(buffer, _T("123.4"))); }