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();  | 
