Fix Bug #577 "Zooming iplot drops vectors" and three crashes when
the iplot window is closed during simulation.
This commit is contained in:
parent
cd451bd5b3
commit
519915202f
|
|
@ -859,11 +859,9 @@ static int iplot(struct plot *pl, int id)
|
||||||
double start, stop, step;
|
double start, stop, step;
|
||||||
bool changed = FALSE;
|
bool changed = FALSE;
|
||||||
int yt;
|
int yt;
|
||||||
char *yl = NULL;
|
|
||||||
double xlims[2], ylims[2];
|
double xlims[2], ylims[2];
|
||||||
static REQUEST reqst = { checkup_option, NULL };
|
static REQUEST reqst = { checkup_option, NULL };
|
||||||
int inited = 0;
|
int inited = 0;
|
||||||
char commandline[513];
|
|
||||||
int n_vec_plot = 0;
|
int n_vec_plot = 0;
|
||||||
|
|
||||||
/* Exit if nothing is being plotted */
|
/* Exit if nothing is being plotted */
|
||||||
|
|
@ -878,6 +876,11 @@ static int iplot(struct plot *pl, int id)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len == IPOINTMIN || !id) { /* Do initialization */
|
if (len == IPOINTMIN || !id) { /* Do initialization */
|
||||||
|
unsigned int index, len;
|
||||||
|
char commandline[4196];
|
||||||
|
|
||||||
|
strcpy(commandline, "plot ");
|
||||||
|
index = 5;
|
||||||
resumption = FALSE;
|
resumption = FALSE;
|
||||||
/* Draw the grid for the first time, and plot everything. */
|
/* Draw the grid for the first time, and plot everything. */
|
||||||
lims = ft_minmax(xs, TRUE);
|
lims = ft_minmax(xs, TRUE);
|
||||||
|
|
@ -894,9 +897,13 @@ static int iplot(struct plot *pl, int id)
|
||||||
if (ylims[1] < lims[1]) {
|
if (ylims[1] < lims[1]) {
|
||||||
ylims[1] = lims[1];
|
ylims[1] = lims[1];
|
||||||
}
|
}
|
||||||
if (!yl) {
|
len = (unsigned int)snprintf(commandline + index,
|
||||||
yl = v->v_name;
|
(sizeof commandline) - index,
|
||||||
}
|
"%s ", v->v_name);
|
||||||
|
if (commandline[index + len - 1] == ' ') // Not truncated
|
||||||
|
index += len;
|
||||||
|
else
|
||||||
|
commandline[index] = '\0'; // Crop partial name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -920,14 +927,9 @@ static int iplot(struct plot *pl, int id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* note: have command options for iplot to specify xdelta,
|
|
||||||
etc. So don't need static variables hack. Assume default
|
|
||||||
values for now. */
|
|
||||||
sprintf(commandline, "plot %s", yl);
|
|
||||||
|
|
||||||
(void) gr_init(xlims, ylims, xs->v_name,
|
(void) gr_init(xlims, ylims, xs->v_name,
|
||||||
pl->pl_title, NULL, n_vec_plot, 0.0, 0.0,
|
pl->pl_title, NULL, n_vec_plot, 0.0, 0.0,
|
||||||
GRID_LIN, PLOT_LIN, xs->v_name, yl, xs->v_type, yt,
|
GRID_LIN, PLOT_LIN, xs->v_name, "V", xs->v_type, yt,
|
||||||
plot_cur->pl_typename, commandline, 0);
|
plot_cur->pl_typename, commandline, 0);
|
||||||
|
|
||||||
for (v = pl->pl_dvecs; v; v = v->v_next) {
|
for (v = pl->pl_dvecs; v; v = v->v_next) {
|
||||||
|
|
@ -942,6 +944,12 @@ static int iplot(struct plot *pl, int id)
|
||||||
else {
|
else {
|
||||||
/* plot the last points and resize if needed */
|
/* plot the last points and resize if needed */
|
||||||
Input(&reqst, NULL);
|
Input(&reqst, NULL);
|
||||||
|
|
||||||
|
/* Window was closed? */
|
||||||
|
|
||||||
|
if (!currentgraph)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* First see if we have to make the screen bigger */
|
/* First see if we have to make the screen bigger */
|
||||||
dy = (isreal(xs) ? xs->v_realdata[len - 1] :
|
dy = (isreal(xs) ? xs->v_realdata[len - 1] :
|
||||||
realpart(xs->v_compdata[len - 1]));
|
realpart(xs->v_compdata[len - 1]));
|
||||||
|
|
@ -1098,6 +1106,8 @@ static void set(struct plot *plot, struct dbcomm *db, bool unset, short mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (dc = db; dc; dc = dc->db_also) {
|
for (dc = db; dc; dc = dc->db_also) {
|
||||||
|
if (dc->db_nodename1 == NULL)
|
||||||
|
continue;
|
||||||
v = vec_fromplot(dc->db_nodename1, plot);
|
v = vec_fromplot(dc->db_nodename1, plot);
|
||||||
if (!v || v->v_plot != plot) {
|
if (!v || v->v_plot != plot) {
|
||||||
if (!eq(dc->db_nodename1, "0") && !unset) {
|
if (!eq(dc->db_nodename1, "0") && !unset) {
|
||||||
|
|
@ -1154,9 +1164,14 @@ void gr_iplot(struct plot *plot)
|
||||||
hit = 0;
|
hit = 0;
|
||||||
for (db = dbs; db; db = db->db_next) {
|
for (db = dbs; db; db = db->db_next) {
|
||||||
if (db->db_type == DB_IPLOT || db->db_type == DB_IPLOTALL) {
|
if (db->db_type == DB_IPLOT || db->db_type == DB_IPLOTALL) {
|
||||||
|
if (db->db_graphid) {
|
||||||
|
GRAPH *gr;
|
||||||
|
|
||||||
if (db->db_graphid)
|
gr = FindGraph(db->db_graphid);
|
||||||
PushGraphContext(FindGraph(db->db_graphid));
|
if (!gr)
|
||||||
|
continue;
|
||||||
|
PushGraphContext(gr);
|
||||||
|
}
|
||||||
|
|
||||||
set(plot, db, FALSE, VF_PLOT);
|
set(plot, db, FALSE, VF_PLOT);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue