diff options
Diffstat (limited to 'app/bin/cgroup.c')
| -rw-r--r-- | app/bin/cgroup.c | 52 | 
1 files changed, 39 insertions, 13 deletions
| diff --git a/app/bin/cgroup.c b/app/bin/cgroup.c index 76b15ca..b173987 100644 --- a/app/bin/cgroup.c +++ b/app/bin/cgroup.c @@ -1,6 +1,4 @@ -/* - * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/bin/cgroup.c,v 1.2 2008-01-20 23:29:15 mni77 Exp $ - * +/** \file cgroup.c   * Compound tracks: Group   *   */ @@ -24,10 +22,23 @@   */  #include <ctype.h> -#include "track.h" +#include <math.h> +#include <string.h> +  #include "compound.h" -#include "shrtpath.h" +#include "cundo.h" +#include "custom.h" +#include "fileio.h"  #include "i18n.h" +#include "tbezier.h" +#include "tcornu.h" +#include "common.h" +#include "messages.h" +#include "param.h" +#include "shrtpath.h" +#include "track.h" +#include "utility.h" +  /*****************************************************************************   * @@ -46,6 +57,10 @@ static char groupPartno[STR_SIZE];  static char groupTitle[STR_SIZE];  static int groupCompoundCount = 0; +extern TRKTYP_T T_BZRTRK; +extern TRKTYP_T T_BZRLIN; +extern TRKTYP_T T_CORNU; +  typedef struct {  		int segInx;  		EPINX_T segEP; @@ -666,7 +681,11 @@ static char * FindPathBtwEP(  		if ( ep1+ep2 != 1 )  			AbortProg( "findPathBtwEP" );  		*flip = ( ep1 == 1 ); -		return "\1\0\0"; +		if (GetTrkType(trk) == T_CORNU ) { 			// Cornu doesn't have a path but lots of segs! +			cp = CreateSegPathList(trk);			// Make path +LOG( log_group, 2, ( " Group: Cornu path:%s \n", cp ) ) +		} else cp = "\1\0\0";						//One segment (but could be a Bezier) +		return cp;  	}  	cp = (char *)xx->paths;  	pos1 = GetTrkEndPos(trk,ep1); @@ -678,7 +697,7 @@ static char * FindPathBtwEP(  	pos2.x -= xx->orig.x;  	pos2.y -= xx->orig.y;  	while ( cp[0] ) { -		cp += strlen(cp)+1; +		cp += strlen(cp)+1;						//Ignore Path Name  		while ( cp[0] ) {  			cp0 = cp;  			epN = -1; @@ -691,8 +710,8 @@ static char * FindPathBtwEP(  			if ( epN != -1 ) {  				GetSegInxEP( cp[-1], &segInx, &segEP );  				if ( CheckTurnoutEndPoint( &xx->segs[segInx], epN==0?pos1:pos2, 1-segEP ) ) { -					*flip = epN==0; -					return cp0; +					*flip = epN==0;			 // If its reversed, set up to be flipped or noted +					return cp0;				 //Found path between EPs  				}  			}  			cp++; @@ -995,6 +1014,12 @@ static void GroupOk( void * junk )  							DrawSegs( &groupD, xx->orig, xx->angle, segPtr, 1, trackGauge, wDrawColorBlack );  						}  					} +				} else if (GetTrkType(trk) == T_BEZIER || GetTrkType(trk) == T_BZRLIN ) { +					DYNARR_APPEND(trkSeg_t, trackSegs_da, 10); +					segPtr = &trackSegs(trackSegs_da.cnt-1); +					GetBezierSegmentFromTrack(trk,segPtr); +				} else if (GetTrkType(trk) == T_CORNU) { +					GetBezierSegmentsFromCornu(trk,&trackSegs_da);  //Only give back Bezier - cant be undone  				} else {  					segCnt = tempSegs_da.cnt;  					oldOptions = groupD.options; @@ -1072,6 +1097,7 @@ static void GroupOk( void * junk )  		}  		/* Make sure no turnouts in groupTrk list have a path end which is not an EndPt */ +		//TODO Add Trap Points (which are Turnouts with a bumper track)  		for ( inx=0; inx<groupTrk_da.cnt; inx++ ) {  			trk = groupTrk(0).trk;  			if ( GetTrkType( trk ) == T_TURNOUT ) { @@ -1391,7 +1417,7 @@ if ( log_group >= 1 && logTable(log_group).level > log_group ) {  		for ( pinx=0; pinx<trackSegs_da.cnt; pinx++ ) {  			if ( segFlip(pinx) < 0 ) {  LOG( log_group, 1, ( "Flipping Segment %d\n", pinx+1 ) ); -				SegProc( SEGPROC_FLIP, &trackSegs(pinx), NULL ); +					SegProc( SEGPROC_FLIP, &trackSegs(pinx), NULL );  			}  		} @@ -1413,7 +1439,7 @@ LOG( log_group, 1, ( "Flipping Segment %d\n", pinx+1 ) );  					if ( path == NULL )  						AbortProg( "Missing Path T%d:%d.%d", GetTrkIndex(groupP->trk), ppp->ep2, ppp->ep1 );  					if ( flip ) path += strlen((char *)path)-1; -					while ( *path ) { +					while ( *path && (path >= ppp->path) ) {      //Add Guard for flip backwards  						DYNARR_APPEND( char, pathPtr_da, 10 );  						pathChar = *path;  						flip1 = flip; @@ -1568,6 +1594,7 @@ EXPORT void DoGroup( void )  	xx = NULL;  	groupSegCnt = 0;  	groupCompoundCount = 0; +  	while ( TrackIterate( &trk ) ) {  		if ( GetTrkSelected( trk ) ) {  			trkType = GetTrkType(trk); @@ -1575,9 +1602,8 @@ EXPORT void DoGroup( void )  				xx = GetTrkExtraData(trk);  				groupSegCnt += xx->segCnt;  				GroupCopyTitle( xtitle(xx) ); -			} else { +			} else  				groupSegCnt += 1; -			}  		}  	}  	if ( groupSegCnt <= 0 ) { | 
