summaryrefslogtreecommitdiff
path: root/app/bin/ccurve.c
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2025-09-20 19:19:34 +0200
committerJörg Frings-Fürst <debian@jff-webhosting.net>2025-09-20 19:19:34 +0200
commite7d20cf352688bf717a01f4e6d9e6f497c2bea4c (patch)
treecfd2ef9b569f49af985a6f1ec44f2614f63c8e78 /app/bin/ccurve.c
parenta14a7a0ccc9de76aeab0b2e4bbf58f1a79deedc2 (diff)
New upstream version 5.3.1Beta2upstream/5.3.1Beta2
Diffstat (limited to 'app/bin/ccurve.c')
-rw-r--r--app/bin/ccurve.c130
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();