diff options
Diffstat (limited to 'app/bin/track.c')
| -rw-r--r-- | app/bin/track.c | 57 | 
1 files changed, 49 insertions, 8 deletions
| diff --git a/app/bin/track.c b/app/bin/track.c index 22af292..0660d7d 100644 --- a/app/bin/track.c +++ b/app/bin/track.c @@ -106,7 +106,7 @@ static int suspendElevUpdates = FALSE;  static track_p * importTrack; -EXPORT BOOL_T onTrackInSplit; +EXPORT BOOL_T onTrackInSplit = FALSE;  static BOOL_T inDrawTracks; @@ -650,8 +650,10 @@ EXPORT EPINX_T PickEndPoint( coOrd p, track_cp trk )  	coOrd pos;  	if (trk->endCnt <= 0)  		return -1; -	if ( onTrackInSplit && trk->endCnt > 2 ) -		return TurnoutPickEndPt( p, trk ); +	if ( onTrackInSplit && trk->endCnt > 2 ) { +		if (GetTrkType(trk) != T_TURNOUT) +			return TurnoutPickEndPt( p, trk ); +	}  	d = FindDistance( p, trk->endPt[0].pos );  	inx = 0;  	for ( i=1; i<trk->endCnt; i++ ) { @@ -721,6 +723,22 @@ EXPORT EPINX_T GetEndPtConnectedToMe( track_p trk, track_p me )  	return -1;  } +EXPORT EPINX_T GetNearestEndPtConnectedToMe( track_p trk, track_p me, coOrd pos) { +	EPINX_T ep, found = -1; +	DIST_T d = 10000; +	DIST_T dd; +		for (ep=0; ep<trk->endCnt; ep++) { +			if (trk->endPt[ep].track == me) { +				dd = FindDistance(pos,trk->endPt[ep].pos); +				if (dd<d) { +					found = ep; +					d = dd; +				} +			} +		} +		return found; +} +  EXPORT void SetEndPts( track_p trk, EPINX_T cnt )  { @@ -761,6 +779,8 @@ EXPORT void MoveTrack( track_p trk, coOrd orig )  EXPORT void RotateTrack( track_p trk, coOrd orig, ANGLE_T angle )  {  	EPINX_T ep; +	if ( trackCmds( trk->type )->rotate == NULL ) +			return;  	for (ep=0; ep<trk->endCnt; ep++) {  		Rotate( &trk->endPt[ep].pos, orig, angle );  		trk->endPt[ep].angle = NormalizeAngle( trk->endPt[ep].angle + angle ); @@ -772,7 +792,7 @@ EXPORT void RotateTrack( track_p trk, coOrd orig, ANGLE_T angle )  EXPORT void RescaleTrack( track_p trk, FLOAT_T ratio, coOrd shift )  {  	EPINX_T ep; -	if ( trackCmds( trk->type )->rotate == NULL ) +	if ( trackCmds( trk->type )->rescale == NULL )  		return;  	for (ep=0; ep<trk->endCnt; ep++) {  		trk->endPt[ep].pos.x *= ratio; @@ -872,6 +892,26 @@ EXPORT BOOL_T RebuildTrackSegs(  	return FALSE;  } +EXPORT BOOL_T ReplayTrackData( +		track_p trk, +		void * data, +		long length) +{ +	if (trackCmds(trk->type)->replayData) +			return trackCmds(trk->type)->replayData(trk,data,length); +		return FALSE; +} + +EXPORT BOOL_T StoreTrackData( +		track_p trk, +		void ** data, +		long * length) +{ +	if (trackCmds(trk->type)->storeData) +		return trackCmds(trk->type)->storeData(trk,data,length); +			return FALSE; +} +  /***************************************************************************** @@ -1676,8 +1716,8 @@ EXPORT void ConnectTracks( track_p trk0, EPINX_T inx0, track_p trk1, EPINX_T inx  LOG( log_track, 3, ( "ConnectTracks( T%d[%d] @ [%0.3f, %0.3f] = T%d[%d] @ [%0.3f %0.3f]\n", trk0->index, inx0, pos0.x, pos0.y, trk1->index, inx1, pos1.x, pos1.y ) )  	d = FindDistance( pos0, pos1 );  	a = NormalizeAngle( trk0->endPt[inx0].angle - -						trk1->endPt[inx1].angle + (180.0+connectAngle/2.0) ); -	if (d > connectDistance || a > connectAngle || logTable(log_endPt).level>=1) { +						trk1->endPt[inx1].angle + 180.0 ); +	if (d > connectDistance || (a > connectAngle && a < 360.0 - connectAngle) || (log_endPt>0 && logTable(log_endPt).level>=1)) {  #ifndef WINDOWS  		LogPrintf( "connectTracks: T%d[%d] T%d[%d] d=%0.3f a=%0.3f\n   %d ",  				trk0->index, inx0, trk1->index, inx1, d, a, trk0->index ); @@ -1688,7 +1728,8 @@ LOG( log_track, 3, ( "ConnectTracks( T%d[%d] @ [%0.3f, %0.3f] = T%d[%d] @ [%0.3f  		PrintEndPt( logFile, trk1, 1 );???*/  		LogPrintf("\n");  #endif -		NoticeMessage( MSG_CONNECT_TRK, _("Continue"), NULL, trk0->index, inx0, trk1->index, inx1, d, a ); +		if (d > connectDistance || (a > connectAngle && a < 360.0 - connectAngle)) +			NoticeMessage( MSG_CONNECT_TRK, _("Continue"), NULL, trk0->index, inx0, trk1->index, inx1, d, a );  	}  	UndoModify( trk0 );  	UndoModify( trk1 ); @@ -1888,7 +1929,7 @@ EXPORT BOOL_T TraverseTrack(  			return TRUE;  		if ( !trvTrk->trk )  			return FALSE; -		ep = GetEndPtConnectedToMe( trvTrk->trk, oldTrk ); +		ep = GetNearestEndPtConnectedToMe( trvTrk->trk, oldTrk, trvTrk->pos );  		if ( ep != -1 ) {  			trvTrk->pos = GetTrkEndPos( trvTrk->trk, ep );  			trvTrk->angle = NormalizeAngle( GetTrkEndAngle( trvTrk->trk, ep ) + 180.0 ); | 
