summaryrefslogtreecommitdiff
path: root/app/bin/cbezier.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/cbezier.c')
-rw-r--r--app/bin/cbezier.c105
1 files changed, 50 insertions, 55 deletions
diff --git a/app/bin/cbezier.c b/app/bin/cbezier.c
index 7f90a27..22c95ba 100644
--- a/app/bin/cbezier.c
+++ b/app/bin/cbezier.c
@@ -42,7 +42,7 @@
*/
-#include "track.h"
+#include "common.h"
#include "draw.h"
#include "ccurve.h"
#include "cbezier.h"
@@ -50,15 +50,14 @@
#include "cstraigh.h"
#include "drawgeom.h"
#include "cjoin.h"
-#include "i18n.h"
#include "common.h"
+#include "track.h"
#include "wcolors.h"
-#include "math.h"
-#include "utility.h"
#include "param.h"
#include "fileio.h"
#include "layout.h"
#include "cundo.h"
+#include "compound.h"
extern drawCmd_t tempD;
@@ -385,7 +384,7 @@ EXPORT BOOL_T ConvertToArcs (coOrd pos[4], dynArr_t * segs, BOOL_T track, wDrawC
end_point = getPoint(pos, t_e); //End of trial Arc
PlotCurve( crvCmdFromChord, start_point, end_point, mid_point,
- &(arc.curveData), TRUE ); //Find Arc through three points
+ &(arc.curveData), FALSE, 0.0 ); //Find Arc through three points
arc.start = t_s; //remember start
arc.end = t_e; //remember end
@@ -615,7 +614,7 @@ EXPORT STATUS_T AdjustBezCurve(
case C_DOWN:
if (Da.state != PICK_POINT) return C_CONTINUE;
- dd = 10000.0;
+ dd = DIST_INF;
Da.selectPoint = -1;
for (int i=0;i<4;i++) {
d = FindDistance(Da.pos[i],pos);
@@ -803,10 +802,6 @@ EXPORT STATUS_T AdjustBezCurve(
}
-struct extraData {
- BezierData_t bezierData;
- };
-
/*
* CmdBezModify
*
@@ -825,13 +820,12 @@ struct extraData {
*/
STATUS_T CmdBezModify (track_p trk, wAction_t action, coOrd pos, DIST_T trackG) {
BOOL_T track = TRUE;
- track_p t;
double width = 1.0;
long mode = 0;
long cmd;
- struct extraData *xx = GetTrkExtraData(trk);
- cmd = (long)commandContext;
+ struct extraDataBezier_t *xx = GET_EXTRA_DATA(trk, T_NOTRACK, extraDataBezier_t);
+ cmd = VP2L(commandContext);
Da.trackGauge = trackG;
switch (action&0xFF) {
@@ -854,30 +848,30 @@ STATUS_T CmdBezModify (track_p trk, wAction_t action, coOrd pos, DIST_T trackG)
Da.selectTrack = trk;
- for (int i=0;i<4;i++) Da.pos[i] = xx->bezierData.pos[i]; //Copy parms from old trk
+ for (int i=0;i<4;i++) Da.pos[i] = xx->pos[i]; //Copy parms from old trk
InfoMessage(_("%s picked - now select a Point"),track?"Track":"Line");
Da.state = TRACK_SELECTED;
DrawTrack(Da.selectTrack,&mainD,wDrawColorWhite); //Wipe out real track, draw replacement
- return AdjustBezCurve(C_START, pos, Da.track, xx->bezierData.segsColor, xx->bezierData.segsWidth, InfoMessage);
+ return AdjustBezCurve(C_START, pos, Da.track, xx->segsColor, xx->segsWidth, InfoMessage);
case wActionMove:
if (Da.state == NONE) return C_CONTINUE;
- return AdjustBezCurve(wActionMove, pos, Da.track, xx->bezierData.segsColor, xx->bezierData.segsWidth, InfoMessage);
+ return AdjustBezCurve(wActionMove, pos, Da.track, xx->segsColor, xx->segsWidth, InfoMessage);
case C_DOWN:
if (Da.state == TRACK_SELECTED) return C_CONTINUE; //Ignore until first up
UndrawNewTrack( Da.selectTrack );
- return AdjustBezCurve(C_DOWN, pos, Da.track, xx->bezierData.segsColor, xx->bezierData.segsWidth, InfoMessage);
+ return AdjustBezCurve(C_DOWN, pos, Da.track, xx->segsColor, xx->segsWidth, InfoMessage);
case C_MOVE:
if (Da.state == TRACK_SELECTED) return C_CONTINUE; //Ignore until first up and down
- return AdjustBezCurve(C_MOVE, pos, Da.track, xx->bezierData.segsColor, xx->bezierData.segsWidth, InfoMessage);
+ return AdjustBezCurve(C_MOVE, pos, Da.track, xx->segsColor, xx->segsWidth, InfoMessage);
case C_UP:
if (Da.state == TRACK_SELECTED) {
Da.state = PICK_POINT; //First time up, next time pick a point
}
- return AdjustBezCurve(C_UP, pos, Da.track, xx->bezierData.segsColor, xx->bezierData.segsWidth, InfoMessage); //Run Adjust
+ return AdjustBezCurve(C_UP, pos, Da.track, xx->segsColor, xx->segsWidth, InfoMessage); //Run Adjust
case C_TEXT:
if ((action>>8) != 32)
@@ -890,22 +884,18 @@ STATUS_T CmdBezModify (track_p trk, wAction_t action, coOrd pos, DIST_T trackG)
return C_CANCEL;
}
UndoStart( _("Modify Bezier"), "newBezier - CR" );
- if (Da.track) t = NewBezierTrack( Da.pos, (trkSeg_p)Da.crvSegs_da.ptr, Da.crvSegs_da.cnt);
- else t = NewBezierLine(Da.pos, (trkSeg_p)Da.crvSegs_da.ptr, Da.crvSegs_da.cnt,xx->bezierData.segsColor,xx->bezierData.segsWidth);
-
- if (Da.track) CopyAttributes( trk, t );
+ UndoModify( trk );
- Da.state = NONE; //Must do before Delete for redraw
- DeleteTrack(trk, TRUE);
-
- if (Da.track) {
- for (int i=0;i<2;i++) { //Attach new track
- if (Da.trk[i] != NULL && Da.ep[i] != -1) { //Like the old track
- ConnectAbuttingTracks(t,i,Da.trk[i],Da.ep[i]);
- }
- }
+ Da.state = NONE;
+ wDrawColor color = wDrawColorBlack;
+ DIST_T width = 0;
+ if ( !Da.track ) {
+ color = xx->segsColor;
+ width = xx->segsWidth;
}
- DrawNewTrack( t );
+ SetBezierData( trk, Da.pos, xx->segsColor, xx->segsWidth );
+
+ DrawNewTrack( trk );
UndoEnd();
InfoMessage(_("Modify Bezier Complete"));
return C_TERMINATE;
@@ -916,7 +906,7 @@ STATUS_T CmdBezModify (track_p trk, wAction_t action, coOrd pos, DIST_T trackG)
return C_TERMINATE;
case C_REDRAW:
- return AdjustBezCurve(C_REDRAW, pos, Da.track, xx->bezierData.segsColor, xx->bezierData.segsWidth, InfoMessage);
+ return AdjustBezCurve(C_REDRAW, pos, Da.track, xx->segsColor, xx->segsWidth, InfoMessage);
}
return C_CONTINUE;
@@ -961,7 +951,7 @@ DIST_T BezierOffsetLength(dynArr_t segs, double offset) {
DIST_T BezierMinRadius(coOrd pos[4],dynArr_t segs) {
- DIST_T r = 100000.0, rr;
+ DIST_T r = DIST_INF, rr;
if (segs.cnt == 0 ) return r;
for (int i = 0;i<segs.cnt;i++) {
trkSeg_t t = DYNARR_N(trkSeg_t, segs, i);
@@ -969,7 +959,7 @@ DIST_T BezierMinRadius(coOrd pos[4],dynArr_t segs) {
rr = fabs(t.u.c.radius);
} else if (t.type == SEG_BEZLIN || t.type == SEG_BEZTRK) {
rr = BezierMinRadius(t.u.b.pos, t.bezSegs);
- } else rr = 100000.00;
+ } else rr = DIST_INF;
if (rr<r) r = rr;
}
return r;
@@ -1003,12 +993,14 @@ STATUS_T CmdBezCurve( wAction_t action, coOrd pos )
{
track_p t;
static int segCnt;
+ static BOOL_T lock;
+ static coOrd movePos;
STATUS_T rc = C_CONTINUE;
long curveMode = 0;
long cmd;
if (action>>8) {
cmd = action>>8;
- } else cmd = (long)commandContext;
+ } else cmd = VP2L(commandContext);
Da.width = (double)lineWidth/mainD.dpi;
@@ -1047,7 +1039,8 @@ STATUS_T CmdBezCurve( wAction_t action, coOrd pos )
int end = Da.state==POS_1?0:1;
EPINX_T ep;
if (Da.track) {
- if ((MyGetKeyState() & (WKEY_SHIFT|WKEY_CTRL|WKEY_ALT)) == 0) { //Snap Track
+ if (lock) {
+ pos = movePos;
if ((t = OnTrack(&p, FALSE, TRUE)) != NULL) {
ep = PickUnconnectedEndPointSilent(p, t);
if (ep != -1) {
@@ -1066,16 +1059,9 @@ STATUS_T CmdBezCurve( wAction_t action, coOrd pos )
}
}
} else { //Snap Bez Line to Lines
- if ((MyGetKeyState() & (WKEY_SHIFT|WKEY_CTRL|WKEY_ALT)) == 0) {
- if ((t = OnTrack(&p,FALSE, FALSE)) != NULL) {
- if (GetClosestEndPt(t,&p)) {
- pos = p;
- found = TRUE;
- }
- }
- }
+ if (lock)
+ pos = movePos;
}
- if (!found) SnapPos( &pos );
if (Da.state == POS_1) {
Da.pos[0] = pos;
Da.pos[1] = pos;
@@ -1101,12 +1087,15 @@ STATUS_T CmdBezCurve( wAction_t action, coOrd pos )
case wActionMove:
DYNARR_RESET(trkSeg_t,anchors_da);
- if ( Da.state != POS_1 && Da.state != POS_2) return C_CONTINUE;
+ lock = FALSE;
+ if ( Da.state != POS_1 && Da.state != POS_2) return C_CONTINUE; //Don't snap CPs
if (Da.track) {
- if ((MyGetKeyState() & (WKEY_SHIFT|WKEY_CTRL|WKEY_ALT)) == 0) {
+ if (((MyGetKeyState() & WKEY_ALT) == 0) == magneticSnap) {
if ((t = OnTrack(&pos, FALSE, TRUE)) != NULL) {
EPINX_T ep = PickUnconnectedEndPointSilent(pos, t);
if (ep != -1) {
+ lock = TRUE;
+ movePos = pos;
if (GetTrkGauge(t) == GetScaleTrackGauge(GetLayoutCurScale())) {
pos = GetTrkEndPos(t, ep);
CreateEndAnchor(pos,FALSE);
@@ -1115,15 +1104,21 @@ STATUS_T CmdBezCurve( wAction_t action, coOrd pos )
}
}
} else {
- if ((MyGetKeyState() & (WKEY_SHIFT|WKEY_CTRL|WKEY_ALT)) == 0) {
+ if (((MyGetKeyState() & WKEY_ALT) == 0) == magneticSnap) {
if ((t = OnTrack(&pos,FALSE, FALSE)) != NULL) {
CreateEndAnchor(pos,TRUE);
+ lock = TRUE;
+ movePos = pos;
}
}
}
- if (anchors_da.cnt)
- return C_CONTINUE;
-
+ if (!lock && SnapPos(&pos)) {
+ CreateEndAnchor(pos,TRUE);
+ lock = TRUE;
+ movePos = pos;
+ }
+ if (anchors_da.cnt) return C_CONTINUE;
+ /* no break */
case C_MOVE:
if (Da.state == POS_1) {
InfoMessage( _("Place 1st endpoint of Bezier - snap to %s"), Da.track?"unconnected track":"line" );
@@ -1224,8 +1219,8 @@ void UpdateParms(wDrawColor color,long width) {
}
-#include "bitmaps/bezier.xpm"
-#include "bitmaps/dbezier.xpm"
+#include "bitmaps/bezier-track.xpm"
+#include "bitmaps/bezier-line.xpm"
EXPORT void InitCmdBezier( wMenu_p menu )
{