summaryrefslogtreecommitdiff
path: root/app/bin/cprofile.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/cprofile.c')
-rw-r--r--app/bin/cprofile.c2187
1 files changed, 1091 insertions, 1096 deletions
diff --git a/app/bin/cprofile.c b/app/bin/cprofile.c
index 4f375ed..ba51383 100644
--- a/app/bin/cprofile.c
+++ b/app/bin/cprofile.c
@@ -17,21 +17,17 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <math.h>
-#include <stdbool.h>
-
#include "custom.h"
#include "cselect.h"
#include "cundo.h"
-#include "i18n.h"
#include "layout.h"
-#include "messages.h"
#include "param.h"
#include "shrtpath.h"
#include "track.h"
+#include "common-ui.h"
/*
@@ -106,9 +102,9 @@ static BOOL_T printVert = TRUE;
static wMenu_p profilePopupM;
static track_p profilePopupTrk;
static EPINX_T profilePopupEp;
-static wMenuToggle_p profilePopupToggles[3];
+static wMenuToggle_p profilePopupToggles[3];
-static int log_profile = 0;
+static int log_profile = 0;
#define LABELH (labelH*fontSize/screenProfileFontSize)
#define LABELW (labelW*fontSize/screenProfileFontSize)
@@ -117,10 +113,10 @@ static int log_profile = 0;
#define PBR(FS) (1.0*(labelW*(FS)/screenProfileFontSize+3.0/mainD.dpi))
#define PBL(FS) (1.0*(labelW*(FS)/screenProfileFontSize+3.0/mainD.dpi))
static FLOAT_T labelH;
-static FLOAT_T labelW;
+static FLOAT_T labelW;
-track_p pathStartTrk;
+track_p pathStartTrk;
EPINX_T pathStartEp;
track_p pathEndTrk;
EPINX_T pathEndEp;
@@ -129,33 +125,33 @@ EPINX_T pathEndEp;
#define NOP
typedef struct {
- track_p trk;
- EPINX_T ep;
- DIST_T elev;
- DIST_T dist;
- BOOL_T defined; /* from prev PE to current */
+ track_p trk;
+ EPINX_T ep;
+ DIST_T elev;
+ DIST_T dist;
+ BOOL_T defined; /* from prev PE to current */
} profElem_t, *profElem_p;
-static dynArr_t profElem_da;
+static dynArr_t profElem_da;
static profElem_p copyOfprofElem;
-#define profElem(N) DYNARR_N( profElem_t, profElem_da, N )
+#define profElem(N) DYNARR_N( profElem_t, profElem_da, N )
typedef struct {
- DIST_T dist;
- char * name;
+ DIST_T dist;
+ char * name;
} station_t, *station_p;
-static dynArr_t station_da;
+static dynArr_t station_da;
#define station(N) DYNARR_N( station_t, station_da, N )
struct {
- DIST_T totalD, minE;
- int minC, maxC, incrC;
- DIST_T scaleX, scaleY;
-} prof;
+ DIST_T totalD, minE;
+ int minC, maxC, incrC;
+ DIST_T scaleX, scaleY;
+} prof;
/**
@@ -165,17 +161,14 @@ struct {
static void
CreateCopyProfileElements()
{
- if (copyOfprofElem) {
- MyFree(copyOfprofElem);
- }
-
- copyOfprofElem = MyMalloc(profElem_da.cnt * sizeof(profElem_t));
- if (!copyOfprofElem) {
- AbortProg("Couldn't allocate memory for profile copy\n");
- }
- for (int i = 0; i < profElem_da.cnt; i++) {
- copyOfprofElem[i] = profElem(i);
- }
+ if (copyOfprofElem) {
+ MyFree(copyOfprofElem);
+ }
+
+ copyOfprofElem = MyMalloc(profElem_da.cnt * sizeof(profElem_t));
+ for (int i = 0; i < profElem_da.cnt; i++) {
+ copyOfprofElem[i] = profElem(i);
+ }
}
/**
@@ -185,10 +178,10 @@ CreateCopyProfileElements()
static void
DestroyCopyOfProfileElements()
{
- if (copyOfprofElem) {
- MyFree(copyOfprofElem);
- copyOfprofElem = NULL;
- }
+ if (copyOfprofElem) {
+ MyFree(copyOfprofElem);
+ copyOfprofElem = NULL;
+ }
}
@@ -202,118 +195,118 @@ DestroyCopyOfProfileElements()
static void DrawProfile(drawCmd_p D, wFontSize_t fontSize, BOOL_T printVert)
{
- coOrd pl, pt, pb;
- int inx;
- DIST_T grade;
- wFont_p fp;
- static dynArr_t points_da;
+ coOrd pl, pt, pb;
+ int inx;
+ DIST_T grade;
+ wFont_p fp;
+ static dynArr_t points_da;
#define points(N) DYNARR_N( coOrd, points_da, N )
- wDrawWidth lw;
- station_p ps;
- coOrd textsize;
-
- lw = (wDrawWidth)(D->dpi*1.0/mainD.dpi);
- fp = wStandardFont(F_HELV, FALSE, FALSE);
- DYNARR_RESET(pts_t, points_da);
-
- pb.x = pt.x = 0;
- pb.y = prof.minE;
- pt.y = GetDim(prof.maxC);
- DrawLine(D, pb, pt, 0, snapGridColor);
- pb.x = pt.x = prof.totalD;
- DrawLine(D, pb, pt, 0, snapGridColor);
- pb.x = 0;
- pt.x = prof.totalD;
-
- // Draw horizontal grid and y scale
- for (inx=prof.minC; inx<=prof.maxC; inx+=prof.incrC) {
- coOrd textsize;
- // grid line
- pt.y = pb.y = GetDim(inx);
- DrawLine(D, pb, pt, 0, snapGridColor);
- // scale
- sprintf(message, "%d", inx);
- DrawTextSize(&mainD, message, wStandardFont(F_HELV, FALSE, FALSE),
- screenProfileFontSize, FALSE, &textsize);
- pl.x = ((-3.0/mainD.dpi) - textsize.y*0.5 - textsize.x) / prof.scaleX*D->scale;
- pl.y = pb.y-LABELH/2/prof.scaleY*D->scale;
-
- DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
- }
-
- // show the measurement units
- sprintf(message, "%s", units == UNITS_ENGLISH ? "in." : "cm");
- DrawTextSize(&mainD, message, wStandardFont(F_HELV, FALSE, FALSE),
- screenProfileFontSize, FALSE, &textsize);
- pl.x = ((-3.0 / mainD.dpi) - textsize.y*0.5 - textsize.x) /
- prof.scaleX*D->scale;
- pl.y += LABELH * 1.5 / prof.scaleY*D->scale;
- DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
-
- if (profElem_da.cnt <= 0) {
- return;
- }
-
- for (inx=0; inx<profElem_da.cnt; inx++) {
- pt.y = profElem(inx).elev;
- pt.x = profElem(inx).dist;
- DYNARR_APPEND(pts_t, points_da, 10);
- points(points_da.cnt-1) = pt;
- }
- pb.y = pt.y = prof.minE;
- if (points_da.cnt > 1) {
- DYNARR_APPEND(coOrd, points_da, 10);
- pt.x = prof.totalD;
- points(points_da.cnt-1) = pt;
- DYNARR_APPEND(pts_t, points_da, 10);
- pb.x = 0;
- points(points_da.cnt-1) = pb;
- DrawPoly(D, points_da.cnt, points_da.ptr, NULL, profileColorFill, 1, 1, 0);
- }
-
- pt.y = prof.minE-(2*LABELH+3.0/mainD.dpi)/prof.scaleY*D->scale;
- for (inx=0; inx<station_da.cnt; inx++) {
- ps = &station(inx);
- DrawTextSize(&mainD, ps->name, fp, fontSize, FALSE, &textsize);
- pt.x = ps->dist - textsize.x/2.0/prof.scaleX*D->scale;
- if (pt.x < -PBR(screenProfileFontSize)) {
- pt.x = -(PBR(screenProfileFontSize)-3/mainD.dpi)/prof.scaleX*D->scale;
- } else if (pt.x+textsize.x > prof.totalD) {
- pt.x = prof.totalD-(textsize.x-3/mainD.dpi)/prof.scaleX*D->scale;
- }
- DrawString(D, pt, 0.0, ps->name, fp, fontSize*D->scale, borderColor);
- }
-
- pb.x = 0.0;
- pb.y = prof.minE;
+ wDrawWidth lw;
+ station_p ps;
+ coOrd textsize;
+
+ lw = (wDrawWidth)(D->dpi*1.0/mainD.dpi);
+ fp = wStandardFont(F_HELV, FALSE, FALSE);
+ DYNARR_RESET(pts_t, points_da);
+
+ pb.x = pt.x = 0;
+ pb.y = prof.minE;
+ pt.y = GetDim(prof.maxC);
+ DrawLine(D, pb, pt, 0, snapGridColor);
+ pb.x = pt.x = prof.totalD;
+ DrawLine(D, pb, pt, 0, snapGridColor);
+ pb.x = 0;
+ pt.x = prof.totalD;
+
+ // Draw horizontal grid and y scale
+ for (inx=prof.minC; inx<=prof.maxC; inx+=prof.incrC) {
+ coOrd textsize;
+ // grid line
+ pt.y = pb.y = GetDim(inx);
+ DrawLine(D, pb, pt, 0, snapGridColor);
+ // scale
+ sprintf(message, "%d", inx);
+ DrawTextSize(&mainD, message, wStandardFont(F_HELV, FALSE, FALSE),
+ screenProfileFontSize, FALSE, &textsize);
+ pl.x = ((-3.0/mainD.dpi) - textsize.y*0.5 - textsize.x) / prof.scaleX*D->scale;
+ pl.y = pb.y-LABELH/2/prof.scaleY*D->scale;
+
+ DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
+ }
+
+ // show the measurement units
+ sprintf(message, "%s", units == UNITS_ENGLISH ? "in." : "cm");
+ DrawTextSize(&mainD, message, wStandardFont(F_HELV, FALSE, FALSE),
+ screenProfileFontSize, FALSE, &textsize);
+ pl.x = ((-3.0 / mainD.dpi) - textsize.y*0.5 - textsize.x) /
+ prof.scaleX*D->scale;
+ pl.y += LABELH * 1.5 / prof.scaleY*D->scale;
+ DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
+
+ if (profElem_da.cnt <= 0) {
+ return;
+ }
+
+ for (inx=0; inx<profElem_da.cnt; inx++) {
+ pt.y = profElem(inx).elev;
+ pt.x = profElem(inx).dist;
+ DYNARR_APPEND(pts_t, points_da, 10);
+ points(points_da.cnt-1) = pt;
+ }
+ pb.y = pt.y = prof.minE;
+ if (points_da.cnt > 1) {
+ DYNARR_APPEND(coOrd, points_da, 10);
+ pt.x = prof.totalD;
+ points(points_da.cnt-1) = pt;
+ DYNARR_APPEND(pts_t, points_da, 10);
+ pb.x = 0;
+ points(points_da.cnt-1) = pb;
+ DrawPoly(D, points_da.cnt, &points(0), NULL, profileColorFill, 1, DRAW_FILL);
+ }
+
+ pt.y = prof.minE-(2*LABELH+3.0/mainD.dpi)/prof.scaleY*D->scale;
+ for (inx=0; inx<station_da.cnt; inx++) {
+ ps = &station(inx);
+ DrawTextSize(&mainD, ps->name, fp, fontSize, FALSE, &textsize);
+ pt.x = ps->dist - textsize.x/2.0/prof.scaleX*D->scale;
+ if (pt.x < -PBR(screenProfileFontSize)) {
+ pt.x = -(PBR(screenProfileFontSize)-3/mainD.dpi)/prof.scaleX*D->scale;
+ } else if (pt.x+textsize.x > prof.totalD) {
+ pt.x = prof.totalD-(textsize.x-3/mainD.dpi)/prof.scaleX*D->scale;
+ }
+ DrawString(D, pt, 0.0, ps->name, fp, fontSize*D->scale, borderColor);
+ }
+
+ pb.x = 0.0;
+ pb.y = prof.minE;
// mark the starting point for the profile
- pt = points(0);
- DrawLine(D, pb, pt, lw, snapGridColor);
+ pt = points(0);
+ DrawLine(D, pb, pt, lw, snapGridColor);
DrawArc(D, pt, 0.05, 0, 360, TRUE, 2, wDrawColorGrey40);
- if (units==UNITS_ENGLISH) {
- sprintf(message, "%0.1f", PutDim(profElem(0).elev)+0.05);
- } else {
- sprintf(message, "%0.1f", PutDim(profElem(0).elev)+0.05);
- }
- if (printVert) {
- pl.x = pt.x + LABELH/2.0/prof.scaleX*D->scale;
- pl.y = pt.y + 2.0/mainD.dpi/prof.scaleY*D->scale + GetDim(prof.incrC) / 16;;
- DrawString(D, pl, 270.0, message, fp, fontSize*D->scale, borderColor);
- } else {
- pl.x = pt.x+2.0/mainD.dpi/prof.scaleX*D->scale + GetDim(prof.incrC) / 16;;
- pl.y = pt.y;
- if (profElem_da.cnt>1 && profElem(0).elev < profElem(1).elev) {
- pl.y -= LABELH/prof.scaleY*D->scale;
- }
- DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
- }
- pl = pt;
-
- for (inx=1; inx<profElem_da.cnt; inx++) {
- pt.y = profElem(inx).elev;
- pb.x = pt.x = profElem(inx).dist;
- pt = points(inx);
+ if (units==UNITS_ENGLISH) {
+ sprintf(message, "%0.1f", PutDim(profElem(0).elev)+0.05);
+ } else {
+ sprintf(message, "%0.1f", PutDim(profElem(0).elev)+0.05);
+ }
+ if (printVert) {
+ pl.x = pt.x + LABELH/2.0/prof.scaleX*D->scale;
+ pl.y = pt.y + 2.0/mainD.dpi/prof.scaleY*D->scale + GetDim(prof.incrC) / 16;;
+ DrawString(D, pl, 270.0, message, fp, fontSize*D->scale, borderColor);
+ } else {
+ pl.x = pt.x+2.0/mainD.dpi/prof.scaleX*D->scale + GetDim(prof.incrC) / 16;;
+ pl.y = pt.y;
+ if (profElem_da.cnt>1 && profElem(0).elev < profElem(1).elev) {
+ pl.y -= LABELH/prof.scaleY*D->scale;
+ }
+ DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
+ }
+ pl = pt;
+
+ for (inx=1; inx<profElem_da.cnt; inx++) {
+ pt.y = profElem(inx).elev;
+ pb.x = pt.x = profElem(inx).dist;
+ pt = points(inx);
// draw line to x-axis for intermediate elevation points
if (inx != profElem_da.cnt - 1) {
@@ -326,269 +319,270 @@ static void DrawProfile(drawCmd_p D, wFontSize_t fontSize, BOOL_T printVert)
// draw grade line
DrawLine(D, pl, pt, lw*2, (profElem(inx).defined ? profileColorDefinedProfile :
- profileColorUndefinedProfile));
- // draw the markers
- DrawArc(D, pt, 0.05, 0, 360, TRUE, 2, wDrawColorGrey40);
-
- if (profElem(inx).dist > 0.1) {
- grade = fabs(profElem(inx).elev-profElem(inx-1).elev)/
- (profElem(inx).dist-profElem(inx-1).dist);
- sprintf(message, "%0.1f%%", round(grade*1000.0)/10.0);
- DrawTextSize(&mainD, message, fp, fontSize, FALSE, &textsize);
- pl.x = (points(inx).x+points(inx-1).x)/2.0;
- pl.y = (points(inx).y+points(inx-1).y)/2.0;
- if (printVert) {
- pl.x += (LABELH/2)/prof.scaleX*D->scale;
- pl.y += ((LABELH/2)*grade/prof.scaleX + 2.0/mainD.dpi/prof.scaleY)*D->scale;
- DrawString(D, pl, 270.0, message, fp, fontSize*D->scale, borderColor);
- } else {
- pl.x -= (textsize.x/2)/prof.scaleX*D->scale;
- pl.y += (textsize.x/2)*grade/prof.scaleX*D->scale;
- DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
- }
- }
- if (units==UNITS_ENGLISH) {
- if (prof.totalD > 240) {
- sprintf(message, "%0.1f'", (round((profElem(inx).dist/12.0)*10.0)/10.0));
- } else {
- sprintf(message, "%d'%0.1f\"", (int)floor((profElem(inx).dist)/12.0),
- round(fmod(profElem(inx).dist,12.0)*10.0)/10.0);
- }
- } else {
- if (PutDim(prof.totalD) > 10000) {
- sprintf(message, "%0.1fm", (round(PutDim(profElem(inx).dist)/10.0)/10.0));
- } else if (PutDim(prof.totalD) > 100) {
- sprintf(message, "%0.2fm", (round(PutDim(profElem(inx).dist))/100.0));
- } else {
- sprintf(message, "%0.1fcm", round(PutDim(profElem(inx).dist)+0.5));
- }
- }
- DrawTextSize(&mainD, message, fp, fontSize, FALSE, &textsize);
- pl.x = pb.x-(textsize.x/2)/prof.scaleX*D->scale;
- pl.y = prof.minE-(LABELH+3.0/mainD.dpi)/prof.scaleY*D->scale;
- DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
- sprintf(message, "%0.1f", round(PutDim(profElem(inx).elev)*100.0)/100.0);
- if (printVert) {
- pl.x = pt.x + LABELH/2.0/prof.scaleX*D->scale;
- pl.y = pt.y + 2.0/mainD.dpi/prof.scaleY*D->scale+GetDim(prof.incrC) / 16;
- DrawString(D, pl, 270.0, message, fp, fontSize*D->scale, borderColor);
- } else {
- pl.x = pt.x + 2.0/mainD.dpi/prof.scaleX*D->scale + GetDim(prof.incrC) / 16;
- pl.y = pt.y;
- if (inx != profElem_da.cnt-1 && profElem(inx).elev < profElem(inx+1).elev) {
- pl.y -= LABELH/prof.scaleY*D->scale;
- }
- DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
- }
- pl = pt;
- }
+ profileColorUndefinedProfile));
+ // draw the markers
+ DrawArc(D, pt, 0.05, 0, 360, TRUE, 2, wDrawColorGrey40);
+
+ if (profElem(inx).dist > 0.1) {
+ grade = fabs(profElem(inx).elev-profElem(inx-1).elev)/
+ (profElem(inx).dist-profElem(inx-1).dist);
+ sprintf(message, "%0.1f%%", round(grade*1000.0)/10.0);
+ DrawTextSize(&mainD, message, fp, fontSize, FALSE, &textsize);
+ pl.x = (points(inx).x+points(inx-1).x)/2.0;
+ pl.y = (points(inx).y+points(inx-1).y)/2.0;
+ if (printVert) {
+ pl.x += (LABELH/2)/prof.scaleX*D->scale;
+ pl.y += ((LABELH/2)*grade/prof.scaleX + 2.0/mainD.dpi/prof.scaleY)*D->scale;
+ DrawString(D, pl, 270.0, message, fp, fontSize*D->scale, borderColor);
+ } else {
+ pl.x -= (textsize.x/2)/prof.scaleX*D->scale;
+ pl.y += (textsize.x/2)*grade/prof.scaleX*D->scale;
+ DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
+ }
+ }
+ if (units==UNITS_ENGLISH) {
+ if (prof.totalD > 240) {
+ sprintf(message, "%0.1f'", (round((profElem(inx).dist/12.0)*10.0)/10.0));
+ } else {
+ sprintf(message, "%d'%0.1f\"", (int)floor((profElem(inx).dist)/12.0),
+ round(fmod(profElem(inx).dist,12.0)*10.0)/10.0);
+ }
+ } else {
+ if (PutDim(prof.totalD) > 10000) {
+ sprintf(message, "%0.1fm", (round(PutDim(profElem(inx).dist)/10.0)/10.0));
+ } else if (PutDim(prof.totalD) > 100) {
+ sprintf(message, "%0.2fm", (round(PutDim(profElem(inx).dist))/100.0));
+ } else {
+ sprintf(message, "%0.1fcm", round(PutDim(profElem(inx).dist)+0.5));
+ }
+ }
+ DrawTextSize(&mainD, message, fp, fontSize, FALSE, &textsize);
+ pl.x = pb.x-(textsize.x/2)/prof.scaleX*D->scale;
+ pl.y = prof.minE-(LABELH+3.0/mainD.dpi)/prof.scaleY*D->scale;
+ DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
+ sprintf(message, "%0.1f", round(PutDim(profElem(inx).elev)*100.0)/100.0);
+ if (printVert) {
+ pl.x = pt.x + LABELH/2.0/prof.scaleX*D->scale;
+ pl.y = pt.y + 2.0/mainD.dpi/prof.scaleY*D->scale+GetDim(prof.incrC) / 16;
+ DrawString(D, pl, 270.0, message, fp, fontSize*D->scale, borderColor);
+ } else {
+ pl.x = pt.x + 2.0/mainD.dpi/prof.scaleX*D->scale + GetDim(prof.incrC) / 16;
+ pl.y = pt.y;
+ if (inx != profElem_da.cnt-1 && profElem(inx).elev < profElem(inx+1).elev) {
+ pl.y -= LABELH/prof.scaleY*D->scale;
+ }
+ DrawString(D, pl, 0.0, message, fp, fontSize*D->scale, borderColor);
+ }
+ pl = pt;
+ }
}
-static void ProfilePix2CoOrd(drawCmd_p, wPos_t, wPos_t, coOrd *);
-static void ProfileCoOrd2Pix(drawCmd_p, coOrd, wPos_t*, wPos_t*);
+static void ProfilePix2CoOrd(drawCmd_p, wDrawPix_t, wDrawPix_t, coOrd *);
+static void ProfileCoOrd2Pix(drawCmd_p, coOrd, wDrawPix_t*, wDrawPix_t*);
static drawCmd_t screenProfileD = {
- NULL,
- &screenDrawFuncs,
+ NULL,
+ &screenDrawFuncs,
DC_NOCLIP,
- 1.0,
- 0.0,
- {0.0,0.0}, {0.0,0.0},
- ProfilePix2CoOrd, ProfileCoOrd2Pix
+ 1.0,
+ 0.0,
+ {0.0,0.0}, {0.0,0.0},
+ ProfilePix2CoOrd, ProfileCoOrd2Pix
};
static void ProfilePix2CoOrd(
- drawCmd_p d,
- wPos_t xx,
- wPos_t yy,
- coOrd * pos)
+ drawCmd_p d,
+ wDrawPix_t xx,
+ wDrawPix_t yy,
+ coOrd * pos)
{
- pos->x = (xx/d->dpi+d->orig.x)/prof.scaleX;
- pos->y = (yy/d->dpi+d->orig.y)/prof.scaleY+prof.minE;
+ pos->x = (xx/d->dpi+d->orig.x)/prof.scaleX;
+ pos->y = (yy/d->dpi+d->orig.y)/prof.scaleY+prof.minE;
}
static void ProfileCoOrd2Pix(
- drawCmd_p d,
- coOrd pos,
- wPos_t *xx,
- wPos_t *yy)
+ drawCmd_p d,
+ coOrd pos,
+ wDrawPix_t *xx,
+ wDrawPix_t *yy)
{
- wPos_t x, y;
- x = (wPos_t)((((pos.x*prof.scaleX)/d->scale-d->orig.x)*d->dpi+0.5));
- y = (wPos_t)(((((pos.y-prof.minE)*prof.scaleY)/d->scale-d->orig.y)*d->dpi+0.5));
- if (d->angle == 0) {
- *xx = x;
- *yy = y;
- } else if (d->angle == -90.0) {
- /* L->P */
- *xx = y;
- *yy = -x;
- } else {
- /* P->L */
- *xx = -y;
- *yy = x;
- }
+ wDrawPix_t x, y;
+ x = ((((pos.x*prof.scaleX)/d->scale-d->orig.x)*d->dpi+0.5));
+ y = (((((pos.y-prof.minE)*prof.scaleY)/d->scale-d->orig.y)*d->dpi+0.5));
+ if (d->angle == 0) {
+ *xx = x;
+ *yy = y;
+ } else if (d->angle == -90.0) {
+ /* L->P */
+ *xx = y;
+ *yy = -x;
+ } else {
+ /* P->L */
+ *xx = -y;
+ *yy = x;
+ }
}
-/**
- * Redraw profile window
+/**
+ * Redraw profile window
*/
-static void RedrawProfileW(void)
+static void RedrawProfileW( wDraw_p d, void * context, wWinPix_t x,
+ wWinPix_t y )
{
- wPos_t ww, hh;
- coOrd size;
- int divC;
- DIST_T maxE, rngE;
- profElem_t *p;
- wFont_p fp;
- POS_T w;
- coOrd textsize;
- char *pTestString;
-
- wDrawDelayUpdate(screenProfileD.d, TRUE);
+ wWinPix_t ww, hh;
+ coOrd size;
+ int divC;
+ DIST_T maxE, rngE;
+ profElem_t *p;
+ wFont_p fp;
+ POS_T w;
+ coOrd textsize;
+ char *pTestString;
+
+ wDrawDelayUpdate(screenProfileD.d, TRUE);
wDrawClear(screenProfileD.d);
// get the size of the window area in pixels and convert to inches
- wDrawGetSize(screenProfileD.d, &ww, &hh);
- screenProfileD.size.x = (ww)/screenProfileD.dpi;
- screenProfileD.size.y = (hh)/screenProfileD.dpi;
+ wDrawGetSize(screenProfileD.d, &ww, &hh);
+ screenProfileD.size.x = (ww)/screenProfileD.dpi;
+ screenProfileD.size.y = (hh)/screenProfileD.dpi;
// calculate positions for labels???
fp = wStandardFont(F_HELV, FALSE, FALSE);
screenProfileD.orig.x = -PBL(screenProfileFontSize);
- screenProfileD.orig.y = -PBB(screenProfileFontSize);
-
- /* Calculate usable dimension of canvas in inches */
- size = screenProfileD.size;
- size.x -= (PBL(screenProfileFontSize));
- size.y -= (PBB(screenProfileFontSize));
-
- /* make sure there is enough space to show the rightmost coordinate value*/
- if (units == UNITS_ENGLISH) {
- if (prof.totalD > 240.0) {
- pTestString = "9999'";
- } else {
- pTestString = "999'11\"";
- }
- } else {
- if (PutDim(prof.totalD) > 10000.0) {
- pTestString = "999m";
- } else {
- if (PutDim(prof.totalD) > 100.0) {
- pTestString = "99.9m";
- } else {
- pTestString = "9.99m";
- }
- }
- }
- DrawTextSize(&mainD, pTestString, fp, screenProfileFontSize, FALSE, &textsize);
- size.x -= textsize.x / 2;
- size.y -= textsize.y * 1.5 ;
+ screenProfileD.orig.y = -PBB(screenProfileFontSize);
+
+ /* Calculate usable dimension of canvas in inches */
+ size = screenProfileD.size;
+ size.x -= (PBL(screenProfileFontSize));
+ size.y -= (PBB(screenProfileFontSize));
+
+ /* make sure there is enough space to show the rightmost coordinate value*/
+ if (units == UNITS_ENGLISH) {
+ if (prof.totalD > 240.0) {
+ pTestString = "9999'";
+ } else {
+ pTestString = "999'11\"";
+ }
+ } else {
+ if (PutDim(prof.totalD) > 10000.0) {
+ pTestString = "999m";
+ } else {
+ if (PutDim(prof.totalD) > 100.0) {
+ pTestString = "99.9m";
+ } else {
+ pTestString = "9.99m";
+ }
+ }
+ }
+ DrawTextSize(&mainD, pTestString, fp, screenProfileFontSize, FALSE, &textsize);
+ size.x -= textsize.x / 2;
+ size.y -= textsize.y * 1.5 ;
// now we have the size of the profile area
#ifdef WINDOWS
- if (printVert) {
- size.x -= PBR(screenProfileFontSize)/4.0;
- size.y -= PBT;
- } else
+ if (printVert) {
+ size.x -= PBR(screenProfileFontSize)/4.0;
+ size.y -= PBT;
+ } else
#endif
- {
- size.x -= PBR(screenProfileFontSize);
- size.y -= PBT;
- }
-
- if (size.x < 0.1 || size.y < 0.1) {
- wDrawDelayUpdate(screenProfileD.d, FALSE);
- return;
- }
-
- /* Calculate range of data values */
- if (profElem_da.cnt<=0) {
- prof.totalD = 0.0;
- prof.minE = 0.0;
- maxE = 1.0;
- } else {
- maxE = prof.minE = profElem(0).elev;
- prof.totalD = profElem(profElem_da.cnt-1).dist;
- for (int inx=1; inx<profElem_da.cnt; inx++) {
- p = &profElem(inx);
- if (p->elev<prof.minE) {
- prof.minE = p->elev;
- }
- if (p->elev>maxE) {
- maxE = p->elev;
- }
- }
- }
-
- /* Calculate number of grid lines */
- prof.minC = (int)floor(PutDim(prof.minE));
- prof.maxC = (int)ceil(PutDim(maxE));
- if (prof.maxC-prof.minC <= 0) {
- prof.maxC = prof.minC+1;
- }
- divC = (int)floor(size.y/labelH);
- if (divC < 1) {
- divC = 1;
- }
- prof.incrC = (prof.maxC-prof.minC+divC-1)/divC;
- if (prof.incrC < 1) {
- prof.incrC = 1;
- }
- prof.maxC = prof.minC + (prof.maxC-prof.minC+prof.incrC-1)/prof.incrC *
- prof.incrC;
-
- /* Reset bounds based on intergal values */
- prof.minE = GetDim(prof.minC);
- rngE = GetDim(prof.maxC) - prof.minE;
- if (rngE < 1.0) {
- rngE = 1.0;
- }
-
- /* Compute vert scale */
- prof.scaleY = size.y/rngE;
- sprintf(message, "%0.2f", maxE);
-
- DrawTextSize(&mainD, message, fp, screenProfileFontSize, FALSE, &textsize);
- w = textsize.x;
- w -= PBT;
- w += 4.0/screenProfileD.dpi;
- w -= (GetDim(prof.maxC)-maxE)*prof.scaleY;
- if (w > 0) {
- size.y -= w;
- prof.scaleY = size.y/rngE;
- }
-
- /* Compute horz scale */
- if (prof.totalD <= 0.1) {
- prof.totalD = size.x;
- }
- prof.scaleX = size.x/prof.totalD;
-
- DrawProfile(&screenProfileD, screenProfileFontSize,
+ {
+ size.x -= PBR(screenProfileFontSize);
+ size.y -= PBT;
+ }
+
+ if (size.x < 0.1 || size.y < 0.1) {
+ wDrawDelayUpdate(screenProfileD.d, FALSE);
+ return;
+ }
+
+ /* Calculate range of data values */
+ if (profElem_da.cnt<=0) {
+ prof.totalD = 0.0;
+ prof.minE = 0.0;
+ maxE = 1.0;
+ } else {
+ maxE = prof.minE = profElem(0).elev;
+ prof.totalD = profElem(profElem_da.cnt-1).dist;
+ for (int inx=1; inx<profElem_da.cnt; inx++) {
+ p = &profElem(inx);
+ if (p->elev<prof.minE) {
+ prof.minE = p->elev;
+ }
+ if (p->elev>maxE) {
+ maxE = p->elev;
+ }
+ }
+ }
+
+ /* Calculate number of grid lines */
+ prof.minC = (int)floor(PutDim(prof.minE));
+ prof.maxC = (int)ceil(PutDim(maxE));
+ if (prof.maxC-prof.minC <= 0) {
+ prof.maxC = prof.minC+1;
+ }
+ divC = (int)floor(size.y/labelH);
+ if (divC < 1) {
+ divC = 1;
+ }
+ prof.incrC = (prof.maxC-prof.minC+divC-1)/divC;
+ if (prof.incrC < 1) {
+ prof.incrC = 1;
+ }
+ prof.maxC = prof.minC + (prof.maxC-prof.minC+prof.incrC-1)/prof.incrC *
+ prof.incrC;
+
+ /* Reset bounds based on intergal values */
+ prof.minE = GetDim(prof.minC);
+ rngE = GetDim(prof.maxC) - prof.minE;
+ if (rngE < 1.0) {
+ rngE = 1.0;
+ }
+
+ /* Compute vert scale */
+ prof.scaleY = size.y/rngE;
+ sprintf(message, "%0.2f", maxE);
+
+ DrawTextSize(&mainD, message, fp, screenProfileFontSize, FALSE, &textsize);
+ w = textsize.x;
+ w -= PBT;
+ w += 4.0/screenProfileD.dpi;
+ w -= (GetDim(prof.maxC)-maxE)*prof.scaleY;
+ if (w > 0) {
+ size.y -= w;
+ prof.scaleY = size.y/rngE;
+ }
+
+ /* Compute horz scale */
+ if (prof.totalD <= 0.1) {
+ prof.totalD = size.x;
+ }
+ prof.scaleX = size.x/prof.totalD;
+
+ DrawProfile(&screenProfileD, screenProfileFontSize,
#ifdef WINDOWS
- printVert
+ printVert
#else
- FALSE
+ FALSE
#endif
- );
- wDrawDelayUpdate(screenProfileD.d, FALSE);
+ );
+ wDrawDelayUpdate(screenProfileD.d, FALSE);
}
static drawCmd_t printProfileD = {
- NULL,
- &printDrawFuncs,
+ NULL,
+ &printDrawFuncs,
DC_PRINT | DC_NOCLIP,
- 1.0,
- 0.0,
- {0.0,0.0}, {1.0,1.0},
- ProfilePix2CoOrd, ProfileCoOrd2Pix
+ 1.0,
+ 0.0,
+ {0.0,0.0}, {1.0,1.0},
+ ProfilePix2CoOrd, ProfileCoOrd2Pix
};
/**
@@ -604,86 +598,83 @@ static drawCmd_t printProfileD = {
static void DoProfilePrint(void * junk)
{
- coOrd size, p[4];
- int copies;
- WDOUBLE_T w, h, screenRatio, printRatio, titleH;
- wFont_p fp;
- coOrd screenSize;
- coOrd textsize;
-
- if (!wPrintDocStart(_("Profile"), 1, &copies)) {
- return;
- }
- printProfileD.d = wPrintPageStart();
- if (printProfileD.d == NULL) {
- return;
- }
- printProfileD.dpi = wDrawGetDPI(printProfileD.d);
- wPrintGetPageSize(&w, &h);
- printProfileD.orig.x = -PBL(printProfileFontSize);
- printProfileD.orig.y = -PBB(printProfileFontSize);
- printProfileD.angle = 0.0;
- screenRatio = screenProfileD.size.y/screenProfileD.size.x;
- screenSize.x = prof.totalD*prof.scaleX;
- screenSize.y = GetDim(prof.maxC-prof.minC)*prof.scaleY;
- screenRatio = screenSize.y/screenSize.x;
- printProfileD.size.x = w;
- printProfileD.size.y = h;
- sprintf(message, _("%s Profile: %s"), sProdName, GetLayoutTitle());
- fp = wStandardFont(F_TIMES, FALSE, FALSE);
- DrawTextSize(&mainD, message, fp, 24, FALSE, &textsize);
- titleH = textsize.y + 6.0/mainD.dpi;
- if (screenRatio < 1.0 && w < h) {
- /* Landscape -> Portrait */
- printProfileD.angle = -90.0;
- printProfileD.orig.x += h;
- size.x = h;
- size.y = w;
- } else if (screenRatio > 1.0 && w > h) {
- /* Portrait -> Landscape */
- printProfileD.angle = 90.0;
- printProfileD.orig.y += w;
- size.x = h;
- size.y = w;
- } else {
- size.x = w;
- size.y = h;
- }
- size.y -= titleH+(printVert?PBT*2:PBT)+PBB(printProfileFontSize);
- size.x -= 4.0/mainD.dpi+PBL(printProfileFontSize)+(printVert?PBR(
- printProfileFontSize)/4.0:PBR(printProfileFontSize));
- printRatio = size.y/size.x;
- if (printRatio < screenRatio) {
- printProfileD.scale = screenSize.y/size.y;
- size.x = screenSize.x/printProfileD.scale;
- } else {
- printProfileD.scale = screenSize.x/size.x;
- printProfileD.orig.y -= size.y;
- size.y = screenSize.y/printProfileD.scale;
- printProfileD.orig.y += size.y;
- }
+ coOrd size, p[4];
+ int copies;
+ WDOUBLE_T w, h, screenRatio, printRatio, titleH;
+ wFont_p fp;
+ coOrd screenSize;
+ coOrd textsize;
+
+ if (!wPrintDocStart(_("Profile"), 1, &copies)) {
+ return;
+ }
+ printProfileD.d = wPrintPageStart();
+ if (printProfileD.d == NULL) {
+ return;
+ }
+ printProfileD.dpi = wDrawGetDPI(printProfileD.d);
+ wPrintGetPageSize(&w, &h);
+ printProfileD.orig.x = -PBL(printProfileFontSize);
+ printProfileD.orig.y = -PBB(printProfileFontSize);
+ printProfileD.angle = 0.0;
+ screenRatio = screenProfileD.size.y/screenProfileD.size.x;
+ screenSize.x = prof.totalD*prof.scaleX;
+ screenSize.y = GetDim(prof.maxC-prof.minC)*prof.scaleY;
+ screenRatio = screenSize.y/screenSize.x;
+ printProfileD.size.x = w;
+ printProfileD.size.y = h;
+ sprintf(message, _("%s Profile: %s"), sProdName, GetLayoutTitle());
+ fp = wStandardFont(F_TIMES, FALSE, FALSE);
+ DrawTextSize(&mainD, message, fp, 24, FALSE, &textsize);
+ titleH = textsize.y + 6.0/mainD.dpi;
+ if (screenRatio < 1.0 && w < h) {
+ /* Landscape -> Portrait */
+ printProfileD.angle = -90.0;
+ printProfileD.orig.x += h;
+ size.x = h;
+ size.y = w;
+ } else if (screenRatio > 1.0 && w > h) {
+ /* Portrait -> Landscape */
+ printProfileD.angle = 90.0;
+ printProfileD.orig.y += w;
+ size.x = h;
+ size.y = w;
+ } else {
+ size.x = w;
+ size.y = h;
+ }
+ size.y -= titleH+(printVert?PBT*2:PBT)+PBB(printProfileFontSize);
+ size.x -= 4.0/mainD.dpi+PBL(printProfileFontSize)+(printVert?PBR(
+ printProfileFontSize)/4.0:PBR(printProfileFontSize));
+ printRatio = size.y/size.x;
+ if (printRatio < screenRatio) {
+ printProfileD.scale = screenSize.y/size.y;
+ size.x = screenSize.x/printProfileD.scale;
+ } else {
+ printProfileD.scale = screenSize.x/size.x;
+ printProfileD.orig.y -= size.y;
+ size.y = screenSize.y/printProfileD.scale;
+ printProfileD.orig.y += size.y;
+ }
#define PRINT_ABS2PAGEX(X) (((X)*printProfileD.scale)/prof.scaleX)
#define PRINT_ABS2PAGEY(Y) (((Y)*printProfileD.scale)/prof.scaleY+prof.minE)
- p[0].y = PRINT_ABS2PAGEY(size.y+(printVert?PBT*2:PBT)+0.05);
- p[0].x = PRINT_ABS2PAGEX((size.x-textsize.x)/2.0);
- if (p[0].x < 0) {
- p[0].x = 0;
- }
- DrawString(&printProfileD, p[0], 0, message, fp, 24*printProfileD.scale,
- borderColor);
- p[0].x = p[3].x = PRINT_ABS2PAGEX((-PBL(printProfileFontSize))+2.0/mainD.dpi);
- p[0].y = p[1].y = PRINT_ABS2PAGEY(-PBB(printProfileFontSize));
- p[1].x = p[2].x = PRINT_ABS2PAGEX(size.x+(printVert?PBR(
- printProfileFontSize)/4.0:PBR(printProfileFontSize)));
- p[2].y = p[3].y = PRINT_ABS2PAGEY(size.y+(printVert?PBT*2:PBT));
- DrawLine(&printProfileD, p[0], p[1], 0, drawColorBlack);
- DrawLine(&printProfileD, p[1], p[2], 0, drawColorBlack);
- DrawLine(&printProfileD, p[2], p[3], 0, drawColorBlack);
- DrawLine(&printProfileD, p[3], p[0], 0, drawColorBlack);
-
- DrawProfile(&printProfileD, printProfileFontSize, printVert);
- wPrintPageEnd(printProfileD.d);
- wPrintDocEnd();
+ p[0].y = PRINT_ABS2PAGEY(size.y+(printVert?PBT*2:PBT)+0.05);
+ p[0].x = PRINT_ABS2PAGEX((size.x-textsize.x)/2.0);
+ if (p[0].x < 0) {
+ p[0].x = 0;
+ }
+ DrawString(&printProfileD, p[0], 0, message, fp, 24*printProfileD.scale,
+ borderColor);
+ p[0].x = p[3].x = PRINT_ABS2PAGEX((-PBL(printProfileFontSize))+2.0/mainD.dpi);
+ p[0].y = p[1].y = PRINT_ABS2PAGEY(-PBB(printProfileFontSize));
+ p[1].x = p[2].x = PRINT_ABS2PAGEX(size.x+(printVert?PBR(
+ printProfileFontSize)/4.0:PBR(printProfileFontSize)));
+ p[2].y = p[3].y = PRINT_ABS2PAGEY(size.y+(printVert?PBT*2:PBT));
+ DrawPoly( &printProfileD, 4, p, NULL, drawColorBlack, 0, DRAW_CLOSED );
+
+ DrawProfile(&printProfileD, printProfileFontSize, printVert);
+ wPrintPageEnd(printProfileD.d);
+ wPrintDocEnd();
}
/**************************************************************************
@@ -697,28 +688,28 @@ static wWin_p profileW;
static BOOL_T profileUndo = FALSE;
static void DoProfileChange(void *junk);
static void DoProfileReset(void *junk);
-static void DoProfileDone(void *);
-static void DoProfileClear(void *);
-static void DoProfilePrint(void *);
-static void DoProfileChangeMode(void *);
+static void DoProfileDone(void * junk);
+static void DoProfileClear(void * junk);
+static void DoProfilePrint(void * junk);
+static void DoProfileChangeMode(void * junk);
static void SelProfileW(wIndex_t, coOrd);
static void CloseProfileWindow(paramGroup_p pg, int event, void *data);
-static paramDrawData_t profileDrawData = { 300, 150, (wDrawRedrawCallBack_p)RedrawProfileW, SelProfileW, &screenProfileD };
+static paramDrawData_t profileDrawData = { 300, 150, RedrawProfileW, SelProfileW, &screenProfileD };
static paramData_t profilePLs[] = {
- { PD_DRAW, NULL, "canvas", PDO_DLGRESIZE, &profileDrawData },
+ { PD_DRAW, NULL, "canvas", PDO_DLGRESIZE, &profileDrawData },
#define I_PROFILEMSG (1)
- { PD_MESSAGE, NULL, NULL, PDO_DLGIGNOREX, (void*)300 },
+ { PD_MESSAGE, NULL, NULL, PDO_DLGIGNOREX, I2VP(300) },
#define I_CHANGEBUTTON 2
- { PD_BUTTON, (void*)DoProfileChange, "change", PDO_DLGCMDBUTTON, NULL, N_("Change") },
+ { PD_BUTTON, DoProfileChange, "change", PDO_DLGCMDBUTTON, NULL, N_("Change") },
#define I_RESETBUTTON 3
- { PD_BUTTON, (void*)DoProfileReset, "reset", PDO_DLGCMDBUTTON, NULL, N_("Reset") },
+ { PD_BUTTON, DoProfileReset, "reset", PDO_DLGCMDBUTTON, NULL, N_("Reset") },
#define I_CLEARBUTTON 4
- { PD_BUTTON, (void*)DoProfileClear, "clear", PDO_DLGCMDBUTTON, NULL, N_("Clear") },
+ { PD_BUTTON, DoProfileClear, "clear", PDO_DLGCMDBUTTON, NULL, N_("Clear") },
#define I_PRINTBUTTON 5
- { PD_BUTTON, (void*)DoProfilePrint, "print", 0, NULL, N_("Print") }
+ { PD_BUTTON, DoProfilePrint, "print", 0, NULL, N_("Print") }
};
-static paramGroup_t profilePG = { "profile", 0, profilePLs, sizeof profilePLs/sizeof profilePLs[0] };
+static paramGroup_t profilePG = { "profile", 0, profilePLs, COUNT( profilePLs ) };
#define CHANGEBUTTON ((wButton_p)profilePLs[I_CHANGEBUTTON].control)
#define RESETBUTTON ((wButton_p)profilePLs[I_RESETBUTTON].control)
@@ -726,94 +717,97 @@ static paramGroup_t profilePG = { "profile", 0, profilePLs, sizeof profilePLs/si
#define PRINTBUTTON ((wButton_p)profilePLs[I_PRINTBUTTON].control)
static void SelProfileW(
- wIndex_t action,
- coOrd pos)
+ wIndex_t action,
+ coOrd pos)
{
- DIST_T dist;
- static DIST_T oldElev;
- static int inx;
- DIST_T elev;
-
- if (profElem_da.cnt <= 0) {
- return;
- }
-
- dist = pos.x;
- elev = pos.y;
-
- switch (action&0xFF) {
- case C_DOWN:
- for (inx=0; inx<profElem_da.cnt; inx++) {
- if (dist <= profElem(inx).dist) {
- if (inx!=0 && profElem(inx).dist-dist > dist-profElem(inx-1).dist) {
- inx--;
- }
- break;
- }
- }
- if (inx >= profElem_da.cnt) {
- inx = profElem_da.cnt-1;
- }
- sprintf(message, _("Elev = %0.1f"), round(PutDim(elev)*10.0)/10.0);
- ParamLoadMessage(&profilePG, I_PROFILEMSG, message);
- oldElev = elev;
- RedrawProfileW();
- break;
- case C_MOVE:
- if (inx < 0) {
- break;
- }
- if (profElem_da.cnt == 1) {
- sprintf(message, _("Elev = %0.1f"), round(PutDim(elev)*10.0)/10.0);
- } else if (inx == 0) {
- sprintf(message, _("Elev=%0.2f %0.1f%%"),
- round(PutDim(elev)*100.0)/100.0,
- round(fabs(((profElem(inx+1).elev-elev) / (profElem(inx+1).dist-profElem(
- inx).dist)) * 1000.0))/10.0);
- } else if (inx == profElem_da.cnt-1) {
- sprintf(message, _("%0.1f%% Elev = %0.2f"),
- round(fabs(((profElem(inx-1).elev-elev) / (profElem(inx).dist-profElem(
- inx-1).dist)) * 1000.0))/10.0,
- round(PutDim(elev)*100.0)/100.0);
- } else {
- sprintf(message, _("%0.1f%% Elev = %0.2f %0.1f%%"),
- round(fabs(((profElem(inx-1).elev-elev) / (profElem(inx).dist-profElem(
- inx-1).dist)) * 1000.0))/10.0,
- round(PutDim(elev)*100.0)/100.0,
- round(fabs((profElem(inx+1).elev-elev) / (profElem(inx+1).dist-profElem(
- inx).dist)) * 1000.0)/10.0);
- }
- ParamLoadMessage(&profilePG, I_PROFILEMSG, message);
- oldElev = elev;
- profElem(inx).elev = oldElev;
- RedrawProfileW();
+ DIST_T dist;
+ static DIST_T oldElev;
+ static int inx;
+ DIST_T elev;
+
+ if (profElem_da.cnt <= 0) {
+ return;
+ }
+
+ dist = pos.x;
+ elev = pos.y;
+
+ switch (action&0xFF) {
+ case C_START:
+ profileUndo = FALSE;
+ break;
+ case C_DOWN:
+ for (inx=0; inx<profElem_da.cnt; inx++) {
+ if (dist <= profElem(inx).dist) {
+ if (inx!=0 && profElem(inx).dist-dist > dist-profElem(inx-1).dist) {
+ inx--;
+ }
+ break;
+ }
+ }
+ if (inx >= profElem_da.cnt) {
+ inx = profElem_da.cnt-1;
+ }
+ sprintf(message, _("Elev = %0.1f"), round(PutDim(elev)*10.0)/10.0);
+ ParamLoadMessage(&profilePG, I_PROFILEMSG, message);
+ oldElev = elev;
+ RedrawProfileW( screenProfileD.d, NULL, 0, 0 );
+ break;
+ case C_MOVE:
+ if (inx < 0) {
+ break;
+ }
+ if (profElem_da.cnt == 1) {
+ sprintf(message, _("Elev = %0.1f"), round(PutDim(elev)*10.0)/10.0);
+ } else if (inx == 0) {
+ sprintf(message, _("Elev=%0.2f %0.1f%%"),
+ round(PutDim(elev)*100.0)/100.0,
+ round(fabs(((profElem(inx+1).elev-elev) / (profElem(inx+1).dist-profElem(
+ inx).dist)) * 1000.0))/10.0);
+ } else if (inx == profElem_da.cnt-1) {
+ sprintf(message, _("%0.1f%% Elev = %0.2f"),
+ round(fabs(((profElem(inx-1).elev-elev) / (profElem(inx).dist-profElem(
+ inx-1).dist)) * 1000.0))/10.0,
+ round(PutDim(elev)*100.0)/100.0);
+ } else {
+ sprintf(message, _("%0.1f%% Elev = %0.2f %0.1f%%"),
+ round(fabs(((profElem(inx-1).elev-elev) / (profElem(inx).dist-profElem(
+ inx-1).dist)) * 1000.0))/10.0,
+ round(PutDim(elev)*100.0)/100.0,
+ round(fabs((profElem(inx+1).elev-elev) / (profElem(inx+1).dist-profElem(
+ inx).dist)) * 1000.0)/10.0);
+ }
+ ParamLoadMessage(&profilePG, I_PROFILEMSG, message);
+ oldElev = elev;
+ profElem(inx).elev = oldElev;
+ RedrawProfileW( screenProfileD.d, NULL, 0, 0 );
wPause(500l);
break;
- case C_UP:
- if (profileUndo == FALSE) {
- UndoStart(_("Profile Command"), "Profile - set elevation");
- profileUndo = TRUE;
- }
- if (profElem(inx).trk) {
- UpdateTrkEndElev(profElem(inx).trk, profElem(inx).ep, ELEV_DEF|ELEV_VISIBLE,
- oldElev, NULL);
- }
- profElem(inx).elev = oldElev;
- RedrawProfileW();
- ParamLoadMessage(&profilePG, I_PROFILEMSG, _("Drag to change Elevation"));
- inx = -1;
- break;
- default:
- break;
- }
+ case C_UP:
+ if (profileUndo == FALSE) {
+ UndoStart(_("Profile Command"), "Profile - set elevation");
+ profileUndo = TRUE;
+ }
+ if (profElem(inx).trk) {
+ UpdateTrkEndElev(profElem(inx).trk, profElem(inx).ep, ELEV_DEF|ELEV_VISIBLE,
+ oldElev, NULL);
+ }
+ profElem(inx).elev = oldElev;
+ RedrawProfileW( screenProfileD.d, NULL, 0, 0 );
+ ParamLoadMessage(&profilePG, I_PROFILEMSG, _("Drag to change Elevation"));
+ inx = -1;
+ break;
+ default:
+ break;
+ }
}
static void HilightProfileElevations(BOOL_T show)
{
- /*if ( profElem_da.cnt <= 0 ) {*/
- HilightElevations(show);
- /*} else {
- }*/
+ /*if ( profElem_da.cnt <= 0 ) {*/
+ HilightElevations(show);
+ /*} else {
+ }*/
}
/**
@@ -826,15 +820,15 @@ static void HilightProfileElevations(BOOL_T show)
void
CloseProfileWindow(paramGroup_p pg, int event, void *data)
{
- Reset();
- return;
+ Reset();
+ return;
}
-/**
+/**
* Undo the changes made in the profile window to the layout.
*/
-
+
static void
ResetChanges()
{
@@ -843,7 +837,7 @@ ResetChanges()
profElem(i) = copyOfprofElem[i];
if (profElem(i).trk) {
UpdateTrkEndElev(profElem(i).trk, profElem(i).ep, ELEV_DEF | ELEV_VISIBLE,
- copyOfprofElem[i].elev, NULL);
+ copyOfprofElem[i].elev, NULL);
}
}
}
@@ -864,8 +858,8 @@ DoProfileReset(void *junk)
UndoStart(_("Profile Command"), "Profile");
}
ResetChanges();
- RedrawProfileW();
- TempRedraw();
+ RedrawProfileW( screenProfileD.d, NULL, 0, 0 );
+ TempRedraw();
}
/**
@@ -878,34 +872,34 @@ static void
DoProfileChange(void *junk)
{
DestroyCopyOfProfileElements();
- TempRedraw();
+ TempRedraw();
}
static void DoProfileDone(void * junk)
{
- Reset();
+ Reset();
}
static void DoProfileClear(void * junk)
{
ResetChanges();
- profElem_da.cnt = 0;
- station_da.cnt = 0;
- ClrAllTrkBitsRedraw(TB_PROFILEPATH, TRUE);
- pathStartTrk = pathEndTrk = NULL;
- RedrawProfileW();
+ DYNARR_RESET( profElem_t, profElem_da );
+ DYNARR_RESET( station_t, station_da );
+ ClrAllTrkBitsRedraw(TB_PROFILEPATH, TRUE);
+ pathStartTrk = pathEndTrk = NULL;
+ RedrawProfileW( screenProfileD.d, NULL, 0, 0 );
}
static void DoProfileChangeMode(void * junk)
{
- if (profElem_da.cnt<=0) {
- InfoMessage(_("Select a Defined Elevation to start Profile"));
- } else {
- InfoMessage(_("Select a Defined Elevation to extend Profile"));
- }
+ if (profElem_da.cnt<=0) {
+ InfoMessage(_("Select a Defined Elevation to start Profile"));
+ } else {
+ InfoMessage(_("Select a Defined Elevation to extend Profile"));
+ }
}
/**************************************************************************
@@ -916,15 +910,15 @@ static void DoProfileChangeMode(void * junk)
static BOOL_T PathListEmpty(void)
{
- return pathStartTrk == NULL;
+ return pathStartTrk == NULL;
}
static BOOL_T PathListSingle(void)
{
- return pathStartTrk != NULL &&
- (pathEndTrk == NULL ||
- (GetTrkEndTrk(pathEndTrk,pathEndEp) == pathStartTrk &&
- GetTrkEndTrk(pathStartTrk,pathStartEp) == pathEndTrk));
+ return pathStartTrk != NULL &&
+ (pathEndTrk == NULL ||
+ (GetTrkEndTrk(pathEndTrk,pathEndEp) == pathStartTrk &&
+ GetTrkEndTrk(pathStartTrk,pathStartEp) == pathEndTrk));
}
@@ -932,106 +926,106 @@ static int profileShortestPathMatch;
static DIST_T profileShortestPathDist;
static int ProfileShortestPathFunc(
- SPTF_CMD cmd,
- track_p trk,
- EPINX_T ep,
- EPINX_T ep0,
- DIST_T dist,
- void * data)
+ SPTF_CMD cmd,
+ track_p trk,
+ EPINX_T ep,
+ EPINX_T ep0,
+ DIST_T dist,
+ void * data)
{
- int rc0=0;
- int pathMatch;
-
- switch (cmd) {
- track_p trkN;
- case SPTC_TERMINATE:
- rc0 = 1;
- break;
-
- case SPTC_MATCH:
- if (EndPtIsIgnoredElev(trk,ep)) {
- break;
- }
- if (PathListSingle()) {
- if (trk == pathStartTrk && ep == pathStartEp) {
- pathMatch = 2;
- } else if (trk == pathEndTrk && ep == pathEndEp) {
- pathMatch = 3;
- } else {
- break;
- }
- } else if ((trkN = GetTrkEndTrk(trk,ep)) == NULL) {
- break;
- } else {
- EPINX_T epN;
- epN = GetEndPtConnectedToMe(trkN, trk);
- if (trkN == pathStartTrk && epN == pathStartEp) {
- pathMatch = 1;
- } else if (trkN == pathEndTrk && epN == pathEndEp) {
- pathMatch = 2;
- } else if (trkN == pathStartTrk && trkN == pathEndTrk) {
- pathMatch = 2;
- } else if (trkN == pathStartTrk) {
- pathMatch = 1;
- } else if (trkN == pathEndTrk) {
- pathMatch = 2;
- } else {
- break;
- }
- }
- if (profileShortestPathMatch < 0 || profileShortestPathDist > dist) {
- LOG(log_shortPath, 4, (" Match=%d", pathMatch))
- profileShortestPathMatch = pathMatch;
- profileShortestPathDist = dist;
- }
- rc0 = 1;
- break;
-
- case SPTC_MATCHANY:
- rc0 = -1;
- break;
-
- case SPTC_IGNNXTTRK:
- if (EndPtIsIgnoredElev(trk,ep)) {
- rc0 = 1;
- } else if ((GetTrkBits(trk)&TB_PROFILEPATH)!=0) {
- rc0 = 1;
- } else if ((!EndPtIsDefinedElev(trk,ep)) && GetTrkEndTrk(trk,ep)==NULL) {
- rc0 = 1;
- } else {
- rc0 = 0;
- }
- break;
-
- case SPTC_ADD_TRK:
- if (log_shortPath<=0||
- logTable(log_shortPath).level<4) LOG(log_profile, 4, (" ADD_TRK T%d:%d",
- GetTrkIndex(trk), ep))
- SetTrkBits(trk, TB_PROFILEPATH);
- DrawTrack(trk, &mainD, profilePathColor);
- rc0 = 0;
- break;
-
- case SPTC_VALID:
- rc0 = 1;
- break;
-
- default:
- break;
- }
- return rc0;
+ int rc0=0;
+ int pathMatch;
+
+ switch (cmd) {
+ track_p trkN;
+ case SPTC_TERMINATE:
+ rc0 = 1;
+ break;
+
+ case SPTC_MATCH:
+ if (EndPtIsIgnoredElev(trk,ep)) {
+ break;
+ }
+ if (PathListSingle()) {
+ if (trk == pathStartTrk && ep == pathStartEp) {
+ pathMatch = 2;
+ } else if (trk == pathEndTrk && ep == pathEndEp) {
+ pathMatch = 3;
+ } else {
+ break;
+ }
+ } else if ((trkN = GetTrkEndTrk(trk,ep)) == NULL) {
+ break;
+ } else {
+ EPINX_T epN;
+ epN = GetEndPtConnectedToMe(trkN, trk);
+ if (trkN == pathStartTrk && epN == pathStartEp) {
+ pathMatch = 1;
+ } else if (trkN == pathEndTrk && epN == pathEndEp) {
+ pathMatch = 2;
+ } else if (trkN == pathStartTrk && trkN == pathEndTrk) {
+ pathMatch = 2;
+ } else if (trkN == pathStartTrk) {
+ pathMatch = 1;
+ } else if (trkN == pathEndTrk) {
+ pathMatch = 2;
+ } else {
+ break;
+ }
+ }
+ if (profileShortestPathMatch < 0 || profileShortestPathDist > dist) {
+ LOG(log_shortPath, 4, (" Match=%d", pathMatch))
+ profileShortestPathMatch = pathMatch;
+ profileShortestPathDist = dist;
+ }
+ rc0 = 1;
+ break;
+
+ case SPTC_MATCHANY:
+ rc0 = -1;
+ break;
+
+ case SPTC_IGNNXTTRK:
+ if (EndPtIsIgnoredElev(trk,ep)) {
+ rc0 = 1;
+ } else if ((GetTrkBits(trk)&TB_PROFILEPATH)!=0) {
+ rc0 = 1;
+ } else if ((!EndPtIsDefinedElev(trk,ep)) && GetTrkEndTrk(trk,ep)==NULL) {
+ rc0 = 1;
+ } else {
+ rc0 = 0;
+ }
+ break;
+
+ case SPTC_ADD_TRK:
+ if (log_shortPath<=0||
+ logTable(log_shortPath).level<4) LOG(log_profile, 4, (" ADD_TRK T%d:%d",
+ GetTrkIndex(trk), ep))
+ SetTrkBits(trk, TB_PROFILEPATH);
+ DrawTrack(trk, &mainD, profilePathColor);
+ rc0 = 0;
+ break;
+
+ case SPTC_VALID:
+ rc0 = 1;
+ break;
+
+ default:
+ break;
+ }
+ return rc0;
}
static int FindProfileShortestPath(
- track_p trkN,
- EPINX_T epN)
+ track_p trkN,
+ EPINX_T epN)
{
- LOG(log_profile, 4, ("Searching from T%d:%d to T%d:%d or T%d:%d\n",
- GetTrkIndex(trkN), epN,
- pathStartTrk?GetTrkIndex(pathStartTrk):-1, pathStartTrk?pathStartEp:-1,
- pathEndTrk?GetTrkIndex(pathEndTrk):-1, pathEndTrk?pathEndEp:-1))
- profileShortestPathMatch = -1;
- return FindShortestPath(trkN, epN, TRUE, ProfileShortestPathFunc, NULL);
+ LOG(log_profile, 4, ("Searching from T%d:%d to T%d:%d or T%d:%d\n",
+ GetTrkIndex(trkN), epN,
+ pathStartTrk?GetTrkIndex(pathStartTrk):-1, pathStartTrk?pathStartEp:-1,
+ pathEndTrk?GetTrkIndex(pathEndTrk):-1, pathEndTrk?pathEndEp:-1))
+ profileShortestPathMatch = -1;
+ return FindShortestPath(trkN, epN, TRUE, ProfileShortestPathFunc, NULL);
}
@@ -1048,492 +1042,493 @@ static int FindProfileShortestPath(
#define ONPATH_BRANCH (1<<3)
static int OnPath(track_p trk, EPINX_T ep)
{
- if (GetTrkBits(trk)&TB_PROFILEPATH) {
- track_p trk0;
- trk0 = GetTrkEndTrk(profilePopupTrk, profilePopupEp);
- if (trk0 && (GetTrkBits(trk0)&TB_PROFILEPATH)) {
- return ONPATH_MID;
- }
- if (trk == pathStartTrk && ep == pathStartEp) {
- return ONPATH_END;
- }
- return ONPATH_BRANCH;
- }
- return ONPATH_NOT;
+ if (GetTrkBits(trk)&TB_PROFILEPATH) {
+ track_p trk0;
+ trk0 = GetTrkEndTrk(profilePopupTrk, profilePopupEp);
+ if (trk0 && (GetTrkBits(trk0)&TB_PROFILEPATH)) {
+ return ONPATH_MID;
+ }
+ if (trk == pathStartTrk && ep == pathStartEp) {
+ return ONPATH_END;
+ }
+ return ONPATH_BRANCH;
+ }
+ return ONPATH_NOT;
}
static BOOL_T PathListCheck(void)
{
- track_p trk;
- if (PathListEmpty() || PathListSingle()) {
- return TRUE;
- }
- if (!(GetTrkBits(pathStartTrk)&TB_PROFILEPATH)) {
- ErrorMessage(MSG_PST_NOT_ON_PATH);
- return FALSE;
- }
- if (!(GetTrkBits(pathEndTrk)&TB_PROFILEPATH)) {
- ErrorMessage(MSG_PET_NOT_ON_PATH);
- return FALSE;
- }
- trk = GetTrkEndTrk(pathStartTrk,pathStartEp);
- if (trk && (GetTrkBits(trk)&TB_PROFILEPATH)) {
- ErrorMessage(MSG_INV_PST_ON_PATH);
- return FALSE;
- }
- trk = GetTrkEndTrk(pathEndTrk,pathEndEp);
- if (trk && (GetTrkBits(trk)&TB_PROFILEPATH)) {
- ErrorMessage(MSG_INV_PET_ON_PATH);
- return FALSE;
- }
- return TRUE;
+ track_p trk;
+ if (PathListEmpty() || PathListSingle()) {
+ return TRUE;
+ }
+ if (!(GetTrkBits(pathStartTrk)&TB_PROFILEPATH)) {
+ ErrorMessage(MSG_PST_NOT_ON_PATH);
+ return FALSE;
+ }
+ if (!(GetTrkBits(pathEndTrk)&TB_PROFILEPATH)) {
+ ErrorMessage(MSG_PET_NOT_ON_PATH);
+ return FALSE;
+ }
+ trk = GetTrkEndTrk(pathStartTrk,pathStartEp);
+ if (trk && (GetTrkBits(trk)&TB_PROFILEPATH)) {
+ ErrorMessage(MSG_INV_PST_ON_PATH);
+ return FALSE;
+ }
+ trk = GetTrkEndTrk(pathEndTrk,pathEndEp);
+ if (trk && (GetTrkBits(trk)&TB_PROFILEPATH)) {
+ ErrorMessage(MSG_INV_PET_ON_PATH);
+ return FALSE;
+ }
+ return TRUE;
}
static void RemoveTracksFromPath(
- track_p *Rtrk,
- EPINX_T *Rep,
- track_p trkEnd,
- EPINX_T epEnd)
+ track_p *Rtrk,
+ EPINX_T *Rep,
+ track_p trkEnd,
+ EPINX_T epEnd)
{
- track_p trk = *Rtrk, trkN;
- EPINX_T ep = *Rep;
-
- PASSERT("removeTracksFromPath", trk, NOP);
- PASSERT("removeTracksFromPath", !PathListSingle(), NOP);
- while (1) {
- EPINX_T ep2;
- DrawTrack(trk, &mainD, drawColorWhite);
- ClrTrkBits(trk, TB_PROFILEPATH);
- DrawTrack(trk, &mainD, drawColorBlack);
-
- if (trk == trkEnd) {
- pathStartTrk = trkEnd;
- pathStartEp = epEnd;
- pathEndTrk = GetTrkEndTrk(pathStartTrk,pathStartEp);
- if (pathEndTrk) {
- pathEndEp = GetEndPtConnectedToMe(pathEndTrk,pathStartTrk);
- }
- return;
- }
-
- ep2 = GetNextTrkOnPath(trk, ep);
- PASSERT("removeTracksFromPath", ep2 >= 0,NOP);
- trkN = GetTrkEndTrk(trk,ep2);
- PASSERT("removeTracksFromPath", trkN != NULL, NOP);
- ep = GetEndPtConnectedToMe(trkN,trk);
- trk = trkN;
- if (EndPtIsDefinedElev(trk,ep)) {
- *Rtrk = trk;
- *Rep = ep;
- return;
- }
- }
+ track_p trk = *Rtrk, trkN;
+ EPINX_T ep = *Rep;
+
+ PASSERT("removeTracksFromPath", trk, NOP);
+ PASSERT("removeTracksFromPath", !PathListSingle(), NOP);
+ while (1) {
+ EPINX_T ep2;
+ DrawTrack(trk, &mainD, drawColorWhite);
+ ClrTrkBits(trk, TB_PROFILEPATH);
+ DrawTrack(trk, &mainD, drawColorBlack);
+
+ if (trk == trkEnd) {
+ pathStartTrk = trkEnd;
+ pathStartEp = epEnd;
+ pathEndTrk = GetTrkEndTrk(pathStartTrk,pathStartEp);
+ if (pathEndTrk) {
+ pathEndEp = GetEndPtConnectedToMe(pathEndTrk,pathStartTrk);
+ }
+ return;
+ }
+
+ ep2 = GetNextTrkOnPath(trk, ep);
+ PASSERT("removeTracksFromPath", ep2 >= 0,NOP);
+ trkN = GetTrkEndTrk(trk,ep2);
+ PASSERT("removeTracksFromPath", trkN != NULL, NOP);
+ ep = GetEndPtConnectedToMe(trkN,trk);
+ trk = trkN;
+ if (EndPtIsDefinedElev(trk,ep)) {
+ *Rtrk = trk;
+ *Rep = ep;
+ return;
+ }
+ }
}
static void ChkElev(track_p trk, EPINX_T ep, EPINX_T ep2, DIST_T dist,
BOOL_T * defined)
{
- profElem_p p;
- station_p s;
- EPINX_T epDefElev = -1;
- int mode;
- BOOL_T undefined;
-
- mode = GetTrkEndElevMode(trk, ep);
- if (mode == ELEV_DEF) {
- epDefElev = ep;
- } else if (mode == ELEV_STATION) {
- DYNARR_APPEND(station_t, station_da, 10);
- s = &station(station_da.cnt-1);
- s->dist = dist;
- s->name = GetTrkEndElevStation(trk,ep);
- }
- undefined = FALSE;
- if (epDefElev<0) {
- if ((trk == pathStartTrk && ep == pathStartEp) ||
- (trk == pathEndTrk && ep == pathEndEp)) {
- epDefElev = ep;
- }
- }
- if (epDefElev<0) {
- if (ep == ep2 ||
- GetTrkEndElevMode(trk,ep2) != ELEV_DEF)
- for (EPINX_T ep1=0; ep1<GetTrkEndPtCnt(trk); ep1++) {
- if (ep1==ep || ep1==ep2) {
- continue;
- }
- if (EndPtIsDefinedElev(trk,ep1)) {
- epDefElev = ep1;
- dist -= GetTrkLength(trk, ep, ep1);
- break;
- }
- if (GetTrkEndTrk(trk,ep1)) {
- if (!EndPtIsIgnoredElev(trk,ep1)) {
- undefined = TRUE;
- }
- }
- }
- }
-
- if (epDefElev>=0) {
- DYNARR_APPEND(profElem_t, profElem_da, 10);
- p = &profElem(profElem_da.cnt-1);
- p->trk = trk;
- p->ep = epDefElev;
- p->dist = dist;
- if (GetTrkEndElevMode(trk,epDefElev) == ELEV_DEF) {
- p->elev = GetTrkEndElevHeight(trk,epDefElev);
- } else {
- ComputeElev(trk, epDefElev, TRUE, &p->elev, NULL, TRUE);
- }
- p->defined = *defined;
- *defined = TRUE;
- } else if (undefined) {
- *defined = FALSE;
- }
+ profElem_p p;
+ station_p s;
+ EPINX_T epDefElev = -1;
+ int mode;
+ BOOL_T undefined;
+
+ mode = GetTrkEndElevMode(trk, ep);
+ if (mode == ELEV_DEF) {
+ epDefElev = ep;
+ } else if (mode == ELEV_STATION) {
+ DYNARR_APPEND(station_t, station_da, 10);
+ s = &station(station_da.cnt-1);
+ s->dist = dist;
+ s->name = GetTrkEndElevStation(trk,ep);
+ }
+ undefined = FALSE;
+ if (epDefElev<0) {
+ if ((trk == pathStartTrk && ep == pathStartEp) ||
+ (trk == pathEndTrk && ep == pathEndEp)) {
+ epDefElev = ep;
+ }
+ }
+ if (epDefElev<0) {
+ if (ep == ep2 ||
+ GetTrkEndElevMode(trk,ep2) != ELEV_DEF)
+ for (EPINX_T ep1=0; ep1<GetTrkEndPtCnt(trk); ep1++) {
+ if (ep1==ep || ep1==ep2) {
+ continue;
+ }
+ if (EndPtIsDefinedElev(trk,ep1)) {
+ epDefElev = ep1;
+ dist -= GetTrkLength(trk, ep, ep1);
+ break;
+ }
+ if (GetTrkEndTrk(trk,ep1)) {
+ if (!EndPtIsIgnoredElev(trk,ep1)) {
+ undefined = TRUE;
+ }
+ }
+ }
+ }
+
+ if (epDefElev>=0) {
+ DYNARR_APPEND(profElem_t, profElem_da, 10);
+ p = &profElem(profElem_da.cnt-1);
+ p->trk = trk;
+ p->ep = epDefElev;
+ p->dist = dist;
+ if (GetTrkEndElevMode(trk,epDefElev) == ELEV_DEF) {
+ p->elev = GetTrkEndElevHeight(trk,epDefElev);
+ } else {
+ ComputeElev(trk, epDefElev, TRUE, &p->elev, NULL, TRUE);
+ }
+ p->defined = *defined;
+ *defined = TRUE;
+ } else if (undefined) {
+ *defined = FALSE;
+ }
}
static void ComputeProfElem(void)
{
- track_p trk = pathStartTrk, trkN;
- EPINX_T ep = pathStartEp, ep2;
- BOOL_T go;
- DIST_T dist;
- BOOL_T defined;
-
- profElem_da.cnt = 0;
- station_da.cnt = 0;
- dist = 0;
- defined = TRUE;
- if (PathListEmpty()) {
- return;
- }
- ChkElev(trk, ep, ep, dist, &defined);
- if (PathListSingle()) {
- return;
- }
- go = TRUE;
- while (go) {
- if (trk == pathEndTrk) {
- go = FALSE;
- ep2 = pathEndEp;
- } else {
- ep2 = GetNextTrkOnPath(trk, ep);
- //PASSERT( "computeProfElem", ep2 >= 0, NOP );
- }
- dist += GetTrkLength(trk, ep, ep2);
- ChkElev(trk, ep2, ep, dist, &defined);
- if (!go) {
- break;
- }
- trkN = GetTrkEndTrk(trk,ep2);
- ep = GetEndPtConnectedToMe(trkN,trk);
- trk = trkN;
- }
+ track_p trk = pathStartTrk, trkN;
+ EPINX_T ep = pathStartEp, ep2;
+ BOOL_T go;
+ DIST_T dist;
+ BOOL_T defined;
+
+ DYNARR_RESET( profElem_t, profElem_da );
+ DYNARR_RESET( station_t, station_da );
+ dist = 0;
+ defined = TRUE;
+ if (PathListEmpty()) {
+ return;
+ }
+ ChkElev(trk, ep, ep, dist, &defined);
+ if (PathListSingle()) {
+ return;
+ }
+ go = TRUE;
+ while (go) {
+ if (trk == pathEndTrk) {
+ go = FALSE;
+ ep2 = pathEndEp;
+ } else {
+ ep2 = GetNextTrkOnPath(trk, ep);
+ //PASSERT( "computeProfElem", ep2 >= 0, NOP );
+ }
+ dist += GetTrkLength(trk, ep, ep2);
+ ChkElev(trk, ep2, ep, dist, &defined);
+ if (!go) {
+ break;
+ }
+ trkN = GetTrkEndTrk(trk,ep2);
+ ep = GetEndPtConnectedToMe(trkN,trk);
+ trk = trkN;
+ }
}
static void DumpProfElems(void)
{
- track_p trk, trkN;
- EPINX_T ep;
- BOOL_T go;
-
- trk = pathStartTrk;
- ep = pathStartEp;
-
- if (pathStartTrk==NULL) {
- lprintf("s--:- e--:-");
- } else if (pathEndTrk == NULL) {
- lprintf("sT%d:%d e--:-", GetTrkIndex(pathStartTrk), pathStartEp);
- } else {
- lprintf("sT%d:%d eT%d:%d", GetTrkIndex(pathStartTrk), pathStartEp,
- GetTrkIndex(pathEndTrk), pathEndEp);
- }
- lprintf(" { ");
- go = TRUE;
- if (!PathListSingle())
- while (trk) {
- EPINX_T ep2;
- if (trk==pathEndTrk) {
- ep2 = pathEndEp;
- go = FALSE;
- } else {
- ep2 = GetNextTrkOnPath(trk, ep);
- PASSERT("computeProfElem", ep2 >= 0, NOP);
- }
- lprintf("T%d:%d:%d ", GetTrkIndex(trk), ep, ep2);
- if (!go) {
- break;
- }
- trkN = GetTrkEndTrk(trk,ep2);
- ep = GetEndPtConnectedToMe(trkN,trk);
- trk = trkN;
- }
- lprintf("}");
+ track_p trk, trkN;
+ EPINX_T ep;
+ BOOL_T go;
+
+ trk = pathStartTrk;
+ ep = pathStartEp;
+
+ if (pathStartTrk==NULL) {
+ lprintf("s--:- e--:-");
+ } else if (pathEndTrk == NULL) {
+ lprintf("sT%d:%d e--:-", GetTrkIndex(pathStartTrk), pathStartEp);
+ } else {
+ lprintf("sT%d:%d eT%d:%d", GetTrkIndex(pathStartTrk), pathStartEp,
+ GetTrkIndex(pathEndTrk), pathEndEp);
+ }
+ lprintf(" { ");
+ go = TRUE;
+ if (!PathListSingle())
+ while (trk) {
+ EPINX_T ep2;
+ if (trk==pathEndTrk) {
+ ep2 = pathEndEp;
+ go = FALSE;
+ } else {
+ ep2 = GetNextTrkOnPath(trk, ep);
+ PASSERT("computeProfElem", ep2 >= 0, NOP);
+ }
+ lprintf("T%d:%d:%d ", GetTrkIndex(trk), ep, ep2);
+ if (!go) {
+ break;
+ }
+ trkN = GetTrkEndTrk(trk,ep2);
+ ep = GetEndPtConnectedToMe(trkN,trk);
+ trk = trkN;
+ }
+ lprintf("}");
}
static void ProfileSelect(track_p trkN, EPINX_T epN)
{
- track_p trkP;
- EPINX_T epP=-1;
- int rc;
-
- if (log_profile>=1) {
- DumpProfElems();
- lprintf(" @ T%d:%d ", GetTrkIndex(trkN), epN);
- if (log_profile>=2) {
- lprintf("\n");
- }
- }
-
- trkP = GetTrkEndTrk(trkN, epN);
- if (trkP) {
- epP = GetEndPtConnectedToMe(trkP, trkN);
- }
-
- if (!PathListCheck()) {
- return;
- }
-
- if (PathListEmpty()) {
- pathStartTrk = trkN;
- pathStartEp = epN;
- pathEndTrk = trkP;
- pathEndEp = epP;
- LOG(log_profile, 2, ("Adding first element\n"))
-
- } else if (PathListSingle() &&
- ((trkN == pathStartTrk && epN == pathStartEp) ||
- (trkP && trkP == pathStartTrk && epP == pathStartEp))) {
- pathStartTrk = pathEndTrk = NULL;
- LOG(log_profile, 2, ("Clearing list\n"))
-
- } else if ((trkN == pathStartTrk && epN == pathStartEp) ||
- (trkP && trkP == pathStartTrk && epP == pathStartEp)) {
- RemoveTracksFromPath(&pathStartTrk, &pathStartEp, pathEndTrk, pathEndEp);
- LOG(log_profile, 2, ("Removing first element\n"))
-
- } else if ((trkN == pathEndTrk && epN == pathEndEp) ||
- (trkP && trkP == pathEndTrk && epP == pathEndEp)) {
- RemoveTracksFromPath(&pathEndTrk, &pathEndEp, pathStartTrk, pathStartEp);
- LOG(log_profile, 2, ("Removing last element\n"))
-
- } else if ((GetTrkBits(trkN)&TB_PROFILEPATH) || (trkP &&
- (GetTrkBits(trkP)&TB_PROFILEPATH))) {
- ErrorMessage(MSG_EP_ON_PATH);
- return;
-
- } else if ((rc = FindProfileShortestPath(trkN, epN)) > 0) {
- if (!(GetTrkBits(trkN)&TB_PROFILEPATH)) {
- PASSERT("profileSelect", trkP != NULL, NOP);
- trkN = trkP;
- epN = epP;
- LOG(log_profile, 2, ("Invert selected EP\n"))
- }
-
- switch (profileShortestPathMatch) {
- case 1:
- /* extend Start */
- pathStartTrk = trkN;
- pathStartEp = epN;
- LOG(log_profile, 2, ("Prepending Path\n"))
- break;
- case 2:
- /* extend End */
- pathEndTrk = trkN;
- pathEndEp = epN;
- LOG(log_profile, 2, ("Appending Path\n"))
- break;
- case 3:
- /* need to flip */
- pathStartTrk = pathEndTrk;
- pathStartEp = pathEndEp;
- pathEndTrk = trkN;
- pathEndEp = epN;
- LOG(log_profile, 2, ("Flip/Appending Path\n"))
- break;
- default:
- AbortProg("findPaths:1");
- }
-
- } else {
- ErrorMessage(MSG_NO_PATH_TO_EP);
- return;
- }
-
- DestroyCopyOfProfileElements();
- ComputeProfElem();
- CreateCopyProfileElements();
-
- RedrawProfileW();
- DoProfileChangeMode(NULL);
- if (log_profile>=1) {
- lprintf(" = ");
- DumpProfElems();
- lprintf("\n");
- }
- PathListCheck();
+ track_p trkP;
+ EPINX_T epP=-1;
+ int rc;
+
+ if (log_profile>=1) {
+ DumpProfElems();
+ lprintf(" @ T%d:%d ", GetTrkIndex(trkN), epN);
+ if (log_profile>=2) {
+ lprintf("\n");
+ }
+ }
+
+ trkP = GetTrkEndTrk(trkN, epN);
+ if (trkP) {
+ epP = GetEndPtConnectedToMe(trkP, trkN);
+ }
+
+ if (!PathListCheck()) {
+ return;
+ }
+
+ if (PathListEmpty()) {
+ pathStartTrk = trkN;
+ pathStartEp = epN;
+ pathEndTrk = trkP;
+ pathEndEp = epP;
+ LOG(log_profile, 2, ("Adding first element\n"))
+
+ } else if (PathListSingle() &&
+ ((trkN == pathStartTrk && epN == pathStartEp) ||
+ (trkP && trkP == pathStartTrk && epP == pathStartEp))) {
+ pathStartTrk = pathEndTrk = NULL;
+ LOG(log_profile, 2, ("Clearing list\n"))
+
+ } else if ((trkN == pathStartTrk && epN == pathStartEp) ||
+ (trkP && trkP == pathStartTrk && epP == pathStartEp)) {
+ RemoveTracksFromPath(&pathStartTrk, &pathStartEp, pathEndTrk, pathEndEp);
+ LOG(log_profile, 2, ("Removing first element\n"))
+
+ } else if ((trkN == pathEndTrk && epN == pathEndEp) ||
+ (trkP && trkP == pathEndTrk && epP == pathEndEp)) {
+ RemoveTracksFromPath(&pathEndTrk, &pathEndEp, pathStartTrk, pathStartEp);
+ LOG(log_profile, 2, ("Removing last element\n"))
+
+ } else if ((GetTrkBits(trkN)&TB_PROFILEPATH) || (trkP &&
+ (GetTrkBits(trkP)&TB_PROFILEPATH))) {
+ ErrorMessage(MSG_EP_ON_PATH);
+ return;
+
+ } else if ((rc = FindProfileShortestPath(trkN, epN)) > 0) {
+ if (!(GetTrkBits(trkN)&TB_PROFILEPATH)) {
+ PASSERT("profileSelect", trkP != NULL, NOP);
+ trkN = trkP;
+ epN = epP;
+ LOG(log_profile, 2, ("Invert selected EP\n"))
+ }
+
+ switch (profileShortestPathMatch) {
+ case 1:
+ /* extend Start */
+ pathStartTrk = trkN;
+ pathStartEp = epN;
+ LOG(log_profile, 2, ("Prepending Path\n"))
+ break;
+ case 2:
+ /* extend End */
+ pathEndTrk = trkN;
+ pathEndEp = epN;
+ LOG(log_profile, 2, ("Appending Path\n"))
+ break;
+ case 3:
+ /* need to flip */
+ pathStartTrk = pathEndTrk;
+ pathStartEp = pathEndEp;
+ pathEndTrk = trkN;
+ pathEndEp = epN;
+ LOG(log_profile, 2, ("Flip/Appending Path\n"))
+ break;
+ default:
+ CHECK(FALSE);
+ }
+
+ } else {
+ ErrorMessage(MSG_NO_PATH_TO_EP);
+ return;
+ }
+
+ DestroyCopyOfProfileElements();
+ ComputeProfElem();
+ CreateCopyProfileElements();
+
+ RedrawProfileW( screenProfileD.d, NULL, 0, 0 );
+ DoProfileChangeMode(NULL);
+ if (log_profile>=1) {
+ lprintf(" = ");
+ DumpProfElems();
+ lprintf("\n");
+ }
+ PathListCheck();
}
-static void ProfileSubCommand(wBool_t set, void* pcmd)
+static void ProfileSubCommand(void* pcmd)
{
- long cmd = (long)pcmd;
- int mode;
- coOrd pos = oldMarker;
- DIST_T elev;
- DIST_T radius;
-
- if ((profilePopupTrk = OnTrack(&pos, TRUE, TRUE)) == NULL ||
- (profilePopupEp = PickEndPoint(pos, profilePopupTrk)) < 0) {
- return;
- }
- if (profileUndo==0) {
- profileUndo = TRUE;
- UndoStart(_("Profile Command"), "Profile");
- }
- radius = 0.05*mainD.scale;
- if (radius < trackGauge/2.0) {
- radius = trackGauge/2.0;
- }
- pos = GetTrkEndPos(profilePopupTrk, profilePopupEp);
- mode = GetTrkEndElevMode(profilePopupTrk, profilePopupEp);
-
- elev = 0.0;
- switch (cmd) {
- case 0:
- /* define */
- ComputeElev(profilePopupTrk, profilePopupEp, TRUE, &elev, NULL, TRUE);
- mode = ELEV_DEF|ELEV_VISIBLE;
- break;
- case 1:
- /* ignore */
- mode = ELEV_IGNORE|ELEV_VISIBLE;
- break;
- case 2:
- default:
- /* none */
- mode = ELEV_NONE;
- break;
- }
- UpdateTrkEndElev(profilePopupTrk, profilePopupEp, mode, elev, NULL);
- ComputeProfElem();
- RedrawProfileW();
- TempRedraw(); // ProfileSubCommand
+ long cmd = VP2L(pcmd);
+ int mode;
+ coOrd pos = oldMarker;
+ DIST_T elev;
+ DIST_T radius;
+
+ if ((profilePopupTrk = OnTrack(&pos, TRUE, TRUE)) == NULL ||
+ (profilePopupEp = PickEndPoint(pos, profilePopupTrk)) < 0) {
+ return;
+ }
+ if (profileUndo==0) {
+ profileUndo = TRUE;
+ UndoStart(_("Profile Command"), "Profile");
+ }
+ radius = 0.05*mainD.scale;
+ if (radius < trackGauge/2.0) {
+ radius = trackGauge/2.0;
+ }
+ pos = GetTrkEndPos(profilePopupTrk, profilePopupEp);
+ mode = GetTrkEndElevMode(profilePopupTrk, profilePopupEp);
+
+ elev = 0.0;
+ switch (cmd) {
+ case 0:
+ /* define */
+ ComputeElev(profilePopupTrk, profilePopupEp, TRUE, &elev, NULL, TRUE);
+ mode = ELEV_DEF|ELEV_VISIBLE;
+ break;
+ case 1:
+ /* ignore */
+ mode = ELEV_IGNORE|ELEV_VISIBLE;
+ break;
+ case 2:
+ default:
+ /* none */
+ mode = ELEV_NONE;
+ break;
+ }
+ UpdateTrkEndElev(profilePopupTrk, profilePopupEp, mode, elev, NULL);
+ ComputeProfElem();
+ RedrawProfileW( screenProfileD.d, NULL, 0, 0 );
+ TempRedraw(); // ProfileSubCommand
}
static STATUS_T CmdProfile(wAction_t action, coOrd pos)
{
- track_p trk0;
- coOrd textsize;
-
- switch (action) {
- case C_START:
- if (profileW == NULL) {
- profileColorDefinedProfile = drawColorBlue;
- profileColorUndefinedProfile = drawColorRed;
- profileColorFill = drawColorGrey80;
- DrawTextSize(&mainD, "999.9", wStandardFont(F_HELV, FALSE, FALSE),
- screenProfileFontSize, FALSE, &textsize);
- labelH = textsize.y;
- labelW = textsize.x;
- profileW = ParamCreateDialog(&profilePG, MakeWindowTitle(_("Profile")), NULL,
- NULL, wHide, TRUE, NULL, F_RESIZE, CloseProfileWindow);
- }
- ParamLoadControls(&profilePG);
- ParamGroupRecord(&profilePG);
- wShow(profileW);
- ParamLoadMessage(&profilePG, I_PROFILEMSG, _("Drag to change Elevation"));
- profElem_da.cnt = 0;
- station_da.cnt = 0;
- RedrawProfileW();
- ClrAllTrkBitsRedraw(TB_PROFILEPATH, TRUE);
- pathStartTrk = NULL;
- SetAllTrackSelect(FALSE);
- profileUndo = FALSE;
- InfoMessage(_("Select a Defined Elevation to start profile"));
- TempRedraw(); // CmdProfile C_START
- return C_CONTINUE;
- case C_LCLICK:
- InfoMessage("");
- if ((trk0 = OnTrack(&pos, TRUE, TRUE)) != NULL) {
- EPINX_T ep0;
- ep0 = PickEndPoint(pos, trk0);
- if (ep0 >= 0) {
- ProfileSelect(trk0, ep0);
- }
- }
- return C_CONTINUE;
- case C_CMDMENU:
- if ((profilePopupTrk = OnTrack(&pos, TRUE, TRUE)) != NULL) {
- profilePopupEp = PickEndPoint(pos, profilePopupTrk);
- if (profilePopupEp >= 0) {
- int mode;
- mode = GetTrkEndElevMode(profilePopupTrk, profilePopupEp);
- if (mode != ELEV_DEF && mode != ELEV_IGNORE && mode != ELEV_NONE) {
- ErrorMessage(MSG_CHANGE_ELEV_MODE);
- } else {
- wMenuToggleEnable(profilePopupToggles[1], TRUE);
- if (OnPath(profilePopupTrk, profilePopupEp) & (ONPATH_END|ONPATH_MID)) {
- wMenuToggleEnable(profilePopupToggles[1], FALSE);
- }
- wMenuToggleSet(profilePopupToggles[0], mode == ELEV_DEF);
- wMenuToggleSet(profilePopupToggles[1], mode == ELEV_IGNORE);
- wMenuToggleSet(profilePopupToggles[2], mode == ELEV_NONE);
- menuPos = pos;
- wMenuPopupShow(profilePopupM);
- }
- }
- }
- return C_CONTINUE;
- case C_OK:
- DoProfileDone(NULL);
- return C_TERMINATE;
- case C_CANCEL:
- wHide(profileW);
- ClrAllTrkBitsRedraw(TB_PROFILEPATH, TRUE);
- return C_TERMINATE;
- case C_REDRAW:
- if (wWinIsVisible(profileW)) {
- HilightProfileElevations(wWinIsVisible(profileW));
- }
- return C_CONTINUE;
- }
- return C_CONTINUE;
+ track_p trk0;
+ coOrd textsize;
+
+ switch (action) {
+ case C_START:
+ if (profileW == NULL) {
+ profileColorDefinedProfile = drawColorBlue;
+ profileColorUndefinedProfile = drawColorRed;
+ profileColorFill = drawColorGrey80;
+ DrawTextSize(&mainD, "999.9", wStandardFont(F_HELV, FALSE, FALSE),
+ screenProfileFontSize, FALSE, &textsize);
+ labelH = textsize.y;
+ labelW = textsize.x;
+ profileW = ParamCreateDialog(&profilePG, MakeWindowTitle(_("Profile")), NULL,
+ NULL, wHide, TRUE, NULL, F_RESIZE, CloseProfileWindow);
+ }
+ ParamLoadControls(&profilePG);
+ ParamGroupRecord(&profilePG);
+ wShow(profileW);
+ ParamLoadMessage(&profilePG, I_PROFILEMSG, _("Drag to change Elevation"));
+ DYNARR_RESET( profElem_t, profElem_da );
+ DYNARR_RESET( station_t, station_da );
+ RedrawProfileW( screenProfileD.d, NULL, 0, 0 );
+ ClrAllTrkBitsRedraw(TB_PROFILEPATH, TRUE);
+ pathStartTrk = NULL;
+ SetAllTrackSelect(FALSE);
+ profileUndo = FALSE;
+ InfoMessage(_("Select a Defined Elevation to start profile"));
+ TempRedraw(); // CmdProfile C_START
+ return C_CONTINUE;
+ case C_LCLICK:
+ InfoMessage("");
+ if ((trk0 = OnTrack(&pos, TRUE, TRUE)) != NULL) {
+ EPINX_T ep0;
+ ep0 = PickEndPoint(pos, trk0);
+ if (ep0 >= 0) {
+ ProfileSelect(trk0, ep0);
+ }
+ }
+ return C_CONTINUE;
+ case C_CMDMENU:
+ if ((profilePopupTrk = OnTrack(&pos, TRUE, TRUE)) != NULL) {
+ profilePopupEp = PickEndPoint(pos, profilePopupTrk);
+ if (profilePopupEp >= 0) {
+ int mode;
+ mode = GetTrkEndElevMode(profilePopupTrk, profilePopupEp);
+ if (mode != ELEV_DEF && mode != ELEV_IGNORE && mode != ELEV_NONE) {
+ ErrorMessage(MSG_CHANGE_ELEV_MODE);
+ } else {
+ wMenuToggleEnable(profilePopupToggles[1], TRUE);
+ if (OnPath(profilePopupTrk, profilePopupEp) & (ONPATH_END|ONPATH_MID)) {
+ wMenuToggleEnable(profilePopupToggles[1], FALSE);
+ }
+ wMenuToggleSet(profilePopupToggles[0], mode == ELEV_DEF);
+ wMenuToggleSet(profilePopupToggles[1], mode == ELEV_IGNORE);
+ wMenuToggleSet(profilePopupToggles[2], mode == ELEV_NONE);
+ menuPos = pos;
+ wMenuPopupShow(profilePopupM);
+ }
+ }
+ }
+ return C_CONTINUE;
+ case C_OK:
+ DoProfileDone(NULL);
+ return C_TERMINATE;
+ case C_CANCEL:
+ wHide(profileW);
+ ClrAllTrkBitsRedraw(TB_PROFILEPATH, TRUE);
+ return C_TERMINATE;
+ case C_REDRAW:
+ if (wWinIsVisible(profileW)) {
+ HilightProfileElevations(wWinIsVisible(profileW));
+ }
+ return C_CONTINUE;
+ }
+ return C_CONTINUE;
}
static void ProfileChange(long changes)
{
- if ((changes & CHANGE_UNITS) && screenProfileD.d) {
- RedrawProfileW();
- }
+ if ((changes & CHANGE_UNITS) && screenProfileD.d) {
+ RedrawProfileW( screenProfileD.d, NULL, 0, 0 );
+ }
}
-#include "bitmaps/profile.xpm"
+#include "bitmaps/profile.xpm3"
EXPORT void InitCmdProfile(wMenu_p menu)
{
- log_profile = LogFindIndex("profile");
- ParamRegister(&profilePG);
-
- AddMenuButton(menu, CmdProfile, "cmdProfile", _("Profile"),
- wIconCreatePixMap(profile_xpm), LEVEL0_50, IC_LCLICK|IC_CMDMENU|IC_POPUP3,
- ACCL_PROFILE, NULL);
- profilePopupM = MenuRegister("Profile Mode");
- profilePopupToggles[0] = wMenuToggleCreate(profilePopupM, "", _("Define"), 0,
- FALSE, ProfileSubCommand, (void*)0);
- profilePopupToggles[1] = wMenuToggleCreate(profilePopupM, "", _("Ignore"), 0,
- FALSE, ProfileSubCommand, (void*)1);
- profilePopupToggles[2] = wMenuToggleCreate(profilePopupM, "", _("None"), 0,
- FALSE, ProfileSubCommand, (void*)2);
- RegisterChangeNotification(ProfileChange);
+ log_profile = LogFindIndex("profile");
+ ParamRegister(&profilePG);
+
+ AddMenuButton(menu, CmdProfile, "cmdProfile", _("Profile"),
+ wIconCreatePixMap(profile_xpm3[iconSize]), LEVEL0_50,
+ IC_LCLICK|IC_CMDMENU|IC_POPUP3,
+ ACCL_PROFILE, NULL);
+ profilePopupM = MenuRegister("Profile Mode");
+ profilePopupToggles[0] = wMenuToggleCreate(profilePopupM, "", _("Define"), 0,
+ FALSE, ProfileSubCommand, I2VP(0));
+ profilePopupToggles[1] = wMenuToggleCreate(profilePopupM, "", _("Ignore"), 0,
+ FALSE, ProfileSubCommand, I2VP(1));
+ profilePopupToggles[2] = wMenuToggleCreate(profilePopupM, "", _("None"), 0,
+ FALSE, ProfileSubCommand, I2VP(2));
+ RegisterChangeNotification(ProfileChange);
}