diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-07-03 10:19:49 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-07-03 10:19:49 +0200 | 
| commit | 8dc8048d2cd4996825470bbfcb1e09e2a2630035 (patch) | |
| tree | 9804282102f8c40d27407b9c94119b35eeb5013c /app/bin/cdraw.c | |
| parent | c9d0740841fbe0539e42e66d3865672bfcd3ac02 (diff) | |
| parent | b6bd52cd7330a90fc0e44dbe6022551a8dd768a1 (diff) | |
Merge branch 'feature/upstream' into develop
Diffstat (limited to 'app/bin/cdraw.c')
| -rw-r--r-- | app/bin/cdraw.c | 2932 | 
1 files changed, 1559 insertions, 1373 deletions
| diff --git a/app/bin/cdraw.c b/app/bin/cdraw.c index b6cc035..4d52408 100644 --- a/app/bin/cdraw.c +++ b/app/bin/cdraw.c @@ -2,23 +2,23 @@   * Drawing of geometric elements   */ - /*  XTrkCad - Model Railroad CAD -  *  Copyright (C) 2005 Dave Bullis -  * -  *  This program is free software; you can redistribute it and/or modify -  *  it under the terms of the GNU General Public License as published by -  *  the Free Software Foundation; either version 2 of the License, or -  *  (at your option) any later version. -  * -  *  This program is distributed in the hope that it will be useful, -  *  but WITHOUT ANY WARRANTY; without even the implied warranty of -  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -  *  GNU General Public License for more details. -  * -  *  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. -  */ +/*  XTrkCad - Model Railroad CAD + *  Copyright (C) 2005 Dave Bullis + * + *  This program is free software; you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */  #include "common.h"  #include "ccurve.h" @@ -27,10 +27,11 @@  #include "fileio.h"  #include "param.h"  #include "track.h" +#include "tbezier.h"  #include "misc.h"  #include "cselect.h" +#include "cundo.h"  #include "common-ui.h" -extern TRKTYP_T T_BZRLIN;  static wMenu_p drawModDelMI;  static wMenu_p drawModLinMI; @@ -56,35 +57,32 @@ static wMenuPush_p drawModCenterDot;  static wMenuPush_p drawModPhantom; -extern void wSetSelectedFontSize(wFontSize_t size); -  static long fontSizeList[] = { -		4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, -		40, 48, 56, 64, 72, 80, 90, 100, 120, 140, 160, 180, -		200, 250, 300, 350, 400, 450, 500 }; +	4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 24, 28, 32, 36, +	40, 48, 56, 64, 72, 80, 90, 100, 120, 140, 160, 180, +	200, 250, 300, 350, 400, 450, 500 +};  EXPORT void LoadFontSizeList( -	wList_p list, -	long curFontSize) +        wList_p list, +        long curFontSize)  {  	wIndex_t curInx = 0, inx1;  	int inx;  	wListClear(list); -	for (inx = 0; inx < COUNT( fontSizeList ); inx++) -	{ +	for (inx = 0; inx < COUNT( fontSizeList ); inx++) {  		if ((inx == 0 || curFontSize > fontSizeList[inx - 1]) && -			(curFontSize < fontSizeList[inx])) -		{ +		    (curFontSize < fontSizeList[inx])) {  			sprintf(message, "%ld", curFontSize);  			curInx = wListAddValue(list, message, NULL, I2VP(curFontSize));  		}  		sprintf(message, "%ld", fontSizeList[inx]);  		inx1 = wListAddValue(list, message, NULL, I2VP(fontSizeList[inx])); -		if (curFontSize == fontSizeList[inx]) +		if (curFontSize == fontSizeList[inx]) {  			curInx = inx1; +		}  	} -	if (curFontSize > fontSizeList[ COUNT( fontSizeList ) - 1]) -	{ +	if (curFontSize > fontSizeList[ COUNT( fontSizeList ) - 1]) {  		sprintf(message, "%ld", curFontSize);  		curInx = wListAddValue(list, message, NULL, I2VP(curFontSize));  	} @@ -100,20 +98,22 @@ long GetFontSize(wIndex_t inx)  long GetFontSizeIndex(long size)  {  	int i; -	for (i = 0; i < COUNT( fontSizeList ); i++) -	{ -		if (fontSizeList[i] == size) +	for (i = 0; i < COUNT( fontSizeList ); i++) { +		if (fontSizeList[i] == size) {  			return(i); +		}  	}  	return(-1);  }  EXPORT void UpdateFontSizeList( -		long * fontSizeR, -		wList_p list, -		wIndex_t listInx ) +        long * fontSizeR, +        wList_p list, +        wIndex_t listInx )  {  	long fontSize; +	long largeFontSize; +	wPrefGetInteger( "misc", "large-font-size", &largeFontSize, 500 );  	if ( listInx >= 0 ) {  		*fontSizeR = VP2L( wListGetItemContext( list, listInx )); @@ -126,8 +126,13 @@ EXPORT void UpdateFontSizeList(  				sprintf( message, "%ld", *fontSizeR );  				wListSetValue( list, message );  			} else { -				if ( fontSize <= 500 || NoticeMessage( MSG_LARGE_FONT, _("Yes"), _("No") ) > 0 ) { -				 +				if ( fontSize <= largeFontSize +				     || NoticeMessage( MSG_LARGE_FONT, _("Yes"), _("No") ) > 0 ) { + +					if ( fontSize > largeFontSize ) { +						largeFontSize = fontSize; +						wPrefSetInteger( "misc", "large-font-size", largeFontSize ); +					}  					*fontSizeR = fontSize;  					/* inform gtkfont dialog from change */  					wSetSelectedFontSize((wFontSize_t)fontSize); @@ -149,13 +154,13 @@ EXPORT void UpdateFontSizeList(  typedef struct extraDataDraw_t { -		extraDataBase_t base; -		coOrd orig; -		ANGLE_T angle; -		drawLineType_e lineType; -		wIndex_t segCnt; -		trkSeg_t segs[1]; -		} extraDataDraw_t; +	extraDataBase_t base; +	coOrd orig; +	ANGLE_T angle; +	drawLineType_e lineType; +	wIndex_t segCnt; +	trkSeg_t segs[1]; +} extraDataDraw_t;  static TRKTYP_T T_DRAW = -1;  static track_p ignoredTableEdge; @@ -175,17 +180,26 @@ static void ComputeDrawBoundingBox( track_p t )  static track_p MakeDrawFromSeg1( -		wIndex_t index, -		coOrd pos, -		ANGLE_T angle, -		trkSeg_p sp ) +        wIndex_t index, +        coOrd pos, +        ANGLE_T angle, +        trkSeg_p sp )  {  	struct extraDataDraw_t * xx;  	track_p trk; -	if ( sp->type == ' ' ) +	if ( sp->type == ' ' ) {  		return NULL; +	} +	if (sp->type == SEG_BEZLIN) { +		trk = NewBezierLine(sp->u.l.pos, NULL, 0, sp->color, sp->lineWidth); +		trkSeg_p spb = &DYNARR_N(trkSeg_t, sp->bezSegs, 0); +		FixUpBezierSegs(spb, sp->bezSegs.cnt); +		MoveBezier(trk, pos); +		RotateBezier(trk, pos, angle); +		return trk; +	}  	trk = NewTrack( index, T_DRAW, 0, sizeof *xx ); -	xx = GET_EXTRA_DATA( trk, T_DRAW, extraDataDraw_t ); +	xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t);  	xx->orig = pos;  	xx->angle = angle;  	xx->segCnt = 1; @@ -193,7 +207,7 @@ static track_p MakeDrawFromSeg1(  	memcpy( xx->segs, sp, sizeof *(trkSeg_p)0 );  	if (xx->segs[0].type == SEG_POLY || -		xx->segs[0].type == SEG_FILPOLY ) { +	    xx->segs[0].type == SEG_FILPOLY ) {  		xx->segs[0].u.p.pts = (pts_t*)MyMalloc( (sp->u.p.cnt) * sizeof (pts_t) );  		memcpy(xx->segs[0].u.p.pts, sp->u.p.pts, sp->u.p.cnt * sizeof (pts_t) );  	} @@ -205,25 +219,26 @@ static track_p MakeDrawFromSeg1(  }  EXPORT track_p MakeDrawFromSeg( -		coOrd pos, -		ANGLE_T angle, -		trkSeg_p sp ) +        coOrd pos, +        ANGLE_T angle, +        trkSeg_p sp )  {  	return MakeDrawFromSeg1( 0, pos, angle, sp );  } -int SliceCuts(ANGLE_T a, DIST_T radius) { +int SliceCuts(ANGLE_T a, DIST_T radius) +{  	double Error = 0.05;  	double Error_angle = acos(1-(Error/fabs(radius))); -	if (Error_angle <0.0001) return 0; +	if (Error_angle <0.0001) { return 0; }  	return (int)(floor(D2R(a)/(2*Error_angle)));  }  /* Only straight, curved and PolyLine */  EXPORT track_p MakePolyLineFromSegs( -		coOrd pos, -		ANGLE_T angle, -		dynArr_t * segsArr) +        coOrd pos, +        ANGLE_T angle, +        dynArr_t * segsArr)  {  	struct extraDataDraw_t * xx;  	track_p trk; @@ -234,72 +249,77 @@ EXPORT track_p MakePolyLineFromSegs(  	xx->lineType = DRAWLINESOLID;  	xx->segCnt = 1;  	xx->segs[0].type = SEG_POLY; -	xx->segs[0].width = 0; +	xx->segs[0].lineWidth = 0;  	xx->segs[0].u.p.polyType = POLYLINE;  	xx->segs[0].color = wDrawColorBlack;  	coOrd last;  	BOOL_T first = TRUE;  	int cnt = 0; -	for (int i=0;i<segsArr->cnt;i++) { +	for (int i=0; i<segsArr->cnt; i++) {  		trkSeg_p sp = &DYNARR_N(trkSeg_t,*segsArr,i);  		if (sp->type == SEG_BEZLIN || sp->type == SEG_BEZTRK ) { -			for (int j=0;j<sp->bezSegs.cnt;j++) { +			for (int j=0; j<sp->bezSegs.cnt; j++) {  				trkSeg_p spb = &DYNARR_N(trkSeg_t,sp->bezSegs,j);  				if (spb->type == SEG_STRLIN || spb->type == SEG_STRTRK) { -					if (!first && IsClose(FindDistance(spb->u.l.pos[0], last))) +					if (!first && IsClose(FindDistance(spb->u.l.pos[0], last))) {  						cnt++; -					else +					} else {  						cnt=cnt+2; +					}  					last = spb->u.l.pos[1];  					first = FALSE; -				} -				else if (spb->type == SEG_CRVLIN || spb->type == SEG_CRVTRK) { +				} else if (spb->type == SEG_CRVLIN || spb->type == SEG_CRVTRK) {  					coOrd this; -					if (spb->u.c.radius >= 0.0) +					if (spb->u.c.radius >= 0.0) {  						Translate(&this, spb->u.c.center, spb->u.c.a0, fabs(spb->u.c.radius)); -					else -						Translate(&this, spb->u.c.center, spb->u.c.a0+spb->u.c.a1, fabs(spb->u.c.radius)); +					} else { +						Translate(&this, spb->u.c.center, spb->u.c.a0+spb->u.c.a1, +						          fabs(spb->u.c.radius)); +					}  					if (first || !IsClose(FindDistance(this, last))) {  						cnt++;									//Add first point  					}  					cnt += 1 + SliceCuts(spb->u.c.a1,spb->u.c.radius); -					if (spb->u.c.radius >= 0.0) -						Translate(&last, spb->u.c.center, spb->u.c.a0+spb->u.c.a1, fabs(spb->u.c.radius)); -					else +					if (spb->u.c.radius >= 0.0) { +						Translate(&last, spb->u.c.center, spb->u.c.a0+spb->u.c.a1, +						          fabs(spb->u.c.radius)); +					} else {  						Translate(&last, spb->u.c.center, spb->u.c.a0, fabs(spb->u.c.radius)); +					}  					first = FALSE;  				}  			} -		} -		else if (sp->type == SEG_STRLIN || sp->type == SEG_STRTRK) { -			if (!first && IsClose(FindDistance(sp->u.l.pos[0], last))) +		} else if (sp->type == SEG_STRLIN || sp->type == SEG_STRTRK) { +			if (!first && IsClose(FindDistance(sp->u.l.pos[0], last))) {  				cnt++; -			else +			} else {  				cnt=cnt+2; +			}  			last = sp->u.l.pos[1];  			first = FALSE; -		} -		else if (sp->type == SEG_CRVLIN || sp->type == SEG_CRVTRK) { +		} else if (sp->type == SEG_CRVLIN || sp->type == SEG_CRVTRK) {  			coOrd this; -			if (sp->u.c.radius >= 0.0) +			if (sp->u.c.radius >= 0.0) {  				Translate(&this, sp->u.c.center, sp->u.c.a0, fabs(sp->u.c.radius)); -			else +			} else {  				Translate(&this, sp->u.c.center, sp->u.c.a0+sp->u.c.a1, fabs(sp->u.c.radius)); +			}  			if (first || !IsClose(FindDistance(this, last))) {  				cnt++;									//Add first point  			}  			cnt += 1+ SliceCuts(sp->u.c.a1,sp->u.c.radius); -			if (sp->u.c.radius >= 0.0) +			if (sp->u.c.radius >= 0.0) {  				Translate(&last, sp->u.c.center, sp->u.c.a0+sp->u.c.a1, fabs(sp->u.c.radius)); -			else +			} else {  				Translate(&last, sp->u.c.center, sp->u.c.a0, fabs(sp->u.c.radius)); +			}  			first = FALSE; -		} -		else if (sp->type == SEG_POLY) { -			if (!first && IsClose(FindDistance(sp->u.p.pts[0].pt, last))) +		} else if (sp->type == SEG_POLY) { +			if (!first && IsClose(FindDistance(sp->u.p.pts[0].pt, last))) {  				cnt = cnt + sp->u.p.cnt-1; -			else +			} else {  				cnt = cnt + sp->u.p.cnt; +			}  			last = sp->u.p.pts[sp->u.p.cnt-1].pt;  			first = FALSE;  		} @@ -308,10 +328,10 @@ EXPORT track_p MakePolyLineFromSegs(  	xx->segs[0].u.p.pts = (pts_t*)MyMalloc( (cnt) * sizeof (pts_t) );  	first = TRUE;  	int j =0; -	for (int i=0;i<segsArr->cnt;i++) { +	for (int i=0; i<segsArr->cnt; i++) {  		trkSeg_p sp = &DYNARR_N(trkSeg_t,*segsArr,i);  		if (sp->type == SEG_BEZLIN || sp->type == SEG_BEZTRK ) { -			for (int l=0;l<sp->bezSegs.cnt;l++) { +			for (int l=0; l<sp->bezSegs.cnt; l++) {  				trkSeg_p spb = &DYNARR_N(trkSeg_t,sp->bezSegs,l);  				if (spb->type == SEG_STRLIN || spb->type == SEG_STRTRK) {  					if (first || !IsClose(FindDistance(spb->u.l.pos[0], last))) { @@ -327,28 +347,36 @@ EXPORT track_p MakePolyLineFromSegs(  				}  				if (spb->type == SEG_CRVLIN || spb->type == SEG_CRVTRK) {  					coOrd this; -					if (spb->u.c.radius>=0.0) +					if (spb->u.c.radius>=0.0) {  						Translate(&this, spb->u.c.center, spb->u.c.a0, fabs(spb->u.c.radius)); -					else -						Translate(&this, spb->u.c.center, spb->u.c.a0+spb->u.c.a1, fabs(spb->u.c.radius)); +					} else { +						Translate(&this, spb->u.c.center, spb->u.c.a0+spb->u.c.a1, +						          fabs(spb->u.c.radius)); +					}  					if (first || !IsClose(FindDistance(this, last))) {  						xx->segs[0].u.p.pts[j].pt= this;  						xx->segs[0].u.p.pts[j].pt_type = wPolyLineStraight;  						j++;  					}  					int slices = SliceCuts(spb->u.c.a1,spb->u.c.radius); -					for (int k=1; k<slices;k++) { -						if (spb->u.c.radius>=0.0) -							Translate(&xx->segs[0].u.p.pts[j].pt, spb->u.c.center, spb->u.c.a0+(k*(spb->u.c.a1/(slices))), fabs(spb->u.c.radius)); -						else -							Translate(&xx->segs[0].u.p.pts[j].pt, spb->u.c.center, spb->u.c.a0+((slices-k)*(spb->u.c.a1/(slices))), fabs(spb->u.c.radius)); +					for (int k=1; k<slices; k++) { +						if (spb->u.c.radius>=0.0) { +							Translate(&xx->segs[0].u.p.pts[j].pt, spb->u.c.center, +							          spb->u.c.a0+(k*(spb->u.c.a1/(slices))), fabs(spb->u.c.radius)); +						} else { +							Translate(&xx->segs[0].u.p.pts[j].pt, spb->u.c.center, +							          spb->u.c.a0+((slices-k)*(spb->u.c.a1/(slices))), fabs(spb->u.c.radius)); +						}  						xx->segs[0].u.p.pts[j].pt_type = wPolyLineSmooth;  						j++;  					} -					if (spb->u.c.radius>=0.0) -						Translate(&xx->segs[0].u.p.pts[j].pt, spb->u.c.center, spb->u.c.a0+spb->u.c.a1, fabs(spb->u.c.radius)); -					else -						Translate(&xx->segs[0].u.p.pts[j].pt, spb->u.c.center, spb->u.c.a0, fabs(spb->u.c.radius)); +					if (spb->u.c.radius>=0.0) { +						Translate(&xx->segs[0].u.p.pts[j].pt, spb->u.c.center, spb->u.c.a0+spb->u.c.a1, +						          fabs(spb->u.c.radius)); +					} else { +						Translate(&xx->segs[0].u.p.pts[j].pt, spb->u.c.center, spb->u.c.a0, +						          fabs(spb->u.c.radius)); +					}  					xx->segs[0].u.p.pts[j].pt_type = wPolyLineStraight;  					last = xx->segs[0].u.p.pts[j].pt; @@ -371,10 +399,11 @@ EXPORT track_p MakePolyLineFromSegs(  		}  		if (sp->type == SEG_CRVLIN || sp->type == SEG_CRVTRK) {  			coOrd this; -			if (sp->u.c.radius>0) +			if (sp->u.c.radius>0) {  				Translate(&this, sp->u.c.center, sp->u.c.a0, fabs(sp->u.c.radius)); -			else +			} else {  				Translate(&this, sp->u.c.center, sp->u.c.a0+sp->u.c.a1, fabs(sp->u.c.radius)); +			}  			if (first || !IsClose(FindDistance(this, last))) {  				xx->segs[0].u.p.pts[j].pt= this;  				xx->segs[0].u.p.pts[j].pt_type = wPolyLineStraight; @@ -382,18 +411,24 @@ EXPORT track_p MakePolyLineFromSegs(  			}  			int slices = SliceCuts(sp->u.c.a1,sp->u.c.radius); -			for (int k=1; k<slices;k++) { -				if (sp->u.c.radius>0) -					Translate(&xx->segs[0].u.p.pts[j].pt, sp->u.c.center, sp->u.c.a0+(k*(sp->u.c.a1/(slices))), fabs(sp->u.c.radius)); -				else -					Translate(&xx->segs[0].u.p.pts[j].pt, sp->u.c.center, sp->u.c.a0+((slices-k)*(sp->u.c.a1/(slices))), fabs(sp->u.c.radius)); +			for (int k=1; k<slices; k++) { +				if (sp->u.c.radius>0) { +					Translate(&xx->segs[0].u.p.pts[j].pt, sp->u.c.center, +					          sp->u.c.a0+(k*(sp->u.c.a1/(slices))), fabs(sp->u.c.radius)); +				} else { +					Translate(&xx->segs[0].u.p.pts[j].pt, sp->u.c.center, +					          sp->u.c.a0+((slices-k)*(sp->u.c.a1/(slices))), fabs(sp->u.c.radius)); +				}  				xx->segs[0].u.p.pts[j].pt_type = wPolyLineSmooth;  				j++;  			} -			if (sp->u.c.radius>0) -				Translate(&xx->segs[0].u.p.pts[j].pt, sp->u.c.center, sp->u.c.a0+sp->u.c.a1, fabs(sp->u.c.radius)); -			else -				Translate(&xx->segs[0].u.p.pts[j].pt, sp->u.c.center, sp->u.c.a0, fabs(sp->u.c.radius)); +			if (sp->u.c.radius>0) { +				Translate(&xx->segs[0].u.p.pts[j].pt, sp->u.c.center, sp->u.c.a0+sp->u.c.a1, +				          fabs(sp->u.c.radius)); +			} else { +				Translate(&xx->segs[0].u.p.pts[j].pt, sp->u.c.center, sp->u.c.a0, +				          fabs(sp->u.c.radius)); +			}  			xx->segs[0].u.p.pts[j].pt_type = wPolyLineStraight;  			last = xx->segs[0].u.p.pts[j].pt; @@ -405,17 +440,18 @@ EXPORT track_p MakePolyLineFromSegs(  				xx->segs[0].u.p.pts[j] = sp->u.p.pts[0];  				j++;  			} -			memcpy(&xx->segs[0].u.p.pts[j],&sp->u.p.pts[1], (sp->u.p.cnt-1) * sizeof (pts_t)); +			memcpy(&xx->segs[0].u.p.pts[j],&sp->u.p.pts[1], +			       (sp->u.p.cnt-1) * sizeof (pts_t));  			last = xx->segs[0].u.p.pts[sp->u.p.cnt-1].pt;  			j +=sp->u.p.cnt-1;  			first = FALSE;  		} -		ASSERT(j<=cnt); - +		CHECK(j<=cnt);  	}  	xx->segs[0].u.p.cnt = j; -	if (IsClose(FindDistance(xx->segs[0].u.p.pts[0].pt,xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt))) { +	if (IsClose(FindDistance(xx->segs[0].u.p.pts[0].pt, +	                         xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt))) {  		xx->segs[0].u.p.polyType = FREEFORM;  		xx->segs[0].u.p.cnt = xx->segs[0].u.p.cnt-1;  	} @@ -428,36 +464,38 @@ EXPORT track_p MakePolyLineFromSegs(  static dynArr_t anchors_da;  #define anchors(N) DYNARR_N(trkSeg_t,anchors_da,N) -void static CreateOriginAnchor(coOrd origin, wBool_t trans_selected) { -		double d = tempD.scale*0.15; -		DYNARR_APPEND(trkSeg_t,anchors_da,2); -		int i = anchors_da.cnt-1; -		coOrd p0,p1; -		Translate(&p0,origin,0,d*4); -		Translate(&p1,origin,0,-d*4); -		anchors(i).type = SEG_STRLIN; -		anchors(i).u.l.pos[0] = p0; -		anchors(i).u.l.pos[1] = p1; -		anchors(i).color = wDrawColorBlue; -		anchors(i).width = 0; -		DYNARR_APPEND(trkSeg_t,anchors_da,1); -		Translate(&p0,origin,90,d*4); -		Translate(&p1,origin,90,-d*4); -		i = anchors_da.cnt-1; -		anchors(i).type = SEG_STRLIN; -		anchors(i).u.l.pos[0] = p0; -		anchors(i).u.l.pos[1] = p1; -		anchors(i).color = wDrawColorBlue; -		anchors(i).width = 0; +void static CreateOriginAnchor(coOrd origin, wBool_t trans_selected) +{ +	double d = tempD.scale*0.15; +	DYNARR_APPEND(trkSeg_t,anchors_da,2); +	int i = anchors_da.cnt-1; +	coOrd p0,p1; +	Translate(&p0,origin,0,d*4); +	Translate(&p1,origin,0,-d*4); +	anchors(i).type = SEG_STRLIN; +	anchors(i).u.l.pos[0] = p0; +	anchors(i).u.l.pos[1] = p1; +	anchors(i).color = wDrawColorBlue; +	anchors(i).lineWidth = 0; +	DYNARR_APPEND(trkSeg_t,anchors_da,1); +	Translate(&p0,origin,90,d*4); +	Translate(&p1,origin,90,-d*4); +	i = anchors_da.cnt-1; +	anchors(i).type = SEG_STRLIN; +	anchors(i).u.l.pos[0] = p0; +	anchors(i).u.l.pos[1] = p1; +	anchors(i).color = wDrawColorBlue; +	anchors(i).lineWidth = 0;  } -EXPORT void DrawOriginAnchor(track_p trk) { -	if (!trk || GetTrkType(trk) != T_DRAW) return; +EXPORT void DrawOriginAnchor(track_p trk) +{ +	if (!trk || GetTrkType(trk) != T_DRAW) { return; }  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t);  	if ((xx->orig.x != 0.0) || (xx->orig.y !=0.0) ) {  		DYNARR_RESET(trkSeg_t,anchors_da);  		CreateOriginAnchor(xx->orig,FALSE); -		DrawSegs(&tempD, zero, 0.0, anchors_da.ptr, anchors_da.cnt, trackGauge, wDrawColorBlue); +		DrawSegsDA(&tempD, NULL, zero, 0.0, &anchors_da, trackGauge, wDrawColorBlue, 0);  	}  } @@ -466,80 +504,83 @@ EXPORT void DrawOriginAnchor(track_p trk) {  static DIST_T DistanceDraw( track_p t, coOrd * p )  {  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(t, T_DRAW, extraDataDraw_t); -	if ( ignoredTableEdge == t && xx->segs[0].type == SEG_TBLEDGE ) +	if ( ignoredTableEdge == t && xx->segs[0].type == SEG_TBLEDGE ) {  		return DIST_INF; -	if ( ignoredDraw == t ) +	} +	if ( ignoredDraw == t ) {  		return DIST_INF; +	}  	return DistanceSegs( xx->orig, xx->angle, xx->segCnt, xx->segs, p, NULL );  }  static struct { -		coOrd endPt[4]; -		coOrd origin; -		coOrd oldOrigin; -		coOrd oldE0; -		coOrd oldE1; -		FLOAT_T length; -		FLOAT_T height; -		FLOAT_T width; -		coOrd center; -		DIST_T radius; -		ANGLE_T angle0; -		ANGLE_T angle1; -		ANGLE_T angle; -		ANGLE_T rotate_angle; -		ANGLE_T oldAngle; -		long pointCount; -		long lineWidth; -		BOOL_T boxed; -		BOOL_T filled; -		BOOL_T open; -		BOOL_T lock_origin; -		wDrawColor color; -		wIndex_t benchChoice; -		wIndex_t benchOrient; -		wIndex_t dimenSize; -		descPivot_t pivot; -		wIndex_t fontSizeInx; -		char text[STR_HUGE_SIZE]; -		unsigned int layer; -		wIndex_t lineType; -		} drawData; +	coOrd endPt[4]; +	coOrd origin; +	coOrd oldOrigin; +	coOrd oldE0; +	coOrd oldE1; +	FLOAT_T length; +	FLOAT_T height; +	FLOAT_T width; +	coOrd center; +	DIST_T radius; +	ANGLE_T angle0; +	ANGLE_T angle1; +	ANGLE_T angle; +	ANGLE_T rotate_angle; +	ANGLE_T oldAngle; +	long pointCount; +	LWIDTH_T lineWidth; +	BOOL_T boxed; +	BOOL_T filled; +	BOOL_T open; +	BOOL_T lock_origin; +	wDrawColor color; +	wIndex_t benchChoice; +	wIndex_t benchOrient; +	wIndex_t dimenSize; +	descPivot_t pivot; +	wIndex_t fontSizeInx; +	char text[STR_HUGE_SIZE]; +	unsigned int layer; +	wIndex_t lineType; +} drawData;  typedef enum { E0, E1, PP, CE, AL, LA, A1, A2, RD, LN, HT, WT, PV, VC, LW, LT, CO, FL, OP, BX, BE, OR, DS, TP, TA, TS, TX, LK, OI, RA, LY } drawDesc_e;  static descData_t drawDesc[] = { -/*E0*/	{ DESC_POS, N_("End Pt 1: X,Y"), &drawData.endPt[0] }, -/*E1*/	{ DESC_POS, N_("End Pt 2: X,Y"), &drawData.endPt[1] }, -/*PP*/  { DESC_POS, N_("First Point: X,Y"), &drawData.endPt[0] }, -/*CE*/	{ DESC_POS, N_("Center: X,Y"), &drawData.center }, -/*AL*/	{ DESC_FLOAT, N_("Angular Length"), &drawData.angle }, -/*LA*/  { DESC_FLOAT, N_("Line Angle"), &drawData.angle }, -/*A1*/	{ DESC_ANGLE, N_("CCW Angle"), &drawData.angle0 }, -/*A2*/	{ DESC_ANGLE, N_("CW Angle"), &drawData.angle1 }, -/*RD*/	{ DESC_DIM, N_("Radius"), &drawData.radius }, -/*LN*/	{ DESC_DIM, N_("Length"), &drawData.length }, -/*HT*/  { DESC_DIM, N_("Height"), &drawData.height }, -/*WT*/ 	{ DESC_DIM, N_("Width"), &drawData.width }, -/*PV*/	{ DESC_PIVOT, N_("Pivot"), &drawData.pivot }, -/*VC*/	{ DESC_LONG, N_("Point Count"), &drawData.pointCount }, -/*LW*/	{ DESC_LONG, N_("Line Width"), &drawData.lineWidth }, -/*LT*/  { DESC_LIST, N_("Line Type"), &drawData.lineType }, -/*CO*/	{ DESC_COLOR, N_("Color"), &drawData.color }, -/*FL*/	{ DESC_BOXED, N_("Filled"), &drawData.filled }, -/*OP*/  { DESC_BOXED, N_("Open End"), &drawData.open }, -/*BX*/  { DESC_BOXED, N_("Boxed"), &drawData.boxed }, -/*BE*/	{ DESC_LIST, N_("Lumber"), &drawData.benchChoice }, -/*OR*/	{ DESC_LIST, N_("Orientation"), &drawData.benchOrient }, -/*DS*/	{ DESC_LIST, N_("Size"), &drawData.dimenSize }, -/*TP*/	{ DESC_POS, N_("Text Origin: X,Y"), &drawData.endPt[0] }, -/*TA*/	{ DESC_FLOAT, N_("Text Angle"), &drawData.angle }, -/*TS*/	{ DESC_EDITABLELIST, N_("Font Size"), &drawData.fontSizeInx }, -/*TX*/	{ DESC_TEXT, N_("Text"), &drawData.text }, -/*LK*/  { DESC_BOXED, N_("Lock To Origin"), &drawData.lock_origin}, -/*OI*/  { DESC_POS, N_("Rot Origin: X,Y"), &drawData.origin }, -/*RA*/  { DESC_FLOAT, N_("Rotate By"), &drawData.rotate_angle }, -/*LY*/	{ DESC_LAYER, N_("Layer"), &drawData.layer }, -		{ DESC_NULL } }; +	/*E0*/	{ DESC_POS, N_("End Pt 1: X,Y"), &drawData.endPt[0] }, +	/*E1*/	{ DESC_POS, N_("End Pt 2: X,Y"), &drawData.endPt[1] }, +	/*PP*/  { DESC_POS, N_("First Point: X,Y"), &drawData.endPt[0] }, +	/*CE*/	{ DESC_POS, N_("Center: X,Y"), &drawData.center }, +	/*AL*/	{ DESC_FLOAT, N_("Angular Length"), &drawData.angle }, +	/*LA*/  { DESC_FLOAT, N_("Line Angle"), &drawData.angle }, +	/*A1*/	{ DESC_ANGLE, N_("CCW Angle"), &drawData.angle0 }, +	/*A2*/	{ DESC_ANGLE, N_("CW Angle"), &drawData.angle1 }, +	/*RD*/	{ DESC_DIM, N_("Radius"), &drawData.radius }, +	/*LN*/	{ DESC_DIM, N_("Length"), &drawData.length }, +	/*HT*/  { DESC_DIM, N_("Height"), &drawData.height }, +	/*WT*/ 	{ DESC_DIM, N_("Width"), &drawData.width }, +	/*PV*/	{ DESC_PIVOT, N_("Pivot"), &drawData.pivot }, +	/*VC*/	{ DESC_LONG, N_("Point Count"), &drawData.pointCount }, +	/*LW*/	{ DESC_FLOAT, N_("Line Width"), &drawData.lineWidth }, +	/*LT*/  { DESC_LIST, N_("Line Type"), &drawData.lineType }, +	/*CO*/	{ DESC_COLOR, N_("Color"), &drawData.color }, +	/*FL*/	{ DESC_BOXED, N_("Filled"), &drawData.filled }, +	/*OP*/  { DESC_BOXED, N_("Open End"), &drawData.open }, +	/*BX*/  { DESC_BOXED, N_("Boxed"), &drawData.boxed }, +	/*BE*/	{ DESC_LIST, N_("Lumber"), &drawData.benchChoice }, +	/*OR*/	{ DESC_LIST, N_("Orientation"), &drawData.benchOrient }, +	/*DS*/	{ DESC_LIST, N_("Size"), &drawData.dimenSize }, +	/*TP*/	{ DESC_POS, N_("Text Origin: X,Y"), &drawData.endPt[0] }, +	/*TA*/	{ DESC_FLOAT, N_("Text Angle"), &drawData.angle }, +	/*TS*/	{ DESC_EDITABLELIST, N_("Font Size"), &drawData.fontSizeInx }, +	/*TX*/	{ DESC_TEXT, N_("Text"), &drawData.text }, +	/*LK*/  { DESC_BOXED, N_("Lock To Origin"), &drawData.lock_origin}, +	/*OI*/  { DESC_POS, N_("Rot Origin: X,Y"), &drawData.origin }, +	/*RA*/  { DESC_FLOAT, N_("Rotate By"), &drawData.rotate_angle }, +	/*LY*/	{ DESC_LAYER, N_("Layer"), &drawData.layer }, +	{ DESC_NULL } +};  static int drawSegInx;  #define UNREORIGIN( Q, P, A, O ) { \ @@ -577,22 +618,20 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  	coOrd mid;  	long fontSize; -	if ( drawSegInx==-1 ) +	if ( drawSegInx==-1 ) {  		return; +	}  	segPtr = &xx->segs[drawSegInx];  	if ( inx == -1 ) { -		if (segPtr->type != SEG_TEXT) return; -		else inx = TX;  //Always look at TextField for SEG_TEXT on "Done" +		if (segPtr->type != SEG_TEXT) { return; } +		else { inx = TX; }  //Always look at TextField for SEG_TEXT on "Done"  	}  	UndrawNewTrack( trk );  	coOrd pt;  	coOrd off;  	switch ( inx ) {  	case LW: -		if (drawData.lineWidth<0) -			segPtr->width = drawData.lineWidth; -		else -			segPtr->width = drawData.lineWidth/75.0;   //Replace with absolute pixel +		segPtr->lineWidth = drawData.lineWidth;  		break;  	case CO:  		segPtr->color = drawData.color; @@ -604,24 +643,24 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  			off.x = drawData.endPt[0].x - drawData.oldE0.x;  			off.y = drawData.endPt[0].y - drawData.oldE0.y;  			switch(segPtr->type) {					//E0 does not alter length - translates -				case SEG_STRLIN: -				case SEG_DIMLIN: -				case SEG_BENCH: -				case SEG_TBLEDGE: -					UNREORIGIN( segPtr->u.l.pos[0], drawData.endPt[0], 0.0, xx->orig ); -					drawData.endPt[1].x = off.x+drawData.endPt[1].x; -					drawData.endPt[1].y = off.y+drawData.endPt[1].y; -					UNREORIGIN( segPtr->u.l.pos[1], drawData.endPt[1], 0.0, xx->orig ); -					drawDesc[E1].mode |= DESC_CHANGE; -					break; -				case SEG_CRVLIN: -				case SEG_FILCRCL: -					UNREORIGIN( segPtr->u.c.center, drawData.endPt[0], 0.0, xx->orig ); -					break; -				case SEG_POLY: -				case SEG_FILPOLY: -					break;  //Note not used by POLYGONS -				default:; +			case SEG_STRLIN: +			case SEG_DIMLIN: +			case SEG_BENCH: +			case SEG_TBLEDGE: +				UNREORIGIN( segPtr->u.l.pos[0], drawData.endPt[0], 0.0, xx->orig ); +				drawData.endPt[1].x = off.x+drawData.endPt[1].x; +				drawData.endPt[1].y = off.y+drawData.endPt[1].y; +				UNREORIGIN( segPtr->u.l.pos[1], drawData.endPt[1], 0.0, xx->orig ); +				drawDesc[E1].mode |= DESC_CHANGE; +				break; +			case SEG_CRVLIN: +			case SEG_FILCRCL: +				UNREORIGIN( segPtr->u.c.center, drawData.endPt[0], 0.0, xx->orig ); +				break; +			case SEG_POLY: +			case SEG_FILPOLY: +				break;  //Note not used by POLYGONS +			default:;  			}  		} else {  			UNREORIGIN( segPtr->u.l.pos[1], drawData.endPt[1], 0.0, xx->orig ); @@ -635,54 +674,54 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  		xx->orig = drawData.origin;  		if (!drawData.lock_origin)  {  //Move the points so that the object is not moved  			switch(segPtr->type) { -				case SEG_POLY: -				case SEG_FILPOLY: -					for (int i=0;i<segPtr->u.p.cnt;i++) { -						UNREORIGIN( segPtr->u.p.pts[i].pt, segPtr->u.p.pts[i].pt, 0.0, off ); -					} +			case SEG_POLY: +			case SEG_FILPOLY: +				for (int i=0; i<segPtr->u.p.cnt; i++) { +					UNREORIGIN( segPtr->u.p.pts[i].pt, segPtr->u.p.pts[i].pt, 0.0, off ); +				}  				break; -				case SEG_STRLIN: -				case SEG_DIMLIN: -				case SEG_BENCH: -				case SEG_TBLEDGE: -					for (int i=0;i<2;i++) { -						UNREORIGIN( segPtr->u.l.pos[i], segPtr->u.l.pos[i], 0.0, off ); -					} -					break; -				case SEG_CRVLIN: -				case SEG_FILCRCL: -					UNREORIGIN( segPtr->u.c.center, segPtr->u.c.center, 0.0, off ); -					break; -				case SEG_TEXT: -					UNREORIGIN( segPtr->u.t.pos, segPtr->u.t.pos, 0.0, off ); -				default:; +			case SEG_STRLIN: +			case SEG_DIMLIN: +			case SEG_BENCH: +			case SEG_TBLEDGE: +				for (int i=0; i<2; i++) { +					UNREORIGIN( segPtr->u.l.pos[i], segPtr->u.l.pos[i], 0.0, off ); +				} +				break; +			case SEG_CRVLIN: +			case SEG_FILCRCL: +				UNREORIGIN( segPtr->u.c.center, segPtr->u.c.center, 0.0, off ); +				break; +			case SEG_TEXT: +				UNREORIGIN( segPtr->u.t.pos, segPtr->u.t.pos, 0.0, off ); +			default:;  			}  		} else {  			switch(segPtr->type) { -				case SEG_STRLIN: -				case SEG_DIMLIN: -				case SEG_BENCH: -				case SEG_TBLEDGE: -					REORIGIN( drawData.endPt[0], segPtr->u.l.pos[0], 0.0, xx->orig ); -					REORIGIN( drawData.endPt[1], segPtr->u.l.pos[1], 0.0, xx->orig ); -					drawDesc[E0].mode |= DESC_CHANGE; -					drawDesc[E1].mode |= DESC_CHANGE; -					break; -				case SEG_CRVLIN: -				case SEG_FILCRCL: -					REORIGIN( drawData.center, segPtr->u.c.center, 0.0, xx->orig ); -					drawDesc[CE].mode |= DESC_CHANGE; -					break; -				case SEG_TEXT: -					REORIGIN( drawData.endPt[0], segPtr->u.t.pos, 0.0, xx->orig ); -					drawDesc[TP].mode |= DESC_CHANGE; -					break; -				case SEG_POLY: -				case SEG_FILPOLY: -					REORIGIN(drawData.endPt[0], segPtr->u.p.pts[0].pt, 0.0, xx->orig); -					drawDesc[PP].mode |= DESC_CHANGE; -					break; -				default:; +			case SEG_STRLIN: +			case SEG_DIMLIN: +			case SEG_BENCH: +			case SEG_TBLEDGE: +				REORIGIN( drawData.endPt[0], segPtr->u.l.pos[0], 0.0, xx->orig ); +				REORIGIN( drawData.endPt[1], segPtr->u.l.pos[1], 0.0, xx->orig ); +				drawDesc[E0].mode |= DESC_CHANGE; +				drawDesc[E1].mode |= DESC_CHANGE; +				break; +			case SEG_CRVLIN: +			case SEG_FILCRCL: +				REORIGIN( drawData.center, segPtr->u.c.center, 0.0, xx->orig ); +				drawDesc[CE].mode |= DESC_CHANGE; +				break; +			case SEG_TEXT: +				REORIGIN( drawData.endPt[0], segPtr->u.t.pos, 0.0, xx->orig ); +				drawDesc[TP].mode |= DESC_CHANGE; +				break; +			case SEG_POLY: +			case SEG_FILPOLY: +				REORIGIN(drawData.endPt[0], segPtr->u.p.pts[0].pt, 0.0, xx->orig); +				drawDesc[PP].mode |= DESC_CHANGE; +				break; +			default:;  			}  		}  		break; @@ -713,17 +752,18 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  			switch(segPtr->type) {  			case SEG_POLY:  			case SEG_FILPOLY: -				for (int i=0;i<segPtr->u.p.cnt;i++) { +				for (int i=0; i<segPtr->u.p.cnt; i++) {  					UNREORIGIN(pt, segPtr->u.p.pts[i].pt, angle, drawData.origin);  					REORIGIN(segPtr->u.p.pts[i].pt, pt, 0.0, drawData.origin); -					if (i == 0) drawData.endPt[0] = pt; +					if (i == 0) { drawData.endPt[0] = pt; }  				}  				drawDesc[PP].mode |= DESC_CHANGE;  				break;  			case SEG_CRVLIN:;  				coOrd end0, end1;  				Translate(&end0,segPtr->u.c.center,segPtr->u.c.a0,segPtr->u.c.radius); -				Translate(&end1,segPtr->u.c.center,segPtr->u.c.a0+segPtr->u.c.a1,segPtr->u.c.radius); +				Translate(&end1,segPtr->u.c.center,segPtr->u.c.a0+segPtr->u.c.a1, +				          segPtr->u.c.radius);  				REORIGIN(drawData.center, segPtr->u.c.center, angle, drawData.origin);  				REORIGIN(end0, end0, angle, drawData.origin);  				REORIGIN(end1, end1, angle, drawData.origin); @@ -732,9 +772,10 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  				UNREORIGIN(segPtr->u.c.center,drawData.center,0.0,drawData.origin);  				drawDesc[CE].mode |= DESC_CHANGE;  				drawDesc[A1].mode |= DESC_CHANGE; -				/*no break*/ +			/*no break*/  			case SEG_FILCRCL: -				REORIGIN(drawData.center, segPtr->u.c.center, angle, drawData.origin);  //Remove angle +				REORIGIN(drawData.center, segPtr->u.c.center, angle, +				         drawData.origin);  //Remove angle  				UNREORIGIN(segPtr->u.c.center, drawData.center, 0.0, drawData.origin);  				drawDesc[CE].mode |= DESC_CHANGE;  				break; @@ -742,7 +783,7 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  			case SEG_DIMLIN:  			case SEG_BENCH:  			case SEG_TBLEDGE: -				for (int i=0;i<2;i++) { +				for (int i=0; i<2; i++) {  					REORIGIN( drawData.endPt[i], segPtr->u.l.pos[i], angle, drawData.origin );  					UNREORIGIN( segPtr->u.l.pos[i], drawData.endPt[i], 0.0, drawData.origin );  				} @@ -762,80 +803,83 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  			}  		}  		xx->angle = drawData.rotate_angle = 0.0; -		if (!drawData.lock_origin) drawDesc[RA].mode = DESC_RO; +		if (!drawData.lock_origin) { drawDesc[RA].mode = DESC_RO; }  		drawDesc[RA].mode |= DESC_CHANGE;  		break;  	case AL:  //Uses Pivot Point  	case LA:;  		ANGLE_T angle = NormalizeAngle(drawData.angle);  		switch(segPtr->type) { -			case SEG_POLY: -			case SEG_FILPOLY: -				break;			//Doesn't Use -			case SEG_CRVLIN:  //Uses as swept angle -				switch ( drawData.pivot ) { -					case DESC_PIVOT_FIRST: -						segPtr->u.c.a1 = drawData.angle; -						drawData.angle1 = NormalizeAngle( drawData.angle0+segPtr->u.c.a1 ); -						drawDesc[A2].mode |= DESC_CHANGE; -						break; -					case DESC_PIVOT_SECOND: -						segPtr->u.c.a0 = NormalizeAngle( segPtr->u.c.a1+segPtr->u.c.a0-drawData.angle); -						segPtr->u.c.a1 = drawData.angle; -						drawData.angle0 = NormalizeAngle( segPtr->u.c.a0 ); -						drawData.angle1 = NormalizeAngle( drawData.angle0+segPtr->u.c.a1 ); -						drawDesc[A1].mode |= DESC_CHANGE; -						drawDesc[A2].mode |= DESC_CHANGE; -						break; -					case DESC_PIVOT_MID: -						segPtr->u.c.a0 = NormalizeAngle( segPtr->u.c.a0+segPtr->u.c.a1/2.0-drawData.angle/2.0); -						segPtr->u.c.a1 = drawData.angle; -						drawData.angle0 = NormalizeAngle( segPtr->u.c.a0 ); -						drawData.angle1 = NormalizeAngle( drawData.angle0+segPtr->u.c.a1 ); -						drawDesc[A1].mode |= DESC_CHANGE; -						drawDesc[A2].mode |= DESC_CHANGE; -						break; -					default: -						break; -				} -				drawData.length = 2*M_PI*segPtr->u.c.radius*segPtr->u.c.a1/360; -				drawDesc[LN].mode = DESC_RO|DESC_CHANGE; +		case SEG_POLY: +		case SEG_FILPOLY: +			break;			//Doesn't Use +		case SEG_CRVLIN:  //Uses as swept angle +			switch ( drawData.pivot ) { +			case DESC_PIVOT_FIRST: +				segPtr->u.c.a1 = drawData.angle; +				drawData.angle1 = NormalizeAngle( drawData.angle0+segPtr->u.c.a1 ); +				drawDesc[A2].mode |= DESC_CHANGE;  				break; -			case SEG_FILCRCL: -				break;			//Doesn't Use -			case SEG_STRLIN: -			case SEG_DIMLIN: -			case SEG_BENCH: -			case SEG_TBLEDGE: -				switch ( drawData.pivot ) { -					case DESC_PIVOT_FIRST: -						Translate(&drawData.endPt[1],drawData.endPt[0],angle,drawData.length); -				        UNREORIGIN(segPtr->u.l.pos[1], drawData.endPt[1], 0.0, xx->orig ); -				        drawDesc[E1].mode |= DESC_CHANGE; -				        break; -					case DESC_PIVOT_MID:; -						coOrd middle; -						middle.x = (drawData.endPt[1].x+drawData.endPt[0].x)/2; -						middle.y = (drawData.endPt[1].y+drawData.endPt[0].y)/2; -						Translate(&drawData.endPt[0],middle,NormalizeAngle(angle+180),drawData.length/2); -						Translate(&drawData.endPt[1],middle,angle,drawData.length/2); -						UNREORIGIN(segPtr->u.l.pos[0], drawData.endPt[0], 0.0, xx->orig ); -						UNREORIGIN(segPtr->u.l.pos[1], drawData.endPt[1], 0.0, xx->orig ); -						drawDesc[E0].mode |= DESC_CHANGE; -						drawDesc[E1].mode |= DESC_CHANGE; -						break; -					case DESC_PIVOT_SECOND: -						Translate(&drawData.endPt[0],drawData.endPt[1],NormalizeAngle(angle+180),drawData.length); -				        UNREORIGIN(segPtr->u.l.pos[0], drawData.endPt[0], 0.0, xx->orig ); -						drawDesc[E0].mode |= DESC_CHANGE; -						break; -					default: -						break; -				} +			case DESC_PIVOT_SECOND: +				segPtr->u.c.a0 = NormalizeAngle( segPtr->u.c.a1+segPtr->u.c.a0-drawData.angle); +				segPtr->u.c.a1 = drawData.angle; +				drawData.angle0 = NormalizeAngle( segPtr->u.c.a0 ); +				drawData.angle1 = NormalizeAngle( drawData.angle0+segPtr->u.c.a1 ); +				drawDesc[A1].mode |= DESC_CHANGE; +				drawDesc[A2].mode |= DESC_CHANGE;  				break; -			case SEG_TEXT: -			    break; //Doesnt Use -			default:; +			case DESC_PIVOT_MID: +				segPtr->u.c.a0 = NormalizeAngle( segPtr->u.c.a0+segPtr->u.c.a1/2.0 +				                                 -drawData.angle/2.0); +				segPtr->u.c.a1 = drawData.angle; +				drawData.angle0 = NormalizeAngle( segPtr->u.c.a0 ); +				drawData.angle1 = NormalizeAngle( drawData.angle0+segPtr->u.c.a1 ); +				drawDesc[A1].mode |= DESC_CHANGE; +				drawDesc[A2].mode |= DESC_CHANGE; +				break; +			default: +				break; +			} +			drawData.length = 2*M_PI*segPtr->u.c.radius*segPtr->u.c.a1/360; +			drawDesc[LN].mode = DESC_RO|DESC_CHANGE; +			break; +		case SEG_FILCRCL: +			break;			//Doesn't Use +		case SEG_STRLIN: +		case SEG_DIMLIN: +		case SEG_BENCH: +		case SEG_TBLEDGE: +			switch ( drawData.pivot ) { +			case DESC_PIVOT_FIRST: +				Translate(&drawData.endPt[1],drawData.endPt[0],angle,drawData.length); +				UNREORIGIN(segPtr->u.l.pos[1], drawData.endPt[1], 0.0, xx->orig ); +				drawDesc[E1].mode |= DESC_CHANGE; +				break; +			case DESC_PIVOT_MID:; +				coOrd middle; +				middle.x = (drawData.endPt[1].x+drawData.endPt[0].x)/2; +				middle.y = (drawData.endPt[1].y+drawData.endPt[0].y)/2; +				Translate(&drawData.endPt[0],middle,NormalizeAngle(angle+180), +				          drawData.length/2); +				Translate(&drawData.endPt[1],middle,angle,drawData.length/2); +				UNREORIGIN(segPtr->u.l.pos[0], drawData.endPt[0], 0.0, xx->orig ); +				UNREORIGIN(segPtr->u.l.pos[1], drawData.endPt[1], 0.0, xx->orig ); +				drawDesc[E0].mode |= DESC_CHANGE; +				drawDesc[E1].mode |= DESC_CHANGE; +				break; +			case DESC_PIVOT_SECOND: +				Translate(&drawData.endPt[0],drawData.endPt[1],NormalizeAngle(angle+180), +				          drawData.length); +				UNREORIGIN(segPtr->u.l.pos[0], drawData.endPt[0], 0.0, xx->orig ); +				drawDesc[E0].mode |= DESC_CHANGE; +				break; +			default: +				break; +			} +			break; +		case SEG_TEXT: +			break; //Doesnt Use +		default:;  		}  		break;  	case LN: @@ -848,12 +892,14 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  		if ( segPtr->type != SEG_CRVLIN  ) {  			switch ( drawData.pivot ) {  			case DESC_PIVOT_FIRST: -				Translate( &drawData.endPt[1], drawData.endPt[0], drawData.angle, drawData.length ); +				Translate( &drawData.endPt[1], drawData.endPt[0], drawData.angle, +				           drawData.length );  				UNREORIGIN( segPtr->u.l.pos[1], drawData.endPt[1], 0.0, xx->orig );  				drawDesc[E1].mode |= DESC_CHANGE;  				break;  			case DESC_PIVOT_SECOND: -				Translate( &drawData.endPt[0], drawData.endPt[1], drawData.angle+180.0, drawData.length ); +				Translate( &drawData.endPt[0], drawData.endPt[1], drawData.angle+180.0, +				           drawData.length );  				UNREORIGIN( segPtr->u.l.pos[0], drawData.endPt[0], 0.0, xx->orig );  				drawDesc[E0].mode |= DESC_CHANGE;  				break; @@ -877,15 +923,19 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  		break;  	case RD:  		if ( drawData.pivot == DESC_PIVOT_FIRST ) { -			Translate( &segPtr->u.c.center, segPtr->u.c.center, segPtr->u.c.a0, segPtr->u.c.radius-drawData.radius ); +			Translate( &segPtr->u.c.center, segPtr->u.c.center, segPtr->u.c.a0, +			           segPtr->u.c.radius-drawData.radius );  		} else if ( drawData.pivot == DESC_PIVOT_SECOND ) { -			Translate( &segPtr->u.c.center, segPtr->u.c.center, segPtr->u.c.a0+segPtr->u.c.a1, segPtr->u.c.radius-drawData.radius ); +			Translate( &segPtr->u.c.center, segPtr->u.c.center, +			           segPtr->u.c.a0+segPtr->u.c.a1, segPtr->u.c.radius-drawData.radius );  		} else { -			Translate( &segPtr->u.c.center, segPtr->u.c.center, (segPtr->u.c.a0+segPtr->u.c.a1)/2.0, segPtr->u.c.radius-drawData.radius ); +			Translate( &segPtr->u.c.center, segPtr->u.c.center, +			           (segPtr->u.c.a0+segPtr->u.c.a1)/2.0, segPtr->u.c.radius-drawData.radius );  		}  		drawDesc[CE].mode |= DESC_CHANGE;  		segPtr->u.c.radius = drawData.radius; -		drawData.length = 2*M_PI*segPtr->u.c.radius*(segPtr->type==SEG_CRVLIN?segPtr->u.c.a1/360:1.0); +		drawData.length = 2*M_PI*segPtr->u.c.radius*(segPtr->type==SEG_CRVLIN +		                  ?segPtr->u.c.a1/360:1.0);  		drawDesc[LN].mode = DESC_RO|DESC_CHANGE;  		break;  	case A1:  //Angle of first point of curve @@ -899,15 +949,19 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  		drawDesc[A1].mode |= DESC_CHANGE;  		break;  	case BE: -		BenchUpdateOrientationList( VP2L( wListGetItemContext((wList_p)drawDesc[BE].control0, drawData.benchChoice)), (wList_p)drawDesc[OR].control0 ); -		if ( drawData.benchOrient < wListGetCount( (wList_p)drawDesc[OR].control0 ) ) +		BenchUpdateOrientationList( VP2L( wListGetItemContext((wList_p) +		                                  drawDesc[BE].control0, drawData.benchChoice)), (wList_p)drawDesc[OR].control0 ); +		if ( drawData.benchOrient < wListGetCount( (wList_p)drawDesc[OR].control0 ) ) {  			wListSetIndex( (wList_p)drawDesc[OR].control0, drawData.benchOrient ); -		else +		} else {  			drawData.benchOrient = 0; -		segPtr->u.l.option = GetBenchData( VP2L(wListGetItemContext((wList_p)drawDesc[BE].control0, drawData.benchChoice)), drawData.benchOrient ); +		} +		segPtr->u.l.option = GetBenchData( VP2L(wListGetItemContext(( +		                wList_p)drawDesc[BE].control0, drawData.benchChoice)), drawData.benchOrient );  		break;  	case OR: -		segPtr->u.l.option = GetBenchData( VP2L(wListGetItemContext((wList_p)drawDesc[BE].control0, drawData.benchChoice)), drawData.benchOrient ); +		segPtr->u.l.option = GetBenchData( VP2L(wListGetItemContext(( +		                wList_p)drawDesc[BE].control0, drawData.benchChoice)), drawData.benchOrient );  		break;  	case DS:  		segPtr->u.l.option = drawData.dimenSize; @@ -918,7 +972,7 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  	case PP:  		off.x = drawData.endPt[0].x - drawData.oldE0.x;  		off.y = drawData.endPt[0].y - drawData.oldE0.y; -		for (int i=0;i<segPtr->u.p.cnt;i++) { +		for (int i=0; i<segPtr->u.p.cnt; i++) {  			REORIGIN( pt, segPtr->u.p.pts[i].pt, 0.0, xx->orig );  			pt.x += off.x;  			pt.y += off.y; @@ -933,7 +987,8 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  		break;  	case TS:  		fontSize = (long)segPtr->u.t.fontSize; -		UpdateFontSizeList( &fontSize, (wList_p)drawDesc[TS].control0, drawData.fontSizeInx ); +		UpdateFontSizeList( &fontSize, (wList_p)drawDesc[TS].control0, +		                    drawData.fontSizeInx );  		segPtr->u.t.fontSize = fontSize;  		break;  	case FL: @@ -946,7 +1001,6 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  		if(drawData.filled) {  			if (segPtr->type == SEG_POLY) {  				segPtr->type = SEG_FILPOLY; -				segPtr->u.p.polyType = FREEFORM;  				drawData.open = FALSE;  				drawDesc[OP].mode = DESC_RO|DESC_CHANGE;  			} @@ -958,7 +1012,6 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  		} else {  			if (segPtr->type == SEG_FILPOLY) {  				segPtr->type = SEG_POLY; -				segPtr->u.p.polyType = FREEFORM;  				drawData.open = FALSE;  				drawDesc[OP].mode = DESC_CHANGE;  			} @@ -995,9 +1048,16 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  		segPtr->u.t.boxed = drawData.boxed;  		break;  	case TX: -		if ( wTextGetModified((wText_p)drawDesc[TX].control0 )) { +		if ( wTextGetModified((wText_p)drawDesc[TX].control0 ) || +		     inPlayback ) {  			int len = wTextGetSize((wText_p)drawDesc[TX].control0); -			MyFree( segPtr->u.t.string ); +			// TODO - minor memory leak, but this allows Undo on text object.  See BUG-527 +			// MyFree( segPtr->u.t.string ); +			if ( !descUndoStarted ) { +				UndoStart( _("Change Track"), "Change Track"); +				descUndoStarted = TRUE; +			} +			UndoModify( trk );  			if (len>STR_HUGE_SIZE-8) {                   //Truncate string to max  				len = STR_HUGE_SIZE-8;  				ErrorMessage( MSG_TEXT_TOO_LONG ); @@ -1024,7 +1084,7 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  		xx->lineType = drawData.lineType;  		break;  	default: -		AbortProg( "bad op" ); +		CHECKMSG( FALSE,  ( "bad op: %d", inx ) );  	}  	drawData.oldE0 = drawData.endPt[0];  	drawData.oldE1 = drawData.endPt[1]; @@ -1035,7 +1095,6 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final )  	TempRedraw(); // UpdateDraw  } -extern BOOL_T inDescribeCmd;  static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  { @@ -1044,12 +1103,13 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  	trkSeg_p segPtr;  	int inx;  	char * title = NULL; -	char * polyType = NULL; +//	char * polyType = NULL;  	DistanceSegs( xx->orig, xx->angle, xx->segCnt, xx->segs, &pos, &drawSegInx ); -	if ( drawSegInx==-1 ) +	if ( drawSegInx==-1 ) {  		return; +	}  	segPtr = &xx->segs[drawSegInx];  	for ( inx=0; inx<COUNT( drawDesc ); inx++ ) {  		drawDesc[inx].mode = DESC_IGNORE; @@ -1058,20 +1118,17 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  	drawData.color = segPtr->color;  	drawData.layer = GetTrkLayer(trk);  	drawDesc[CO].mode = 0; -	if (drawData.lineWidth<0) -		drawData.lineWidth = (long)segPtr->width; -	else -		drawData.lineWidth = (long)floor(segPtr->width*75.0+0.5); +	drawData.lineWidth = segPtr->lineWidth;  	drawDesc[LW].mode = 0;  	drawDesc[LY].mode = DESC_NOREDRAW;  	drawDesc[BE].mode = -	drawDesc[OR].mode = -	drawDesc[LT].mode = -	drawDesc[DS].mode = DESC_IGNORE; +	        drawDesc[OR].mode = +	                drawDesc[LT].mode = +	                        drawDesc[DS].mode = DESC_IGNORE;  	drawData.pivot = DESC_PIVOT_MID; -	if ((xx->orig.x == 0.0) && (xx->orig.y == 0.0)) drawData.lock_origin = FALSE; -	else drawData.lock_origin = TRUE; +	if ((xx->orig.x == 0.0) && (xx->orig.y == 0.0)) { drawData.lock_origin = FALSE; } +	else { drawData.lock_origin = TRUE; }  	drawData.rotate_angle = 0.0; @@ -1092,14 +1149,14 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  		UNREORIGIN(segPtr->u.l.pos[1], drawData.endPt[1], 0.0, xx->orig);  		xx->angle = 0.0;  		drawDesc[LN].mode = -		drawDesc[LA].mode = -		drawDesc[PV].mode = 0; +		        drawDesc[LA].mode = +		                drawDesc[PV].mode = 0;  		drawDesc[E0].mode = -		drawDesc[OI].mode = 0; +		        drawDesc[OI].mode = 0;  		drawDesc[E1].mode = 0;  		drawDesc[RA].mode = 0; -		if (!drawData.lock_origin) drawDesc[RA].mode = DESC_RO; -		else drawDesc[RA].mode = 0; +		if (!drawData.lock_origin) { drawDesc[RA].mode = DESC_RO; } +		else { drawDesc[RA].mode = 0; }  		switch (segPtr->type) {  		case SEG_STRLIN:  			title = _("Straight Line"); @@ -1109,29 +1166,29 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  		case SEG_DIMLIN:  			title = _("Dimension Line");  			drawDesc[CO].mode = -			drawDesc[LW].mode = -			drawDesc[LK].mode = -			drawDesc[OI].mode = -			drawDesc[RA].mode = DESC_IGNORE; +			        drawDesc[LW].mode = +			                drawDesc[LK].mode = +			                        drawDesc[OI].mode = +			                                drawDesc[RA].mode = DESC_IGNORE;  			drawData.dimenSize = (wIndex_t)segPtr->u.l.option;  			drawDesc[DS].mode = 0;  			break;  		case SEG_BENCH:  			title = _("Lumber");  			drawDesc[LK].mode = -			drawDesc[OI].mode = -			drawDesc[RA].mode = -			drawDesc[LW].mode = DESC_IGNORE; +			        drawDesc[OI].mode = +			                drawDesc[RA].mode = +			                        drawDesc[LW].mode = DESC_IGNORE;  			drawDesc[BE].mode = -			drawDesc[OR].mode = 0; +			        drawDesc[OR].mode = 0;  			drawData.benchChoice = GetBenchListIndex( segPtr->u.l.option );  			drawData.benchOrient = (wIndex_t)(segPtr->u.l.option&0xFF);  			break;  		case SEG_TBLEDGE:  			title = _("Table Edge");  			drawDesc[LK].mode = -			drawDesc[OI].mode = -			drawDesc[RA].mode = DESC_IGNORE; +			        drawDesc[OI].mode = +			                drawDesc[RA].mode = DESC_IGNORE;  			drawDesc[CO].mode = DESC_IGNORE;  			drawDesc[LW].mode = DESC_IGNORE;  			break; @@ -1141,14 +1198,14 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  		REORIGIN( drawData.center, segPtr->u.c.center, xx->angle, xx->orig );  		//Remove input Angle (if any)  		UNREORIGIN(segPtr->u.c.center, drawData.center, 0.0, xx->orig); -	    xx->angle = 0.0; +		xx->angle = 0.0;  		drawData.radius = fabs(segPtr->u.c.radius);  		drawData.origin = xx->orig;  		drawDesc[OI].mode = 0;  		drawDesc[CE].mode = -		drawDesc[RD].mode = 0; -		if (!drawData.lock_origin) drawDesc[RA].mode = DESC_RO; -		else drawDesc[RA].mode = 0; +		        drawDesc[RD].mode = 0; +		if (!drawData.lock_origin) { drawDesc[RA].mode = DESC_RO; } +		else { drawDesc[RA].mode = 0; }  		drawDesc[LT].mode = 0;  		drawData.lineType = (wIndex_t)xx->lineType;  		if ( segPtr->u.c.a1 >= 360.0 ) { @@ -1164,8 +1221,8 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  			drawDesc[LN].mode = DESC_RO;  			drawData.length = 2*M_PI*segPtr->u.c.radius*segPtr->u.c.a1/360;  			drawDesc[AL].mode = -			drawDesc[A1].mode = -			drawDesc[A2].mode = 0; +			        drawDesc[A1].mode = +			                drawDesc[A2].mode = 0;  			drawDesc[PV].mode = 0;  			title = _("Curved Line");  		} @@ -1174,18 +1231,18 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  		REORIGIN( drawData.center, segPtr->u.c.center, xx->angle, xx->orig );  		//Remove input Angle (if any)  		UNREORIGIN(segPtr->u.c.center, drawData.center, 0.0, xx->orig); -	    xx->angle = 0.0; +		xx->angle = 0.0;  		drawData.radius = fabs(segPtr->u.c.radius);  		drawData.origin = xx->orig;  		drawDesc[OI].mode = -		drawDesc[FL].mode = 0; -		if (!drawData.lock_origin) drawDesc[RA].mode = DESC_RO; -		else drawDesc[RA].mode = 0; +		        drawDesc[FL].mode = 0; +		if (!drawData.lock_origin) { drawDesc[RA].mode = DESC_RO; } +		else { drawDesc[RA].mode = 0; }  		drawData.filled = TRUE;  		drawData.length = 0.0;  		drawDesc[LN].mode = DESC_RO;  		drawDesc[CE].mode = -		drawDesc[RD].mode = 0; +		        drawDesc[RD].mode = 0;  		drawDesc[PV].mode = 0;  		drawDesc[OI].mode = 0;  		drawDesc[LW].mode = DESC_IGNORE; @@ -1194,10 +1251,10 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  	case SEG_POLY:  	case SEG_FILPOLY:;  		BOOL_T filled = FALSE; -		if (segPtr->type == SEG_FILPOLY) filled = TRUE; +		if (segPtr->type == SEG_FILPOLY) { filled = TRUE; }  		REORIGIN(drawData.endPt[0],segPtr->u.p.pts[0].pt, xx->angle, xx->orig);  		//Remove input Angle (if any) -		for (int i=0;i<segPtr->u.p.cnt;i++) { +		for (int i=0; i<segPtr->u.p.cnt; i++) {  			coOrd pt;  			REORIGIN(pt,segPtr->u.p.pts[i].pt, xx->angle, xx->orig);  			UNREORIGIN(segPtr->u.p.pts[i].pt, pt, 0.0, xx->orig); @@ -1209,8 +1266,8 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  		drawData.filled = filled;  		drawDesc[FL].mode = 0;  		drawData.angle = 0.0; -		if (!drawData.lock_origin) drawDesc[RA].mode = DESC_RO; -		else drawDesc[RA].mode = 0; +		if (!drawData.lock_origin) { drawDesc[RA].mode = DESC_RO; } +		else { drawDesc[RA].mode = 0; }  		drawData.origin = xx->orig;  		drawDesc[OI].mode = 0;  		drawData.open= FALSE; @@ -1218,29 +1275,29 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  		drawDesc[LT].mode = 0;  		drawData.lineType = (wIndex_t)xx->lineType;  		switch (segPtr->u.p.polyType) { -			case RECTANGLE: -				title = filled?_("Filled Rectangle"):_("Rectangle"); -				drawDesc[OP].mode = DESC_IGNORE; -				drawDesc[VC].mode = DESC_IGNORE; -				drawData.width = FindDistance(segPtr->u.p.pts[0].pt, segPtr->u.p.pts[1].pt); -				drawDesc[WT].mode = 0; -				drawData.height = FindDistance(segPtr->u.p.pts[0].pt, segPtr->u.p.pts[3].pt); -				drawDesc[HT].mode = 0; -				for(int i=0;i<4;i++) { -					REORIGIN( drawData.endPt[i], segPtr->u.p.pts[i].pt, xx->angle, xx->orig ); -				} -				drawDesc[E0].mode = DESC_IGNORE; -				drawData.origin = xx->orig; -				break; -			case POLYLINE: -				title = _("Polyline"); -				drawData.open=TRUE; -				drawData.filled= FALSE; -				drawDesc[FL].mode = DESC_RO; -				drawDesc[OP].mode = 0; -				break; -			default: -				title = filled?_("Filled Polygon"):_("Polygon"); +		case RECTANGLE: +			title = filled?_("Filled Rectangle"):_("Rectangle"); +			drawDesc[OP].mode = DESC_IGNORE; +			drawDesc[VC].mode = DESC_IGNORE; +			drawData.width = FindDistance(segPtr->u.p.pts[0].pt, segPtr->u.p.pts[1].pt); +			drawDesc[WT].mode = 0; +			drawData.height = FindDistance(segPtr->u.p.pts[0].pt, segPtr->u.p.pts[3].pt); +			drawDesc[HT].mode = 0; +			for(int i=0; i<4; i++) { +				REORIGIN( drawData.endPt[i], segPtr->u.p.pts[i].pt, xx->angle, xx->orig ); +			} +			drawDesc[E0].mode = DESC_IGNORE; +			drawData.origin = xx->orig; +			break; +		case POLYLINE: +			title = _("Polyline"); +			drawData.open=TRUE; +			drawData.filled= FALSE; +			drawDesc[FL].mode = DESC_RO; +			drawDesc[OP].mode = 0; +			break; +		default: +			title = filled?_("Filled Polygon"):_("Polygon");  		}  		break;  	case SEG_TEXT: @@ -1253,16 +1310,16 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  		drawData.text[sizeof drawData.text-1] ='\0';  		drawData.boxed = segPtr->u.t.boxed;  		drawDesc[TP].mode = -		drawDesc[TS].mode = -		drawDesc[TX].mode =  -		drawDesc[TA].mode = -		drawDesc[LK].mode = -		drawDesc[OI].mode = -		drawDesc[BX].mode = 0; -		if (!drawData.lock_origin) drawDesc[RA].mode = DESC_RO; -		else drawDesc[RA].mode = 0; +		        drawDesc[TS].mode = +		                drawDesc[TX].mode = +		                        drawDesc[TA].mode = +		                                drawDesc[LK].mode = +		                                        drawDesc[OI].mode = +		                                                        drawDesc[BX].mode = 0; +		if (!drawData.lock_origin) { drawDesc[RA].mode = DESC_RO; } +		else { drawDesc[RA].mode = 0; }  		drawDesc[E0].mode = DESC_IGNORE; -        drawDesc[CO].mode = 0;  /*Allow Text color setting*/ +		drawDesc[CO].mode = 0;  /*Allow Text color setting*/  		drawDesc[LW].mode = DESC_IGNORE;  		title = _("Text");  		break; @@ -1270,9 +1327,10 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  		;  	} -	snprintf( str, len, _("%s(%d) Layer=%d"), title, GetTrkIndex(trk), GetTrkLayer(trk)+1 ); +	snprintf( str, len, _("%s(%d) Layer=%d"), title, GetTrkIndex(trk), +	          GetTrkLayer(trk)+1 ); -	if (!inDescribeCmd) return; +	if (!inDescribeCmd) { return; }  	drawData.oldE0 = drawData.endPt[0];  	drawData.oldE1 = drawData.endPt[1]; @@ -1282,13 +1340,17 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len )  	DoDescribe( title, trk, drawDesc, UpdateDraw ); -	if ( segPtr->type==SEG_BENCH && drawDesc[BE].control0!=NULL && drawDesc[OR].control0!=NULL) { -		BenchLoadLists( (wList_p)drawDesc[BE].control0, (wList_p)drawDesc[OR].control0 ); +	if ( segPtr->type==SEG_BENCH && drawDesc[BE].control0!=NULL +	     && drawDesc[OR].control0!=NULL) { +		BenchLoadLists( (wList_p)drawDesc[BE].control0, +		                (wList_p)drawDesc[OR].control0 );  		wListSetIndex( (wList_p)drawDesc[BE].control0, drawData.benchChoice ); -		BenchUpdateOrientationList( VP2L(wListGetItemContext((wList_p)drawDesc[BE].control0, drawData.benchChoice)), (wList_p)drawDesc[OR].control0 ); +		BenchUpdateOrientationList( VP2L(wListGetItemContext((wList_p) +		                                 drawDesc[BE].control0, drawData.benchChoice)), (wList_p)drawDesc[OR].control0 );  		wListSetIndex( (wList_p)drawDesc[OR].control0, drawData.benchOrient );  	} -	if ( (segPtr->type==SEG_STRLIN || segPtr->type==SEG_CRVLIN || segPtr->type==SEG_POLY) && drawDesc[LT].control0!=NULL) { +	if ( (segPtr->type==SEG_STRLIN || segPtr->type==SEG_CRVLIN +	      || segPtr->type==SEG_POLY) && drawDesc[LT].control0!=NULL) {  		wListClear( (wList_p)drawDesc[LT].control0 );  		wListAddValue( (wList_p)drawDesc[LT].control0, _("Solid"), NULL, I2VP(0 ));  		wListAddValue( (wList_p)drawDesc[LT].control0, _("Dash"), NULL, I2VP(1 )); @@ -1319,12 +1381,12 @@ static void DrawDraw( track_p t, drawCmd_p d, wDrawColor color )  	unsigned long NotSolid = ~(DC_NOTSOLIDLINE);  	d->options &= NotSolid;  	if (xx->lineType == DRAWLINESOLID) {} -	else if (xx->lineType == DRAWLINEDASH) d->options |= DC_DASH; -	else if (xx->lineType == DRAWLINEDOT) d->options |= DC_DOT; -	else if (xx->lineType == DRAWLINEDASHDOT) d->options |= DC_DASHDOT; -	else if (xx->lineType == DRAWLINEDASHDOTDOT) d->options |= DC_DASHDOTDOT; -	else if (xx->lineType == DRAWLINECENTER) d->options |= DC_CENTER; -	else if (xx->lineType == DRAWLINEPHANTOM) d->options |= DC_PHANTOM; +	else if (xx->lineType == DRAWLINEDASH) { d->options |= DC_DASH; } +	else if (xx->lineType == DRAWLINEDOT) { d->options |= DC_DOT; } +	else if (xx->lineType == DRAWLINEDASHDOT) { d->options |= DC_DASHDOT; } +	else if (xx->lineType == DRAWLINEDASHDOTDOT) { d->options |= DC_DASHDOTDOT; } +	else if (xx->lineType == DRAWLINECENTER) { d->options |= DC_CENTER; } +	else if (xx->lineType == DRAWLINEPHANTOM) { d->options |= DC_PHANTOM; }  	DrawSegs( d, xx->orig, xx->angle, xx->segs, xx->segCnt, 0.0, color );  	d->options = d->options&~(DC_NOTSOLIDLINE);  } @@ -1335,7 +1397,7 @@ static void DeleteDraw( track_p t )  	/* Get rid of points if specified */  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(t, T_DRAW, extraDataDraw_t);  	if (xx->segs[0].type == SEG_POLY || -			xx->segs[0].type == SEG_FILPOLY) { +	    xx->segs[0].type == SEG_FILPOLY) {  		MyFree(xx->segs[0].u.p.pts);  		xx->segs[0].u.p.pts = NULL;  	} @@ -1346,9 +1408,10 @@ static BOOL_T WriteDraw( track_p t, FILE * f )  {  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(t, T_DRAW, extraDataDraw_t);  	BOOL_T rc = TRUE; -	rc &= fprintf(f, "DRAW %d %d %d 0 0 %0.6f %0.6f 0 %0.6f\n", GetTrkIndex(t), GetTrkLayer(t), -				xx->lineType, -				xx->orig.x, xx->orig.y, xx->angle )>0; +	rc &= fprintf(f, "DRAW %d %d %d 0 0 %0.6f %0.6f 0 %0.6f\n", GetTrkIndex(t), +	              GetTrkLayer(t), +	              xx->lineType, +	              xx->orig.x, xx->orig.y, xx->angle )>0;  	rc &= WriteSegs( f, xx->segCnt, xx->segs );  	return rc;  } @@ -1365,25 +1428,29 @@ static BOOL_T ReadDraw( char * header )  	int lineType;  	struct extraDataDraw_t * xx; -	if ( !GetArgs( header+5, paramVersion<3?"dXXpYf":paramVersion<9?"dLX00pYf":"dLd00pff", -				&index, &layer, &lineType, &orig, &elev, &angle ) ) +	if ( !GetArgs( header+5, +	               paramVersion<3?"dXXpYf":paramVersion<9?"dLX00pYf":"dLd00pff", +	               &index, &layer, &lineType, &orig, &elev, &angle ) ) {  		return FALSE; -	if ( !ReadSegs() ) +	} +	if ( !ReadSegs() ) {  		return FALSE; +	}  	if (tempSegs_da.cnt == 1) {  		trk = MakeDrawFromSeg1( index, orig, angle, &tempSegs(0) );  		xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t);  		xx->lineType = lineType;  		SetTrkLayer( trk, layer );  	} else { -		trk = NewTrack( index, T_DRAW, 0, sizeof *xx + (tempSegs_da.cnt-1) * sizeof *(trkSeg_p)0 ); +		trk = NewTrack( index, T_DRAW, 0, +		                sizeof *xx + (tempSegs_da.cnt-1) * sizeof *(trkSeg_p)0 );  		SetTrkLayer( trk, layer );  		xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t);  		xx->orig = orig;  		xx->angle = angle;  		xx->segCnt = tempSegs_da.cnt;  		xx->lineType = lineType; -		memcpy( xx->segs, tempSegs_da.ptr, tempSegs_da.cnt * sizeof *(trkSeg_p)0 ); +		memcpy( xx->segs, &tempSegs(0), tempSegs_da.cnt * sizeof *(trkSeg_p)0 );  		ComputeDrawBoundingBox( trk );  	}  	return TRUE; @@ -1398,28 +1465,28 @@ static void MoveDraw( track_p trk, coOrd off )  	if (xx->orig.x == 0.0 && xx->orig.y == 0.0) {   //No origin set  		switch(segPtr->type) { -			case SEG_POLY: -			case SEG_FILPOLY: -				for (int i=0;i<segPtr->u.p.cnt;i++) { -					REORIGIN( segPtr->u.p.pts[i].pt, segPtr->u.p.pts[i].pt, 0.0, off ); -				} +		case SEG_POLY: +		case SEG_FILPOLY: +			for (int i=0; i<segPtr->u.p.cnt; i++) { +				REORIGIN( segPtr->u.p.pts[i].pt, segPtr->u.p.pts[i].pt, 0.0, off ); +			}  			break; -			case SEG_STRLIN: -			case SEG_DIMLIN: -			case SEG_BENCH: -			case SEG_TBLEDGE: -				for (int i=0;i<2;i++) { -					REORIGIN( segPtr->u.l.pos[i], segPtr->u.l.pos[i], 0.0, off ); -				} -				break; -			case SEG_CRVLIN: -			case SEG_FILCRCL: -				REORIGIN( segPtr->u.c.center, segPtr->u.c.center, 0.0, off ); -				break; -			case SEG_TEXT: -				REORIGIN( segPtr->u.t.pos, segPtr->u.t.pos, 0.0, off ); -				break; -			default:; +		case SEG_STRLIN: +		case SEG_DIMLIN: +		case SEG_BENCH: +		case SEG_TBLEDGE: +			for (int i=0; i<2; i++) { +				REORIGIN( segPtr->u.l.pos[i], segPtr->u.l.pos[i], 0.0, off ); +			} +			break; +		case SEG_CRVLIN: +		case SEG_FILCRCL: +			REORIGIN( segPtr->u.c.center, segPtr->u.c.center, 0.0, off ); +			break; +		case SEG_TEXT: +			REORIGIN( segPtr->u.t.pos, segPtr->u.t.pos, 0.0, off ); +			break; +		default:;  		}  	} else { @@ -1436,30 +1503,30 @@ static void RotateDraw( track_p trk, coOrd orig, ANGLE_T angle )  	trkSeg_p segPtr = &xx->segs[0];  	if (xx->orig.x == 0.0 && xx->orig.y == 0.0) {   //No origin set  		switch(segPtr->type) { -			case SEG_POLY: -			case SEG_FILPOLY: -				for (int i=0;i<segPtr->u.p.cnt;i++) { -					Rotate(&segPtr->u.p.pts[i].pt, orig, angle ); -				} +		case SEG_POLY: +		case SEG_FILPOLY: +			for (int i=0; i<segPtr->u.p.cnt; i++) { +				Rotate(&segPtr->u.p.pts[i].pt, orig, angle ); +			}  			break; -			case SEG_STRLIN: -			case SEG_DIMLIN: -			case SEG_BENCH: -			case SEG_TBLEDGE: -				for (int i=0;i<2;i++) { -					Rotate( &segPtr->u.l.pos[i], orig, angle ); -				} -				break; -			case SEG_CRVLIN: -			case SEG_FILCRCL: -				Rotate( &segPtr->u.c.center, orig, angle ); -				segPtr->u.c.a0 = NormalizeAngle(segPtr->u.c.a0 + angle); -				break; -			case SEG_TEXT: -				Rotate( &segPtr->u.t.pos, orig, angle ); -				segPtr->u.t.angle = NormalizeAngle(segPtr->u.t.angle+angle+xx->angle); -				break; -			default:; +		case SEG_STRLIN: +		case SEG_DIMLIN: +		case SEG_BENCH: +		case SEG_TBLEDGE: +			for (int i=0; i<2; i++) { +				Rotate( &segPtr->u.l.pos[i], orig, angle ); +			} +			break; +		case SEG_CRVLIN: +		case SEG_FILCRCL: +			Rotate( &segPtr->u.c.center, orig, angle ); +			segPtr->u.c.a0 = NormalizeAngle(segPtr->u.c.a0 + angle); +			break; +		case SEG_TEXT: +			Rotate( &segPtr->u.t.pos, orig, angle ); +			segPtr->u.t.angle = NormalizeAngle(segPtr->u.t.angle+angle+xx->angle); +			break; +		default:;  		}  	} else {  		Rotate( &xx->orig, orig, angle ); @@ -1477,23 +1544,27 @@ static void RescaleDraw( track_p trk, FLOAT_T ratio )  	RescaleSegs( xx->segCnt, xx->segs, ratio, ratio, ratio );  } -static void DoConvertFill(void) { +#if 0 +static void DoConvertFill(void) +{  } +#endif  static drawModContext_t drawModCmdContext = { -		InfoMessage, -		DoRedraw, -		&mainD}; +	InfoMessage, +	DoRedraw, +	&mainD +};  static BOOL_T infoSubst = FALSE; -static paramIntegerRange_t i100_100 = { -100, 100, 25 };  //Allow negative numbers +static paramFloatRange_t r100_100 = { -100.0, 100.0, 50 };  //Allow negative numbers  static paramFloatRange_t r0d001_10000 = { 0.001, 10000 }; -static paramFloatRange_t r1_10000 = { 1, 10000 }; +//static paramFloatRange_t r1_10000 = { 1, 10000 };  static paramFloatRange_t r0_10000 = { 0, 10000 }; -static paramFloatRange_t r10000_10000 = {-10000, 10000}; +//static paramFloatRange_t r10000_10000 = {-10000, 10000};  static paramFloatRange_t r360_360 = { -360, 360, 80 };  static paramFloatRange_t r0_360 = { 0, 360, 80 };  static paramData_t drawModPLs[] = { @@ -1526,15 +1597,16 @@ static paramData_t drawModPLs[] = {  static paramGroup_t drawModPG = { "drawMod", 0, drawModPLs, COUNT( drawModPLs ) };  static void DrawModDlgUpdate( -		paramGroup_p pg, -		int inx, -		void * valueP ) +        paramGroup_p pg, +        int inx, +        void * valueP )  { -	 DrawGeomModify(C_UPDATE,zero,&drawModCmdContext); -	 ParamLoadControl(&drawModPG,drawModRotCenterInx-1);	  	//Make sure the angle is updated in case center moved -	 ParamLoadControl(&drawModPG,drawModRadius);			 	// Make sure Radius updated -	 ParamLoadControl(&drawModPG,drawModRelAngle);				//Relative Angle as well -	 MainRedraw(); +	DrawGeomModify(C_UPDATE,zero,&drawModCmdContext); +	ParamLoadControl(&drawModPG, +	                 drawModRotCenterInx-1);	  	//Make sure the angle is updated in case center moved +	ParamLoadControl(&drawModPG,drawModRadius);			 	// Make sure Radius updated +	ParamLoadControl(&drawModPG,drawModRelAngle);				//Relative Angle as well +	MainRedraw();  } @@ -1556,20 +1628,23 @@ static STATUS_T ModifyDraw( track_p trk, wAction_t action, coOrd pos )  	switch(action&0xFF) {     //Remove Text value  	case C_START: +		for (int inx = 0; inx < COUNT(drawModPLs); ++inx ) { +			drawModPLs[inx].option |= PDO_DLGIGNORE; +		}  		drawModCmdContext.type = xx->segs[0].type;  		switch(drawModCmdContext.type) { -			case SEG_POLY: -			case SEG_FILPOLY: -				drawModCmdContext.filled = (drawModCmdContext.type==SEG_FILPOLY)?TRUE:FALSE; -				drawModCmdContext.subtype = xx->segs[0].u.p.polyType; -				drawModCmdContext.open = (drawModCmdContext.subtype==POLYLINE)?TRUE:FALSE; -				break; -			case SEG_TEXT: -				InfoMessage("Text can only be modified in Describe Mode"); -				wBeep(); -				return C_ERROR; -			default: -				break; +		case SEG_POLY: +		case SEG_FILPOLY: +			drawModCmdContext.filled = (drawModCmdContext.type==SEG_FILPOLY)?TRUE:FALSE; +			drawModCmdContext.subtype = xx->segs[0].u.p.polyType; +			drawModCmdContext.open = (drawModCmdContext.subtype==POLYLINE)?TRUE:FALSE; +			break; +		case SEG_TEXT: +			InfoMessage("Text can only be modified in Describe Mode"); +			wBeep(); +			return C_ERROR; +		default: +			break;  		}  		drawModCmdContext.rot_moved = FALSE; @@ -1616,6 +1691,8 @@ static STATUS_T ModifyDraw( track_p trk, wAction_t action, coOrd pos )  					if (drawModCmdContext.prev_inx >= 0) {  						controls[0] = drawModLengthPD.control;  						controls[1] = drawModRelAnglePD.control; +						drawModLengthPD.option &= ~PDO_DLGIGNORE; +						drawModRelAnglePD.option &= ~PDO_DLGIGNORE;  						controls[2] = NULL;  						labels[0] = N_("Seg Lth");  						labels[1] = N_("Rel Ang"); @@ -1628,6 +1705,8 @@ static STATUS_T ModifyDraw( track_p trk, wAction_t action, coOrd pos )  				} else  {  					controls[0] = drawModWidthPD.control;  					controls[1] = drawModHeightPD.control; +					drawModWidthPD.option &= ~PDO_DLGIGNORE; +					drawModHeightPD.option &= ~PDO_DLGIGNORE;  					controls[2] = NULL;  					labels[0] = N_("Width");  					labels[1] = N_("Height"); @@ -1637,13 +1716,15 @@ static STATUS_T ModifyDraw( track_p trk, wAction_t action, coOrd pos )  					drawModHeightPD.option &= ~PDO_NORECORD;  					infoSubst = TRUE;  				} -			break; +				break;  			case SEG_STRLIN:  			case SEG_BENCH:  			case SEG_DIMLIN:  			case SEG_TBLEDGE:  				controls[0] = drawModLengthPD.control;  				controls[1] = drawModAnglePD.control; +				drawModLengthPD.option &= ~PDO_DLGIGNORE; +				drawModAnglePD.option &= ~PDO_DLGIGNORE;  				controls[2] = NULL;  				labels[0] = N_("Length");  				labels[1] = N_("Angle"); @@ -1652,13 +1733,15 @@ static STATUS_T ModifyDraw( track_p trk, wAction_t action, coOrd pos )  				drawModLengthPD.option &= ~PDO_NORECORD;  				drawModAnglePD.option &= ~PDO_NORECORD;  				infoSubst = TRUE; -			break; +				break;  			case SEG_CRVLIN:  			case SEG_FILCRCL:  				controls[0] = drawModRadiusPD.control; +				drawModRadiusPD.option &= ~PDO_DLGIGNORE;  				controls[1] = NULL;  				labels[0] = N_("Radius"); -				if ((drawModCmdContext.type == SEG_CRVLIN) && xx->segs[0].u.c.a1>0.0 && xx->segs[0].u.c.a1 <360.0) { +				if ((drawModCmdContext.type == SEG_CRVLIN) && xx->segs[0].u.c.a1>0.0 +				    && xx->segs[0].u.c.a1 <360.0) {  					controls[1] = drawModArcAnglePD.control;  					controls[2] = NULL;  					labels[1] = N_("Arc Angle"); @@ -1666,14 +1749,15 @@ static STATUS_T ModifyDraw( track_p trk, wAction_t action, coOrd pos )  				ParamLoadControls( &drawModPG );  				InfoSubstituteControls( controls, labels );  				drawModArcAnglePD.option &= ~PDO_NORECORD; -				if (drawModCmdContext.type == SEG_CRVLIN) +				if (drawModCmdContext.type == SEG_CRVLIN) {  					drawModArcAnglePD.option &= ~PDO_NORECORD; +				}  				infoSubst = TRUE;  				break;  			default:  				InfoSubstituteControls( NULL, NULL );  				infoSubst = FALSE; -			break; +				break;  			}  		} else {  			InfoSubstituteControls( NULL, NULL ); @@ -1700,21 +1784,28 @@ static STATUS_T ModifyDraw( track_p trk, wAction_t action, coOrd pos )  		wMenuPushEnable( drawModDashDotDot, TRUE);  		wMenuPushEnable( drawModCenterDot, TRUE);  		wMenuPushEnable( drawModPhantom, TRUE); -		if (!drawModCmdContext.rotate_state && (drawModCmdContext.type == SEG_POLY || drawModCmdContext.type == SEG_FILPOLY)) { -			wMenuPushEnable( drawModDel,drawModCmdContext.prev_inx>=0); -			if ((!drawModCmdContext.open && drawModCmdContext.prev_inx>=0) || -					((drawModCmdContext.prev_inx>0) && (drawModCmdContext.prev_inx<drawModCmdContext.max_inx))) { -				wMenuPushEnable( drawModRound,TRUE); -				wMenuPushEnable( drawModVertex, TRUE); -				wMenuPushEnable( drawModSmooth, TRUE); -			} -			wMenuPushEnable( drawModFill, (!drawModCmdContext.open) && (!drawModCmdContext.filled)); -			wMenuPushEnable( drawModEmpty, (!drawModCmdContext.open) && (drawModCmdContext.filled)); -			wMenuPushEnable( drawModClose, drawModCmdContext.open); -			wMenuPushEnable( drawModOpen, !drawModCmdContext.open); +		if (!drawModCmdContext.rotate_state && (drawModCmdContext.type == SEG_POLY +		                                        || drawModCmdContext.type == SEG_FILPOLY)) { +			wMenuPushEnable( drawModFill, (!drawModCmdContext.open) +			                 && (!drawModCmdContext.filled)); +			wMenuPushEnable( drawModEmpty, (!drawModCmdContext.open) +			                 && (drawModCmdContext.filled)); +			if (drawModCmdContext.subtype != RECTANGLE) { +				wMenuPushEnable( drawModDel,drawModCmdContext.prev_inx>=0); +				if ((!drawModCmdContext.open && drawModCmdContext.prev_inx>=0) || +				    ((drawModCmdContext.prev_inx>0) +				     && (drawModCmdContext.prev_inx<drawModCmdContext.max_inx))) { +					wMenuPushEnable( drawModRound,TRUE); +					wMenuPushEnable( drawModVertex, TRUE); +					wMenuPushEnable( drawModSmooth, TRUE); +					wMenuPushEnable( drawModClose, drawModCmdContext.open); +					wMenuPushEnable( drawModOpen, !drawModCmdContext.open); +				} +			}  		}  		wMenuPushEnable( drawModOrigin,drawModCmdContext.rotate_state); -		wMenuPushEnable( drawModLast,drawModCmdContext.rotate_state && (drawModCmdContext.prev_inx>=0)); +		wMenuPushEnable( drawModLast,drawModCmdContext.rotate_state +		                 && (drawModCmdContext.prev_inx>=0));  		wMenuPushEnable( drawModCenter,drawModCmdContext.rotate_state);  		break;  	case wActionExtKey: @@ -1722,12 +1813,12 @@ static STATUS_T ModifyDraw( track_p trk, wAction_t action, coOrd pos )  		ignoredDraw = trk ;  		rc = DrawGeomModify( action, pos, &drawModCmdContext  );  		if ( infoSubst ) { -					InfoSubstituteControls( NULL, NULL ); -					infoSubst = FALSE; +			InfoSubstituteControls( NULL, NULL ); +			infoSubst = FALSE;  		}  		ignoredDraw = NULL; -		if (rc == C_CONTINUE) break; -		/* no break*/ +		if (rc == C_CONTINUE) { break; } +	/* no break*/  	case C_FINISH:  		ignoredDraw = trk;  		rc = DrawGeomModify( C_FINISH, pos, &drawModCmdContext  ); @@ -1771,8 +1862,9 @@ static void UngroupDraw( track_p trk )  {  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t);  	int inx; -	if ( xx->segCnt <= 1 ) +	if ( xx->segCnt <= 1 ) {  		return; +	}  	DeleteTrack( trk, FALSE );  	for ( inx=0; inx<xx->segCnt; inx++ ) {  		trk = MakeDrawFromSeg( xx->orig, xx->angle, &xx->segs[inx] ); @@ -1785,10 +1877,10 @@ static void UngroupDraw( track_p trk )  static ANGLE_T GetAngleDraw( -		track_p trk, -		coOrd pos, -		EPINX_T * ep0, -		EPINX_T * ep1 ) +        track_p trk, +        coOrd pos, +        EPINX_T * ep0, +        EPINX_T * ep1 )  {  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t);  	ANGLE_T angle; @@ -1797,15 +1889,15 @@ static ANGLE_T GetAngleDraw(  	pos.y -= xx->orig.y;  	Rotate( &pos, zero, -xx->angle );  	angle = GetAngleSegs( xx->segCnt, xx->segs, &pos, NULL, NULL, NULL, NULL, NULL); -	if ( ep0 ) *ep0 = -1; -	if ( ep1 ) *ep1 = -1; +	if ( ep0 ) { *ep0 = -1; } +	if ( ep1 ) { *ep1 = -1; }  	return NormalizeAngle( angle + xx->angle );  }  static BOOL_T EnumerateDraw( -		track_p trk ) +        track_p trk )  {  	struct extraDataDraw_t * xx;  	int inx; @@ -1813,13 +1905,15 @@ static BOOL_T EnumerateDraw(  	if ( trk ) {  		xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t); -		if ( xx->segCnt < 1 ) +		if ( xx->segCnt < 1 ) {  			return FALSE; +		}  		BOOL_T content = FALSE;  		for ( inx=0; inx<xx->segCnt; inx++ ) {  			segPtr = &xx->segs[inx];  			if ( segPtr->type == SEG_BENCH ) { -				CountBench( segPtr->u.l.option, FindDistance( segPtr->u.l.pos[0], segPtr->u.l.pos[1] ) ); +				CountBench( segPtr->u.l.option, FindDistance( segPtr->u.l.pos[0], +				                segPtr->u.l.pos[1] ) );  				content = TRUE;  			}  		} @@ -1832,9 +1926,9 @@ static BOOL_T EnumerateDraw(  static void FlipDraw( -		track_p trk, -		coOrd orig, -		ANGLE_T angle ) +        track_p trk, +        coOrd orig, +        ANGLE_T angle )  {  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t); @@ -1850,29 +1944,29 @@ static void FlipDraw(  	if (reorigin) {  		switch(segPtr->type) { -			case SEG_POLY: -			case SEG_FILPOLY: -				for (int i=0;i<segPtr->u.p.cnt;i++) { -					REORIGIN( segPtr->u.p.pts[i].pt, segPtr->u.p.pts[i].pt, xx->angle, xx->orig); -				} +		case SEG_POLY: +		case SEG_FILPOLY: +			for (int i=0; i<segPtr->u.p.cnt; i++) { +				REORIGIN( segPtr->u.p.pts[i].pt, segPtr->u.p.pts[i].pt, xx->angle, xx->orig); +			}  			break; -			case SEG_STRLIN: -			case SEG_DIMLIN: -			case SEG_BENCH: -			case SEG_TBLEDGE: -				for (int i=0;i<2;i++) { -					REORIGIN( segPtr->u.l.pos[i], segPtr->u.l.pos[i], xx->angle, xx->orig); -				} -				break; -			case SEG_CRVLIN: -			case SEG_FILCRCL: -				REORIGIN( segPtr->u.c.center, segPtr->u.c.center, xx->angle, xx->orig); -				segPtr->u.c.a0 = NormalizeAngle(segPtr->u.c.a0 + xx->angle); -				break; -			case SEG_TEXT: -				REORIGIN( segPtr->u.t.pos, segPtr->u.t.pos, xx->angle, xx->orig ); -				break; -			default:; +		case SEG_STRLIN: +		case SEG_DIMLIN: +		case SEG_BENCH: +		case SEG_TBLEDGE: +			for (int i=0; i<2; i++) { +				REORIGIN( segPtr->u.l.pos[i], segPtr->u.l.pos[i], xx->angle, xx->orig); +			} +			break; +		case SEG_CRVLIN: +		case SEG_FILCRCL: +			REORIGIN( segPtr->u.c.center, segPtr->u.c.center, xx->angle, xx->orig); +			segPtr->u.c.a0 = NormalizeAngle(segPtr->u.c.a0 + xx->angle); +			break; +		case SEG_TEXT: +			REORIGIN( segPtr->u.t.pos, segPtr->u.t.pos, xx->angle, xx->orig ); +			break; +		default:;  		}  		xx->orig.x = 0.0, xx->orig.y = 0.0, xx->angle = 0.0;  	} @@ -1881,13 +1975,13 @@ static void FlipDraw(  }  static BOOL_T StoreDraw( -		track_p trk, -		void **data, -		long * len) +        track_p trk, +        void **data, +        long * len)  {  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t);  	if (xx->segs[0].type == SEG_POLY || -		xx->segs[0].type == SEG_FILPOLY) { +	    xx->segs[0].type == SEG_FILPOLY) {  		*data = xx->segs[0].u.p.pts;  		*len = xx->segs[0].u.p.cnt* sizeof (pts_t);  		return TRUE; @@ -1896,13 +1990,13 @@ static BOOL_T StoreDraw(  }  static BOOL_T ReplayDraw( -		track_p trk, -		void * data, -		long len) +        track_p trk, +        void * data, +        long len)  {  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t);  	if (xx->segs[0].type == SEG_POLY || -		xx->segs[0].type == SEG_FILPOLY) { +	    xx->segs[0].type == SEG_FILPOLY) {  		xx->segs[0].u.p.pts = MyMalloc(len);  		memcpy(xx->segs[0].u.p.pts,data,len);  		return TRUE; @@ -1919,26 +2013,26 @@ static BOOL_T QueryDraw( track_p trk, int query )  	case Q_IS_POLY:  		if ((xx->segs[0].type == SEG_POLY) || (xx->segs[0].type == SEG_FILPOLY) ) {  			return TRUE; -		} -		else +		} else {  			return FALSE; +		}  	case Q_IS_TEXT: -		if (xx->segs[0].type== SEG_TEXT) return TRUE; -		else return FALSE; +		if (xx->segs[0].type== SEG_TEXT) { return TRUE; } +		else { return FALSE; }  	case Q_GET_NODES:  		return TRUE;  	case Q_CAN_PARALLEL:  	case Q_MODIFY_CAN_SPLIT:  		if ((xx->segs[0].type == SEG_STRLIN) || -			(xx->segs[0].type == SEG_CRVLIN) || -			(xx->segs[0].type == SEG_BEZLIN) || -			(xx->segs[0].type == SEG_FILCRCL) || -			(xx->segs[0].type == SEG_FILPOLY) || -			(xx->segs[0].type == SEG_POLY) || -			(xx->segs[0].type == SEG_BENCH) || -			(xx->segs[0].type == SEG_TBLEDGE) -		) return TRUE; -		else return FALSE; +		    (xx->segs[0].type == SEG_CRVLIN) || +		    (xx->segs[0].type == SEG_BEZLIN) || +		    (xx->segs[0].type == SEG_FILCRCL) || +		    (xx->segs[0].type == SEG_FILPOLY) || +		    (xx->segs[0].type == SEG_POLY) || +		    (xx->segs[0].type == SEG_BENCH) || +		    (xx->segs[0].type == SEG_TBLEDGE) +		   ) { return TRUE; } +		else { return FALSE; }  	default:  		return FALSE;  	} @@ -1955,454 +2049,489 @@ static wBool_t CompareDraw( track_cp trk1, track_cp trk2 )  	return CompareSegs( xx1->segs, xx1->segCnt, xx2->segs, xx2->segCnt );  } -static BOOL_T GetParamsDraw( int inx, track_p trk, coOrd pos, trackParams_t * params ) { +static BOOL_T GetParamsDraw( int inx, track_p trk, coOrd pos, +                             trackParams_t * params ) +{  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t); -	if (inx != PARAMS_NODES ) return FALSE; +	if (inx != PARAMS_NODES ) { return FALSE; }  	DYNARR_RESET(coOrd,params->nodes);  	BOOL_T back = FALSE;  	coOrd start,end;  	switch (xx->segs[0].type) { -		case SEG_POLY: -			if (xx->segs[0].u.p.polyType != POLYLINE) return FALSE; -			REORIGIN(start,xx->segs[0].u.p.pts[0].pt,xx->angle,xx->orig); -			REORIGIN(end,xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt,xx->angle,xx->orig); -			params->ep = 1; -			if (FindDistance(pos,start)>FindDistance(pos,end)) back = TRUE; -			for (int i=0;i<xx->segs[0].u.p.cnt;i++) { -				DYNARR_APPEND(coOrd,params->nodes,xx->segs[0].u.p.cnt); -				if (back) -					DYNARR_LAST(coOrd,params->nodes) = xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1-i].pt; -				else -					DYNARR_LAST(coOrd,params->nodes) = xx->segs[0].u.p.pts[i].pt; -				REORIGIN(DYNARR_LAST(coOrd,params->nodes),DYNARR_LAST(coOrd,params->nodes),xx->angle,xx->orig); -			} -			params->lineOrig = DYNARR_N(coOrd,params->nodes,0); -			params->lineEnd = DYNARR_LAST(coOrd,params->nodes); -			return TRUE; - -		case SEG_STRLIN:; -			REORIGIN(start,xx->segs[0].u.l.pos[0],xx->angle,xx->orig); -			REORIGIN(end,xx->segs[0].u.l.pos[1],xx->angle,xx->orig); -			params->ep = 1; -			if (FindDistance(pos,start)>FindDistance(pos,end)) { -				back = TRUE; -			} -			for (int i=0;i<2;i++) { -				DYNARR_APPEND(coOrd,params->nodes,2); -				REORIGIN(DYNARR_LAST(coOrd,params->nodes),xx->segs[0].u.l.pos[back?1-i:i],xx->angle,xx->orig); +	case SEG_POLY: +		if (xx->segs[0].u.p.polyType != POLYLINE) { return FALSE; } +		REORIGIN(start,xx->segs[0].u.p.pts[0].pt,xx->angle,xx->orig); +		REORIGIN(end,xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt,xx->angle,xx->orig); +		params->ep = 1; +		if (FindDistance(pos,start)>FindDistance(pos,end)) { back = TRUE; } +		for (int i=0; i<xx->segs[0].u.p.cnt; i++) { +			DYNARR_APPEND(coOrd,params->nodes,xx->segs[0].u.p.cnt); +			if (back) { +				DYNARR_LAST(coOrd,params->nodes) = xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1 +				                                   -i].pt; +			} else { +				DYNARR_LAST(coOrd,params->nodes) = xx->segs[0].u.p.pts[i].pt;  			} -			params->lineOrig = DYNARR_N(coOrd,params->nodes,0); -			params->lineEnd = DYNARR_LAST(coOrd,params->nodes); -			return TRUE; +			REORIGIN(DYNARR_LAST(coOrd,params->nodes),DYNARR_LAST(coOrd,params->nodes), +			         xx->angle,xx->orig); +		} +		params->lineOrig = DYNARR_N(coOrd,params->nodes,0); +		params->lineEnd = DYNARR_LAST(coOrd,params->nodes); +		return TRUE; -		case SEG_CRVLIN:; -			Translate(&start,xx->segs[0].u.c.center,xx->segs[0].u.c.a0,fabs(xx->segs[0].u.c.radius)); -			REORIGIN(start,start,xx->angle,xx->orig); -			Translate(&end,xx->segs[0].u.c.center,xx->segs[0].u.c.a0+xx->segs[0].u.c.a1,fabs(xx->segs[0].u.c.radius)); -			REORIGIN(end,end,xx->angle,xx->orig); -			if (FindDistance(start,pos) > FindDistance(end,pos)) back = TRUE; -			if (fabs(xx->segs[0].u.c.radius) > 0.5) { -				double min_angle = R2D(2*acos(1.0-(0.1/fabs(xx->segs[0].u.c.radius))));    //Error max is 0.1" -				int number = (int) ceil(xx->segs[0].u.c.a1/min_angle); -				double arc_size = xx->segs[0].u.c.a1/number; -				for (int i=0;i<=number;i++) { -					DYNARR_APPEND(coOrd,params->nodes,number); -					if (back) -						Translate(&DYNARR_LAST(coOrd,params->nodes),xx->segs[0].u.c.center,xx->segs[0].u.c.a0+xx->segs[0].u.c.a1-(i*arc_size),fabs(xx->segs[0].u.c.radius)); -					else -						Translate(&DYNARR_LAST(coOrd,params->nodes),xx->segs[0].u.c.center,xx->segs[0].u.c.a0+(i*arc_size),fabs(xx->segs[0].u.c.radius)); -					REORIGIN(DYNARR_LAST(coOrd,params->nodes),DYNARR_LAST(coOrd,params->nodes),xx->angle,xx->orig); +	case SEG_STRLIN:; +		REORIGIN(start,xx->segs[0].u.l.pos[0],xx->angle,xx->orig); +		REORIGIN(end,xx->segs[0].u.l.pos[1],xx->angle,xx->orig); +		params->ep = 1; +		if (FindDistance(pos,start)>FindDistance(pos,end)) { +			back = TRUE; +		} +		for (int i=0; i<2; i++) { +			DYNARR_APPEND(coOrd,params->nodes,2); +			REORIGIN(DYNARR_LAST(coOrd,params->nodes),xx->segs[0].u.l.pos[back?1-i:i], +			         xx->angle,xx->orig); +		} +		params->lineOrig = DYNARR_N(coOrd,params->nodes,0); +		params->lineEnd = DYNARR_LAST(coOrd,params->nodes); +		return TRUE; + +	case SEG_CRVLIN:; +		Translate(&start,xx->segs[0].u.c.center,xx->segs[0].u.c.a0, +		          fabs(xx->segs[0].u.c.radius)); +		REORIGIN(start,start,xx->angle,xx->orig); +		Translate(&end,xx->segs[0].u.c.center,xx->segs[0].u.c.a0+xx->segs[0].u.c.a1, +		          fabs(xx->segs[0].u.c.radius)); +		REORIGIN(end,end,xx->angle,xx->orig); +		if (FindDistance(start,pos) > FindDistance(end,pos)) { back = TRUE; } +		if (fabs(xx->segs[0].u.c.radius) > 0.5) { +			double min_angle = R2D(2*acos(1.0-(0.1/fabs( +			                xx->segs[0].u.c.radius))));    //Error max is 0.1" +			int number = (int) ceil(xx->segs[0].u.c.a1/min_angle); +			double arc_size = xx->segs[0].u.c.a1/number; +			for (int i=0; i<=number; i++) { +				DYNARR_APPEND(coOrd,params->nodes,number); +				if (back) { +					Translate(&DYNARR_LAST(coOrd,params->nodes),xx->segs[0].u.c.center, +					          xx->segs[0].u.c.a0+xx->segs[0].u.c.a1-(i*arc_size), +					          fabs(xx->segs[0].u.c.radius)); +				} else { +					Translate(&DYNARR_LAST(coOrd,params->nodes),xx->segs[0].u.c.center, +					          xx->segs[0].u.c.a0+(i*arc_size),fabs(xx->segs[0].u.c.radius));  				} -			} else { -				DYNARR_APPEND(coOrd,params->nodes,2); -				REORIGIN(DYNARR_LAST(coOrd,params->nodes),back?end:start,xx->angle,xx->orig); -				DYNARR_APPEND(coOrd,params->nodes,2); -				REORIGIN(DYNARR_LAST(coOrd,params->nodes),back?start:end,xx->angle,xx->orig); +				REORIGIN(DYNARR_LAST(coOrd,params->nodes),DYNARR_LAST(coOrd,params->nodes), +				         xx->angle,xx->orig);  			} -			params->lineOrig = DYNARR_N(coOrd,params->nodes,0); -			params->lineEnd = DYNARR_LAST(coOrd,params->nodes); -			params->ep = 1; -			return TRUE; +		} else { +			DYNARR_APPEND(coOrd,params->nodes,2); +			REORIGIN(DYNARR_LAST(coOrd,params->nodes),back?end:start,xx->angle,xx->orig); +			DYNARR_APPEND(coOrd,params->nodes,2); +			REORIGIN(DYNARR_LAST(coOrd,params->nodes),back?start:end,xx->angle,xx->orig); +		} +		params->lineOrig = DYNARR_N(coOrd,params->nodes,0); +		params->lineEnd = DYNARR_LAST(coOrd,params->nodes); +		params->ep = 1; +		return TRUE; -		case SEG_BEZLIN: -			REORIGIN(start,xx->segs[0].u.b.pos[0],xx->angle,xx->orig); -			REORIGIN(end,xx->segs[0].u.b.pos[3],xx->angle,xx->orig); -			if (FindDistance(pos,start) < FindDistance(pos,end)) -				params->ep = 0; -			else params->ep = 1; -			BOOL_T back = FALSE; -			coOrd curr_pos = params->bezierPoints[params->ep*3]; -			BOOL_T first = TRUE; -			for (int i = 0; i<xx->segs[0].bezSegs.cnt;i++) { -				trkSeg_p segPtr = &DYNARR_N(trkSeg_t,xx->segs[0].bezSegs,params->ep?xx->segs[0].bezSegs.cnt-1-i:i); -				if (segPtr->type == SEG_STRLIN) { -					back = FindDistance(segPtr->u.l.pos[0],curr_pos)>FindDistance(segPtr->u.l.pos[1],curr_pos); -					if (first) { -						first = FALSE; -						DYNARR_APPEND(coOrd,params->nodes,2); -						REORIGIN(DYNARR_LAST(coOrd,params->nodes),segPtr->u.l.pos[back],xx->angle,xx->orig); -					} +	case SEG_BEZLIN: +		REORIGIN(start,xx->segs[0].u.b.pos[0],xx->angle,xx->orig); +		REORIGIN(end,xx->segs[0].u.b.pos[3],xx->angle,xx->orig); +		if (FindDistance(pos,start) < FindDistance(pos,end)) { +			params->ep = 0; +		} else { params->ep = 1; } +		BOOL_T back = FALSE; +		coOrd curr_pos = params->bezierPoints[params->ep*3]; +		BOOL_T first = TRUE; +		for (int i = 0; i<xx->segs[0].bezSegs.cnt; i++) { +			trkSeg_p segPtr = &DYNARR_N(trkSeg_t,xx->segs[0].bezSegs, +			                            params->ep?xx->segs[0].bezSegs.cnt-1-i:i); +			if (segPtr->type == SEG_STRLIN) { +				back = FindDistance(segPtr->u.l.pos[0], +				                    curr_pos)>FindDistance(segPtr->u.l.pos[1],curr_pos); +				if (first) { +					first = FALSE;  					DYNARR_APPEND(coOrd,params->nodes,2); -					REORIGIN(DYNARR_LAST(coOrd,params->nodes),segPtr->u.l.pos[1-back],xx->angle,xx->orig); -					curr_pos = DYNARR_LAST(coOrd,params->nodes); -				} else { -					coOrd start,end; -					Translate(&start,segPtr->u.c.center,segPtr->u.c.a0,segPtr->u.c.radius); -					Translate(&end,segPtr->u.c.center,segPtr->u.c.a0+segPtr->u.c.a1,segPtr->u.c.radius); -					back = FindDistance(start,curr_pos)>FindDistance(end,curr_pos); -					if (fabs(segPtr->u.c.radius) > 0.2) { -						double min_angle = 360*acos(1.0-(0.1/fabs(segPtr->u.c.radius)))/M_PI;    //Error max is 0.1" -						int number = (int)ceil(segPtr->u.c.a1/min_angle); -						double arc_size = segPtr->u.c.a1/number; -						for (int j=1-first;j<number;j++) { -							DYNARR_APPEND(coOrd,params->nodes,number-first); -							if (back == params->ep) -								Translate(&DYNARR_LAST(coOrd,params->nodes),segPtr->u.c.center,segPtr->u.c.a0+(j*arc_size),fabs(segPtr->u.c.radius) ); -							else -								Translate(&DYNARR_LAST(coOrd,params->nodes),segPtr->u.c.center,segPtr->u.c.a0+segPtr->u.c.a1-(j*arc_size),fabs(segPtr->u.c.radius) ); -							REORIGIN(DYNARR_LAST(coOrd,params->nodes),DYNARR_LAST(coOrd,params->nodes),xx->angle,xx->orig); -						} -						first = FALSE; -					} else { -						if (first) { -							first = FALSE; -							DYNARR_APPEND(coOrd,params->nodes,2); -							REORIGIN(DYNARR_LAST(coOrd,params->nodes),start,xx->angle,xx->orig); +					REORIGIN(DYNARR_LAST(coOrd,params->nodes),segPtr->u.l.pos[back],xx->angle, +					         xx->orig); +				} +				DYNARR_APPEND(coOrd,params->nodes,2); +				REORIGIN(DYNARR_LAST(coOrd,params->nodes),segPtr->u.l.pos[1-back],xx->angle, +				         xx->orig); +				curr_pos = DYNARR_LAST(coOrd,params->nodes); +			} else { +				coOrd start,end; +				Translate(&start,segPtr->u.c.center,segPtr->u.c.a0,segPtr->u.c.radius); +				Translate(&end,segPtr->u.c.center,segPtr->u.c.a0+segPtr->u.c.a1, +				          segPtr->u.c.radius); +				back = FindDistance(start,curr_pos)>FindDistance(end,curr_pos); +				if (fabs(segPtr->u.c.radius) > 0.2) { +					double min_angle = 360*acos(1.0-(0.1/fabs( +					                segPtr->u.c.radius)))/M_PI;    //Error max is 0.1" +					int number = (int)ceil(segPtr->u.c.a1/min_angle); +					double arc_size = segPtr->u.c.a1/number; +					for (int j=1-first; j<number; j++) { +						DYNARR_APPEND(coOrd,params->nodes,number-first); +						if (back == params->ep) { +							Translate(&DYNARR_LAST(coOrd,params->nodes),segPtr->u.c.center, +							          segPtr->u.c.a0+(j*arc_size),fabs(segPtr->u.c.radius) ); +						} else { +							Translate(&DYNARR_LAST(coOrd,params->nodes),segPtr->u.c.center, +							          segPtr->u.c.a0+segPtr->u.c.a1-(j*arc_size),fabs(segPtr->u.c.radius) );  						} -						DYNARR_APPEND(coOrd,params->nodes,1); -						REORIGIN(DYNARR_LAST(coOrd,params->nodes),end,xx->angle,xx->orig); +						REORIGIN(DYNARR_LAST(coOrd,params->nodes),DYNARR_LAST(coOrd,params->nodes), +						         xx->angle,xx->orig); +					} +					first = FALSE; +				} else { +					if (first) {  						first = FALSE; +						DYNARR_APPEND(coOrd,params->nodes,2); +						REORIGIN(DYNARR_LAST(coOrd,params->nodes),start,xx->angle,xx->orig);  					} -					curr_pos = DYNARR_LAST(coOrd,params->nodes); +					DYNARR_APPEND(coOrd,params->nodes,1); +					REORIGIN(DYNARR_LAST(coOrd,params->nodes),end,xx->angle,xx->orig); +					first = FALSE;  				} +				curr_pos = DYNARR_LAST(coOrd,params->nodes);  			} -			params->lineOrig = DYNARR_N(coOrd,params->nodes,0); -			params->lineEnd = DYNARR_LAST(coOrd,params->nodes); -			return TRUE; +		} +		params->lineOrig = DYNARR_N(coOrd,params->nodes,0); +		params->lineEnd = DYNARR_LAST(coOrd,params->nodes); +		return TRUE; -		default: -			return FALSE; +	default: +		return FALSE;  	}  	return FALSE;  } -static BOOL_T SplitDraw( track_p trk, coOrd pos, EPINX_T ep, track_p *leftover, EPINX_T * ep0, EPINX_T * ep1 ) +static BOOL_T SplitDraw( track_p trk, coOrd pos, EPINX_T ep, track_p *leftover, +                         EPINX_T * ep0, EPINX_T * ep1 )  { -		struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t); +	struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t); -		coOrd p0,p1; -		DIST_T d; -		BOOL_T polyline_trim = FALSE, new_last = ep; +	coOrd p0,p1; +	DIST_T d; +	BOOL_T polyline_trim = FALSE, new_last = ep; -		DYNARR_SET(trkSeg_t, tempSegs_da, 1); +	DYNARR_SET(trkSeg_t, tempSegs_da, 1); -		tempSegs(0).type = -1; +	tempSegs(0).type = -1; -		switch (xx->segs[0].type) { -			case SEG_STRLIN: -			case SEG_BENCH: -			case SEG_TBLEDGE: -				REORIGIN(p0,xx->segs[0].u.l.pos[0],xx->angle,xx->orig); -				REORIGIN(p1,xx->segs[0].u.l.pos[1],xx->angle,xx->orig); -				tempSegs(0).color = xx->segs[0].color; -				tempSegs(0).width = xx->segs[0].width; -				tempSegs_da.cnt = 1; -				tempSegs(0).type = xx->segs[0].type; -				tempSegs(0).u.l.pos[0] = 1-ep?p0:pos; -				tempSegs(0).u.l.pos[1] = 1-ep?pos:p1; -				xx->segs[0].u.l.pos[0] = 1-ep?pos:p0; -				xx->segs[0].u.l.pos[1] = 1-ep?p1:pos; -				break; -			case SEG_CRVLIN: -			case SEG_FILCRCL: ; -				coOrd c; -				REORIGIN(c, xx->segs[0].u.c.center, xx->angle, xx->orig); -				coOrd c0,c1; -				if (xx->segs[0].type == SEG_FILCRCL || -					(xx->segs[0].type == SEG_CRVLIN && xx->segs[0].u.c.a1 >= 360.0)) { -					Translate(&c0,c,FindAngle(c,pos),xx->segs[0].u.c.radius); -					c1 = c0; -					xx->segs[0].type = SEG_CRVLIN; -					xx->segs[0].u.c.a0 = FindAngle(c,c0); -					xx->segs[0].u.c.a1 = 355.0; +	switch (xx->segs[0].type) { +	case SEG_STRLIN: +	case SEG_BENCH: +	case SEG_TBLEDGE: +		REORIGIN(p0,xx->segs[0].u.l.pos[0],xx->angle,xx->orig); +		REORIGIN(p1,xx->segs[0].u.l.pos[1],xx->angle,xx->orig); +		DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); +		tempSegs(0).color = xx->segs[0].color; +		tempSegs(0).lineWidth = xx->segs[0].lineWidth; +		tempSegs(0).type = xx->segs[0].type; +		tempSegs(0).u.l.pos[0] = 1-ep?p0:pos; +		tempSegs(0).u.l.pos[1] = 1-ep?pos:p1; +		xx->segs[0].u.l.pos[0] = 1-ep?pos:p0; +		xx->segs[0].u.l.pos[1] = 1-ep?p1:pos; +		break; +	case SEG_CRVLIN: +	case SEG_FILCRCL: ; +		coOrd c; +		REORIGIN(c, xx->segs[0].u.c.center, xx->angle, xx->orig); +		coOrd c0,c1; +		if (xx->segs[0].type == SEG_FILCRCL || +		    (xx->segs[0].type == SEG_CRVLIN && xx->segs[0].u.c.a1 >= 360.0)) { +			Translate(&c0,c,FindAngle(c,pos),xx->segs[0].u.c.radius); +			c1 = c0; +			xx->segs[0].type = SEG_CRVLIN; +			xx->segs[0].u.c.a0 = FindAngle(c,c0); +			xx->segs[0].u.c.a1 = 355.0; +		} else { +			Translate(&c0,c,xx->segs[0].u.c.a0+xx->angle,xx->segs[0].u.c.radius); +			Translate(&c1,c,xx->segs[0].u.c.a1+xx->segs[0].u.c.a0+xx->angle, +			          xx->segs[0].u.c.radius); +			DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); +			tempSegs(0).color = xx->segs[0].color; +			tempSegs(0).lineWidth = xx->segs[0].lineWidth; +			tempSegs(0).type = SEG_CRVLIN; +			tempSegs(0).u.c.center = c; +			tempSegs(0).u.c.radius = xx->segs[0].u.c.radius; +			if (ep) { +				tempSegs(0).u.c.a0 = FindAngle(c,c0); +				tempSegs(0).u.c.a1 = NormalizeAngle(FindAngle(c,pos)-tempSegs(0).u.c.a0); +			} else { +				tempSegs(0).u.c.a0 = FindAngle(c,pos); +				tempSegs(0).u.c.a1 = NormalizeAngle(FindAngle(c,c1)-tempSegs(0).u.c.a0); +			} +			xx->segs[0].u.c.center = c; +			if (ep) { +				xx->segs[0].u.c.a0 = FindAngle(c,pos); +				xx->segs[0].u.c.a1 = NormalizeAngle(FindAngle(c,c1)-xx->segs[0].u.c.a0); +			} else { +				xx->segs[0].u.c.a0 = FindAngle(c,c0); +				xx->segs[0].u.c.a1 = NormalizeAngle(FindAngle(c,pos)-xx->segs[0].u.c.a0); +			} +		} +		break; +	case SEG_POLY: +	case SEG_FILPOLY: +		d = DIST_INF; +		DIST_T dd; +		BOOL_T onPoint = FALSE; +//				BOOL_T closeSeg = FALSE; +		coOrd end; +		int polyInx = -1; +		for ( int inx=0; inx<xx->segs[0].u.p.cnt-1; inx++ ) { +			p0 = pos; +			coOrd pl0,pl1; +			REORIGIN(pl0,xx->segs[0].u.p.pts[inx].pt,xx->angle,xx->orig); +			REORIGIN(pl1,xx->segs[0].u.p.pts[inx+1].pt,xx->angle,xx->orig); +			dd = LineDistance( &p0, pl0, pl1 ); +			if ( d > dd ) { +				d = dd; +				if (IsClose(FindDistance(pos,pl1))) { +					polyInx = inx; +					REORIGIN(pos,xx->segs[0].u.p.pts[inx].pt,xx->angle,xx->orig); +					onPoint = TRUE; +					break; +				} else if (IsClose(FindDistance(pos,pl1))) { +					polyInx = inx+1; +					REORIGIN(pos,xx->segs[0].u.p.pts[inx+1].pt,xx->angle,xx->orig); +					onPoint=TRUE; +					break;  				} else { -					Translate(&c0,c,xx->segs[0].u.c.a0+xx->angle,xx->segs[0].u.c.radius); -					Translate(&c1,c,xx->segs[0].u.c.a1+xx->segs[0].u.c.a0+xx->angle,xx->segs[0].u.c.radius); -					tempSegs(0).color = xx->segs[0].color; -					tempSegs(0).width = xx->segs[0].width; -					tempSegs_da.cnt = 1; -					tempSegs(0).type = SEG_CRVLIN; -					tempSegs(0).u.c.center = c; -					tempSegs(0).u.c.radius = xx->segs[0].u.c.radius; -					if (ep) { -						tempSegs(0).u.c.a0 = FindAngle(c,c0); -						tempSegs(0).u.c.a1 = NormalizeAngle(FindAngle(c,pos)-tempSegs(0).u.c.a0); -					} else { -						tempSegs(0).u.c.a0 = FindAngle(c,pos); -						tempSegs(0).u.c.a1 = NormalizeAngle(FindAngle(c,c1)-tempSegs(0).u.c.a0); -					} -					xx->segs[0].u.c.center = c; -					if (ep) { -						xx->segs[0].u.c.a0 = FindAngle(c,pos); -						xx->segs[0].u.c.a1 = NormalizeAngle(FindAngle(c,c1)-xx->segs[0].u.c.a0); -					} else { -						xx->segs[0].u.c.a0 = FindAngle(c,c0); -						xx->segs[0].u.c.a1 = NormalizeAngle(FindAngle(c,pos)-xx->segs[0].u.c.a0); -					} -				} -				break; -			case SEG_POLY: -			case SEG_FILPOLY: -				d = DIST_INF; -				DIST_T dd; -				BOOL_T onPoint = FALSE; -				BOOL_T closeSeg = FALSE; -				coOrd end; -				int polyInx = -1; -				for ( int inx=0; inx<xx->segs[0].u.p.cnt-1; inx++ ) { -					p0 = pos; -					coOrd pl0,pl1; -					REORIGIN(pl0,xx->segs[0].u.p.pts[inx].pt,xx->angle,xx->orig); -					REORIGIN(pl1,xx->segs[0].u.p.pts[inx+1].pt,xx->angle,xx->orig); -					dd = LineDistance( &p0, pl0, pl1 ); -					if ( d > dd ) { -						d = dd; -						if (IsClose(FindDistance(pos,pl1))) { -							polyInx = inx; -							REORIGIN(pos,xx->segs[0].u.p.pts[inx].pt,xx->angle,xx->orig); -							onPoint = TRUE; -							break; -						} else if (IsClose(FindDistance(pos,pl1))) { -							polyInx = inx+1; -							REORIGIN(pos,xx->segs[0].u.p.pts[inx+1].pt,xx->angle,xx->orig); -							onPoint=TRUE; -							break; -						} else { -							if (!IsClose(d)) continue; -							polyInx = inx; -							pos = p0; -							break; -						} -					} +					if (!IsClose(d)) { continue; } +					polyInx = inx; +					pos = p0; +					break;  				} -				//If Closed, look at closing line -				if ( !onPoint && (xx->segs[0].u.p.polyType != POLYLINE)) { -					coOrd pl0,pl1; -					p0 = pos; -					REORIGIN(pl0,xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt,xx->angle,xx->orig); -					REORIGIN(pl1,xx->segs[0].u.p.pts[0].pt,xx->angle,xx->orig); -					dd = LineDistance( &p0, pl0, pl1 ); -					if (d > dd) { -						d = dd; -						if (IsClose(d)) { -							polyInx = xx->segs[0].u.p.cnt-1; -							closeSeg=TRUE; -							pos = p0; -						} -					} +			} +		} +		//If Closed, look at closing line +		if ( !onPoint && (xx->segs[0].u.p.polyType != POLYLINE)) { +			coOrd pl0,pl1; +			p0 = pos; +			REORIGIN(pl0,xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt,xx->angle,xx->orig); +			REORIGIN(pl1,xx->segs[0].u.p.pts[0].pt,xx->angle,xx->orig); +			dd = LineDistance( &p0, pl0, pl1 ); +			if (d > dd) { +				d = dd; +				if (IsClose(d)) { +					polyInx = xx->segs[0].u.p.cnt-1; +//							closeSeg=TRUE; +					pos = p0;  				} -				//If Closed, split into a PolyLine -				if (xx->segs[0].u.p.polyType != POLYLINE) { -					if (!IsClose(d)) { -						*leftover = NULL; -						return FALSE; -					} -					end = pos; -					REORIGIN(end,end,xx->angle,xx->orig); - -					trkSeg_t temp;  //Buffer for expanded array -					temp.u.p.cnt = xx->segs[0].u.p.cnt + 2 - onPoint; -					temp.u.p.pts = MyMalloc(temp.u.p.cnt*sizeof(pts_t)); -					int j = 0; -					temp.u.p.pts[j].pt = end; -					temp.u.p.pts[j].pt_type = wPolyLineStraight; -					j++; -					/* After split */ -					for (int i=polyInx+1;i<=xx->segs[0].u.p.cnt-1;i++,j++) { -						temp.u.p.pts[j] = xx->segs[0].u.p.pts[i]; -						REORIGIN(temp.u.p.pts[j].pt,temp.u.p.pts[j].pt,xx->angle,xx->orig); -					} -					/* Before split */ -					for (int i=0;i<=polyInx;i++,j++) { -						temp.u.p.pts[j] = xx->segs[0].u.p.pts[i]; -						REORIGIN(temp.u.p.pts[j].pt,temp.u.p.pts[j].pt,xx->angle,xx->orig); -					} -					if (!onPoint) { -						temp.u.p.pts[temp.u.p.cnt-1].pt = end; -					} -					temp.u.p.pts[temp.u.p.cnt-1].pt_type = wPolyLineStraight; +			} +		} +		//If Closed, split into a PolyLine +		if (xx->segs[0].u.p.polyType != POLYLINE) { +			if (!IsClose(d)) { +				*leftover = NULL; +				return FALSE; +			} +			end = pos; +			REORIGIN(end,end,xx->angle,xx->orig); -					//Swap Pts Array into existing track -					MyFree(xx->segs[0].u.p.pts); -					xx->segs[0].u.p.pts = temp.u.p.pts; -					xx->segs[0].u.p.cnt = temp.u.p.cnt; -					xx->segs[0].u.p.polyType = POLYLINE; -					break; +			trkSeg_t temp;  //Buffer for expanded array +			temp.u.p.cnt = xx->segs[0].u.p.cnt + 2 - onPoint; +			temp.u.p.pts = MyMalloc(temp.u.p.cnt*sizeof(pts_t)); +			int j = 0; +			temp.u.p.pts[j].pt = end; +			temp.u.p.pts[j].pt_type = wPolyLineStraight; +			j++; +			/* After split */ +			for (int i=polyInx+1; i<=xx->segs[0].u.p.cnt-1; i++,j++) { +				temp.u.p.pts[j] = xx->segs[0].u.p.pts[i]; +				REORIGIN(temp.u.p.pts[j].pt,temp.u.p.pts[j].pt,xx->angle,xx->orig); +			} +			/* Before split */ +			for (int i=0; i<=polyInx; i++,j++) { +				temp.u.p.pts[j] = xx->segs[0].u.p.pts[i]; +				REORIGIN(temp.u.p.pts[j].pt,temp.u.p.pts[j].pt,xx->angle,xx->orig); +			} +			if (!onPoint) { +				temp.u.p.pts[temp.u.p.cnt-1].pt = end; +			} +			temp.u.p.pts[temp.u.p.cnt-1].pt_type = wPolyLineStraight; + +			//Swap Pts Array into existing track +			MyFree(xx->segs[0].u.p.pts); +			xx->segs[0].u.p.pts = temp.u.p.pts; +			xx->segs[0].u.p.cnt = temp.u.p.cnt; +			xx->segs[0].u.p.polyType = POLYLINE; +			break; +		} +		//Check if on an end-point -> reject +		if ((polyInx <= 0 || polyInx >= xx->segs[0].u.p.cnt-1) && onPoint ) { +			*leftover = NULL; +			return FALSE; +		} +		if (polyInx == 0 || (polyInx == 1 && onPoint )) { +			//Between First End and Next -> Trim end +			end = xx->segs[0].u.p.pts[0].pt; +			REORIGIN(end,end,xx->angle,xx->orig); +			if (onPoint) { +				for (int i=0; i< xx->segs[0].u.p.cnt-1; i++) { +					xx->segs[0].u.p.pts[i] = xx->segs[0].u.p.pts[i+1]; +					REORIGIN(xx->segs[0].u.p.pts[i].pt,xx->segs[0].u.p.pts[i].pt,xx->angle, +					         xx->orig); +				} +				--xx->segs[0].u.p.cnt; +			} else { +				xx->segs[0].u.p.pts[0].pt = pos; +				for (int i=1; i< xx->segs[0].u.p.cnt; i++) { +					REORIGIN(xx->segs[0].u.p.pts[i].pt,xx->segs[0].u.p.pts[i].pt,xx->angle, +					         xx->orig);  				} -				//Check if on an end-point -> reject -				if ((polyInx <= 0 || polyInx >= xx->segs[0].u.p.cnt-1) && onPoint ) { -					*leftover = NULL; -					return FALSE; +			} +			DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); +			tempSegs(0).color = xx->segs[0].color; +			tempSegs(0).lineWidth = xx->segs[0].lineWidth; +			tempSegs(0).type = SEG_STRLIN; +			tempSegs(0).u.l.pos[0] = pos; +			tempSegs(0).u.l.pos[1] = end; +			polyline_trim = TRUE; +			new_last = FALSE; +		} else if (polyInx == xx->segs[0].u.p.cnt-2) { +			//Between second last and last -> Trim the other end +			end = xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt; +			REORIGIN(end,end,xx->angle,xx->orig); +			if (onPoint) { +				--xx->segs[0].u.p.cnt; +				for (int i=0; i<xx->segs[0].u.p.cnt; i++) { +					REORIGIN(xx->segs[0].u.p.pts[i].pt,xx->segs[0].u.p.pts[i].pt,xx->angle, +					         xx->orig);  				} -				if (polyInx == 0 || (polyInx == 1 && onPoint )) { -					//Between First End and Next -> Trim end -					end = xx->segs[0].u.p.pts[0].pt; -					REORIGIN(end,end,xx->angle,xx->orig); -					if (onPoint) { -						for (int i=0;i< xx->segs[0].u.p.cnt-1;i++) { -							xx->segs[0].u.p.pts[i] = xx->segs[0].u.p.pts[i+1]; -							REORIGIN(xx->segs[0].u.p.pts[i].pt,xx->segs[0].u.p.pts[i].pt,xx->angle,xx->orig); -						} -						--xx->segs[0].u.p.cnt; -					} else { -						xx->segs[0].u.p.pts[0].pt = pos; -						for (int i=1;i< xx->segs[0].u.p.cnt;i++) { -							REORIGIN(xx->segs[0].u.p.pts[i].pt,xx->segs[0].u.p.pts[i].pt,xx->angle,xx->orig); -						} -					} -					tempSegs(0).color = xx->segs[0].color; -					tempSegs(0).width = xx->segs[0].width; -					tempSegs_da.cnt = 1; -					tempSegs(0).type = SEG_STRLIN; -					tempSegs(0).u.l.pos[0] = pos; -					tempSegs(0).u.l.pos[1] = end; -					polyline_trim = TRUE; -					new_last = FALSE; -				} else if (polyInx == xx->segs[0].u.p.cnt-2) { -					//Between second last and last -> Trim the other end -					end = xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt; -					REORIGIN(end,end,xx->angle,xx->orig); -					if (onPoint) { -						--xx->segs[0].u.p.cnt; -						for (int i=0;i<xx->segs[0].u.p.cnt;i++) { -						    REORIGIN(xx->segs[0].u.p.pts[i].pt,xx->segs[0].u.p.pts[i].pt,xx->angle,xx->orig); -					    } -					} else { -						xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt = pos; -					    for (int i=0;i<xx->segs[0].u.p.cnt;i++) { -					    	REORIGIN(xx->segs[0].u.p.pts[i].pt,xx->segs[0].u.p.pts[i].pt,xx->angle,xx->orig); -					    } +			} else { +				xx->segs[0].u.p.pts[xx->segs[0].u.p.cnt-1].pt = pos; +				for (int i=0; i<xx->segs[0].u.p.cnt; i++) { +					REORIGIN(xx->segs[0].u.p.pts[i].pt,xx->segs[0].u.p.pts[i].pt,xx->angle, +					         xx->orig); +				} +			} +			DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); +			tempSegs(0).color = xx->segs[0].color; +			tempSegs(0).lineWidth = xx->segs[0].lineWidth; +			tempSegs(0).type = SEG_STRLIN; +			tempSegs(0).u.l.pos[0] = end; +			tempSegs(0).u.l.pos[1] = pos; +			polyline_trim = TRUE; +			new_last = TRUE; +		} else { +			//Check that new line will have >=3 spots if not -> reject +			if (xx->segs[0].u.p.cnt >3) { +				DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); +				tempSegs(0).color = xx->segs[0].color; +				tempSegs(0).lineWidth = xx->segs[0].lineWidth; +				tempSegs(0).type = SEG_POLY; +				tempSegs(0).u.p.polyType = POLYLINE; +				if (1-ep) { +					tempSegs(0).u.p.cnt = xx->segs[0].u.p.cnt - polyInx; +				} else { +					tempSegs(0).u.p.cnt = polyInx + 2 - onPoint; +				} +				tempSegs(0).u.p.pts = MyMalloc(tempSegs(0).u.p.cnt*sizeof(pts_t)); +				int j = 0; +				if (1-ep) { +					tempSegs(0).u.p.pts[0].pt=pos; +					tempSegs(0).u.p.pts[0].pt_type = wPolyLineStraight; +					j = 1; +					for (int i=polyInx+1; i<xx->segs[0].u.p.cnt; i++,j++) { +						tempSegs(0).u.p.pts[j] = xx->segs[0].u.p.pts[i]; +						REORIGIN(tempSegs(0).u.p.pts[j].pt,tempSegs(0).u.p.pts[j].pt,xx->angle, +						         xx->orig);  					} -					tempSegs(0).color = xx->segs[0].color; -					tempSegs(0).width = xx->segs[0].width; -					tempSegs_da.cnt = 1; -					tempSegs(0).type = SEG_STRLIN; -					tempSegs(0).u.l.pos[0] = end; -					tempSegs(0).u.l.pos[1] = pos; -					polyline_trim = TRUE; -					new_last = TRUE;  				} else { -					//Check that new line will have >=3 spots if not -> reject -					if (xx->segs[0].u.p.cnt >3) { -						tempSegs(0).color = xx->segs[0].color; -						tempSegs(0).width = xx->segs[0].width; -						tempSegs_da.cnt = 1; -						tempSegs(0).type = SEG_POLY; -						tempSegs(0).u.p.polyType = POLYLINE; -						if (1-ep) -							tempSegs(0).u.p.cnt = xx->segs[0].u.p.cnt - polyInx; -						else -							tempSegs(0).u.p.cnt = polyInx + 2 - onPoint; -						tempSegs(0).u.p.pts = MyMalloc(tempSegs(0).u.p.cnt*sizeof(pts_t)); -						int j = 0; -						if (1-ep) { -							tempSegs(0).u.p.pts[0].pt=pos; -							tempSegs(0).u.p.pts[0].pt_type = wPolyLineStraight; -							j = 1; -							for (int i=polyInx+1;i<xx->segs[0].u.p.cnt;i++,j++) { -								tempSegs(0).u.p.pts[j] = xx->segs[0].u.p.pts[i]; -								REORIGIN(tempSegs(0).u.p.pts[j].pt,tempSegs(0).u.p.pts[j].pt,xx->angle,xx->orig); -							} -						} else { -							for (int i=0;i<=polyInx+1;i++,j++) { -								tempSegs(0).u.p.pts[j] = xx->segs[0].u.p.pts[i]; -								REORIGIN(tempSegs(0).u.p.pts[j].pt,tempSegs(0).u.p.pts[j].pt,xx->angle,xx->orig); -							} -							if (!onPoint) { -								tempSegs(0).u.p.pts[tempSegs(0).u.p.cnt-1].pt = pos; -								tempSegs(0).u.p.pts[tempSegs(0).u.p.cnt-1].pt_type = wPolyLineStraight; -							} -						} -					} else { -						*leftover = NULL; -						return FALSE; +					for (int i=0; i<=polyInx+1; i++,j++) { +						tempSegs(0).u.p.pts[j] = xx->segs[0].u.p.pts[i]; +						REORIGIN(tempSegs(0).u.p.pts[j].pt,tempSegs(0).u.p.pts[j].pt,xx->angle, +						         xx->orig);  					} -					polyline_trim = TRUE; -					new_last = 1-ep; -					int new_cnt, old_cnt = xx->segs[0].u.p.cnt; -					if (1-ep) -						new_cnt =  polyInx + 2 - onPoint; -					else -						new_cnt = xx->segs[0].u.p.cnt-polyInx; -					pts_t * newpts = MyMalloc(new_cnt*sizeof(pts_t)); -					int j = 0; -					if (1-ep) { -						for (int i = 0; i<polyInx+1; i++,j++) { -							newpts[j] = xx->segs[0].u.p.pts[i]; -							REORIGIN(newpts[j].pt,newpts[i].pt,xx->angle,xx->orig); -						} -						if (!onPoint) { -							newpts[new_cnt-1].pt = pos; -							newpts[new_cnt-1].pt_type = wPolyLineStraight; -						} -					} else { -						newpts[0].pt = pos; -						newpts[0].pt_type = wPolyLineStraight; -						j = 1; -						for (int i=polyInx+1;i<old_cnt;i++,j++) { -							newpts[j] = xx->segs[0].u.p.pts[i]; -							REORIGIN(newpts[j].pt,newpts[j].pt,xx->angle,xx->orig); -						} +					if (!onPoint) { +						tempSegs(0).u.p.pts[tempSegs(0).u.p.cnt-1].pt = pos; +						tempSegs(0).u.p.pts[tempSegs(0).u.p.cnt-1].pt_type = wPolyLineStraight;  					} -					MyFree(xx->segs[0].u.p.pts); -					xx->segs[0].u.p.cnt = new_cnt; -					xx->segs[0].u.p.pts = newpts;  				} -				break; -			default: +			} else { +				*leftover = NULL;  				return FALSE; -		} -		*leftover = NULL; -		if (tempSegs(0).type != -1) { -			*leftover = MakeDrawFromSeg( zero, 0.0, &tempSegs(0) ); -			struct extraDataDraw_t * yy = GET_EXTRA_DATA(*leftover, T_DRAW, extraDataDraw_t); -			yy->lineType = xx->lineType; -			if (tempSegs(0).type == SEG_POLY && tempSegs(0).u.p.pts)  { -				MyFree(tempSegs(0).u.p.pts); -				tempSegs(0).u.p.cnt = 0; -				tempSegs(0).u.p.pts = NULL;  			} +			polyline_trim = TRUE; +			new_last = 1-ep; +			int new_cnt, old_cnt = xx->segs[0].u.p.cnt; +			if (1-ep) { +				new_cnt =  polyInx + 2 - onPoint; +			} else { +				new_cnt = xx->segs[0].u.p.cnt-polyInx; +			} +			pts_t * newpts = MyMalloc(new_cnt*sizeof(pts_t)); +			int j = 0; +			if (1-ep) { +				for (int i = 0; i<polyInx+1; i++,j++) { +					newpts[j] = xx->segs[0].u.p.pts[i]; +					REORIGIN(newpts[j].pt,newpts[i].pt,xx->angle,xx->orig); +				} +				if (!onPoint) { +					newpts[new_cnt-1].pt = pos; +					newpts[new_cnt-1].pt_type = wPolyLineStraight; +				} +			} else { +				newpts[0].pt = pos; +				newpts[0].pt_type = wPolyLineStraight; +				j = 1; +				for (int i=polyInx+1; i<old_cnt; i++,j++) { +					newpts[j] = xx->segs[0].u.p.pts[i]; +					REORIGIN(newpts[j].pt,newpts[j].pt,xx->angle,xx->orig); +				} +			} +			MyFree(xx->segs[0].u.p.pts); +			xx->segs[0].u.p.cnt = new_cnt; +			xx->segs[0].u.p.pts = newpts;  		} +		break; +	default: +		return FALSE; +	} +	*leftover = NULL; +	if (tempSegs(0).type != -1) { +		*leftover = MakeDrawFromSeg( zero, 0.0, &tempSegs(0) ); +		struct extraDataDraw_t * yy = GET_EXTRA_DATA(*leftover, T_DRAW, +		                              extraDataDraw_t); +		yy->lineType = xx->lineType; +		if (tempSegs(0).type == SEG_POLY && tempSegs(0).u.p.pts)  { +			MyFree(tempSegs(0).u.p.pts); +			tempSegs(0).u.p.cnt = 0; +			tempSegs(0).u.p.pts = NULL; +		} +	} -		if (*leftover) { -			//Polyline sets new_last to the end of the extra -			if (polyline_trim && (ep != new_last)) { -				*leftover = trk; -			} +	if (*leftover) { +		//Polyline sets new_last to the end of the extra +		if (polyline_trim && (ep != new_last)) { +			*leftover = trk;  		} -		xx->orig = zero; -		xx->angle = 0.0; -		ComputeDrawBoundingBox(trk); -		*ep0 = 1-ep; -		*ep1 = ep; -		return TRUE; +	} +	xx->orig = zero; +	xx->angle = 0.0; +	ComputeDrawBoundingBox(trk); +	*ep0 = 1-ep; +	*ep1 = ep; +	return TRUE;  }  static BOOL_T MakeParallelDraw( -		track_p trk, -		coOrd pos, -		DIST_T sep, -		DIST_T factor, -		track_p * newTrkR, -		coOrd * p0R, -		coOrd * p1R, -		BOOL_T track) +        track_p trk, +        coOrd pos, +        DIST_T sep, +        DIST_T factor, +        track_p * newTrkR, +        coOrd * p0R, +        coOrd * p1R, +        BOOL_T track)  { -	if (track) return FALSE; +	if (track) { return FALSE; }  	struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t);  	ANGLE_T angle; @@ -2411,167 +2540,181 @@ static BOOL_T MakeParallelDraw(  	DYNARR_SET(trkSeg_t, tempSegs_da, 1);  	switch (xx->segs[0].type) { -		case SEG_STRLIN: -			angle = NormalizeAngle(FindAngle(xx->segs[0].u.l.pos[0],xx->segs[0].u.l.pos[1])+xx->angle); -			if ( NormalizeAngle( FindAngle( xx->segs[0].u.l.pos[0], pos ) - angle ) < 180.0 ) -				angle += 90; -			else -				angle -= 90; -			coOrd p0,p1; -			REORIGIN(p0,xx->segs[0].u.l.pos[0],xx->angle,xx->orig); -			REORIGIN(p1,xx->segs[0].u.l.pos[1],xx->angle,xx->orig); -			Translate(&p0,p0, angle, sep); -			Translate(&p1,p1, angle, sep); -			tempSegs(0).color = xx->segs[0].color; -			tempSegs(0).width = xx->segs[0].width; -			tempSegs_da.cnt = 1; -			tempSegs(0).type = SEG_STRLIN; -			tempSegs(0).u.l.pos[0] = p0; -			tempSegs(0).u.l.pos[1] = p1; -			if (newTrkR) { -				*newTrkR = MakeDrawFromSeg( zero, 0.0, &tempSegs(0) ); -				struct extraDataDraw_t * yy = GET_EXTRA_DATA(*newTrkR, T_DRAW, extraDataDraw_t); -				yy->lineType = xx->lineType; -			} +	case SEG_STRLIN: +		angle = NormalizeAngle(FindAngle(xx->segs[0].u.l.pos[0], +		                                 xx->segs[0].u.l.pos[1])+xx->angle); +		if ( NormalizeAngle( FindAngle( xx->segs[0].u.l.pos[0], +		                                pos ) - angle ) < 180.0 ) { +			angle += 90; +		} else { +			angle -= 90; +		} +		coOrd p0,p1; +		REORIGIN(p0,xx->segs[0].u.l.pos[0],xx->angle,xx->orig); +		REORIGIN(p1,xx->segs[0].u.l.pos[1],xx->angle,xx->orig); +		Translate(&p0,p0, angle, sep); +		Translate(&p1,p1, angle, sep); +		DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); +		tempSegs(0).color = xx->segs[0].color; +		tempSegs(0).lineWidth = xx->segs[0].lineWidth; +		tempSegs(0).type = SEG_STRLIN; +		tempSegs(0).u.l.pos[0] = p0; +		tempSegs(0).u.l.pos[1] = p1; +		if (newTrkR) { +			*newTrkR = MakeDrawFromSeg( zero, 0.0, &tempSegs(0) ); +			struct extraDataDraw_t * yy = GET_EXTRA_DATA(*newTrkR, T_DRAW, extraDataDraw_t); +			yy->lineType = xx->lineType; +		} -			if ( p0R ) *p0R = p0; -			if ( p1R ) *p1R = p1; -			return TRUE; -			break; -		case SEG_CRVLIN: -		case SEG_FILCRCL:; -			coOrd c; -			REORIGIN(c, xx->segs[0].u.c.center, xx->angle, xx->orig); -			rad = FindDistance( pos, c ); -			if ( rad > xx->segs[0].u.c.radius ) -				rad = xx->segs[0].u.c.radius + sep; -			else -				rad = xx->segs[0].u.c.radius - sep; -			tempSegs(0).color = xx->segs[0].color; -			tempSegs(0).width = xx->segs[0].width; -			tempSegs_da.cnt = 1; -			tempSegs(0).type = SEG_CRVLIN; -			tempSegs(0).u.c.center = c; -			tempSegs(0).u.c.radius = rad; -			tempSegs(0).u.c.a0 = xx->segs[0].u.c.a0 + xx->angle; -			tempSegs(0).u.c.a1 = xx->segs[0].u.c.a1; -			if (newTrkR) { -				*newTrkR = MakeDrawFromSeg( zero, 0.0, &tempSegs(0) ); -				struct extraDataDraw_t * yy = GET_EXTRA_DATA(*newTrkR, T_DRAW, extraDataDraw_t); -				yy->lineType = xx->lineType; -			} -			if ( p0R ) PointOnCircle( p0R, xx->segs[0].u.c.center, rad, xx->segs[0].u.c.a0 ); -			if ( p1R ) PointOnCircle( p1R, xx->segs[0].u.c.center, rad, xx->segs[0].u.c.a0+xx->segs[0].u.c.a1 ); -			return TRUE; -			break; -		case SEG_POLY: -		case SEG_FILPOLY: -			pos.x -= xx->orig.x; -			pos.y -= xx->orig.y; -			Rotate( &pos, zero, -xx->angle ); -			coOrd p = pos; -			int inx2; -			angle = NormalizeAngle(GetAngleSegs(1,&xx->segs[0],&p,NULL,NULL,NULL,&inx2,NULL)+xx->angle); -			if ( NormalizeAngle( FindAngle( p, pos ) - angle ) < 180.0 ) { -				angle = +90.0; +		if ( p0R ) { *p0R = p0; } +		if ( p1R ) { *p1R = p1; } +		return TRUE; +		break; +	case SEG_CRVLIN: +	case SEG_FILCRCL:; +		coOrd c; +		REORIGIN(c, xx->segs[0].u.c.center, xx->angle, xx->orig); +		rad = FindDistance( pos, c ); +		if ( rad > xx->segs[0].u.c.radius ) { +			rad = xx->segs[0].u.c.radius + sep; +		} else { +			rad = xx->segs[0].u.c.radius - sep; +		} +		DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); +		tempSegs(0).color = xx->segs[0].color; +		tempSegs(0).lineWidth = xx->segs[0].lineWidth; +		tempSegs(0).type = SEG_CRVLIN; +		tempSegs(0).u.c.center = c; +		tempSegs(0).u.c.radius = rad; +		tempSegs(0).u.c.a0 = xx->segs[0].u.c.a0 + xx->angle; +		tempSegs(0).u.c.a1 = xx->segs[0].u.c.a1; +		if (newTrkR) { +			*newTrkR = MakeDrawFromSeg( zero, 0.0, &tempSegs(0) ); +			struct extraDataDraw_t * yy = GET_EXTRA_DATA(*newTrkR, T_DRAW, extraDataDraw_t); +			yy->lineType = xx->lineType; +		} +		if ( p0R ) { PointOnCircle( p0R, xx->segs[0].u.c.center, rad, xx->segs[0].u.c.a0 ); } +		if ( p1R ) { PointOnCircle( p1R, xx->segs[0].u.c.center, rad, xx->segs[0].u.c.a0+xx->segs[0].u.c.a1 ); } +		return TRUE; +		break; +	case SEG_POLY: +	case SEG_FILPOLY: +		pos.x -= xx->orig.x; +		pos.y -= xx->orig.y; +		Rotate( &pos, zero, -xx->angle ); +		coOrd p = pos; +		int inx2; +		angle = NormalizeAngle(GetAngleSegs(1,&xx->segs[0],&p,NULL,NULL,NULL,&inx2, +		                                    NULL)+xx->angle); +		if ( NormalizeAngle( FindAngle( p, pos ) - angle ) < 180.0 ) { +			angle = +90.0; +		} else { +			angle = -90.0; +		} +		DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); +		tempSegs(0).color = xx->segs[0].color; +		tempSegs(0).lineWidth = xx->segs[0].lineWidth; +		tempSegs(0).type = SEG_POLY; +		tempSegs(0).u.p.polyType = xx->segs[0].type==SEG_POLY?xx->segs[0].u.p.polyType: +		                           POLYLINE; +		tempSegs(0).u.p.pts = memdup( xx->segs[0].u.p.pts, +		                              xx->segs[0].u.p.cnt*sizeof (pts_t) ); +		tempSegs(0).u.p.cnt = xx->segs[0].u.p.cnt; +		ANGLE_T a,b; +		for (int i=0; i<xx->segs[0].u.p.cnt; i++) { +			REORIGIN(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i].pt,xx->angle, +			         xx->orig); +		} +		for (int i=0; i<xx->segs[0].u.p.cnt; i++) { +			if (xx->segs[0].u.p.polyType == POLYLINE) { +				if (i==0) { +					a = FindAngle(tempSegs(0).u.p.pts[0].pt,tempSegs(0).u.p.pts[1].pt); +					b = 0; +				} else if (i==xx->segs[0].u.p.cnt-1) { +					a = NormalizeAngle(FindAngle(tempSegs(0).u.p.pts[i].pt, +					                             tempSegs(0).u.p.pts[i-1].pt)+180.0); +					b = 0; +				} else { +					a = FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i+1].pt); +					b = DifferenceBetweenAngles(a,FindAngle(tempSegs(0).u.p.pts[i].pt, +					                                        tempSegs(0).u.p.pts[i-1].pt)+180.0)/2; +					a = a + b; +				}  			} else { -				angle = -90.0; -			} -			tempSegs(0).color = xx->segs[0].color; -			tempSegs(0).width = xx->segs[0].width; -			tempSegs_da.cnt = 1; -			tempSegs(0).type = SEG_POLY; -			tempSegs(0).u.p.polyType = xx->segs[0].type==SEG_POLY?xx->segs[0].u.p.polyType:POLYLINE; -			tempSegs(0).u.p.pts = memdup( xx->segs[0].u.p.pts, xx->segs[0].u.p.cnt*sizeof (pts_t) ); -			tempSegs(0).u.p.cnt = xx->segs[0].u.p.cnt; -			ANGLE_T a,b; -			for (int i=0;i<xx->segs[0].u.p.cnt;i++) { -			    REORIGIN(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i].pt,xx->angle, xx->orig); -			} -			for (int i=0;i<xx->segs[0].u.p.cnt;i++) { -				if (xx->segs[0].u.p.polyType == POLYLINE) { -					if (i==0) { -						a = FindAngle(tempSegs(0).u.p.pts[0].pt,tempSegs(0).u.p.pts[1].pt); -						b = 0; -					} else if (i==xx->segs[0].u.p.cnt-1) { -						a = NormalizeAngle(FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i-1].pt)+180.0); -						b = 0; -					} else { -						a = FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i+1].pt); -						b = DifferenceBetweenAngles(a,FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i-1].pt)+180.0)/2; -						a = a + b; -					} +				if (i==0) { +					a = FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i+1].pt); +					b = DifferenceBetweenAngles(a,FindAngle(tempSegs(0).u.p.pts[i].pt, +					                                        tempSegs(0).u.p.pts[xx->segs[0].u.p.cnt-1].pt)+180.0)/2; +					a = a+b; +				} else if (i==xx->segs[0].u.p.cnt-1) { +					a = FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[0].pt); +					b = DifferenceBetweenAngles(a,FindAngle(tempSegs(0).u.p.pts[i].pt, +					                                        tempSegs(0).u.p.pts[i-1].pt)+180.0)/2; +					a = a+b;  				} else { -					if (i==0) { -						a = FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i+1].pt); -						b = DifferenceBetweenAngles(a,FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[xx->segs[0].u.p.cnt-1].pt)+180.0)/2; -						a = a+b; -					} else if (i==xx->segs[0].u.p.cnt-1) { -						a = FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[0].pt); -						b = DifferenceBetweenAngles(a,FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i-1].pt)+180.0)/2; -						a = a+b; -					} else { -						a = FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i+1].pt); -						b = DifferenceBetweenAngles(a,FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i-1].pt)+180.0)/2; -						a = a+b; -					} +					a = FindAngle(tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i+1].pt); +					b = DifferenceBetweenAngles(a,FindAngle(tempSegs(0).u.p.pts[i].pt, +					                                        tempSegs(0).u.p.pts[i-1].pt)+180.0)/2; +					a = a+b;  				} - -				Translate(&tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i].pt,a+angle,fabs(sep/cos(D2R(b))));  			} -			if (newTrkR) { -				*newTrkR = MakeDrawFromSeg( zero, 0.0, &tempSegs(0) ); -				struct extraDataDraw_t * yy = GET_EXTRA_DATA(*newTrkR, T_DRAW, extraDataDraw_t); -				yy->lineType = xx->lineType; -				if (tempSegs(0).u.p.pts) MyFree(tempSegs(0).u.p.pts); -			} -			if (p0R) *p0R = tempSegs(0).u.p.pts[0].pt; -			if (p1R) *p1R = tempSegs(0).u.p.pts[tempSegs(0).u.p.cnt-1].pt; -			return TRUE; -			break; -		default: + +			Translate(&tempSegs(0).u.p.pts[i].pt,tempSegs(0).u.p.pts[i].pt,a+angle, +			          fabs(sep/cos(D2R(b)))); +		} +		if (newTrkR) { +			*newTrkR = MakeDrawFromSeg( zero, 0.0, &tempSegs(0) ); +			struct extraDataDraw_t * yy = GET_EXTRA_DATA(*newTrkR, T_DRAW, extraDataDraw_t); +			yy->lineType = xx->lineType; +			if (tempSegs(0).u.p.pts) { MyFree(tempSegs(0).u.p.pts); } +		} +		if (p0R) { *p0R = tempSegs(0).u.p.pts[0].pt; } +		if (p1R) { *p1R = tempSegs(0).u.p.pts[tempSegs(0).u.p.cnt-1].pt; } +		return TRUE; +		break; +	default:  		return FALSE;  	}  	return FALSE;  }  static trackCmd_t drawCmds = { -		"DRAW", -		DrawDraw, -		DistanceDraw, -		DescribeDraw, -		DeleteDraw, -		WriteDraw, -		ReadDraw, -		MoveDraw, -		RotateDraw, -		RescaleDraw, -		NULL, -		GetAngleDraw, /* getAngle */ -		SplitDraw, /* split */ -		NULL, /* traverse */ -		EnumerateDraw, -		NULL, /* redraw */ -		NULL, /* trim */ -		NULL, /* merge */ -		ModifyDraw, -		NULL, /* getLength */ -		GetParamsDraw, /* getTrackParams */ -		NULL, /* moveEndPt */ -		QueryDraw, /* query */ -		UngroupDraw, -		FlipDraw, -		NULL, -		NULL, -		NULL, -		MakeParallelDraw, /*Parallel*/ -		NULL, -		NULL, /*MakeSegs*/ -		ReplayDraw, -		StoreDraw, -		NULL, -		CompareDraw -		}; +	"DRAW", +	DrawDraw, +	DistanceDraw, +	DescribeDraw, +	DeleteDraw, +	WriteDraw, +	ReadDraw, +	MoveDraw, +	RotateDraw, +	RescaleDraw, +	NULL, +	GetAngleDraw, /* getAngle */ +	SplitDraw, /* split */ +	NULL, /* traverse */ +	EnumerateDraw, +	NULL, /* redraw */ +	NULL, /* trim */ +	NULL, /* merge */ +	ModifyDraw, +	NULL, /* getLength */ +	GetParamsDraw, /* getTrackParams */ +	NULL, /* moveEndPt */ +	QueryDraw, /* query */ +	UngroupDraw, +	FlipDraw, +	NULL, +	NULL, +	NULL, +	MakeParallelDraw, /*Parallel*/ +	NULL, +	NULL, /*MakeSegs*/ +	ReplayDraw, +	StoreDraw, +	NULL, +	CompareDraw +};  EXPORT BOOL_T OnTableEdgeEndPt( track_p trk, coOrd * pos )  { @@ -2581,11 +2724,12 @@ EXPORT BOOL_T OnTableEdgeEndPt( track_p trk, coOrd * pos )  	ignoredTableEdge = trk;  	if ((trk1 = OnTrack( &pos1, FALSE, FALSE )) != NULL && -		 GetTrkType(trk1) == T_DRAW) { +	    GetTrkType(trk1) == T_DRAW) {  		ignoredTableEdge = NULL;  		xx = GET_EXTRA_DATA(trk1, T_DRAW, extraDataDraw_t); -		if (xx->segCnt < 1) +		if (xx->segCnt < 1) {  			return FALSE; +		}  		if (xx->segs[0].type == SEG_TBLEDGE) {  			if ( IsClose( FindDistance( *pos, xx->segs[0].u.l.pos[0] ) ) ) {  				*pos = xx->segs[0].u.l.pos[0]; @@ -2607,8 +2751,9 @@ EXPORT BOOL_T GetClosestEndPt( track_p trk, coOrd * pos)  	if (GetTrkType(trk) == T_DRAW) {  		ignoredTableEdge = NULL;  		xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t); -		if (xx->segCnt < 1) +		if (xx->segCnt < 1) {  			return FALSE; +		}  		DIST_T dd0,dd1;  		coOrd p00,p0,p1;  		p00 = *pos; @@ -2617,26 +2762,28 @@ EXPORT BOOL_T GetClosestEndPt( track_p trk, coOrd * pos)  			p00.x -= xx->orig.x;  			p00.y -= xx->orig.y;  			switch (xx->segs[0].type) { -				case SEG_CRVLIN: -					PointOnCircle( &p0, xx->segs[0].u.c.center, fabs(xx->segs[0].u.c.radius), xx->segs[0].u.c.a0 ); -					dd0 = FindDistance( p00, p0); -					PointOnCircle( &p1, xx->segs[0].u.c.center, fabs(xx->segs[0].u.c.radius), xx->segs[0].u.c.a0 + xx->segs[0].u.c.a1); -					dd1 = FindDistance( p00, p1); +			case SEG_CRVLIN: +				PointOnCircle( &p0, xx->segs[0].u.c.center, fabs(xx->segs[0].u.c.radius), +				               xx->segs[0].u.c.a0 ); +				dd0 = FindDistance( p00, p0); +				PointOnCircle( &p1, xx->segs[0].u.c.center, fabs(xx->segs[0].u.c.radius), +				               xx->segs[0].u.c.a0 + xx->segs[0].u.c.a1); +				dd1 = FindDistance( p00, p1);  				break; -				case SEG_STRLIN: -					dd0 = FindDistance( p00, xx->segs[0].u.l.pos[0]); -					p0 = xx->segs[0].u.l.pos[0]; -					dd1 = FindDistance( p00, xx->segs[0].u.l.pos[1]); -					p1 = xx->segs[0].u.l.pos[1]; +			case SEG_STRLIN: +				dd0 = FindDistance( p00, xx->segs[0].u.l.pos[0]); +				p0 = xx->segs[0].u.l.pos[0]; +				dd1 = FindDistance( p00, xx->segs[0].u.l.pos[1]); +				p1 = xx->segs[0].u.l.pos[1];  				break; -				case SEG_BEZLIN: -					dd0 = FindDistance( p00, xx->segs[0].u.b.pos[0]); -					p0 = xx->segs[0].u.b.pos[0]; -					dd1 = FindDistance( p00, xx->segs[0].u.b.pos[3]); -					p1 = xx->segs[0].u.b.pos[3]; +			case SEG_BEZLIN: +				dd0 = FindDistance( p00, xx->segs[0].u.b.pos[0]); +				p0 = xx->segs[0].u.b.pos[0]; +				dd1 = FindDistance( p00, xx->segs[0].u.b.pos[3]); +				p1 = xx->segs[0].u.b.pos[3];  				break; -				default: -					return FALSE; +			default: +				return FALSE;  			}  			p0.x += xx->orig.x;  			p0.y += xx->orig.y; @@ -2651,7 +2798,7 @@ EXPORT BOOL_T GetClosestEndPt( track_p trk, coOrd * pos)  			p1 = xx->segs[0].u.b.pos[3];  			dd0 = FindDistance(p00,p0);  			dd1 = FindDistance(p00,p1); -		} else return FALSE; +		} else { return FALSE; }  		if (dd0>dd1) {  			* pos = p1;  			return TRUE; @@ -2666,23 +2813,24 @@ EXPORT BOOL_T GetClosestEndPt( track_p trk, coOrd * pos)  static drawContext_t drawCmdContext = { -		InfoMessage, -		DoRedraw, -		&mainD, -		OP_LINE }; +	InfoMessage, +	DoRedraw, +	&mainD, +	OP_LINE +};  static wIndex_t benchChoice;  static wIndex_t benchOrient;  static wIndex_t dimArrowSize;  wDrawColor lineColor = 1; -long lineWidth = 0; -static wDrawColor benchColor; +LWIDTH_T lineWidth = 0; +wDrawColor benchColor;  static paramData_t drawPLs[] = {  #define drawLineWidthPD				(drawPLs[0]) -	{ PD_LONG, &drawCmdContext.line_Width, "linewidth", PDO_NORECORD, &i100_100, N_("Line Width") }, +	{ PD_FLOAT, &lineWidth, "linewidth", PDO_NORECORD, &r100_100, N_("Line Width") },  #define drawColorPD				(drawPLs[1])  	{ PD_COLORLIST, &lineColor, "linecolor", PDO_NORECORD, NULL, N_("Color") },  #define drawBenchColorPD		(drawPLs[2]) @@ -2690,9 +2838,9 @@ static paramData_t drawPLs[] = {  #define drawBenchChoicePD		(drawPLs[3])  #ifdef WINDOWS  	{ PD_DROPLIST, &benchChoice, "benchlist", PDO_NOPREF|PDO_NORECORD|PDO_LISTINDEX, I2VP(120), N_("Lumber Type") }, -#else     -    { PD_DROPLIST, &benchChoice, "benchlist", PDO_NOPREF|PDO_NORECORD|PDO_LISTINDEX, I2VP(145), N_("Lumber Type") }, -#endif     +#else +	{ PD_DROPLIST, &benchChoice, "benchlist", PDO_NOPREF|PDO_NORECORD|PDO_LISTINDEX, I2VP(145), N_("Lumber Type") }, +#endif  #define drawBenchOrientPD		(drawPLs[4])  #ifdef WINDOWS  	{ PD_DROPLIST, &benchOrient, "benchorient", PDO_NOPREF|PDO_NORECORD|PDO_LISTINDEX, I2VP(45), "", 0 }, @@ -2716,27 +2864,28 @@ static paramData_t drawPLs[] = {  static paramGroup_t drawPG = { "draw", 0, drawPLs, COUNT( drawPLs ) };  static char * objectName[] = { -		N_("Straight"), -		N_("Dimension"), -		N_("Lumber"), -		N_("Table Edge"), -		N_("Curved"), -		N_("Curved"), -		N_("Curved"), -		N_("Curved"), -		N_("Circle"), -		N_("Circle"), -		N_("Circle"), -		N_("Box"), -		N_("Polygon"), -		N_("Filled Circle"), -		N_("Filled Circle"), -		N_("Filled Circle"), -		N_("Filled Box"), -		N_("Filled Polygon"), -		N_("Bezier Line"), -		N_("Polyline"), -		NULL}; +	N_("Straight"), +	N_("Dimension"), +	N_("Lumber"), +	N_("Table Edge"), +	N_("Curved"), +	N_("Curved"), +	N_("Curved"), +	N_("Curved"), +	N_("Circle"), +	N_("Circle"), +	N_("Circle"), +	N_("Box"), +	N_("Polygon"), +	N_("Filled Circle"), +	N_("Filled Circle"), +	N_("Filled Circle"), +	N_("Filled Box"), +	N_("Filled Polygon"), +	N_("Bezier Line"), +	N_("Polyline"), +	NULL +};  static STATUS_T CmdDraw( wAction_t action, coOrd pos ) @@ -2819,11 +2968,14 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos )  			labels[0] = N_("Lumber Type");  			labels[1] = "";  			labels[2] = N_("Color"); -			if ( wListGetCount( (wList_p)drawBenchChoicePD.control ) == 0 ) -				BenchLoadLists( (wList_p)drawBenchChoicePD.control, (wList_p)drawBenchOrientPD.control ); +			if ( wListGetCount( (wList_p)drawBenchChoicePD.control ) == 0 ) { +				BenchLoadLists( (wList_p)drawBenchChoicePD.control, +				                (wList_p)drawBenchOrientPD.control ); +			}  			ParamLoadControls( &drawPG ); -			BenchUpdateOrientationList( VP2L(wListGetItemContext( (wList_p)drawBenchChoicePD.control, benchChoice )), (wList_p)drawBenchOrientPD.control ); +			BenchUpdateOrientationList( VP2L(wListGetItemContext( (wList_p) +			                                 drawBenchChoicePD.control, benchChoice )), (wList_p)drawBenchOrientPD.control );  			wListSetIndex( (wList_p)drawBenchOrientPD.control, benchOrient );  			InfoSubstituteControls( controls, labels );  			drawBenchColorPD.option &= ~PDO_NORECORD; @@ -2853,7 +3005,7 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos )  			infoSubst = FALSE;  		}  		ParamGroupRecord( &drawPG ); -		if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); +		if (drawCmdContext.Op == OP_BEZLIN) { return CmdBezCurve(act2, pos); }  		DrawGeomMouse( C_START, pos, &drawCmdContext);  		return C_CONTINUE; @@ -2864,33 +3016,34 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos )  			return CmdBezCurve(act2, pos);  		}  		if ( drawCmdContext.Op == OP_BENCH ) { -			drawCmdContext.benchOption = GetBenchData( VP2L(wListGetItemContext((wList_p)drawBenchChoicePD.control, benchChoice )), benchOrient ); -			drawCmdContext.Color = benchColor; +			drawCmdContext.benchOption = GetBenchData( VP2L(wListGetItemContext(( +			                                     wList_p)drawBenchChoicePD.control, benchChoice )), benchOrient ); +			lineColor = benchColor;  		} else if ( drawCmdContext.Op == OP_DIMLINE ) { -			drawCmdContext.Color = wDrawColorBlack; +			lineColor = wDrawColorBlack;  			drawCmdContext.benchOption = dimArrowSize;  		} else if ( drawCmdContext.Op == OP_TBLEDGE ) { -			drawCmdContext.Color = wDrawColorBlack; +			lineColor = wDrawColorBlack;  		} else { -			drawCmdContext.Color = lineColor; +			lineColor = lineColor;  		}  		if ( infoSubst ) {  			InfoSubstituteControls( NULL, NULL );  			infoSubst = FALSE;  		} -		/* no break */ +	/* no break */  	case wActionLDrag:  		ParamLoadData( &drawPG ); -		/* no break */ +	/* no break */  	case wActionMove:  	case wActionRDown:  	case wActionRDrag: -		if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); +		if (drawCmdContext.Op == OP_BEZLIN) { return CmdBezCurve(act2, pos); }  		return DrawGeomMouse( action, pos, &drawCmdContext);  	case wActionLUp:  	case wActionRUp: -		if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); +		if (drawCmdContext.Op == OP_BEZLIN) { return CmdBezCurve(act2, pos); }  		drawCmdContext.show = TRUE;  		int rc = DrawGeomMouse( action, pos, &drawCmdContext);  		// Put up text entry boxes ready for updates if the result was continue @@ -2944,12 +3097,14 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos )  				controls[1] = drawAnglePD.control;  				controls[2] = NULL;  				labels[0] = N_("Seg Length"); -				if (drawCmdContext.Op == OP_LINE || drawCmdContext.Op  == OP_BENCH || drawCmdContext.Op == OP_TBLEDGE) +				if (drawCmdContext.Op == OP_LINE || drawCmdContext.Op  == OP_BENCH +				    || drawCmdContext.Op == OP_TBLEDGE) {  					labels[1] = N_("Angle"); -				else if (drawCmdContext.index > 0 ) +				} else if (drawCmdContext.index > 0 ) {  					labels[1] = N_("Rel Angle"); -				else +				} else {  					labels[1] = N_("Angle"); +				}  				ParamLoadControls( &drawPG );  				InfoSubstituteControls( controls, labels );  				drawLengthPD.option &= ~PDO_NORECORD; @@ -2977,29 +3132,29 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos )  	case C_CANCEL:  		InfoSubstituteControls( NULL, NULL ); -		if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); +		if (drawCmdContext.Op == OP_BEZLIN) { return CmdBezCurve(act2, pos); }  		return DrawGeomMouse( action, pos, &drawCmdContext);  	case C_TEXT: -		if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(action, pos); +		if (drawCmdContext.Op == OP_BEZLIN) { return CmdBezCurve(action, pos); }  		return DrawGeomMouse( action, pos, &drawCmdContext);  	case C_OK: -		if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); +		if (drawCmdContext.Op == OP_BEZLIN) { return CmdBezCurve(act2, pos); }  		return DrawGeomMouse( (0x0D<<8|wActionText), pos, &drawCmdContext);  	case C_CONFIRM: -		if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); +		if (drawCmdContext.Op == OP_BEZLIN) { return CmdBezCurve(act2, pos); }  		return DrawGeomMouse( (0x0D<<8|wActionText), pos, &drawCmdContext);  	case C_FINISH: -		if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); +		if (drawCmdContext.Op == OP_BEZLIN) { return CmdBezCurve(act2, pos); }  		return DrawGeomMouse( (0x0D<<8|wActionText), pos, &drawCmdContext); -		/*DrawOk( NULL );*/ +	/*DrawOk( NULL );*/  	case C_REDRAW: -		if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); +		if (drawCmdContext.Op == OP_BEZLIN) { return CmdBezCurve(act2, pos); }  		return DrawGeomMouse( action, pos, &drawCmdContext);  	case C_CMDMENU: -		if (drawCmdContext.Op == OP_BEZLIN) return C_CONTINUE; +		if (drawCmdContext.Op == OP_BEZLIN) { return C_CONTINUE; }  		return DrawGeomMouse( action, pos, &drawCmdContext);  	default: @@ -3007,84 +3162,88 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos )  	}  } -#include "bitmaps/straight-line.xpm" -#include "bitmaps/dimension.xpm" -#include "bitmaps/benchwork.xpm" -#include "bitmaps/table-edge.xpm" +#include "bitmaps/straight-line.xpm3" +#include "bitmaps/dimension.xpm3" +#include "bitmaps/benchwork.xpm3" +#include "bitmaps/table-edge.xpm3" -#include "bitmaps/curved-line-end.xpm" -#include "bitmaps/curved-line-tangent.xpm" -#include "bitmaps/curved-line-middle.xpm" -#include "bitmaps/curved-line-chord.xpm" +#include "bitmaps/curved-line-end.xpm3" +#include "bitmaps/curved-line-tangent.xpm3" +#include "bitmaps/curved-line-middle.xpm3" +#include "bitmaps/curved-line-chord.xpm3"  /*#include "bitmaps/dcircle1.xpm"*/ -#include "bitmaps/circle-line-center.xpm" -#include "bitmaps/circle-line-tangent.xpm" +#include "bitmaps/circle-line-center.xpm3" +#include "bitmaps/circle-line-tangent.xpm3"  /*#include "bitmaps/dflcrcl1.xpm"*/ -#include "bitmaps/circle-filled-center.xpm" -#include "bitmaps/circle-filled-tangent.xpm" +#include "bitmaps/circle-filled-center.xpm3" +#include "bitmaps/circle-filled-tangent.xpm3" -#include "bitmaps/box.xpm" -#include "bitmaps/filled-box.xpm" -#include "bitmaps/polygon.xpm" -#include "bitmaps/filled-polygon.xpm" -#include "bitmaps/bezier-line.xpm" -#include "bitmaps/polyline.xpm" +#include "bitmaps/box.xpm3" +#include "bitmaps/filled-box.xpm3" +#include "bitmaps/polygon.xpm3" +#include "bitmaps/filled-polygon.xpm3" +#include "bitmaps/bezier-line.xpm3" +#include "bitmaps/polyline.xpm3"  typedef struct { -		char ***xpm; -		int OP; -		char * shortName; -		char * cmdName; -		char * helpKey; -		long acclKey; -		} drawData_t; +	char ***xpm; +	int OP; +	char * shortName; +	char * cmdName; +	char * helpKey; +	long acclKey; +} drawData_t;  static drawData_t dlineCmds[] = { -		{ straight_line_xpm, OP_LINE, N_("Line"), N_("Draw Line"), "cmdDrawLine", ACCL_DRAWLINE }, -		{ dimension_xpm, OP_DIMLINE, N_("Dimension Line"), N_("Draw Dimension Line"), "cmdDrawDimLine", ACCL_DRAWDIMLINE }, -		{ benchwork_xpm, OP_BENCH, N_("Benchwork"), N_("Draw Benchwork"), "cmdDrawBench", ACCL_DRAWBENCH }, -		{ table_edge_xpm, OP_TBLEDGE, N_("Table Edge"), N_("Draw Table Edge"), "cmdDrawTableEdge", ACCL_DRAWTBLEDGE } }; +	{ straight_line_xpm3, OP_LINE, N_("Line"), N_("Draw Line"), "cmdDrawLine", ACCL_DRAWLINE }, +	{ dimension_xpm3, OP_DIMLINE, N_("Dimension Line"), N_("Draw Dimension Line"), "cmdDrawDimLine", ACCL_DRAWDIMLINE }, +	{ benchwork_xpm3, OP_BENCH, N_("Benchwork"), N_("Draw Benchwork"), "cmdDrawBench", ACCL_DRAWBENCH }, +	{ table_edge_xpm3, OP_TBLEDGE, N_("Table Edge"), N_("Draw Table Edge"), "cmdDrawTableEdge", ACCL_DRAWTBLEDGE } +};  static drawData_t dcurveCmds[] = { -		{ curved_line_end_xpm, OP_CURVE1, N_("Curve End"), N_("Draw Curve from End"), "cmdDrawCurveEndPt", ACCL_DRAWCURVE1 }, -		{ curved_line_tangent_xpm, OP_CURVE2, N_("Curve Tangent"), N_("Draw Curve from Tangent"), "cmdDrawCurveTangent", ACCL_DRAWCURVE2 }, -		{ curved_line_middle_xpm, OP_CURVE3, N_("Curve Center"), N_("Draw Curve from Center"), "cmdDrawCurveCenter", ACCL_DRAWCURVE3 }, -		{ curved_line_chord_xpm, OP_CURVE4, N_("Curve Chord"), N_("Draw Curve from Chord"), "cmdDrawCurveChord", ACCL_DRAWCURVE4 }, -		{ bezier_line_xpm, OP_BEZLIN, N_("Bezier Curve"), N_("Draw Bezier"), "cmdDrawBezierCurve", ACCL_DRAWBEZLINE } }; +	{ curved_line_end_xpm3, OP_CURVE1, N_("Curve End"), N_("Draw Curve from End"), "cmdDrawCurveEndPt", ACCL_DRAWCURVE1 }, +	{ curved_line_tangent_xpm3, OP_CURVE2, N_("Curve Tangent"), N_("Draw Curve from Tangent"), "cmdDrawCurveTangent", ACCL_DRAWCURVE2 }, +	{ curved_line_middle_xpm3, OP_CURVE3, N_("Curve Center"), N_("Draw Curve from Center"), "cmdDrawCurveCenter", ACCL_DRAWCURVE3 }, +	{ curved_line_chord_xpm3, OP_CURVE4, N_("Curve Chord"), N_("Draw Curve from Chord"), "cmdDrawCurveChord", ACCL_DRAWCURVE4 }, +	{ bezier_line_xpm3, OP_BEZLIN, N_("Bezier Curve"), N_("Draw Bezier"), "cmdDrawBezierCurve", ACCL_DRAWBEZLINE } +};  static drawData_t dcircleCmds[] = { -		/*{ dcircle1_xpm, OP_CIRCLE1, "Circle Fixed Radius", "Draw Fixed Radius Circle", "cmdDrawCircleFixedRadius", ACCL_DRAWCIRCLE1 },*/ -		{ circle_line_center_xpm, OP_CIRCLE3, N_("Circle Center"), N_("Draw Circle from Center"), "cmdDrawCircleCenter", ACCL_DRAWCIRCLE2 }, -		{ circle_line_tangent_xpm, OP_CIRCLE2, N_("Circle Tangent"), N_("Draw Circle from Tangent"), "cmdDrawCircleTangent", ACCL_DRAWCIRCLE3 }, -		/*{ dflcrcl1_xpm, OP_FILLCIRCLE1, "Circle Filled Fixed Radius", "Draw Fixed Radius Filled Circle", "cmdDrawFilledCircleFixedRadius", ACCL_DRAWFILLCIRCLE1 },*/ -		{ circle_filled_center_xpm, OP_FILLCIRCLE3, N_("Circle Filled Center"), N_("Draw Filled Circle from Center"), "cmdDrawFilledCircleCenter", ACCL_DRAWFILLCIRCLE2 }, -		{ circle_filled_tangent_xpm, OP_FILLCIRCLE2, N_("Circle Filled Tangent"), N_("Draw Filled Circle from Tangent"), "cmdDrawFilledCircleTangent", ACCL_DRAWFILLCIRCLE3 } }; +	/*{ dcircle1_xpm, OP_CIRCLE1, "Circle Fixed Radius", "Draw Fixed Radius Circle", "cmdDrawCircleFixedRadius", ACCL_DRAWCIRCLE1 },*/ +	{ circle_line_center_xpm3, OP_CIRCLE3, N_("Circle Center"), N_("Draw Circle from Center"), "cmdDrawCircleCenter", ACCL_DRAWCIRCLE2 }, +	{ circle_line_tangent_xpm3, OP_CIRCLE2, N_("Circle Tangent"), N_("Draw Circle from Tangent"), "cmdDrawCircleTangent", ACCL_DRAWCIRCLE3 }, +	/*{ dflcrcl1_xpm, OP_FILLCIRCLE1, "Circle Filled Fixed Radius", "Draw Fixed Radius Filled Circle", "cmdDrawFilledCircleFixedRadius", ACCL_DRAWFILLCIRCLE1 },*/ +	{ circle_filled_center_xpm3, OP_FILLCIRCLE3, N_("Circle Filled Center"), N_("Draw Filled Circle from Center"), "cmdDrawFilledCircleCenter", ACCL_DRAWFILLCIRCLE2 }, +	{ circle_filled_tangent_xpm3, OP_FILLCIRCLE2, N_("Circle Filled Tangent"), N_("Draw Filled Circle from Tangent"), "cmdDrawFilledCircleTangent", ACCL_DRAWFILLCIRCLE3 } +};  static drawData_t dshapeCmds[] = { -		{ box_xpm, OP_BOX, N_("Box"), N_("Draw Box"), "cmdDrawBox", ACCL_DRAWBOX }, -		{ filled_box_xpm, OP_FILLBOX, N_("Filled Box"), N_("Draw Filled Box"), "cmdDrawFilledBox", ACCL_DRAWFILLBOX }, -		{ polygon_xpm, OP_POLY, N_("Polygon"), N_("Draw Polygon"), "cmdDrawPolygon", ACCL_DRAWPOLY }, -		{ filled_polygon_xpm, OP_FILLPOLY, N_("Filled Polygon"), N_("Draw Filled Polygon"), "cmdDrawFilledPolygon", ACCL_DRAWFILLPOLYGON }, -		{ polyline_xpm, OP_POLYLINE, N_("PolyLine"), N_("Draw PolyLine"), "cmdDrawPolyline", ACCL_DRAWPOLYLINE }, +	{ box_xpm3, OP_BOX, N_("Box"), N_("Draw Box"), "cmdDrawBox", ACCL_DRAWBOX }, +	{ filled_box_xpm3, OP_FILLBOX, N_("Filled Box"), N_("Draw Filled Box"), "cmdDrawFilledBox", ACCL_DRAWFILLBOX }, +	{ polygon_xpm3, OP_POLY, N_("Polygon"), N_("Draw Polygon"), "cmdDrawPolygon", ACCL_DRAWPOLY }, +	{ filled_polygon_xpm3, OP_FILLPOLY, N_("Filled Polygon"), N_("Draw Filled Polygon"), "cmdDrawFilledPolygon", ACCL_DRAWFILLPOLYGON }, +	{ polyline_xpm3, OP_POLYLINE, N_("PolyLine"), N_("Draw PolyLine"), "cmdDrawPolyline", ACCL_DRAWPOLYLINE },  };  typedef struct { -		char * helpKey; -		char * menuTitle; -		char * stickyLabel; -		int cnt; -		drawData_t * data; -		long acclKey; -		wIndex_t cmdInx; -		int curr; -		} drawStuff_t; +	char * helpKey; +	char * menuTitle; +	char * stickyLabel; +	int cnt; +	drawData_t * data; +	long acclKey; +	wIndex_t cmdInx; +	int curr; +} drawStuff_t;  static drawStuff_t drawStuff[4];  static drawStuff_t drawStuff[4] = { -		{ "cmdDrawLineSetCmd", N_("Straight Objects"), N_("Draw Straight Objects"), 4, dlineCmds }, -		{ "cmdDrawCurveSetCmd", N_("Curved Lines"), N_("Draw Curved Lines"), 5, dcurveCmds }, -		{ "cmdDrawCircleSetCmd", N_("Circle Lines"), N_("Draw Circles"), 4, dcircleCmds }, -		{ "cmdDrawShapeSetCmd", N_("Shapes"), N_("Draw Shapes"), 5, dshapeCmds} }; -		 +	{ "cmdDrawLineSetCmd", N_("Straight Objects"), N_("Draw Straight Objects"), 4, dlineCmds }, +	{ "cmdDrawCurveSetCmd", N_("Curved Lines"), N_("Draw Curved Lines"), 5, dcurveCmds }, +	{ "cmdDrawCircleSetCmd", N_("Circle Lines"), N_("Draw Circles"), 4, dcircleCmds }, +	{ "cmdDrawShapeSetCmd", N_("Shapes"), N_("Draw Shapes"), 5, dshapeCmds} +}; +  static void ChangeDraw( long changes )  { @@ -3093,7 +3252,8 @@ static void ChangeDraw( long changes )  		if ( drawBenchChoicePD.control && drawBenchOrientPD.control ) {  			choice = wListGetIndex( (wList_p)drawBenchChoicePD.control );  			orient = wListGetIndex( (wList_p)drawBenchOrientPD.control ); -			BenchLoadLists( (wList_p)drawBenchChoicePD.control, (wList_p)drawBenchOrientPD.control ); +			BenchLoadLists( (wList_p)drawBenchChoicePD.control, +			                (wList_p)drawBenchOrientPD.control );  			wListSetIndex( (wList_p)drawBenchChoicePD.control, choice );  			wListSetIndex( (wList_p)drawBenchOrientPD.control, orient );  		} @@ -3103,53 +3263,43 @@ static void ChangeDraw( long changes )  static void DrawDlgUpdate( -		paramGroup_p pg, -		int inx, -		void * valueP ) +        paramGroup_p pg, +        int inx, +        void * valueP )  { -	if (inx==3) { -		if (drawCmdContext.Op == OP_BEZLIN) { -			if ( (inx == 0  && pg->paramPtr[inx].valueP == &drawCmdContext.line_Width) || -				 (inx == 1 && pg->paramPtr[inx].valueP == &lineColor)) -			   { -				lineWidth = drawCmdContext.line_Width; -				UpdateParms(lineColor, lineWidth); -			   } -		} -	}  	if (inx >=6 ) {  		if (drawCmdContext.Op == OP_CIRCLE1 || -			drawCmdContext.Op == OP_FILLCIRCLE1 || -			drawCmdContext.Op == OP_CIRCLE2 || -			drawCmdContext.Op == OP_FILLCIRCLE2 || -			drawCmdContext.Op == OP_CIRCLE3 || -			drawCmdContext.Op == OP_FILLCIRCLE3) { +		    drawCmdContext.Op == OP_FILLCIRCLE1 || +		    drawCmdContext.Op == OP_CIRCLE2 || +		    drawCmdContext.Op == OP_FILLCIRCLE2 || +		    drawCmdContext.Op == OP_CIRCLE3 || +		    drawCmdContext.Op == OP_FILLCIRCLE3) {  			coOrd pos = zero;  			DrawGeomMouse(C_UPDATE,pos,&drawCmdContext);  		}  		if (drawCmdContext.Op == OP_CURVE1 || -			drawCmdContext.Op == OP_CURVE2 || -			drawCmdContext.Op == OP_CURVE3 || -			drawCmdContext.Op == OP_CURVE4 	) { +		    drawCmdContext.Op == OP_CURVE2 || +		    drawCmdContext.Op == OP_CURVE3 || +		    drawCmdContext.Op == OP_CURVE4 	) {  			coOrd pos = zero;  			DrawGeomMouse(C_UPDATE,pos,&drawCmdContext);  		}  		if (drawCmdContext.Op == OP_LINE || -			drawCmdContext.Op == OP_BENCH|| -			drawCmdContext.Op == OP_TBLEDGE) { +		    drawCmdContext.Op == OP_BENCH|| +		    drawCmdContext.Op == OP_TBLEDGE) {  			coOrd pos = zero;  			DrawGeomMouse(C_UPDATE,pos,&drawCmdContext);  		}  		if (drawCmdContext.Op == OP_BOX || -			drawCmdContext.Op == OP_FILLBOX	){ +		    drawCmdContext.Op == OP_FILLBOX	) {  			coOrd pos = zero;  			DrawGeomMouse(C_UPDATE,pos,&drawCmdContext);  		}  		if (drawCmdContext.Op == OP_POLY || -			drawCmdContext.Op == OP_FILLPOLY || -			drawCmdContext.Op == OP_POLYLINE) { +		    drawCmdContext.Op == OP_FILLPOLY || +		    drawCmdContext.Op == OP_POLYLINE) {  			coOrd pos = zero;  			DrawGeomMouse(C_UPDATE,pos,&drawCmdContext);  		} @@ -3161,8 +3311,11 @@ static void DrawDlgUpdate(  		//}  	} -	if ( inx >= 0 && pg->paramPtr[inx].valueP == &benchChoice ) -		BenchUpdateOrientationList( VP2L(wListGetItemContext( (wList_p)drawBenchChoicePD.control, (wIndex_t)*(long*)valueP )), (wList_p)drawBenchOrientPD.control ); +	if ( inx >= 0 && pg->paramPtr[inx].valueP == &benchChoice ) { +		BenchUpdateOrientationList( VP2L(wListGetItemContext( (wList_p) +		                                 drawBenchChoicePD.control, (wIndex_t)*(long*)valueP )), +		                            (wList_p)drawBenchOrientPD.control ); +	}  }  EXPORT void InitCmdDraw( wMenu_p menu ) @@ -3172,7 +3325,6 @@ EXPORT void InitCmdDraw( wMenu_p menu )  	drawData_t * ddp;  	wIcon_p icon; -	drawCmdContext.Color = wDrawColorBlack;  	lineColor = wDrawColorBlack;  	benchColor = wDrawFindColor( wRGB(255,192,0) );  	ParamCreateControls( &drawPG, DrawDlgUpdate ); @@ -3185,7 +3337,8 @@ EXPORT void InitCmdDraw( wMenu_p menu )  		for ( inx2=0; inx2<dsp->cnt; inx2++ ) {  			ddp = &dsp->data[inx2];  			icon = wIconCreatePixMap( ddp->xpm[iconSize] ); -			AddMenuButton( menu, CmdDraw, ddp->helpKey, _(ddp->cmdName), icon, LEVEL0_50, IC_STICKY|IC_POPUP2|IC_WANT_MOVE, ddp->acclKey, I2VP(ddp->OP) ); +			AddMenuButton( menu, CmdDraw, ddp->helpKey, _(ddp->cmdName), icon, LEVEL0_50, +			               IC_STICKY|IC_POPUP2|IC_WANT_MOVE, ddp->acclKey, I2VP(ddp->OP) );  		}  		ButtonGroupEnd();  	} @@ -3204,12 +3357,14 @@ BOOL_T ReadTableEdge( char * line )  	trkSeg_t seg;  	wIndex_t layer; -	if ( !GetArgs( line, paramVersion<3?"dXpYpY":paramVersion<9?"dL000pYpY":"dL000pfpf", -				&index, &layer, &seg.u.l.pos[0], &elev0, &seg.u.l.pos[1], &elev1 ) ) +	if ( !GetArgs( line, paramVersion<3?"dXpYpY":paramVersion<9 +	               ?"dL000pYpY":"dL000pfpf", +	               &index, &layer, &seg.u.l.pos[0], &elev0, &seg.u.l.pos[1], &elev1 ) ) {  		return FALSE; +	}  	seg.type = SEG_TBLEDGE;  	seg.color = wDrawColorBlack; -	seg.width = 0; +	seg.lineWidth = 0;  	trk = MakeDrawFromSeg1( index, zero, 0.0, &seg );  	SetTrkLayer(trk, layer);  	return TRUE; @@ -3217,11 +3372,11 @@ BOOL_T ReadTableEdge( char * line )  /**   * Create a new segment for text. The data are stored in a trk structure. - * Storage for the string is dynamically allocated.  + * Storage for the string is dynamically allocated.   *   * \param index IN of new element   * \param pos IN coordinates of element - * \param angle IN orientation  + * \param angle IN orientation   * \param text IN text itself   * \param textSize IN font size in pts   * \param color IN text color @@ -3229,19 +3384,19 @@ BOOL_T ReadTableEdge( char * line )   */  EXPORT track_p NewText( -		wIndex_t index, -		coOrd pos, -		ANGLE_T angle, -		char * text, -		CSIZE_T textSize, +        wIndex_t index, +        coOrd pos, +        ANGLE_T angle, +        char * text, +        CSIZE_T textSize,          wDrawColor color, -		BOOL_T boxed) +        BOOL_T boxed)  {  	trkSeg_t tempSeg;  	track_p trk;  	tempSeg.type = SEG_TEXT;  	tempSeg.color = color; -	tempSeg.width = 0; +	tempSeg.lineWidth = 0;  	tempSeg.u.t.pos = pos;  	tempSeg.u.t.angle = angle;  	tempSeg.u.t.fontP = NULL; @@ -3261,17 +3416,23 @@ EXPORT BOOL_T ReadText( char * line )  	wIndex_t layer;  	track_p trk;  	ANGLE_T angle; -    wDrawColor color = wDrawColorBlack; -    if ( paramVersion<3 ) { -        if (!GetArgs( line, "XXpYql", &index, &layer, &pos, &angle, &text, &textSize )) -            return FALSE; -    } else if (paramVersion<9 ) { -        if (!GetArgs(line, "dL000pYql", &index, &layer, &pos, &angle, &text, &textSize)) -            return FALSE; -    } else { -        if (!GetArgs(line, "dLl00pfql", &index, &layer, &color, &pos, &angle, &text, &textSize )) -            return FALSE; -    } +	wDrawColor color = wDrawColorBlack; +	if ( paramVersion<3 ) { +		if (!GetArgs( line, "XXpYql", &index, &layer, &pos, &angle, &text, +		              &textSize )) { +			return FALSE; +		} +	} else if (paramVersion<9 ) { +		if (!GetArgs(line, "dL000pYql", &index, &layer, &pos, &angle, &text, +		             &textSize)) { +			return FALSE; +		} +	} else { +		if (!GetArgs(line, "dLl00pfql", &index, &layer, &color, &pos, &angle, &text, +		             &textSize )) { +			return FALSE; +		} +	}  	trk = NewText( index, pos, angle, text, textSize, color, FALSE );  	SetTrkLayer( trk, layer ); @@ -3301,17 +3462,20 @@ void MenuEnter( void * keyVP )  	int action;  	action = C_TEXT;  	action |= key<<8; -	if (drawModCmdContext.rotate_state) +	if (drawModCmdContext.rotate_state) {  		DrawGeomOriginMove(action,zero,&drawModCmdContext); -	else +	} else {  		DrawGeomModify(action,zero,&drawModCmdContext); +	}  }  void MenuLine( void * keyVP )  {  	int key = (int)VP2L(keyVP); -	struct extraDataDraw_t * xx = GET_EXTRA_DATA(drawModCmdContext.trk, T_DRAW, extraDataDraw_t); -	if ( drawModCmdContext.type==SEG_STRLIN || drawModCmdContext.type==SEG_CRVLIN || drawModCmdContext.type==SEG_POLY ) { +	struct extraDataDraw_t * xx = GET_EXTRA_DATA(drawModCmdContext.trk, T_DRAW, +	                              extraDataDraw_t); +	if ( drawModCmdContext.type==SEG_STRLIN || drawModCmdContext.type==SEG_CRVLIN +	     || drawModCmdContext.type==SEG_POLY ) {  		switch(key) {  		case '0':  			xx->lineType = DRAWLINESOLID; @@ -3339,10 +3503,12 @@ void MenuLine( void * keyVP )  	}  } -EXPORT void SetLineType( track_p trk, int width ) { +EXPORT void SetLineType( track_p trk, int width ) +{  	if (QueryTrack(trk, Q_IS_DRAW)) {  		struct extraDataDraw_t * xx = GET_EXTRA_DATA(trk, T_DRAW, extraDataDraw_t); -		if ( xx->segs[0].type==SEG_STRLIN || xx->segs[0].type==SEG_CRVLIN || xx->segs[0].type==SEG_POLY) { +		if ( xx->segs[0].type==SEG_STRLIN || xx->segs[0].type==SEG_CRVLIN +		     || xx->segs[0].type==SEG_POLY) {  			switch(width) {  			case 0:  				xx->lineType = DRAWLINESOLID; @@ -3377,29 +3543,49 @@ EXPORT void InitTrkDraw( void )  	AddParam( "TEXT", ReadText );  	drawModDelMI = MenuRegister( "Modify Draw Edit Menu" ); -	drawModClose = wMenuPushCreate( drawModDelMI, "", _("Close Polygon - 'g'"), 0, MenuEnter, I2VP( 'g')); -	drawModOpen = wMenuPushCreate( drawModDelMI, "", _("Make PolyLine - 'l'"), 0, MenuEnter, I2VP( 'l')); -	drawModFill = wMenuPushCreate( drawModDelMI, "", _("Fill Polygon - 'f'"), 0, MenuEnter, I2VP( 'f')); -	drawModEmpty = wMenuPushCreate( drawModDelMI, "", _("Empty Polygon - 'u'"), 0, MenuEnter, I2VP( 'u')); +	drawModClose = wMenuPushCreate( drawModDelMI, "", _("Close Polygon - 'g'"), 0, +	                                MenuEnter, I2VP( 'g')); +	drawModOpen = wMenuPushCreate( drawModDelMI, "", _("Make PolyLine - 'l'"), 0, +	                               MenuEnter, I2VP( 'l')); +	drawModFill = wMenuPushCreate( drawModDelMI, "", _("Fill Polygon - 'f'"), 0, +	                               MenuEnter, I2VP( 'f')); +	drawModEmpty = wMenuPushCreate( drawModDelMI, "", _("Empty Polygon - 'u'"), 0, +	                                MenuEnter, I2VP( 'u'));  	wMenuSeparatorCreate( drawModDelMI ); -	drawModPointsMode = wMenuPushCreate( drawModDelMI, "", _("Points Mode - 'p'"), 0, MenuMode, I2VP( 0 )); -	drawModDel = wMenuPushCreate( drawModDelMI, "", _("Delete Selected Point - 'Del'"), 0, MenuEnter, I2VP( 127 )); -	drawModVertex = wMenuPushCreate( drawModDelMI, "", _("Vertex Point - 'v'"), 0, MenuEnter, I2VP( 'v' )); -	drawModRound =  wMenuPushCreate( drawModDelMI, "", _("Round Corner - 'r'"), 0, MenuEnter, I2VP( 'r' )); -	drawModSmooth =  wMenuPushCreate( drawModDelMI, "", _("Smooth Corner - 's'"), 0, MenuEnter, I2VP( 's' )); +	drawModPointsMode = wMenuPushCreate( drawModDelMI, "", _("Points Mode - 'p'"), +	                                     0, MenuMode, I2VP( 0 )); +	drawModDel = wMenuPushCreate( drawModDelMI, "", +	                              _("Delete Selected Point - 'Del'"), 0, MenuEnter, I2VP( 127 )); +	drawModVertex = wMenuPushCreate( drawModDelMI, "", _("Vertex Point - 'v'"), 0, +	                                 MenuEnter, I2VP( 'v' )); +	drawModRound =  wMenuPushCreate( drawModDelMI, "", _("Round Corner - 'r'"), 0, +	                                 MenuEnter, I2VP( 'r' )); +	drawModSmooth =  wMenuPushCreate( drawModDelMI, "", _("Smooth Corner - 's'"), 0, +	                                  MenuEnter, I2VP( 's' ));  	wMenuSeparatorCreate( drawModDelMI );  	drawModLinMI = wMenuMenuCreate( drawModDelMI, "", _("LineType...") ); -	drawModSolid =  wMenuPushCreate( drawModLinMI, "", _("Solid Line"), 0, MenuLine, I2VP( '0' )); -	drawModDot =  wMenuPushCreate( drawModLinMI, "", _("Dashed Line"), 0, MenuLine, I2VP( '1' )); -	drawModDash =  wMenuPushCreate( drawModLinMI, "", _("Dotted Line"), 0, MenuLine, I2VP( '2' )); -	drawModDashDot =  wMenuPushCreate( drawModLinMI, "", _("Dash-Dot Line"), 0, MenuLine, I2VP( '3' )); -	drawModDashDotDot =  wMenuPushCreate( drawModLinMI, "", _("Dash-Dot-Dot Line"), 0, MenuLine, I2VP( '4' )); -	drawModCenterDot =  wMenuPushCreate( drawModLinMI, "", _("Center-Dot Line"), 0, MenuLine, I2VP( '5' )); -	drawModPhantom =  wMenuPushCreate( drawModLinMI, "", _("Phantom-Dot Line"), 0, MenuLine, I2VP( '6' )); +	drawModSolid =  wMenuPushCreate( drawModLinMI, "", _("Solid Line"), 0, MenuLine, +	                                 I2VP( '0' )); +	drawModDot =  wMenuPushCreate( drawModLinMI, "", _("Dashed Line"), 0, MenuLine, +	                               I2VP( '1' )); +	drawModDash =  wMenuPushCreate( drawModLinMI, "", _("Dotted Line"), 0, MenuLine, +	                                I2VP( '2' )); +	drawModDashDot =  wMenuPushCreate( drawModLinMI, "", _("Dash-Dot Line"), 0, +	                                   MenuLine, I2VP( '3' )); +	drawModDashDotDot =  wMenuPushCreate( drawModLinMI, "", _("Dash-Dot-Dot Line"), +	                                      0, MenuLine, I2VP( '4' )); +	drawModCenterDot =  wMenuPushCreate( drawModLinMI, "", _("Center-Dot Line"), 0, +	                                     MenuLine, I2VP( '5' )); +	drawModPhantom =  wMenuPushCreate( drawModLinMI, "", _("Phantom-Dot Line"), 0, +	                                   MenuLine, I2VP( '6' ));  	wMenuSeparatorCreate( drawModDelMI ); -	drawModriginMode = wMenuPushCreate( drawModDelMI, "", _("Origin Mode - 'o'"), 0, MenuMode, I2VP( 1 )); -	drawModOrigin = wMenuPushCreate( drawModDelMI, "", _("Reset Origin - '0'"), 0, MenuEnter, I2VP( '0' )); -	drawModLast = wMenuPushCreate( drawModDelMI, "", _("Origin to Selected - 'l'"), 0, MenuEnter, I2VP( 'l' )); -	drawModCenter = wMenuPushCreate( drawModDelMI, "", _("Origin to Middle - 'm'"), 0, MenuEnter, I2VP( 'm')); +	drawModriginMode = wMenuPushCreate( drawModDelMI, "", _("Origin Mode - 'o'"), 0, +	                                    MenuMode, I2VP( 1 )); +	drawModOrigin = wMenuPushCreate( drawModDelMI, "", _("Reset Origin - '0'"), 0, +	                                 MenuEnter, I2VP( '0' )); +	drawModLast = wMenuPushCreate( drawModDelMI, "", _("Origin to Selected - 'l'"), +	                               0, MenuEnter, I2VP( 'l' )); +	drawModCenter = wMenuPushCreate( drawModDelMI, "", _("Origin to Middle - 'm'"), +	                                 0, MenuEnter, I2VP( 'm'));  } | 
