summaryrefslogtreecommitdiff
path: root/app/bin/tstraigh.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/tstraigh.c')
-rw-r--r--app/bin/tstraigh.c55
1 files changed, 41 insertions, 14 deletions
diff --git a/app/bin/tstraigh.c b/app/bin/tstraigh.c
index 0f5f273..5cf1cda 100644
--- a/app/bin/tstraigh.c
+++ b/app/bin/tstraigh.c
@@ -1,5 +1,5 @@
-/*
- * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/bin/tstraigh.c,v 1.2 2008-01-20 23:29:15 mni77 Exp $
+/** \file tstraigh.c
+ * Straight track
*/
/* XTrkCad - Model Railroad CAD
@@ -20,9 +20,17 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#include "track.h"
+#include <math.h>
+
#include "cstraigh.h"
+#include "cundo.h"
+#include "fileio.h"
#include "i18n.h"
+#include "layout.h"
+#include "messages.h"
+#include "param.h"
+#include "track.h"
+#include "utility.h"
/*******************************************************************************
*
@@ -70,13 +78,13 @@ static struct {
ANGLE_T angle;
FLOAT_T grade;
descPivot_t pivot;
- LAYER_T layerNumber;
+ unsigned int layerNumber;
} strData;
typedef enum { E0, Z0, E1, Z1, LN, AN, GR, PV, LY } strDesc_e;
static descData_t strDesc[] = {
-/*E0*/ { DESC_POS, N_("End Pt 1: X"), &strData.endPt[0] },
+/*E0*/ { DESC_POS, N_("End Pt 1: X,Y"), &strData.endPt[0] },
/*Z0*/ { DESC_DIM, N_("Z"), &strData.elev[0] },
-/*E1*/ { DESC_POS, N_("End Pt 2: X"), &strData.endPt[1] },
+/*E1*/ { DESC_POS, N_("End Pt 2: X,Y"), &strData.endPt[1] },
/*Z1*/ { DESC_DIM, N_("Z"), &strData.elev[1] },
/*LN*/ { DESC_DIM, N_("Length"), &strData.length },
/*AN*/ { DESC_ANGLE, N_("Angle"), &strData.angle },
@@ -420,7 +428,7 @@ static BOOL_T TrimStraight( track_p trk, EPINX_T ep, DIST_T dist )
AdjustStraightEndPt( trk, ep, pos );
DrawNewTrack( trk );
} else
- DeleteTrack( trk, FALSE );
+ DeleteTrack( trk, TRUE );
return TRUE;
}
@@ -548,6 +556,7 @@ static STATUS_T ModifyStraight( track_p trk, wAction_t action, coOrd pos )
InfoMessage( _("Straight: Length=%s Angle=%0.3f"),
FormatDistance( d ), PutAngle( GetTrkEndAngle( trk, ep ) ) );
MainRedraw();
+ MapRedraw();
return C_CONTINUE;
case C_UP:
@@ -556,6 +565,7 @@ static STATUS_T ModifyStraight( track_p trk, wAction_t action, coOrd pos )
tempSegs_da.cnt = 0;
DrawNewTrack( trk );
MainRedraw();
+ MapRedraw();
return C_TERMINATE;
default:
@@ -576,14 +586,19 @@ static BOOL_T GetParamsStraight( int inx, track_p trk, coOrd pos, trackParams_t
params->type = curveTypeStraight;
if ( inx == PARAMS_PARALLEL ) {
params->ep = 0;
+ } else if (inx == PARAMS_CORNU ){
+ params->ep = PickEndPoint( pos, trk);
+ params->arcP = zero;
+ params->arcR = 0.0;
} else {
- params->ep = PickUnconnectedEndPoint( pos, trk );
- if (params->ep == -1)
- return FALSE;
+ params->ep = PickUnconnectedEndPointSilent( pos, trk );
}
+ if (params->ep == -1)
+ return FALSE;
params->lineOrig = GetTrkEndPos(trk,1-params->ep);
params->lineEnd = GetTrkEndPos(trk,params->ep);
params->len = FindDistance( params->lineOrig, params->lineEnd );
+ params->track_angle = FindAngle( params->lineOrig, params->lineEnd);
params->angle = GetTrkEndAngle(trk,params->ep);
params->arcR = 0.0;
return TRUE;
@@ -610,6 +625,8 @@ static BOOL_T QueryStraight( track_p trk, int query )
case Q_CAN_MODIFYRADIUS:
case Q_CAN_GROUP:
case Q_ISTRACK:
+ case Q_CORNU_CAN_MODIFY:
+ case Q_MODIFY_CAN_SPLIT:
return TRUE;
default:
return FALSE;
@@ -703,9 +720,13 @@ EXPORT void StraightSegProc(
case SEGPROC_TRAVERSE1:
a1 = FindAngle( segPtr->u.l.pos[0], segPtr->u.l.pos[1] );
- a2 = NormalizeAngle( data->traverse1.angle+a1 );
- data->traverse1.backwards = (a2 < 270 && a2 > 90 );
+ a2 = NormalizeAngle( a1-data->traverse1.angle );
+ data->traverse1.backwards = ((a2 < 270) && (a2 > 90));
data->traverse1.dist = FindDistance( segPtr->u.l.pos[data->traverse1.backwards?1:0], data->traverse1.pos );
+ data->traverse1.reverse_seg = FALSE;
+ data->traverse1.negative = FALSE;
+ data->traverse1.segs_backwards = FALSE;
+ data->traverse1.BezSegInx = 0;
break;
case SEGPROC_TRAVERSE2:
@@ -716,7 +737,10 @@ EXPORT void StraightSegProc(
data->traverse2.dist = 0;
data->traverse2.angle = a1;
} else {
+ a1 = FindAngle( segPtr->u.l.pos[data->traverse2.segDir], segPtr->u.l.pos[1-data->traverse2.segDir] );
+ Translate( &data->traverse2.pos, segPtr->u.l.pos[data->traverse2.segDir], a1, d );
data->traverse2.dist -= d;
+ data->traverse2.angle = a1;
}
break;
@@ -768,9 +792,12 @@ EXPORT void StraightSegProc(
data->split.newSeg[1] = *segPtr;
data->split.newSeg[0].u.l.pos[1] = data->split.newSeg[1].u.l.pos[0] = p0;
break;
-
+ /*
+ * Note GetAngle always gives a positive angle because p0 is always left of p1
+ */
case SEGPROC_GETANGLE:
data->getAngle.angle = FindAngle( segPtr->u.l.pos[0], segPtr->u.l.pos[1] );
+ data->getAngle.radius = 0.0;
break;
}
}
@@ -788,7 +815,7 @@ track_p NewStraightTrack( coOrd p0, coOrd p1 )
track_p t;
ANGLE_T a;
t = NewTrack( 0, T_STRAIGHT, 2, 0 );
- SetTrkScale( t, curScaleInx );
+ SetTrkScale( t, GetLayoutCurScale() );
a = FindAngle( p1, p0 );
SetTrkEndPoint( t, 0, p0, a );
SetTrkEndPoint( t, 1, p1, NormalizeAngle( a+180.0 ) );