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/misc2.c | |
parent | 5d2c2b27a6323e2666378b986129b2a7c2c39e5c (diff) |
New upstream version 5.3.0GAupstream/5.3.0GAupstream
Diffstat (limited to 'app/bin/misc2.c')
-rw-r--r-- | app/bin/misc2.c | 898 |
1 files changed, 0 insertions, 898 deletions
diff --git a/app/bin/misc2.c b/app/bin/misc2.c deleted file mode 100644 index 6334bf2..0000000 --- a/app/bin/misc2.c +++ /dev/null @@ -1,898 +0,0 @@ -/** \file misc2.c - * Management of information about scales and gauges plus rprintf. - */ - -/* 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. - */ - -#include "cjoin.h" -#include "common.h" -#include "compound.h" -#include "custom.h" -#include "draw.h" -#include "fileio.h" -#include "layout.h" -#include "misc.h" -#include "param.h" -#include "track.h" -#include "common-ui.h" - - -EXPORT long units = 0; /**< measurement units: 0 = English, 1 = metric */ -EXPORT long checkPtInterval = 10; -EXPORT long autosaveChkPoints = 0; - -EXPORT DIST_T curScaleRatio; -EXPORT char * curScaleName; -EXPORT DIST_T trackGauge; -EXPORT long labelScale = 8; -EXPORT long labelEnable = (LABELENABLE_ENDPT_ELEV|LABELENABLE_CARS); -/** @prefs [draw] label-when=2 Unknown */ -EXPORT long labelWhen = 2; -EXPORT long colorTrack = 0; -EXPORT long colorDraw = 0; -EXPORT long constrainMain = 0; -EXPORT long dontHideCursor = 0; -EXPORT long hideSelectionWindow = 0; -EXPORT long angleSystem = 0; -EXPORT DIST_T minLength = 0.1; -EXPORT DIST_T connectDistance = 0.1; -EXPORT ANGLE_T connectAngle = 1.0; -EXPORT long twoRailScale = 16; -EXPORT long mapScale = 64; -EXPORT long liveMap = 0; -EXPORT long preSelect = 0; /**< default command 0 = Describe 1 = Select */ -EXPORT long listLabels = 7; -EXPORT long layoutLabels = 1; -EXPORT long descriptionFontSize = 72; -EXPORT long enableListPrices = 1; -EXPORT void ScaleLengthEnd(void); - -static BOOL_T SetScaleDescGauge(SCALEINX_T scaleInx); - - -/**************************************************************************** - * - * RPRINTF - * - */ - - -#define RBUFF_SIZE (8192) -static char rbuff[RBUFF_SIZE+1]; -static int roff; -static int rbuff_record = 0; - -EXPORT void Rdump( FILE * outf ) -{ - fprintf( outf, "Record Buffer:\n" ); - rbuff[RBUFF_SIZE] = '\0'; - fprintf( outf, "%s", rbuff+roff ); - rbuff[roff] = '\0'; - fprintf( outf, "%s", rbuff ); - memset( rbuff, 0, sizeof rbuff ); - roff = 0; -} - - -EXPORT void Rprintf( - char * format, - ... ) -{ - static char buff[STR_SIZE]; - char * cp; - va_list ap; - va_start( ap, format ); - vsprintf( buff, format, ap ); - va_end( ap ); - if (rbuff_record >= 1) - lprintf( buff ); - for ( cp=buff; *cp; cp++ ) { - rbuff[roff] = *cp; - roff++; - if (roff>=RBUFF_SIZE) - roff=0; - } -} - -/**************************************************************************** - * - * CHANGE NOTIFICATION - * - */ - - -static changeNotificationCallBack_t changeNotificationCallBacks[20]; -static int changeNotificationCallBackCnt = 0; - -EXPORT void RegisterChangeNotification( - changeNotificationCallBack_t action ) -{ - changeNotificationCallBacks[changeNotificationCallBackCnt] = action; - changeNotificationCallBackCnt++; -} - - -EXPORT void DoChangeNotification( long changes ) -{ - int inx; - for (inx=0;inx<changeNotificationCallBackCnt;inx++) - changeNotificationCallBacks[inx](changes); -} - - -/**************************************************************************** - * - * SCALE - * - */ - -typedef struct { - char * scale; - DIST_T ratio; - DIST_T gauge; - DIST_T R[3]; - DIST_T X[3]; - DIST_T L[3]; - wIndex_t index; - DIST_T length; - BOOL_T tieDataValid; - tieData_t tieData; - } scaleInfo_t; -EXPORT typedef scaleInfo_t * scaleInfo_p; -static dynArr_t scaleInfo_da; -#define scaleInfo(N) DYNARR_N( scaleInfo_t, scaleInfo_da, N ) - -typedef struct { - char *in_scales; - SCALE_FIT_TYPE_T type; - char *match_scales; - SCALE_FIT_T result; -} scaleComp_t; -EXPORT typedef scaleComp_t * scaleComp_p; -static dynArr_t scaleCompatible_da; -#define scaleComp(N) DYNARR_N( scaleComp_t, scaleCompatible_da, N ) - -static tieData_t tieData_demo = { - 96.0/160.0, - 16.0/160.0, - 32.0/160.0 }; - -//EXPORT SCALEINX_T curScaleInx = -1; -static scaleInfo_p curScale; -/** @prefs [misc] include same gauge turnouts=1 Unknown */ -EXPORT long includeSameGaugeTurnouts = FALSE; -static SCALEINX_T demoScaleInx = -1; - - -/** this struct holds a gauge description */ -typedef struct { - char * gauge; /** ptr to textual description eg. 'n3' */ - SCALEINX_T scale; /** index of complete information in scaleInfo_da */ - wIndex_t index; - } gaugeInfo_t; - -EXPORT typedef gaugeInfo_t * gaugeInfo_p; - -/** this struct holds a scale description */ -typedef struct { - char *scaleDesc; /** ptr to textual description eg. 'HO' */ - SCALEINX_T scale; /** index of complete information (standard gauge) in scaleInfo_da */ - wIndex_t index; - dynArr_t gauges_da; /** known gauges to this scale */ - } scaleDesc_t; - -EXPORT typedef scaleDesc_t *scaleDesc_p; -static dynArr_t scaleDesc_da; -#define scaleDesc(N) DYNARR_N( scaleDesc_t, scaleDesc_da, N ) - - -/** - * Get the ratio from a scale description. Each member in the list of scale descriptions is - * linked to an entry in the simple linear list of all scales/gauges. From there the ratio is - * fetched and returned. Note that there is no error checking on parameters! - * - * \param IN sdi index into list of scale descriptions - * \return ratio for scale - */ - -EXPORT DIST_T GetScaleDescRatio( SCALEDESCINX_T sdi ) -{ - return GetScaleRatio( scaleDesc(sdi).scale ); -} - -/** - * Get the index into the linear list from a scale description and a gauge. All information about a - * scale/ gauge combination is stored in a linear list. The index in that list for a given scale and the - * gauge is returned by this function. Note that there is no error checking on parameters! - * - * \param IN scaleInx index into list of scale descriptions - * \param IN gaugeInx index into list of gauges available for this scale - * \return index into master list of scale/gauge combinations - */ - -EXPORT SCALEINX_T GetScaleInx( SCALEDESCINX_T scaleInx, GAUGEINX_T gaugeInx ) -{ - scaleDesc_t s; - gaugeInfo_p g; - - s = scaleDesc(scaleInx); - g = &(DYNARR_N(gaugeInfo_t, s.gauges_da, gaugeInx)); - - return g->scale; - -} -EXPORT DIST_T GetScaleTrackGauge( SCALEINX_T si ) -{ - if (si >=0 && si<scaleInfo_da.cnt) - return scaleInfo(si).gauge; - else return 1.0; -} - -EXPORT DIST_T GetScaleRatio( SCALEINX_T si ) -{ - if (si >=0 && si<scaleInfo_da.cnt) - return scaleInfo(si).ratio; - else return 1.0; -} - -EXPORT char * GetScaleName( SCALEINX_T si ) -{ - if ( si == -1 ) - return "DEMO"; - if ( si == SCALE_ANY ) - return "*"; - else if ( si < 0 || si >= scaleInfo_da.cnt ) - return "Unknown"; - else - return scaleInfo(si).scale; -} - -EXPORT void GetScaleEasementValues( DIST_T * R, DIST_T * L ) -{ - wIndex_t i; - for (i=0;i<3;i++) { - *R++ = curScale->R[i]; - *L++ = curScale->L[i]; - } -} - - -EXPORT tieData_p GetScaleTieData( SCALEINX_T si ) -{ - scaleInfo_p s; - DIST_T defLength; - - if ( si == -1 ) - return &tieData_demo; - else if ( si < 0 || si >= scaleInfo_da.cnt ) - return &tieData_demo; - s = &scaleInfo(si); - if ( !s->tieDataValid ) { - sprintf( message, "tiedata-%s", s->scale ); - defLength = (96.0-54.0)/s->ratio+s->gauge; - - /** @prefs [tiedata-<SCALE>] length, width, spacing Sets tie drawing data. - * Example for 6"x8"x6' ties spaced 20" in HOn3 (slash separates 4 lines): - * [tiedata-HOn3] \ length=0.83 \ width=0.07 \ spacing=0.23 - */ - wPrefGetFloat( message, "length", &s->tieData.length, defLength ); - wPrefGetFloat( message, "width", &s->tieData.width, 16.0/s->ratio ); - wPrefGetFloat( message, "spacing", &s->tieData.spacing, 2*s->tieData.width ); - s->tieDataValid = TRUE; - } - return &scaleInfo(si).tieData; -} - -EXPORT char *GetScaleDesc( SCALEDESCINX_T inx ) -{ - return scaleDesc(inx).scaleDesc; -} - -EXPORT char *GetGaugeDesc( SCALEDESCINX_T scaleInx, GAUGEINX_T gaugeInx ) -{ - scaleDesc_t s; - gaugeInfo_p g; - - s = scaleDesc(scaleInx); - g = &(DYNARR_N(gaugeInfo_t, s.gauges_da, gaugeInx)); - - return g->gauge; -} - -void -SetScaleGauge(SCALEDESCINX_T desc, GAUGEINX_T gauge) -{ - dynArr_t gauges_da; - - gauges_da = (scaleDesc(desc)).gauges_da; - SetLayoutCurScale( DYNARR_N( gaugeInfo_t, gauges_da, gauge).scale); -} - -static BOOL_T -SetScaleDescGauge(SCALEINX_T scaleInx) -{ - int i, j; - char *scaleName = GetScaleName(scaleInx); - DIST_T scaleRatio = GetScaleRatio(scaleInx); - dynArr_t gauges_da; - - for (i = 0; i < scaleDesc_da.cnt; i++) { - char *t = strchr(scaleDesc(i).scaleDesc, ' '); - /* are the first characters (which describe the scale) identical? */ - if (!strncmp(scaleDesc(i).scaleDesc, scaleName, t - scaleDesc(i).scaleDesc)) { - /* if yes, are we talking about the same ratio */ - if (scaleInfo(scaleDesc(i).scale).ratio == scaleRatio) { - /* yes, we found the right scale descriptor, so now look for the gauge */ - SetLayoutCurScaleDesc( i ); - gauges_da = scaleDesc(i).gauges_da; - SetLayoutCurGauge(0); - for (j = 0; j < gauges_da.cnt; j++) { - gaugeInfo_p ptr = &(DYNARR_N(gaugeInfo_t, gauges_da, j)); - if (scaleInfo(ptr->scale).gauge == GetScaleTrackGauge(scaleInx)) { - SetLayoutCurGauge( j ); - break; - } - } - break; - } - } - } - - return TRUE; -} - -EXPORT SCALEINX_T LookupScale( const char * name ) -{ - wIndex_t si; - DIST_T gauge; - if ( strcmp( name, "*" ) == 0 ) - return SCALE_ANY; - for ( si=0; si<scaleInfo_da.cnt; si++ ) { - if (strcmp( scaleInfo(si).scale, name ) == 0) - return si; - } - if ( isdigit((unsigned char)name[0]) ) { - gauge = atof( name ); - for ( si=0; si<scaleInfo_da.cnt; si++ ) { - if (scaleInfo(si).gauge == gauge) - return si; - } - } - NoticeMessage( MSG_BAD_SCALE_NAME, "Ok", NULL, name, sProdNameLower ); - si = scaleInfo_da.cnt; - DYNARR_APPEND( scaleInfo_t, scaleInfo_da, 10 ); - scaleInfo(si) = scaleInfo(0); - scaleInfo(si).scale = MyStrdup( name ); - return si; -} - -/* - * Evaluate the fit of a part scale1 to a definition in scale2 for a type. - * - * The rules differ by type of object. - * - * Tracks need to be the same gauge to be a fit. If they are the same scale they are exact. - * If the gauge is the same, but the scale is different they are compatible. - * There are well known exceptions where the scale is not the same but we call them exact. - * - * Structures need to be the same scale to be exact. If they are within 15% they are compatible. - * - * Cars need to be the same gauge and scale to be exact. - * If they are the same gauge, but within 15% of the scale they are compatible. - * - *\param type (FIT_TURNOUT,FIT_STRUCTURE,FIT_CAR) - *\param scale1 the input scale - *\param scale2 the scale to check against - * - *\return FIT_EXACT, FIT_COMPATIBLE, FIT_NONE - */ - -EXPORT SCALE_FIT_T CompatibleScale( - SCALE_FIT_TYPE_T type, - SCALEINX_T scale1, - SCALEINX_T scale2 ) -{ - SCALE_FIT_T rc; - if ( scale1 == scale2 ) - return FIT_EXACT; - if ( scale1 == SCALE_DEMO || scale2 == SCALE_DEMO ) - return FIT_NONE; - if ( scale1 == demoScaleInx || scale2 == demoScaleInx ) - return FIT_NONE; - switch(type) { - case FIT_TURNOUT: - if ( scale1 == SCALE_ANY ) - return FIT_EXACT; - if (scaleInfo(scale1).gauge == scaleInfo(scale2).gauge && - scaleInfo(scale1).scale == scaleInfo(scale2).scale) - return FIT_EXACT; - - rc = FindScaleCompatible(FIT_TURNOUT, scaleInfo(scale1).scale, scaleInfo(scale2).scale); - if (rc != FIT_NONE) return rc; - - if ( includeSameGaugeTurnouts && - scaleInfo(scale1).gauge == scaleInfo(scale2).gauge ) - return FIT_COMPATIBLE; - break; - case FIT_STRUCTURE: - if ( scale1 == SCALE_ANY ) - return FIT_EXACT; - if ( scaleInfo(scale1).ratio == scaleInfo(scale2).ratio ) - return FIT_EXACT; - - rc = FindScaleCompatible(FIT_STRUCTURE, scaleInfo(scale1).scale, scaleInfo(scale2).scale); - if (rc != FIT_NONE) return rc; - - //15% scale match is compatible for structures - if (scaleInfo(scale1).ratio/scaleInfo(scale2).ratio>=0.85 && - scaleInfo(scale1).ratio/scaleInfo(scale2).ratio<=1.15) - return FIT_COMPATIBLE; - break; - case FIT_CAR: - if ( scale1 == SCALE_ANY ) - return FIT_EXACT; - if (scaleInfo(scale1).gauge == scaleInfo(scale2).gauge && - scaleInfo(scale1).scale == scaleInfo(scale2).scale) - return FIT_EXACT; - - rc = FindScaleCompatible(FIT_CAR, scaleInfo(scale1).scale, scaleInfo(scale2).scale); - if (rc != FIT_NONE) return rc; - - //Same gauge and 15% scale match is compatible for cars - if (scaleInfo(scale1).gauge == scaleInfo(scale2).gauge) { - if (scaleInfo(scale1).ratio/scaleInfo(scale2).ratio>=0.85 && - scaleInfo(scale1).ratio/scaleInfo(scale2).ratio<=1.15) - return FIT_COMPATIBLE; - } - break; - - default:; - } - - return FIT_NONE; - -} - -/** Split the scale and the gauge description for a given combination. Eg HOn3 will be - * split to HO and n3. - * \param scaleInx IN scale/gauge combination - * \param scaleDescInx OUT scale part - * \param gaugeInx OUT gauge part - * \return TRUE - */ - -EXPORT BOOL_T -GetScaleGauge( SCALEINX_T scaleInx, SCALEDESCINX_T *scaleDescInx, GAUGEINX_T *gaugeInx) -{ - int i, j; - char *scaleName = GetScaleName( scaleInx ); - DIST_T scaleRatio = GetScaleRatio( scaleInx ); - dynArr_t gauges_da; - - for( i = 0; i < scaleDesc_da.cnt; i++ ) { - char *t = strchr( scaleDesc(i).scaleDesc, ' ' ); - /* are the first characters (which describe the scale) identical? */ - if( !strncmp( scaleDesc(i).scaleDesc, scaleName, t - scaleDesc(i).scaleDesc )) { - /* if yes, are we talking about the same ratio */ - if( scaleInfo(scaleDesc(i).scale).ratio == scaleRatio ) { - /* yes, we found the right scale descriptor, so now look for the gauge */ - *scaleDescInx = i; - gauges_da = scaleDesc(i).gauges_da; - *gaugeInx = 0; - for( j = 0; j < gauges_da.cnt; j++ ) { - gaugeInfo_p ptr = &(DYNARR_N( gaugeInfo_t, gauges_da, j )); - if( scaleInfo(ptr->scale).gauge == GetScaleTrackGauge( scaleInx )) { - *gaugeInx = j; - break; - } - } - break; - } - } - } - - return TRUE; -} - -/** - * Setup XTrkCad for the newly selected scale/gauge combination. - * - * \param newScaleInx IN the index of the selected scale/gauge combination - */ - -static void -SetScale( SCALEINX_T newScaleInx ) -{ - if (newScaleInx < 0 || newScaleInx >= scaleInfo_da.cnt) { - NoticeMessage( MSG_BAD_SCALE_INDEX, _("Ok"), NULL, (int)newScaleInx ); - return; - } - SetLayoutCurScale((SCALEINX_T)newScaleInx ); - curScale = &scaleInfo(newScaleInx); - trackGauge = curScale->gauge; - curScaleRatio = curScale->ratio; - curScaleName = curScale->scale; - - SetLayoutCurScaleDesc( 0 ); - - SetScaleDescGauge((SCALEINX_T)newScaleInx); - - - if (!inPlayback) - wPrefSetString( "misc", "scale", curScaleName ); - - // now load the minimum radius for the newly selected scale - LoadLayoutMinRadiusPref(curScaleName, curScale->R[0]); -} - -/** - * Check the new scale value and update the program if a valid scale was passed - * - * \param newScale IN the name of the new scale - * \returns TRUE if valid, FALSE otherwise - */ - -EXPORT BOOL_T DoSetScale( - char * newScale ) -{ - SCALEINX_T scale; - char * cp; - BOOL_T found = FALSE; - - if ( newScale != NULL ) { - cp = newScale+strlen(newScale)-1; - while ( *cp=='\n' || *cp==' ' || *cp=='\t' ) cp--; - cp[1] = '\0'; - while (isspace((unsigned char)*newScale)) newScale++; - for (scale = 0; scale<scaleInfo_da.cnt; scale++) { - if (strcasecmp( scaleInfo(scale).scale, newScale ) == 0) { - SetLayoutCurScale(scale); - found = TRUE; - break; - } - } - // was a valid scale given? - if( found ) { - DoChangeNotification( CHANGE_SCALE ); - } - } - - return found; -} - -/** - * Setup the data structures for scale and gauge. XTC reads 'scales' into an dynamic array, - * but doesn't differentiate between scale and gauge. - * This da is split into an dynamic array of scales. Each scale holds a dynamic array of gauges, - * with at least one gauge per scale (ie standard gauge) - * - * For usage in the dialogs, a textual description for each scale or gauge is provided - * - * \return TRUE - */ - -EXPORT BOOL_T DoSetScaleDesc( void ) -{ - SCALEINX_T scaleInx; - SCALEINX_T work; - SCALEDESCINX_T descInx; - scaleDesc_p s = NULL; - gaugeInfo_p g; - char *cp; - DIST_T ratio; - BOOL_T found; - char buf[ 80 ]; - size_t len; - - for( scaleInx = 0; scaleInx < scaleInfo_da.cnt; scaleInx++ ) { - ratio = DYNARR_N( scaleInfo_t, scaleInfo_da, scaleInx ).ratio; - - /* do we already have a description for this scale? */ - found = 0; - - if( scaleDesc_da.cnt > 0 ) { - for( descInx = 0; descInx < scaleDesc_da.cnt; descInx++ ) { - work = scaleDesc(descInx).scale; - if( scaleInfo(work).ratio == scaleInfo(scaleInx).ratio ) { - if( !strncmp( scaleInfo(work).scale, scaleInfo(scaleInx).scale, strlen(scaleInfo(work).scale))) - found = TRUE; - } - } - } - - - if( !found ) { - /* if no, add as new scale */ - - DYNARR_APPEND( scaleDesc_t, scaleDesc_da, 1 ); - - s = &(scaleDesc( scaleDesc_da.cnt-1 )); - - s->scale = scaleInx; - - sprintf( buf, "%s (1/%.1f)", scaleInfo(scaleInx).scale, scaleInfo(scaleInx).ratio ); - s->scaleDesc = MyStrdup( buf ); - - /* initialize the array with standard gauge */ - - DYNARR_APPEND( gaugeInfo_t, s->gauges_da, 10 ); - - g = &(DYNARR_N( gaugeInfo_t, s->gauges_da, (s->gauges_da).cnt - 1 )); - g->scale = scaleInx; - sprintf( buf, "Standard (%.1fmm)", scaleInfo(scaleInx).gauge*25.4 ); - g->gauge = MyStrdup( buf ); - - } else { - /* if yes, is this a new gauge to the scale? */ - DYNARR_APPEND( gaugeInfo_t, s->gauges_da, 10 ); - g = &(DYNARR_N( gaugeInfo_t, s->gauges_da, (s->gauges_da).cnt - 1 )); - g->scale = scaleInx; - cp = strchr( s->scaleDesc, ' ' ); - if( cp ) - len = cp - s->scaleDesc; - else - len = strlen(s->scaleDesc); - sprintf( buf, "%s (%.1fmm)", scaleInfo(scaleInx).scale+len, scaleInfo(scaleInx).gauge*25.4 ); - g->gauge = MyStrdup( buf ); - } - } - - return( TRUE ); -} - -static BOOL_T AddScale( - char * line ) -{ - wIndex_t i; - BOOL_T rc; - DIST_T R[3], X[3], L[3]; - DIST_T ratio, gauge; - char scale[40]; - scaleInfo_p s; - - if ( (rc=sscanf( line, "SCALE %[^,]," SCANF_FLOAT_FORMAT "," SCANF_FLOAT_FORMAT "", - scale, &ratio, &gauge )) != 3) { - SyntaxError( "SCALE", rc, 3 ); - return FALSE; - } - for (i=0;i<3;i++) { - line = GetNextLine(); - if ( (rc=sscanf( line, "" SCANF_FLOAT_FORMAT "," SCANF_FLOAT_FORMAT "," SCANF_FLOAT_FORMAT "", - &R[i], &X[i], &L[i] )) != 3 ) { - SyntaxError( "SCALE easement", rc, 3 ); - return FALSE; - } - } - - DYNARR_APPEND( scaleInfo_t, scaleInfo_da, 10 ); - s = &scaleInfo(scaleInfo_da.cnt-1); - s->scale = MyStrdup( scale ); - s->ratio = ratio; - s->gauge = gauge; - s->index = -1; - for (i=0; i<3; i++) { - s->R[i] = R[i]/ratio; - s->X[i] = X[i]/ratio; - s->L[i] = L[i]/ratio; - } - s->tieDataValid = FALSE; - if ( strcmp( scale, "DEMO" ) == 0 ) - demoScaleInx = scaleInfo_da.cnt-1; - return TRUE; -} - -static BOOL_T AddScaleFit( - char * line) { - char scales[STR_SIZE], matches[STR_SIZE], type[20], result[20]; - BOOL_T rc; - scaleComp_p s; - - if ( (rc=sscanf( line, "SCALEFIT %s %s %s %s", - type, result, scales, matches )) != 4) { - SyntaxError( "SCALEFIT", rc, 4 ); - return FALSE; - } - DYNARR_APPEND( scaleComp_t, scaleCompatible_da, 10 ); - s = &scaleComp(scaleCompatible_da.cnt-1); - s->in_scales = MyStrdup(scales); - s->match_scales = MyStrdup(matches); - if (strcmp(type,"STRUCTURE") == 0) { - s->type = FIT_STRUCTURE; - } else if (strcmp(type,"TURNOUT")==0) { - s->type = FIT_TURNOUT; - } else if (strcmp(type,"CAR")==0) { - s->type = FIT_CAR; - } else { - InputError( "Invalid SCALEFIT type %s", TRUE, type ); - return FALSE; - } - if (strcmp(result,"COMPATIBLE")==0) { - s->result = FIT_COMPATIBLE; - } else if (strcmp(result,"EXACT")==0) { - s->result = FIT_EXACT; - } else { - InputError( "Invalid SCALEFIT result %s", TRUE, result ); - return FALSE; - } - - return TRUE; -} - -EXPORT SCALE_FIT_T FindScaleCompatible(SCALE_FIT_TYPE_T type, char * scale1, char * scale2) { - - char * cp, * cq; - - if (!scale1 || !scale1[0]) return FIT_NONE; - if (!scale2 || !scale2[0]) return FIT_NONE; - - for (int i=0; i<scaleCompatible_da.cnt; i++) { - scaleComp_p s; - s = &scaleComp(i); - if (s->type != type) continue; - BOOL_T found = FALSE; - cp = s->in_scales; - //Match input scale - while (cp) { - //Next instance of needle in haystack - cp = strstr(cp,scale2); - if (!cp) break; - //Check that this is start of csv string - if (cp == s->in_scales || cp[-1] == ',') { - //Is this end of haystack? - if (strlen(cp) == strlen(scale2)) { - found = TRUE; - break; - } - //Is it the same until the next ',' - cq=strstr(cp,","); - if (cq && (cq-cp == strlen(scale2))) { - found = TRUE; - break; - } - else cp=cq; - } else cp=strstr(cp,","); - } - if (!found) continue; - found = FALSE; - cp = s->match_scales; - //Match output scale - while (cp) { - //Next instance of needle in haystack - cp = strstr(cp,scale1); - if (!cp) break; - //Check that this is start of csv string - if (cp == s->match_scales || cp[-1] == ',') { - //Is this end of haystack? - if (strlen(cp) == strlen(scale1)) { - found = TRUE; - break; - } - //Is it the same until the next ',' - cq=strstr(cp,","); - if (cq && (cq-cp == strlen(scale1))) { - found = TRUE; - break; - } - else cp=cq; - } else cp=strstr(cp,","); - } - if (!found) continue; - return s->result; - } - return FIT_NONE; -} - -EXPORT void ScaleLengthIncrement( - SCALEINX_T scale, - DIST_T length ) -{ - char * cp; - size_t len; - if (scaleInfo(scale).length == 0.0) { - if (units == UNITS_METRIC) - cp = "999.99m SCALE Flex Track"; - else - cp = "999' 11\" SCALE Flex Track"; - len = strlen( cp )+1; - if (len > enumerateMaxDescLen) - enumerateMaxDescLen = (int)len; - } - scaleInfo(scale).length += length; -} - -EXPORT void ScaleLengthEnd( void ) -{ - wIndex_t si; - size_t count; - DIST_T length; - char tmp[STR_SIZE]; - FLOAT_T flexLen; - long flexUnit; - FLOAT_T flexCost; - for (si=0; si<scaleInfo_da.cnt; si++) { - sprintf( tmp, "price list %s", scaleInfo(si).scale ); - wPrefGetFloat( tmp, "flex length", &flexLen, 0.0 ); - wPrefGetInteger( tmp, "flex unit", &flexUnit, 0 ); - wPrefGetFloat( tmp, "flex cost", &flexCost, 0.0 ); - tmp[0] = '\0'; - if ((length=scaleInfo(si).length) != 0) { - sprintf( tmp, "%s %s Flex Track", FormatDistance(length), scaleInfo(si).scale ); - for (count = strlen(tmp); count<enumerateMaxDescLen; count++) - tmp[count] = ' '; - tmp[enumerateMaxDescLen] = '\0'; - count = 0; - if (flexLen > 0.0) { - count = (int)ceil( length / (flexLen/(flexUnit?2.54:1.00))); - } - EnumerateList( (long)count, flexCost, tmp, NULL ); - } - scaleInfo(si).length = 0; - } -} - - - -EXPORT void LoadScaleList( wList_p scaleList ) -{ - wIndex_t inx; - for (inx=0; inx<scaleDesc_da.cnt-(extraButtons?0:1); inx++) { - scaleDesc(inx).index = - wListAddValue( scaleList, scaleDesc(inx).scaleDesc, NULL, I2VP(inx) ); - } -} - -EXPORT void LoadGaugeList( wList_p gaugeList, SCALEDESCINX_T scale ) -{ - wIndex_t inx; - scaleDesc_t s; - gaugeInfo_p g; - dynArr_t *gauges_da_p; - - s = scaleDesc(scale); - gauges_da_p = &(s.gauges_da); - g = gauges_da_p->ptr; - g = s.gauges_da.ptr; - - wListClear( gaugeList ); /* remove old list in case */ - for (inx=0; inx<gauges_da_p->cnt; inx++) { - (g[inx]).index = wListAddValue( gaugeList, (g[inx]).gauge, NULL, I2VP(g[inx].scale) ); - } -} - -static void ScaleChange( long changes ) -{ - if (changes & CHANGE_SCALE) { - SetScale( GetLayoutCurScale() ); - } -} - -/***************************************************************************** - * - * - * - */ - -EXPORT void Misc2Init( void ) -{ - AddParam( "SCALE ", AddScale ); - AddParam( "SCALEFIT", AddScaleFit); - wPrefGetInteger( "draw", "label-when", &labelWhen, labelWhen ); - RegisterChangeNotification( ScaleChange ); - wPrefGetInteger( "misc", "include same gauge turnouts", &includeSameGaugeTurnouts, 1 ); -} |