diff options
Diffstat (limited to 'app/bin/ccurve.c')
| -rw-r--r-- | app/bin/ccurve.c | 130 |
1 files changed, 68 insertions, 62 deletions
diff --git a/app/bin/ccurve.c b/app/bin/ccurve.c index 373a975..de34aea 100644 --- a/app/bin/ccurve.c +++ b/app/bin/ccurve.c @@ -695,12 +695,17 @@ static STATUS_T CmdCurve( wAction_t action, coOrd pos ) static DIST_T circleRadius = 18.0; -static long helixTurns = 5; -static ANGLE_T helixAngSep = 0.0; -static DIST_T helixElev = 0.0; -static DIST_T helixRadius = 18.0; -static DIST_T helixGrade = 0.0; -static DIST_T helixVertSep = 0.0; +struct helixData_s { + long turns; + ANGLE_T angSep; + DIST_T elev; + DIST_T radius; + DIST_T grade; + DIST_T vertSep; +}; +struct helixData_s helixDataCur = { 5, 0.0, 0.0, 18.0, 0.0, 0.0 }; +struct helixData_s helixDataOld = { 5, 0.0, 0.0, 18.0, 0.0, 0.0 }; + static DIST_T origVertSep = 0.0; static wWin_p helixW; #define H_ELEV (0) @@ -723,12 +728,12 @@ static paramFloatRange_t r1_10000 = { 1, 10000 }; static paramFloatRange_t r0_100= { 0, 100 }; static paramData_t helixPLs[] = { - { PD_FLOAT, &helixElev, "elev", PDO_DIM, &r0_1000000, N_("Elevation Difference") }, - { PD_FLOAT, &helixRadius, "radius", PDO_DIM, &r1_10000, N_("Radius") }, - { PD_LONG, &helixTurns, "turns", 0, &i1_1000000, N_("Turns") }, - { PD_FLOAT, &helixAngSep, "angSep", 0, &r0_360, N_("Angular Separation") }, - { PD_FLOAT, &helixGrade, "grade", 0, &r0_100, N_("Grade") }, - { PD_FLOAT, &helixVertSep, "vertSep", PDO_DIM, &r0_1000000, N_("Vertical Separation") }, + { PD_FLOAT, &helixDataCur.elev, "elev", PDO_DIM, &r0_1000000, N_("Elevation Difference") }, + { PD_FLOAT, &helixDataCur.radius, "radius", PDO_DIM, &r1_10000, N_("Radius") }, + { PD_LONG, &helixDataCur.turns, "turns", 0, &i1_1000000, N_("Turns") }, + { PD_FLOAT, &helixDataCur.angSep, "angSep", 0, &r0_360, N_("Angular Separation") }, + { PD_FLOAT, &helixDataCur.grade, "grade", 0, &r0_100, N_("Grade") }, + { PD_FLOAT, &helixDataCur.vertSep, "vertSep", PDO_DIM, &r0_1000000, N_("Vertical Separation") }, #define I_HELIXMSG (6) { PD_MESSAGE, N_("Total Length"), NULL, PDO_DLGRESETMARGIN, I2VP(200) } }; @@ -752,35 +757,37 @@ static void ComputeHelix( return; } ParamLoadData( &helixPG ); - totTurns = helixTurns + helixAngSep/360.0; - length = totTurns * helixRadius * (2 * M_PI); + totTurns = helixDataCur.turns + helixDataCur.angSep/360.0; + length = totTurns * helixDataCur.radius * (2 * M_PI); h_orders[h_inx] = ++h_clock; switch ( h_inx ) { case H_ELEV: if (h_orders[H_TURNS]<h_orders[H_VERTSEP] && origVertSep > 0.0) { - helixTurns = (int)floor(helixElev/origVertSep - helixAngSep/360.0); - totTurns = helixTurns + helixAngSep/360.0; + helixDataCur.turns = (int)floor(helixDataCur.elev/origVertSep - + helixDataCur.angSep/360.0); + totTurns = helixDataCur.turns + helixDataCur.angSep/360.0; updates |= (1<<H_TURNS); } if (totTurns > 0) { - helixVertSep = helixElev/totTurns; + helixDataCur.vertSep = helixDataCur.elev/totTurns; updates |= (1<<H_VERTSEP); } break; case H_TURNS: case H_ANGSEP: - helixVertSep = helixElev/totTurns; + helixDataCur.vertSep = helixDataCur.elev/totTurns; updates |= (1<<H_VERTSEP); break; case H_VERTSEP: - if (helixVertSep > 0.0) { - origVertSep = helixVertSep; - helixTurns = (int)floor(helixElev/origVertSep - helixAngSep/360.0); + if (helixDataCur.vertSep > 0.0) { + origVertSep = helixDataCur.vertSep; + helixDataCur.turns = (int)floor(helixDataCur.elev/origVertSep - + helixDataCur.angSep/360.0); updates |= (1<<H_TURNS); - totTurns = helixTurns + helixAngSep/360.0; + totTurns = helixDataCur.turns + helixDataCur.angSep/360.0; if (totTurns > 0) { - helixVertSep = helixElev/totTurns; + helixDataCur.vertSep = helixDataCur.elev/totTurns; updates |= (1<<H_VERTSEP); } } @@ -791,19 +798,21 @@ static void ComputeHelix( } if ( totTurns > 0.0 ) { if ( h_orders[H_RADIUS]>=h_orders[H_GRADE] || - (helixGrade==0.0 && totTurns>0 && helixRadius>0) ) { - if ( helixRadius > 0.0 ) { - helixGrade = helixElev/(totTurns*helixRadius*(2*M_PI))*100.0; + (helixDataCur.grade==0.0 && totTurns>0 && helixDataCur.radius>0) ) { + if ( helixDataCur.radius > 0.0 ) { + helixDataCur.grade = helixDataCur.elev/(totTurns*helixDataCur.radius* + (2*M_PI))*100.0; updates |= (1<<H_GRADE); } } else { - if( helixGrade > 0.0 ) { - helixRadius = helixElev/(totTurns*(helixGrade/100.0)*2.0*M_PI); + if( helixDataCur.grade > 0.0 ) { + helixDataCur.radius = helixDataCur.elev/(totTurns*(helixDataCur.grade/100.0) + *2.0*M_PI); updates |= (1<<H_RADIUS); } } } - length = totTurns * helixRadius * (2 * M_PI); + length = totTurns * helixDataCur.radius * (2 * M_PI); for ( h_inx=0; updates; h_inx++,updates>>=1 ) { if ( (updates&1) ) { ParamLoadControl( &helixPG, h_inx ); @@ -818,12 +827,6 @@ static void ComputeHelix( } -static void HelixCancel( wWin_p win ) -{ - wHide( helixW ); -} - - static void ChangeHelixW( long changes ) { if ( (changes & CHANGE_UNITS) && @@ -850,8 +853,9 @@ static STATUS_T CmdCircleCommon( wAction_t action, coOrd pos, BOOL_T helix ) if (helix) { if (helixW == NULL) { helixW = ParamCreateDialog(&helixPG, MakeWindowTitle(_("Helix")), NULL, NULL, - HelixCancel, TRUE, NULL, 0, ComputeHelix); + ParamCancel_Current, TRUE, NULL, 0, ComputeHelix); } + helixDataCur = helixDataOld; ParamLoadControls(&helixPG); ParamGroupRecord(&helixPG); ComputeHelix(NULL, 6, NULL); @@ -884,15 +888,16 @@ static STATUS_T CmdCircleCommon( wAction_t action, coOrd pos, BOOL_T helix ) case C_DOWN: if (helix) { - if (helixRadius <= 0.0) { + if (helixDataCur.radius <= 0.0) { ErrorMessage(MSG_RADIUS_GTR_0); return C_ERROR; } - if (helixTurns <= 0) { + if (helixDataCur.turns <= 0) { ErrorMessage(MSG_HELIX_TURNS_GTR_0); return C_ERROR; } ParamLoadData(&helixPG); + helixDataOld = helixDataCur; } else { ParamLoadData(&circleRadiusPG); switch (circleMode) { @@ -939,23 +944,24 @@ static STATUS_T CmdCircleCommon( wAction_t action, coOrd pos, BOOL_T helix ) } tempSegs(0).color = wDrawColorBlack; tempSegs(0).lineWidth = 0; - tempSegs(0).u.c.radius = helix ? helixRadius : circleRadius; + tempSegs(0).u.c.radius = helix ? helixDataCur.radius : circleRadius; tempSegs(0).u.c.a0 = 0.0; tempSegs(0).u.c.a1 = 360.0; return C_CONTINUE; case C_UP: if (helix) { - if (helixRadius > mapD.size.x || helixRadius > mapD.size.y) { + if (helixDataCur.radius > mapD.size.x || helixDataCur.radius > mapD.size.y) { ErrorMessage(MSG_RADIUS_TOO_BIG); return C_ERROR; } - if (helixRadius > 10000) { + if (helixDataCur.radius > 10000) { ErrorMessage(MSG_RADIUS_GTR_10000); return C_ERROR; } UndoStart(_("Create Helix Track"), "newHelix"); - t = NewCurvedTrack(tempSegs(0).u.c.center, helixRadius, 0.0, 0.0, helixTurns); + t = NewCurvedTrack(tempSegs(0).u.c.center, helixDataCur.radius, 0.0, 0.0, + helixDataCur.turns); } else { if (circleRadius > mapD.size.x || circleRadius > mapD.size.y) { ErrorMessage(MSG_RADIUS_TOO_BIG); @@ -965,7 +971,7 @@ static STATUS_T CmdCircleCommon( wAction_t action, coOrd pos, BOOL_T helix ) ErrorMessage(MSG_RADIUS_GTR_0); return C_ERROR; } - if ((circleRadius > 100000) || (helixRadius > 10000)) { + if ((circleRadius > 100000) || (helixDataCur.radius > 10000)) { ErrorMessage(MSG_RADIUS_GTR_10000); return C_ERROR; } @@ -1015,49 +1021,49 @@ static STATUS_T CmdHelix( wAction_t action, coOrd pos ) return CmdCircleCommon( action, pos, TRUE ); } -#include "bitmaps/curved-end.xpm3" -#include "bitmaps/curved-tangent.xpm3" -#include "bitmaps/curved-middle.xpm3" -#include "bitmaps/curved-chord.xpm3" -#include "bitmaps/bezier-track.xpm3" -#include "bitmaps/cornu.xpm3" -#include "bitmaps/circle.xpm3" -#include "bitmaps/circle-tangent.xpm3" -#include "bitmaps/circle-center.xpm3" -// #include "bitmaps/helix.xpm" +#include "bitmaps/curved-end.image3" +#include "bitmaps/curved-tangent.image3" +#include "bitmaps/curved-middle.image3" +#include "bitmaps/curved-chord.image3" +#include "bitmaps/bezier-track.image3" +#include "bitmaps/cornu.image3" +#include "bitmaps/circle.image3" +#include "bitmaps/circle-tangent.image3" +#include "bitmaps/circle-center.image3" EXPORT void InitCmdCurve( wMenu_p menu ) { ButtonGroupBegin( _("Curve Track"), "cmdCurveSetCmd", _("Curve Tracks") ); AddMenuButton( menu, CmdCurve, "cmdCurveEndPt", _("Curve from End-Pt"), - wIconCreatePixMap( curved_end_xpm3[iconSize] ), LEVEL0_50, + wIconCreatePixMap( curved_end_image3[iconSize] ), LEVEL0_50, IC_STICKY|IC_POPUP2|IC_WANT_MOVE, ACCL_CURVE1, I2VP(0) ); AddMenuButton( menu, CmdCurve, "cmdCurveTangent", _("Curve from Tangent"), - wIconCreatePixMap( curved_tangent_xpm3[iconSize] ), LEVEL0_50, + wIconCreatePixMap( curved_tangent_image3[iconSize] ), LEVEL0_50, IC_STICKY|IC_POPUP2|IC_WANT_MOVE, ACCL_CURVE2, I2VP(1) ); AddMenuButton( menu, CmdCurve, "cmdCurveCenter", _("Curve from Center"), - wIconCreatePixMap( curved_middle_xpm3[iconSize] ), LEVEL0_50, + wIconCreatePixMap( curved_middle_image3[iconSize] ), LEVEL0_50, IC_STICKY|IC_POPUP2|IC_WANT_MOVE, ACCL_CURVE3, I2VP(2) ); AddMenuButton( menu, CmdCurve, "cmdCurveChord", _("Curve from Chord"), - wIconCreatePixMap( curved_chord_xpm3[iconSize] ), LEVEL0_50, + wIconCreatePixMap( curved_chord_image3[iconSize] ), LEVEL0_50, IC_STICKY|IC_POPUP2|IC_WANT_MOVE, ACCL_CURVE4, I2VP(3) ); AddMenuButton( menu, CmdBezCurve, "cmdBezier", _("Bezier Curve"), - wIconCreatePixMap( bezier_track_xpm3[iconSize] ), LEVEL0_50, + wIconCreatePixMap( bezier_track_image3[iconSize] ), LEVEL0_50, IC_STICKY|IC_POPUP2|IC_WANT_MOVE, ACCL_BEZIER, I2VP(bezCmdCreateTrack) ); AddMenuButton( menu, CmdCornu, "cmdCornu", _("Cornu Curve"), - wIconCreatePixMap( cornu_xpm3[iconSize] ), LEVEL0_50, + wIconCreatePixMap( cornu_image3[iconSize] ), LEVEL0_50, IC_STICKY|IC_POPUP2|IC_WANT_MOVE, ACCL_CORNU, I2VP(cornuCmdCreateTrack)); ButtonGroupEnd(); ButtonGroupBegin( _("Circle Track"), "cmdCircleSetCmd", _("Circle Tracks") ); AddMenuButton( menu, CmdCircle, "cmdCircleFixedRadius", - _("Fixed Radius Circle"), wIconCreatePixMap( circle_xpm3[iconSize] ), LEVEL0_50, + _("Fixed Radius Circle"), wIconCreatePixMap( circle_image3[iconSize] ), + LEVEL0_50, IC_STICKY|IC_POPUP2, ACCL_CIRCLE1, I2VP(0) ); AddMenuButton( menu, CmdCircle, "cmdCircleTangent", _("Circle from Tangent"), - wIconCreatePixMap( circle_tangent_xpm3[iconSize] ), LEVEL0_50, + wIconCreatePixMap( circle_tangent_image3[iconSize] ), LEVEL0_50, IC_STICKY|IC_POPUP2, ACCL_CIRCLE2, I2VP(1) ); AddMenuButton( menu, CmdCircle, "cmdCircleCenter", _("Circle from Center"), - wIconCreatePixMap( circle_center_xpm3[iconSize] ), LEVEL0_50, + wIconCreatePixMap( circle_center_image3[iconSize] ), LEVEL0_50, IC_STICKY|IC_POPUP2, ACCL_CIRCLE3, I2VP(2) ); ButtonGroupEnd(); |
