From b623f5953691b2a0614e6f1f4def86bdbb9a4113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Sat, 8 Aug 2020 11:53:00 +0200 Subject: New upstream version 5.2.0Beta2.1 --- app/bin/cgroup.c | 495 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 309 insertions(+), 186 deletions(-) (limited to 'app/bin/cgroup.c') diff --git a/app/bin/cgroup.c b/app/bin/cgroup.c index 0094564..1183e76 100644 --- a/app/bin/cgroup.c +++ b/app/bin/cgroup.c @@ -472,11 +472,12 @@ 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), pathPtr_da.cnt, &pathPtr(0), tempSegs_da.cnt, &tempSegs(0) ); + 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); xx1->ungrouped = TRUE; SetTrkVisible( trk1, TRUE ); + SetTrkNoTies( trk1, FALSE ); SetTrkBits( trk1, TB_SELECTED ); for ( segInx=0; segInxpaths; - pos1 = GetTrkEndPos(trk,ep1); - Rotate( &pos1, xx->orig, -xx->angle ); - pos1.x -= xx->orig.x; - pos1.y -= xx->orig.y; - pos2 = GetTrkEndPos(trk,ep2); - Rotate( &pos2, xx->orig, -xx->angle ); - pos2.x -= xx->orig.x; - pos2.y -= xx->orig.y; + trkPos[0] = GetTrkEndPos(trk,ep1); + Rotate( &trkPos[0], xx->orig, -xx->angle ); + trkPos[0].x -= xx->orig.x; + trkPos[0].y -= xx->orig.y; + trkPos[1] = GetTrkEndPos(trk,ep2); + Rotate( &trkPos[1], xx->orig, -xx->angle ); + trkPos[1].x -= xx->orig.x; + trkPos[1].y -= xx->orig.y; + DIST_T dist = 1000.0; + char * path = NULL; + char * pName = "Not Found"; while ( cp[0] ) { - cp += strlen(cp)+1; //Ignore Path Name + char * pName1 = cp; // Save path name + cp += strlen(cp)+1; while ( cp[0] ) { - cp0 = cp; - epN = -1; + int segInx; + int segEP; + coOrd segPos[2]; + // Check if this sub-path endpts match the requested endpts + char * path1 = cp; + + // get the seg indices for the start and end GetSegInxEP( cp[0], &segInx, &segEP ); - if ( CheckTurnoutEndPoint( &xx->segs[segInx], pos1, segEP ) ) - epN = 1; - else if ( CheckTurnoutEndPoint( &xx->segs[segInx], pos2, segEP ) ) - epN = 0; + segPos[0] = GetSegEndPt( &xx->segs[segInx], segEP, FALSE, NULL ); cp += strlen(cp); - if ( epN != -1 ) { - GetSegInxEP( cp[-1], &segInx, &segEP ); - if ( CheckTurnoutEndPoint( &xx->segs[segInx], epN==0?pos1:pos2, 1-segEP ) ) { - *flip = epN==0; // If its reversed, set up to be flipped or noted - return cp0; //Found path between EPs + GetSegInxEP( cp[-1], &segInx, &segEP ); + segPos[1] = GetSegEndPt( &xx->segs[segInx], 1-segEP, FALSE, NULL ); + + // Find the closest seg end + for ( int inx = 0; inx<2; inx++ ) { + // Check 1st end + DIST_T dist1 = FindDistance( trkPos[0], segPos[inx] ); + if ( dist1 < connectDistance && dist1 < dist ) { + // Closest so far, Check 2nd end + DIST_T dist2 = FindDistance( trkPos[1], segPos[1-inx] ); + if ( dist2 > dist1 ) + // 2nd end is further away + dist1 = dist2; + if ( dist1 < connectDistance && dist1 < dist ) { + // both ends are closest + dist = dist1; + path = path1; + pName = pName1; + *flip = (inx==1); + } } } cp++; } cp++; } - return NULL; +LOG( log_group, 3, (" %s: %d..%d Flip:%s\n", pName, path?path[0]:-1, path?path[strlen(path)-1]:-1, *flip?"T":"F" ) ); + return path; } @@ -754,7 +779,7 @@ static int GroupShortestPathFunc( return -1; case SPTC_ADD_TRK: -if (log_shortPath<=0||logTable(log_shortPath).level<4) LOG( log_group, 2, ( " T%d[%d]\n", GetTrkIndex(trk), ep2 ) ) + LOG( log_group, 4, ( " Add T%d[%d]\n", GetTrkIndex(trk), ep2 ) ) DYNARR_APPEND( pathElem_t, pathElem_da, 10 ); ppp = &pathElem(pathElem_da.cnt-1); for ( inx=0; inxep1 == ep1 || pp->ep2 == ep1 ) ) && ( ep2 < 0 || ( pp->ep1 == ep2 || pp->ep2 == ep2 ) ) ) { -LOG( log_group, 2, ( " Remove: duplicate path P%d\n", inx ) ) +LOG( log_group, 4, ( " Remove: duplicate path P%d\n", inx ) ) pathElem_da.cnt = pathElemStart; return 0; } @@ -814,7 +839,7 @@ LOG( log_group, 2, ( " Remove: duplicate path P%d\n", inx ) ) pp->ep1 = ep1; pp->ep2 = ep2; pathElemStart = pathElem_da.cnt; -LOG( log_group, 2, ( " Keep\n" ) ) +LOG( log_group, 4, ( " Keep\n" ) ) return 0; case SPTC_IGNNXTTRK: @@ -917,6 +942,87 @@ 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) + +static void LogSeg( + trkSeg_p segP ) +{ + if ( segP == NULL ) { + LogPrintf( "\n" ); + return; + } + LogPrintf( "%c: ", segP->type ); + switch ( segP->type ) { + case SEG_STRTRK: + case SEG_STRLIN: + case SEG_DIMLIN: + case SEG_BENCH: + case SEG_TBLEDGE: + LogPrintf( "[ %0.3f %0.3f ] [ %0.3f %0.3f ]\n", + segP->u.l.pos[0].x, segP->u.l.pos[0].y, + segP->u.l.pos[1].x, segP->u.l.pos[1].y ); + break; + case SEG_CRVLIN: + case SEG_CRVTRK: + LogPrintf( "R:%0.3f [ %0.3f %0.3f } A0:%0.3f A1:%0.3f\n", + segP->u.c.radius, + segP->u.c.center.x, segP->u.c.center.y, + segP->u.c.a0, segP->u.c.a1 ); + break; + default: + 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 all segs to segInMap[] + * - if no track segments goto step 9 + * 2 - Collect boundary endPts and sort them in tempEndPts[] + * 3 - Find shortest path between all endPts (if it exists) + * - For each track we add to the shortest path tree + * capture the sub-path elements (FindPathBtwEP) in pathElem[] + * 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 + * 8 - Build segment list, adjust endPts in tempEndPts[] + * 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 ) { @@ -925,7 +1031,6 @@ static void GroupOk( void * junk ) int inx; EPINX_T ep, epCnt, epN; coOrd orig, size; - long oldOptions; FILE * f = NULL; BOOL_T rc = TRUE; track_p trk, trk1; @@ -937,17 +1042,7 @@ static void GroupOk( void * junk ) ANGLE_T angle, angleN; pathElem_t pathElemTemp; char * cp=NULL; -#ifdef SEGMAP - pathElem_p ppp1, ppp2; - int segInx1, segInx2; - coOrd pos1, pos2; - static dynArr_t segMap_da; -#define segMap(I,J) DYNARR_N( char, segMap_da, (2*(I)+0)*trackSegs_da.cnt+(J) ) -#define segAcc(I,J) DYNARR_N( char, segMap_da, (2*(I)+1)*trackSegs_da.cnt+(J) ) -#define segSum(I,J) DYNARR_N( char, segMap_da, (2*(groupTrk_da.cnt)+0)*trackSegs_da.cnt+(J) ) -#endif - static dynArr_t trackSegs_da; -#define trackSegs(N) DYNARR_N( trkSeg_t, trackSegs_da, N ) + trkSeg_p segPtr; int segCnt; static dynArr_t conflictMap_da; @@ -965,9 +1060,6 @@ static void GroupOk( void * junk ) signed char pathChar; char *oldLocale = NULL; -#ifdef SEGMAP - DYNARR_RESET( char, segMap_da ); -#endif DYNARR_RESET( trkSeg_t, trackSegs_da ); DYNARR_RESET( trkSeg_t, tempSegs_da ); DYNARR_RESET( groupTrk_t, groupTrk_da ); @@ -976,6 +1068,8 @@ 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 ); @@ -991,9 +1085,10 @@ static void GroupOk( void * junk ) wDrawDelayUpdate( mainD.d, TRUE ); /* - * Collect tracks + * 1: Collect tracks */ trk = NULL; + int InInx = -1; while ( TrackIterate( &trk ) ) { if ( GetTrkSelected( trk ) ) { if ( IsTrack(trk) ) { @@ -1008,41 +1103,82 @@ static void GroupOk( void * junk ) 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); + GetBezierSegmentFromTrack(trk,segPtr); + + AddToSegMap(trackSegs_da.cnt-1,TRUE); // Add Single Bezier Track + } else if (GetTrkType(trk) == T_CORNU) { - GetBezierSegmentsFromCornu(trk,&trackSegs_da); //Only give back Bezier - cant be undone + + int start = trackSegs_da.cnt; + + GetBezierSegmentsFromCornu(trk,&trackSegs_da,TRUE); //Only give back Bezier - cant be undone + + AddSegsToSegMap(start,trackSegs_da.cnt-1,TRUE); /* Add Multiple Track Segs */ + } else { segCnt = tempSegs_da.cnt; - oldOptions = groupD.options; - groupD.options |= (DC_QUICK|DC_SIMPLE|DC_SEGTRACK); DrawTrack( trk, &groupD, wDrawColorBlack ); - groupD.options = oldOptions; 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; } + tempSegs_da.cnt = segCnt; } groupP->segEnd = trackSegs_da.cnt-1; } else { + int start = tempSegs_da.cnt; + DrawTrack( trk, &groupD, wDrawColorBlack ); + + AddSegsToSegMap(start,tempSegs_da.cnt-1,FALSE); /* Multiple Non-Track Segs */ } } } +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) ); + } + 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; inx0 ) { if ( groupTrk_da.cnt > 128 ) { @@ -1084,6 +1220,17 @@ static void GroupOk( void * junk ) } } } +if ( log_group >= 1 && logTable(log_group).level >= 4 ) { + LogPrintf( "EndPts:\n" ); + for ( int inx=0; inxpos.x, endPtP->pos.y, endPtP->angle, endPtP->track?GetTrkIndex(endPtP->track):-1, endPtP->index ); + } +} + /* + * 2: Collect EndPts + */ if ( tempEndPts_da.cnt <= 0 ) { NoticeMessage( _("No endpts"), _("Ok"), NULL ); wDrawDelayUpdate( mainD.d, FALSE ); @@ -1140,10 +1287,7 @@ static void GroupOk( void * junk ) qsort( tempEndPts_da.ptr, tempEndPts_da.cnt, sizeof *endPtP, CmpEndPtAngle ); if ( NormalizeAngle( tempEndPts(0).angle - tempEndPts(tempEndPts_da.cnt-1).angle ) > NormalizeAngle( tempEndPts(1).angle - tempEndPts(0).angle ) ) { -#ifdef LATER - if ( endPtAngle-FindAngle(endPtOrig,tempEndPts(tempEndPts_da.cnt-1).pos) > - FindAngle(endPtOrig,tempEndPts(1).pos)-endPtAngle ) { -#endif + for ( ep=1; ep<(tempEndPts_da.cnt+1)/2; ep++ ) { trkEndPt_t tempEndPt; tempEndPt = tempEndPts(ep); @@ -1151,9 +1295,17 @@ static void GroupOk( void * junk ) tempEndPts(tempEndPts_da.cnt-ep) = tempEndPt; } } +if ( log_group >= 1 && logTable(log_group).level >= 3 ) { + LogPrintf( "Sorted EndPts:\n" ); + for ( int inx=0; inxpos.x, endPtP->pos.y, endPtP->angle, endPtP->track?GetTrkIndex(endPtP->track):-1, endPtP->index ); + } +} /* - * Find shortest Paths + * 3: Find shortest Paths */ for ( inx=0; inx= 1 && logTable(log_group).level >= 3 ) { + LogPrintf( "Shortest path:\n Group Tracks\n" ); + for ( int inx=0; inxtrk ), gtp->segStart+1, gtp->segEnd+1 ); + } + LogPrintf( " Path Elem\n" ); + for ( int inx=0; inxgroupInx, ppp->ep1, ppp->ep2, ppp->flip?"T":"F" ); + for ( PATHPTR_T cp = ppp->path; cp[0] || cp[1]; cp++ ) { + LogPrintf( " %d", *cp ); + } + LogPrintf( " 0\n" ); + } + LogPrintf( " Path\n" ); + for ( int inx=0; inxpathElemStart, pp->pathElemEnd, pp->ep1, pp->ep2, + pp->conflicts, pp->inGroup?"T":"F", pp->done?"T":"F" ); + } +} /* - * Flip paths so they align + * 4: Flip paths so they align */ if ( path_da.cnt == 0 ) { NoticeMessage( _("No paths"), _("Ok"), NULL ); @@ -1226,11 +1402,11 @@ LOG( log_group, 1, ( "P%d aligns flipped with P%d\n", pinx, pinx2 ) ); path(inx).done = TRUE; } } -if ( log_group >= 1 && logTable(log_group).level > log_group ) { +if ( log_group >= 1 && logTable(log_group).level >= 1 ) { LogPrintf( "Group Paths\n" ); for ( pinx=0; pinxep1, pp->ep2 ); + LogPrintf( " P%2d:%d.%d ", pinx, pp->ep1, pp->ep2 ); for ( pinx2=pp->pathElemEnd; pinx2>=pp->pathElemStart; pinx2-- ) { ppp = &pathElem(pinx2); LogPrintf( " %sT%d:%d.%d", ppp->flip?"-":"", GetTrkIndex(groupTrk(ppp->groupInx).trk), ppp->ep1, ppp->ep2 ); @@ -1239,62 +1415,9 @@ if ( log_group >= 1 && logTable(log_group).level > log_group ) { } } -#ifdef SEGMAP - DYNARR_SET( char, segMap_da, 2 * trackSegs_da.cnt * path_da.cnt + 2 ); - memset( segMap_da.ptr, 0, segMap_da.max * sizeof segMap(0,0) ); - for ( inx=0; inxpathElem_da.cnt-1; inx2>=0; inx2-- ) { - ppp = &pathElem(pp->pathElemStart+inx2); - groupP = &groupTrk(ppp->groupInx); - if ( GetTrkEndPtCnt(groupP->trk) == 2 ) { - segMap(inx,groupP->segStart) = 1; - continue; - } - cp = ppp->path; - if ( cp == NULL ) - continue; - segInx1 = cp[0]-1; - for ( ; *cp; cp++ ) - segMap(inx,groupP->segInx+cp[0]-1) = 1; - segInx2 = cp[-1]-1; - pos1 = GetSegEndPt( &trackSegs(groupP->segInx+segInx1), ppp->flip?1:0, FALSE, NULL ); - pos2 = GetSegEndPt( &trackSegs(groupP->segInx+segInx2), ppp->flip?0:1, FALSE, NULL ); - for ( inx3=0; inx3segCnt; inx3++ ) { - if ( inx3 == segInx1 || inx3 == segInx2 ) continue; - if ( segMap(inx,groupP->segInx+inx3) != 0 ) continue; - if ( CheckTurnoutEndPoint( &trackSegs(groupP->segInx+inx3), pos1, 0 ) ) - segMap(inx,inx3) = 2; - else if ( CheckTurnoutEndPoint( &trackSegs(groupP->segInx+inx3), pos2, 0 ) ) - segMap(inx,groupP->segInx+inx3) = 2; - } - } - } -if ( log_group >= 1 && logTable(log_group).level > log_group ) { - LogPrintf( "Path to Segment Map\n "); - for ( inx=0; inxtrk) ); - for ( inx2=1; inx2segCnt; inx2++ ) LogPrintf( "--" ); - } - LogPrintf( "\n " ); - for ( inx=0; inxsegCnt; inx2++ ) - LogPrintf( "%2d", inx2+1 ); - } - LogPrintf( "\n" ); - for ( inx=0; inx= 1 && logTable(log_group).level > log_group ) { } } -if ( log_group >= 1 && logTable(log_group).level > log_group ) { +if ( log_group >= 1 && logTable(log_group).level >= 3 ) { LogPrintf( "Group Map\n"); for ( pinx=0; pinx= 0; ginx++ ) - LogPrintf( " %d", groupMap(pinx,ginx) ); + LogPrintf( " %d: %d", ginx, groupMap(pinx,ginx) ); LogPrintf( "\n" ); } } -#ifdef SEGMAP - for ( inx=0; inxgroupInx < 0 ) continue; - for ( inx2=0; inx2= 1 && logTable(log_group).level > log_group ) { /* * Flip each segment that is used as flipped more than not */ +LOG( log_group, 3, ( "Flipping Segments:" ) ); for ( pinx=0; pinx= 0; ginx++ ) { pp = &path(groupMap(pinx,ginx)); + LOG( log_group, 3, (" Group Map(%d, %d): elem %d-%d, EP %d %d, Conflicts %d, inGrp %d, Done: %s\n", pinx, ginx, pp->pathElemStart, pp->pathElemEnd, pp->ep1, pp->ep2, pp->conflicts, pp->inGroup, pp->done?"T":"F" ) ); for ( pinx2=pp->pathElemEnd; pinx2>=pp->pathElemStart; pinx2-- ) { 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; flip = ppp->flip; @@ -1453,7 +1556,9 @@ LOG( log_group, 1, ( "Flipping Segment %d\n", pinx+1 ) ); if ( flip1 ) pathChar = - pathChar; pathPtr(pathPtr_da.cnt-1) = pathChar; path += (flip?-1:1); + LOG( log_group, 3, (" %d", pathChar ) ); } + LOG( log_group, 3, ("\n") ); } DYNARR_APPEND( char, pathPtr_da, 10 ); pathPtr(pathPtr_da.cnt-1) = 0; @@ -1468,43 +1573,49 @@ LOG( log_group, 1, ( "Flipping Segment %d\n", pinx+1 ) ); groupSimpleTurnout: /* - * Copy and Reorigin Segments + * 8: Copy and Reorigin Segments - Start by putting them out in the original order */ - if ( tempSegs_da.cnt > 0 ) { - inx = trackSegs_da.cnt; - DYNARR_SET( trkSeg_t, trackSegs_da, trackSegs_da.cnt+tempSegs_da.cnt ); - memcpy( &trackSegs(inx), tempSegs_da.ptr, tempSegs_da.cnt*sizeof trackSegs(0) ); - CloneFilledDraw( tempSegs_da.cnt, &trackSegs(inx), TRUE ); + + + DYNARR_RESET(trkSeg_t, outputSegs_da); + for (int i=0; icustomInfo = xx->customInfo; -#endif f = OpenCustom("a"); if (f && to) { oldLocale = SaveLocale("C"); rc &= fprintf( f, "TURNOUT %s \"%s\"\n", curScaleName, PutTitle(to->title) )>0; -#ifdef LATER - if ( to->customInfo ) - rc &= fprintf( f, "\tU %s\n", to->customInfo )>0; -#endif - rc &= WriteCompoundPathsEndPtsSegs( f, path, trackSegs_da.cnt, &trackSegs(0), tempEndPts_da.cnt, &tempEndPts(0) ); + rc &= WriteCompoundPathsEndPtsSegs( f, path, outputSegs_da.cnt, &outputSegs(0), tempEndPts_da.cnt, &tempEndPts(0) ); } if ( groupReplace ) { + /* + * 11: Replace defn + */ UndoStart( _("Group Tracks"), "group" ); orig.x = - orig.x; orig.y = - orig.y; @@ -1528,8 +1639,7 @@ groupSimpleTurnout: trackCount--; } } - trk = NewCompound( T_TURNOUT, 0, orig, 0.0, to->title, tempEndPts_da.cnt, &tempEndPts(0), pathLen, (char *)path, trackSegs_da.cnt, &trackSegs(0) ); - SetTrkVisible( trk, TRUE ); + trk = NewCompound( T_TURNOUT, 0, orig, 0.0, to->title, tempEndPts_da.cnt, &tempEndPts(0), NULL, pathLen, (char *)path, outputSegs_da.cnt, &outputSegs(0) ); SetTrkVisible( trk, TRUE ); for ( ep=0; ep0; -#ifdef LATER - if ( to->customInfo ) - rc &= fprintf( f, "\tU %s\n", to->customInfo )>0; -#endif rc &= WriteSegs( f, tempSegs_da.cnt, &tempSegs(0) ); } if ( groupReplace ) { @@ -1570,7 +1677,7 @@ groupSimpleTurnout: } orig.x = - orig.x; orig.y = - orig.y; - trk = NewCompound( T_STRUCTURE, 0, orig, 0.0, groupTitle, 0, NULL, 0, "", tempSegs_da.cnt, &tempSegs(0) ); + trk = NewCompound( T_STRUCTURE, 0, orig, 0.0, groupTitle, 0, NULL, NULL, 0, "", tempSegs_da.cnt, &tempSegs(0) ); SetTrkVisible( trk, TRUE ); DrawNewTrack( trk ); EnableCommands(); @@ -1594,10 +1701,14 @@ EXPORT void DoGroup( void ) xx = NULL; groupSegCnt = 0; groupCompoundCount = 0; + groupOriginX = 0.0; + groupOriginY = 0.0; + BOOL_T isTurnout = 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); groupSegCnt += xx->segCnt; @@ -1618,6 +1729,18 @@ EXPORT void DoGroup( void ) groupW = ParamCreateDialog( &groupPG, MakeWindowTitle(_("Group Objects")), _("Ok"), GroupOk, wHide, TRUE, NULL, F_BLOCK, NULL ); groupD.dpi = mainD.dpi; } + if (isTurnout) { + groupPLs[4].option |= PDO_DLGIGNORE; + wControlShow( groupPLs[4].control, FALSE ); + groupPLs[5].option |= PDO_DLGIGNORE; + wControlShow( groupPLs[5].control, FALSE ); + } else { + groupPLs[4].option &= ~PDO_DLGIGNORE; + wControlShow( groupPLs[4].control, TRUE ); + groupPLs[5].option &= ~PDO_DLGIGNORE; + wControlShow( groupPLs[5].control, TRUE ); + } + ParamLoadControls( &groupPG ); wShow( groupW ); } -- cgit v1.2.3