diff options
Diffstat (limited to 'app/bin/cstraigh.c')
| -rw-r--r-- | app/bin/cstraigh.c | 80 | 
1 files changed, 67 insertions, 13 deletions
| diff --git a/app/bin/cstraigh.c b/app/bin/cstraigh.c index 6038c9a..7be25ee 100644 --- a/app/bin/cstraigh.c +++ b/app/bin/cstraigh.c @@ -1,5 +1,5 @@ -/* - * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/bin/cstraigh.c,v 1.4 2008-03-06 19:35:06 m_fischer Exp $ +/** \file cstraigh.c + * STRAIGHT   */  /*  XTrkCad - Model Railroad CAD @@ -19,22 +19,25 @@   *  along with this program; if not, write to the Free Software   *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.   */ +#include <math.h> -#include "track.h"  #include "cstraigh.h" +#include "cundo.h" +#include "fileio.h"  #include "i18n.h" - -/******************************************************************************* - * - * STRAIGHT - * - */ +#include "messages.h" +#include "param.h" +#include "track.h" +#include "utility.h"  /*   * STATE INFO   */  static struct {  		coOrd pos0, pos1; +		track_p trk; +		EPINX_T ep; +		BOOL_T down;  		} Dl; @@ -42,15 +45,46 @@ static STATUS_T CmdStraight( wAction_t action, coOrd pos )  {  	track_p t;  	DIST_T dist; +	coOrd p;  	switch (action) {  	case C_START: -		InfoMessage( _("Place 1st end point of Straight track") ); +		Dl.pos0=pos; +		Dl.pos1=pos; +		Dl.trk = NULL; +		Dl.ep=-1; +		Dl.down = FALSE; +		InfoMessage( _("Place 1st end point of straight track + Shift -> snap to unconnected endpoint") );  		return C_CONTINUE;  	case C_DOWN: -		SnapPos( &pos ); +		p = pos; +		BOOL_T found = FALSE; +		Dl.trk = NULL; +		if ((MyGetKeyState() & WKEY_SHIFT) != 0) { +			if ((t = OnTrack(&p, FALSE, TRUE)) != NULL) { +			   EPINX_T ep = PickUnconnectedEndPointSilent(p, t); +			   if (ep != -1) { +			   		Dl.trk = t; +			   		Dl.ep = ep; +			   		pos = GetTrkEndPos(t, ep); +			   		found = TRUE; +			   } else { +				   InfoMessage(_("No unconnected end-point on track - Try again or release Shift and click")); +				   Dl.pos0=pos; +				   Dl.pos1=pos; +				   return C_CONTINUE; +			   } +			} else { +				InfoMessage(_("Not on a track - Try again or release Shift and click")); +				Dl.pos0=pos; +				Dl.pos1=pos; +				return C_CONTINUE; +			} +		} +		Dl.down = TRUE;	 +		if (!found) SnapPos( &pos );  		Dl.pos0 = pos;  		InfoMessage( _("Drag to place 2nd end point") );  		DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); @@ -62,8 +96,17 @@ static STATUS_T CmdStraight( wAction_t action, coOrd pos )  		return C_CONTINUE;  	case C_MOVE: +		if (!Dl.down) return C_CONTINUE;  		DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); -		SnapPos( &pos ); +		ANGLE_T angle, angle2; +		if (Dl.trk) { +			angle = NormalizeAngle(GetTrkEndAngle( Dl.trk, Dl.ep)); +			angle2 = NormalizeAngle(FindAngle(pos, Dl.pos0)-angle); +			if (angle2 > 90.0 && angle2 < 270.0) +				Translate( &pos, Dl.pos0, angle, FindDistance( Dl.pos0, pos ) ); +			else pos = Dl.pos0;	 +		} else 	SnapPos( &pos ); +		  		InfoMessage( _("Straight Track Length=%s Angle=%0.3f"),  				FormatDistance(FindDistance( Dl.pos0, pos )),  				PutAngle(FindAngle( Dl.pos0, pos )) ); @@ -73,15 +116,25 @@ static STATUS_T CmdStraight( wAction_t action, coOrd pos )  		return C_CONTINUE;  	case C_UP: +		if (!Dl.down) return C_CONTINUE;  		DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack );  		tempSegs_da.cnt = 0; -		SnapPos( &pos ); +		if (Dl.trk) { +			angle = NormalizeAngle(GetTrkEndAngle( Dl.trk, Dl.ep)); +			angle2 = NormalizeAngle(FindAngle(pos, Dl.pos0)-angle); +			if (angle2 > 90.0 && angle2 < 270.0) +				Translate( &pos, Dl.pos0, angle, FindDistance( Dl.pos0, pos )); +			else pos = Dl.pos0;	 +		} else 	SnapPos( &pos );  		if ((dist=FindDistance( Dl.pos0, pos )) <= minLength) {  		   ErrorMessage( MSG_TRK_TOO_SHORT, "Straight ", PutDim(fabs(minLength-dist)) );  		   return C_TERMINATE;  		}  		UndoStart( _("Create Straight Track"), "newStraight" );  		t = NewStraightTrack( Dl.pos0, pos ); +		if (Dl.trk) { +			ConnectTracks(Dl.trk, Dl.ep, t, 0); +		}  		UndoEnd();  		DrawNewTrack(t);  		return C_TERMINATE; @@ -89,6 +142,7 @@ static STATUS_T CmdStraight( wAction_t action, coOrd pos )  	case C_REDRAW:  	case C_CANCEL:  		DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack ); +		Dl.down = FALSE;  		return C_CONTINUE;  	default: | 
