diff options
Diffstat (limited to 'app/bin/track.h')
-rw-r--r-- | app/bin/track.h | 654 |
1 files changed, 654 insertions, 0 deletions
diff --git a/app/bin/track.h b/app/bin/track.h new file mode 100644 index 0000000..81f5e4c --- /dev/null +++ b/app/bin/track.h @@ -0,0 +1,654 @@ +/* + * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/bin/track.h,v 1.3 2009-05-25 18:11:03 m_fischer Exp $ + */ + +/* XTrkCad - Model Railroad CAD + * Copyright (C) 2005 Dave Bullis + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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. + */ + +#ifndef TRACK_H +#define TRACK_H + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#ifndef WINDOWS +#include <unistd.h> +#endif +#include <math.h> +#ifdef HAVE_MALLOC_H +#include <malloc.h> +#endif +#include <string.h> + +#include "wlib.h" +#include "common.h" +#include "utility.h" +#include "draw.h" +#include "misc.h" + + + + +extern TRKTYP_T T_NOTRACK; + +struct track_t ; +typedef struct track_t * track_p; +typedef struct track_t * track_cp; +extern track_p tempTrack; +extern wIndex_t trackCount; +extern long drawTunnel; +extern long drawEndPtV; +extern long centerDrawMode; +extern wDrawColor selectedColor; +extern wDrawColor normalColor; +extern BOOL_T useCurrentLayer; +extern LAYER_T curTrackLayer; +extern coOrd descriptionOff; +extern DIST_T roadbedWidth; +extern DIST_T roadbedLineWidth; +extern long drawElevations; +extern wDrawColor elevColorIgnore; +extern wDrawColor elevColorDefined; +extern DIST_T minTrackRadius; +extern DIST_T maxTrackGrade; +extern wDrawColor exceptionColor; +#define TIEDRAWMODE_NONE (0) +#define TIEDRAWMODE_OUTLINE (1) +#define TIEDRAWMODE_SOLID (2) +extern long tieDrawMode; +extern wDrawColor tieColor; + + +extern TRKINX_T max_index; + +typedef signed char * PATHPTR_T; +extern PATHPTR_T pathPtr; +extern int pathCnt; +extern int pathMax; + +extern BOOL_T onTrackInSplit; + +typedef enum { curveTypeNone, curveTypeCurve, curveTypeStraight } curveType_e; + +#define PARAMS_1ST_JOIN (0) +#define PARAMS_2ND_JOIN (1) +#define PARAMS_EXTEND (2) +#define PARAMS_PARALLEL (3) + +typedef struct { + curveType_e type; + EPINX_T ep; + DIST_T len; + ANGLE_T angle; + coOrd lineOrig; + coOrd lineEnd; + coOrd arcP; + DIST_T arcR; + ANGLE_T arcA0, arcA1; + long helixTurns; + } trackParams_t; + +#define Q_CANNOT_BE_ON_END (1) +#define Q_IGNORE_EASEMENT_ON_EXTEND (2) +#define Q_REFRESH_JOIN_PARAMS_ON_MOVE (3) +#define Q_CANNOT_PLACE_TURNOUT (4) +#define Q_DONT_DRAW_ENDPOINT (5) +#define Q_DRAWENDPTV_1 (6) +#define Q_CAN_PARALLEL (7) +#define Q_CAN_MODIFYRADIUS (8) +#define Q_EXCEPTION (9) +#define Q_CAN_GROUP (10) +#define Q_FLIP_ENDPTS (11) +#define Q_CAN_NEXT_POSITION (12) +#define Q_NODRAWENDPT (13) +#define Q_ISTRACK (14) +#define Q_NOT_PLACE_FROGPOINTS (15) +#define Q_HAS_DESC (16) +#define Q_MODIFY_REDRAW_DONT_UNDRAW_TRACK (17) + +typedef struct { + track_p trk; + DIST_T length; + DIST_T dist; + coOrd pos; + ANGLE_T angle; + } 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 (*delete)( track_p ); + BOOL_T (*write)( track_p, FILE * ); + void (*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 ); + 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, track_p *, coOrd *, coOrd * ); + void (*drawDesc)( track_p, drawCmd_p, wDrawColor ); + } 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; + } elev_t; +#define EPOPT_GAPPED (1L<<0) +typedef struct { + coOrd pos; + ANGLE_T angle; + TRKINX_T index; + track_p track; + elev_t elev; + long option; + } trkEndPt_t, * trkEndPt_p; + +dynArr_t tempEndPts_da; +#define tempEndPts(N) DYNARR_N( trkEndPt_t, tempEndPts_da, N ) + + +typedef struct { + char type; + wDrawColor color; + DIST_T width; + union { + struct { + coOrd pos[2]; + ANGLE_T angle; + long option; + } l; + 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; + char * string; + } t; + struct { + int cnt; + coOrd * pts; + coOrd orig; + ANGLE_T angle; + } p; + } u; + } trkSeg_t, * trkSeg_p; + +#define SEG_STRTRK ('S') +#define SEG_CRVTRK ('C') +#define SEG_STRLIN ('L') +#define SEG_CRVLIN ('A') +#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 ) + +dynArr_t tempSegs_da; +#define tempSegs(N) DYNARR_N( trkSeg_t, tempSegs_da, N ) + +char tempSpecial[4096]; +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 * ); +void RecolorSegs( wIndex_t, trkSeg_p, wDrawColor ); + +BOOL_T ReadSegs( void ); +BOOL_T WriteSegs( FILE * f, wIndex_t segCnt, trkSeg_p segs ); +typedef union { + struct { + coOrd pos; /* IN */ + ANGLE_T angle; + DIST_T dist; /* OUT */ + BOOL_T backwards; + } traverse1; + struct { + EPINX_T segDir; /* IN */ + DIST_T dist; /* IN/OUT */ + coOrd pos; /* OUT */ + ANGLE_T angle; + } traverse2; + 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/OUT */ + DIST_T dd; /* OUT */ + } distance; + struct { + track_p trk; /* OUT */ + EPINX_T ep[2]; + } newTrack; + struct { + DIST_T length; + } length; + struct { + coOrd pos; /* IN */ + DIST_T length[2]; /* OUT */ + trkSeg_t newSeg[2]; + } split; + struct { + coOrd pos; /* IN */ + ANGLE_T angle; /* OUT */ + } getAngle; + } 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 ); + + + +/* debug.c */ +void SetDebug( char * ); + +#define TB_SELECTED (1<<0) +#define TB_VISIBLE (1<<1) +#define TB_PROFILEPATH (1<<2) +#define TB_ELEVPATH (1<<3) +#define TB_PROCESSED (1<<4) +#define TB_SHRTPATH (1<<5) +#define TB_HIDEDESC (1<<6) +#define TB_CARATTACHED (1<<7) +#define TB_TEMPBITS (TB_PROFILEPATH|TB_PROCESSED) + +/* 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 ) ((T)->extraData) +#define GetTrkWidth( T ) (int)((T)->width) +#define SetTrkWidth( T, W ) (T)->width = (unsigned int)(W) +#define GetTrkBits(T) ((T)->bits) +#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 ); +void SetTrkScale( track_p, SCALEINX_T ); +BOOL_T GetTrkSelected( track_p ); +BOOL_T GetTrkVisible( track_p ); +void SetTrkVisible( track_p, BOOL_T ); +LAYER_T GetTrkLayer( 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 ); +struct extraData * GetTrkExtraData( track_p ); +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 + +#define GetTrkSelected(T) (GetTrkBits(T)&TB_SELECTED) +#define GetTrkVisible(T) (GetTrkBits(T)&TB_VISIBLE) +#define SetTrkVisible(T,V) ((V)?SetTrkBits(T,TB_VISIBLE):ClrTrkBits(T,TB_VISIBLE)) +int ClrAllTrkBits( int ); + +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 ); +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 ); +void ClearElevPath( void ); +BOOL_T GetTrkOnElevPath( track_p, DIST_T * elev ); +void SetTrkLayer( track_p, int ); +BOOL_T CheckTrackLayer( track_p ); +void CopyAttributes( track_p, track_p ); + +#define GetTrkGauge( T ) GetScaleTrackGauge(GetTrkScale(T)) +#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 ); + +void AuditTracks( char *, ... ); +void CheckTrackLength( track_cp ); +track_p NewTrack( wIndex_t, TRKTYP_T, EPINX_T, CSIZE_T ); +void DescribeTrack( track_cp, char *, CSIZE_T ); +EPINX_T GetEndPtConnectedToMe( track_p, track_p ); +void SetEndPts( track_p, EPINX_T ); +BOOL_T DeleteTrack( track_p, BOOL_T ); + +void MoveTrack( track_p, coOrd ); +void RotateTrack( track_p, coOrd, ANGLE_T ); +void RescaleTrack( track_p, FLOAT_T, coOrd ); +#define GNTignoreIgnore (1<<0) +#define GNTfirstDefined (1<<1) +#define GNTonPath (1<<2) +EPINX_T GetNextTrk( track_p, EPINX_T, track_p *, EPINX_T *, int ); +EPINX_T GetNextTrkOnPath( track_p, EPINX_T ); +#define FDE_DEF 0 +#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, EPINX_T, BOOL_T, DIST_T *, DIST_T * ); + +#define DTS_LEFT (1<<0) +#define DTS_RIGHT (1<<1) +#define DTS_THICK2 (1<<2) +#define DTS_THICK3 (1<<3) +#define DTS_TIES (1<<4) +#define DTS_NOCENTER (1<<5) + +void DrawCurvedTies( drawCmd_p, track_p, coOrd, DIST_T, ANGLE_T, ANGLE_T, wDrawColor ); +void DrawCurvedTrack( drawCmd_p, coOrd, DIST_T, ANGLE_T, ANGLE_T, coOrd, coOrd, track_p, DIST_T, wDrawColor, long ); +void DrawStraightTies( drawCmd_p, track_p, coOrd, coOrd, wDrawColor ); +void DrawStraightTrack( drawCmd_p, coOrd, coOrd, ANGLE_T, track_p, DIST_T, wDrawColor, long ); + +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 OnTrack2( coOrd *, INT_T, BOOL_T, BOOL_T ); + +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 ); +wDrawColor GetTrkColor( track_p, drawCmd_p ); +void DrawTrack( track_cp, drawCmd_p, wDrawColor ); +void DrawTracks( drawCmd_p, DIST_T, coOrd, coOrd ); +void RedrawLayer( LAYER_T, BOOL_T ); +void DrawNewTrack( track_cp ); +void DrawOneTrack( track_cp, drawCmd_p ); +void UndrawNewTrack( track_cp ); +void DrawSelectedTracks( drawCmd_p ); +void HilightElevations( BOOL_T ); +void HilightSelectedEndPt( BOOL_T, track_p, EPINX_T ); +DIST_T EndPtDescriptionDistance( coOrd, track_p, EPINX_T ); +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 * ); +BOOL_T ExportTracks( FILE * ); +void ImportStart( void ); +void ImportEnd( void ); +void FreeTrack( track_p ); +void ClearTracks( void ); +BOOL_T TrackIterate( track_p * ); + +void LoosenTracks( void ); + +void SaveTrackState( void ); +void RestoreTrackState( void ); +void SaveCarState( void ); +void RestoreCarState( void ); +TRKTYP_T InitObject( trackCmd_t* ); + +void ConnectTracks( track_p, EPINX_T, track_p, EPINX_T ); +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 ); +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 ); +BOOL_T MergeTracks( track_p, EPINX_T, track_p, EPINX_T ); +STATUS_T ExtendStraightFromOrig( track_p, wAction_t, coOrd ); +STATUS_T ModifyTrack( track_p, wAction_t, coOrd ); +BOOL_T GetTrackParams( int, track_p, coOrd, trackParams_t* ); +BOOL_T MoveEndPt( track_p *, EPINX_T *, coOrd, DIST_T ); +BOOL_T QueryTrack( track_p, int ); +void UngroupTrack( track_p ); +BOOL_T IsTrack( track_p ); +char * GetTrkTypeName( track_p ); + +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 SelectAbove( void ); +void SelectBelow( void ); + +void FlipPoint( coOrd*, coOrd, ANGLE_T ); +void FlipTrack( track_p, coOrd, ANGLE_T ); + +void DrawPositionIndicators( void ); +void AdvancePositionIndicator( track_p, coOrd, coOrd *, ANGLE_T * ); + +BOOL_T MakeParallelTrack( track_p, coOrd, DIST_T, track_p *, coOrd *, coOrd * ); + +#include "cundo.h" +#include "cselect.h" + +/* cmisc.c */ +wIndex_t describeCmdInx; +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 } descType; +#define DESC_RO (1<<0) +#define DESC_IGNORE (1<<1) +#define DESC_NOREDRAW (1<<2) +#define DESC_CHANGE (1<<8) +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; +typedef struct { + descType type; + char * label; + void * valueP; + int mode; + wControl_p control0; + wControl_p control1; + wPos_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 ); + + +/* compound.c */ +DIST_T CompoundDescriptionDistance( coOrd, track_p ); +STATUS_T CompoundDescriptionMove( track_p, wAction_t, coOrd ); + +/* elev.c */ +#define ELEV_FORK (3) +#define ELEV_BRANCH (2) +#define ELEV_ISLAND (1) +#define ELEV_ALONE (0) + +long oldElevationEvaluation; +EPINX_T GetNextTrkOnPath( track_p trk, EPINX_T ep ); +int FindDefinedElev( track_p, EPINX_T, int, BOOL_T, DIST_T *, DIST_T * ); +BOOL_T ComputeElev( track_p, EPINX_T, BOOL_T, DIST_T *, DIST_T * ); +void RecomputeElevations( void ); +void UpdateAllElevations( void ); +DIST_T GetElevation( track_p ); +void ClrTrkElev( track_p ); +void SetTrkElevModes( BOOL_T, track_p, EPINX_T, track_p, EPINX_T ); +void UpdateTrkEndElev( track_p, EPINX_T, int, DIST_T, char * ); +void DrawTrackElev( track_p, drawCmd_p, BOOL_T ); + +/* cdraw.c */ +track_p MakeDrawFromSeg( coOrd, ANGLE_T, trkSeg_p ); +BOOL_T OnTableEdgeEndPt( track_p, coOrd * ); +BOOL_T ReadTableEdge( char * ); +BOOL_T ReadText( char * ); + +/* chotbar.c */ +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, DIST_T, void *, hotBarProc_t ); +void HotBarCancel( void ); +void AddHotBarTurnouts( void ); +void AddHotBarStructures( void ); +void AddHotBarCarDesc( void ); + +#endif + |