summaryrefslogtreecommitdiff
path: root/app/bin/cgroup.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/cgroup.c')
-rw-r--r--app/bin/cgroup.c328
1 files changed, 157 insertions, 171 deletions
diff --git a/app/bin/cgroup.c b/app/bin/cgroup.c
index 1183e76..d30481f 100644
--- a/app/bin/cgroup.c
+++ b/app/bin/cgroup.c
@@ -21,23 +21,18 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#include <ctype.h>
-#include <math.h>
-#include <string.h>
-
+#include "cselect.h"
#include "compound.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"
+#include "common-ui.h"
/*****************************************************************************
@@ -54,13 +49,19 @@ static dynArr_t pathPtr_da;
static char groupManuf[STR_SIZE];
static char groupDesc[STR_SIZE];
static char groupPartno[STR_SIZE];
-static char groupTitle[STR_SIZE];
+static char groupTitle[STR_LONG_SIZE];
static int groupCompoundCount = 0;
extern TRKTYP_T T_BZRTRK;
extern TRKTYP_T T_BZRLIN;
extern TRKTYP_T T_CORNU;
+/*****************************************************************************
+ *
+ * Ungroup
+ *
+ */
+
typedef struct {
int segInx;
EPINX_T segEP;
@@ -168,8 +169,8 @@ static void GroupCopyTitle(
EXPORT void UngroupCompound(
track_p trk )
{
- struct extraData *xx = GetTrkExtraData(trk);
- struct extraData *xx1;
+ struct extraDataCompound_t *xx = GET_EXTRA_DATA(trk, T_NOTRACK, extraDataCompound_t);
+ struct extraDataCompound_t *xx1;
trkSeg_p sp;
track_p trk0, trk1;
int segCnt, segInx, segInx1;
@@ -219,8 +220,13 @@ EXPORT void UngroupCompound(
LOG( log_group, 1, ( "Ungroup( T%d )\n", GetTrkIndex(trk) ) );
epCnt = GetTrkEndPtCnt(trk);
- for ( segCnt=0; segCnt<xx->segCnt&&IsSegTrack(&xx->segs[segCnt]); segCnt++ );
- ASSERT( (epCnt==0) == (segCnt==0) );
+ segCnt = xx->segCnt;
+ int trackCount = 0;
+ for ( sp=xx->segs; sp<&xx->segs[xx->segCnt]; sp++ ) {
+ if (IsSegTrack(sp)) trackCount++;
+ }
+ //ASSERT( (epCnt==0) == (segCnt==0) );
+ ASSERT( (epCnt==0) == (trackCount==0) );
turnoutChanged = FALSE;
if ( epCnt > 0 ) {
turnoutChanged = TRUE;
@@ -253,7 +259,7 @@ LOG( log_group, 1, ( " EP%d = [%0.3f %0.3f] A%0.3f T%d.%d\n", ep, epp->pos.x, ep
*/
DYNARR_SET( int, refCount_da, segCnt+epCnt );
memset( refCount_da.ptr, 0, refCount_da.cnt * sizeof *(int*)0 );
- cp = (char *)xx->paths;
+ cp = (char *)GetPaths( trk );
while ( cp[0] ) {
cp += strlen(cp)+1;
while ( cp[0] ) {
@@ -262,6 +268,10 @@ LOG( log_group, 1, ( " EP%d = [%0.3f %0.3f] A%0.3f T%d.%d\n", ep, epp->pos.x, ep
segInx1 = FindEP( tempEndPts_da.cnt, &tempEndPts(0), pos );
if ( segInx1 >= 0 ) {
segInx1 += segCnt;
+ if ( segInx1 >= refCount_da.cnt ) {
+ InputError( "Invalid segInx1 %d", TRUE, segInx1 );
+ return;
+ }
refCount(segInx1)++;
} else {
DYNARR_APPEND( trkEndPt_t, tempEndPts_da, 10 );
@@ -275,6 +285,10 @@ LOG( log_group, 1, ( " EP%d = [%0.3f %0.3f] A%0.3f T%d.%d\n", ep, epp->pos.x, ep
segEP1 = 0;
while ( cp[0] ) {
GetSegInxEP( cp[0], &segInx, &segEP );
+ if ( segInx1 >= refCount_da.cnt ) {
+ InputError( "Invalid segInx1 %d", TRUE, segInx1 );
+ return;
+ }
refCount(segInx)++;
if ( refCount(segInx) > refCount(segInx1) )
AddMergePt( segInx, segEP );
@@ -314,7 +328,7 @@ LOG( log_group, 1, ( " EP%d = [%0.3f %0.3f] A%0.3f T%d.%d\n", ep, epp->pos.x, ep
*/
DYNARR_SET( int, refCount_da, segCnt );
memset( refCount_da.ptr, -1, segCnt * sizeof *(int*)0 );
- cp = (char *)xx->paths;
+ cp = (char *)GetPaths( trk );
while ( cp[0] ) {
cp += strlen(cp)+1;
while ( cp[0] ) {
@@ -472,9 +486,11 @@ LOG( log_group, 1, ( " EP%d = [%0.3f %0.3f] A%0.3f T%d.%d\n", ep, epp->pos.x, ep
Rotate( &orig, zero, xx->angle );
orig.x = xx->orig.x - orig.x;
orig.y = xx->orig.y - orig.y;
- trk1 = NewCompound( T_TURNOUT, 0, orig, xx->angle, xx->title, tempEndPts_da.cnt-epCnt1, &tempEndPts(epCnt1), NULL, pathPtr_da.cnt, &pathPtr(0), tempSegs_da.cnt, &tempSegs(0) );
- xx1 = GetTrkExtraData(trk1);
+ trk1 = NewCompound( T_TURNOUT, 0, orig, xx->angle, xx->title, tempEndPts_da.cnt-epCnt1, &tempEndPts(epCnt1), (PATHPTR_T)&pathPtr(0), tempSegs_da.cnt, &tempSegs(0) );
+ xx1 = GET_EXTRA_DATA(trk1, T_TURNOUT, extraDataCompound_t);
xx1->ungrouped = TRUE;
+ xx1->pathOverRide = xx->pathOverRide;
+ xx1->pathNoCombine = xx->pathNoCombine;
SetTrkVisible( trk1, TRUE );
SetTrkNoTies( trk1, FALSE );
@@ -491,6 +507,8 @@ LOG( log_group, 1, ( " EP%d = [%0.3f %0.3f] A%0.3f T%d.%d\n", ep, epp->pos.x, ep
*/
for ( segInx=0; segInx<segCnt; segInx++ ) {
if ( refCount(segInx) >= 0 ) continue;
+ if ( ! IsSegTrack( xx->segs+segInx ) )
+ continue;
SegProc( SEGPROC_NEWTRACK, xx->segs+segInx, &segProcData );
SetTrkScale( segProcData.newTrack.trk, GetTrkScale(trk) );
SetTrkBits( segProcData.newTrack.trk, TB_SELECTED );
@@ -503,7 +521,7 @@ LOG( log_group, 1, ( " EP%d = [%0.3f %0.3f] A%0.3f T%d.%d\n", ep, epp->pos.x, ep
/* 9: reconnect tracks
*/
- cp = (char *)xx->paths;
+ cp = (char *)GetPaths( trk );
while ( cp[0] ) {
cp += strlen(cp)+1;
while ( cp[0] ) {
@@ -566,7 +584,8 @@ LOG( log_group, 1, ( " EP%d = [%0.3f %0.3f] A%0.3f T%d.%d\n", ep, epp->pos.x, ep
mp->trk = NULL;
}
} else {
- DrawNewTrack( segTrack(segInx).trk );
+ if ( segTrack(segInx).trk )
+ DrawNewTrack( segTrack(segInx).trk );
}
}
wDrawDelayUpdate( mainD.d, FALSE );
@@ -575,7 +594,7 @@ LOG( log_group, 1, ( " EP%d = [%0.3f %0.3f] A%0.3f T%d.%d\n", ep, epp->pos.x, ep
-EXPORT void DoUngroup( void )
+EXPORT void DoUngroup( void * unused )
{
track_p trk = NULL;
int ungroupCnt;
@@ -612,6 +631,7 @@ static drawCmd_t groupD = {
NULL, &tempSegDrawFuncs, DC_SEGTRACK, 1, 0.0, {0.0, 0.0}, {0.0, 0.0}, Pix2CoOrd, CoOrd2Pix };
static long groupSegCnt;
static long groupReplace;
+static long groupNoCombine;
static double groupOriginX;
static double groupOriginY;
char * groupReplaceLabels[] = { N_("Replace with new group?"), NULL };
@@ -620,21 +640,23 @@ static wWin_p groupW;
static paramIntegerRange_t r0_999999 = { 0, 999999 };
static paramFloatRange_t r_1000_1000 = { -1000.0, 1000.0, 80 };
static paramData_t groupPLs[] = {
-/*0*/ { PD_STRING, groupManuf, "manuf", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)350, N_("Manufacturer"), 0, 0, sizeof(groupManuf)},
-/*1*/ { PD_STRING, groupDesc, "desc", PDO_NOPREF | PDO_STRINGLIMITLENGTH, (void*)230, N_("Description"), 0, 0, sizeof(groupDesc)},
-/*2*/ { PD_STRING, groupPartno, "partno", PDO_NOPREF|PDO_DLGHORZ|PDO_DLGIGNORELABELWIDTH|PDO_STRINGLIMITLENGTH, (void*)100, N_("#"), 0, 0, sizeof(groupPartno)},
+/*0*/ { PD_STRING, groupManuf, "manuf", PDO_NOPREF | PDO_NOTBLANK, I2VP(350), N_("Manufacturer"), 0, 0, sizeof(groupManuf)},
+/*1*/ { PD_STRING, groupDesc, "desc", PDO_NOPREF | PDO_NOTBLANK, I2VP(230), N_("Description"), 0, 0, sizeof(groupDesc)},
+/*2*/ { PD_STRING, groupPartno, "partno", PDO_NOPREF|PDO_DLGHORZ|PDO_DLGIGNORELABELWIDTH|PDO_NOTBLANK, I2VP(100), N_("#"), 0, 0, sizeof(groupPartno)},
/*3*/ { PD_LONG, &groupSegCnt, "segcnt", PDO_NOPREF, &r0_999999, N_("# Segments"), BO_READONLY },
#define I_GROUP_ORIGIN_OFFSET 4 /* Need to change if add above */
/*4*/ { PD_FLOAT, &groupOriginX, "orig", PDO_DIM, &r_1000_1000, N_("Offset X,Y:")},
/*5*/ { PD_FLOAT, &groupOriginY, "origy",PDO_DIM | PDO_DLGHORZ, &r_1000_1000, ""},
/*6*/ { PD_TOGGLE, &groupReplace, "replace", 0, groupReplaceLabels, "", BC_HORZ|BC_NOBORDER } };
-static paramGroup_t groupPG = { "group", 0, groupPLs, sizeof groupPLs/sizeof groupPLs[0] };
+static paramGroup_t groupPG = { "group", 0, groupPLs, COUNT( groupPLs ) };
typedef struct {
track_p trk;
int segStart;
int segEnd;
+ int totalSegStart; //Where we are overall
+ int totalSegEnd;
} groupTrk_t, * groupTrk_p;
static dynArr_t groupTrk_da;
#define groupTrk(N) DYNARR_N( groupTrk_t, groupTrk_da, N )
@@ -673,7 +695,6 @@ static char * FindPathBtwEP(
EPINX_T ep2,
BOOL_T * flip )
{
- struct extraData * xx = GetTrkExtraData( trk );
char * cp;
coOrd trkPos[2];
@@ -690,7 +711,8 @@ LOG( log_group, 2, ( " Group: Cornu path:%s \n", cp ) )
LOG( log_group, 3, (" Flip:%s Path= Seg=%d-\n", *flip?"T":"F", *cp ) );
return cp;
}
- cp = (char *)xx->paths;
+ struct extraDataCompound_t * xx = GET_EXTRA_DATA( trk, T_TURNOUT, extraDataCompound_t );
+ cp = (char *)GetPaths( trk );
trkPos[0] = GetTrkEndPos(trk,ep1);
Rotate( &trkPos[0], xx->orig, -xx->angle );
trkPos[0].x -= xx->orig.x;
@@ -889,6 +911,10 @@ static int ConflictPaths(
path_p path0,
path_p path1 )
{
+ if ( groupNoCombine != 0 ) {
+ // No grouping
+ return TRUE;
+ }
/* do these paths share an EP? */
if ( path0->ep1 == path1->ep1 ) return TRUE;
if ( path0->ep1 == path1->ep2 ) return TRUE;
@@ -903,7 +929,7 @@ static BOOL_T CheckPathEndPt(
char cc,
EPINX_T ep )
{
- struct extraData *xx = GetTrkExtraData(trk);
+ struct extraDataCompound_t *xx = GET_EXTRA_DATA(trk, T_TURNOUT, extraDataCompound_t);
wIndex_t segInx;
EPINX_T segEP, epCnt;
DIST_T d;
@@ -925,9 +951,8 @@ static BOOL_T CheckPathEndPt(
static BOOL_T CheckForBumper(
track_p trk )
{
- struct extraData *xx = GetTrkExtraData(trk);
char * cp;
- cp = (char *)xx->paths;
+ cp = (char *)GetPaths( trk );
while ( cp[0] ) {
cp += strlen(cp)+1;
while ( cp[0] ) {
@@ -942,36 +967,10 @@ static BOOL_T CheckForBumper(
return TRUE;
}
-typedef struct {
- int inx;
- wBool_t track;
-} segInMap_t;
-static dynArr_t segInMap_da;
-#define segInMap(N) DYNARR_N( segInMap_t, segInMap_da, N)
-
-void AddToSegMap(int inx,wBool_t track) {
- DYNARR_APPEND(segInMap_t,segInMap_da,10);
- DYNARR_LAST(segInMap_t,segInMap_da).inx = inx;
- DYNARR_LAST(segInMap_t,segInMap_da).track = track;
-}
-
-void AddSegsToSegMap(int start, int end, wBool_t track) {
- for (int i = start; i<= end; i++) {
- AddToSegMap(i,track);
- }
-}
-
static dynArr_t trackSegs_da;
#define trackSegs(N) DYNARR_N( trkSeg_t, trackSegs_da, N )
-trkSeg_p GetSegFromSegMap(int index) {
- if (DYNARR_N( segInMap_t, segInMap_da, index).track) {
- return &DYNARR_N(trkSeg_t,trackSegs_da,DYNARR_N( segInMap_t, segInMap_da, index).inx);
- } else
- return &DYNARR_N(trkSeg_t,tempSegs_da,DYNARR_N( segInMap_t, segInMap_da, index).inx);
-}
-
static dynArr_t outputSegs_da;
#define outputSegs(N) DYNARR_N( trkSeg_t, outputSegs_da, N)
@@ -1004,10 +1003,12 @@ static void LogSeg(
LogPrintf( "%c:\n", segP->type );
}
}
+
+
/*
* GroupOk: create a TURNOUT or STRUCTURE from the selected objects
* 1 - Add selected tracks to groupTrk[]
- * - Add each group trk's segments to trackSeg[] or tempSegs[]
+ * - Add each group trk's segments to trackSeg[]
* - Add all segs to segInMap[]
* - if no track segments goto step 9
* 2 - Collect boundary endPts and sort them in tempEndPts[]
@@ -1017,16 +1018,16 @@ static void LogSeg(
* 4 - Flip tracks so sub-path elements match up
* 5 - Create conflict map
* 6 - Flip paths to minimize the number of flipped segments
- * 7 - Build the path ('P') string
+ * 7 - Build the path ('P') string (new-P)
* 8 - Build segment list, adjust endPts in tempEndPts[]
- * 9 - create new TURNOUT/STRUCTURE definition
+ * 9 - create new TURNOUT/STRUCTURE definition
* 10 - write defn to xtrkcad.cus
* 11 - optionally replace grouped tracks with new defn
*/
-static void GroupOk( void * junk )
+static void GroupOk( void * unused )
{
- struct extraData *xx = NULL;
+ struct extraDataCompound_t *xx = NULL;
turnoutInfo_t * to;
int inx;
EPINX_T ep, epCnt, epN;
@@ -1055,10 +1056,7 @@ static void GroupOk( void * junk )
int groupCnt;
int pinx, pinx2, ginx, ginx2, gpinx2;
trkEndPt_p endPtP;
- PATHPTR_T path;
- int pathLen;
signed char pathChar;
- char *oldLocale = NULL;
DYNARR_RESET( trkSeg_t, trackSegs_da );
DYNARR_RESET( trkSeg_t, tempSegs_da );
@@ -1068,8 +1066,6 @@ static void GroupOk( void * junk )
DYNARR_RESET( trkEndPt_t, tempEndPts_da );
DYNARR_RESET( char, pathPtr_da );
- DYNARR_RESET( segInMap_t, segInMap_da);
-
ParamUpdate( &groupPG );
if ( groupManuf[0]==0 || groupDesc[0]==0 || groupPartno[0]==0 ) {
NoticeMessage2( 0, MSG_GROUP_NONBLANK, _("Ok"), NULL );
@@ -1089,98 +1085,83 @@ static void GroupOk( void * junk )
*/
trk = NULL;
int InInx = -1;
+ BOOL_T hasTracks = FALSE;
while ( TrackIterate( &trk ) ) {
if ( GetTrkSelected( trk ) ) {
- if ( IsTrack(trk) ) {
- DYNARR_APPEND( groupTrk_t, groupTrk_da, 10 );
- groupP = &groupTrk(groupTrk_da.cnt-1);
- groupP->trk = trk;
- groupP->segStart = trackSegs_da.cnt;
- if ( GetTrkType(trk) == T_TURNOUT ) {
- xx = GetTrkExtraData(trk);
- for ( pinx=0; pinx<xx->segCnt; pinx++ ) {
- segPtr = &xx->segs[pinx];
- if ( IsSegTrack(segPtr) ) {
- DYNARR_APPEND( trkSeg_t, trackSegs_da, 10 );
- trackSegs(trackSegs_da.cnt-1) = *segPtr;
-
- AddToSegMap(trackSegs_da.cnt-1,TRUE); /* Single Track Seg - Note no Cornu*/
-
- RotateSegs( 1, &trackSegs(trackSegs_da.cnt-1), zero, xx->angle );
- MoveSegs( 1, &trackSegs(trackSegs_da.cnt-1), xx->orig );
-
- } else {
- int start = tempSegs_da.cnt;
- DrawSegs( &groupD, xx->orig, xx->angle, segPtr, 1, trackGauge, wDrawColorBlack );
-
- AddSegsToSegMap(start,tempSegs_da.cnt-1,FALSE); /* Multiple Non-Track Segs */
- }
- }
- } else if (GetTrkType(trk) == T_BEZIER || GetTrkType(trk) == T_BZRLIN ) {
- DYNARR_APPEND(trkSeg_t, trackSegs_da, 10);
- segPtr = &trackSegs(trackSegs_da.cnt-1);
+ DYNARR_APPEND( groupTrk_t, groupTrk_da, 10 );
+ groupP = &groupTrk(groupTrk_da.cnt-1);
+ groupP->trk = trk;
+ groupP->segStart = trackSegs_da.cnt;
+ groupP->totalSegStart = tempSegs_da.cnt+trackSegs_da.cnt;
+ if (IsTrack(trk)) hasTracks = TRUE;
+ if ( GetTrkType(trk) == T_TURNOUT || GetTrkType(trk) == T_STRUCTURE) {
+ xx = GET_EXTRA_DATA(trk, T_NOTRACK, extraDataCompound_t);
+ for ( pinx=0; pinx<xx->segCnt; pinx++ ) {
+ segPtr = &xx->segs[pinx];
+ if ( IsSegTrack(segPtr) ) {
+ DYNARR_APPEND( trkSeg_t, trackSegs_da, 10 );
+ trackSegs(trackSegs_da.cnt-1) = *segPtr;
+ hasTracks = TRUE;
+ RotateSegs( 1, &trackSegs(trackSegs_da.cnt-1), zero, xx->angle );
+ MoveSegs( 1, &trackSegs(trackSegs_da.cnt-1), xx->orig );
+
+ } else {
+ DYNARR_APPEND( trkSeg_t, trackSegs_da, 10 );
+ trackSegs(trackSegs_da.cnt-1) = *segPtr;
+
+ RotateSegs( 1, &trackSegs(trackSegs_da.cnt-1), zero, xx->angle );
+ MoveSegs( 1, &trackSegs(trackSegs_da.cnt-1), xx->orig );
- GetBezierSegmentFromTrack(trk,segPtr);
-
- AddToSegMap(trackSegs_da.cnt-1,TRUE); // Add Single Bezier Track
-
- } else if (GetTrkType(trk) == T_CORNU) {
+ }
+ }
+ } else if (GetTrkType(trk) == T_BEZIER || GetTrkType(trk) == T_BZRLIN ) {
+ DYNARR_APPEND(trkSeg_t, trackSegs_da, 10);
+ segPtr = &trackSegs(trackSegs_da.cnt-1);
- int start = trackSegs_da.cnt;
+ GetBezierSegmentFromTrack(trk,segPtr);
- GetBezierSegmentsFromCornu(trk,&trackSegs_da,TRUE); //Only give back Bezier - cant be undone
+ } else if (GetTrkType(trk) == T_CORNU) {
- AddSegsToSegMap(start,trackSegs_da.cnt-1,TRUE); /* Add Multiple Track Segs */
+ int start = trackSegs_da.cnt;
- } else {
- segCnt = tempSegs_da.cnt;
- DrawTrack( trk, &groupD, wDrawColorBlack );
- DYNARR_APPEND( trkSeg_t, trackSegs_da, 10 );
- segPtr = &trackSegs(trackSegs_da.cnt-1);
- *segPtr = tempSegs( segCnt );
-
- AddToSegMap(trackSegs_da.cnt-1,TRUE); // Add One Track
-
- if ( tempSegs_da.cnt != segCnt+1 ||
- !IsSegTrack(segPtr) ) {
- NoticeMessage2( 0, MSG_CANNOT_GROUP_TRACK, _("Ok"), NULL );
- wHide( groupW );
- return;
- }
+ GetBezierSegmentsFromCornu(trk,&trackSegs_da,TRUE); //Only give back Bezier - cant be undone
- tempSegs_da.cnt = segCnt;
- }
- groupP->segEnd = trackSegs_da.cnt-1;
} else {
- int start = tempSegs_da.cnt;
-
+ if (IsTrack(trk)) hasTracks=TRUE;
+ segCnt = tempSegs_da.cnt;
DrawTrack( trk, &groupD, wDrawColorBlack );
+ DYNARR_APPEND( trkSeg_t, trackSegs_da, 10 );
+ segPtr = &trackSegs(trackSegs_da.cnt-1);
+ *segPtr = tempSegs( segCnt );
+
+ if ( tempSegs_da.cnt != segCnt+1 ) {
+ NoticeMessage2( 0, MSG_CANNOT_GROUP_TRACK, _("Ok"), NULL, GetTrkTypeName(trk));
+ wHide( groupW );
+ return;
+ }
- AddSegsToSegMap(start,tempSegs_da.cnt-1,FALSE); /* Multiple Non-Track Segs */
}
+ groupP->segEnd = trackSegs_da.cnt-1;
}
}
if ( log_group >= 1 && logTable(log_group).level >= 4 ) {
LogPrintf( "Track Segs:\n");
for ( int inx = 0; inx < trackSegs_da.cnt; inx++ ) {
- LogPrintf( " %d: ", inx+1 );
- LogSeg( &trackSegs(inx) );
+ if (IsSegTrack(&trackSegs(inx))) {
+ LogPrintf( " %d: ", inx+1 );
+ LogSeg( &trackSegs(inx) );
+ }
}
LogPrintf( "Other Segs:\n");
- for ( int inx = 0; inx < tempSegs_da.cnt; inx++ ) {
- LogPrintf( " %d: ", inx+1 );
- LogSeg( &tempSegs(inx) );
- }
-}
-if ( log_group >= 1 && logTable(log_group).level >= 3 ) {
- LogPrintf( "Combined Segs:\n" );
- for ( int inx = 0; inx<segInMap_da.cnt; inx++ ) {
- LogPrintf( "%d: %s X%d - ", inx+1, segInMap(inx).track?"Track":"Other", segInMap(inx).inx );
- LogSeg( GetSegFromSegMap( inx ) );
+ for ( int inx = 0; inx < trackSegs_da.cnt; inx++ ) {
+ if (!IsSegTrack(&trackSegs(inx))) {
+ LogPrintf( " %d: ", inx+1 );
+ LogSeg( &tempSegs(inx) );
+ }
}
}
- if ( groupTrk_da.cnt>0 ) {
+ if ( groupTrk_da.cnt>0 && hasTracks) {
if ( groupTrk_da.cnt > 128 ) {
NoticeMessage( MSG_TOOMANYSEGSINGROUP, _("Ok"), NULL );
wDrawDelayUpdate( mainD.d, FALSE );
@@ -1237,11 +1218,6 @@ if ( log_group >= 1 && logTable(log_group).level >= 4 ) {
wHide( groupW );
return;
}
- if ( groupTrk_da.cnt == 1 && GetTrkType( groupTrk(0).trk ) == T_TURNOUT ) {
- path = xx->paths;
- pathLen = xx->pathLen;
- goto groupSimpleTurnout;
- }
/* 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)
@@ -1493,13 +1469,13 @@ if ( log_group >= 1 && logTable(log_group).level >= 3 ) {
memset( &segFlip(0), 0, trackSegs_da.cnt * sizeof segFlip(0) );
for ( pinx=0; pinx<pathElem_da.cnt; pinx++ ) {
ppp = &pathElem(pinx);
- for ( path=ppp->path; *path; path++ ) {
- inx = *path;
+ for ( PATHPTR_T pPaths=ppp->path; *pPaths; pPaths++ ) {
+ inx = *pPaths;
if ( inx<0 )
inx = - inx;
if ( inx > trackSegs_da.cnt )
AbortProg( "inx > trackSegs_da.cnt" );
- flip = *path<0;
+ flip = *pPaths<0;
if ( ppp->flip )
flip = !flip;
inx += groupTrk(ppp->groupInx).segStart - 1;
@@ -1537,14 +1513,14 @@ LOG( log_group, 3, ( "\n" ) );
ppp = &pathElem( pinx2 );
LOG( log_group, 3, (" PE %d: GI %d, EP %d %d, Flip %d =", pinx2, ppp->groupInx, ppp->ep1, ppp->ep2, ppp->flip ));
groupP = &groupTrk( ppp->groupInx );
- path = ppp->path;
+ PATHPTR_T pPaths = ppp->path;
flip = ppp->flip;
- if ( path == NULL )
+ if ( pPaths == NULL )
AbortProg( "Missing Path T%d:%d.%d", GetTrkIndex(groupP->trk), ppp->ep2, ppp->ep1 );
- if ( flip ) path += strlen((char *)path)-1;
- while ( *path && (path >= ppp->path) ) { //Add Guard for flip backwards
+ if ( flip ) pPaths += strlen((char *)pPaths)-1;
+ while ( *pPaths && (pPaths >= ppp->path) ) { //Add Guard for flip backwards
DYNARR_APPEND( char, pathPtr_da, 10 );
- pathChar = *path;
+ pathChar = *pPaths;
flip1 = flip;
if ( pathChar < 0 ) {
flip1 = !flip;
@@ -1555,7 +1531,7 @@ LOG( log_group, 3, ( "\n" ) );
flip1 = ! flip1;
if ( flip1 ) pathChar = - pathChar;
pathPtr(pathPtr_da.cnt-1) = pathChar;
- path += (flip?-1:1);
+ pPaths += (flip?-1:1);
LOG( log_group, 3, (" %d", pathChar ) );
}
LOG( log_group, 3, ("\n") );
@@ -1568,21 +1544,18 @@ LOG( log_group, 3, ( "\n" ) );
}
DYNARR_APPEND( char, pathPtr_da, 10 );
pathPtr(pathPtr_da.cnt-1) = 0;
- path = (PATHPTR_T)&pathPtr(0);
- pathLen = pathPtr_da.cnt;
-groupSimpleTurnout:
/*
* 8: Copy and Reorigin Segments - Start by putting them out in the original order
*/
DYNARR_RESET(trkSeg_t, outputSegs_da);
- for (int i=0; i<segInMap_da.cnt;i++) {
+ for (int i=0; i<trackSegs_da.cnt;i++) {
DYNARR_APPEND(trkSeg_t,outputSegs_da,10);
- trkSeg_p from_p = GetSegFromSegMap(i);
+ trkSeg_p from_p = &trackSegs(i);
trkSeg_p to_p = &DYNARR_LAST(trkSeg_t, outputSegs_da);
- memcpy((void *)to_p,(void *)from_p,sizeof( trkSeg_t));
+ memcpy(to_p,from_p,sizeof( trkSeg_t));
}
CloneFilledDraw( outputSegs_da.cnt, outputSegs_da.ptr, FALSE );
@@ -1599,18 +1572,23 @@ groupSimpleTurnout:
* 9: Final: create new definition
*/
- CheckPaths( outputSegs_da.cnt, &outputSegs(0), path );
+ PATHPTR_T pPaths = (PATHPTR_T)&pathPtr(0);
+ CheckPaths( outputSegs_da.cnt, &outputSegs(0), pPaths );
- to = CreateNewTurnout( curScaleName, groupTitle, outputSegs_da.cnt, &outputSegs(0), pathLen, path, tempEndPts_da.cnt, &tempEndPts(0), NULL, TRUE );
+ long options = 0;
+ if ( groupNoCombine != 0 )
+ options |= COMPOUND_OPTION_PATH_NOCOMBINE;
+ to = CreateNewTurnout( curScaleName, groupTitle, outputSegs_da.cnt, &outputSegs(0), pPaths, tempEndPts_da.cnt, &tempEndPts(0), TRUE, options );
/*
* 10: Write defn to xtrkcad.cus
*/
f = OpenCustom("a");
if (f && to) {
- oldLocale = SaveLocale("C");
- rc &= fprintf( f, "TURNOUT %s \"%s\"\n", curScaleName, PutTitle(to->title) )>0;
- rc &= WriteCompoundPathsEndPtsSegs( f, path, outputSegs_da.cnt, &outputSegs(0), tempEndPts_da.cnt, &tempEndPts(0) );
+ SetCLocale();
+ rc &= fprintf( f, "TURNOUT %s \"%s\" %ld\n", curScaleName, PutTitle(to->title), options )>0;
+ rc &= WriteCompoundPathsEndPtsSegs( f, pPaths, outputSegs_da.cnt, &outputSegs(0), tempEndPts_da.cnt, &tempEndPts(0) );
+ SetUserLocale();
}
if ( groupReplace ) {
/*
@@ -1639,7 +1617,11 @@ groupSimpleTurnout:
trackCount--;
}
}
- trk = NewCompound( T_TURNOUT, 0, orig, 0.0, to->title, tempEndPts_da.cnt, &tempEndPts(0), NULL, pathLen, (char *)path, outputSegs_da.cnt, &outputSegs(0) );
+ SelectRecount();
+ trk = NewCompound( T_TURNOUT, 0, orig, 0.0, to->title, tempEndPts_da.cnt, &tempEndPts(0), pPaths, outputSegs_da.cnt, &outputSegs(0) );
+ struct extraDataCompound_t *xx = GET_EXTRA_DATA(trk, T_TURNOUT, extraDataCompound_t);
+ xx->pathOverRide = FALSE;
+ xx->pathNoCombine = groupNoCombine;
SetTrkVisible( trk, TRUE );
for ( ep=0; ep<tempEndPts_da.cnt; ep++ ) {
@@ -1652,18 +1634,19 @@ groupSimpleTurnout:
EnableCommands();
}
} else {
- CloneFilledDraw( tempSegs_da.cnt, &tempSegs(0), TRUE );
- GetSegBounds( zero, 0, tempSegs_da.cnt, &tempSegs(0), &orig, &size );
+ CloneFilledDraw( trackSegs_da.cnt, &trackSegs(0), TRUE );
+ GetSegBounds( zero, 0, trackSegs_da.cnt, &trackSegs(0), &orig, &size );
orig.x = - orig.x-groupOriginX; //Include orig offset
orig.y = - orig.y-groupOriginY;
- MoveSegs( tempSegs_da.cnt, &tempSegs(0), orig );
- to = CreateNewStructure( curScaleName, groupTitle, tempSegs_da.cnt, &tempSegs(0), TRUE );
+ MoveSegs( trackSegs_da.cnt, &trackSegs(0), orig );
+ to = CreateNewStructure( curScaleName, groupTitle, trackSegs_da.cnt, &trackSegs(0), TRUE );
f = OpenCustom("a");
if (f && to) {
- oldLocale = SaveLocale("C");
+ SetCLocale();
rc &= fprintf( f, "STRUCTURE %s \"%s\"\n", curScaleName, PutTitle(groupTitle) )>0;
- rc &= WriteSegs( f, tempSegs_da.cnt, &tempSegs(0) );
+ rc &= WriteSegs( f, trackSegs_da.cnt, &trackSegs(0) );
+ SetUserLocale();
}
if ( groupReplace ) {
UndoStart( _("Group Tracks"), "group" );
@@ -1675,16 +1658,16 @@ groupSimpleTurnout:
trackCount--;
}
}
+ SelectRecount();
orig.x = - orig.x;
orig.y = - orig.y;
- trk = NewCompound( T_STRUCTURE, 0, orig, 0.0, groupTitle, 0, NULL, NULL, 0, "", tempSegs_da.cnt, &tempSegs(0) );
+ trk = NewCompound( T_STRUCTURE, 0, orig, 0.0, groupTitle, 0, NULL, NULL, trackSegs_da.cnt, &trackSegs(0) );
SetTrkVisible( trk, TRUE );
DrawNewTrack( trk );
EnableCommands();
}
}
if (f) fclose(f);
- RestoreLocale(oldLocale);
DoChangeNotification( CHANGE_PARAMS );
wHide( groupW );
wDrawDelayUpdate( mainD.d, FALSE );
@@ -1693,10 +1676,10 @@ groupSimpleTurnout:
}
-EXPORT void DoGroup( void )
+EXPORT void DoGroup( void * unused )
{
track_p trk = NULL;
- struct extraData *xx;
+ struct extraDataCompound_t *xx;
TRKTYP_T trkType;
xx = NULL;
groupSegCnt = 0;
@@ -1705,14 +1688,17 @@ EXPORT void DoGroup( void )
groupOriginY = 0.0;
BOOL_T isTurnout = FALSE;
+ groupNoCombine = FALSE;
while ( TrackIterate( &trk ) ) {
if ( GetTrkSelected( trk ) ) {
trkType = GetTrkType(trk);
if ( IsTrack(trk) ) isTurnout = TRUE;
if ( trkType == T_TURNOUT || trkType == T_STRUCTURE ) {
- xx = GetTrkExtraData(trk);
+ xx = GET_EXTRA_DATA(trk, trkType, extraDataCompound_t);
groupSegCnt += xx->segCnt;
GroupCopyTitle( xtitle(xx) );
+ if ( trkType == T_TURNOUT && GetTrkEndPtCnt(trk) > 2 && xx->pathNoCombine != 0 )
+ groupNoCombine = TRUE;
} else
groupSegCnt += 1;
}