diff options
Diffstat (limited to 'app/bin/tcornu.c')
-rw-r--r-- | app/bin/tcornu.c | 1583 |
1 files changed, 806 insertions, 777 deletions
diff --git a/app/bin/tcornu.c b/app/bin/tcornu.c index dd09cfa..3e4b772 100644 --- a/app/bin/tcornu.c +++ b/app/bin/tcornu.c @@ -32,7 +32,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 */ @@ -45,23 +45,14 @@ #include "ccurve.h" #include "cstraigh.h" #include "cjoin.h" -#include "utility.h" #include "common.h" -#include "i18n.h" #include "param.h" -#include "math.h" -#include "string.h" #include "cundo.h" #include "layout.h" #include "fileio.h" -#include "assert.h" EXPORT TRKTYP_T T_CORNU = -1; -struct extraData { - cornuData_t cornuData; - }; - static int log_cornu = 0; static DIST_T GetLengthCornu( track_p ); @@ -75,194 +66,228 @@ static DIST_T GetLengthCornu( track_p ); /* * Run after any changes to the Cornu points */ -void SetUpCornuParmFromTracks(track_p trk[2],cornuParm_t * cp, struct extraData* xx) { +void SetUpCornuParmFromTracks(track_p trk[2],cornuParm_t * cp, + struct extraDataCornu_t* xx) +{ if (!trk[0]) { - cp->center[0] = xx->cornuData.c[0]; - cp->angle[0] = xx->cornuData.a[0]; - cp->radius[0] = xx->cornuData.r[0]; + cp->center[0] = xx->c[0]; + cp->angle[0] = xx->a[0]; + cp->radius[0] = xx->r[0]; } if (!trk[1]) { - cp->center[1] = xx->cornuData.c[1]; - cp->angle[1] = xx->cornuData.a[1]; - cp->radius[1] = xx->cornuData.r[1]; + cp->center[1] = xx->c[1]; + cp->angle[1] = xx->a[1]; + cp->radius[1] = xx->r[1]; } } -EXPORT BOOL_T FixUpCornu(coOrd pos[2], track_p trk[2], EPINX_T ep[2], struct extraData* xx) { +EXPORT BOOL_T FixUpCornu(coOrd pos[4], track_p trk[2], EPINX_T ep[2], + struct extraDataCornu_t* xx) +{ cornuParm_t cp; SetUpCornuParmFromTracks(trk,&cp,xx); - if (!CallCornu(pos, trk, ep, &xx->cornuData.arcSegs, &cp)) return FALSE; + if (!CallCornu(pos, trk, ep, &xx->arcSegs, &cp)) { return FALSE; } - xx->cornuData.r[0] = cp.radius[0]; + xx->r[0] = cp.radius[0]; if (cp.radius[0]==0) { - xx->cornuData.a[0] = cp.angle[0]; + xx->a[0] = cp.angle[0]; } else { - xx->cornuData.c[0] = cp.center[0]; + xx->c[0] = cp.center[0]; } - xx->cornuData.r[1] = cp.radius[1]; + xx->r[1] = cp.radius[1]; if (cp.radius[1]==0) { - xx->cornuData.a[1] = cp.angle[1]; + xx->a[1] = cp.angle[1]; } else { - xx->cornuData.c[1] = cp.center[1]; + xx->c[1] = cp.center[1]; } - xx->cornuData.minCurveRadius = CornuMinRadius(pos,xx->cornuData.arcSegs); - xx->cornuData.windingAngle = CornuTotalWindingArc(pos,xx->cornuData.arcSegs); + xx->minCurveRadius = CornuMinRadius(pos,xx->arcSegs); + xx->windingAngle = CornuTotalWindingArc(pos,xx->arcSegs); DIST_T last_c; - if (xx->cornuData.r[0] == 0) last_c = 0; - else last_c = 1/xx->cornuData.r[0]; - xx->cornuData.maxRateofChange = CornuMaxRateofChangeofCurvature(pos,xx->cornuData.arcSegs,&last_c); - xx->cornuData.length = CornuLength(pos, xx->cornuData.arcSegs); + if (xx->r[0] == 0) { last_c = 0; } + else { last_c = 1/xx->r[0]; } + xx->maxRateofChange = CornuMaxRateofChangeofCurvature(pos,xx->arcSegs,&last_c); + xx->length = CornuLength(pos, xx->arcSegs); return TRUE; } -EXPORT BOOL_T FixUpCornu0(coOrd pos[2],coOrd center[2],ANGLE_T angle[2],DIST_T radius[2],struct extraData* xx) { +EXPORT BOOL_T FixUpCornu0(coOrd pos[4],coOrd center[2],ANGLE_T angle[2], + DIST_T radius[2],struct extraDataCornu_t* xx) +{ DIST_T last_c; - if (!CallCornu0(pos, center, angle, radius,&xx->cornuData.arcSegs,FALSE)) return FALSE; - xx->cornuData.minCurveRadius = CornuMinRadius(pos, - xx->cornuData.arcSegs); - if (xx->cornuData.r[0] == 0) last_c = 0; - else last_c = 1/xx->cornuData.r[0]; - xx->cornuData.maxRateofChange = CornuMaxRateofChangeofCurvature(pos,xx->cornuData.arcSegs,&last_c); - xx->cornuData.length = CornuLength(pos, xx->cornuData.arcSegs); - xx->cornuData.windingAngle = CornuTotalWindingArc(pos,xx->cornuData.arcSegs); + if (!CallCornu0(pos, center, angle, radius,&xx->arcSegs,FALSE)) { return FALSE; } + xx->minCurveRadius = CornuMinRadius(pos, + xx->arcSegs); + if (xx->r[0] == 0) { last_c = 0; } + else { last_c = 1/xx->r[0]; } + xx->maxRateofChange = CornuMaxRateofChangeofCurvature(pos,xx->arcSegs,&last_c); + xx->length = CornuLength(pos, xx->arcSegs); + xx->windingAngle = CornuTotalWindingArc(pos,xx->arcSegs); return TRUE; } -EXPORT char * CreateSegPathList(track_p trk) { +EXPORT char * CreateSegPathList(track_p trk) +{ char * cp = "\0\0"; - if (GetTrkType(trk) != T_CORNU) return cp; - struct extraData *xx = GetTrkExtraData(trk); - if (xx->cornuData.cornuPath) MyFree(xx->cornuData.cornuPath); - xx->cornuData.cornuPath = MyMalloc(xx->cornuData.arcSegs.cnt+2); + if (GetTrkType(trk) != T_CORNU) { return cp; } + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + if (xx->cornuPath) { MyFree(xx->cornuPath); } + xx->cornuPath = MyMalloc(xx->arcSegs.cnt+2); int j= 0; - for (int i = 0;i<xx->cornuData.arcSegs.cnt;i++,j++) { - xx->cornuData.cornuPath[j] = i+1; + for (int i = 0; i<xx->arcSegs.cnt; i++,j++) { + xx->cornuPath[j] = i+1; } - xx->cornuData.cornuPath[j] = cp[0]; - xx->cornuData.cornuPath[j+1] = cp[0]; - return xx->cornuData.cornuPath; + xx->cornuPath[j] = cp[0]; + xx->cornuPath[j+1] = cp[0]; + return xx->cornuPath; } +#if 0 static void GetCornuAngles( ANGLE_T *a0, ANGLE_T *a1, track_p trk ) { - assert( trk != NULL ); - - *a0 = NormalizeAngle( GetTrkEndAngle(trk,0) ); - *a1 = NormalizeAngle( GetTrkEndAngle(trk,1) ); - - LOG( log_cornu, 4, ( "getCornuAngles: = %0.3f %0.3f\n", *a0, *a1 ) ) + CHECK( trk != NULL ); + + *a0 = NormalizeAngle( GetTrkEndAngle(trk,0) ); + *a1 = NormalizeAngle( GetTrkEndAngle(trk,1) ); + + LOG( log_cornu, 4, ( "getCornuAngles: = %0.3f %0.3f\n", *a0, *a1 ) ) } +#endif -static void ComputeCornuBoundingBox( track_p trk, struct extraData * xx ) +static void ComputeCornuBoundingBox( track_p trk, struct extraDataCornu_t * xx ) { - coOrd orig, size; + coOrd orig, size; + + GetSegBounds(zero,0,xx->arcSegs.cnt,&DYNARR_N(trkSeg_t,xx->arcSegs,0), &orig, + &size); - GetSegBounds(zero,0,xx->cornuData.arcSegs.cnt,xx->cornuData.arcSegs.ptr, &orig, &size); + coOrd hi, lo; - coOrd hi, lo; - - lo.x = orig.x; - lo.y = orig.y; - hi.x = orig.x+size.x; - hi.y = orig.y+size.y; + lo.x = orig.x; + lo.y = orig.y; + hi.x = orig.x+size.x; + hi.y = orig.y+size.y; - SetBoundingBox( trk, hi, lo ); + SetBoundingBox( trk, hi, lo ); } DIST_T CornuDescriptionDistance( - coOrd pos, - track_p trk, - coOrd * dpos, - BOOL_T show_hidden, - BOOL_T * hidden) + coOrd pos, + track_p trk, + coOrd * dpos, + BOOL_T show_hidden, + BOOL_T * hidden) { - struct extraData *xx = GetTrkExtraData(trk); coOrd p1; - if (hidden) *hidden = FALSE; - if ( GetTrkType( trk ) != T_CORNU || ((( GetTrkBits( trk ) & TB_HIDEDESC ) != 0) && !show_hidden) ) - return 100000; - - coOrd offset = xx->cornuData.descriptionOff; - - if (( GetTrkBits( trk ) & TB_HIDEDESC ) != 0) offset = zero; - p1.x = xx->cornuData.pos[0].x + ((xx->cornuData.pos[1].x-xx->cornuData.pos[0].x)/2) + offset.x; - p1.y = xx->cornuData.pos[0].y + ((xx->cornuData.pos[1].y-xx->cornuData.pos[0].y)/2) + offset.y; - if (hidden) *hidden = (GetTrkBits( trk ) & TB_HIDEDESC); + if (hidden) { *hidden = FALSE; } + if ( GetTrkType( trk ) != T_CORNU + || ((( GetTrkBits( trk ) & TB_HIDEDESC ) != 0) && !show_hidden) ) { + return DIST_INF; + } + + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + if (( GetTrkBits( trk ) & TB_HIDEDESC ) != 0) { xx->descriptionOff = zero; } + + coOrd end0, end0off, end1, end1off; + end0 = xx->pos[0]; + end1 = xx->pos[1]; + ANGLE_T a; + a = FindAngle(end0,end1); + Translate(&end0off,end0,a+90,xx->descriptionOff.y); + Translate(&end1off,end1,a+90,xx->descriptionOff.y); + + p1.x = (end1off.x - end0off.x)*(xx->descriptionOff.x+0.5) + end0off.x; + p1.y = (end1off.y - end0off.y)*(xx->descriptionOff.x+0.5) + end0off.y; + + if (hidden) { *hidden = (GetTrkBits( trk ) & TB_HIDEDESC); } *dpos = p1; + + coOrd tpos = pos; + if (DistanceCornu(trk,&tpos)<FindDistance( p1, pos )) { + return DistanceCornu(trk,&pos); + } return FindDistance( p1, pos ); } +typedef struct { + coOrd pos; + ANGLE_T angle; +} pos_angle_t; static void DrawCornuDescription( - track_p trk, - drawCmd_p d, - wDrawColor color ) + track_p trk, + drawCmd_p d, + wDrawColor color ) { - struct extraData *xx = GetTrkExtraData(trk); - wFont_p fp; - coOrd pos; + coOrd epos0, epos1, offpos0, offpos1; - if (layoutLabels == 0) + if (layoutLabels == 0) { + return; + } + if ((labelEnable&LABELENABLE_TRKDESC)==0) { return; - if ((labelEnable&LABELENABLE_TRKDESC)==0) - return; - pos.x = xx->cornuData.pos[0].x + ((xx->cornuData.pos[1].x - xx->cornuData.pos[0].x)/2); - pos.y = xx->cornuData.pos[0].y + ((xx->cornuData.pos[1].y - xx->cornuData.pos[0].y)/2); - pos.x += xx->cornuData.descriptionOff.x; - pos.y += xx->cornuData.descriptionOff.y; - fp = wStandardFont( F_TIMES, FALSE, FALSE ); - - sprintf( message, _("Cornu: len=%0.2f min_rad=%0.2f"), - xx->cornuData.length, (xx->cornuData.minCurveRadius>=10000.00)?0.0:xx->cornuData.minCurveRadius); - DrawBoxedString( BOX_BOX, d, pos, message, fp, (wFontSize_t)descriptionFontSize, color, 0.0 ); + } + + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + epos0 = xx->pos[0]; + epos1 = xx->pos[1]; + ANGLE_T a = FindAngle(epos0,epos1); + Translate(&offpos0,epos0,a+90,xx->descriptionOff.y); + Translate(&offpos1,epos1,a+90,xx->descriptionOff.y); + + wStandardFont( F_TIMES, FALSE, FALSE ); + + sprintf( message, _("Cornu: L %s A %0.3f L %s MinR %s"), + FormatDistance(FindDistance(xx->pos[0], xx->pos[1])), + FindAngle(xx->pos[0], xx->pos[1]), + FormatDistance(xx->length), + FormatDistance((xx->minCurveRadius>=DIST_INF)?0.0:xx->minCurveRadius)); + DrawLine(d,xx->pos[0],offpos0,0,color); + DrawLine(d,xx->pos[1],offpos1,0,color); + DrawDimLine( d, offpos0, offpos1, message, (wFontSize_t)descriptionFontSize, + xx->descriptionOff.x+0.5, 0, color, 0x00 ); + + if (GetTrkBits( trk ) & TB_DETAILDESC) { + coOrd details_pos; + details_pos.x = (offpos1.x - offpos0.x)*(xx->descriptionOff.x+0.5) + offpos0.x; + details_pos.y = (offpos1.y - offpos0.y)*(xx->descriptionOff.x+0.5) + offpos0.y- + (2*descriptionFontSize/mainD.dpi); + + AddTrkDetails(d, trk, details_pos, xx->length, color); + } + } STATUS_T CornuDescriptionMove( - track_p trk, - wAction_t action, - coOrd pos ) + track_p trk, + wAction_t action, + coOrd pos ) { - struct extraData *xx = GetTrkExtraData(trk); - static coOrd p0,p1; - static BOOL_T editState; - - if (GetTrkType(trk) != T_CORNU) return C_TERMINATE; - - p0.x = xx->cornuData.pos[0].x + ((xx->cornuData.pos[1].x - xx->cornuData.pos[0].x)/2); - p0.y = xx->cornuData.pos[0].y + ((xx->cornuData.pos[1].y - xx->cornuData.pos[0].y)/2); - - switch (action) { - case C_DOWN: - DrawCornuDescription( trk, &mainD, wDrawColorWhite ); - case C_MOVE: - case C_UP: - editState = TRUE; - p1 = pos; - xx->cornuData.descriptionOff.x = pos.x - p0.x; - xx->cornuData.descriptionOff.y = pos.y - p0.y; - if (action == C_UP) { - editState = FALSE; - wDrawColor color = GetTrkColor( trk, &mainD ); - DrawCornuDescription( trk, &mainD, color ); - } - return action==C_UP?C_TERMINATE:C_CONTINUE; - - case C_REDRAW: - if (editState) { - DrawCornuDescription( trk, &tempD, wDrawColorBlue ); - DrawLine( &tempD, p1, p0, 0, wDrawColorBlue ); - } - break; - - } +// static coOrd p0,p1; +// static BOOL_T editState; + + if (GetTrkType(trk) != T_CORNU) { return C_CONTINUE; } + + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + ANGLE_T ap; + coOrd end0, end1; + end0 = xx->pos[0]; + end1 = xx->pos[1]; + ap = NormalizeAngle(FindAngle(end0,pos)-FindAngle(end0,end1)); + + xx->descriptionOff.y = FindDistance(end0,pos)*sin(D2R(ap)); + xx->descriptionOff.x = -0.5 + FindDistance(end0, + pos)*cos(D2R(ap))/FindDistance(end0,end1); + if (xx->descriptionOff.x > 0.5) { xx->descriptionOff.x = 0.5; } + if (xx->descriptionOff.x < -0.5) { xx->descriptionOff.x = -0.5; } + return C_CONTINUE; } @@ -273,119 +298,122 @@ STATUS_T CornuDescriptionMove( */ static struct { - coOrd pos[2]; - ANGLE_T angle[2]; - DIST_T radius[2]; - coOrd center[2]; - FLOAT_T elev[2]; - FLOAT_T length; - FLOAT_T grade; - DIST_T minRadius; - DIST_T maxRateOfChange; - ANGLE_T windingAngle; - unsigned int layerNumber; - dynArr_t segs; - long width; - wDrawColor color; - } cornData; + coOrd pos[2]; + ANGLE_T angle[2]; + DIST_T radius[2]; + coOrd center[2]; + FLOAT_T elev[2]; + FLOAT_T length; + FLOAT_T grade; + DIST_T minRadius; + DIST_T maxRateOfChange; + ANGLE_T windingAngle; + unsigned int layerNumber; + dynArr_t segs; + long lineWidth; + wDrawColor color; +} cornData; typedef enum { P0, A0, R0, C0, Z0, P1, A1, R1, C1, Z1, RA, RR, WA, LN, GR, LY } cornuDesc_e; static descData_t cornuDesc[] = { -/*P0*/ { DESC_POS, N_("End Pt 1: X,Y"), &cornData.pos[0] }, -/*A0*/ { DESC_ANGLE, N_("End Angle"), &cornData.angle[0] }, -/*R0*/ { DESC_DIM, N_("Radius "), &cornData.radius[0] }, -/*C0*/ { DESC_POS, N_("Center X,Y"), &cornData.center[0] }, -/*Z0*/ { DESC_DIM, N_("Z1"), &cornData.elev[0] }, -/*P1*/ { DESC_POS, N_("End Pt 2: X,Y"), &cornData.pos[1] }, -/*A1*/ { DESC_ANGLE, N_("End Angle"), &cornData.angle[1] }, -/*R1*/ { DESC_DIM, N_("Radius"), &cornData.radius[1] }, -/*C1*/ { DESC_POS, N_("Center X,Y"), &cornData.center[1] }, -/*Z1*/ { DESC_DIM, N_("Z2"), &cornData.elev[1] }, -/*RA*/ { DESC_DIM, N_("Minimum Radius"), &cornData.minRadius }, -/*RR*/ { DESC_FLOAT, N_("Max Rate Of Curve Change/Scale"), &cornData.maxRateOfChange }, -/*WA*/ { DESC_ANGLE, N_("Total Winding Angle"), &cornData.windingAngle }, -/*LN*/ { DESC_DIM, N_("Length"), &cornData.length }, -/*GR*/ { DESC_FLOAT, N_("Grade"), &cornData.grade }, -/*LY*/ { DESC_LAYER, N_("Layer"), &cornData.layerNumber }, - { DESC_NULL } }; - - -static void UpdateCornu( track_p trk, int inx, descData_p descUpd, BOOL_T final ) + /*P0*/ { DESC_POS, N_("End Pt 1: X,Y"), &cornData.pos[0] }, + /*A0*/ { DESC_ANGLE, N_("End Angle"), &cornData.angle[0] }, + /*R0*/ { DESC_DIM, N_("Radius "), &cornData.radius[0] }, + /*C0*/ { DESC_POS, N_("Center X,Y"), &cornData.center[0] }, + /*Z0*/ { DESC_DIM, N_("Z1"), &cornData.elev[0] }, + /*P1*/ { DESC_POS, N_("End Pt 2: X,Y"), &cornData.pos[1] }, + /*A1*/ { DESC_ANGLE, N_("End Angle"), &cornData.angle[1] }, + /*R1*/ { DESC_DIM, N_("Radius"), &cornData.radius[1] }, + /*C1*/ { DESC_POS, N_("Center X,Y"), &cornData.center[1] }, + /*Z1*/ { DESC_DIM, N_("Z2"), &cornData.elev[1] }, + /*RA*/ { DESC_DIM, N_("Minimum Radius"), &cornData.minRadius }, + /*RR*/ { DESC_FLOAT, N_("Max Rate Of Curve Change/Scale"), &cornData.maxRateOfChange }, + /*WA*/ { DESC_ANGLE, N_("Total Winding Angle"), &cornData.windingAngle }, + /*LN*/ { DESC_DIM, N_("Length"), &cornData.length }, + /*GR*/ { DESC_FLOAT, N_("Grade"), &cornData.grade }, + /*LY*/ { DESC_LAYER, N_("Layer"), &cornData.layerNumber }, + { DESC_NULL } +}; + + +static void UpdateCornu( track_p trk, int inx, descData_p descUpd, + BOOL_T final ) { - struct extraData *xx = GetTrkExtraData(trk); BOOL_T updateEndPts; EPINX_T ep; cornuParm_t cp; - if ( inx == -1 ) + if ( inx == -1 ) { return; + } updateEndPts = FALSE; UndrawNewTrack(trk); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); switch ( inx ) { case P0: - if (GetTrkEndTrk(trk,0)) break; + if (GetTrkEndTrk(trk,0)) { break; } updateEndPts = TRUE; - xx->cornuData.pos[0] = cornData.pos[0]; - Translate(&xx->cornuData.c[0],xx->cornuData.pos[0],xx->cornuData.a[0]+90,xx->cornuData.r[0]); - cornData.center[0] = xx->cornuData.c[0]; + xx->pos[0] = cornData.pos[0]; + Translate(&xx->c[0],xx->pos[0],xx->a[0]+90,xx->r[0]); + cornData.center[0] = xx->c[0]; cornuDesc[P0].mode |= DESC_CHANGE; cornuDesc[C0].mode |= DESC_CHANGE; - /* no break */ + /* no break */ case P1: - if (GetTrkEndTrk(trk,1)) break; + if (GetTrkEndTrk(trk,1)) { break; } updateEndPts = TRUE; - xx->cornuData.pos[1]= cornData.pos[1]; - Translate(&xx->cornuData.c[1],xx->cornuData.pos[1],xx->cornuData.a[1]-90,xx->cornuData.r[1]); - cornData.center[1] = xx->cornuData.c[1]; + xx->pos[1]= cornData.pos[1]; + Translate(&xx->c[1],xx->pos[1],xx->a[1]-90,xx->r[1]); + cornData.center[1] = xx->c[1]; cornuDesc[P1].mode |= DESC_CHANGE; cornuDesc[C1].mode |= DESC_CHANGE; break; case A0: - if (GetTrkEndTrk(trk,0)) break; + if (GetTrkEndTrk(trk,0)) { break; } updateEndPts = TRUE; - xx->cornuData.a[0] = cornData.angle[0]; - Translate(&xx->cornuData.c[0],xx->cornuData.pos[0],xx->cornuData.a[0]+90,xx->cornuData.r[0]); - cornData.center[0] = xx->cornuData.c[0]; + xx->a[0] = cornData.angle[0]; + Translate(&xx->c[0],xx->pos[0],xx->a[0]+90,xx->r[0]); + cornData.center[0] = xx->c[0]; cornuDesc[A0].mode |= DESC_CHANGE; cornuDesc[C0].mode |= DESC_CHANGE; break; case A1: - if (GetTrkEndTrk(trk,1)) break; + if (GetTrkEndTrk(trk,1)) { break; } updateEndPts = TRUE; - xx->cornuData.a[1]= cornData.angle[1]; - Translate(&xx->cornuData.c[1],xx->cornuData.pos[1],xx->cornuData.a[1]-90,xx->cornuData.r[1]); - cornData.center[1] = xx->cornuData.c[1]; + xx->a[1]= cornData.angle[1]; + Translate(&xx->c[1],xx->pos[1],xx->a[1]-90,xx->r[1]); + cornData.center[1] = xx->c[1]; cornuDesc[A1].mode |= DESC_CHANGE; cornuDesc[C1].mode |= DESC_CHANGE; break; case C0: - if (GetTrkEndTrk(trk,0)) break; + if (GetTrkEndTrk(trk,0)) { break; } //updateEndPts = TRUE; - //xx->cornuData.c[0] = cornData.center[0]; + //xx->c[0] = cornData.center[0]; //cornuDesc[C0].mode |= DESC_CHANGE; break; case C1: - if (GetTrkEndTrk(trk,1)) break; + if (GetTrkEndTrk(trk,1)) { break; } //updateEndPts = TRUE; - //xx->cornuData.c[1] = cornData.center[1]; + //xx->c[1] = cornData.center[1]; //cornuDesc[C1].mode |= DESC_CHANGE; break; case R0: - if (GetTrkEndTrk(trk,0)) break; + if (GetTrkEndTrk(trk,0)) { break; } updateEndPts = TRUE; - xx->cornuData.r[0] = fabs(cornData.radius[0]); - Translate(&xx->cornuData.c[0],xx->cornuData.pos[0],NormalizeAngle(xx->cornuData.a[0]+90),cornData.radius[0]); - cornData.center[0] = xx->cornuData.c[0]; + xx->r[0] = fabs(cornData.radius[0]); + Translate(&xx->c[0],xx->pos[0],NormalizeAngle(xx->a[0]+90),cornData.radius[0]); + cornData.center[0] = xx->c[0]; cornData.radius[0] = fabs(cornData.radius[0]); cornuDesc[R0].mode |= DESC_CHANGE; cornuDesc[C0].mode |= DESC_CHANGE; break; case R1: - if (GetTrkEndTrk(trk,1)) break; + if (GetTrkEndTrk(trk,1)) { break; } updateEndPts = TRUE; - xx->cornuData.r[1]= fabs(cornData.radius[1]); - Translate(&xx->cornuData.c[1],xx->cornuData.pos[1],NormalizeAngle(xx->cornuData.a[1]-90),cornData.radius[1]); - cornData.center[1] = xx->cornuData.c[1]; + xx->r[1]= fabs(cornData.radius[1]); + Translate(&xx->c[1],xx->pos[1],NormalizeAngle(xx->a[1]-90),cornData.radius[1]); + cornData.center[1] = xx->c[1]; cornData.radius[1] = fabs(cornData.radius[1]); cornuDesc[R1].mode |= DESC_CHANGE; cornuDesc[C1].mode |= DESC_CHANGE; @@ -393,12 +421,15 @@ static void UpdateCornu( track_p trk, int inx, descData_p descUpd, BOOL_T final case Z0: case Z1: ep = (inx==Z0?0:1); - UpdateTrkEndElev( trk, ep, GetTrkEndElevUnmaskedMode(trk,ep), cornData.elev[ep], NULL ); + UpdateTrkEndElev( trk, ep, GetTrkEndElevUnmaskedMode(trk,ep), cornData.elev[ep], + NULL ); ComputeElev( trk, 1-ep, FALSE, &cornData.elev[1-ep], NULL, TRUE ); - if ( cornData.length > minLength ) - cornData.grade = fabs( (cornData.elev[0]-cornData.elev[1])/cornData.length )*100.0; - else + if ( cornData.length > minLength ) { + cornData.grade = fabs( (cornData.elev[0]-cornData.elev[1])/cornData.length ) + *100.0; + } else { cornData.grade = 0.0; + } cornuDesc[GR].mode |= DESC_CHANGE; cornuDesc[inx==Z0?Z1:Z0].mode |= DESC_CHANGE; return; @@ -406,19 +437,19 @@ static void UpdateCornu( track_p trk, int inx, descData_p descUpd, BOOL_T final SetTrkLayer( trk, cornData.layerNumber); break; default: - AbortProg( "updateCornu: Bad inx %d", inx ); + CHECKMSG( FALSE, ( "updateCornu: Bad inx %d", inx ) ); } - track_p tracks[2]; - tracks[0] = GetTrkEndTrk(trk,0); - tracks[1] = GetTrkEndTrk(trk,1); +// track_p tracks[2]; +// tracks[0] = GetTrkEndTrk(trk,0); +// tracks[1] = GetTrkEndTrk(trk,1); if (updateEndPts) { if ( GetTrkEndTrk(trk,0) == NULL ) { - SetTrkEndPoint( trk, 0, cornData.pos[0], xx->cornuData.a[0]); + SetTrkEndPoint( trk, 0, cornData.pos[0], xx->a[0]); cornuDesc[A0].mode |= DESC_CHANGE; } if ( GetTrkEndTrk(trk,1) == NULL ) { - SetTrkEndPoint( trk, 1, cornData.pos[1], xx->cornuData.a[1]); + SetTrkEndPoint( trk, 1, cornData.pos[1], xx->a[1]); cornuDesc[A1].mode |= DESC_CHANGE; } } @@ -427,7 +458,7 @@ static void UpdateCornu( track_p trk, int inx, descData_p descUpd, BOOL_T final ts[0] = GetTrkEndTrk(trk,0); ts[1] = GetTrkEndTrk(trk,1); SetUpCornuParmFromTracks(ts,&cp,xx); - CallCornu0(xx->cornuData.pos, xx->cornuData.c, xx->cornuData.a, xx->cornuData.r, &xx->cornuData.arcSegs, FALSE); + CallCornu0(xx->pos, xx->c, xx->a, xx->r, &xx->arcSegs, FALSE); //FixUpCornu(xx->bezierData.pos, xx, IsTrack(trk)); ComputeCornuBoundingBox(trk, xx); @@ -437,49 +468,53 @@ static void UpdateCornu( track_p trk, int inx, descData_p descUpd, BOOL_T final static void DescribeCornu( track_p trk, char * str, CSIZE_T len ) { - struct extraData *xx = GetTrkExtraData(trk); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); DIST_T d; - d = xx->cornuData.length; - sprintf( str, _("Cornu Track(%d): Layer=%u MinRadius=%s Length=%s EP=[%0.3f,%0.3f] [%0.3f,%0.3f]"), - GetTrkIndex(trk), - GetTrkLayer(trk)+1, - FormatDistance(xx->cornuData.minCurveRadius), - FormatDistance(d), - PutDim(xx->cornuData.pos[0].x),PutDim(xx->cornuData.pos[0].y), - PutDim(xx->cornuData.pos[1].x),PutDim(xx->cornuData.pos[1].y) - ); - - cornData.length = xx->cornuData.length; - cornData.minRadius = xx->cornuData.minCurveRadius; - cornData.maxRateOfChange = xx->cornuData.maxRateofChange*GetScaleRatio(GetLayoutCurScale()); - cornData.windingAngle = xx->cornuData.windingAngle; - cornData.layerNumber = GetTrkLayer(trk); - cornData.pos[0] = xx->cornuData.pos[0]; - cornData.pos[1] = xx->cornuData.pos[1]; - cornData.angle[0] = xx->cornuData.a[0]; - cornData.angle[1] = xx->cornuData.a[1]; - cornData.center[0] = xx->cornuData.c[0]; - cornData.center[1] = xx->cornuData.c[1]; - cornData.radius[0] = xx->cornuData.r[0]; - cornData.radius[1] = xx->cornuData.r[1]; - if (GetTrkType(trk) == T_CORNU) { + d = xx->length; + sprintf( str, + _("Cornu Track(%d): Layer=%u MinRadius=%s Length=%s EP=[%0.3f,%0.3f] [%0.3f,%0.3f]"), + GetTrkIndex(trk), + GetTrkLayer(trk)+1, + FormatDistance(xx->minCurveRadius), + FormatDistance(d), + PutDim(xx->pos[0].x),PutDim(xx->pos[0].y), + PutDim(xx->pos[1].x),PutDim(xx->pos[1].y) + ); + + cornData.length = xx->length; + cornData.minRadius = xx->minCurveRadius; + cornData.maxRateOfChange = xx->maxRateofChange*GetScaleRatio( + GetLayoutCurScale()); + cornData.windingAngle = xx->windingAngle; + cornData.layerNumber = GetTrkLayer(trk); + cornData.pos[0] = xx->pos[0]; + cornData.pos[1] = xx->pos[1]; + cornData.angle[0] = xx->a[0]; + cornData.angle[1] = xx->a[1]; + cornData.center[0] = xx->c[0]; + cornData.center[1] = xx->c[1]; + cornData.radius[0] = xx->r[0]; + cornData.radius[1] = xx->r[1]; + if (GetTrkType(trk) == T_CORNU) { ComputeElev( trk, 0, FALSE, &cornData.elev[0], NULL, FALSE ); ComputeElev( trk, 1, FALSE, &cornData.elev[1], NULL, FALSE ); - if ( cornData.length > minLength ) - cornData.grade = fabs( (cornData.elev[0]-cornData.elev[1])/cornData.length )*100.0; - else + if ( cornData.length > minLength ) { + cornData.grade = fabs( (cornData.elev[0]-cornData.elev[1])/cornData.length ) + *100.0; + } else { cornData.grade = 0.0; - } - BOOL_T trk0 = (GetTrkEndTrk(trk,0)!=NULL); - BOOL_T trk1 = (GetTrkEndTrk(trk,1)!=NULL); + } + } + BOOL_T trk0 = (GetTrkEndTrk(trk,0)!=NULL); + BOOL_T trk1 = (GetTrkEndTrk(trk,1)!=NULL); cornuDesc[P0].mode = !trk0?0:DESC_RO; cornuDesc[P1].mode = !trk1?0:DESC_RO; cornuDesc[LN].mode = DESC_RO; - cornuDesc[Z0].mode = EndPtIsDefinedElev(trk,0)?0:DESC_RO; - cornuDesc[Z1].mode = EndPtIsDefinedElev(trk,1)?0:DESC_RO; + cornuDesc[Z0].mode = EndPtIsDefinedElev(trk,0)?0:DESC_RO; + cornuDesc[Z1].mode = EndPtIsDefinedElev(trk,1)?0:DESC_RO; cornuDesc[A0].mode = !trk0?0:DESC_RO; @@ -489,9 +524,9 @@ static void DescribeCornu( track_p trk, char * str, CSIZE_T len ) cornuDesc[R0].mode = !trk0?0:DESC_RO; cornuDesc[R1].mode = !trk1?0:DESC_RO; cornuDesc[GR].mode = DESC_RO; - cornuDesc[RA].mode = DESC_RO; - cornuDesc[RR].mode = DESC_RO; - cornuDesc[WA].mode = DESC_RO; + cornuDesc[RA].mode = DESC_RO; + cornuDesc[RR].mode = DESC_RO; + cornuDesc[WA].mode = DESC_RO; cornuDesc[LY].mode = DESC_NOREDRAW; DoDescribe( _("Cornu Track"), trk, cornuDesc, UpdateCornu ); @@ -501,15 +536,15 @@ static void DescribeCornu( track_p trk, char * str, CSIZE_T len ) DIST_T DistanceCornu( track_p t, coOrd * p ) { - struct extraData *xx = GetTrkExtraData(t); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(t, T_CORNU, extraDataCornu_t); //return BezierMathDistance(p,xx->bezierData.pos,100, &s); - DIST_T d = 100000.0; - coOrd p2 = xx->cornuData.pos[0]; //Set initial point + DIST_T d = DIST_INF; + coOrd p2 = xx->pos[0]; //Set initial point segProcData_t segProcData; - for (int i = 0;i<xx->cornuData.arcSegs.cnt;i++) { - trkSeg_t seg = DYNARR_N(trkSeg_t,xx->cornuData.arcSegs,i); - if (seg.type == SEG_FILCRCL) continue; + for (int i = 0; i<xx->arcSegs.cnt; i++) { + trkSeg_t seg = DYNARR_N(trkSeg_t,xx->arcSegs,i); + if (seg.type == SEG_FILCRCL) { continue; } segProcData.distance.pos1 = * p; SegProc(SEGPROC_DISTANCE,&seg,&segProcData); if (segProcData.distance.dd<d) { @@ -517,84 +552,80 @@ DIST_T DistanceCornu( track_p t, coOrd * p ) p2 = segProcData.distance.pos1; } } - //d = BezierDistance( p, xx->bezierData.pos[0], xx->bezierData.pos[1], xx->bezierData.pos[2], xx->bezierData.pos[1], 100, NULL ); + //d = BezierDistance( p, xx->bezierData.pos[0], xx->bezierData.pos[1], xx->bezierData.pos[2], xx->bezierData.pos[1], 100, NULL ); * p = p2; return d; } static void DrawCornu( track_p t, drawCmd_p d, wDrawColor color ) { - struct extraData *xx = GetTrkExtraData(t); long widthOptions = DTS_LEFT|DTS_RIGHT; if ( ((d->options&DC_SIMPLE)==0) && - (labelWhen == 2 || (labelWhen == 1 && (d->options&DC_PRINT))) && - labelScale >= d->scale && - ( GetTrkBits( t ) & TB_HIDEDESC ) == 0 ) { + (labelWhen == 2 || (labelWhen == 1 && (d->options&DC_PRINT))) && + labelScale >= d->scale && + ( GetTrkBits( t ) & TB_HIDEDESC ) == 0 ) { DrawCornuDescription( t, d, color ); } - DIST_T scale2rail = (d->options&DC_PRINT)?(twoRailScale*2+1):twoRailScale; - DrawSegsO(d,t,zero,0.0,xx->cornuData.arcSegs.ptr,xx->cornuData.arcSegs.cnt, GetTrkGauge(t), color, widthOptions); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(t, T_CORNU, extraDataCornu_t); + DrawSegsDA(d,t,zero,0.0,&xx->arcSegs, GetTrkGauge(t), color, widthOptions); DrawEndPt( d, t, 0, color ); DrawEndPt( d, t, 1, color ); } -void FreeSubSegs(trkSeg_t* s) { +void FreeSubSegs(trkSeg_t* s) +{ if (s->type == SEG_BEZTRK || s->type == SEG_BEZLIN) { - if (s->bezSegs.ptr) { - MyFree(s->bezSegs.ptr); - } - s->bezSegs.max = 0; - s->bezSegs.cnt = 0; - s->bezSegs.ptr = NULL; + DYNARR_FREE( trkSeg_t, s->bezSegs ); } } static void DeleteCornu( track_p t ) { - struct extraData *xx = GetTrkExtraData(t); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(t, T_CORNU, extraDataCornu_t); - for (int i=0;i<xx->cornuData.arcSegs.cnt;i++) { - trkSeg_t s = DYNARR_N(trkSeg_t,xx->cornuData.arcSegs,i); + for (int i=0; i<xx->arcSegs.cnt; i++) { + trkSeg_t s = DYNARR_N(trkSeg_t,xx->arcSegs,i); FreeSubSegs(&s); } - if (xx->cornuData.arcSegs.ptr) - MyFree(xx->cornuData.arcSegs.ptr); - xx->cornuData.arcSegs.max = 0; - xx->cornuData.arcSegs.cnt = 0; - xx->cornuData.arcSegs.ptr = NULL; + + DYNARR_FREE( trkSeg_t, xx->arcSegs ); } static BOOL_T WriteCornu( track_p t, FILE * f ) { - struct extraData *xx = GetTrkExtraData(t); + int bits; long options; BOOL_T rc = TRUE; BOOL_T track =(GetTrkType(t)==T_CORNU); options = GetTrkWidth(t) & 0x0F; - if ( ( GetTrkBits(t) & TB_HIDEDESC ) == 0 ) options |= 0x80; - rc &= fprintf(f, "%s %d %d %ld 0 0 %s %d %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f \n", - "CORNU",GetTrkIndex(t), GetTrkLayer(t), (long)options, - GetTrkScaleName(t), GetTrkVisible(t)|(GetTrkNoTies(t)?1<<2:0)|(GetTrkBridge(t)?1<<3:0), - xx->cornuData.pos[0].x, xx->cornuData.pos[0].y, - xx->cornuData.a[0], - xx->cornuData.r[0], - xx->cornuData.c[0].x,xx->cornuData.c[0].y, - xx->cornuData.pos[1].x, xx->cornuData.pos[1].y, - xx->cornuData.a[1], - xx->cornuData.r[1], - xx->cornuData.c[1].x,xx->cornuData.c[1].y )>0; + struct extraDataCornu_t *xx = GET_EXTRA_DATA(t, T_CORNU, extraDataCornu_t); + if ( ( GetTrkBits(t) & TB_HIDEDESC ) == 0 ) { options |= 0x80; } + bits = GetTrkVisible(t)|(GetTrkNoTies(t)?1<<2:0)|(GetTrkBridge(t)?1<<3:0)| + (GetTrkRoadbed(t)?1<<4:0); + rc &= fprintf(f, + "%s %d %d %ld 0 0 %s %d %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f %0.6f \n", + "CORNU",GetTrkIndex(t), GetTrkLayer(t), (long)options, + GetTrkScaleName(t), bits, + xx->pos[0].x, xx->pos[0].y, + xx->a[0], + xx->r[0], + xx->c[0].x,xx->c[0].y, + xx->pos[1].x, xx->pos[1].y, + xx->a[1], + xx->r[1], + xx->c[1].x,xx->c[1].y )>0; if (track) { - rc &= WriteEndPt( f, t, 0 ); - rc &= WriteEndPt( f, t, 1 ); - } - rc &= WriteSegs( f, xx->cornuData.arcSegs.cnt, xx->cornuData.arcSegs.ptr ); + rc &= WriteEndPt( f, t, 0 ); + rc &= WriteEndPt( f, t, 1 ); + } + rc &= WriteSegs( f, xx->arcSegs.cnt, &DYNARR_N(trkSeg_t,xx->arcSegs,0) ); return rc; } static BOOL_T ReadCornu( char * line ) { - struct extraData *xx; + struct extraDataCornu_t *xx; track_p t; wIndex_t index; BOOL_T visible; @@ -604,108 +635,117 @@ static BOOL_T ReadCornu( char * line ) char scale[10]; wIndex_t layer; long options; - char * cp = NULL; +// char * cp = NULL; if (!GetArgs( line+6, "dLl00sdpffppffp", - &index, &layer, &options, scale, &visible, &p0, &a0, &r0, &c0, &p1, &a1, &r1, &c1 ) ) { + &index, &layer, &options, scale, &visible, &p0, &a0, &r0, &c0, &p1, &a1, &r1, + &c1 ) ) { return FALSE; } - if ( !ReadSegs() ) + if ( !ReadSegs() ) { return FALSE; + } t = NewTrack( index, T_CORNU, 0, sizeof *xx ); - xx = GetTrkExtraData(t); SetTrkVisible(t, visible&2); SetTrkNoTies(t, visible&4); SetTrkBridge(t, visible&8); + SetTrkRoadbed(t, visible&16); SetTrkScale(t, LookupScale(scale)); SetTrkLayer(t, layer ); SetTrkWidth(t, (int)(options&0x0F)); - if ( ( options & 0x80 ) == 0 ) SetTrkBits(t,TB_HIDEDESC); - xx->cornuData.pos[0] = p0; - xx->cornuData.pos[1] = p1; - xx->cornuData.a[0] = a0; - xx->cornuData.r[0] = r0; - xx->cornuData.a[1] = a1; - xx->cornuData.c[0] = c0; - xx->cornuData.c[1] = c1; - xx->cornuData.r[1] = r1; - xx->cornuData.descriptionOff.x = xx->cornuData.descriptionOff.y = 0.0; - FixUpCornu0(xx->cornuData.pos,xx->cornuData.c,xx->cornuData.a, xx->cornuData.r, xx); - ComputeCornuBoundingBox(t,xx); + if ( paramVersion < VERSION_DESCRIPTION2 || ( options & 0x80 ) == 0 ) { SetTrkBits(t,TB_HIDEDESC); } + xx = GET_EXTRA_DATA(t, T_CORNU, extraDataCornu_t); + xx->pos[0] = p0; + xx->pos[1] = p1; + xx->a[0] = a0; + xx->r[0] = r0; + xx->a[1] = a1; + xx->c[0] = c0; + xx->c[1] = c1; + xx->r[1] = r1; + xx->descriptionOff.x = xx->descriptionOff.y = 0.0; + FixUpCornu0(xx->pos,xx->c,xx->a, xx->r, xx); + ComputeCornuBoundingBox(t,xx); SetEndPts(t,2); return TRUE; } static void MoveCornu( track_p trk, coOrd orig ) { - struct extraData *xx = GetTrkExtraData(trk); - for (int i=0;i<2;i++) { - xx->cornuData.pos[i].x += orig.x; - xx->cornuData.pos[i].y += orig.y; - xx->cornuData.c[i].x += orig.x; - xx->cornuData.c[i].y += orig.y; - } - RebuildCornu(trk); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + for (int i=0; i<2; i++) { + xx->pos[i].x += orig.x; + xx->pos[i].y += orig.y; + xx->c[i].x += orig.x; + xx->c[i].y += orig.y; + } + RebuildCornu(trk); } static void RotateCornu( track_p trk, coOrd orig, ANGLE_T angle ) { - struct extraData *xx = GetTrkExtraData(trk); - for (int i=0;i<2;i++) { - Rotate( &xx->cornuData.pos[i], orig, angle ); - Rotate( &xx->cornuData.c[i], orig, angle); - xx->cornuData.a[i] = NormalizeAngle(xx->cornuData.a[i]+angle); - } - RebuildCornu(trk); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + for (int i=0; i<2; i++) { + Rotate( &xx->pos[i], orig, angle ); + Rotate( &xx->c[i], orig, angle); + xx->a[i] = NormalizeAngle(xx->a[i]+angle); + } + RebuildCornu(trk); } static void RescaleCornu( track_p trk, FLOAT_T ratio ) { - struct extraData *xx = GetTrkExtraData(trk); - for (int i=0;i<2;i++) { - xx->cornuData.pos[i].x *= ratio; - xx->cornuData.pos[i].y *= ratio; - xx->cornuData.c[i].x *= ratio; - xx->cornuData.c[i].y *= ratio; - xx->cornuData.r[i] *= ratio; + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + for (int i=0; i<2; i++) { + xx->pos[i].x *= ratio; + xx->pos[i].y *= ratio; + xx->c[i].x *= ratio; + xx->c[i].y *= ratio; + xx->r[i] *= ratio; } - RebuildCornu(trk); + RebuildCornu(trk); } -EXPORT BOOL_T SetCornuEndPt(track_p trk, EPINX_T inx, coOrd pos, coOrd center, ANGLE_T angle, DIST_T radius) { - struct extraData *xx = GetTrkExtraData(trk); - xx->cornuData.pos[inx] = pos; - xx->cornuData.c[inx] = center; - xx->cornuData.a[inx] = angle; - xx->cornuData.r[inx] = radius; - if (!RebuildCornu(trk)) return FALSE; - SetTrkEndPoint( trk, inx, xx->cornuData.pos[inx], xx->cornuData.a[inx]); - return TRUE; +EXPORT BOOL_T SetCornuEndPt(track_p trk, EPINX_T inx, coOrd pos, coOrd center, + ANGLE_T angle, DIST_T radius) +{ + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + xx->pos[inx] = pos; + xx->c[inx] = center; + xx->a[inx] = angle; + xx->r[inx] = radius; + if (!RebuildCornu(trk)) { return FALSE; } + SetTrkEndPoint( trk, inx, xx->pos[inx], xx->a[inx]); + return TRUE; } -void GetCornuParmsNear(track_p t, int sel, coOrd * pos2, coOrd * center, ANGLE_T * angle2, DIST_T * radius ) { - struct extraData *xx = GetTrkExtraData(t); +void GetCornuParmsNear(track_p t, int sel, coOrd * pos2, coOrd * center, + ANGLE_T * angle2, DIST_T * radius ) +{ coOrd pos = *pos2; - double dd = DistanceCornu(t, &pos); //Pos adjusted to be on curve +// double dd = DistanceCornu(t, &pos); //Pos adjusted to be on curve int inx; *radius = 0.0; *angle2 = 0.0; *center = zero; wBool_t back,neg; - ANGLE_T angle = GetAngleSegs(xx->cornuData.arcSegs.cnt,(trkSeg_t *)(xx->cornuData.arcSegs.ptr),&pos,&inx,NULL,&back,NULL,&neg); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(t, T_CORNU, extraDataCornu_t); + ANGLE_T angle = GetAngleSegs(xx->arcSegs.cnt,&DYNARR_N(trkSeg_t,xx->arcSegs,0), + &pos,&inx,NULL,&back,NULL,&neg); if (inx == -1) { return; //Error in GetAngle } - trkSeg_p segPtr = &DYNARR_N(trkSeg_t, xx->cornuData.arcSegs, inx); + trkSeg_p segPtr = &DYNARR_N(trkSeg_t, xx->arcSegs, inx); if (segPtr->type == SEG_BEZTRK) { - GetAngleSegs(segPtr->bezSegs.cnt,(trkSeg_t *)(segPtr->bezSegs.ptr),&pos,&inx,NULL,&back,NULL,&neg); - if (inx ==-1) return; + GetAngleSegs(segPtr->bezSegs.cnt,&DYNARR_N(trkSeg_t,segPtr->bezSegs,0),&pos, + &inx,NULL,&back,NULL,&neg); + if (inx ==-1) { return; } segPtr = &DYNARR_N(trkSeg_t, segPtr->bezSegs, inx); } @@ -716,15 +756,18 @@ void GetCornuParmsNear(track_p t, int sel, coOrd * pos2, coOrd * center, ANGLE_T *center = segPtr->u.c.center; *radius = fabs(segPtr->u.c.radius); } - if (sel) + if (sel) { angle = NormalizeAngle(angle+(neg==back?0:180)); - else + } else { angle = NormalizeAngle(angle+(neg==back?180:0)); + } *angle2 = angle; *pos2 = pos; } -void GetCornuParmsTemp(dynArr_t * array_p, int sel, coOrd * pos2, coOrd * center, ANGLE_T * angle2, DIST_T * radius ) { +void GetCornuParmsTemp(dynArr_t * array_p, int sel, coOrd * pos2, + coOrd * center, ANGLE_T * angle2, DIST_T * radius ) +{ coOrd pos = *pos2; int inx; @@ -733,17 +776,19 @@ void GetCornuParmsTemp(dynArr_t * array_p, int sel, coOrd * pos2, coOrd * center *center = zero; *angle2 = 0.0; - ANGLE_T angle = GetAngleSegs(array_p->cnt,(trkSeg_p)array_p->ptr,&pos,&inx,NULL,&back,NULL,&neg); + ANGLE_T angle = GetAngleSegs(array_p->cnt,&DYNARR_N(trkSeg_t,*array_p,0),&pos, + &inx,NULL,&back,NULL,&neg); - if (inx==-1) return; + if (inx==-1) { return; } trkSeg_p segPtr = &DYNARR_N(trkSeg_t, *array_p, inx); if (segPtr->type == SEG_BEZTRK) { - GetAngleSegs(segPtr->bezSegs.cnt,(trkSeg_t *)(segPtr->bezSegs.ptr),&pos,&inx,NULL,&back,NULL,&neg); + GetAngleSegs(segPtr->bezSegs.cnt,&DYNARR_N(trkSeg_t,segPtr->bezSegs,0),&pos, + &inx,NULL,&back,NULL,&neg); - if (inx ==-1) return; + if (inx ==-1) { return; } segPtr = &DYNARR_N(trkSeg_t, segPtr->bezSegs, inx); @@ -756,10 +801,11 @@ void GetCornuParmsTemp(dynArr_t * array_p, int sel, coOrd * pos2, coOrd * center *center = segPtr->u.c.center; *radius = fabs(segPtr->u.c.radius); } - if (sel) + if (sel) { angle = NormalizeAngle(angle+(neg==back?0:180)); - else + } else { angle = NormalizeAngle(angle+(neg==back?180:0)); + } *angle2 = angle; *pos2 = pos; } @@ -768,91 +814,93 @@ void GetCornuParmsTemp(dynArr_t * array_p, int sel, coOrd * pos2, coOrd * center /** * Split the Track at approximately the point pos. */ -static BOOL_T SplitCornu( track_p trk, coOrd pos, EPINX_T ep, track_p *leftover, EPINX_T * ep0, EPINX_T * ep1 ) +static BOOL_T SplitCornu( track_p trk, coOrd pos, EPINX_T ep, track_p *leftover, + EPINX_T * ep0, EPINX_T * ep1 ) { - struct extraData *xx = GetTrkExtraData(trk); track_p trk1; - DIST_T radius = 0.0; - coOrd center; - int inx; - BOOL_T track; - track = IsTrack(trk); - - cornuParm_t new; - - double dd = DistanceCornu(trk, &pos); - if (dd>minLength) return FALSE; - BOOL_T back, neg; - - ANGLE_T angle = GetAngleSegs(xx->cornuData.arcSegs.cnt,(trkSeg_t *)(xx->cornuData.arcSegs.ptr),&pos,&inx,NULL,&back,NULL,&neg); - - if (inx == -1) return FALSE; - - trkSeg_p segPtr = &DYNARR_N(trkSeg_t, xx->cornuData.arcSegs, inx); - - GetAngleSegs(segPtr->bezSegs.cnt,(trkSeg_t *)(segPtr->bezSegs.ptr),&pos,&inx,NULL,&back,NULL,&neg); - - if (inx == -1) return FALSE; - - segPtr = &DYNARR_N(trkSeg_t, segPtr->bezSegs, inx); - - if (segPtr->type == SEG_STRTRK) { - radius = 0.0; - center = zero; - } else if (segPtr->type == SEG_CRVTRK) { - center = segPtr->u.c.center; - radius = fabs(segPtr->u.c.radius); - } - if (ep) { - new.pos[0] = pos; - new.pos[1] = xx->cornuData.pos[1]; - new.angle[0] = NormalizeAngle(angle+(neg==back?180:0)); - new.angle[1] = xx->cornuData.a[1]; - new.center[0] = center; - new.center[1] = xx->cornuData.c[1]; - new.radius[0] = radius; - new.radius[1] = xx->cornuData.r[1]; - } else { - new.pos[1] = pos; - new.pos[0] = xx->cornuData.pos[0]; - new.angle[1] = NormalizeAngle(angle+(neg==back?0:180)); - new.angle[0] = xx->cornuData.a[0]; - new.center[1] = center; - new.center[0] = xx->cornuData.c[0]; - new.radius[1] = radius; - new.radius[0] = xx->cornuData.r[0]; - } - - trk1 = NewCornuTrack(new.pos,new.center,new.angle,new.radius,NULL,0); - //Copy elevation details from old ep to new ep 0/1 - if (trk1==NULL) { - wBeep(); - InfoMessage(_("Cornu Create Failed for p1[%0.3f,%0.3f] p2[%0.3f,%0.3f], c1[%0.3f,%0.3f] c2[%0.3f,%0.3f], a1=%0.3f a2=%0.3f, r1=%s r2=%s"), - new.pos[0].x,new.pos[0].y, - new.pos[1].x,new.pos[1].y, - new.center[0].x,new.center[0].y, - new.center[1].x,new.center[1].y, - new.angle[0],new.angle[1], - FormatDistance(new.radius[0]),FormatDistance(new.radius[1])); - UndoEnd(); - return FALSE; - } - DIST_T height; + DIST_T radius = 0.0; + coOrd center; + int inx,subinx; +// BOOL_T track; +// track = IsTrack(trk); + + cornuParm_t new; + + double dd = DistanceCornu(trk, &pos); + if (dd>minLength) { return FALSE; } + BOOL_T back, neg; + + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + ANGLE_T angle = GetAngleSegs(xx->arcSegs.cnt,&DYNARR_N(trkSeg_t,xx->arcSegs,0), + &pos, &inx,NULL,&back,&subinx,&neg); + + if (inx == -1) { return FALSE; } + + trkSeg_p segPtr = &DYNARR_N(trkSeg_t, xx->arcSegs, inx); + + if (subinx != -1) { + segPtr = &DYNARR_N(trkSeg_t, segPtr->bezSegs, subinx); + } + + if (segPtr->type == SEG_STRTRK) { + radius = 0.0; + center = zero; + } else if (segPtr->type == SEG_CRVTRK) { + center = segPtr->u.c.center; + radius = fabs(segPtr->u.c.radius); + } + if (ep) { + new.pos[0] = pos; + new.pos[1] = xx->pos[1]; + new.angle[0] = NormalizeAngle(angle+(neg==back?180:0)); + new.angle[1] = xx->a[1]; + new.center[0] = center; + new.center[1] = xx->c[1]; + new.radius[0] = radius; + new.radius[1] = xx->r[1]; + } else { + new.pos[1] = pos; + new.pos[0] = xx->pos[0]; + new.angle[1] = NormalizeAngle(angle+(neg==back?0:180)); + new.angle[0] = xx->a[0]; + new.center[1] = center; + new.center[0] = xx->c[0]; + new.radius[1] = radius; + new.radius[0] = xx->r[0]; + } + + trk1 = NewCornuTrack(new.pos,new.center,new.angle,new.radius,NULL,0); + //Copy elevation details from old ep to new ep 0/1 + if (trk1==NULL) { + wBeep(); + InfoMessage( + _("Cornu Create Failed for p1[%0.3f,%0.3f] p2[%0.3f,%0.3f], c1[%0.3f,%0.3f] c2[%0.3f,%0.3f], a1=%0.3f a2=%0.3f, r1=%s r2=%s"), + new.pos[0].x,new.pos[0].y, + new.pos[1].x,new.pos[1].y, + new.center[0].x,new.center[0].y, + new.center[1].x,new.center[1].y, + new.angle[0],new.angle[1], + FormatDistance(new.radius[0]),FormatDistance(new.radius[1])); + UndoEnd(); + return FALSE; + } + DIST_T height; int opt; GetTrkEndElev(trk,ep,&opt,&height); - UpdateTrkEndElev( trk1, ep, opt, height, (opt==ELEV_STATION)?GetTrkEndElevStation(trk,ep):NULL ); + UpdateTrkEndElev( trk1, ep, opt, height, + (opt==ELEV_STATION)?GetTrkEndElevStation(trk,ep):NULL ); - UndoModify(trk); - xx->cornuData.pos[ep] = pos; - xx->cornuData.a[ep] = NormalizeAngle(new.angle[1-ep]+180); - xx->cornuData.r[ep] = new.radius[1-ep]; - xx->cornuData.c[ep] = new.center[1-ep]; - //Wipe out old elevation for ep1 + UndoModify(trk); + xx->pos[ep] = pos; + xx->a[ep] = NormalizeAngle(new.angle[1-ep]+180); + xx->r[ep] = new.radius[1-ep]; + xx->c[ep] = new.center[1-ep]; + //Wipe out old elevation for ep1 - RebuildCornu(trk); + RebuildCornu(trk); - SetTrkEndPoint(trk, ep, xx->cornuData.pos[ep], xx->cornuData.a[ep]); - UpdateTrkEndElev( trk, ep, ELEV_NONE, 0, NULL); + SetTrkEndPoint(trk, ep, xx->pos[ep], xx->a[ep]); + UpdateTrkEndElev( trk, ep, ELEV_NONE, 0, NULL); *leftover = trk1; *ep0 = 1-ep; //Which end is for new on pos? @@ -861,15 +909,16 @@ static BOOL_T SplitCornu( track_p trk, coOrd pos, EPINX_T ep, track_p *leftover, return TRUE; } -BOOL_T MoveCornuEndPt ( track_p *trk, EPINX_T *ep, coOrd pos, DIST_T d0 ) { +BOOL_T MoveCornuEndPt ( track_p *trk, EPINX_T *ep, coOrd pos, DIST_T d0 ) +{ track_p trk2; if (SplitTrack(*trk,pos,*ep,&trk2,TRUE)) { - struct extraData *xx = GetTrkExtraData(*trk); if (trk2) { UndrawNewTrack( trk2 ); DeleteTrack(trk2,TRUE); } - SetTrkEndPoint( *trk, *ep, *ep?xx->cornuData.pos[1]:xx->cornuData.pos[0], *ep?xx->cornuData.a[1]:xx->cornuData.a[0] ); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(*trk, T_CORNU, extraDataCornu_t); + SetTrkEndPoint( *trk, *ep, *ep?xx->pos[1]:xx->pos[0], *ep?xx->a[1]:xx->a[0] ); DrawNewTrack( *trk ); return TRUE; } @@ -897,50 +946,58 @@ static int log_traverseCornu = 0; */ static BOOL_T TraverseCornu( traverseTrack_p trvTrk, DIST_T * distR ) { - track_p trk = trvTrk->trk; - struct extraData *xx = GetTrkExtraData(trk); + track_p trk = trvTrk->trk; DIST_T dist = *distR; segProcData_t segProcData; BOOL_T cornu_backwards= FALSE; BOOL_T neg = FALSE; - DIST_T d = 10000; + DIST_T d = DIST_INF; coOrd pos1 = trvTrk->pos, pos2 = trvTrk->pos; ANGLE_T a1,a2; int inx, segInx = 0; EPINX_T ep; BOOL_T back; -LOG( log_traverseCornu, 1, ( "TravCornu-In [%0.3f %0.3f] A%0.3f D%0.3f \n", trvTrk->pos.x, trvTrk->pos.y, trvTrk->angle, *distR )) - trkSeg_p segPtr = (trkSeg_p)xx->cornuData.arcSegs.ptr; + LOG( log_traverseCornu, 1, ( "TravCornu-In [%0.3f %0.3f] A%0.3f D%0.3f \n", + trvTrk->pos.x, trvTrk->pos.y, trvTrk->angle, *distR )) + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + trkSeg_p segPtr = &DYNARR_N(trkSeg_t,xx->arcSegs,0); a2 = GetAngleSegs( //Find correct Segment and nearest point in it - xx->cornuData.arcSegs.cnt,segPtr, - &pos2, &segInx, &d , &back , NULL, &neg); //d = how far pos2 from old pos2 = trvTrk->pos + xx->arcSegs.cnt,segPtr, + &pos2, &segInx, &d, &back, NULL, + &neg); //d = how far pos2 from old pos2 = trvTrk->pos if ( d > 10 ) { - ErrorMessage( "traverseCornu: Position is not near track: %0.3f", d ); - return FALSE; //This means the input pos is not on or close to the track. + ErrorMessage( "traverseCornu: Position is not near track: %0.3f", d ); + return FALSE; //This means the input pos is not on or close to the track. } - if (back) a2 = NormalizeAngle(a2+180); //If reverse segs - reverse angle - a1 = NormalizeAngle(a2-trvTrk->angle); //Establish if we are going fwds or backwards globally - if (a1<270 && a1>90) { //Must add 180 if the seg is reversed or inverted (but not both) + if (back) { a2 = NormalizeAngle(a2+180); } //If reverse segs - reverse angle + a1 = NormalizeAngle(a2 + -trvTrk->angle); //Establish if we are going fwds or backwards globally + if (a1<270 + && a1>90) { //Must add 180 if the seg is reversed or inverted (but not both) cornu_backwards = TRUE; ep = 0; } else { cornu_backwards = FALSE; ep = 1; } - if (neg) { + if (neg) { cornu_backwards = !cornu_backwards; //Reversed direction ep = 1-ep; } segProcData.traverse1.pos = pos2; //actual point on curve - segProcData.traverse1.angle = trvTrk->angle; //direction car is going for Traverse 1 -LOG( log_traverseCornu, 1, ( " TravCornu-GetSubA A%0.3f I%d N%d B%d CB%d\n", a2, segInx, neg, back, cornu_backwards )) + segProcData.traverse1.angle = + trvTrk->angle; //direction car is going for Traverse 1 + LOG( log_traverseCornu, 1, ( " TravCornu-GetSubA A%0.3f I%d N%d B%d CB%d\n", + a2, segInx, neg, back, cornu_backwards )) inx = segInx; - while (inx >=0 && inx<xx->cornuData.arcSegs.cnt) { - segPtr = (trkSeg_p)xx->cornuData.arcSegs.ptr+inx; //move in to the identified Bezier segment + while (inx >=0 && inx<xx->arcSegs.cnt) { + segPtr = (trkSeg_p)xx->arcSegs.ptr + +inx; //move in to the identified Bezier segment SegProc( SEGPROC_TRAVERSE1, segPtr, &segProcData ); - BOOL_T backwards = segProcData.traverse1.backwards; //do we process this segment backwards? + BOOL_T backwards = + segProcData.traverse1.backwards; //do we process this segment backwards? BOOL_T reverse_seg = segProcData.traverse1.reverse_seg; //Info only int BezSegInx = segProcData.traverse1.BezSegInx; //Which subSeg was it? BOOL_T segs_backwards = segProcData.traverse1.segs_backwards; @@ -951,13 +1008,16 @@ LOG( log_traverseCornu, 1, ( " TravCornu-GetSubA A%0.3f I%d N%d B%d CB%d\n", a2 segProcData.traverse2.segDir = backwards; segProcData.traverse2.BezSegInx = BezSegInx; segProcData.traverse2.segs_backwards = segs_backwards; -LOG( log_traverseCornu, 2, ( " TravCornu-Tr1 SI%d D%0.3f B%d RS%d \n", BezSegInx, dist, backwards, reverse_seg ) ) + LOG( log_traverseCornu, 2, ( " TravCornu-Tr1 SI%d D%0.3f B%d RS%d \n", + BezSegInx, dist, backwards, reverse_seg ) ) SegProc( SEGPROC_TRAVERSE2, segPtr, &segProcData ); //Angle at pos2 - if ( segProcData.traverse2.dist <= 0 ) { //-ve or zero distance left over so stop there + if ( segProcData.traverse2.dist <= + 0 ) { //-ve or zero distance left over so stop there *distR = 0; trvTrk->pos = segProcData.traverse2.pos; //Use finishing pos trvTrk->angle = segProcData.traverse2.angle; //Use finishing angle -LOG( log_traverseCornu, 1, ( "TravCornu-Ex1 -> [%0.3f %0.3f] A%0.3f D%0.3f\n", trvTrk->pos.x, trvTrk->pos.y, trvTrk->angle, *distR ) ) + LOG( log_traverseCornu, 1, ( "TravCornu-Ex1 -> [%0.3f %0.3f] A%0.3f D%0.3f\n", + trvTrk->pos.x, trvTrk->pos.y, trvTrk->angle, *distR ) ) return TRUE; } dist = segProcData.traverse2.dist; //How far left? @@ -965,21 +1025,25 @@ LOG( log_traverseCornu, 1, ( "TravCornu-Ex1 -> [%0.3f %0.3f] A%0.3f D%0.3f\n", t ANGLE_T angle = segProcData.traverse2.angle; //Angle of end therefore segProcData.traverse1.angle = angle; //Set up Traverse1 segProcData.traverse1.pos = pos; - inx = cornu_backwards?inx-1:inx+1; //Here's where the global segment direction comes in -LOG( log_traverseCornu, 2, ( " TravCornu-Loop D%0.3f A%0.3f I%d \n", dist, angle, inx ) ) - } - //Ran out of Bez-Segs so punt to next Track + inx = cornu_backwards?inx-1:inx + +1; //Here's where the global segment direction comes in + LOG( log_traverseCornu, 2, ( " TravCornu-Loop D%0.3f A%0.3f I%d \n", dist, + angle, inx ) ) + } + //Ran out of Bez-Segs so punt to next Track *distR = dist; //Tell caller what dist is left trvTrk->pos = GetTrkEndPos(trk,ep); //Which end were we heading for? - trvTrk->angle = NormalizeAngle(GetTrkEndAngle(trk, ep)); //+(cornu_backwards?180:0)); + trvTrk->angle = NormalizeAngle(GetTrkEndAngle(trk, + ep)); //+(cornu_backwards?180:0)); trvTrk->trk = GetTrkEndTrk(trk,ep); //go onto next track (or NULL) if (trvTrk->trk==NULL) { trvTrk->pos = pos1; - return TRUE; + return TRUE; } -LOG( log_traverseCornu, 1, ( "TravCornu-Ex2 --> [%0.3f %0.3f] A%0.3f D%0.3f\n", trvTrk->pos.x, trvTrk->pos.y, trvTrk->angle, *distR ) ) + LOG( log_traverseCornu, 1, ( "TravCornu-Ex2 --> [%0.3f %0.3f] A%0.3f D%0.3f\n", + trvTrk->pos.x, trvTrk->pos.y, trvTrk->angle, *distR ) ) return TRUE; } @@ -989,119 +1053,49 @@ static BOOL_T EnumerateCornu( track_p trk ) { if (trk != NULL) { - struct extraData *xx = GetTrkExtraData(trk); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); DIST_T d; - d = max(CornuOffsetLength(xx->cornuData.arcSegs,-GetTrkGauge(trk)/2.0), - CornuOffsetLength(xx->cornuData.arcSegs,GetTrkGauge(trk)/2.0)); + d = max(CornuOffsetLength(xx->arcSegs,-GetTrkGauge(trk)/2.0), + CornuOffsetLength(xx->arcSegs,GetTrkGauge(trk)/2.0)); ScaleLengthIncrement( GetTrkScale(trk), d ); + return TRUE; } - return TRUE; + return FALSE; } static BOOL_T MergeCornu( - track_p trk0, - EPINX_T ep0, - track_p trk1, - EPINX_T ep1 ) + track_p trk0, + EPINX_T ep0, + track_p trk1, + EPINX_T ep1 ) { - struct extraData *xx0 = GetTrkExtraData(trk0); - struct extraData *xx1 = GetTrkExtraData(trk1); - track_p trk_after,trk_before; - EPINX_T ep_before,ep_after=-1; - coOrd p[2]; - coOrd c[2]; - ANGLE_T a[2]; - DIST_T r[2]; - - - if (!IsTrack(trk0) || !IsTrack(trk1) ) return FALSE; - if (GetTrkType(trk0) != GetTrkType(trk1)) return FALSE; - if (GetEndPtConnectedToMe(trk0,trk1) != ep0) return FALSE; - if (GetEndPtConnectedToMe(trk1,trk0) != ep1) return FALSE; - - if (ep0 == ep1) - return FALSE; - - UndoStart( _("Merge Cornu"), "MergeCornu( T%d[%d] T%d[%d] )", GetTrkIndex(trk0), ep0, GetTrkIndex(trk1), ep1 ); - p[0] = xx0->cornuData.pos[0]; - p[1] = xx1->cornuData.pos[1]; - a[0] = xx0->cornuData.a[0]; - a[1] = xx1->cornuData.a[1]; - c[0] = xx0->cornuData.c[0]; - c[1] = xx1->cornuData.c[1]; - r[0] = xx0->cornuData.r[0]; - r[1] = xx1->cornuData.r[1]; - track_p trk3 = NewCornuTrack(p,c,a,r,NULL,0); - if (trk3==NULL) { - wBeep(); - InfoMessage(_("Cornu Create Failed for p1[%0.3f,%0.3f] p2[%0.3f,%0.3f], c1[%0.3f,%0.3f] c2[%0.3f,%0.3f], a1=%0.3f a2=%0.3f, r1=%s r2=%s"), - p[0].x,p[0].y, - p[1].x,p[1].y, - c[0].x,c[0].y, - c[1].x,c[1].y, - a[0],a[1], - FormatDistance(r[0]),FormatDistance(r[1])); - UndoEnd(); - return FALSE; - } - - UndoModify( trk0 ); - UndoModify( trk1 ); - UndrawNewTrack( trk0 ); - UndrawNewTrack( trk1 ); - trk_after = GetTrkEndTrk( trk1, 1-ep1 ); - if (trk_after) { - ep_after = GetEndPtConnectedToMe( trk_after, trk1 ); - DisconnectTracks( trk1, 1-ep1, trk_after, ep_after ); - } - trk_before = GetTrkEndTrk( trk0, 1-ep0 ); - if (trk_before) { - ep_before = GetEndPtConnectedToMe( trk_before, trk0 ); - DisconnectTracks( trk0, 1-ep1, trk_before, ep_before ); - } - - DeleteTrack( trk1, TRUE ); - DeleteTrack( trk0, TRUE ); - if (trk_after) { - SetTrkEndPoint( trk_after, ep_after, xx0->cornuData.pos[1], NormalizeAngle(xx0->cornuData.a[1]+180)); - ConnectTracks( trk3, 1, trk_after, ep_after); - } - if (trk_before) { - SetTrkEndPoint( trk_before, ep_before, xx0->cornuData.pos[0], NormalizeAngle(xx0->cornuData.a[0]+180)); - ConnectTracks( trk3, 0, trk_before, ep_before); - } - DrawNewTrack( trk3 ); - UndoEnd(); - - return TRUE; + return FALSE; } -BOOL_T GetBezierSegmentsFromCornu(track_p trk, dynArr_t * segs, BOOL_T track) { - struct extraData * xx = GetTrkExtraData(trk); - for (int i=0;i<xx->cornuData.arcSegs.cnt;i++) { - trkSeg_p p = (trkSeg_t *) xx->cornuData.arcSegs.ptr+i; +BOOL_T GetBezierSegmentsFromCornu(track_p trk, dynArr_t * segs, BOOL_T track) +{ + struct extraDataCornu_t * xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + for (int i=0; i<xx->arcSegs.cnt; i++) { + trkSeg_p p = &DYNARR_N(trkSeg_t,xx->arcSegs,i); if (p->type == SEG_BEZTRK) { if (track) { DYNARR_APPEND(trkSeg_t, * segs, 10); trkSeg_p segPtr = &DYNARR_N(trkSeg_t,* segs,segs->cnt-1); segPtr->type = SEG_BEZTRK; segPtr->color = wDrawColorBlack; - segPtr->width = 0; - if (segPtr->bezSegs.ptr) MyFree(segPtr->bezSegs.ptr); - segPtr->bezSegs.cnt = 0; - segPtr->bezSegs.max = 0; - segPtr->bezSegs.ptr = NULL; - for (int j=0;j<4;j++) segPtr->u.b.pos[j] = p->u.b.pos[j]; + segPtr->lineWidth = 0; + DYNARR_FREE( trkSeg_t, segPtr->bezSegs ); + for (int j=0; j<4; j++) { segPtr->u.b.pos[j] = p->u.b.pos[j]; } FixUpBezierSeg(segPtr->u.b.pos,segPtr,TRUE); } else { - for (int j=0;j<p->bezSegs.cnt;j++) { + for (int j=0; j<p->bezSegs.cnt; j++) { trkSeg_p bez_p = &DYNARR_N(trkSeg_t,p->bezSegs,j); DYNARR_APPEND(trkSeg_t, * segs, 10); trkSeg_p segPtr = &DYNARR_LAST(trkSeg_t,* segs); - if (bez_p->type == SEG_CRVTRK) segPtr->type = SEG_CRVLIN; - if (bez_p->type == SEG_STRTRK) segPtr->type = SEG_STRLIN; + if (bez_p->type == SEG_CRVTRK) { segPtr->type = SEG_CRVLIN; } + if (bez_p->type == SEG_STRTRK) { segPtr->type = SEG_STRLIN; } segPtr->u = bez_p->u; - segPtr->width = bez_p->width; + segPtr->lineWidth = bez_p->lineWidth; segPtr->color = bez_p->color; } } @@ -1110,8 +1104,8 @@ BOOL_T GetBezierSegmentsFromCornu(track_p trk, dynArr_t * segs, BOOL_T track) { trkSeg_p segPtr = &DYNARR_N(trkSeg_t,* segs,segs->cnt-1); segPtr->type = track?SEG_STRTRK:SEG_STRLIN; segPtr->color = wDrawColorBlack; - segPtr->width = 0; - for (int j=0;j<2;j++) segPtr->u.l.pos[i] = p->u.l.pos[i]; + segPtr->lineWidth = 0; + for (int j=0; j<2; j++) { segPtr->u.l.pos[i] = p->u.l.pos[i]; } segPtr->u.l.angle = p->u.l.angle; segPtr->u.l.option = 0; } else if (p->type == SEG_CRVTRK) { @@ -1119,7 +1113,7 @@ BOOL_T GetBezierSegmentsFromCornu(track_p trk, dynArr_t * segs, BOOL_T track) { trkSeg_p segPtr = &DYNARR_N(trkSeg_t,* segs,segs->cnt-1); segPtr->type = track?SEG_CRVTRK:SEG_CRVLIN; segPtr->color = wDrawColorBlack; - segPtr->width = 0; + segPtr->lineWidth = 0; segPtr->u.c.a0 = p->u.c.a0; segPtr->u.c.a1 = p->u.c.a1; segPtr->u.c.center = p->u.c.center; @@ -1132,32 +1126,56 @@ BOOL_T GetBezierSegmentsFromCornu(track_p trk, dynArr_t * segs, BOOL_T track) { static DIST_T GetLengthCornu( track_p trk ) { - struct extraData *xx = GetTrkExtraData(trk); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); DIST_T length = 0.0; segProcData_t segProcData; - for(int i=0;i<xx->cornuData.arcSegs.cnt;i++) { - trkSeg_t seg = DYNARR_N(trkSeg_t,xx->cornuData.arcSegs,i); - if (seg.type == SEG_FILCRCL) continue; + for(int i=0; i<xx->arcSegs.cnt; i++) { + trkSeg_t seg = DYNARR_N(trkSeg_t,xx->arcSegs,i); + if (seg.type == SEG_FILCRCL) { continue; } SegProc(SEGPROC_LENGTH, &seg, &segProcData); length += segProcData.length.length; } return length; } +EXPORT BOOL_T GetCornuMiddle( track_p trk, coOrd * pos) +{ + + if (GetTrkType(trk) != T_CORNU) { + return FALSE; + } + DIST_T length = GetLengthCornu(trk)/2; + + traverseTrack_t tp; + tp.pos = GetTrkEndPos(trk,0); + tp.angle = NormalizeAngle(GetTrkEndAngle(trk,0)+180.0); + tp.trk = trk; + tp.length = length; + + TraverseCornu(&tp,&length); + + *pos = tp.pos; + + return TRUE; + +} + -static BOOL_T GetParamsCornu( int inx, track_p trk, coOrd pos, trackParams_t * params ) +static BOOL_T GetParamsCornu( int inx, track_p trk, coOrd pos, + trackParams_t * params ) { int segInx, segInx2; BOOL_T back, negative; DIST_T d; - struct extraData *xx = GetTrkExtraData(trk); + struct extraDataCornu_t *xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); params->type = curveTypeCornu; - params->track_angle = GetAngleSegs( //Find correct Segment and nearest point in it - xx->cornuData.arcSegs.cnt,xx->cornuData.arcSegs.ptr, - &pos, &segInx, &d , &back, &segInx2, &negative ); - if (segInx ==-1) return FALSE; - trkSeg_p segPtr = &DYNARR_N(trkSeg_t,xx->cornuData.arcSegs,segInx); - if (negative != back) params->track_angle = NormalizeAngle(params->track_angle+180); //Cornu is in reverse + params->track_angle = + GetAngleSegs( //Find correct Segment and nearest point in it + xx->arcSegs.cnt,&DYNARR_N(trkSeg_t,xx->arcSegs,0), + &pos, &segInx, &d, &back, &segInx2, &negative ); + if (segInx ==-1) { return FALSE; } + trkSeg_p segPtr = &DYNARR_N(trkSeg_t,xx->arcSegs,segInx); + if (negative != back) { params->track_angle = NormalizeAngle(params->track_angle+180); } //Cornu is in reverse if (segPtr->type == SEG_STRTRK) { params->arcR = 0.0; } else if (segPtr->type == SEG_CRVTRK) { @@ -1176,22 +1194,23 @@ static BOOL_T GetParamsCornu( int inx, track_p trk, coOrd pos, trackParams_t * p params->arcA1 = segPtr2->u.c.a1; } } - for (int i=0;i<2;i++) { - params->cornuEnd[i] = xx->cornuData.pos[i]; - params->cornuAngle[i] = xx->cornuData.a[i]; - params->cornuRadius[i] = xx->cornuData.r[i]; - params->cornuCenter[i] = xx->cornuData.c[i]; + for (int i=0; i<2; i++) { + params->cornuEnd[i] = xx->pos[i]; + params->cornuAngle[i] = xx->a[i]; + params->cornuRadius[i] = xx->r[i]; + params->cornuCenter[i] = xx->c[i]; } - params->len = xx->cornuData.length; + params->len = xx->length; if ( inx == PARAMS_NODES ) { return FALSE; - } else if ((inx == PARAMS_CORNU) || (inx == PARAMS_1ST_JOIN) || (inx == PARAMS_2ND_JOIN) ) { + } else if ((inx == PARAMS_CORNU) || (inx == PARAMS_1ST_JOIN) + || (inx == PARAMS_2ND_JOIN) ) { params->ep = PickEndPoint( pos, trk); } else { params->ep = PickUnconnectedEndPointSilent( pos, trk ); } - if (params->ep == -1) return FALSE; + if (params->ep == -1) { return FALSE; } if (params->ep>=0) { params->angle = GetTrkEndAngle(trk,params->ep); @@ -1205,7 +1224,6 @@ static BOOL_T GetParamsCornu( int inx, track_p trk, coOrd pos, trackParams_t * p static BOOL_T QueryCornu( track_p trk, int query ) { - struct extraData * xx = GetTrkExtraData(trk); switch ( query ) { case Q_CAN_GROUP: return FALSE; @@ -1214,9 +1232,10 @@ static BOOL_T QueryCornu( track_p trk, int query ) case Q_HAS_DESC: return TRUE; break; - case Q_EXCEPTION: - return fabs(xx->cornuData.minCurveRadius) < (GetLayoutMinTrackRadius()-EPSILON); - break; + case Q_EXCEPTION: { + struct extraDataCornu_t * xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + return fabs(xx->minCurveRadius) < (GetLayoutMinTrackRadius()-EPSILON); + } case Q_IS_CORNU: return TRUE; break; @@ -1231,6 +1250,7 @@ static BOOL_T QueryCornu( track_p trk, int query ) case Q_CANNOT_PLACE_TURNOUT: return FALSE; break; + case Q_CORNU_CAN_MODIFY: case Q_IGNORE_EASEMENT_ON_EXTEND: return TRUE; break; @@ -1243,196 +1263,202 @@ static BOOL_T QueryCornu( track_p trk, int query ) static void FlipCornu( - track_p trk, - coOrd orig, - ANGLE_T angle ) + track_p trk, + coOrd orig, + ANGLE_T angle ) { - struct extraData * xx = GetTrkExtraData(trk); - FlipPoint( &xx->cornuData.pos[0], orig, angle ); - FlipPoint( &xx->cornuData.pos[1], orig, angle ); - FlipPoint( &xx->cornuData.c[0], orig, angle); - FlipPoint( &xx->cornuData.c[1], orig, angle); - xx->cornuData.a[0] = NormalizeAngle( 2*angle - xx->cornuData.a[0] ); - xx->cornuData.a[1] = NormalizeAngle( 2*angle - xx->cornuData.a[1] ); + struct extraDataCornu_t * xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + FlipPoint( &xx->pos[0], orig, angle ); + FlipPoint( &xx->pos[1], orig, angle ); + FlipPoint( &xx->c[0], orig, angle); + FlipPoint( &xx->c[1], orig, angle); + xx->a[0] = NormalizeAngle( 2*angle - xx->a[0] ); + xx->a[1] = NormalizeAngle( 2*angle - xx->a[1] ); /* Reverse internals so that they match the new ends */ - coOrd pos_save = xx->cornuData.pos[0]; - xx->cornuData.pos[0] = xx->cornuData.pos[1]; - xx->cornuData.pos[1] = pos_save; - ANGLE_T angle_save = xx->cornuData.a[0]; - xx->cornuData.a[0] = xx->cornuData.a[1]; - xx->cornuData.a[1] = angle_save; - coOrd c_save = xx->cornuData.c[0]; - xx->cornuData.c[0] = xx->cornuData.c[1]; - xx->cornuData.c[1] = c_save; - DIST_T rad_save = xx->cornuData.r[0]; - xx->cornuData.r[0] = xx->cornuData.r[1]; - xx->cornuData.r[1] = rad_save; - - RebuildCornu(trk); + coOrd pos_save = xx->pos[0]; + xx->pos[0] = xx->pos[1]; + xx->pos[1] = pos_save; + ANGLE_T angle_save = xx->a[0]; + xx->a[0] = xx->a[1]; + xx->a[1] = angle_save; + coOrd c_save = xx->c[0]; + xx->c[0] = xx->c[1]; + xx->c[1] = c_save; + DIST_T rad_save = xx->r[0]; + xx->r[0] = xx->r[1]; + xx->r[1] = rad_save; + + RebuildCornu(trk); } static ANGLE_T GetAngleCornu( - track_p trk, - coOrd pos, - EPINX_T * ep0, - EPINX_T * ep1 ) + track_p trk, + coOrd pos, + EPINX_T * ep0, + EPINX_T * ep1 ) { - struct extraData * xx = GetTrkExtraData(trk); + struct extraDataCornu_t * xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); ANGLE_T angle; BOOL_T back, neg; int indx; - angle = GetAngleSegs( xx->cornuData.arcSegs.cnt, (trkSeg_p)xx->cornuData.arcSegs.ptr, &pos, &indx, NULL, &back, NULL, &neg ); - if (!back) angle = NormalizeAngle(angle+180); - if ( ep0 ) *ep0 = neg?1:0; - if ( ep1 ) *ep1 = neg?0:1; + angle = GetAngleSegs( xx->arcSegs.cnt, &DYNARR_N(trkSeg_t,xx->arcSegs,0), &pos, + &indx, NULL, &back, NULL, &neg ); + if (!back) { angle = NormalizeAngle(angle+180); } + if ( ep0 ) { *ep0 = neg?1:0; } + if ( ep1 ) { *ep1 = neg?0:1; } return angle; } -BOOL_T GetCornuSegmentFromTrack(track_p trk, trkSeg_p seg_p) { +BOOL_T GetCornuSegmentFromTrack(track_p trk, trkSeg_p seg_p) +{ //TODO If we support Group return TRUE; } -static dynArr_t cornuSegs_da; +//static dynArr_t cornuSegs_da; static BOOL_T MakeParallelCornu( - track_p trk, - coOrd pos, - DIST_T sep, - DIST_T factor, - track_p * newTrkR, - coOrd * p0R, - coOrd * p1R, - BOOL_T track ) + track_p trk, + coOrd pos, + DIST_T sep, + DIST_T factor, + track_p * newTrkR, + coOrd * p0R, + coOrd * p1R, + BOOL_T track ) { - struct extraData * xx = GetTrkExtraData(trk); - coOrd np[4], p, nc[2]; - ANGLE_T atrk, diff_a, na[2]; - DIST_T nr[2]; + coOrd np[4], p, nc[2]; + ANGLE_T atrk, diff_a, na[2]; + DIST_T nr[2]; //Produce cornu that is translated parallel to the existing Cornu - // - not a precise result if the cornu end angles are not in the same general direction. - // The expectation is that the user will have to adjust it - unless and until we produce - // a new algo to adjust the control points to be parallel to the endpoints. - - p = pos; - DistanceCornu(trk, &p); //Find nearest point on curve - atrk = GetAngleSegs(xx->cornuData.arcSegs.cnt,(trkSeg_t *)(xx->cornuData.arcSegs.ptr),&p,NULL,NULL,NULL,NULL, NULL); - diff_a = NormalizeAngle(FindAngle(pos,p)-atrk); //we know it will be +/-90... - //find parallel move x and y for points - BOOL_T above = FALSE; - if ( diff_a < 180 ) above = TRUE; //Above track - if (xx->cornuData.a[0] <180) above = !above; - DIST_T sep0 = sep+((xx->cornuData.r[0]!=0.0)?fabs(factor/xx->cornuData.r[0]):0); - DIST_T sep1 = sep+((xx->cornuData.r[1]!=0.0)?fabs(factor/xx->cornuData.r[1]):0); - Translate(&np[0],xx->cornuData.pos[0],xx->cornuData.a[0]+(above?90:-90),sep0); - Translate(&np[1],xx->cornuData.pos[1],xx->cornuData.a[1]+(above?-90:90),sep1); - na[0]=xx->cornuData.a[0]; - na[1]=xx->cornuData.a[1]; - if (xx->cornuData.r[0] != 0.0) { - //Find angle between center and end angle of track - ANGLE_T ea0 = - NormalizeAngle(FindAngle(xx->cornuData.c[0],xx->cornuData.pos[0])-xx->cornuData.a[0]); - if (ea0>180) sep0 = -sep0; - nr[0]=xx->cornuData.r[0]+(above?sep0:-sep0); //Needs adjustment - nc[0]=xx->cornuData.c[0]; - } else { - nr[0] = 0.0; - nc[0] = zero; - } - - if (xx->cornuData.r[1] != 0.0) { - ANGLE_T ea1 = - NormalizeAngle(FindAngle(xx->cornuData.c[1],xx->cornuData.pos[1])-xx->cornuData.a[1]); - if (ea1<180) sep1 = -sep1; - nr[1]=xx->cornuData.r[1]+(above?sep1:-sep1); //Needs adjustment - nc[1]=xx->cornuData.c[1]; - } else { - nr[1] = 0.0; - nc[1] = zero; - } + // - not a precise result if the cornu end angles are not in the same general direction. + // The expectation is that the user will have to adjust it - unless and until we produce + // a new algo to adjust the control points to be parallel to the endpoints. + + p = pos; + DistanceCornu(trk, &p); //Find nearest point on curve + struct extraDataCornu_t * xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + atrk = GetAngleSegs(xx->arcSegs.cnt,&DYNARR_N(trkSeg_t,xx->arcSegs,0),&p, + NULL, NULL, NULL,NULL, NULL); + diff_a = NormalizeAngle(FindAngle(pos,p)-atrk); //we know it will be +/-90... + //find parallel move x and y for points + BOOL_T above = FALSE; + if ( diff_a < 180 ) { above = TRUE; } //Above track + if (xx->a[0] <180) { above = !above; } + DIST_T sep0 = sep+((xx->r[0]!=0.0)?fabs(factor/xx->r[0]):0); + DIST_T sep1 = sep+((xx->r[1]!=0.0)?fabs(factor/xx->r[1]):0); + Translate(&np[0],xx->pos[0],xx->a[0]+(above?90:-90),sep0); + Translate(&np[1],xx->pos[1],xx->a[1]+(above?-90:90),sep1); + na[0]=xx->a[0]; + na[1]=xx->a[1]; + if (xx->r[0] != 0.0) { + //Find angle between center and end angle of track + ANGLE_T ea0 = + NormalizeAngle(FindAngle(xx->c[0],xx->pos[0])-xx->a[0]); + if (ea0>180) { sep0 = -sep0; } + nr[0]=xx->r[0]+(above?sep0:-sep0); //Needs adjustment + nc[0]=xx->c[0]; + } else { + nr[0] = 0.0; + nc[0] = zero; + } + + if (xx->r[1] != 0.0) { + ANGLE_T ea1 = + NormalizeAngle(FindAngle(xx->c[1],xx->pos[1])-xx->a[1]); + if (ea1<180) { sep1 = -sep1; } + nr[1]=xx->r[1]+(above?sep1:-sep1); //Needs adjustment + nc[1]=xx->c[1]; + } else { + nr[1] = 0.0; + nc[1] = zero; + } if ( newTrkR ) { if (track) { *newTrkR = NewCornuTrack( np, nc, na, nr, NULL, 0); if (*newTrkR==NULL) { wBeep(); - InfoMessage(_("Cornu Create Failed for p1[%0.3f,%0.3f] p2[%0.3f,%0.3f], c1[%0.3f,%0.3f] c2[%0.3f,%0.3f], a1=%0.3f a2=%0.3f, r1=%s r2=%s"), - np[0].x,np[0].y, - np[1].x,np[1].y, - nc[0].x,nc[0].y, - nc[1].x,nc[1].y, - na[0],na[1], - FormatDistance(nr[0]),FormatDistance(nr[1])); + InfoMessage( + _("Cornu Create Failed for p1[%0.3f,%0.3f] p2[%0.3f,%0.3f], c1[%0.3f,%0.3f] c2[%0.3f,%0.3f], a1=%0.3f a2=%0.3f, r1=%s r2=%s"), + np[0].x,np[0].y, + np[1].x,np[1].y, + nc[0].x,nc[0].y, + nc[1].x,nc[1].y, + na[0],na[1], + FormatDistance(nr[0]),FormatDistance(nr[1])); return FALSE; } } else { - tempSegs_da.cnt = 0; + DYNARR_RESET( trkSeg_t, tempSegs_da ); CallCornu0(np,nc,na,nr,&tempSegs_da,FALSE); *newTrkR = MakePolyLineFromSegs( zero, 0.0, &tempSegs_da ); } } else { - tempSegs_da.cnt = 0; + DYNARR_RESET( trkSeg_t, tempSegs_da ); CallCornu0(np,nc,na,nr,&tempSegs_da,FALSE); if (!track) { - for (int i=0;i<tempSegs_da.cnt;i++) { + for (int i=0; i<tempSegs_da.cnt; i++) { trkSeg_p seg = &tempSegs(i); if (seg->type == SEG_STRTRK) { seg->type = SEG_STRLIN; seg->color = wDrawColorBlack; - seg->width = 0; + seg->lineWidth = 0; } if (seg->type == SEG_CRVTRK) { seg->type = SEG_CRVLIN; seg->color = wDrawColorBlack; - seg->width = 0; + seg->lineWidth = 0; } if (seg->type == SEG_BEZTRK) { - for (int j=0;j<seg->bezSegs.cnt;j++) { - trkSeg_p bseg = &(((trkSeg_t *)seg->bezSegs.ptr)[j]); + for (int j=0; j<seg->bezSegs.cnt; j++) { + trkSeg_p bseg = &DYNARR_N(trkSeg_t,seg->bezSegs,j); if (bseg->type == SEG_STRTRK) { bseg->type = SEG_STRLIN; bseg->color = wDrawColorBlack; - bseg->width = 0; + bseg->lineWidth = 0; } if (bseg->type == SEG_CRVTRK) { bseg->type = SEG_CRVLIN; bseg->color = wDrawColorBlack; - bseg->width = 0; + bseg->lineWidth = 0; } } seg->type = SEG_BEZLIN; seg->color = wDrawColorBlack; - seg->width = 0; + seg->lineWidth = 0; } } } } - if ( p0R ) *p0R = np[0]; - if ( p1R ) *p1R = np[1]; + if ( p0R ) { *p0R = np[0]; } + if ( p1R ) { *p1R = np[1]; } return TRUE; } -static BOOL_T TrimCornu( track_p trk, EPINX_T ep, DIST_T dist, coOrd endpos, ANGLE_T angle, DIST_T radius, coOrd center ) { +static BOOL_T TrimCornu( track_p trk, EPINX_T ep, DIST_T dist, coOrd endpos, + ANGLE_T angle, DIST_T radius, coOrd center ) +{ UndoModify(trk); if (dist>0.0 && dist<minLength) { UndrawNewTrack( trk ); DeleteTrack(trk, TRUE); return FALSE; } else { - struct extraData *xx; + struct extraDataCornu_t *xx; UndrawNewTrack( trk ); - xx = GetTrkExtraData(trk); - xx->cornuData.a[ep] = angle; - xx->cornuData.c[ep] = center; - xx->cornuData.r[ep] = radius; - xx->cornuData.pos[ep] = endpos; + xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + xx->a[ep] = angle; + xx->c[ep] = center; + xx->r[ep] = radius; + xx->pos[ep] = endpos; RebuildCornu(trk); - SetTrkEndPoint(trk, ep, xx->cornuData.pos[ep], xx->cornuData.a[ep]); + SetTrkEndPoint(trk, ep, xx->pos[ep], xx->a[ep]); DrawNewTrack( trk ); } return TRUE; @@ -1446,13 +1472,11 @@ static BOOL_T TrimCornu( track_p trk, EPINX_T ep, DIST_T dist, coOrd endpos, ANG */ EXPORT BOOL_T RebuildCornu (track_p trk) { - struct extraData *xx; - xx = GetTrkExtraData(trk); - xx->cornuData.arcSegs.max = 0; - xx->cornuData.arcSegs.cnt = 0; - //if (xx->cornuData.arcSegs.ptr) MyFree(xx->cornuData.arcSegs.ptr); - xx->cornuData.arcSegs.ptr = NULL; - if (!FixUpCornu0(xx->cornuData.pos,xx->cornuData.c,xx->cornuData.a,xx->cornuData.r, xx)) return FALSE; + struct extraDataCornu_t *xx; + xx = GET_EXTRA_DATA(trk, T_CORNU, extraDataCornu_t); + //NOTE - Original code did not Free .ptr? See CS:c1b85944f448 + DYNARR_INIT( trkSeg_t, xx->arcSegs ); + if (!FixUpCornu0(xx->pos,xx->c,xx->a,xx->r, xx)) { return FALSE; } ComputeCornuBoundingBox(trk, xx); return TRUE; } @@ -1460,64 +1484,66 @@ EXPORT BOOL_T RebuildCornu (track_p trk) static wBool_t CompareCornu( track_cp trk1, track_cp trk2 ) { - struct extraData *xx1 = GetTrkExtraData( trk1 ); - struct extraData *xx2 = GetTrkExtraData( trk2 ); + struct extraDataCornu_t *xx1 = GET_EXTRA_DATA( trk1, T_CORNU, + extraDataCornu_t ); + struct extraDataCornu_t *xx2 = GET_EXTRA_DATA( trk2, T_CORNU, + extraDataCornu_t ); char * cp = message + strlen(message); - REGRESS_CHECK_POS( "Pos[0]", xx1, xx2, cornuData.pos[0] ) - REGRESS_CHECK_POS( "Pos[1]", xx1, xx2, cornuData.pos[1] ) - REGRESS_CHECK_POS( "C[0]", xx1, xx2, cornuData.c[0] ) - REGRESS_CHECK_POS( "C[1]", xx1, xx2, cornuData.c[1] ) - REGRESS_CHECK_ANGLE( "A[0]", xx1, xx2, cornuData.a[0] ) - REGRESS_CHECK_ANGLE( "A[1]", xx1, xx2, cornuData.a[1] ) - REGRESS_CHECK_DIST( "R[0]", xx1, xx2, cornuData.r[0] ) - REGRESS_CHECK_DIST( "R[1]", xx1, xx2, cornuData.r[1] ) - REGRESS_CHECK_DIST( "MinCurveRadius", xx1, xx2, cornuData.minCurveRadius ) - REGRESS_CHECK_DIST( "MaxRateofChange", xx1, xx2, cornuData.maxRateofChange ) - REGRESS_CHECK_DIST( "Length", xx1, xx2, cornuData.length ) - REGRESS_CHECK_ANGLE( "WindingAngle", xx1, xx2, cornuData.windingAngle ) + REGRESS_CHECK_POS( "Pos[0]", xx1, xx2, pos[0] ) + REGRESS_CHECK_POS( "Pos[1]", xx1, xx2, pos[1] ) + REGRESS_CHECK_POS( "C[0]", xx1, xx2, c[0] ) + REGRESS_CHECK_POS( "C[1]", xx1, xx2, c[1] ) + REGRESS_CHECK_ANGLE( "A[0]", xx1, xx2, a[0] ) + REGRESS_CHECK_ANGLE( "A[1]", xx1, xx2, a[1] ) + REGRESS_CHECK_DIST( "R[0]", xx1, xx2, r[0] ) + REGRESS_CHECK_DIST( "R[1]", xx1, xx2, r[1] ) + REGRESS_CHECK_DIST( "MinCurveRadius", xx1, xx2, minCurveRadius ) + REGRESS_CHECK_DIST( "MaxRateofChange", xx1, xx2, maxRateofChange ) + REGRESS_CHECK_DIST( "Length", xx1, xx2, length ) + REGRESS_CHECK_ANGLE( "WindingAngle", xx1, xx2, windingAngle ) // CHECK arcSegs - REGRESS_CHECK_POS( "DescOff", xx1, xx2, cornuData.descriptionOff ) + REGRESS_CHECK_POS( "DescOff", xx1, xx2, descriptionOff ) // CHECK cornuPath return TRUE; } static trackCmd_t cornuCmds = { - "CORNU", - DrawCornu, - DistanceCornu, - DescribeCornu, - DeleteCornu, - WriteCornu, - ReadCornu, - MoveCornu, - RotateCornu, - RescaleCornu, - NULL, - GetAngleCornu, - SplitCornu, - TraverseCornu, - EnumerateCornu, - NULL, /* redraw */ - TrimCornu, /* trim */ - MergeCornu, - NULL, /* modify */ - GetLengthCornu, - GetParamsCornu, - MoveCornuEndPt, /* Move EndPt */ - QueryCornu, - NULL, /* ungroup */ - FlipCornu, - NULL, - NULL, - NULL, - MakeParallelCornu, - NULL, - RebuildCornu, - NULL, - NULL, - NULL, - CompareCornu - }; + "CORNU", + DrawCornu, + DistanceCornu, + DescribeCornu, + DeleteCornu, + WriteCornu, + ReadCornu, + MoveCornu, + RotateCornu, + RescaleCornu, + NULL, + GetAngleCornu, + SplitCornu, + TraverseCornu, + EnumerateCornu, + NULL, /* redraw */ + TrimCornu, /* trim */ + MergeCornu, + NULL, /* modify */ + GetLengthCornu, + GetParamsCornu, + MoveCornuEndPt, /* Move EndPt */ + QueryCornu, + NULL, /* ungroup */ + FlipCornu, + NULL, + NULL, + NULL, + MakeParallelCornu, + NULL, + RebuildCornu, + NULL, + NULL, + NULL, + CompareCornu +}; @@ -1532,29 +1558,32 @@ static trackCmd_t cornuCmds = { -track_p NewCornuTrack(coOrd pos[2], coOrd center[2],ANGLE_T angle[2], DIST_T radius[2], trkSeg_t * tempsegs, int count) +track_p NewCornuTrack(coOrd pos[2], coOrd center[2],ANGLE_T angle[2], + DIST_T radius[2], trkSeg_t * tempsegs, int count) { - struct extraData *xx; + struct extraDataCornu_t *xx; track_p p; p = NewTrack( 0, T_CORNU, 2, sizeof *xx ); - xx = GetTrkExtraData(p); - xx->cornuData.pos[0] = pos[0]; - xx->cornuData.pos[1] = pos[1]; - xx->cornuData.a[0] = angle[0]; - xx->cornuData.a[1] = angle[1]; - xx->cornuData.r[0] = radius[0]; - xx->cornuData.r[1] = radius[1]; - xx->cornuData.c[0] = center[0]; - xx->cornuData.c[1] = center[1]; - - if (!FixUpCornu0(xx->cornuData.pos,xx->cornuData.c,xx->cornuData.a,xx->cornuData.r, xx)) { - ErrorMessage("Create Cornu Failed"); - return NULL; + xx = GET_EXTRA_DATA(p, T_CORNU, extraDataCornu_t); + xx->pos[0] = pos[0]; + xx->pos[1] = pos[1]; + xx->a[0] = angle[0]; + xx->a[1] = angle[1]; + xx->r[0] = radius[0]; + xx->r[1] = radius[1]; + xx->c[0] = center[0]; + xx->c[1] = center[1]; + + if (!FixUpCornu0(xx->pos,xx->c,xx->a,xx->r, xx)) { + ErrorMessage("Create Cornu Failed"); + return NULL; } -LOG( log_cornu, 1, ( "NewCornuTrack( EP1 %0.3f, %0.3f, EP2 %0.3f, %0.3f ) = %d\n", pos[0].x, pos[0].y, pos[1].x, pos[1].y, GetTrkIndex(p) ) ) + LOG( log_cornu, 1, + ( "NewCornuTrack( EP1 %0.3f, %0.3f, EP2 %0.3f, %0.3f ) = %d\n", pos[0].x, + pos[0].y, pos[1].x, pos[1].y, GetTrkIndex(p) ) ) ComputeCornuBoundingBox( p, xx ); - SetTrkEndPoint( p, 0, pos[0], xx->cornuData.a[0]); - SetTrkEndPoint( p, 1, pos[1], xx->cornuData.a[1]); + SetTrkEndPoint( p, 0, pos[0], xx->a[0]); + SetTrkEndPoint( p, 1, pos[1], xx->a[1]); CheckTrackLength( p ); SetTrkBits( p, TB_HIDEDESC ); return p; |