diff options
Diffstat (limited to 'app/bin/track.h')
-rw-r--r-- | app/bin/track.h | 600 |
1 files changed, 201 insertions, 399 deletions
diff --git a/app/bin/track.h b/app/bin/track.h index 32626c5..fdc7909 100644 --- a/app/bin/track.h +++ b/app/bin/track.h @@ -1,5 +1,5 @@ /** \file track.h - * + * */ /* XTrkCad - Model Railroad CAD @@ -17,24 +17,36 @@ * * 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 */ #ifndef TRACK_H #define TRACK_H #include "common.h" +#include "trkseg.h" + extern TRKTYP_T T_NOTRACK; +extern TRKTYP_T T_TURNOUT; +extern TRKTYP_T T_STRUCTURE; +extern TRKTYP_T T_BEZIER; +extern TRKTYP_T T_BZRLIN; +extern TRKTYP_T T_CORNU; struct track_t ; typedef struct track_t * track_p; typedef struct track_t * track_cp; -extern track_p tempTrack; extern wIndex_t trackCount; +extern DIST_T trackGauge; +extern DIST_T minLength; +extern DIST_T connectDistance; +extern ANGLE_T connectAngle; +extern long twoRailScale; extern wBool_t bFreeTrack; extern long colorTrack; extern long colorDraw; + extern long drawTunnel; extern long drawEndPtV; extern long drawUnconnectedEndPt; @@ -55,8 +67,8 @@ extern wDrawColor exceptionColor; #define TIEDRAWMODE_SOLID (2) extern long tieDrawMode; extern wDrawColor tieColor; - - +extern wDrawColor bridgeColor; +extern wDrawColor roadbedColor; extern TRKINX_T max_index; typedef signed char * PATHPTR_T; @@ -78,29 +90,29 @@ typedef enum { curveTypeNone, curveTypeCurve, curveTypeStraight, curveTypeBezier #define PARAMS_LINE (7) //Called on Lines typedef struct { - curveType_e type; //Straight, Curve, Bezier, Cornu - EPINX_T ep; //End point that is nearby pos - dynArr_t nodes; //Array of nodes -> PARAMS_PARALLEL only - DIST_T len; //Length of track - ANGLE_T angle; //Angle at end of track - coOrd lineOrig; //Start of straight - coOrd lineEnd; //End of Straight (or zero for Turnout) - coOrd arcP; //center or zero - DIST_T arcR; //radius or zero - ANGLE_T arcA0, arcA1; //Start angle and angular length (clockwise) - long helixTurns; - ANGLE_T track_angle; - BOOL_T circleOrHelix; //Track is circle or Helix - coOrd bezierPoints[4]; //Bezier Ends and CPs - coOrd cornuEnd[2]; //Cornu Ends - ANGLE_T cornuAngle[2]; //Angle at Cornu Ends - DIST_T cornuRadius[2]; //Radius at Cornu Ends - coOrd cornuCenter[2]; //Center at Cornu Ends - coOrd ttcenter; //Turntable - DIST_T ttradius; //Turntable - coOrd centroid; //Turnout - - } trackParams_t; + curveType_e type; //Straight, Curve, Bezier, Cornu + EPINX_T ep; //End point that is nearby pos + dynArr_t nodes; //Array of nodes -> PARAMS_PARALLEL only + DIST_T len; //Length of track + ANGLE_T angle; //Angle at end of track + coOrd lineOrig; //Start of straight + coOrd lineEnd; //End of Straight (or zero for Turnout) + coOrd arcP; //center or zero + DIST_T arcR; //radius or zero + ANGLE_T arcA0, arcA1; //Start angle and angular length (clockwise) + long helixTurns; + ANGLE_T track_angle; + BOOL_T circleOrHelix; //Track is circle or Helix + coOrd bezierPoints[4]; //Bezier Ends and CPs + coOrd cornuEnd[2]; //Cornu Ends + ANGLE_T cornuAngle[2]; //Angle at Cornu Ends + DIST_T cornuRadius[2]; //Radius at Cornu Ends + coOrd cornuCenter[2]; //Center at Cornu Ends + coOrd ttcenter; //Turntable + DIST_T ttradius; //Turntable + coOrd centroid; //Turnout + +} trackParams_t; #define Q_CANNOT_BE_ON_END (1) #define Q_IGNORE_EASEMENT_ON_EXTEND (2) @@ -135,293 +147,65 @@ typedef struct { #define Q_GET_NODES (32) typedef struct traverseTrack_t { - track_p trk; // IN Current Track OUT Next Track - DIST_T length; // IN How far to go - DIST_T dist; // OUT how far left = 0 if found - coOrd pos; // IN/OUT - where we are, where we will be // IN/OUT - where we are now - ANGLE_T angle; // IN/OUT - angle now - } traverseTrack_t; + track_p trk; // IN Current Track OUT Next Track + DIST_T length; // IN How far to go + DIST_T dist; // OUT how far left = 0 if found + coOrd pos; // IN/OUT - where we are, where we will be // IN/OUT - where we are now + ANGLE_T angle; // IN/OUT - angle now +} traverseTrack_t; typedef struct traverseTrack_t *traverseTrack_p; typedef struct { - char * name; - void (*draw)( track_p, drawCmd_p, wDrawColor ); - DIST_T (*distance)( track_p, coOrd * ); - void (*describe)( track_p, char * line, CSIZE_T len ); - void (*deleteTrk)( track_p ); - BOOL_T (*write)( track_p, FILE * ); - BOOL_T (*read)( char * ); - void (*move)( track_p, coOrd ); - void (*rotate)( track_p, coOrd, ANGLE_T ); - void (*rescale)( track_p, FLOAT_T ); - BOOL_T (*audit)( track_p, char * ); - ANGLE_T (*getAngle)( track_p, coOrd, EPINX_T *, EPINX_T * ); - BOOL_T (*split)( track_p, coOrd, EPINX_T, track_p *, EPINX_T *, EPINX_T * ); - BOOL_T (*traverse)( traverseTrack_p, DIST_T * ); - BOOL_T (*enumerate)( track_p ); - void (*redraw)( void ); - BOOL_T (*trim)( track_p, EPINX_T, DIST_T, coOrd endpos, ANGLE_T angle, DIST_T endradius, coOrd endcenter ); - BOOL_T (*merge)( track_p, EPINX_T, track_p, EPINX_T ); - STATUS_T (*modify)( track_p, wAction_t, coOrd ); - DIST_T (*getLength)( track_p ); - BOOL_T (*getTrackParams)( int, track_p, coOrd pos, trackParams_t * ); - BOOL_T (*moveEndPt)( track_p *, EPINX_T *, coOrd, DIST_T ); - BOOL_T (*query)( track_p, int ); - void (*ungroup)( track_p ); - void (*flip)( track_p, coOrd, ANGLE_T ); - void (*drawPositionIndicator)( track_p, wDrawColor ); - void (*advancePositionIndicator)( track_p, coOrd, coOrd *, ANGLE_T * ); - BOOL_T (*checkTraverse)( track_p, coOrd ); - BOOL_T (*makeParallel)( track_p, coOrd, DIST_T, DIST_T, track_p *, coOrd *, coOrd *, BOOL_T ); - void (*drawDesc)( track_p, drawCmd_p, wDrawColor ); - BOOL_T (*rebuildSegs)(track_p); - BOOL_T (*replayData)(track_p, void *,long ); - BOOL_T (*storeData)(track_p, void **,long *); - void (*activate)(track_p); - wBool_t (*compare)( track_cp, track_cp ); - } trackCmd_t; + char * name; + void (*draw)( track_p, drawCmd_p, wDrawColor ); + DIST_T (*distance)( track_p, coOrd * ); + void (*describe)( track_p, char * line, CSIZE_T len ); + void (*deleteTrk)( track_p ); + BOOL_T (*write)( track_p, FILE * ); + BOOL_T (*read)( char * ); + void (*move)( track_p, coOrd ); + void (*rotate)( track_p, coOrd, ANGLE_T ); + void (*rescale)( track_p, FLOAT_T ); + BOOL_T (*audit)( track_p, char * ); + ANGLE_T (*getAngle)( track_p, coOrd, EPINX_T *, EPINX_T * ); + BOOL_T (*split)( track_p, coOrd, EPINX_T, track_p *, EPINX_T *, EPINX_T * ); + BOOL_T (*traverse)( traverseTrack_p, DIST_T * ); + BOOL_T (*enumerate)( track_p ); + void (*redraw)( void ); + BOOL_T (*trim)( track_p, EPINX_T, DIST_T, coOrd endpos, ANGLE_T angle, + DIST_T endradius, coOrd endcenter ); + BOOL_T (*merge)( track_p, EPINX_T, track_p, EPINX_T ); + STATUS_T (*modify)( track_p, wAction_t, coOrd ); + DIST_T (*getLength)( track_p ); + BOOL_T (*getTrackParams)( int, track_p, coOrd pos, trackParams_t * ); + BOOL_T (*moveEndPt)( track_p *, EPINX_T *, coOrd, DIST_T ); + BOOL_T (*query)( track_p, int ); + void (*ungroup)( track_p ); + void (*flip)( track_p, coOrd, ANGLE_T ); + void (*drawPositionIndicator)( track_p, wDrawColor ); + void (*advancePositionIndicator)( track_p, coOrd, coOrd *, ANGLE_T * ); + BOOL_T (*checkTraverse)( track_p, coOrd ); + BOOL_T (*makeParallel)( track_p, coOrd, DIST_T, DIST_T, track_p *, coOrd *, + coOrd *, BOOL_T ); + void (*drawDesc)( track_p, drawCmd_p, wDrawColor ); + BOOL_T (*rebuildSegs)(track_p); + BOOL_T (*replayData)(track_p, void *,long ); + BOOL_T (*storeData)(track_p, void **,long *); + void (*activate)(track_p); + wBool_t (*compare)( track_cp, track_cp ); +} trackCmd_t; #define NOELEV (-10000.0) typedef enum { ELEV_NONE, ELEV_DEF, ELEV_COMP, ELEV_GRADE, ELEV_IGNORE, ELEV_STATION } elevMode_e; #define ELEV_MASK 0x07 #define ELEV_VISIBLE 0x08 -typedef struct { - int option; - coOrd doff; - union { - DIST_T height; - char * name; - } u; - BOOL_T cacheSet; - double cachedElev; - double cachedGrade; - } elev_t; #define EPOPT_GAPPED (1L<<0) -typedef struct trkEndPt_t { - coOrd pos; - ANGLE_T angle; - TRKINX_T index; - track_p track; - elev_t elev; - long option; - } trkEndPt_t; + +struct trkEndPt_t; typedef struct trkEndPt_t * trkEndPt_p; -extern dynArr_t tempEndPts_da; -#define tempEndPts(N) DYNARR_N( trkEndPt_t, tempEndPts_da, N ) - -typedef enum { FREEFORM, RECTANGLE, POLYLINE -} PolyType_e; - - -typedef struct trkSeg_t { - char type; - wDrawColor color; - DIST_T width; - dynArr_t bezSegs; //placed here to avoid overwrites - union { - struct { - coOrd pos[4]; - ANGLE_T angle; - long option; - } l; - struct { - coOrd pos[4]; - ANGLE_T angle0; - ANGLE_T angle3; - DIST_T minRadius; - DIST_T radius0; - DIST_T radius3; - DIST_T length; - } b; - struct { - coOrd center; - ANGLE_T a0, a1; - DIST_T radius; - } c; - struct { - coOrd pos; - ANGLE_T angle; - DIST_T R, L; - DIST_T l0, l1; - unsigned int flip:1; - unsigned int negate:1; - unsigned int Scurve:1; - } j; - struct { - coOrd pos; - ANGLE_T angle; - wFont_p fontP; - FONTSIZE_T fontSize; - BOOL_T boxed; - char * string; - } t; - struct { - int cnt; - pts_t * pts; - coOrd orig; - ANGLE_T angle; - PolyType_e polyType; - } p; - } u; - } trkSeg_t; -typedef struct trkSeg_t * trkSeg_p; - -#define SEG_STRTRK ('S') -#define SEG_CRVTRK ('C') -#define SEG_BEZTRK ('W') -#define SEG_STRLIN ('L') -#define SEG_CRVLIN ('A') -#define SEG_BEZLIN ('H') -#define SEG_JNTTRK ('J') -#define SEG_FILCRCL ('G') -#define SEG_POLY ('Y') -#define SEG_FILPOLY ('F') -#define SEG_TEXT ('Z') -#define SEG_UNCEP ('E') -#define SEG_CONEP ('T') -#define SEG_PATH ('P') -#define SEG_SPEC ('X') -#define SEG_CUST ('U') -#define SEG_DOFF ('D') -#define SEG_BENCH ('B') -#define SEG_DIMLIN ('M') -#define SEG_TBLEDGE ('Q') - -#define IsSegTrack( S ) ( (S)->type == SEG_STRTRK || (S)->type == SEG_CRVTRK || (S)->type == SEG_JNTTRK || (S)->type == SEG_BEZTRK) - -extern dynArr_t tempSegs_da; - -#define tempSegs(N) DYNARR_N( trkSeg_t, tempSegs_da, N ) - -extern char tempSpecial[4096]; -extern char tempCustom[4096]; - -void ComputeCurvedSeg( - trkSeg_p s, - DIST_T radius, - coOrd p0, - coOrd p1 ); - -coOrd GetSegEndPt( - trkSeg_p segPtr, - EPINX_T ep, - BOOL_T bounds, - ANGLE_T * ); - -void GetTextBounds( coOrd, ANGLE_T, char *, FONTSIZE_T, coOrd *, coOrd * ); -void GetSegBounds( coOrd, ANGLE_T, wIndex_t, trkSeg_p, coOrd *, coOrd * ); -void MoveSegs( wIndex_t, trkSeg_p, coOrd ); -void RotateSegs( wIndex_t, trkSeg_p, coOrd, ANGLE_T ); -void FlipSegs( wIndex_t, trkSeg_p, coOrd, ANGLE_T ); -void RescaleSegs( wIndex_t, trkSeg_p, DIST_T, DIST_T, DIST_T ); -void CloneFilledDraw( wIndex_t, trkSeg_p, BOOL_T ); -void FreeFilledDraw( wIndex_t, trkSeg_p ); -DIST_T DistanceSegs( coOrd, ANGLE_T, wIndex_t, trkSeg_p, coOrd *, wIndex_t * ); -void DrawDimLine( drawCmd_p, coOrd, coOrd, char *, wFontSize_t, FLOAT_T, wDrawWidth, wDrawColor, long ); -void DrawSegs( - drawCmd_p d, - coOrd orig, - ANGLE_T angle, - trkSeg_p segPtr, - wIndex_t segCnt, - DIST_T trackGauge, - wDrawColor color ); -void DrawSegsO( - drawCmd_p d, - track_p trk, - coOrd orig, - ANGLE_T angle, - trkSeg_p segPtr, - wIndex_t segCnt, - DIST_T trackGauge, - wDrawColor color, - long options ); -ANGLE_T GetAngleSegs( wIndex_t, trkSeg_p, coOrd *, wIndex_t *, DIST_T *, BOOL_T *, wIndex_t *, BOOL_T * ); -void RecolorSegs( wIndex_t, trkSeg_p, wDrawColor ); - -BOOL_T ReadSegs( void ); -BOOL_T WriteSegs( FILE * f, wIndex_t segCnt, trkSeg_p segs ); -BOOL_T WriteSegsEnd(FILE * f, wIndex_t segCnt, trkSeg_p segs, BOOL_T writeEnd); -typedef union { - struct { - coOrd pos; /* IN the point to get to */ - ANGLE_T angle; /* IN is the angle that the object starts at (-ve for forwards) */ - DIST_T dist; /* OUT is how far it is along the track to get to pos*/ - BOOL_T backwards; /* OUT which way are we going? */ - BOOL_T reverse_seg; /* OUT the seg is backwards curve */ - BOOL_T negative; /* OUT the curve is negative */ - int BezSegInx; /* OUT for Bezier Seg - the segment we are on in Bezier */ - BOOL_T segs_backwards; /* OUT for Bezier Seg - the direction of the overall Bezier */ - } traverse1; // Find dist between pos and end of track that starts with angle set backwards - struct { - BOOL_T segDir; /* IN Direction to go in this seg*/ - int BezSegInx; /* IN for Bezier Seg which element to start with*/ - BOOL_T segs_backwards; /* IN for Bezier Seg which way to go down the array*/ - DIST_T dist; /* IN/OUT In = distance to go, Out = distance left */ - coOrd pos; /* OUT = point reached if dist = 0 */ - ANGLE_T angle; /* OUT = angle at point */ - } traverse2; //Return distance left (or 0) and angle and pos when going dist from segDir end - struct { - int first, last; /* IN */ - ANGLE_T side; - DIST_T roadbedWidth; - wDrawWidth rbw; - coOrd orig; - ANGLE_T angle; - wDrawColor color; - drawCmd_p d; - } drawRoadbedSide; - struct { - coOrd pos1; /* IN pos to find */ - DIST_T dd; /* OUT distance from nearest point in seg to input pos */ - } distance; - struct { - track_p trk; /* OUT */ - EPINX_T ep[2]; - } newTrack; - struct { - DIST_T length; /* OUT */ - } length; - struct { - coOrd pos; /* IN */ - DIST_T length[2]; /* OUT */ - trkSeg_t newSeg[2]; - } split; - struct { - coOrd pos; /* IN Pos to find nearest to - OUT found pos on curve*/ - ANGLE_T angle; /* OUT angle at pos - (-ve if backwards)*/ - BOOL_T negative_radius; /* OUT Radius <0? */ - BOOL_T backwards; /* OUT Seg is backwards */ - DIST_T radius; /* OUT radius at pos */ - coOrd center; /* OUT center of curvature at pos (0 = straight)*/ - int bezSegInx; /* OUT if a bezier proc, the index of the sub segment */ - } getAngle; // Get pos on seg nearest, angle at that (-ve for forwards) - } segProcData_t, *segProcData_p; -typedef enum { - SEGPROC_TRAVERSE1, - SEGPROC_TRAVERSE2, - SEGPROC_DRAWROADBEDSIDE, - SEGPROC_DISTANCE, - SEGPROC_FLIP, - SEGPROC_NEWTRACK, - SEGPROC_LENGTH, - SEGPROC_SPLIT, - SEGPROC_GETANGLE - } segProc_e; -void SegProc( segProc_e, trkSeg_p, segProcData_p ); -void StraightSegProc( segProc_e, trkSeg_p, segProcData_p ); -void CurveSegProc( segProc_e, trkSeg_p, segProcData_p ); -void JointSegProc( segProc_e, trkSeg_p, segProcData_p ); -void BezierSegProc( segProc_e, trkSeg_p, segProcData_p ); //Used in Cornu join -void CleanSegs( dynArr_t *); -void CopyPoly(trkSeg_p seg_p, wIndex_t segCnt); -wBool_t CompareSegs( trkSeg_p, int, trkSeg_p, int ); - -/* debug.c */ -void SetDebug( char * ); /*Remember to add bits to trackx.h if adding here */ @@ -435,46 +219,14 @@ void SetDebug( char * ); #define TB_CARATTACHED (1<<7) #define TB_NOTIES (1<<8) #define TB_BRIDGE (1<<9) -#define TB_SELREDRAW (1<<10) +#define TB_ROADBED (1<<10) +#define TB_SELREDRAW (1<<11) // Track has been undrawn, don't draw it on Redraw -#define TB_UNDRAWN (1<<11) -#define TB_DETAILDESC (1<<12) +#define TB_UNDRAWN (1<<12) +#define TB_DETAILDESC (1<<13) #define TB_TEMPBITS (TB_PROFILEPATH|TB_PROCESSED|TB_UNDRAWN) /* track.c */ -#ifdef FASTTRACK -#include "trackx.h" -#define GetTrkIndex( T ) ((T)->index) -#define GetTrkType( T ) ((T)->type) -#define GetTrkScale( T ) ((T)->scale) -#define SetTrkScale( T, S ) (T)->scale = ((char)(S)) -/*#define GetTrkSelected( T ) ((T)->bits&TB_SELECTED)*/ -/*#define GetTrkVisible( T ) ((T)->bits&TB_VISIBLE)*/ -/*#define SetTrkVisible( T, V ) ((V) ? (T)->bits |= TB_VISIBLE : (T)->bits &= !TB_VISIBLE)*/ -#define GetTrkLayer( T ) ((T)->layer) -#define SetBoundingBox( T, HI, LO ) \ - (T)->hi.x = (float)(HI).x; (T)->hi.y = (float)(HI).y; (T)->lo.x = (float)(LO).x; (T)->lo.x; (T)->lo.x = (float)(LO).y = (float)(LO).y -#define GetBoundingBox( T, HI, LO ) \ - (HI)->x = (POS_T)(T)->hi.x; (HI)->y = (POS_T)(T)->hi.y; (LO)->x = (POS_T)(T)->lo.x; (LO)->y = (POS_T)(T)->lo.y; -#define GetTrkEndPtCnt( T ) ((T)->endCnt) -#define SetTrkEndPoint( T, I, PP, AA ) \ - Assert((T)->endPt[I].track); \ - (T)->endPt[I].pos = PP; \ - (T)->endPt[I].angle = AA -#define GetTrkEndTrk( T, I ) ((T)->endPt[I].track) -#define GetTrkEndPos( T, I ) ((T)->endPt[I].pos) -#define GetTrkEndPosXY( T, I ) PutDim((T)->endPt[I].pos.x), PutDim((T)->endPt[I].pos.y) -#define GetTrkEndAngle( T, I ) ((T)->endPt[I].angle) -#define GetTrkEndOption( T, I ) ((T)->endPt[I].option) -#define SetTrkEndOption( T, I, O ) ((T)->endPt[I].option=O) -#define GetTrkExtraData( T, TT ) ((T)->extraData) -#define GetTrkWidth( T ) (int)((T)->width) -#define SetTrkWidth( T, W ) (T)->width = (unsigned int)(W) -#define GetTrkBits(T) ((T)?((T)->bits):0) -#define SetTrkBits(T,V) ((T)->bits|=(V)) -#define ClrTrkBits(T,V) ((T)->bits&=~(V)) -#define IsTrackDeleted(T) ((T)->deleted) -#else TRKINX_T GetTrkIndex( track_p ); TRKTYP_T GetTrkType( track_p ); SCALEINX_T GetTrkScale( track_p ); @@ -483,46 +235,40 @@ BOOL_T GetTrkSelected( track_p ); BOOL_T GetTrkVisible( track_p ); void SetTrkVisible( track_p, BOOL_T ); unsigned int GetTrkLayer( track_p ); +tieData_t GetTrkTieData(track_p); void SetBoundingBox( track_p, coOrd, coOrd ); void GetBoundingBox( track_p, coOrd*, coOrd* ); EPINX_T GetTrkEndPtCnt( track_p ); -void SetTrkEndPoint( track_p, EPINX_T, coOrd, ANGLE_T ); -track_p GetTrkEndTrk( track_p, EPINX_T ); -coOrd GetTrkEndPos( track_p, EPINX_T ); -#define GetTrkEndPosXY( trk, ep ) PutDim(GetTrkEndPos(trk,ep).x), PutDim(GetTrkEndPos(trk,ep).y) -ANGLE_T GetTrkEndAngle( track_p, EPINX_T ); -long GetTrkEndOption( track_p, EPINX_T ); -long SetTrkEndOption( track_p, EPINX_T, long ); +trkEndPt_p GetTrkEndPt( track_cp, EPINX_T ); struct extraDataBase_t * GetTrkExtraData( track_p, TRKTYP_T ); +void ResizeExtraData( track_p trk, CSIZE_T newSize ); int GetTrkWidth( track_p ); void SetTrkWidth( track_p, int ); int GetTrkBits( track_p ); int SetTrkBits( track_p, int ); int ClrTrkBits( track_p, int ); BOOL_T IsTrackDeleted( track_p ); -#endif +void TrackInsertLayer( int ); +void TrackDeleteLayer( int ); + +track_p GetFirstTrack(); +track_p GetNextTrack( track_p ); + +#define TRK_ITERATE(TRK) for (TRK=GetFirstTrack(); TRK!=NULL; TRK=GetNextTrack(TRK) ) if (!IsTrackDeleted(TRK)) + #define GetTrkSelected(T) (GetTrkBits(T)&TB_SELECTED) #define GetTrkVisible(T) (GetTrkBits(T)&TB_VISIBLE) #define GetTrkNoTies(T) (GetTrkBits(T)&TB_NOTIES) #define GetTrkBridge(T) ((T)?GetTrkBits(T)&TB_BRIDGE:0) +#define GetTrkRoadbed(T) ((T)?GetTrkBits(T)&TB_ROADBED:0) #define SetTrkVisible(T,V) ((V)?SetTrkBits(T,TB_VISIBLE):ClrTrkBits(T,TB_VISIBLE)) #define SetTrkNoTies(T,V) ((V)?SetTrkBits(T,TB_NOTIES):ClrTrkBits(T,TB_NOTIES)) #define SetTrkBridge(T,V) ((V)?SetTrkBits(T,TB_BRIDGE):ClrTrkBits(T,TB_BRIDGE)) +#define SetTrkRoadbed(T,V) ((V)?SetTrkBits(T,TB_ROADBED):ClrTrkBits(T,TB_ROADBED)) int ClrAllTrkBits( int ); int ClrAllTrkBitsRedraw( int, wBool_t ); -void GetTrkEndElev( track_p trk, EPINX_T e, int *option, DIST_T *height ); -void SetTrkEndElev( track_p, EPINX_T, int, DIST_T, char * ); -int GetTrkEndElevMode( track_p, EPINX_T ); -int GetTrkEndElevUnmaskedMode( track_p, EPINX_T ); -DIST_T GetTrkEndElevHeight( track_p, EPINX_T ); -BOOL_T GetTrkEndElevCachedHeight (track_p trk, EPINX_T e, DIST_T *height, DIST_T *grade); -void SetTrkEndElevCachedHeight ( track_p trk, EPINX_T e, DIST_T height, DIST_T grade); -char * GetTrkEndElevStation( track_p, EPINX_T ); -#define EndPtIsDefinedElev( T, E ) (GetTrkEndElevMode(T,E)==ELEV_DEF) -#define EndPtIsIgnoredElev( T, E ) (GetTrkEndElevMode(T,E)==ELEV_IGNORE) -#define EndPtIsStationElev( T, E ) (GetTrkEndElevMode(T,E)==ELEV_STATION) void SetTrkElev( track_p, int, DIST_T ); int GetTrkElevMode( track_p ); DIST_T GetTrkElev( track_p trk ); @@ -536,7 +282,6 @@ void CopyAttributes( track_p, track_p ); DIST_T GetTrkGauge( track_cp ); #define GetTrkScaleName( T ) GetScaleName(GetTrkScale(T)) void SetTrkEndPtCnt( track_p, EPINX_T ); -BOOL_T WriteEndPt( FILE *, track_cp, EPINX_T ); EPINX_T PickEndPoint( coOrd, track_cp ); EPINX_T PickUnconnectedEndPoint( coOrd, track_cp ); EPINX_T PickUnconnectedEndPointSilent( coOrd, track_cp ); @@ -593,7 +338,8 @@ wBool_t IsAngleClose( ANGLE_T, ANGLE_T ); wBool_t IsDistClose( DIST_T, DIST_T ); wBool_t IsWidthClose( DIST_T, DIST_T ); wBool_t IsColorClose( wDrawColor, wDrawColor ); -wBool_t CompareTrack( track_cp, track_cp ); +wBool_t CheckRegressionResult( long regressionVersion, char * sFileName, + wBool_t bQuiet ); void MoveTrack( track_p, coOrd ); void RotateTrack( track_p, coOrd, ANGLE_T ); @@ -607,7 +353,8 @@ EPINX_T GetNextTrkOnPath( track_p, EPINX_T ); #define FDE_UDF 1 #define FDE_END 2 int FindDefinedElev( track_p, EPINX_T, int, BOOL_T, DIST_T *, DIST_T *); -BOOL_T ComputeElev( track_p trk, EPINX_T ep, BOOL_T on_path, DIST_T * elev, DIST_T * grade, BOOL_T force); +BOOL_T ComputeElev( track_p trk, EPINX_T ep, BOOL_T on_path, DIST_T * elev, + DIST_T * grade, BOOL_T force); #define DTS_LEFT (1<<0) #define DTS_RIGHT (1<<1) @@ -618,49 +365,52 @@ BOOL_T ComputeElev( track_p trk, EPINX_T ep, BOOL_T on_path, DIST_T * elev, DIST #define DTS_DASHDOTDOT (1<<10) #define DTS_CENTERONLY (1<<11) -void DrawCurvedTrack( drawCmd_p, coOrd, DIST_T, ANGLE_T, ANGLE_T, track_cp, wDrawColor, long ); -void DrawStraightTrack( drawCmd_p, coOrd, coOrd, ANGLE_T, track_cp, wDrawColor, long ); +BOOL_T DrawTwoRails( drawCmd_p d, DIST_T factor ); +BOOL_T hasTrackCenterline( drawCmd_p d ); +void DrawCurvedTrack( drawCmd_p, coOrd, DIST_T, ANGLE_T, ANGLE_T, track_cp, + wDrawColor, long ); +void DrawStraightTrack( drawCmd_p, coOrd, coOrd, ANGLE_T, track_cp, wDrawColor, + long ); -void DrawStraightTies( drawCmd_p d, SCALEINX_T scaleInx, coOrd p0, coOrd p1, wDrawColor color ); +void DrawStraightTies( drawCmd_p d, tieData_t td, coOrd p0, coOrd p1, + wDrawColor color ); wBool_t DoDrawTies(drawCmd_p d, track_cp trk); -void DrawTie(drawCmd_p d, coOrd pos, ANGLE_T angle, DIST_T length, DIST_T width, wDrawColor color, BOOL_T solid); +void DrawTie(drawCmd_p d, coOrd pos, ANGLE_T angle, DIST_T length, DIST_T width, + wDrawColor color, BOOL_T solid); ANGLE_T GetAngleAtPoint( track_p, coOrd, EPINX_T *, EPINX_T * ); DIST_T GetTrkDistance( track_cp, coOrd *); track_p OnTrack( coOrd *, INT_T, BOOL_T ); -track_p OnTrackIgnore(coOrd *, INT_T, BOOL_T , track_p ); +track_p OnTrackIgnore(coOrd *, INT_T, BOOL_T, track_p ); track_p OnTrack2( coOrd *, INT_T, BOOL_T, BOOL_T, track_p ); void ComputeRectBoundingBox( track_p, coOrd, coOrd ); void ComputeBoundingBox( track_p ); -void DrawEndPt( drawCmd_p, track_p, EPINX_T, wDrawColor ); -void DrawEndPt2( drawCmd_p, track_p, EPINX_T, wDrawColor ); -void DrawEndElev( drawCmd_p, track_p, EPINX_T, wDrawColor ); +void DrawEndPt( drawCmd_p, track_p, EPINX_T, wDrawColor ); +void DrawEndPt2( drawCmd_p, track_p, EPINX_T, wDrawColor ); wDrawColor GetTrkColor( track_p, drawCmd_p ); void DrawTrack( track_cp, drawCmd_p, wDrawColor ); void DrawTracks( drawCmd_p, DIST_T, coOrd, coOrd ); void DrawNewTrack( track_cp ); void DrawOneTrack( track_cp, drawCmd_p ); void UndrawNewTrack( track_cp ); -void DrawSelectedTracks( drawCmd_p ); +void DrawSelectedTracks( drawCmd_p, BOOL_T ); void HilightElevations( BOOL_T ); void HilightSelectedEndPt( BOOL_T, track_p, EPINX_T ); -DIST_T EndPtDescriptionDistance( coOrd, track_p, EPINX_T, coOrd *, BOOL_T show_hidden, BOOL_T * hidden ); -STATUS_T EndPtDescriptionMove( track_p, EPINX_T, wAction_t, coOrd ); track_p FindTrack( TRKINX_T ); void ResolveIndex( void ); void RenumberTracks( void ); BOOL_T ReadTrack( char * ); BOOL_T WriteTracks( FILE *, wBool_t ); -BOOL_T ExportTracks( FILE * , coOrd *); +BOOL_T ExportTracks( FILE *, coOrd * ); void ImportStart( void ); -void ImportEnd( coOrd , wBool_t, wBool_t); +void ImportEnd( coOrd, wBool_t, wBool_t); void FreeTrack( track_p ); void ClearTracks( void ); BOOL_T TrackIterate( track_p * ); -void LoosenTracks( void * unused ); +void LoosenTracks( void * ); void SaveTrackState( void ); void RestoreTrackState( void ); @@ -669,6 +419,7 @@ void RestoreCarState( void ); TRKTYP_T InitObject( trackCmd_t* ); int ConnectTracks( track_p, EPINX_T, track_p, EPINX_T ); +void ConnectAllEndPts(track_p); BOOL_T ReconnectTrack( track_p, EPINX_T, track_p, EPINX_T ); void DisconnectTracks( track_p, EPINX_T, track_p, EPINX_T ); BOOL_T ConnectAbuttingTracks( track_p, EPINX_T, track_p, EPINX_T ); @@ -676,7 +427,8 @@ BOOL_T ConnectTurntableTracks(track_p, EPINX_T, track_p, EPINX_T ); BOOL_T SplitTrack( track_p, coOrd, EPINX_T, track_p *leftover, BOOL_T ); BOOL_T TraverseTrack( traverseTrack_p, DIST_T * ); BOOL_T RemoveTrack( track_p*, EPINX_T*, DIST_T* ); -BOOL_T TrimTrack( track_p, EPINX_T, DIST_T, coOrd pos, ANGLE_T angle, DIST_T radius, coOrd center); +BOOL_T TrimTrack( track_p, EPINX_T, DIST_T, coOrd pos, ANGLE_T angle, + DIST_T radius, coOrd center); BOOL_T MergeTracks( track_p, EPINX_T, track_p, EPINX_T ); STATUS_T ExtendStraightFromOrig( track_p, wAction_t, coOrd ); STATUS_T ExtendTrackFromOrig( track_p, wAction_t, coOrd ); @@ -694,7 +446,8 @@ BOOL_T ReplayTrackData(track_p, void *, long); DIST_T GetFlexLength( track_p, EPINX_T, coOrd * ); void LabelLengths( drawCmd_p, track_p, wDrawColor ); DIST_T GetTrkLength( track_p, EPINX_T, EPINX_T ); -void AddTrkDetails(drawCmd_p d, track_p trk, coOrd pos, DIST_T length, wDrawColor color); +void AddTrkDetails(drawCmd_p d, track_p trk, coOrd pos, DIST_T length, + wDrawColor color); void SelectAbove( void * unused ); void SelectBelow( void * unused ); @@ -702,21 +455,55 @@ void SelectBelow( void * unused ); void FlipPoint( coOrd*, coOrd, ANGLE_T ); void FlipTrack( track_p, coOrd, ANGLE_T ); +void DrawTurnout(track_p, drawCmd_p, wDrawColor); void DrawPositionIndicators( void ); void AdvancePositionIndicator( track_p, coOrd, coOrd *, ANGLE_T * ); -BOOL_T MakeParallelTrack( track_p, coOrd, DIST_T, DIST_T, track_p *, coOrd *, coOrd * , BOOL_T); +BOOL_T MakeParallelTrack( track_p, coOrd, DIST_T, DIST_T, track_p *, coOrd *, + coOrd *, BOOL_T); + +/*trkendpt.c*/ +coOrd GetTrkEndPos( track_p, EPINX_T ); +#define GetTrkEndPosXY( trk, ep ) PutDim(GetTrkEndPos(trk,ep).x), PutDim(GetTrkEndPos(trk,ep).y) +ANGLE_T GetTrkEndAngle( track_p, EPINX_T ); +long GetTrkEndOption( track_p, EPINX_T ); +long SetTrkEndOption( track_p, EPINX_T, long ); +void SetTrkEndPoint( track_p, EPINX_T, coOrd, ANGLE_T ); +void SetTrkEndPointSilent( track_p, EPINX_T, coOrd, ANGLE_T ); +track_p GetTrkEndTrk( track_p, EPINX_T ); +BOOL_T WriteEndPt( FILE *, track_cp, EPINX_T ); +void DrawEndElev( drawCmd_p, track_p, EPINX_T, wDrawColor ); +DIST_T EndPtDescriptionDistance( coOrd, track_p, EPINX_T, coOrd *, + BOOL_T show_hidden, BOOL_T * hidden ); +STATUS_T EndPtDescriptionMove( track_p, EPINX_T, wAction_t, coOrd ); +void SetTrkEndElev( track_p, EPINX_T, int, DIST_T, char * ); +void GetTrkEndElev( track_p trk, EPINX_T e, int *option, DIST_T *height ); +int GetTrkEndElevMode( track_p, EPINX_T ); +int GetTrkEndElevUnmaskedMode( track_p, EPINX_T ); +DIST_T GetTrkEndElevHeight( track_p, EPINX_T ); +BOOL_T GetTrkEndElevCachedHeight (track_p trk, EPINX_T e, DIST_T *height, + DIST_T *grade); +void SetTrkEndElevCachedHeight ( track_p trk, EPINX_T e, DIST_T height, + DIST_T grade); +char * GetTrkEndElevStation( track_p, EPINX_T ); +#define EndPtIsDefinedElev( T, E ) (GetTrkEndElevMode(T,E)==ELEV_DEF) +#define EndPtIsIgnoredElev( T, E ) (GetTrkEndElevMode(T,E)==ELEV_IGNORE) +#define EndPtIsStationElev( T, E ) (GetTrkEndElevMode(T,E)==ELEV_STATION) /*tstraight.c*/ -DIST_T StraightDescriptionDistance(coOrd pos, track_p trk, coOrd * dpos, BOOL_T show_hidden, BOOL_T * hidden); +DIST_T StraightDescriptionDistance(coOrd pos, track_p trk, coOrd * dpos, + BOOL_T show_hidden, BOOL_T * hidden); STATUS_T StraightDescriptionMove(track_p trk,wAction_t action,coOrd pos ); /*tease.c*/ -DIST_T JointDescriptionDistance(coOrd pos,track_p trk,coOrd * dpos,BOOL_T show_hidden,BOOL_T * hidden); +DIST_T JointDescriptionDistance(coOrd pos,track_p trk,coOrd * dpos, + BOOL_T show_hidden,BOOL_T * hidden); STATUS_T JointDescriptionMove(track_p trk,wAction_t action,coOrd pos ); /* cmisc.c */ extern wIndex_t describeCmdInx; +extern BOOL_T inDescribeCmd; +extern BOOL_T descUndoStarted; typedef enum { DESC_NULL, DESC_POS, DESC_FLOAT, DESC_ANGLE, DESC_LONG, DESC_COLOR, DESC_DIM, DESC_PIVOT, DESC_LAYER, DESC_STRING, DESC_TEXT, DESC_LIST, DESC_EDITABLELIST, DESC_BOXED } descType; #define DESC_RO (1<<0) #define DESC_IGNORE (1<<1) @@ -726,27 +513,37 @@ typedef enum { DESC_NULL, DESC_POS, DESC_FLOAT, DESC_ANGLE, DESC_LONG, DESC_COLO typedef enum { DESC_PIVOT_FIRST, DESC_PIVOT_MID, DESC_PIVOT_SECOND, DESC_PIVOT_NONE } descPivot_t; #define DESC_PIVOT_1 typedef struct { - coOrd pos; - POS_T ang; - } descEndPt_t; + coOrd pos; + POS_T ang; +} descEndPt_t; typedef struct { - descType type; - char * label; - void * valueP; - unsigned int max_string; - int mode; - wControl_p control0; - wControl_p control1; - wWinPix_t posy; - } descData_t, * descData_p; + descType type; + char * label; + void * valueP; + unsigned int max_string; + int mode; + wControl_p control0; + wControl_p control1; + wWinPix_t posy; +} descData_t, * descData_p; typedef void (*descUpdate_t)( track_p, int, descData_p, BOOL_T ); void DoDescribe( char *, track_p, descData_p, descUpdate_t ); void DescribeCancel( void ); BOOL_T UpdateDescStraight( int, int, int, int, int, descData_p, long ); STATUS_T CmdDescribe(wAction_t,coOrd); - + /* compound.c */ +#define LABEL_MANUF (1<<0) +#define LABEL_PARTNO (1<<1) +#define LABEL_DESCR (1<<2) +#define LABEL_COST (1<<7) +#define LABEL_FLIPPED (1<<8) +#define LABEL_TABBED (1<<9) +#define LABEL_UNGROUPED (1<<10) +#define LABEL_SPLIT (1<<11) +extern long listLabels; +extern long layoutLabels; DIST_T CompoundDescriptionDistance( coOrd, track_p, coOrd *, BOOL_T, BOOL_T * ); STATUS_T CompoundDescriptionMove( track_p, wAction_t, coOrd ); @@ -770,12 +567,13 @@ void DrawTrackElev( track_p, drawCmd_p, BOOL_T ); /* cdraw.c */ typedef enum {DRAWLINESOLID, - DRAWLINEDASH, - DRAWLINEDOT, - DRAWLINEDASHDOT, - DRAWLINEDASHDOTDOT, - DRAWLINECENTER, - DRAWLINEPHANTOM } drawLineType_e; + DRAWLINEDASH, + DRAWLINEDOT, + DRAWLINEDASHDOT, + DRAWLINEDASHDOTDOT, + DRAWLINECENTER, + DRAWLINEPHANTOM + } drawLineType_e; track_p MakeDrawFromSeg( coOrd, ANGLE_T, trkSeg_p ); track_p MakePolyLineFromSegs( coOrd, ANGLE_T, dynArr_t * ); void DrawOriginAnchor(track_p); @@ -787,13 +585,17 @@ void SetLineType( track_p trk, int width ); void MenuMode( void * moveVP ); /* chotbar.c */ +extern long showFlexTrack; +extern long hotBarLabels; +extern long carHotbarModeInx; extern DIST_T curBarScale; void InitHotBar( void ); void HideHotBar( void ); void LayoutHotBar ( void *); typedef enum { HB_SELECT, HB_DRAW, HB_LISTTITLE, HB_BARTITLE, HB_FULLTITLE } hotBarProc_e; typedef char * (*hotBarProc_t)( hotBarProc_e, void *, drawCmd_p, coOrd * ); -void AddHotBarElement( char *, coOrd, coOrd, BOOL_T, BOOL_T, DIST_T, void *, hotBarProc_t ); +void AddHotBarElement( char *, coOrd, coOrd, BOOL_T, BOOL_T, DIST_T, void *, + hotBarProc_t ); void HotBarCancel( void ); void AddHotBarTurnouts( void ); void AddHotBarStructures( void ); |