diff options
Diffstat (limited to 'app/bin/cdraw.c')
-rw-r--r-- | app/bin/cdraw.c | 204 |
1 files changed, 164 insertions, 40 deletions
diff --git a/app/bin/cdraw.c b/app/bin/cdraw.c index efdb51a..418f32a 100644 --- a/app/bin/cdraw.c +++ b/app/bin/cdraw.c @@ -20,12 +20,22 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "track.h" +#include <math.h> +#include <stdint.h> +#include <string.h> + #include "ccurve.h" +#include "cbezier.h" #include "drawgeom.h" +#include "fileio.h" #include "i18n.h" +#include "messages.h" +#include "param.h" +#include "track.h" +#include "utility.h" +#include "misc.h" -#include <stdint.h> +extern TRKTYP_T T_BZRLIN; extern void wSetSelectedFontSize(int size); @@ -200,14 +210,15 @@ static struct { wIndex_t dimenSize; descPivot_t pivot; wIndex_t fontSizeInx; - char text[STR_SIZE]; - LAYER_T layer; + char text[STR_LONG_SIZE]; + unsigned int layer; + char polyType[STR_SIZE]; } drawData; -typedef enum { E0, E1, CE, RA, LN, AL, A1, A2, VC, LW, CO, BE, OR, DS, TP, TA, TS, TX, PV, LY } drawDesc_e; +typedef enum { E0, E1, CE, RA, LN, AL, A1, A2, VC, LW, CO, BE, OR, DS, TP, TA, TS, TX, PV, LY, PT } drawDesc_e; static descData_t drawDesc[] = { -/*E0*/ { DESC_POS, N_("End Pt 1: X"), &drawData.endPt[0] }, -/*E1*/ { DESC_POS, N_("End Pt 2: X"), &drawData.endPt[1] }, -/*CE*/ { DESC_POS, N_("Center: X"), &drawData.center }, +/*E0*/ { DESC_POS, N_("End Pt 1: X,Y"), &drawData.endPt[0] }, +/*E1*/ { DESC_POS, N_("End Pt 2: X,Y"), &drawData.endPt[1] }, +/*CE*/ { DESC_POS, N_("Center: X,Y"), &drawData.center }, /*RA*/ { DESC_DIM, N_("Radius"), &drawData.radius }, /*LN*/ { DESC_DIM, N_("Length"), &drawData.length }, /*AL*/ { DESC_FLOAT, N_("Angle"), &drawData.angle }, @@ -219,12 +230,13 @@ static descData_t drawDesc[] = { /*BE*/ { DESC_LIST, N_("Lumber"), &drawData.benchChoice }, /*OR*/ { DESC_LIST, N_("Orientation"), &drawData.benchOrient }, /*DS*/ { DESC_LIST, N_("Size"), &drawData.dimenSize }, -/*TP*/ { DESC_POS, N_("Origin: X"), &drawData.endPt[0] }, +/*TP*/ { DESC_POS, N_("Origin: X,Y"), &drawData.endPt[0] }, /*TA*/ { DESC_FLOAT, N_("Angle"), &drawData.angle }, /*TS*/ { DESC_EDITABLELIST, N_("Font Size"), &drawData.fontSizeInx }, -/*TX*/ { DESC_STRING, N_("Text"), &drawData.text }, +/*TX*/ { DESC_TEXT, N_("Text"), &drawData.text }, /*PV*/ { DESC_PIVOT, N_("Pivot"), &drawData.pivot }, /*LY*/ { DESC_LAYER, N_("Layer"), &drawData.layer }, +/*PT*/ { DESC_STRING, N_("Type"), &drawData.polyType }, { DESC_NULL } }; int drawSegInx; @@ -241,14 +253,15 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final ) struct extraData *xx = GetTrkExtraData(trk); trkSeg_p segPtr; coOrd mid; - const char * text; long fontSize; if ( drawSegInx==-1 ) return; - if ( inx == -1 ) - return; segPtr = &xx->segs[drawSegInx]; + if ( inx == -1 ) { + if (segPtr->type != SEG_TEXT) return; + else inx = TX; //Always look at TextField for SEG_TEXT on "Done" + } MainRedraw(); MapRedraw(); UndrawNewTrack( trk ); @@ -286,7 +299,7 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final ) if ( segPtr->type != SEG_CRVLIN ) { drawData.length = FindDistance( drawData.endPt[0], drawData.endPt[1] ); } else { - drawData.length = segPtr->u.c.radius*2*M_PI*segPtr->u.c.a1/360.0; + drawData.length = fabs(segPtr->u.c.radius)*2*M_PI*segPtr->u.c.a1/360.0; } drawDesc[LN].mode |= DESC_CHANGE; break; @@ -375,12 +388,14 @@ static void UpdateDraw( track_p trk, int inx, descData_p descUpd, BOOL_T final ) segPtr->u.t.fontSize = fontSize; break; case TX: - text = wStringGetValue( (wString_p)drawDesc[TX].control0 ); - if ( text && text[0] && strcmp( segPtr->u.t.string, text ) != 0 ) { + if ( wTextGetModified((wText_p)drawDesc[TX].control0 )) { + int len = wTextGetSize((wText_p)drawDesc[TX].control0); MyFree( segPtr->u.t.string ); - segPtr->u.t.string = MyStrdup( text ); - /*(char*)drawDesc[TX].valueP = segPtr->u.t.string;*/ + segPtr->u.t.string = (char *)MyMalloc(len+1); + wTextGetText((wText_p)drawDesc[TX].control0, segPtr->u.t.string, len+1); + segPtr->u.t.string[len] = '\0'; //Make sure of null term } + break; case LY: SetTrkLayer( trk, drawData.layer); @@ -400,6 +415,7 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len ) trkSeg_p segPtr; int inx; char * title = NULL; + char * polyType = NULL; DistanceSegs( xx->orig, xx->angle, xx->segCnt, xx->segs, &pos, &drawSegInx ); @@ -462,7 +478,7 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len ) break; case SEG_CRVLIN: REORIGIN( drawData.center, segPtr->u.c.center, xx->angle, xx->orig ); - drawData.radius = segPtr->u.c.radius; + drawData.radius = fabs(segPtr->u.c.radius); drawDesc[CE].mode = drawDesc[RA].mode = 0; if ( segPtr->u.c.a1 >= 360.0 ) { @@ -479,7 +495,7 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len ) break; case SEG_FILCRCL: REORIGIN( drawData.center, segPtr->u.c.center, xx->angle, xx->orig ); - drawData.radius = segPtr->u.c.radius; + drawData.radius = fabs(segPtr->u.c.radius); drawDesc[CE].mode = drawDesc[RA].mode = 0; drawDesc[LW].mode = DESC_IGNORE; @@ -488,21 +504,37 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len ) case SEG_POLY: drawData.pointCount = segPtr->u.p.cnt; drawDesc[VC].mode = DESC_RO; - title = _("Poly Line"); + drawDesc[PT].mode = DESC_RO; + switch (segPtr->u.p.polyType) { + case RECTANGLE: + polyType = _("Rectangle"); + break; + default: + polyType = _("Freeform"); + } + strncpy( drawData.polyType, polyType, sizeof drawData.polyType ); + title = _("Polygonal Line"); break; case SEG_FILPOLY: drawData.pointCount = segPtr->u.p.cnt; drawDesc[VC].mode = DESC_RO; drawDesc[LW].mode = DESC_IGNORE; + drawDesc[PT].mode = DESC_RO; + switch (segPtr->u.p.polyType) { + case RECTANGLE: + polyType =_("Rectangle"); + break; + default: + polyType = _("Freeform"); + } + strncpy( drawData.polyType, polyType, sizeof drawData.polyType ); title = _("Polygon"); break; case SEG_TEXT: REORIGIN( drawData.endPt[0], segPtr->u.t.pos, xx->angle, xx->orig ); - //drawData.angle = NormalizeAngle( segPtr->u.t.angle ); drawData.angle = NormalizeAngle( xx->angle ); strncpy( drawData.text, segPtr->u.t.string, sizeof drawData.text ); - /*drawData.fontSize = segPtr->u.t.fontSize;*/ - /*(char*)drawDesc[TX].valueP = segPtr->u.t.string;*/ + drawData.text[sizeof drawData.text-1] ='\0'; drawDesc[TP].mode = drawDesc[TS].mode = drawDesc[TX].mode = @@ -541,7 +573,7 @@ static void DescribeDraw( track_p trk, char * str, CSIZE_T len ) static void DrawDraw( track_p t, drawCmd_p d, wDrawColor color ) { struct extraData * xx = GetTrkExtraData(t); - if ( (d->options&DC_QUICK) == 0 ) + if ( (d->funcs->options&DC_QUICK) == 0 ) DrawSegs( d, xx->orig, xx->angle, xx->segs, xx->segCnt, 0.0, color ); } @@ -668,7 +700,7 @@ static ANGLE_T GetAngleDraw( pos.x -= xx->orig.x; pos.y -= xx->orig.y; Rotate( &pos, zero, -xx->angle ); - angle = GetAngleSegs( xx->segCnt, xx->segs, pos, NULL ); + angle = GetAngleSegs( xx->segCnt, xx->segs, &pos, NULL, NULL, NULL, NULL, NULL); if ( ep0 ) *ep0 = -1; if ( ep1 ) *ep1 = -1; return NormalizeAngle( angle + xx->angle ); @@ -767,7 +799,69 @@ EXPORT BOOL_T OnTableEdgeEndPt( track_p trk, coOrd * pos ) return FALSE; } +EXPORT BOOL_T GetClosestEndPt( track_p trk, coOrd * pos) +{ + struct extraData *xx; + + if (GetTrkType(trk) == T_DRAW) { + ignoredTableEdge = NULL; + xx = GetTrkExtraData(trk); + if (xx->segCnt < 1) + return FALSE; + DIST_T dd0,dd1; + coOrd p00,p0,p1; + p00 = *pos; + if (GetTrkType(trk) == T_DRAW) { + Rotate(&p00,xx->orig,-xx->angle); + p00.x -= xx->orig.x; + p00.y -= xx->orig.y; + switch (xx->segs[0].type) { + case SEG_CRVLIN: + PointOnCircle( &p0, xx->segs[0].u.c.center, fabs(xx->segs[0].u.c.radius), xx->segs[0].u.c.a0 ); + dd0 = FindDistance( p00, p0); + PointOnCircle( &p1, xx->segs[0].u.c.center, fabs(xx->segs[0].u.c.radius), xx->segs[0].u.c.a0 + xx->segs[0].u.c.a1); + dd1 = FindDistance( p00, p1); + break; + case SEG_STRLIN: + dd0 = FindDistance( p00, xx->segs[0].u.l.pos[0]); + p0 = xx->segs[0].u.l.pos[0]; + dd1 = FindDistance( p00, xx->segs[0].u.l.pos[1]); + p1 = xx->segs[0].u.l.pos[1]; + break; + case SEG_BEZLIN: + dd0 = FindDistance( p00, xx->segs[0].u.b.pos[0]); + p0 = xx->segs[0].u.b.pos[0]; + dd1 = FindDistance( p00, xx->segs[0].u.b.pos[3]); + p1 = xx->segs[0].u.b.pos[3]; + break; + default: + return FALSE; + } + p0.x += xx->orig.x; + p0.y += xx->orig.y; + Rotate(&p0,xx->orig,xx->angle); + p1.x += xx->orig.x; + p1.y += xx->orig.y; + Rotate(&p1,xx->orig,xx->angle); + } else if (GetTrkType(trk) == T_BZRLIN) { + coOrd p0,p1; + xx = GetTrkExtraData(trk); + p0 = xx->segs[0].u.b.pos[0]; + p1 = xx->segs[0].u.b.pos[3]; + dd0 = FindDistance(p00,p0); + dd1 = FindDistance(p00,p1); + } else return FALSE; + if (dd0>dd1) { + * pos = p1; + return TRUE; + } else { + * pos = p0; + return TRUE; + } + } + return FALSE; +} static void DrawRedraw(void); @@ -783,15 +877,13 @@ static void DrawRedraw( void ) MapRedraw(); } - static wIndex_t benchChoice; static wIndex_t benchOrient; static wIndex_t dimArrowSize; -static wDrawColor lineColor; +wDrawColor lineColor = 1; +long lineWidth = 0; static wDrawColor benchColor; -#ifdef LATER -static wIndex_t benchInx; -#endif + static paramIntegerRange_t i0_100 = { 0, 100, 25 }; static paramData_t drawPLs[] = { @@ -802,7 +894,11 @@ static paramData_t drawPLs[] = { #define drawBenchColorPD (drawPLs[2]) { PD_COLORLIST, &benchColor, "benchcolor", PDO_NORECORD, NULL, N_("Color") }, #define drawBenchChoicePD (drawPLs[3]) - { PD_DROPLIST, &benchChoice, "benchlist", PDO_NOPREF|PDO_NORECORD|PDO_LISTINDEX, (void*)80, N_("Lumber Type") }, +#ifdef WINDOWS + { PD_DROPLIST, &benchChoice, "benchlist", PDO_NOPREF|PDO_NORECORD|PDO_LISTINDEX, (void*)120, N_("Lumber Type") }, +#else + { PD_DROPLIST, &benchChoice, "benchlist", PDO_NOPREF|PDO_NORECORD|PDO_LISTINDEX, (void*)145, N_("Lumber Type") }, +#endif #define drawBenchOrientPD (drawPLs[4]) #ifdef WINDOWS { PD_DROPLIST, &benchOrient, "benchorient", PDO_NOPREF|PDO_NORECORD|PDO_LISTINDEX, (void*)45, "", 0 }, @@ -832,6 +928,7 @@ static char * objectName[] = { N_("Filled Circle"), N_("Filled Box"), N_("Polygon"), + N_("Bezier Line"), NULL}; static STATUS_T CmdDraw( wAction_t action, coOrd pos ) @@ -842,6 +939,8 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos ) char * labels[3]; static char labelName[40]; + wAction_t act2 = (action&0xFF) | (bezCmdCreateLine<<8); + switch (action&0xFF) { case C_START: @@ -870,6 +969,7 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos ) case OP_CIRCLE3: case OP_BOX: case OP_POLY: + case OP_BEZLIN: controls[0] = drawWidthPD.control; controls[1] = drawColorPD.control; controls[2] = NULL; @@ -879,6 +979,7 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos ) InfoSubstituteControls( controls, labels ); drawWidthPD.option &= ~PDO_NORECORD; drawColorPD.option &= ~PDO_NORECORD; + lineWidth = drawCmdContext.Width; break; case OP_FILLCIRCLE2: case OP_FILLCIRCLE3: @@ -935,12 +1036,17 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos ) infoSubst = FALSE; } ParamGroupRecord( &drawPG ); + if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); DrawGeomMouse( C_START, pos, &drawCmdContext ); return C_CONTINUE; case wActionLDown: ParamLoadData( &drawPG ); + if (drawCmdContext.Op == OP_BEZLIN) { + act2 = action | (bezCmdCreateLine<<8); + return CmdBezCurve(act2, pos); + } if ( drawCmdContext.Op == OP_BENCH ) { drawCmdContext.benchOption = GetBenchData( (long)wListGetItemContext((wList_p)drawBenchChoicePD.control, benchChoice ), benchOrient ); drawCmdContext.Color = benchColor; @@ -963,22 +1069,29 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos ) case wActionRUp: case wActionText: case C_CMDMENU: - SnapPos( &pos ); + if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); + if (!((MyGetKeyState() & WKEY_SHIFT) != 0)) { + SnapPos( &pos ); + } return DrawGeomMouse( action, pos, &drawCmdContext ); case C_CANCEL: InfoSubstituteControls( NULL, NULL ); + if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); return DrawGeomMouse( action, pos, &drawCmdContext ); case C_OK: + if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); return DrawGeomMouse( (0x0D<<8|wActionText), pos, &drawCmdContext ); /*DrawOk( NULL );*/ case C_FINISH: + if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); return DrawGeomMouse( (0x0D<<8|wActionText), pos, &drawCmdContext ); /*DrawOk( NULL );*/ case C_REDRAW: + if (drawCmdContext.Op == OP_BEZLIN) return CmdBezCurve(act2, pos); return DrawGeomMouse( action, pos, &drawCmdContext ); default: @@ -1004,6 +1117,7 @@ static STATUS_T CmdDraw( wAction_t action, coOrd pos ) #include "bitmaps/dfilbox.xpm" #include "bitmaps/dpoly.xpm" #include "bitmaps/dfilpoly.xpm" +#include "bitmaps/dbezier.xpm" typedef struct { char **xpm; @@ -1023,7 +1137,8 @@ static drawData_t dcurveCmds[] = { { dcurve1_xpm, OP_CURVE1, N_("Curve End"), N_("Draw Curve from End"), "cmdDrawCurveEndPt", ACCL_DRAWCURVE1 }, { dcurve2_xpm, OP_CURVE2, N_("Curve Tangent"), N_("Draw Curve from Tangent"), "cmdDrawCurveTangent", ACCL_DRAWCURVE2 }, { dcurve3_xpm, OP_CURVE3, N_("Curve Center"), N_("Draw Curve from Center"), "cmdDrawCurveCenter", ACCL_DRAWCURVE3 }, - { dcurve4_xpm, OP_CURVE4, N_("Curve Chord"), N_("Draw Curve from Chord"), "cmdDrawCurveChord", ACCL_DRAWCURVE4 } }; + { dcurve4_xpm, OP_CURVE4, N_("Curve Chord"), N_("Draw Curve from Chord"), "cmdDrawCurveChord", ACCL_DRAWCURVE4 }, + { dbezier_xpm, OP_BEZLIN, N_("Bezier Curve"), N_("Draw Bezier"), "cmdDrawBezierCurve", ACCL_DRAWBEZLINE } }; static drawData_t dcircleCmds[] = { /*{ dcircle1_xpm, OP_CIRCLE1, "Circle Fixed Radius", "Draw Fixed Radius Circle", "cmdDrawCircleFixedRadius", ACCL_DRAWCIRCLE1 },*/ { dcircle2_xpm, OP_CIRCLE3, N_("Circle Tangent"), N_("Draw Circle from Tangent"), "cmdDrawCircleTangent", ACCL_DRAWCIRCLE2 }, @@ -1052,12 +1167,11 @@ static drawStuff_t drawStuff[4]; static drawStuff_t drawStuff[4] = { { "cmdDrawLineSetCmd", N_("Straight Objects"), N_("Draw Straight Objects"), 4, dlineCmds }, - { "cmdDrawCurveSetCmd", N_("Curved Lines"), N_("Draw Curved Lines"), 4, dcurveCmds }, + { "cmdDrawCurveSetCmd", N_("Curved Lines"), N_("Draw Curved Lines"), 5, dcurveCmds }, { "cmdDrawCircleSetCmd", N_("Circle Lines"), N_("Draw Circles"), 4, dcircleCmds }, { "cmdDrawShapeSetCmd", N_("Shapes"), N_("Draw Shapes"), 4, dshapeCmds} }; - static void ChangeDraw( long changes ) { wIndex_t choice, orient; @@ -1079,6 +1193,15 @@ static void DrawDlgUpdate( int inx, void * valueP ) { + if (drawCmdContext.Op == OP_BEZLIN) { + if ( (inx == 0 && pg->paramPtr[inx].valueP == &drawCmdContext.Width) || + (inx == 1 && pg->paramPtr[inx].valueP == &lineColor)) + { + lineWidth = drawCmdContext.Width; + UpdateParms(lineColor, lineWidth); + } + } + if ( inx >= 0 && pg->paramPtr[inx].valueP == &benchChoice ) BenchUpdateOrientationList( (long)wListGetItemContext( (wList_p)drawBenchChoicePD.control, (wIndex_t)*(long*)valueP ), (wList_p)drawBenchOrientPD.control ); } @@ -1108,9 +1231,7 @@ EXPORT void InitCmdDraw( wMenu_p menu ) ParamRegister( &drawPG ); RegisterChangeNotification( ChangeDraw ); -#ifdef LATER - InitCommand( cmdDraw, N_("Draw"), draw_bits, LEVEL0_50, IC_POPUP|IC_CMDMENU, ACCL_DRAW ); -#endif + } @@ -1168,7 +1289,6 @@ EXPORT track_p NewText( return trk; } - EXPORT BOOL_T ReadText( char * line ) { coOrd pos; @@ -1190,6 +1310,10 @@ EXPORT BOOL_T ReadText( char * line ) return FALSE; } + char * old = text; + text = ConvertFromEscapedText(text); + MyFree(old); + trk = NewText( index, pos, angle, text, textSize, color ); SetTrkLayer( trk, layer ); MyFree(text); |