diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-07-03 10:19:30 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-07-03 10:19:30 +0200 |
commit | a14a7a0ccc9de76aeab0b2e4bbf58f1a79deedc2 (patch) | |
tree | e469179df67a0e0db49161a43cbf8076a189f6f4 /app/bin/cturntbl.c | |
parent | 5d2c2b27a6323e2666378b986129b2a7c2c39e5c (diff) |
New upstream version 5.3.0GAupstream/5.3.0GAupstream
Diffstat (limited to 'app/bin/cturntbl.c')
-rw-r--r-- | app/bin/cturntbl.c | 548 |
1 files changed, 317 insertions, 231 deletions
diff --git a/app/bin/cturntbl.c b/app/bin/cturntbl.c index 2ef49d1..bab9850 100644 --- a/app/bin/cturntbl.c +++ b/app/bin/cturntbl.c @@ -17,7 +17,7 @@ * * 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 */ #include "cstraigh.h" @@ -32,12 +32,12 @@ static TRKTYP_T T_TURNTABLE = -1; typedef struct extraDataTurntable_t { - extraDataBase_t base; - coOrd pos; - DIST_T radius; - EPINX_T currEp; - BOOL_T reverse; - } extraDataTurntable_t; + extraDataBase_t base; + coOrd pos; + DIST_T radius; + EPINX_T currEp; + BOOL_T reverse; +} extraDataTurntable_t; static DIST_T turntableDiameter = 1.0; @@ -46,18 +46,21 @@ EXPORT ANGLE_T turntableAngle = 0.0; static paramFloatRange_t r1_100 = { 1.0, 100.0, 100 }; static paramData_t turntablePLs[] = { #define turntableDiameterPD (turntablePLs[0]) - { PD_FLOAT, &turntableDiameter, "diameter", PDO_DIM|PDO_NOPREF, &r1_100, N_("Diameter") } }; + { PD_FLOAT, &turntableDiameter, "diameter", PDO_DIM|PDO_NOPREF, &r1_100, N_("Diameter") } +}; static paramGroup_t turntablePG = { "turntable", 0, turntablePLs, COUNT( turntablePLs ) }; static BOOL_T ValidateTurntablePosition( - track_p trk ) + track_p trk ) { EPINX_T ep, epCnt = GetTrkEndPtCnt(trk); - - if ( epCnt <= 0 ) + + if ( epCnt <= 0 ) { return FALSE; - struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + } + struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); ep = xx->currEp; do { if ( GetTrkEndTrk(trk,ep) ) { @@ -65,8 +68,9 @@ static BOOL_T ValidateTurntablePosition( return TRUE; } ep++; - if ( ep >= epCnt ) + if ( ep >= epCnt ) { ep = 0; + } } while ( ep != xx->currEp ); return FALSE; } @@ -75,7 +79,8 @@ static BOOL_T ValidateTurntablePosition( static void ComputeTurntableBoundingBox( track_p trk ) { coOrd hi, lo; - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); hi.x = xx->pos.x+xx->radius; lo.x = xx->pos.x-xx->radius; hi.y = xx->pos.y+xx->radius; @@ -99,57 +104,70 @@ static track_p NewTurntable( coOrd p, DIST_T r ) #ifdef LATER -static void PruneTurntable( track_p trk ) --{ -- EPINX_T inx0; -- EPINX_T inx1; -- for (inx0=inx1=0; inx0<trk->endCnt; inx0++) { -- if (GetTrkEndTrk(trk,inx0) == NULL) { -- continue; -- } else { -- if (inx0 != inx1) { -- trk->endPt[inx1] = GetTrkEndTrk(trk,inx0); -- } -- inx1++; -- } -- } -- trk->endPt = Realloc( trk->endPt, inx1*sizeof trk->endPt[0] ); -- trk->endCnt = inx1; --} + - +{ + - EPINX_T inx0; + - EPINX_T inx1; + - for (inx0=inx1=0; inx0<trk->endCnt; inx0++) { + - if (GetTrkEndTrk(trk,inx0) == NULL) { + - continue; + - + } else { + - if (inx0 != inx1) { + - trk->endPt[inx1] = GetTrkEndTrk(trk,inx0); + - + } + - inx1++; + - + } + - + } + - trk->endPt = Realloc( trk->endPt, inx1*sizeof trk->endPt[0] ); + - trk->endCnt = inx1; + - + } #endif static ANGLE_T ConstrainTurntableAngle( track_p trk, coOrd pos ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); ANGLE_T a, al, ah, aa, aaa; EPINX_T inx, cnt; a = FindAngle( xx->pos, pos ); cnt = GetTrkEndPtCnt(trk); - if ( cnt == 0 || turntableAngle == 0.0 ) + if ( cnt == 0 || turntableAngle == 0.0 ) { return a; + } ah = 360.0; al = 360.0; for ( inx = 0; inx<cnt; inx++ ) { - if (GetTrkEndTrk(trk,inx) == NULL) + if (GetTrkEndTrk(trk,inx) == NULL) { continue; + } aa = NormalizeAngle( GetTrkEndAngle(trk,inx) - a ); - if (aa < al) + if (aa < al) { al = aa; + } aa = 360 - aa; - if (aa < ah) + if (aa < ah) { ah = aa; + } } - if (al+ah>361) + if (al+ah>361) { return a; + } if ( (al+ah) < turntableAngle*2.0 ) { ErrorMessage( MSG_NO_ROOM_BTW_TRKS ); aaa = -1; - } else if ( al <= turntableAngle) + } else if ( al <= turntableAngle) { aaa = NormalizeAngle( a - ( turntableAngle - al ) ); - else if ( ah <= turntableAngle) + } else if ( ah <= turntableAngle) { aaa = NormalizeAngle( a + ( turntableAngle - ah ) ); - else + } else { aaa = a; + } #ifdef VERBOSE Lprintf( "CTA( %0.3f ) [ %0.3f .. %0.3f ] = %0.3f\n", a, ah, al, aaa ); #endif @@ -158,10 +176,11 @@ static ANGLE_T ConstrainTurntableAngle( track_p trk, coOrd pos ) static EPINX_T NewTurntableEndPt( track_p trk, ANGLE_T angle ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); EPINX_T ep = -1; /* Reuse an old empty ep if it exists */ - for (int i =0;i< GetTrkEndPtCnt(trk)-1;i++) { + for (int i =0; i< GetTrkEndPtCnt(trk)-1; i++) { if (GetTrkEndTrk(trk,i) == NULL) { ep = i; break; @@ -179,14 +198,16 @@ static EPINX_T NewTurntableEndPt( track_p trk, ANGLE_T angle ) static void TurntableGetCenter( track_p trk, coOrd * center, DIST_T * radius) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); *center = xx->pos; *radius = xx->radius; } static void DrawTurntable( track_p t, drawCmd_p d, wDrawColor color ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(t, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(t, T_TURNTABLE, + extraDataTurntable_t); coOrd p0, p1; EPINX_T ep; long widthOptions = DTS_LEFT|DTS_RIGHT; @@ -200,24 +221,29 @@ static void DrawTurntable( track_p t, drawCmd_p d, wDrawColor color ) p0 = GetTrkEndPos( t, xx->currEp ); Translate( &p1, xx->pos, GetTrkEndAngle(t,xx->currEp)+180.0, xx->radius ); } - if (color == wDrawColorBlack) + if (color == wDrawColorBlack) { color = normalColor; - DrawArc( d, xx->pos, xx->radius, 0.0, 360.0, 0, (color == wDrawColorPreviewSelected || color == wDrawColorPreviewUnselected)?3:0, color ); + } + DrawArc( d, xx->pos, xx->radius, 0.0, 360.0, 0, + (color == wDrawColorPreviewSelected + || color == wDrawColorPreviewUnselected)?3:0, color ); DrawStraightTrack( d, p0, p1, FindAngle(p0,p1), t, color, widthOptions ); for ( ep=0; ep<GetTrkEndPtCnt(t); ep++ ) { - if (GetTrkEndTrk(t,ep) != NULL ) + if (GetTrkEndTrk(t,ep) != NULL ) { DrawEndPt( d, t, ep, color ); + } } if ( ((d->options&DC_SIMPLE)==0) && - (labelWhen == 2 || (labelWhen == 1 && (d->options&DC_PRINT))) && - labelScale >= d->scale ) { + (labelWhen == 2 || (labelWhen == 1 && (d->options&DC_PRINT))) && + labelScale >= d->scale ) { LabelLengths( d, t, color ); } } static DIST_T DistanceTurntable( track_p trk, coOrd * p ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); DIST_T d; ANGLE_T a; coOrd pos0, pos1; @@ -227,8 +253,9 @@ static DIST_T DistanceTurntable( track_p trk, coOrd * p ) a = FindAngle( xx->pos, *p ); Translate( p, xx->pos, a, d+xx->radius ); } else { - if ( !ValidateTurntablePosition(trk) ) + if ( !ValidateTurntablePosition(trk) ) { return DIST_INF; + } pos0 = GetTrkEndPos(trk,xx->currEp); Translate( &pos1, xx->pos, GetTrkEndAngle(trk,xx->currEp)+180.0, xx->radius ); LineDistance( p, pos0, pos1 ); @@ -237,34 +264,39 @@ static DIST_T DistanceTurntable( track_p trk, coOrd * p ) } static struct { - coOrd orig; - DIST_T diameter; - long epCnt; - unsigned int layerNumber; - } trntblData; + coOrd orig; + DIST_T diameter; + long epCnt; + unsigned int layerNumber; +} trntblData; typedef enum { OR, RA, EC, LY } trntblDesc_e; static descData_t trntblDesc[] = { -/*OR*/ { DESC_POS, N_("Origin: X"), &trntblData.orig }, -/*RA*/ { DESC_DIM, N_("Diameter"), &trntblData.diameter }, -/*EC*/ { DESC_LONG, N_("# EndPt"), &trntblData.epCnt }, -/*LY*/ { DESC_LAYER, N_("Layer"), &trntblData.layerNumber }, - { DESC_NULL } }; + /*OR*/ { DESC_POS, N_("Origin: X"), &trntblData.orig }, + /*RA*/ { DESC_DIM, N_("Diameter"), &trntblData.diameter }, + /*EC*/ { DESC_LONG, N_("# EndPt"), &trntblData.epCnt }, + /*LY*/ { DESC_LAYER, N_("Layer"), &trntblData.layerNumber }, + { DESC_NULL } +}; -static void UpdateTurntable( track_p trk, int inx, descData_p descUpd, BOOL_T final ) +static void UpdateTurntable( track_p trk, int inx, descData_p descUpd, + BOOL_T final ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); - if ( inx == -1 ) + if ( inx == -1 ) { return; + } UndrawNewTrack( trk ); switch ( inx ) { case OR: xx->pos = trntblData.orig; break; case RA: - if ( trntblData.diameter > 2.0 ) + if ( trntblData.diameter > 2.0 ) { xx->radius = trntblData.diameter/2.0; + } break; case LY: SetTrkLayer( trk, trntblData.layerNumber ); @@ -279,24 +311,25 @@ static void UpdateTurntable( track_p trk, int inx, descData_p descUpd, BOOL_T fi static void DescribeTurntable( track_p trk, char * str, CSIZE_T len ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); sprintf( str, _("Turntable(%d): Layer=%d Center=[%s %s] Diameter=%s #EP=%d"), - GetTrkIndex(trk), GetTrkLayer(trk)+1, - FormatDistance(xx->pos.x), FormatDistance(xx->pos.y), - FormatDistance(xx->radius * 2.0), GetTrkEndPtCnt(trk) ); + GetTrkIndex(trk), GetTrkLayer(trk)+1, + FormatDistance(xx->pos.x), FormatDistance(xx->pos.y), + FormatDistance(xx->radius * 2.0), GetTrkEndPtCnt(trk) ); trntblData.orig = xx->pos; trntblData.diameter = xx->radius*2.0; int j=0; - for (int i=0;i<GetTrkEndPtCnt(trk);i++) { - if (GetTrkEndTrk(trk,i)) j++; //Only count if track + for (int i=0; i<GetTrkEndPtCnt(trk); i++) { + if (GetTrkEndTrk(trk,i)) { j++; } //Only count if track } trntblData.epCnt = j; trntblData.layerNumber = GetTrkLayer(trk); trntblDesc[OR].mode = - trntblDesc[RA].mode = - trntblData.epCnt>0?DESC_RO:0; + trntblDesc[RA].mode = + trntblData.epCnt>0?DESC_RO:0; trntblDesc[EC].mode = DESC_RO; trntblDesc[LY].mode = DESC_NOREDRAW; DoDescribe( _("Turntable"), trk, trntblDesc, UpdateTurntable ); @@ -308,19 +341,20 @@ static void DeleteTurntable( track_p t ) static BOOL_T WriteTurntable( track_p t, FILE * f ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(t, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(t, T_TURNTABLE, + extraDataTurntable_t); EPINX_T ep; BOOL_T rc = TRUE; int j = -1, k = 0; for (ep=0; ep<GetTrkEndPtCnt(t); ep++) { - if (GetTrkEndTrk(t,ep)) j++; - if (ep == xx->currEp) k=j; //Write out the curr->Ep reset to real endPts + if (GetTrkEndTrk(t,ep)) { j++; } + if (ep == xx->currEp) { k=j; } //Write out the curr->Ep reset to real endPts } rc &= fprintf(f, "TURNTABLE %d %d 0 0 0 %s %d %0.6f %0.6f 0 %0.6f %d\n", - GetTrkIndex(t), GetTrkLayer(t), GetTrkScaleName(t), GetTrkVisible(t), - xx->pos.x, xx->pos.y, xx->radius, k )>0; + GetTrkIndex(t), GetTrkLayer(t), GetTrkScaleName(t), GetTrkVisible(t), + xx->pos.x, xx->pos.y, xx->radius, k )>0; for (ep=0; ep<GetTrkEndPtCnt(t); ep++) { - if (GetTrkEndTrk(t,ep)) rc &= WriteEndPt( f, t, ep ); //Only write if there is a track + if (GetTrkEndTrk(t,ep)) { rc &= WriteEndPt( f, t, ep ); } //Only write if there is a track } rc &= fprintf(f, "\t%s\n", END_SEGS)>0; return rc; @@ -340,14 +374,16 @@ static BOOL_T ReadTurntable( char * line ) int currEp; if ( !GetArgs( line+10, - paramVersion<3?"dXsdpYfX": - paramVersion<9?"dL000sdpYfX": - paramVersion<10?"dL000sdpffX": - "dL000sdpffd", - &index, &layer, scale, &visible, &p, &elev, &r, &currEp )) + paramVersion<3?"dXsdpYfX": + paramVersion<9?"dL000sdpYfX": + paramVersion<10?"dL000sdpffX": + "dL000sdpffd", + &index, &layer, scale, &visible, &p, &elev, &r, &currEp )) { return FALSE; - if ( !ReadSegs() ) + } + if ( !ReadSegs() ) { return FALSE; + } trk = NewTrack( index, T_TURNTABLE, 0, sizeof *xx ); SetEndPts( trk, 0 ); xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); @@ -361,7 +397,7 @@ static BOOL_T ReadTurntable( char * line ) xx->pos = p; xx->radius = r; xx->currEp = currEp; - if (xx->currEp > GetTrkEndPtCnt(trk)) xx->currEp = 0; + if (xx->currEp > GetTrkEndPtCnt(trk)) { xx->currEp = 0; } xx->reverse = 0; ComputeTurntableBoundingBox( trk ); return TRUE; @@ -369,7 +405,8 @@ static BOOL_T ReadTurntable( char * line ) static void MoveTurntable( track_p trk, coOrd orig ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); xx->pos.x += orig.x; xx->pos.y += orig.y; ComputeTurntableBoundingBox( trk ); @@ -377,56 +414,65 @@ static void MoveTurntable( track_p trk, coOrd orig ) static void RotateTurntable( track_p trk, coOrd orig, ANGLE_T angle ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); Rotate( &xx->pos, orig, angle ); ComputeTurntableBoundingBox( trk ); } static void RescaleTurntable( track_p trk, FLOAT_T ratio ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); xx->pos.x *= ratio; xx->pos.y *= ratio; } -static ANGLE_T GetAngleTurntable( track_p trk, coOrd pos, EPINX_T * ep0, EPINX_T * ep1 ) +static ANGLE_T GetAngleTurntable( track_p trk, coOrd pos, EPINX_T * ep0, + EPINX_T * ep1 ) { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); if ( programMode == MODE_DESIGN ) { return FindAngle( xx->pos, pos ); } else { - if ( !ValidateTurntablePosition( trk ) ) + if ( !ValidateTurntablePosition( trk ) ) { return 90.0; - else + } else { return GetTrkEndAngle( trk, xx->currEp ); + } } } -static BOOL_T SplitTurntable( track_p trk, coOrd pos, EPINX_T ep, track_p *leftover, EPINX_T *ep0, EPINX_T *ep1 ) +static BOOL_T SplitTurntable( track_p trk, coOrd pos, EPINX_T ep, + track_p *leftover, EPINX_T *ep0, EPINX_T *ep1 ) { - if (leftover) + if (leftover) { *leftover = NULL; - ErrorMessage( MSG_CANT_SPLIT_TRK, "Turntable" ); + } + ErrorMessage( MSG_CANT_SPLIT_TRK, _("Turntable") ); return FALSE; } static BOOL_T FindTurntableEndPt( - track_p trk, - ANGLE_T *angleR, - EPINX_T *epR, - BOOL_T *reverseR ) + track_p trk, + ANGLE_T *angleR, + EPINX_T *epR, + BOOL_T *reverseR ) { - EPINX_T ep, ep0, epCnt=GetTrkEndPtCnt(trk); + EPINX_T ep, /*ep0,*/ epCnt=GetTrkEndPtCnt(trk); ANGLE_T angle=*angleR, angle0, angle1; - for (ep=0,ep0=-1,epCnt=GetTrkEndPtCnt(trk),angle0=370.0; ep<epCnt; ep++) { - if ( (GetTrkEndTrk(trk,ep)) == NULL ) + for (ep=0,/*ep0=-1,*/epCnt=GetTrkEndPtCnt(trk),angle0=370.0; ep<epCnt; ep++) { + if ( (GetTrkEndTrk(trk,ep)) == NULL ) { continue; + } angle1 = GetTrkEndAngle(trk,ep); angle1 = NormalizeAngle(angle1-angle); - if ( angle1 > 180.0 ) - angle1 = 360.0-angle1; + if ( angle1 > 180.0 ) { + angle1 = 360.0-angle1; + } if ( angle1 < angle0 ) { *epR = ep; *reverseR = FALSE; @@ -453,71 +499,81 @@ static BOOL_T FindTurntableEndPt( static EPINX_T FindTurntableNextEndPt( - track_p trk, - coOrd pos) { - - EPINX_T ep,epfound=-1,epCnt; - struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); - ANGLE_T a = FindAngle(xx->pos,pos); - ANGLE_T foundangle = 370.0; - ANGLE_T diff = DifferenceBetweenAngles(GetTrkEndAngle(trk,xx->currEp),a); - BOOL_T forward = TRUE; - if (diff>90) { - forward = FALSE; - } - if (diff<0 && diff>-90) { - forward = FALSE; - } - ANGLE_T currdiff, angle1; - for (ep=0,epCnt=GetTrkEndPtCnt(trk); ep<epCnt; ep++) { - if ( (GetTrkEndTrk(trk,ep)) == NULL ) - continue; - angle1 = GetTrkEndAngle(trk,ep); - if (forward) - currdiff = NormalizeAngle(angle1-a); - else - currdiff = NormalizeAngle(a-angle1); - if (currdiff<foundangle) { - foundangle = currdiff; - epfound = ep; - } + track_p trk, + coOrd pos) +{ + + EPINX_T ep,epfound=-1,epCnt; + struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); + ANGLE_T a = FindAngle(xx->pos,pos); + ANGLE_T foundangle = 370.0; + ANGLE_T diff = DifferenceBetweenAngles(GetTrkEndAngle(trk,xx->currEp),a); + BOOL_T forward = TRUE; + if (diff>90) { + forward = FALSE; + } + if (diff<0 && diff>-90) { + forward = FALSE; + } + ANGLE_T currdiff, angle1; + for (ep=0,epCnt=GetTrkEndPtCnt(trk); ep<epCnt; ep++) { + if ( (GetTrkEndTrk(trk,ep)) == NULL ) { + continue; + } + angle1 = GetTrkEndAngle(trk,ep); + if (forward) { + currdiff = NormalizeAngle(angle1-a); + } else { + currdiff = NormalizeAngle(a-angle1); } - return epfound; + if (currdiff<foundangle) { + foundangle = currdiff; + epfound = ep; + } + } + return epfound; } static BOOL_T CheckTraverseTurntable( - track_p trk, - coOrd pos ) + track_p trk, + coOrd pos ) { - struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); ANGLE_T angle; - if ( !ValidateTurntablePosition( trk ) ) + if ( !ValidateTurntablePosition( trk ) ) { return FALSE; - angle = FindAngle( xx->pos, pos ) - GetTrkEndAngle( trk, xx->currEp )+connectAngle/2.0; - if ( angle <= connectAngle || - ( angle >= 180.0 && angle <= 180+connectAngle ) ) + } + angle = FindAngle( xx->pos, pos ) - GetTrkEndAngle( trk, + xx->currEp )+connectAngle/2.0; + if ( angle <= connectAngle || + ( angle >= 180.0 && angle <= 180+connectAngle ) ) { return TRUE; + } return FALSE; } static BOOL_T TraverseTurntable( - traverseTrack_p trvTrk, - DIST_T * distR ) + traverseTrack_p trvTrk, + DIST_T * distR ) { track_p trk = trvTrk->trk; - struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); coOrd pos0; DIST_T dist, dist1; ANGLE_T angle, angle1; - EPINX_T ep; + EPINX_T ep = 0; BOOL_T reverse; - if ( !ValidateTurntablePosition( trk ) ) + if ( !ValidateTurntablePosition( trk ) ) { return FALSE; + } dist = FindDistance( xx->pos, trvTrk->pos ); pos0 = GetTrkEndPos( trk, xx->currEp ); angle = FindAngle( pos0, xx->pos ); @@ -529,8 +585,9 @@ static BOOL_T TraverseTurntable( if ( dist > xx->radius*0.9 ) { angle = NormalizeAngle( angle-trvTrk->angle ); if ( ( angle < 90.0 && angle > connectAngle ) || - ( angle > 270.0 && angle < 360.0-connectAngle ) ) + ( angle > 270.0 && angle < 360.0-connectAngle ) ) { return FALSE; + } } trvTrk->angle = angle1; angle = FindAngle( trvTrk->pos, xx->pos ); @@ -552,7 +609,8 @@ static BOOL_T TraverseTurntable( } Translate( &trvTrk->pos, xx->pos, angle1, xx->radius ); *distR -= dist1; - if ( FindTurntableEndPt( trk, &angle1, &ep, &reverse ) && angle1 < connectAngle ) { + if ( FindTurntableEndPt( trk, &angle1, &ep, &reverse ) + && angle1 < connectAngle ) { trk = GetTrkEndTrk(trk,ep); } else { trk = NULL; @@ -575,10 +633,12 @@ static BOOL_T EnumerateTurntable( track_p trk ) xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); DYNARR_APPEND( FLOAT_T, turntables_da, 10 ); turntables(turntables_da.cnt-1) = xx->radius*2.0; - sprintf( tmp, "Turntable, diameter %s", FormatDistance(turntables(turntables_da.cnt-1)) ); + sprintf( tmp, "Turntable, diameter %s", + FormatDistance(turntables(turntables_da.cnt-1)) ); inx = strlen( tmp ); - if ( inx > enumerateMaxDescLen ) + if ( inx > enumerateMaxDescLen ) { enumerateMaxDescLen = (int)inx; + } } else { for (inx=0; inx<turntables_da.cnt; inx++) { content = TRUE; @@ -606,7 +666,7 @@ static STATUS_T ModifyTurntable( track_p trk, wAction_t action, coOrd pos ) case C_DOWN: TurntableGetCenter( trk, &ttCenter, &ttRadius ); tempSegs(0).type = SEG_STRTRK; - tempSegs(0).width = 0; + tempSegs(0).lineWidth = 0; InfoMessage( _("Drag to create stall track") ); case C_MOVE: @@ -616,22 +676,25 @@ static STATUS_T ModifyTurntable( track_p trk, wAction_t action, coOrd pos ) } else if ((r=FindDistance( ttCenter, pos )) < ttRadius) { ErrorMessage( MSG_POINT_INSIDE_TURNTABLE ); } else if ( (r-ttRadius) <= minLength ) { - if (action == C_MOVE) - ErrorMessage( MSG_TRK_TOO_SHORT, "Stall ", PutDim(fabs(minLength-(r-ttRadius))) ); + if (action == C_MOVE) { + ErrorMessage( MSG_TRK_TOO_SHORT, "Stall ", + PutDim(fabs(minLength-(r-ttRadius))) ); + } } else { Translate( &tempSegs(0).u.l.pos[0], ttCenter, angle, ttRadius ); Translate( &tempSegs(0).u.l.pos[1], ttCenter, angle, r ); if (action == C_MOVE) InfoMessage( _("Straight Track: Length=%s Angle=%0.3f"), - FormatDistance( r-ttRadius ), PutAngle( angle ) ); - tempSegs_da.cnt = 1; + FormatDistance( r-ttRadius ), PutAngle( angle ) ); + DYNARR_SET( trkSeg_t, tempSegs_da, 1 ); valid = TRUE; } return C_CONTINUE; case C_UP: - if (!valid) + if (!valid) { return C_TERMINATE; + } ep = NewTurntableEndPt( trk, angle ); trk1 = NewStraightTrack( tempSegs(0).u.l.pos[0], tempSegs(0).u.l.pos[1] ); CopyAttributes( trk, trk1 ); @@ -646,22 +709,25 @@ static STATUS_T ModifyTurntable( track_p trk, wAction_t action, coOrd pos ) } EXPORT BOOL_T ConnectTurntableTracks( - track_p trk1, /*The turntable */ - EPINX_T ep1, /*Ignored */ - track_p trk2, - EPINX_T ep2 ) { + track_p trk1, /*The turntable */ + EPINX_T ep1, /*Ignored */ + track_p trk2, + EPINX_T ep2 ) +{ coOrd center, pos; DIST_T radius; DIST_T dist; - if (!QueryTrack(trk1,Q_CAN_ADD_ENDPOINTS)) return FALSE; + if (!QueryTrack(trk1,Q_CAN_ADD_ENDPOINTS)) { return FALSE; } TurntableGetCenter( trk1, ¢er, &radius ); pos = GetTrkEndPos(trk2,ep2); ANGLE_T angle = FindAngle(center, GetTrkEndPos(trk2,ep2)); - if (fabs(DifferenceBetweenAngles(GetTrkEndAngle(trk2,ep2),angle+180)) <= connectAngle) { + if (fabs(DifferenceBetweenAngles(GetTrkEndAngle(trk2,ep2), + angle+180)) <= connectAngle) { dist = FindDistance(center,pos)-radius; if (dist < connectDistance) { - UndoStart( _("Connect Turntable Tracks"), "TurnTracks(T%d[%d] T%d[%d] D%0.3f A%0.3F )", - GetTrkIndex(trk1), ep1, GetTrkIndex(trk2), ep2, dist, angle ); + UndoStart( _("Connect Turntable Tracks"), + "TurnTracks(T%d[%d] T%d[%d] D%0.3f A%0.3F )", + GetTrkIndex(trk1), ep1, GetTrkIndex(trk2), ep2, dist, angle ); UndoModify(trk1); EPINX_T ep = NewTurntableEndPt(trk1,angle); if (ConnectTracks( trk1, ep, trk2, ep2 )) { @@ -676,7 +742,8 @@ EXPORT BOOL_T ConnectTurntableTracks( } -static BOOL_T GetParamsTurntable( int inx, track_p trk, coOrd pos, trackParams_t * params ) +static BOOL_T GetParamsTurntable( int inx, track_p trk, coOrd pos, + trackParams_t * params ) { coOrd center; DIST_T radius; @@ -688,8 +755,9 @@ static BOOL_T GetParamsTurntable( int inx, track_p trk, coOrd pos, trackParams_t params->type = curveTypeStraight; params->ep = -1; params->angle = ConstrainTurntableAngle( trk, pos ); - if (params->angle < 0.0) - return FALSE; + if (params->angle < 0.0) { + return FALSE; + } TurntableGetCenter( trk, ¢er, &radius ); PointOnCircle( ¶ms->lineOrig, center, radius, params->angle ); params->lineEnd = params->lineOrig; @@ -701,7 +769,8 @@ static BOOL_T GetParamsTurntable( int inx, track_p trk, coOrd pos, trackParams_t } -static BOOL_T MoveEndPtTurntable( track_p *trk, EPINX_T *ep, coOrd pos, DIST_T d0 ) +static BOOL_T MoveEndPtTurntable( track_p *trk, EPINX_T *ep, coOrd pos, + DIST_T d0 ) { coOrd posCen; DIST_T r; @@ -725,14 +794,16 @@ static BOOL_T MoveEndPtTurntable( track_p *trk, EPINX_T *ep, coOrd pos, DIST_T d //Look for empty slot BOOL_T found = FALSE; for (*ep=0; *ep<GetTrkEndPtCnt(*trk); *ep=*ep+1) { - if ( (GetTrkEndTrk(*trk,*ep)) == NULL ) + if ( (GetTrkEndTrk(*trk,*ep)) == NULL ) { found = TRUE; - break; + } + break; } - if (!found) + if (!found) { *ep = NewTurntableEndPt(*trk,angle0); - else { - struct extraDataTurntable_t *xx = GET_EXTRA_DATA(*trk, T_TURNTABLE, extraDataTurntable_t); + } else { + struct extraDataTurntable_t *xx = GET_EXTRA_DATA(*trk, T_TURNTABLE, + extraDataTurntable_t); coOrd pos1; PointOnCircle( &pos1, xx->pos, xx->radius, angle0 ); SetTrkEndPoint(*trk, *ep, pos1, angle0); //Reuse @@ -759,7 +830,7 @@ static BOOL_T QueryTurntable( track_p trk, int query ) case Q_ISTRACK: case Q_NOT_PLACE_FROGPOINTS: case Q_MODIFY_REDRAW_DONT_UNDRAW_TRACK: - case Q_CAN_ADD_ENDPOINTS: + case Q_CAN_ADD_ENDPOINTS: return TRUE; case Q_MODIFY_CAN_SPLIT: case Q_CORNU_CAN_MODIFY: @@ -771,11 +842,12 @@ static BOOL_T QueryTurntable( track_p trk, int query ) static void FlipTurntable( - track_p trk, - coOrd orig, - ANGLE_T angle ) + track_p trk, + coOrd orig, + ANGLE_T angle ) { - struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); FlipPoint( &xx->pos, orig, angle ); ComputeBoundingBox( trk ); } @@ -784,12 +856,14 @@ BOOL_T debug = 0; static void DrawTurntablePositionIndicator( track_p trk, wDrawColor color ) { - struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); coOrd pos0, pos1; ANGLE_T angle; - - if ( !ValidateTurntablePosition(trk) ) + + if ( !ValidateTurntablePosition(trk) ) { return; + } pos0 = GetTrkEndPos(trk,xx->currEp); angle = FindAngle( xx->pos, pos0 ); PointOnCircle( &pos1, xx->pos, xx->radius, angle+180.0 ); @@ -808,8 +882,10 @@ static void DrawTurntablePositionIndicator( track_p trk, wDrawColor color ) static wBool_t CompareTurntable( track_cp trk1, track_cp trk2 ) { - struct extraDataTurntable_t *xx1 = GET_EXTRA_DATA( trk1, T_TURNTABLE, extraDataTurntable_t ); - struct extraDataTurntable_t *xx2 = GET_EXTRA_DATA( trk2, T_TURNTABLE, extraDataTurntable_t ); + struct extraDataTurntable_t *xx1 = GET_EXTRA_DATA( trk1, T_TURNTABLE, + extraDataTurntable_t ); + struct extraDataTurntable_t *xx2 = GET_EXTRA_DATA( trk2, T_TURNTABLE, + extraDataTurntable_t ); char * cp = message + strlen(message); REGRESS_CHECK_POS( "Pos", xx1, xx2, pos ) REGRESS_CHECK_DIST( "Radius", xx1, xx2, radius ) @@ -819,13 +895,14 @@ static wBool_t CompareTurntable( track_cp trk1, track_cp trk2 ) } static void AdvanceTurntablePositionIndicator( - track_p trk, - coOrd pos, - coOrd * posR, - ANGLE_T * angleR ) + track_p trk, + coOrd pos, + coOrd * posR, + ANGLE_T * angleR ) { - struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, extraDataTurntable_t); + struct extraDataTurntable_t * xx = GET_EXTRA_DATA(trk, T_TURNTABLE, + extraDataTurntable_t); EPINX_T ep; ANGLE_T angle0, angle1; BOOL_T reverse=FALSE, train_reversed = FALSE; @@ -834,12 +911,13 @@ static void AdvanceTurntablePositionIndicator( coOrd inpos = *posR; ANGLE_T inangle = *angleR; angle0 = GetTrkEndAngle(trk,xx->currEp); - if (fabs(DifferenceBetweenAngles(angle0,*angleR))>90) train_reversed = TRUE; + if (fabs(DifferenceBetweenAngles(angle0,*angleR))>90) { train_reversed = TRUE; } DIST_T dd = DIST_INF; // If on ep, use that for (ep=0; ep<epCnt; ep++) { - if ( (GetTrkEndTrk(trk,ep)) == NULL ) + if ( (GetTrkEndTrk(trk,ep)) == NULL ) { continue; + } coOrd end = GetTrkEndPos(trk,ep); DIST_T d = FindDistance(end,pos); if (d<dd) { @@ -861,7 +939,8 @@ static void AdvanceTurntablePositionIndicator( train_reversed = !train_reversed; } else { //If back end moving, flip result - if (fabs(DifferenceBetweenAngles(FindAngle(xx->pos,pos),GetTrkEndAngle(trk,xx->currEp)))>90) { + if (fabs(DifferenceBetweenAngles(FindAngle(xx->pos,pos),GetTrkEndAngle(trk, + xx->currEp)))>90) { if (epfound>=0 && epfound != xx->currEp) { reverse = TRUE; xx->reverse = !xx->reverse; @@ -879,48 +958,51 @@ static void AdvanceTurntablePositionIndicator( Translate(posR, xx->pos, *angleR, FindDistance(*posR,xx->pos) ); } coOrd outpos = *posR; - if (debug) - InfoMessage("AO:%0.3f PO:(%0.3f,%0.3f) AI:%0.3f PI:(%0.3f,%0.3f)",*angleR,outpos.x,outpos.y,inangle,inpos.x,inpos.y); + if (debug) { + InfoMessage("AO:%0.3f PO:(%0.3f,%0.3f) AI:%0.3f PI:(%0.3f,%0.3f)",*angleR, + outpos.x,outpos.y,inangle,inpos.x,inpos.y); + } } } static trackCmd_t turntableCmds = { - "TURNTABLE", - DrawTurntable, - DistanceTurntable, - DescribeTurntable, - DeleteTurntable, - WriteTurntable, - ReadTurntable, - MoveTurntable, - RotateTurntable, - RescaleTurntable, - NULL, /* audit */ - GetAngleTurntable, - SplitTurntable, /* split */ - TraverseTurntable, - EnumerateTurntable, - NULL, /* redraw */ - NULL, /* trim */ - NULL, /* merge */ - ModifyTurntable, - NULL, /* getLength */ - GetParamsTurntable, - MoveEndPtTurntable, - QueryTurntable, - NULL, /* ungroup */ - FlipTurntable, - DrawTurntablePositionIndicator, - AdvanceTurntablePositionIndicator, - CheckTraverseTurntable, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - CompareTurntable }; + "TURNTABLE", + DrawTurntable, + DistanceTurntable, + DescribeTurntable, + DeleteTurntable, + WriteTurntable, + ReadTurntable, + MoveTurntable, + RotateTurntable, + RescaleTurntable, + NULL, /* audit */ + GetAngleTurntable, + SplitTurntable, /* split */ + TraverseTurntable, + EnumerateTurntable, + NULL, /* redraw */ + NULL, /* trim */ + NULL, /* merge */ + ModifyTurntable, + NULL, /* getLength */ + GetParamsTurntable, + MoveEndPtTurntable, + QueryTurntable, + NULL, /* ungroup */ + FlipTurntable, + DrawTurntablePositionIndicator, + AdvanceTurntablePositionIndicator, + CheckTraverseTurntable, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + CompareTurntable +}; static STATUS_T CmdTurntable( wAction_t action, coOrd pos ) @@ -934,8 +1016,9 @@ static STATUS_T CmdTurntable( wAction_t action, coOrd pos ) switch (action) { case C_START: - if (turntableDiameterPD.control==NULL) + if (turntableDiameterPD.control==NULL) { ParamCreateControls( &turntablePG, NULL ); + } sprintf( message, "turntable-diameter-%s", curScaleName ); turntableDiameter = ceil(80.0*12.0/curScaleRatio); wPrefGetFloat( "misc", message, &turntableDiameter, turntableDiameter ); @@ -984,7 +1067,8 @@ static STATUS_T CmdTurntable( wAction_t action, coOrd pos ) case C_REDRAW: if ( state > 0 ) { - DrawArc( &tempD, pos0, turntableDiameter/2.0, 0.0, 360.0, 0, 0, wDrawColorBlack ); + DrawArc( &tempD, pos0, turntableDiameter/2.0, 0.0, 360.0, 0, 0, + wDrawColorBlack ); } return C_CONTINUE; @@ -998,12 +1082,14 @@ static STATUS_T CmdTurntable( wAction_t action, coOrd pos ) } -#include "bitmaps/turntable.xpm" +#include "bitmaps/turntable.xpm3" EXPORT void InitCmdTurntable( wMenu_p menu ) { - AddMenuButton( menu, CmdTurntable, "cmdTurntable", _("Custom Turntable"), wIconCreatePixMap(turntable_xpm[iconSize]), LEVEL0_50, IC_STICKY|IC_INITNOTSTICKY, ACCL_TURNTABLE, NULL ); + AddMenuButton( menu, CmdTurntable, "cmdTurntable", _("Custom Turntable"), + wIconCreatePixMap(turntable_xpm3[iconSize]), LEVEL0_50, + IC_STICKY|IC_INITNOTSTICKY, ACCL_TURNTABLE, NULL ); } |