summaryrefslogtreecommitdiff
path: root/app/bin/chndldto.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/chndldto.c')
-rw-r--r--app/bin/chndldto.c162
1 files changed, 93 insertions, 69 deletions
diff --git a/app/bin/chndldto.c b/app/bin/chndldto.c
index a0f2d6b..fb7c05f 100644
--- a/app/bin/chndldto.c
+++ b/app/bin/chndldto.c
@@ -18,20 +18,17 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <math.h>
-
#include "ccurve.h"
#include "cjoin.h"
#include "compound.h"
#include "cstraigh.h"
#include "cundo.h"
-#include "i18n.h"
-#include "messages.h"
#include "track.h"
-#include "utility.h"
+#include "draw.h"
+#include "common-ui.h"
#define PTRACE(X)
@@ -39,17 +36,17 @@
* STATE INFO
*/
static struct {
- STATE_T state;
- coOrd normalP;
- ANGLE_T normalA;
- track_p normalT;
- coOrd reverseP;
- coOrd reverseP1;
- ANGLE_T reverseA;
- DIST_T frogNo;
- ANGLE_T frogA;
- curveData_t curveData;
- } Dhlt;
+ STATE_T state;
+ coOrd normalP;
+ ANGLE_T normalA;
+ track_p normalT;
+ coOrd reverseP;
+ coOrd reverseP1;
+ ANGLE_T reverseA;
+ DIST_T frogNo;
+ ANGLE_T frogA;
+ curveData_t curveData;
+} Dhlt;
static STATUS_T CmdHandLaidTurnout( wAction_t action, coOrd pos )
@@ -58,7 +55,8 @@ static STATUS_T CmdHandLaidTurnout( wAction_t action, coOrd pos )
EPINX_T ep, ep1, ep2, ep2a=-1, ep2b=-1, pointEp0, pointEp1;
DIST_T dist, reverseD, pointD;
coOrd off, intersectP;
- coOrd pointP, pointC, pointP1, reverseC, point0;
+ coOrd pointP, pointP1, reverseC, point0;
+// coOrd pointC;
track_p trk, trk1, trk2, trk2a=NULL, trk2b=NULL, pointT;
trkSeg_p segP;
BOOL_T right;
@@ -71,18 +69,18 @@ static STATUS_T CmdHandLaidTurnout( wAction_t action, coOrd pos )
DYNARR_SET( trkSeg_t, tempSegs_da, 1 );
Dhlt.state = 0;
Dhlt.normalT = NULL;
- tempSegs_da.cnt = 0;
DYNARR_SET( trkSeg_t, tempSegs_da, 2 );
tempSegs(0).color = drawColorBlack;
- tempSegs(0).width = 0;
+ tempSegs(0).lineWidth = 0;
tempSegs(1).color = drawColorBlack;
- tempSegs(1).width = 0;
+ tempSegs(1).lineWidth = 0;
return C_CONTINUE;
case C_DOWN:
if (Dhlt.state == 0) {
- if ((Dhlt.normalT = OnTrack( &pos, TRUE, TRUE )) == NULL)
+ if ((Dhlt.normalT = OnTrack( &pos, TRUE, TRUE )) == NULL) {
break;
+ }
if ( QueryTrack( Dhlt.normalT, Q_NOT_PLACE_FROGPOINTS ) ) {
ErrorMessage( MSG_CANT_PLACE_FROGPOINTS, _("frog") );
Dhlt.normalT = NULL;
@@ -92,19 +90,20 @@ static STATUS_T CmdHandLaidTurnout( wAction_t action, coOrd pos )
Dhlt.normalA = GetAngleAtPoint( Dhlt.normalT, Dhlt.normalP, NULL, NULL );
InfoMessage( _("Drag to set angle") );
Dhlt.state = 1;
- pointC = pointP = pointP1 = reverseC = zero;
+// pointC = pointP = pointP1 = reverseC = zero;
return C_CONTINUE;
}
case C_MOVE:
case C_UP:
- if (Dhlt.normalT == NULL)
+ if (Dhlt.normalT == NULL) {
break;
+ }
if (Dhlt.state == 1) {
Dhlt.reverseP1 = pos;
Dhlt.reverseA = FindAngle( Dhlt.reverseP, Dhlt.reverseP1 );
Dhlt.frogA = NormalizeAngle( Dhlt.reverseA - Dhlt.normalA );
-/*printf( "RA=%0.3f FA=%0.3f ", Dhlt.reverseA, Dhlt.frogA );*/
+ /*printf( "RA=%0.3f FA=%0.3f ", Dhlt.reverseA, Dhlt.frogA );*/
if (Dhlt.frogA > 270.0) {
Dhlt.frogA = 360.0-Dhlt.frogA;
right = FALSE;
@@ -121,12 +120,13 @@ static STATUS_T CmdHandLaidTurnout( wAction_t action, coOrd pos )
} else {
right = TRUE;
}
-/*printf( "NA=%0.3f FA=%0.3f R=%d\n", Dhlt.normalA, Dhlt.frogA, right );*/
+ /*printf( "NA=%0.3f FA=%0.3f R=%d\n", Dhlt.normalA, Dhlt.frogA, right );*/
Dhlt.frogNo = tan(D2R(Dhlt.frogA));
- if (Dhlt.frogNo > 0.01)
+ if (Dhlt.frogNo > 0.01) {
Dhlt.frogNo = 1.0/Dhlt.frogNo;
- else
+ } else {
Dhlt.frogNo = 0.0;
+ }
if (action == C_MOVE) {
if (Dhlt.frogNo != 0) {
InfoMessage( _("Angle = %0.2f Frog# = %0.2f"), Dhlt.frogA, Dhlt.frogNo );
@@ -136,15 +136,18 @@ static STATUS_T CmdHandLaidTurnout( wAction_t action, coOrd pos )
} else {
InfoMessage( _("Select point position") );
Dhlt.state = 2;
- Translate( &Dhlt.reverseP, Dhlt.reverseP, Dhlt.normalA+(right?+90:-90), trackGauge );
- Translate( &Dhlt.reverseP1, Dhlt.reverseP1, Dhlt.normalA+(right?+90:-90), trackGauge );
+ Translate( &Dhlt.reverseP, Dhlt.reverseP, Dhlt.normalA+(right?+90:-90),
+ trackGauge );
+ Translate( &Dhlt.reverseP1, Dhlt.reverseP1, Dhlt.normalA+(right?+90:-90),
+ trackGauge );
}
return C_CONTINUE;
} else if ( Dhlt.state == 2 ) {
- tempSegs_da.cnt = 0;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
pointP = pos;
- if ((pointT = OnTrack( &pointP, TRUE, TRUE )) == NULL)
+ if ((pointT = OnTrack( &pointP, TRUE, TRUE )) == NULL) {
break;
+ }
if ( QueryTrack( pointT, Q_NOT_PLACE_FROGPOINTS ) ) {
ErrorMessage( MSG_CANT_PLACE_FROGPOINTS, _("points") );
break;
@@ -152,11 +155,11 @@ static STATUS_T CmdHandLaidTurnout( wAction_t action, coOrd pos )
dist = FindDistance( Dhlt.normalP, pointP );
pointA = GetAngleAtPoint( pointT, pointP, &pointEp0, &pointEp1 );
angle = NormalizeAngle( pointA + 180.0 - Dhlt.reverseA );
-PTRACE(( "rA=%0.1f pA=%0.1f a=%0.1f ", Dhlt.reverseA, pointA, angle ))
+ PTRACE(( "rA=%0.1f pA=%0.1f a=%0.1f ", Dhlt.reverseA, pointA, angle ))
if ( angle > 90.0 && angle < 270.0 ) {
pointA = NormalizeAngle( pointA + 180.0 );
angle = NormalizeAngle( angle + 180.0 );
-PTRACE(( " {pA=%0.1f a=%0.1f} ", pointA, angle ))
+ PTRACE(( " {pA=%0.1f a=%0.1f} ", pointA, angle ))
} else {
ep = pointEp0; pointEp0 = pointEp1; pointEp1 = ep;
}
@@ -166,10 +169,11 @@ PTRACE(( " {pA=%0.1f a=%0.1f} ", pointA, angle ))
} else {
right = FALSE;
}
-PTRACE(( "r=%c a=%0.1f ", right?'T':'F', angle ))
+ PTRACE(( "r=%c a=%0.1f ", right?'T':'F', angle ))
Translate( &off, pointP, pointA+180.0, trackGauge*2.0 );
- if ((trk = OnTrack( &off, TRUE, TRUE )) == NULL)
+ if ((trk = OnTrack( &off, TRUE, TRUE )) == NULL) {
break;
+ }
if ( QueryTrack( trk, Q_NOT_PLACE_FROGPOINTS ) ) {
ErrorMessage( MSG_CANT_PLACE_FROGPOINTS, _("points") );
break;
@@ -178,23 +182,25 @@ PTRACE(( "r=%c a=%0.1f ", right?'T':'F', angle ))
Rotate( &off, Dhlt.reverseP, 180-Dhlt.reverseA );
off.x -= Dhlt.reverseP.x;
off.y -= Dhlt.reverseP.y;
- if (right)
+ if (right) {
off.x = -off.x;
-PTRACE(( "off=[%0.3f %0.3f] ", off.x, off.y ))
+ }
+ PTRACE(( "off=[%0.3f %0.3f] ", off.x, off.y ))
if (off.y < 0) {
ErrorMessage( MSG_MOVE_POINTS_OTHER_SIDE );
-PTRACE(("\n"))
+ PTRACE(("\n"))
break;
}
if (off.x < 0) {
ErrorMessage( MSG_MOVE_POINTS_AWAY_CLOSE );
-PTRACE(("\n"))
+ PTRACE(("\n"))
break;
}
angle2 = FindAngle( zero, off );
-PTRACE(( "a2=%0.1f\n", angle2 ))
+ PTRACE(( "a2=%0.1f\n", angle2 ))
if (angle < 0.5) {
if ( off.x < connectDistance ) {
+ DYNARR_SET( trkSeg_t, tempSegs_da, 2 );
tempSegs(0).type = SEG_STRTRK;
tempSegs(0).color = wDrawColorBlack;
tempSegs(0).u.l.pos[0] = pointP;
@@ -203,23 +209,25 @@ PTRACE(( "a2=%0.1f\n", angle2 ))
tempSegs(1).color = wDrawColorBlack;
tempSegs(1).u.l.pos[0] = Dhlt.reverseP;
Translate( &tempSegs(1).u.l.pos[1], Dhlt.reverseP, Dhlt.reverseA, trackGauge );
- tempSegs_da.cnt = 2;
} else {
- ErrorMessage( MSG_MOVE_POINTS_AWAY_NO_INTERSECTION );
- break;
+ ErrorMessage( MSG_MOVE_POINTS_AWAY_NO_INTERSECTION );
+ break;
}
} else if (angle < angle2) {
ErrorMessage( MSG_MOVE_POINTS_AWAY_NO_INTERSECTION );
break;
} else {
- if (!FindIntersection( &intersectP, Dhlt.reverseP, Dhlt.reverseA+180.0, pointP, pointA+180.0 ))
+ if (!FindIntersection( &intersectP, Dhlt.reverseP, Dhlt.reverseA+180.0, pointP,
+ pointA+180.0 )) {
break;
+ }
reverseD = FindDistance( Dhlt.reverseP, intersectP );
pointD = FindDistance( pointP, intersectP );
if (reverseD > pointD) {
reverseR = pointD/tan(D2R(angle/2.0));
Translate( &reverseC, pointP, pointA+(right?-90:+90), reverseR );
-PTRACE(( "rR=%0.3f rC=[%0.3f %0.3f]\n", reverseR, reverseC.x, reverseC.y ))
+ PTRACE(( "rR=%0.3f rC=[%0.3f %0.3f]\n", reverseR, reverseC.x, reverseC.y ))
+ DYNARR_SET( trkSeg_t, tempSegs_da, 3 );
tempSegs(0).type = SEG_CRVTRK;
tempSegs(0).color = wDrawColorBlack;
tempSegs(0).u.c.center = reverseC;
@@ -228,13 +236,13 @@ PTRACE(( "rR=%0.3f rC=[%0.3f %0.3f]\n", reverseR, reverseC.x, reverseC.y ))
tempSegs(0).u.c.a1 = angle;
tempSegs(1).type = SEG_STRTRK;
tempSegs(1).color = wDrawColorBlack;
- PointOnCircle( &tempSegs(1).u.l.pos[0], reverseC, reverseR, tempSegs(0).u.c.a0 + (right?angle:0.0) );
+ PointOnCircle( &tempSegs(1).u.l.pos[0], reverseC, reverseR,
+ tempSegs(0).u.c.a0 + (right?angle:0.0) );
tempSegs(1).u.l.pos[1] = Dhlt.reverseP;
tempSegs(2).type = SEG_STRTRK;
tempSegs(2).color = wDrawColorBlack;
tempSegs(2).u.l.pos[0] = Dhlt.reverseP;
Translate( &tempSegs(2).u.l.pos[1], Dhlt.reverseP, Dhlt.reverseA, trackGauge );
- tempSegs_da.cnt = 3;
} else {
reverseR = reverseD/tan(D2R(angle/2.0));
reverseR *= sqrt(reverseD/pointD);
@@ -243,17 +251,21 @@ PTRACE(( "rR=%0.3f rC=[%0.3f %0.3f]\n", reverseR, reverseC.x, reverseC.y ))
dist = FindDistance( reverseC, pointP );
angle2 = R2D( asin( reverseR/dist ) );
angle3 = FindAngle( pointP, reverseC );
- if (right)
+ if (right) {
angle2 = NormalizeAngle(angle3 - pointA+180) - angle2;
- else
+ } else {
angle2 = NormalizeAngle(pointA+180 - angle3) - angle2;
+ }
reverseA1 = angle-angle2;
-PTRACE(( " a2=%0.1f rA1=%0.1f\n", angle2, reverseA1 ))
+ PTRACE(( " a2=%0.1f rA1=%0.1f\n", angle2, reverseA1 ))
+ DYNARR_SET( trkSeg_t, tempSegs_da, 3 );
tempSegs(0).type = SEG_STRTRK;
tempSegs(0).color = wDrawColorBlack;
tempSegs(0).u.l.pos[0] = pointP;
- tempSegs(1).u.c.a0 = NormalizeAngle(Dhlt.reverseA + (right?(-90.0-reverseA1):+90.0));
- PointOnCircle( &tempSegs(0).u.l.pos[1], reverseC, reverseR, tempSegs(1).u.c.a0 + (right?0.0:reverseA1) );
+ tempSegs(1).u.c.a0 = NormalizeAngle(Dhlt.reverseA + (right?
+ (-90.0-reverseA1):+90.0));
+ PointOnCircle( &tempSegs(0).u.l.pos[1], reverseC, reverseR,
+ tempSegs(1).u.c.a0 + (right?0.0:reverseA1) );
tempSegs(1).type = SEG_CRVTRK;
tempSegs(1).color = wDrawColorBlack;
tempSegs(1).u.c.center = reverseC;
@@ -263,26 +275,29 @@ PTRACE(( " a2=%0.1f rA1=%0.1f\n", angle2, reverseA1 ))
tempSegs(2).color = wDrawColorBlack;
tempSegs(2).u.l.pos[0] = Dhlt.reverseP;
Translate( &tempSegs(2).u.l.pos[1], Dhlt.reverseP, Dhlt.reverseA, trackGauge );
- tempSegs_da.cnt = 3;
}
}
if (action != C_UP) {
dist = FindDistance( pointP, Dhlt.normalP );
- InfoMessage( _("Length = %0.2f Angle = %0.2f Frog# = %0.2f"), dist, Dhlt.frogA, Dhlt.frogNo );
+ InfoMessage( _("Length = %0.2f Angle = %0.2f Frog# = %0.2f"), dist, Dhlt.frogA,
+ Dhlt.frogNo );
return C_CONTINUE;
}
- UndoStart( _("Create Hand Laid Turnout"), "Hndldto( T%d[%d] )", GetTrkIndex(pointT), pointEp0 );
+ UndoStart( _("Create Hand Laid Turnout"), "Hndldto( T%d[%d] )",
+ GetTrkIndex(pointT), pointEp0 );
UndoModify( pointT );
- if (!SplitTrack( pointT, pointP, pointEp0, &trk1, TRUE ))
+ if (!SplitTrack( pointT, pointP, pointEp0, &trk1, TRUE )) {
break;
+ }
dist = trackGauge*2.0;
if ( !trk1 ) {
trk1 = pointT;
pointT = NULL;
}
ep1 = PickEndPoint( pointP, trk1 );
- if (!RemoveTrack( &trk1, &ep1, &dist ))
+ if (!RemoveTrack( &trk1, &ep1, &dist )) {
break;
+ }
point0 = GetTrkEndPos( trk1, ep1 );
angle0 = NormalizeAngle(GetTrkEndAngle(trk1,ep1)+180.0);
trk2 = NULL;
@@ -294,7 +309,8 @@ PTRACE(( " a2=%0.1f rA1=%0.1f\n", angle2, reverseA1 ))
ep2b = 0;
break;
case SEG_CRVTRK:
- trk2b = NewCurvedTrack( segP->u.c.center, fabs(segP->u.c.radius), segP->u.c.a0, segP->u.c.a1, 0 );
+ trk2b = NewCurvedTrack( segP->u.c.center, fabs(segP->u.c.radius), segP->u.c.a0,
+ segP->u.c.a1, 0 );
ep2b = (right?0:1);
}
if (trk2 == NULL) {
@@ -308,11 +324,13 @@ PTRACE(( " a2=%0.1f rA1=%0.1f\n", angle2, reverseA1 ))
}
*trkpp = NULL;
dist = trackGauge*2.0;
- if (!RemoveTrack( &trk2, &ep2, &dist ))
+ if (!RemoveTrack( &trk2, &ep2, &dist )) {
break;
+ }
trk = NewHandLaidTurnout( pointP, pointA,
- point0, angle0,
- GetTrkEndPos(trk2,ep2), NormalizeAngle(GetTrkEndAngle(trk2,ep2)+180.0), Dhlt.frogA );
+ point0, angle0,
+ GetTrkEndPos(trk2,ep2), NormalizeAngle(GetTrkEndAngle(trk2,ep2)+180.0),
+ Dhlt.frogA );
DrawEndPt( &mainD, trk1, ep1, wDrawColorWhite );
if ( pointT ) {
DrawEndPt( &mainD, pointT, pointEp0, wDrawColorWhite );
@@ -327,18 +345,22 @@ PTRACE(( " a2=%0.1f rA1=%0.1f\n", angle2, reverseA1 ))
DrawTrack( pointT, &mainD, wDrawColorBlack );
}
DrawTrack( trk, &mainD, wDrawColorBlack );
- for (trkpp=trks; *trkpp; trkpp++)
+ for (trkpp=trks; *trkpp; trkpp++) {
DrawTrack( *trkpp, &mainD, wDrawColorBlack );
-
+ }
+
Dhlt.state = 0;
return C_TERMINATE;
}
case C_REDRAW:
- if (Dhlt.state >= 1)
+ if (Dhlt.state >= 1) {
DrawLine( &tempD, Dhlt.reverseP, Dhlt.reverseP1, 0, wDrawColorBlack );
- if (Dhlt.state >= 2)
- DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack );
+ }
+ if (Dhlt.state >= 2) {
+ DrawSegsDA( &tempD, NULL, zero, 0.0, &tempSegs_da, trackGauge, wDrawColorBlack,
+ 0 );
+ }
return C_CONTINUE;
case C_CANCEL:
@@ -351,9 +373,11 @@ PTRACE(( " a2=%0.1f rA1=%0.1f\n", angle2, reverseA1 ))
}
-#include "bitmaps/hndldto.xpm"
+#include "bitmaps/turnout-design.xpm3"
EXPORT void InitCmdHandLaidTurnout( wMenu_p menu )
{
- AddMenuButton( menu, CmdHandLaidTurnout, "cmdHandLaidTurnout", _("HandLaidTurnout"), wIconCreatePixMap(hndldto_xpm), LEVEL0_50, IC_STICKY|IC_INITNOTSTICKY|IC_POPUP2, ACCL_HNDLDTO, NULL );
+ AddMenuButton( menu, CmdHandLaidTurnout, "cmdHandLaidTurnout",
+ _("HandLaidTurnout"), wIconCreatePixMap(turnout_design_xpm3[iconSize]),
+ LEVEL0_50, IC_STICKY|IC_INITNOTSTICKY|IC_POPUP2, ACCL_HNDLDTO, NULL );
}