summaryrefslogtreecommitdiff
path: root/app/bin/cmodify.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/cmodify.c')
-rw-r--r--app/bin/cmodify.c585
1 files changed, 325 insertions, 260 deletions
diff --git a/app/bin/cmodify.c b/app/bin/cmodify.c
index 1e66e74..491aae3 100644
--- a/app/bin/cmodify.c
+++ b/app/bin/cmodify.c
@@ -17,7 +17,7 @@
*
* 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 "cjoin.h"
@@ -34,25 +34,24 @@
#include "layout.h"
#include "cselect.h"
#include "common-ui.h"
+#include "draw.h"
+
+EXPORT wIndex_t modifyCmdInx;
static struct {
- track_p Trk;
- trackParams_t params;
- coOrd pos00, pos00x, pos01;
- ANGLE_T angle;
- curveData_t curveData;
- easementData_t jointD;
- DIST_T r1;
- BOOL_T valid;
- BOOL_T first;
- } Dex;
+ track_p Trk;
+ trackParams_t params;
+ coOrd pos00, pos00x, pos01;
+ ANGLE_T angle;
+ curveData_t curveData;
+ easementData_t jointD;
+ DIST_T r1;
+ BOOL_T valid;
+ BOOL_T first;
+} Dex;
static wMenu_p modPopupM;
-extern wIndex_t selectCmdInx;
-extern wIndex_t joinCmdInx;
-extern wIndex_t describeCmdInx;
-
static dynArr_t anchors_da;
#define anchors(N) DYNARR_N(trkSeg_t,anchors_da,N)
@@ -65,7 +64,8 @@ static BOOL_T modifyProtractorMode;
static BOOL_T modifyExtendMode;
-static void CreateEndAnchor(coOrd p, wBool_t lock) {
+static void CreateEndAnchor(coOrd p, wBool_t lock)
+{
DIST_T d = tempD.scale*0.15;
DYNARR_APPEND(trkSeg_t,anchors_da,1);
@@ -76,11 +76,12 @@ static void CreateEndAnchor(coOrd p, wBool_t lock) {
anchors(i).u.c.radius = d/2;
anchors(i).u.c.a0 = 0.0;
anchors(i).u.c.a1 = 360.0;
- anchors(i).width = 0;
+ anchors(i).lineWidth = 0;
wSetCursor(mainD.d,wCursorNone);
}
-static void CreateCornuAnchor(coOrd p, wBool_t lock) {
+static void CreateCornuAnchor(coOrd p, wBool_t lock)
+{
DIST_T d = tempD.scale*0.15;
DYNARR_APPEND(trkSeg_t,anchors_da,1);
@@ -91,7 +92,7 @@ static void CreateCornuAnchor(coOrd p, wBool_t lock) {
anchors(i).u.c.radius = d/2;
anchors(i).u.c.a0 = 0.0;
anchors(i).u.c.a1 = 360.0;
- anchors(i).width = 0;
+ anchors(i).lineWidth = 0;
DYNARR_APPEND(trkSeg_t,anchors_da,1);
i = anchors_da.cnt-1;
anchors(i).type = SEG_CRVLIN;
@@ -100,42 +101,45 @@ static void CreateCornuAnchor(coOrd p, wBool_t lock) {
anchors(i).u.c.radius = d;
anchors(i).u.c.a0 = 0.0;
anchors(i).u.c.a1 = 360.0;
- anchors(i).width = 0;
+ anchors(i).lineWidth = 0;
wSetCursor(mainD.d,wCursorNone);
}
-static void CreateRadiusAnchor(coOrd p, ANGLE_T a, BOOL_T bi) {
+static void CreateRadiusAnchor(coOrd p, ANGLE_T a, BOOL_T bi)
+{
DYNARR_SET(trkSeg_t,anchors_da,anchors_da.cnt+5);
- DrawArrowHeads(&DYNARR_N(trkSeg_t,anchors_da,anchors_da.cnt-5),p,a,bi,wDrawColorBlue);
+ DrawArrowHeads(&DYNARR_N(trkSeg_t,anchors_da,anchors_da.cnt-5),p,a,bi,
+ wDrawColorBlue);
}
/*
* Call cbezier.c CmdBezModify to alter Bezier Track and Lines.
* Picking a Bezier will allow control point(s) modifications until terminated with "Enter"
*/
-static STATUS_T ModifyBezier(wAction_t action, coOrd pos) {
+static STATUS_T ModifyBezier(wAction_t action, coOrd pos)
+{
STATUS_T rc = C_CONTINUE;
- if (Dex.Trk == NULL) return C_ERROR; //No track picked yet!
+ if (Dex.Trk == NULL) { return C_ERROR; } //No track picked yet!
switch (action&0xFF) {
- case C_START:
- case C_DOWN:
- case C_MOVE:
- case C_UP:
- case C_OK:
- case C_TEXT:
- case wActionMove:
- trackGauge = (IsTrack(Dex.Trk)?GetTrkGauge(Dex.Trk):0.0);
- rc = CmdBezModify(Dex.Trk, action, pos, trackGauge);
- break;
- case C_TERMINATE:
- rc = CmdBezModify(Dex.Trk, action, pos, trackGauge);
- Dex.Trk = NULL;
- modifyBezierMode = FALSE;
- break;
- case C_REDRAW:
- rc = CmdBezModify(Dex.Trk, action, pos, trackGauge);
- break;
+ case C_START:
+ case C_DOWN:
+ case C_MOVE:
+ case C_UP:
+ case C_OK:
+ case C_TEXT:
+ case wActionMove:
+ trackGauge = (IsTrack(Dex.Trk)?GetTrkGauge(Dex.Trk):0.0);
+ rc = CmdBezModify(Dex.Trk, action, pos, trackGauge);
+ break;
+ case C_TERMINATE:
+ rc = CmdBezModify(Dex.Trk, action, pos, trackGauge);
+ Dex.Trk = NULL;
+ modifyBezierMode = FALSE;
+ break;
+ case C_REDRAW:
+ rc = CmdBezModify(Dex.Trk, action, pos, trackGauge);
+ break;
}
return rc;
}
@@ -144,29 +148,30 @@ static STATUS_T ModifyBezier(wAction_t action, coOrd pos) {
* Call ccornu.c CmdCornuModify to alter Cornu Track and Lines.
* Picking a Cornu will allow end point(s) modifications until terminated with "Enter"
*/
-static STATUS_T ModifyCornu(wAction_t action, coOrd pos) {
+static STATUS_T ModifyCornu(wAction_t action, coOrd pos)
+{
STATUS_T rc = C_CONTINUE;
- if (Dex.Trk == NULL) return C_ERROR; //No track picked yet!
+ if (Dex.Trk == NULL) { return C_ERROR; } //No track picked yet!
switch (action&0xFF) {
- case C_LCLICK:
- case C_START:
- case C_DOWN:
- case C_MOVE:
- case C_UP:
- case C_OK:
- case C_TEXT:
- case wActionMove:
- trackGauge = (IsTrack(Dex.Trk)?GetTrkGauge(Dex.Trk):0.0);
- rc = CmdCornuModify(Dex.Trk, action, pos, trackGauge);
- break;
- case C_TERMINATE:
- rc = CmdCornuModify(Dex.Trk, action, pos, trackGauge);
- Dex.Trk = NULL;
- modifyCornuMode = FALSE;
- break;
- case C_REDRAW:
- rc = CmdCornuModify(Dex.Trk, action, pos, trackGauge);
- break;
+ case C_LCLICK:
+ case C_START:
+ case C_DOWN:
+ case C_MOVE:
+ case C_UP:
+ case C_OK:
+ case C_TEXT:
+ case wActionMove:
+ trackGauge = (IsTrack(Dex.Trk)?GetTrkGauge(Dex.Trk):0.0);
+ rc = CmdCornuModify(Dex.Trk, action, pos, trackGauge);
+ break;
+ case C_TERMINATE:
+ rc = CmdCornuModify(Dex.Trk, action, pos, trackGauge);
+ Dex.Trk = NULL;
+ modifyCornuMode = FALSE;
+ break;
+ case C_REDRAW:
+ rc = CmdCornuModify(Dex.Trk, action, pos, trackGauge);
+ break;
}
return rc;
}
@@ -174,64 +179,66 @@ static STATUS_T ModifyCornu(wAction_t action, coOrd pos) {
/*
* Picking a DRAW will allow point modifications until terminated with "Enter"/"Space"
*/
-static STATUS_T ModifyDraw(wAction_t action, coOrd pos) {
+static STATUS_T ModifyDraw(wAction_t action, coOrd pos)
+{
STATUS_T rc = C_CONTINUE;
- if (Dex.Trk == NULL) return C_ERROR; //No item picked yet!
+ if (Dex.Trk == NULL) { return C_ERROR; } //No item picked yet!
switch (action&0xFF) {
- case C_START:
- case C_DOWN:
- case C_MOVE:
- case C_UP:
- rc = ModifyTrack( Dex.Trk, action, pos );
- break;
- case wActionMove:
- rc = ModifyTrack( Dex.Trk, action, pos );
- break;
- case C_TEXT:
- //Delete or '0' - continues
- if ((action>>8 !=32) && (action >>8 !=13) && (action >>8 !=9))
- return ModifyTrack( Dex.Trk, action, pos );
- //Enter/Space/Tab does not
- if ((action>>8 !=32) && (action>>8 != 13) && (action>>8 != 9)) return C_CONTINUE;
- if (((action>>8) == 9 && (MyGetKeyState()&WKEY_SHIFT))) return C_TERMINATE;
- /*no break*/
- case C_OK:
- rc = ModifyTrack( Dex.Trk, C_OK, pos );
- if (rc != C_CONTINUE) modifyDrawMode = FALSE;
- UndoEnd();
- break;
- case C_CONFIRM:
- rc = ModifyTrack( Dex.Trk, action, pos );
- break;
- case C_CANCEL:
- case C_FINISH:
- case C_TERMINATE:
- rc = ModifyTrack( Dex.Trk, action, pos );
- Dex.Trk = NULL;
- modifyDrawMode = FALSE;
- tempSegs_da.cnt = 0;
- rc = C_CONTINUE;
- break;
- case C_REDRAW:
- rc = ModifyTrack( Dex.Trk, action, pos );
- break;
- case C_CMDMENU:
- menuPos = pos;
- rc = ModifyTrack( Dex.Trk, action, pos );
- break;
- case wActionExtKey:
- rc = ModifyTrack( Dex.Trk, action, pos );
- break;
- default:
- break;
+ case C_START:
+ case C_DOWN:
+ case C_MOVE:
+ case C_UP:
+ rc = ModifyTrack( Dex.Trk, action, pos );
+ break;
+ case wActionMove:
+ rc = ModifyTrack( Dex.Trk, action, pos );
+ break;
+ case C_TEXT:
+ //Delete or '0' - continues
+ if ((action>>8 !=32) && (action >>8 !=13) && (action >>8 !=9)) {
+ return ModifyTrack( Dex.Trk, action, pos );
+ }
+ //Enter/Space/Tab does not
+ if ((action>>8 !=32) && (action>>8 != 13) && (action>>8 != 9)) { return C_CONTINUE; }
+ if (((action>>8) == 9 && (MyGetKeyState()&WKEY_SHIFT))) { return C_TERMINATE; }
+ /*no break*/
+ case C_OK:
+ rc = ModifyTrack( Dex.Trk, C_OK, pos );
+ if (rc != C_CONTINUE) { modifyDrawMode = FALSE; }
+ UndoEnd();
+ break;
+ case C_CONFIRM:
+ rc = ModifyTrack( Dex.Trk, action, pos );
+ break;
+ case C_CANCEL:
+ case C_FINISH:
+ case C_TERMINATE:
+ rc = ModifyTrack( Dex.Trk, action, pos );
+ Dex.Trk = NULL;
+ modifyDrawMode = FALSE;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ rc = C_CONTINUE;
+ break;
+ case C_REDRAW:
+ rc = ModifyTrack( Dex.Trk, action, pos );
+ break;
+ case C_CMDMENU:
+ menuPos = pos;
+ rc = ModifyTrack( Dex.Trk, action, pos );
+ break;
+ case wActionExtKey:
+ rc = ModifyTrack( Dex.Trk, action, pos );
+ break;
+ default:
+ break;
}
return rc;
}
STATUS_T CmdModify(
- wAction_t action,
- coOrd pos )
+ wAction_t action,
+ coOrd pos )
/*
* Extend and alter a track.
* Extend a track with a curve or straight and optionally an easement.
@@ -253,19 +260,22 @@ STATUS_T CmdModify(
static DIST_T trackGauge;
if ( changeTrackMode ) {
- if ( action == C_MOVE )
+ if ( action == C_MOVE ) {
action = C_RMOVE;
- if ( action == C_UP )
+ }
+ if ( action == C_UP ) {
action = C_RUP;
+ }
}
switch (action&0xFF) {
case C_START:
DYNARR_RESET(trkSeg_t,anchors_da);
- InfoMessage( _("Select a track to modify, Left-Click change length, Right-Click to add flextrack") );
+ InfoMessage(
+ _("Select a track to modify, Left-Click change length, Right-Click to add flextrack") );
Dex.Trk = NULL;
- tempSegs_da.cnt = 0;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
/*ChangeParameter( &easementPD );*/
trackGauge = 0.0;
changeTrackMode = modifyRulerMode = FALSE;
@@ -281,21 +291,25 @@ STATUS_T CmdModify(
case C_DOWN:
case C_LDOUBLE:
DYNARR_RESET(trkSeg_t,anchors_da);
- if (modifyProtractorMode)
+ if (modifyProtractorMode) {
return ModifyProtractor(C_DOWN, pos);
- if (modifyBezierMode)
+ }
+ if (modifyBezierMode) {
return ModifyBezier(C_DOWN, pos);
- if (modifyCornuMode)
+ }
+ if (modifyCornuMode) {
return ModifyCornu(C_DOWN, pos);
- if (modifyDrawMode)
+ }
+ if (modifyDrawMode) {
return ModifyDraw(C_DOWN, pos);
+ }
DYNARR_SET( trkSeg_t, tempSegs_da, 2 );
tempSegs(0).color = wDrawColorBlack;
- tempSegs(0).width = 0;
+ tempSegs(0).lineWidth = 0;
tempSegs(1).color = wDrawColorBlack;
- tempSegs(1).width = 0;
- tempSegs_da.cnt = 0;
+ tempSegs(1).lineWidth = 0;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
Dex.Trk = OnTrack( &pos, FALSE, FALSE );
//Dex.Trk = trk;
if (Dex.Trk == NULL) {
@@ -320,7 +334,7 @@ STATUS_T CmdModify(
if (ModifyBezier(C_START, pos) != C_CONTINUE) { //Call Start with track
modifyBezierMode = FALSE; //Function rejected Bezier
Dex.Trk =NULL;
- tempSegs_da.cnt = 0;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
}
return C_CONTINUE; //That's it
}
@@ -329,7 +343,7 @@ STATUS_T CmdModify(
if (ModifyCornu(C_START, pos) != C_CONTINUE) { //Call Start with track
modifyCornuMode = FALSE; //Function rejected Cornu
Dex.Trk =NULL;
- tempSegs_da.cnt = 0;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
}
return C_CONTINUE; //That's it
@@ -340,32 +354,34 @@ STATUS_T CmdModify(
if (ModifyDraw(C_START, pos) != C_CONTINUE) {
modifyDrawMode = FALSE;
Dex.Trk = NULL;
- tempSegs_da.cnt = 0;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
}
return C_CONTINUE;
}
- if ((action&0xFF) == C_LDOUBLE) return C_ERROR;
+ if ((action&0xFF) == C_LDOUBLE) { return C_ERROR; }
- if ((MyGetKeyState()&WKEY_CTRL)) goto extendTrack;
+ if ((MyGetKeyState()&WKEY_CTRL)) { goto extendTrack; }
if ( (MyGetKeyState()&WKEY_SHIFT) && //Free to change radius
- QueryTrack( Dex.Trk, Q_CAN_MODIFYRADIUS )&&
- ((inx=PickUnconnectedEndPoint(pos,Dex.Trk)) >= 0 )) {
+ QueryTrack( Dex.Trk, Q_CAN_MODIFYRADIUS )&&
+ ((inx=PickUnconnectedEndPoint(pos,Dex.Trk)) >= 0 )) {
trk = Dex.Trk;
- while ( (trk1=GetTrkEndTrk(trk,1-inx)) && //Means next track to mine even if can be end...
- QueryTrack(trk1, Q_CANNOT_BE_ON_END) ) {
+ while ( (trk1=GetTrkEndTrk(trk,1-inx))
+ && //Means next track to mine even if can be end...
+ QueryTrack(trk1, Q_CANNOT_BE_ON_END) ) {
inx = GetEndPtConnectedToMe( trk1, trk );
trk = trk1;
}
if (trk1) {
- UndoStart( _("Change Track"), "Change( T%d[%d] )", GetTrkIndex(Dex.Trk), Dex.params.ep );
+ UndoStart( _("Change Track"), "Change( T%d[%d] )", GetTrkIndex(Dex.Trk),
+ Dex.params.ep );
inx = GetEndPtConnectedToMe( trk1, trk );
- Dex.Trk = NULL;
- UndrawNewTrack( trk );
- DeleteTrack(trk, TRUE); //Get rid of original track
+ Dex.Trk = NULL;
+ UndrawNewTrack( trk );
+ DeleteTrack(trk, TRUE); //Get rid of original track
if ( !GetTrkEndTrk( trk1, inx ) ) {
Dex.Trk = trk1;
Dex.pos00 = GetTrkEndPos( Dex.Trk, inx );
@@ -385,9 +401,9 @@ STATUS_T CmdModify(
case wActionMove:
DYNARR_RESET(trkSeg_t,anchors_da);
- if (modifyCornuMode) return ModifyCornu(wActionMove,pos);
- if (modifyDrawMode) return ModifyDraw(wActionMove,pos);
- if (modifyBezierMode) return ModifyBezier(wActionMove, pos);
+ if (modifyCornuMode) { return ModifyCornu(wActionMove,pos); }
+ if (modifyDrawMode) { return ModifyDraw(wActionMove,pos); }
+ if (modifyBezierMode) { return ModifyBezier(wActionMove, pos); }
track_p t;
wSetCursor(mainD.d,defaultCursor);
if (((t=OnTrack(&pos,FALSE,TRUE))!= NULL) && CheckTrackLayerSilent( t )) {
@@ -395,11 +411,12 @@ STATUS_T CmdModify(
if (QueryTrack( t, Q_IS_CORNU )) {
CreateCornuAnchor(pos,FALSE);
} else if ( QueryTrack( t, Q_CAN_MODIFY_CONTROL_POINTS )) {
- CreateRadiusAnchor(pos,NormalizeAngle(GetAngleAtPoint(t,pos,NULL,NULL)+90.0),TRUE);
+ CreateRadiusAnchor(pos,NormalizeAngle(GetAngleAtPoint(t,pos,NULL,NULL)+90.0),
+ TRUE);
CreateEndAnchor(pos,FALSE);
- } else if (QueryTrack(t,Q_CAN_ADD_ENDPOINTS)){ //Turntable
+ } else if (QueryTrack(t,Q_CAN_ADD_ENDPOINTS)) { //Turntable
trackParams_t tp;
- if (!GetTrackParams(PARAMS_CORNU, t, pos, &tp)) return C_CONTINUE;
+ if (!GetTrackParams(PARAMS_CORNU, t, pos, &tp)) { return C_CONTINUE; }
ANGLE_T a = tp.angle;
Translate(&pos,tp.ttcenter,a,tp.ttradius);
CreateRadiusAnchor(pos,a,FALSE);
@@ -414,15 +431,17 @@ STATUS_T CmdModify(
} else {
CreateEndAnchor(pos,FALSE);
if ((MyGetKeyState()&WKEY_SHIFT) && //Shift Down
- QueryTrack( t, Q_CAN_MODIFYRADIUS ) && // Straight or Curve
- ((inx=PickUnconnectedEndPointSilent(pos,t)) >= 0 )) { //Which has an open end
- if (GetTrkEndTrk(t,1-inx)) // Has to have a track on other end
- CreateRadiusAnchor(pos,NormalizeAngle(GetAngleAtPoint(t,pos,NULL,NULL)+90.0),TRUE);
+ QueryTrack( t, Q_CAN_MODIFYRADIUS ) && // Straight or Curve
+ ((inx=PickUnconnectedEndPointSilent(pos,t)) >= 0 )) { //Which has an open end
+ if (GetTrkEndTrk(t,1-inx)) { // Has to have a track on other end
+ CreateRadiusAnchor(pos,NormalizeAngle(GetAngleAtPoint(t,pos,NULL,NULL)+90.0),
+ TRUE);
+ }
}
CreateRadiusAnchor(pos,GetAngleAtPoint(t,pos,NULL,NULL),TRUE);
}
}
- } else if (ep>=0){ //Turnout
+ } else if (ep>=0) { //Turnout
pos = GetTrkEndPos(t, ep);
CreateEndAnchor(pos,TRUE);
if ( (MyGetKeyState()&WKEY_CTRL)) {
@@ -435,8 +454,8 @@ STATUS_T CmdModify(
}
}
} else if (((t=OnTrack(&pos,FALSE,FALSE))!= NULL)
- && (!(GetLayerFrozen(GetTrkLayer(t)) || GetLayerModule(GetTrkLayer(t))))
- && (QueryTrack(t, Q_IS_DRAW ) && !QueryTrack(t, Q_IS_TEXT)) ) {
+ && (!(GetLayerFrozen(GetTrkLayer(t)) || GetLayerModule(GetTrkLayer(t))))
+ && (QueryTrack(t, Q_IS_DRAW ) && !QueryTrack(t, Q_IS_TEXT)) ) {
CreateEndAnchor(pos,FALSE);
} else {
ModifyRuler (wActionMove, pos);
@@ -444,23 +463,29 @@ STATUS_T CmdModify(
return C_CONTINUE;
case C_MOVE:
- if ( modifyRulerMode )
+ if ( modifyRulerMode ) {
return ModifyRuler( C_MOVE, pos );
- if ( modifyProtractorMode )
+ }
+ if ( modifyProtractorMode ) {
return ModifyProtractor( C_MOVE, pos );
- if (Dex.Trk == NULL)
+ }
+ if (Dex.Trk == NULL) {
return C_CONTINUE;
- if ( modifyBezierMode )
+ }
+ if ( modifyBezierMode ) {
return ModifyBezier(C_MOVE, pos);
- if ( modifyCornuMode )
+ }
+ if ( modifyCornuMode ) {
return ModifyCornu(C_MOVE, pos);
- if ( modifyDrawMode)
+ }
+ if ( modifyDrawMode) {
return ModifyDraw(C_MOVE, pos);
- if (modifyExtendMode && (MyGetKeyState()&WKEY_CTRL))
+ }
+ if (modifyExtendMode && (MyGetKeyState()&WKEY_CTRL)) {
goto extendTrackMove;
- tempSegs_da.cnt = 0;
+ }
- if ((MyGetKeyState() & WKEY_ALT) == 0) SnapPos( &pos );
+ if ((MyGetKeyState() & WKEY_ALT) == 0) { SnapPos( &pos ); }
rc = ModifyTrack( Dex.Trk, C_MOVE, pos );
if ( rc != C_CONTINUE ) {
rc = C_CONTINUE;
@@ -470,28 +495,35 @@ STATUS_T CmdModify(
case C_UP:
DYNARR_RESET(trkSeg_t,anchors_da);
- if (Dex.Trk == NULL)
+ if (Dex.Trk == NULL) {
return C_CONTINUE;
- if ( modifyRulerMode )
+ }
+ if ( modifyRulerMode ) {
return ModifyRuler( C_MOVE, pos );
- if ( modifyProtractorMode)
+ }
+ if ( modifyProtractorMode) {
return ModifyProtractor( C_UP, pos);
- if ( modifyBezierMode )
+ }
+ if ( modifyBezierMode ) {
return ModifyBezier( C_UP, pos);
- if (modifyCornuMode)
+ }
+ if (modifyCornuMode) {
return ModifyCornu(C_UP, pos);
- if (modifyDrawMode)
+ }
+ if (modifyDrawMode) {
return ModifyDraw(C_UP, pos);
- if ((MyGetKeyState()&WKEY_CTRL)) goto extendTrackUp;
+ }
+ if ((MyGetKeyState()&WKEY_CTRL)) { goto extendTrackUp; }
- tempSegs_da.cnt = 0;
- if ((MyGetKeyState() & WKEY_ALT) == 0) SnapPos( &pos );
- UndoStart( _("Modify Track"), "Modify( T%d[%d] )", GetTrkIndex(Dex.Trk), Dex.params.ep );
+ if ((MyGetKeyState() & WKEY_ALT) == 0) { SnapPos( &pos ); }
+ UndoStart( _("Modify Track"), "Modify( T%d[%d] )", GetTrkIndex(Dex.Trk),
+ Dex.params.ep );
UndoModify( Dex.Trk );
rc = ModifyTrack( Dex.Trk, C_UP, pos );
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
UndoEnd();
- Dex.Trk = NULL;
+ Dex.Trk = NULL;
return rc;
case C_RDOWN: //This is same as context menu....
@@ -514,7 +546,7 @@ extendTrack:
}
trackGauge = GetTrkGauge( Dex.Trk );
Dex.pos00 = pos;
- CHANGE_TRACK:
+CHANGE_TRACK:
if (GetTrackParams( PARAMS_EXTEND, Dex.Trk, Dex.pos00, &Dex.params)) {
if (Dex.params.ep == -1) {
Dex.Trk = NULL;
@@ -527,8 +559,8 @@ extendTrack:
Dex.pos00 = GetTrkEndPos(Dex.Trk,Dex.params.ep);
Dex.angle = GetTrkEndAngle( Dex.Trk,Dex.params.ep);
Translate( &Dex.pos00x, Dex.pos00, Dex.angle, 10.0 );
- LOG( log_modify, 1, ("extend endPt[%d] = [%0.3f %0.3f] A%0.3f\n",
- Dex.params.ep, Dex.pos00.x, Dex.pos00.y, Dex.angle ) )
+ LOG( log_modify, 1, ("extend endPt[%d] = [%0.3f %0.3f] A%0.3f\n",
+ Dex.params.ep, Dex.pos00.x, Dex.pos00.y, Dex.angle ) )
InfoMessage( _("Drag to add flex track") );
} else {
return C_ERROR;
@@ -542,40 +574,47 @@ extendTrack:
InfoMessage ( _("No track selected"));
return C_ERROR;
}
- /* no break */
+ /* no break */
case C_RMOVE:
extendTrackMove:
DYNARR_RESET(trkSeg_t,anchors_da);
- tempSegs_da.cnt = 0;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
Dex.valid = FALSE;
- if (Dex.Trk == NULL) return C_CONTINUE;
- if ((MyGetKeyState() & WKEY_ALT) == 0) SnapPos( &pos );
- if ( Dex.first && FindDistance( pos, Dex.pos00 ) <= minLength )
+ if (Dex.Trk == NULL) { return C_CONTINUE; }
+ if ((MyGetKeyState() & WKEY_ALT) == 0) { SnapPos( &pos ); }
+ if ( Dex.first && FindDistance( pos, Dex.pos00 ) <= minLength ) {
return C_CONTINUE;
+ }
Dex.first = FALSE;
Dex.pos01 = Dex.pos00;
- if (Dex.params.type == curveTypeCornu) { //Always Restrict Cornu drag out to match end
+ if (Dex.params.type ==
+ curveTypeCornu) { //Always Restrict Cornu drag out to match end
ANGLE_T angle2 = NormalizeAngle(FindAngle(pos, Dex.pos00)-Dex.angle);
if (angle2 > 90.0 && angle2 < 270.0) {
if (Dex.params.cornuRadius[Dex.params.ep] == 0) {
Translate( &pos, Dex.pos00, Dex.angle, FindDistance( Dex.pos00, pos ) );
} else {
ANGLE_T angle = FindAngle(Dex.params.cornuCenter[Dex.params.ep],pos)-
- FindAngle(Dex.params.cornuCenter[Dex.params.ep],Dex.pos00);
+ FindAngle(Dex.params.cornuCenter[Dex.params.ep],Dex.pos00);
pos=Dex.pos00;
Rotate(&pos,Dex.params.cornuCenter[Dex.params.ep],angle);
}
- } else pos = Dex.pos00; //Only out from end
- PlotCurve( crvCmdFromCornu, Dex.pos00, Dex.pos00x, pos, &Dex.curveData, FALSE, 0.0 );
- } else
- PlotCurve( crvCmdFromEP1, Dex.pos00, Dex.pos00x, pos, &Dex.curveData, TRUE, 0.0 );
+ } else { pos = Dex.pos00; } //Only out from end
+ PlotCurve( crvCmdFromCornu, Dex.pos00, Dex.pos00x, pos, &Dex.curveData, FALSE,
+ 0.0 );
+ } else {
+ PlotCurve( crvCmdFromEP1, Dex.pos00, Dex.pos00x, pos, &Dex.curveData, TRUE,
+ 0.0 );
+ }
curveType = Dex.curveData.type;
if ( curveType == curveTypeStraight ) {
Dex.r1 = 0.0;
- if (Dex.params.type == curveTypeCurve) {
- if (ComputeJoint( Dex.params.arcR, Dex.r1, &Dex.jointD ) == E_ERROR)
+ if (Dex.params.type == curveTypeCurve &&
+ !QueryTrack( Dex.Trk, Q_IGNORE_EASEMENT_ON_EXTEND ) ) {
+ if (ComputeJoint( Dex.params.arcR, Dex.r1, &Dex.jointD ) == E_ERROR) {
return C_CONTINUE;
+ }
d = Dex.params.len - Dex.jointD.d0;
if (d <= minLength) {
ErrorMessage( MSG_TRK_TOO_SHORT, "First ", PutDim(fabs(minLength-d)) );
@@ -584,8 +623,9 @@ extendTrackMove:
} else {
Dex.jointD.d1 = 0.0;
}
+ DYNARR_SET( trkSeg_t, tempSegs_da, 1 );
tempSegs(0).type = SEG_STRTRK;
- tempSegs(0).width = 0;
+ tempSegs(0).lineWidth = 0;
tempSegs(0).u.l.pos[0] = Dex.pos01;
tempSegs(0).u.l.pos[1] = Dex.curveData.pos1;
d = FindDistance( Dex.pos01, Dex.curveData.pos1 );
@@ -594,50 +634,56 @@ extendTrackMove:
ErrorMessage( MSG_TRK_TOO_SHORT, "Extending ", PutDim(fabs(minLength-d)) );
return C_CONTINUE;
}
- tempSegs_da.cnt = 1;
Dex.valid = TRUE;
if (action != C_RDOWN)
InfoMessage( _("Straight Track: Length=%s Angle=%0.3f"),
- FormatDistance( FindDistance( Dex.curveData.pos1, Dex.pos01 ) ),
- PutAngle( FindAngle( Dex.pos01, Dex.curveData.pos1 ) ) );
+ FormatDistance( FindDistance( Dex.curveData.pos1, Dex.pos01 ) ),
+ PutAngle( FindAngle( Dex.pos01, Dex.curveData.pos1 ) ) );
} else if ( curveType == curveTypeNone ) {
- if (action != C_RDOWN)
+ if (action != C_RDOWN) {
InfoMessage( _("Back") );
+ }
return C_CONTINUE;
} else if ( curveType == curveTypeCurve ) {
Dex.r1 = Dex.curveData.curveRadius;
if ( QueryTrack( Dex.Trk, Q_IGNORE_EASEMENT_ON_EXTEND ) ) {
- /* Ignore easements when extending turnouts or turntables */
+ /* Ignore easements when extending turnouts or turntables */
Dex.jointD.x =
- Dex.jointD.r0 = Dex.jointD.r1 =
- Dex.jointD.l0 = Dex.jointD.l1 =
- Dex.jointD.d0 = Dex.jointD.d1 = 0.0;
+ Dex.jointD.r0 = Dex.jointD.r1 =
+ Dex.jointD.l0 = Dex.jointD.l1 =
+ Dex.jointD.d0 = Dex.jointD.d1 = 0.0;
Dex.jointD.flip = Dex.jointD.negate = Dex.jointD.Scurve = FALSE;
d = Dex.curveData.curveRadius * Dex.curveData.a1 * 2.0*M_PI/360.0;
} else { /* Easement code */
if (easementVal<0.0) { //Cornu Join - need to estimate a "good" easement length
d = Dex.curveData.curveRadius * Dex.curveData.a1 * 2.0*M_PI/360.0;
- Dex.jointD.d0 = Dex.jointD.d1 =0.75*72*12/GetTrkScale(Dex.Trk); //Easement 1.5 cars long to start
- if (Dex.jointD.d0>(GetTrkLength(Dex.Trk,0,1)/2))
+ Dex.jointD.d0 = Dex.jointD.d1 =0.75*72*12/GetTrkScale(
+ Dex.Trk); //Easement 1.5 cars long to start
+ if (Dex.jointD.d0>(GetTrkLength(Dex.Trk,0,1)/2)) {
Dex.jointD.d0 = GetTrkLength(Dex.Trk,0,1)/2;
- if (Dex.jointD.d1>d/2)
+ }
+ if (Dex.jointD.d1>d/2) {
Dex.jointD.d1 = d/2;
- Dex.jointD.negate = DifferenceBetweenAngles(Dex.angle,FindAngle(Dex.pos00,pos))<0.0;
+ }
+ Dex.jointD.negate = DifferenceBetweenAngles(Dex.angle,FindAngle(Dex.pos00,
+ pos))<0.0;
Dex.jointD.x = 2*trackGauge; //Signal an easement present to JoinTracks
} else {
if ( easeR > 0.0 && Dex.r1 < easeR ) {
ErrorMessage( MSG_RADIUS_LSS_EASE_MIN,
- FormatDistance( Dex.r1 ), FormatDistance( easeR ) );
+ FormatDistance( Dex.r1 ), FormatDistance( easeR ) );
return C_CONTINUE;
}
if ( Dex.r1*2.0*M_PI*Dex.curveData.a1/360.0 > mapD.size.x+mapD.size.y ) {
ErrorMessage( MSG_CURVE_TOO_LARGE );
return C_CONTINUE;
}
- if ( NormalizeAngle( FindAngle( Dex.pos00, pos ) - Dex.angle ) > 180.0 )
+ if ( NormalizeAngle( FindAngle( Dex.pos00, pos ) - Dex.angle ) > 180.0 ) {
Dex.r1 = - Dex.r1;
- if (ComputeJoint( Dex.params.arcR, Dex.r1, &Dex.jointD ) == E_ERROR)
+ }
+ if (ComputeJoint( Dex.params.arcR, Dex.r1, &Dex.jointD ) == E_ERROR) {
return C_CONTINUE;
+ }
d = Dex.params.len - Dex.jointD.d0;
if (d <= minLength) {
ErrorMessage( MSG_TRK_TOO_SHORT, "First ", PutDim(fabs(minLength-d)) );
@@ -648,34 +694,37 @@ extendTrackMove:
a0 = Dex.angle + (Dex.jointD.negate?-90.0:+90.0);
Translate( &Dex.pos01, Dex.pos00, a0, Dex.jointD.x );
Translate( &Dex.curveData.curvePos, Dex.curveData.curvePos,
- a0, Dex.jointD.x );
-LOG( log_modify, 2, ("A=%0.3f X=%0.3f\n", a0, Dex.jointD.x ) )
+ a0, Dex.jointD.x );
+ LOG( log_modify, 2, ("A=%0.3f X=%0.3f\n", a0, Dex.jointD.x ) )
}
if (d <= minLength) {
ErrorMessage( MSG_TRK_TOO_SHORT, "Extending ", PutDim(fabs(minLength-d)) );
return C_CONTINUE;
}
+ DYNARR_SET( trkSeg_t, tempSegs_da, 1 );
tempSegs(0).type = SEG_CRVTRK;
- tempSegs(0).width = 0;
+ tempSegs(0).lineWidth = 0;
tempSegs(0).u.c.center = Dex.curveData.curvePos;
tempSegs(0).u.c.radius = Dex.curveData.curveRadius,
- tempSegs(0).u.c.a0 = Dex.curveData.a0;
+ tempSegs(0).u.c.a0 = Dex.curveData.a0;
tempSegs(0).u.c.a1 = Dex.curveData.a1;
- tempSegs_da.cnt = 1;
double da = D2R(Dex.curveData.a1);
- if (da < 0.0)
+ if (da < 0.0) {
da = 2*M_PI + da;
- a = NormalizeAngle( Dex.angle - FindAngle( Dex.pos00, Dex.curveData.curvePos ) );
- if ( a < 180.0 )
+ }
+ a = NormalizeAngle( Dex.angle - FindAngle( Dex.pos00,
+ Dex.curveData.curvePos ) );
+ if ( a < 180.0 ) {
a = NormalizeAngle( Dex.curveData.a0-90 );
- else
+ } else {
a = NormalizeAngle( Dex.curveData.a0+Dex.curveData.a1+90.0 );
+ }
Dex.valid = TRUE;
if (action != C_RDOWN)
InfoMessage( _("Curve Track: Radius=%s Length=%s Angle=%0.3f"),
- FormatDistance( Dex.curveData.curveRadius ),
- FormatDistance( Dex.curveData.curveRadius * da),
- Dex.curveData.a1 );
+ FormatDistance( Dex.curveData.curveRadius ),
+ FormatDistance( Dex.curveData.curveRadius * da),
+ Dex.curveData.a1 );
}
return C_CONTINUE;
@@ -683,38 +732,41 @@ LOG( log_modify, 2, ("A=%0.3f X=%0.3f\n", a0, Dex.jointD.x ) )
extendTrackUp:
changeTrackMode = FALSE;
modifyExtendMode = FALSE;
- tempSegs_da.cnt = 0;
- if (Dex.Trk == NULL) return C_CONTINUE;
- if (!Dex.valid)
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ if (Dex.Trk == NULL) { return C_CONTINUE; }
+ if (!Dex.valid) {
return C_CONTINUE;
- UndoStart( _("Extend Track"), "Extend( T%d[%d] )", GetTrkIndex(Dex.Trk), Dex.params.ep );
+ }
+ UndoStart( _("Extend Track"), "Extend( T%d[%d] )", GetTrkIndex(Dex.Trk),
+ Dex.params.ep );
trk = NULL;
curveType = Dex.curveData.type;
-
+
if ( curveType == curveTypeStraight ) {
if (QueryTrack(Dex.Trk,Q_CAN_EXTEND)) //Check it isn't a turnout end....
if ( Dex.params.type == curveTypeStraight &&
- FindDistance(Dex.pos01, Dex.curveData.pos1) > 0 ) {
+ FindDistance(Dex.pos01, Dex.curveData.pos1) > 0 ) {
UndoModify( Dex.Trk );
AdjustStraightEndPt( Dex.Trk, Dex.params.ep, Dex.curveData.pos1 );
UndoEnd();
DrawNewTrack(Dex.Trk );
return C_TERMINATE;
- }
- if (FindDistance(Dex.pos01, Dex.curveData.pos1) == 0) return C_ERROR;
-LOG( log_modify, 1, ("L = %0.3f, P0 = %0.3f, P1 = %0.3f\n",
- Dex.params.len, Dex.pos01, Dex.curveData.pos1 ) )
+ }
+ if (FindDistance(Dex.pos01, Dex.curveData.pos1) == 0) { return C_ERROR; }
+ LOG( log_modify, 1, ("L = %0.3f, P0 = %0.3f, P1 = %0.3f\n",
+ Dex.params.len, Dex.pos01, Dex.curveData.pos1 ) )
trk = NewStraightTrack( Dex.pos01, Dex.curveData.pos1 );
inx = 0;
} else if ( curveType == curveTypeCurve ) {
-LOG( log_modify, 1, ("R = %0.3f, A0 = %0.3f, A1 = %0.3f\n",
- Dex.curveData.curveRadius, Dex.curveData.a0, Dex.curveData.a1 ) )
+ LOG( log_modify, 1, ("R = %0.3f, A0 = %0.3f, A1 = %0.3f\n",
+ Dex.curveData.curveRadius, Dex.curveData.a0, Dex.curveData.a1 ) )
trk = NewCurvedTrack( Dex.curveData.curvePos, Dex.curveData.curveRadius,
- Dex.curveData.a0, Dex.curveData.a1, 0 );
+ Dex.curveData.a0, Dex.curveData.a1, 0 );
inx = PickUnconnectedEndPoint( Dex.pos01, trk );
- if (inx == -1)
+ if (inx == -1) {
return C_ERROR;
+ }
} else {
return C_ERROR;
@@ -726,28 +778,30 @@ LOG( log_modify, 1, ("R = %0.3f, A0 = %0.3f, A1 = %0.3f\n",
DrawEndPt( &mainD, Dex.Trk, Dex.params.ep, wDrawColorBlack );
} else {
UndrawNewTrack( Dex.Trk );
- JoinTracks( Dex.Trk, Dex.params.ep, Dex.pos00, trk, inx, Dex.pos01, &Dex.jointD );
+ JoinTracks( Dex.Trk, Dex.params.ep, Dex.pos00, trk, inx, Dex.pos01,
+ &Dex.jointD );
DrawNewTrack( Dex.Trk );
}
UndoEnd();
- tempSegs_da.cnt = 0;
DrawNewTrack( trk );
return C_TERMINATE;
case C_REDRAW:
- if (modifyBezierMode) return ModifyBezier(C_REDRAW, pos);
- if (modifyCornuMode) return ModifyCornu(C_REDRAW, pos);
- if (modifyDrawMode) return ModifyDraw(C_REDRAW, pos);
- DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge, wDrawColorBlack );
- if (anchors_da.cnt)
- DrawSegs( &tempD, zero, 0.0, &anchors(0), anchors_da.cnt, trackGauge, wDrawColorBlack );
+ if (modifyBezierMode) { return ModifyBezier(C_REDRAW, pos); }
+ if (modifyCornuMode) { return ModifyCornu(C_REDRAW, pos); }
+ if (modifyDrawMode) { return ModifyDraw(C_REDRAW, pos); }
+ DrawSegsDA( &tempD, NULL, zero, 0.0, &tempSegs_da, trackGauge, wDrawColorBlack,
+ 0 );
+ DrawSegsDA( &tempD, NULL, zero, 0.0, &anchors_da, trackGauge, wDrawColorBlack,
+ 0 );
return C_CONTINUE;
case C_TEXT:
if ((action>>8) == 'c') {
panCenter = pos;
- LOG( log_pan, 2, ( "PanCenter:Mod-%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
+ LOG( log_pan, 2, ( "PanCenter:Mod-%d %0.3f %0.3f\n", __LINE__, panCenter.x,
+ panCenter.y ) );
PanHere(I2VP(0));
return C_CONTINUE;
}
@@ -760,14 +814,18 @@ LOG( log_modify, 1, ("R = %0.3f, A0 = %0.3f, A1 = %0.3f\n",
if ((action>>8) == '0' || (action>>8 == 'o')) {
PanMenuEnter(I2VP('o'));
}
- if ( !Dex.Trk )
+ if ( !Dex.Trk ) {
return C_CONTINUE;
- if (modifyBezierMode)
+ }
+ if (modifyBezierMode) {
return ModifyBezier(action, pos);
- if (modifyCornuMode)
+ }
+ if (modifyCornuMode) {
return ModifyCornu(action, pos);
- if (modifyDrawMode)
+ }
+ if (modifyDrawMode) {
return ModifyDraw(action, pos);
+ }
return ModifyTrack( Dex.Trk, action, pos );
case C_CMDMENU:
@@ -776,29 +834,35 @@ LOG( log_modify, 1, ("R = %0.3f, A0 = %0.3f, A1 = %0.3f\n",
wMenuPopupShow(modPopupM);
return C_CONTINUE;
}
- if (modifyBezierMode)
+ if (modifyBezierMode) {
return ModifyBezier(action, pos);
- if (modifyCornuMode)
+ }
+ if (modifyCornuMode) {
return ModifyCornu(action, pos);
- if (modifyDrawMode)
+ }
+ if (modifyDrawMode) {
return ModifyDraw(action, pos);
+ }
return ModifyTrack( Dex.Trk, action, pos );
case C_LCLICK:
if ( modifyDrawMode) {
rc = ModifyDraw(C_DOWN, pos);
- if (rc == C_CONTINUE)
+ if (rc == C_CONTINUE) {
return ModifyDraw(C_UP, pos);
+ }
}
- if (modifyCornuMode)
+ if (modifyCornuMode) {
return ModifyCornu(action, pos);
- /*no break*/
+ }
+ /*no break*/
default:
- if (modifyBezierMode) return ModifyBezier(action, pos);
- if (modifyCornuMode) return ModifyCornu(action, pos);
- if (modifyDrawMode) return ModifyDraw(action, pos);
- if (Dex.Trk)
+ if (modifyBezierMode) { return ModifyBezier(action, pos); }
+ if (modifyCornuMode) { return ModifyCornu(action, pos); }
+ if (modifyDrawMode) { return ModifyDraw(action, pos); }
+ if (Dex.Trk) {
return ModifyTrack( Dex.Trk, action, pos );
+ }
return C_CONTINUE;
}
return C_CONTINUE;
@@ -811,21 +875,22 @@ LOG( log_modify, 1, ("R = %0.3f, A0 = %0.3f, A1 = %0.3f\n",
*
*/
-#include "bitmaps/extend.xpm"
-extern wIndex_t panCmdInx;
-extern wIndex_t selectCmdInx;
-extern wIndex_t describeCmdInx;
-
+#include "bitmaps/extend.xpm3"
void InitCmdModify( wMenu_p menu )
{
- modifyCmdInx = AddMenuButton( menu, CmdModify, "cmdModify", _("Modify"), wIconCreatePixMap(extend_xpm[iconSize]), LEVEL0_50, IC_STICKY|IC_POPUP|IC_WANT_MOVE|IC_CMDMENU, ACCL_MODIFY, NULL );
+ modifyCmdInx = AddMenuButton( menu, CmdModify, "cmdModify", _("Modify"),
+ wIconCreatePixMap(extend_xpm3[iconSize]), LEVEL0_50,
+ IC_STICKY|IC_POPUP|IC_WANT_MOVE|IC_CMDMENU, ACCL_MODIFY, NULL );
/** @logcmd @showrefby modify=n cmodify.c Log Modify command */
log_modify = LogFindIndex( "modify" );
modPopupM = MenuRegister( "Modify Context Menu" );
- wMenuPushCreate(modPopupM, "cmdSelectMode", GetBalloonHelpStr("cmdSelectMode"), 0, DoCommandB, I2VP(selectCmdInx));
- wMenuPushCreate(modPopupM, "cmdDescribeMode", GetBalloonHelpStr("cmdDescribeMode"), 0, DoCommandB, I2VP(describeCmdInx));
- wMenuPushCreate(modPopupM, "cmdPanMode", GetBalloonHelpStr("cmdPanMode"), 0, DoCommandB, I2VP(panCmdInx));
+ wMenuPushCreate(modPopupM, "cmdSelectMode", GetBalloonHelpStr("cmdSelectMode"),
+ 0, DoCommandB, I2VP(selectCmdInx));
+ wMenuPushCreate(modPopupM, "cmdDescribeMode",
+ GetBalloonHelpStr("cmdDescribeMode"), 0, DoCommandB, I2VP(describeCmdInx));
+ wMenuPushCreate(modPopupM, "cmdPanMode", GetBalloonHelpStr("cmdPanMode"), 0,
+ DoCommandB, I2VP(panCmdInx));
wMenuSeparatorCreate(modPopupM);
wMenuPushCreate(modPopupM, "", _("Zoom In"), 0, DoZoomUp, I2VP(1));
wMenuPushCreate(modPopupM, "", _("Zoom Out"), 0, DoZoomDown, I2VP(1));