summaryrefslogtreecommitdiff
path: root/app/bin/cparalle.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/cparalle.c')
-rw-r--r--app/bin/cparalle.c375
1 files changed, 190 insertions, 185 deletions
diff --git a/app/bin/cparalle.c b/app/bin/cparalle.c
index 27276b1..533b9d5 100644
--- a/app/bin/cparalle.c
+++ b/app/bin/cparalle.c
@@ -17,26 +17,23 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <math.h>
-
#include "ccurve.h"
#include "cstraigh.h"
+#include "cselect.h"
#include "cundo.h"
-#include "i18n.h"
-#include "messages.h"
#include "param.h"
#include "track.h"
-#include "utility.h"
#include "layout.h"
+#include "common-ui.h"
static struct {
- track_p Trk;
- coOrd orig;
- track_p anchor_Trk;
- } Dpa;
+ track_p Trk;
+ coOrd orig;
+ track_p anchor_Trk;
+} Dpa;
static DIST_T parSeparation = 1.0;
static double parSepFactor = 0.0;
@@ -54,154 +51,159 @@ static paramData_t parSepPLs[] = {
#define parFactorI 1
{ PD_FLOAT, &parSepFactor, "factor", 0, &r_0_10, N_("Radius Factor") }
};
-static paramGroup_t parSepPG = { "parallel", 0, parSepPLs, sizeof parSepPLs/sizeof parSepPLs[0] };
+static paramGroup_t parSepPG = { "parallel", 0, parSepPLs, COUNT( parSepPLs ) };
static STATUS_T CmdParallel(wAction_t action, coOrd pos)
{
- DIST_T d;
- track_p t=NULL;
- coOrd p;
- static coOrd p0, p1;
- ANGLE_T a;
- track_p t0, t1;
- EPINX_T ep0=-1, ep1=-1;
- wControl_p controls[4];
- char * labels[3];
- static DIST_T parRFactor;
+ DIST_T d;
+ track_p t=NULL;
+ coOrd p;
+ static coOrd p0, p1;
+ ANGLE_T a;
+ track_p t0, t1;
+ EPINX_T ep0=-1, ep1=-1;
+ wControl_p controls[4];
+ char * labels[3];
+ static DIST_T parRFactor;
- parType = (long)commandContext;
+ parType = VP2L(commandContext);
- switch (action&0xFF) {
+ switch (action&0xFF) {
- case C_START:
- if (parSepPLs[0].control==NULL) {
- ParamCreateControls(&parSepPG, NULL);
- }
- if (parType == PAR_TRACK) {
- sprintf(message, "parallel-separation-%s", curScaleName);
- parSeparation = ceil(13.0*12.0/curScaleRatio);
- } else {
- sprintf(message, "parallel-line-separation-%s", curScaleName);
- parSeparation = 5.0*12.0/curScaleRatio;
- }
- wPrefGetFloat("misc", message, &parSeparation, parSeparation);
- ParamLoadControls(&parSepPG);
- ParamGroupRecord(&parSepPG);
- parSepPD.option |= PDO_NORECORD;
+ case C_START:
+ if (parSepPLs[0].control==NULL) {
+ ParamCreateControls(&parSepPG, NULL);
+ }
+ if (parType == PAR_TRACK) {
+ sprintf(message, "parallel-separation-%s", curScaleName);
+ parSeparation = ceil(13.0*12.0/curScaleRatio);
+ } else {
+ sprintf(message, "parallel-line-separation-%s", curScaleName);
+ parSeparation = 5.0*12.0/curScaleRatio;
+ }
+ wPrefGetFloat("misc", message, &parSeparation, parSeparation);
+ ParamLoadControls(&parSepPG);
+ ParamGroupRecord(&parSepPG);
+ parSepPD.option |= PDO_NORECORD;
parFactorPD.option |= PDO_NORECORD;
- controls[0] = parSepPD.control;
- if (parType == PAR_TRACK)
- controls[1] = parFactorPD.control;
- else
- controls[1] = NULL;
- controls[2] = NULL;
- labels[0] = N_("Separation");
- labels[1] = N_("Radius Factor");
- InfoSubstituteControls(controls, labels);
- parSepPD.option &= ~PDO_NORECORD;
- parFactorPD.option &= ~PDO_NORECORD;
- Dpa.anchor_Trk = NULL;
- tempSegs_da.cnt = 0;
- return C_CONTINUE;
+ controls[0] = parSepPD.control;
+ if (parType == PAR_TRACK) {
+ controls[1] = parFactorPD.control;
+ } else {
+ controls[1] = NULL;
+ }
+ controls[2] = NULL;
+ labels[0] = N_("Separation");
+ labels[1] = N_("Radius Factor");
+ InfoSubstituteControls(controls, labels);
+ parSepPD.option &= ~PDO_NORECORD;
+ parFactorPD.option &= ~PDO_NORECORD;
+ Dpa.anchor_Trk = NULL;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ SetAllTrackSelect( FALSE );
+ return C_CONTINUE;
- case wActionMove:
- tempSegs_da.cnt = 0;
- Dpa.anchor_Trk = NULL;
- if (parType == PAR_TRACK)
- Dpa.anchor_Trk = OnTrack(&pos, FALSE, TRUE);
- else
- Dpa.anchor_Trk = OnTrack(&pos, FALSE, FALSE);
+ case wActionMove:
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ Dpa.anchor_Trk = NULL;
+ if (parType == PAR_TRACK) {
+ Dpa.anchor_Trk = OnTrack(&pos, FALSE, TRUE);
+ } else {
+ Dpa.anchor_Trk = OnTrack(&pos, FALSE, FALSE);
+ }
- if (!Dpa.anchor_Trk) {
- return C_CONTINUE;
- }
- if (Dpa.anchor_Trk && !CheckTrackLayerSilent(Dpa.anchor_Trk)) {
- Dpa.anchor_Trk = NULL;
- return C_CONTINUE;
- }
- if (!QueryTrack(Dpa.anchor_Trk, Q_CAN_PARALLEL)) {
- Dpa.anchor_Trk = NULL;
- return C_CONTINUE;
- }
- break;
- case C_DOWN:
- Dpa.anchor_Trk = NULL;
- tempSegs_da.cnt = 0;
- if (parSeparation < 0.0) {
- ErrorMessage(MSG_PARALLEL_SEP_GTR_0);
- return C_ERROR;
- }
+ if (!Dpa.anchor_Trk) {
+ return C_CONTINUE;
+ }
+ if (Dpa.anchor_Trk && !CheckTrackLayerSilent(Dpa.anchor_Trk)) {
+ Dpa.anchor_Trk = NULL;
+ return C_CONTINUE;
+ }
+ if (!QueryTrack(Dpa.anchor_Trk, Q_CAN_PARALLEL)) {
+ Dpa.anchor_Trk = NULL;
+ return C_CONTINUE;
+ }
+ break;
+ case C_DOWN:
+ Dpa.anchor_Trk = NULL;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ if (parSeparation < 0.0) {
+ ErrorMessage(MSG_PARALLEL_SEP_GTR_0);
+ return C_ERROR;
+ }
- controls[0] = parSepPD.control;
- controls[1] = parFactorPD.control;
- controls[2] = NULL;
- labels[0] = N_("Separation");
- labels[1] = N_("Radius factor");
- InfoSubstituteControls(controls, labels);
- ParamLoadData(&parSepPG);
- Dpa.orig = pos;
- if (parType == PAR_TRACK)
+ controls[0] = parSepPD.control;
+ controls[1] = parFactorPD.control;
+ controls[2] = NULL;
+ labels[0] = N_("Separation");
+ labels[1] = N_("Radius factor");
+ InfoSubstituteControls(controls, labels);
+ ParamLoadData(&parSepPG);
+ Dpa.orig = pos;
+ if (parType == PAR_TRACK) {
Dpa.Trk = OnTrack(&pos, FALSE, TRUE);
- else
- Dpa.Trk = OnTrack(&pos, FALSE, FALSE); //Also lines for line
- if (!Dpa.Trk) {
- return C_CONTINUE;
- }
- if (!QueryTrack(Dpa.Trk, Q_CAN_PARALLEL)) {
- Dpa.Trk = NULL;
- InfoMessage(_(" Track/Line doesn't support parallel"));
- wBeep();
- return C_CONTINUE;
- }
+ } else {
+ Dpa.Trk = OnTrack(&pos, FALSE, FALSE); //Also lines for line
+ }
+ if (!Dpa.Trk) {
+ return C_CONTINUE;
+ }
+ if (!QueryTrack(Dpa.Trk, Q_CAN_PARALLEL)) {
+ Dpa.Trk = NULL;
+ InfoMessage(_(" Track/Line doesn't support parallel"));
+ wBeep();
+ return C_CONTINUE;
+ }
- parRFactor = (2864.0*(double)parSepFactor)/curScaleRatio;
+ parRFactor = (2864.0*(double)parSepFactor)/curScaleRatio;
- if ((parType == PAR_TRACK) && (parSeparation == 0.0)) {
- DIST_T orig_gauge = GetTrkGauge(Dpa.Trk);
- DIST_T new_gauge = GetScaleTrackGauge(GetLayoutCurScale());
- if (orig_gauge == new_gauge) {
- ErrorMessage(MSG_PARALLEL_SEP_GTR_0);
- return C_ERROR;
- }
- parSeparation = fabs(orig_gauge/2-new_gauge/2);
- parRFactor = 0.0;
- } else if (parType != PAR_TRACK)
- parRFactor = 0.0;
- /* in case query has changed things (eg joint) */
- /*
- * this seems to cause problems so I commented it out
- * until further investigation shows the necessity
- */
- //Dpa.Trk = OnTrack( &Dpa.orig, TRUE, TRUE );
- tempSegs_da.cnt = 0;
- /* no break */
+ if ((parType == PAR_TRACK) && (parSeparation == 0.0)) {
+ DIST_T orig_gauge = GetTrkGauge(Dpa.Trk);
+ DIST_T new_gauge = GetScaleTrackGauge(GetLayoutCurScale());
+ if (orig_gauge == new_gauge) {
+ ErrorMessage(MSG_PARALLEL_SEP_GTR_0);
+ return C_ERROR;
+ }
+ parSeparation = fabs(orig_gauge/2-new_gauge/2);
+ parRFactor = 0.0;
+ } else if (parType != PAR_TRACK) {
+ parRFactor = 0.0;
+ }
+ /* in case query has changed things (eg joint) */
+ /*
+ * this seems to cause problems so I commented it out
+ * until further investigation shows the necessity
+ */
+ //Dpa.Trk = OnTrack( &Dpa.orig, TRUE, TRUE );
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ /* no break */
- case C_MOVE:
- if (Dpa.Trk == NULL) {
- return C_CONTINUE;
- }
- tempSegs_da.cnt = 0;
- if (!MakeParallelTrack(Dpa.Trk, pos, parSeparation, parRFactor, NULL, &p0, &p1,
- parType == PAR_TRACK)) {
- Dpa.Trk = NULL;
- return C_CONTINUE;
- }
- return C_CONTINUE;
+ case C_MOVE:
+ if (Dpa.Trk == NULL) {
+ return C_CONTINUE;
+ }
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ if (!MakeParallelTrack(Dpa.Trk, pos, parSeparation, parRFactor, NULL, &p0, &p1,
+ parType == PAR_TRACK)) {
+ Dpa.Trk = NULL;
+ return C_CONTINUE;
+ }
+ return C_CONTINUE;
- case C_UP:
- Dpa.anchor_Trk = NULL;
- if (Dpa.Trk == NULL) {
- return C_CONTINUE;
- }
- t0=t1=NULL;
- if (parType == PAR_TRACK) {
+ case C_UP:
+ Dpa.anchor_Trk = NULL;
+ if (Dpa.Trk == NULL) {
+ return C_CONTINUE;
+ }
+ t0=t1=NULL;
+ if (parType == PAR_TRACK) {
p = p0;
- tempSegs_da.cnt = 0;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
if ((t0=OnTrack(&p, FALSE, TRUE)) != NULL) {
ep0 = PickEndPoint(p, t0);
- if (GetTrkEndTrk(t0,ep0) != NULL) {
+ if (ep0 < 0 || GetTrkEndTrk(t0,ep0) != NULL) {
t0 = NULL;
} else {
p = GetTrkEndPos(t0, ep0);
@@ -214,7 +216,7 @@ static STATUS_T CmdParallel(wAction_t action, coOrd pos)
p = p1;
if ((t1=OnTrack(&p, FALSE, TRUE)) != NULL) {
ep1 = PickEndPoint(p, t1);
- if (GetTrkEndTrk(t1,ep1) != NULL) {
+ if (ep1 < 0 || GetTrkEndTrk(t1,ep1) != NULL) {
t1 = NULL;
} else {
p = GetTrkEndPos(t1, ep1);
@@ -224,23 +226,23 @@ static STATUS_T CmdParallel(wAction_t action, coOrd pos)
}
}
}
- }
- UndoStart(_("Create Parallel Track"), "newParallel");
- if (!MakeParallelTrack(Dpa.Trk, pos, parSeparation, parRFactor, &t, NULL, NULL,
- parType == PAR_TRACK)) {
- tempSegs_da.cnt = 0;
- return C_TERMINATE;
- }
- if (parType == PAR_TRACK) {
- if (GetTrkGauge(Dpa.Trk)> parSeparation) {
- SetTrkNoTies(t, TRUE);
- }
- //CopyAttributes( Dpa.Trk, t ); Don't force scale or track width or Layer
- SetTrkBits(t,(GetTrkBits(t)&TB_HIDEDESC) | (GetTrkBits(Dpa.Trk)&~TB_HIDEDESC));
+ }
+ UndoStart(_("Create Parallel Track"), "newParallel");
+ if (!MakeParallelTrack(Dpa.Trk, pos, parSeparation, parRFactor, &t, NULL, NULL,
+ parType == PAR_TRACK)) {
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ return C_TERMINATE;
+ }
+ if (parType == PAR_TRACK) {
+ if (GetTrkGauge(Dpa.Trk)> parSeparation) {
+ SetTrkNoTies(t, TRUE);
+ }
+ //CopyAttributes( Dpa.Trk, t ); Don't force scale or track width or Layer
+ SetTrkBits(t,(GetTrkBits(t)&TB_HIDEDESC) | (GetTrkBits(Dpa.Trk)&~TB_HIDEDESC));
if (t0) {
a = NormalizeAngle(GetTrkEndAngle(t0, ep0) - GetTrkEndAngle(t,
- 0) + (180.0+connectAngle/2.0));
+ 0) + (180.0+connectAngle/2.0));
if (a < connectAngle) {
DrawEndPt(&mainD, t0, ep0, wDrawColorWhite);
ConnectTracks(t0, ep0, t, 0);
@@ -249,55 +251,58 @@ static STATUS_T CmdParallel(wAction_t action, coOrd pos)
}
if (t1) {
a = NormalizeAngle(GetTrkEndAngle(t1, ep1) - GetTrkEndAngle(t,
- 1) + (180.0+connectAngle/2.0));
+ 1) + (180.0+connectAngle/2.0));
if (a < connectAngle) {
DrawEndPt(&mainD, t1, ep1, wDrawColorWhite);
ConnectTracks(t1, ep1, t, 1);
DrawEndPt(&mainD, t1, ep1, wDrawColorBlack);
}
}
- }
- DrawNewTrack(t);
- UndoEnd();
- InfoSubstituteControls(NULL, NULL);
- if (parType == PAR_TRACK)
- sprintf(message, "parallel-separation-%s", curScaleName);
- else
- sprintf(message, "parallel-line-separation-%s", curScaleName);
- wPrefSetFloat("misc", message, parSeparation);
- tempSegs_da.cnt = 0;
- return C_TERMINATE;
+ }
+ DrawNewTrack(t);
+ UndoEnd();
+ InfoSubstituteControls(NULL, NULL);
+ if (parType == PAR_TRACK) {
+ sprintf(message, "parallel-separation-%s", curScaleName);
+ } else {
+ sprintf(message, "parallel-line-separation-%s", curScaleName);
+ }
+ wPrefSetFloat("misc", message, parSeparation);
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ return C_TERMINATE;
- case C_REDRAW:
- if (Dpa.anchor_Trk) {
+ case C_REDRAW:
+ if (Dpa.anchor_Trk) {
DrawTrack(Dpa.anchor_Trk,&tempD,
- wDrawColorPreviewSelected); //Special color means THICK3 as well
- }
- if (tempSegs_da.cnt>0) {
- DrawSegs( &tempD, zero, 0.0, &tempSegs(0), tempSegs_da.cnt, trackGauge,
- wDrawColorBlack );
- }
- return C_CONTINUE;
+ wDrawColorPreviewSelected); //Special color means THICK3 as well
+ }
+ DrawSegsDA( &tempD, NULL, zero, 0.0, &tempSegs_da, trackGauge, wDrawColorBlack,
+ 0 );
+ return C_CONTINUE;
- case C_CANCEL:
- Dpa.anchor_Trk = NULL;
- tempSegs_da.cnt = 0;
- InfoSubstituteControls(NULL, NULL);
- return C_TERMINATE;
+ case C_CANCEL:
+ Dpa.anchor_Trk = NULL;
+ DYNARR_RESET( trkSeg_t, tempSegs_da );
+ InfoSubstituteControls(NULL, NULL);
+ return C_TERMINATE;
- }
- return C_CONTINUE;
+ }
+ return C_CONTINUE;
}
-#include "bitmaps/parallel.xpm"
-#include "bitmaps/parallel-line.xpm"
+#include "bitmaps/parallel.xpm3"
+#include "bitmaps/parallel-line.xpm3"
EXPORT void InitCmdParallel( wMenu_p menu )
{
ButtonGroupBegin( _("Parallel"), "cmdParallelSetCmd", _("Parallel") );
- AddMenuButton( menu, CmdParallel, "cmdParallelTrack", _("Parallel Track"), wIconCreatePixMap(parallel_xpm), LEVEL0_50, IC_STICKY|IC_POPUP|IC_WANT_MOVE, ACCL_PARALLEL, (void*)0 );
- AddMenuButton( menu, CmdParallel, "cmdParallelLine", _("Parallel Line"), wIconCreatePixMap(parallel_line_xpm), LEVEL0_50, IC_STICKY|IC_POPUP|IC_WANT_MOVE, ACCL_PARALLEL, (void*)1 );
+ AddMenuButton( menu, CmdParallel, "cmdParallelTrack", _("Parallel Track"),
+ wIconCreatePixMap(parallel_xpm3[iconSize]), LEVEL0_50,
+ IC_STICKY|IC_POPUP|IC_WANT_MOVE, ACCL_PARALLEL, I2VP(0) );
+ AddMenuButton( menu, CmdParallel, "cmdParallelLine", _("Parallel Line"),
+ wIconCreatePixMap(parallel_line_xpm3[iconSize]), LEVEL0_50,
+ IC_STICKY|IC_POPUP|IC_WANT_MOVE, ACCL_PARALLEL, I2VP(1) );
ButtonGroupEnd();
ParamRegister( &parSepPG );
}