📄 plotit.c
字号:
ptype = PLOT_POINT; else { fprintf(cp_err, "Warning: strange plot type %s\n", buf); ptype = PLOT_LIN; } pfound = TRUE; } else ptype = PLOT_LIN; } if (!sameflag || !xlabel) xlabel = getword(wl, "xlabel"); else (void) getword(wl, "xlabel"); if (!sameflag || !ylabel) ylabel = getword(wl, "ylabel"); else (void) getword(wl, "ylabel"); if (!sameflag || !title) title = getword(wl, "title"); else (void) getword(wl, "title"); if (!sameflag) nointerp = getflag(wl, "nointerp"); else if (getflag(wl, "nointerp")) nointerp = TRUE; wl = wl->wl_next; if(tw) tfree(tw); if (!wl) { fprintf(cp_err, "Error: no vectors given\n"); goto quit1; } wl->wl_prev = NULL; /* Now parse the vectors. We have a list of the form * "a b vs c d e vs f g h". Since it's a bit of a hassle for * us to parse the vector boundaries here, we do this -- call * ft_getpnames() without the check flag, and then look for 0-length * vectors with the name "vs"... This is a sort of a gross hack, * since we have to check for 0-length vectors ourselves after * evaulating the pnodes... */ names = ft_getpnames(wl, FALSE); if (names == NULL) goto quit1; /* Now evaluate the names. */ for (n = names, lv = NULL; n; n = n->pn_next) { if (n->pn_value && (n->pn_value->v_length == 0) && eq(n->pn_value->v_name, "vs")) { if (!lv) { fprintf(cp_err, "Error: misplaced vs arg\n"); goto quit; } else { if (!(n = n->pn_next)) { fprintf(cp_err, "Error: missing vs arg\n"); goto quit; } dv = ft_evaluate(n); if (!dv) goto quit; if (lastvs) lv = lastvs->v_link2; else lv = vecs; while (lv) { lv->v_scale = dv; lastvs = lv; lv = lv->v_link2; } } continue; } dv = ft_evaluate(n); if (!dv) goto quit; if (!d) vecs = dv; else d->v_link2 = dv; for (d = dv; d->v_link2; d = d->v_link2) ; lv = dv; }/* free_pnode(names); pn:really should be commented out ? */ d->v_link2 = NULL; /* Now check for 0-length vectors. */ for (d = vecs; d; d = d->v_link2) if (!d->v_length) { fprintf(cp_err, "Error: %s: no such vector\n", d->v_name); goto quit; } /* If there are higher dimensional vectors, transform them into a * family of vectors. */ for (d = vecs, lv = NULL; d; d = d->v_link2) { if (d->v_numdims > 1) { if (lv) lv->v_link2 = vec_mkfamily(d); else vecs = lv = vec_mkfamily(d); while (lv->v_link2) lv = lv->v_link2; lv->v_link2 = d->v_link2; d = lv; } else { lv = d; } } /* Now fill in the scales for vectors who aren't already fixed up. */ for (d = vecs; d; d = d->v_link2) if (!d->v_scale) { if (d->v_plot->pl_scale) d->v_scale = d->v_plot->pl_scale; else d->v_scale = d; } /* The following line displays the unit at the time of temp-sweep and res-sweep. This may not be a so good solution. by H.T */ if(!strcmp(vecs->v_scale->v_name,"temp-sweep")) vecs->v_scale->v_type=14; if(!strcmp(vecs->v_scale->v_name,"res-sweep")) vecs->v_scale->v_type=15; /* See if the log flag is set anywhere... */ if (!gfound) { for (d = vecs; d; d = d->v_link2) if (d->v_scale && (d->v_scale->v_gridtype == GRID_XLOG)) gtype = GRID_XLOG; for (d = vecs; d; d = d->v_link2) if (d->v_gridtype == GRID_YLOG) { if ((gtype == GRID_XLOG) || (gtype == GRID_LOGLOG)) gtype = GRID_LOGLOG; else gtype = GRID_YLOG; } for (d = vecs; d; d = d->v_link2) if (d->v_gridtype == GRID_SMITH || d->v_gridtype == GRID_SMITHGRID || d->v_gridtype == GRID_POLAR) { gtype = d->v_gridtype; break; } } /* See if there are any default plot types... Here, like above, we * don't do entirely the best thing when there is a mixed set of * default plot types... */ if (!sameflag && !pfound) { ptype = PLOT_LIN; for (d = vecs; d; d = d->v_link2) if (d->v_plottype != PLOT_LIN) { ptype = d->v_plottype; break; } } /* Check and see if this is pole zero stuff. */ if ((vecs->v_type == SV_POLE) || (vecs->v_type == SV_ZERO)) oneval = TRUE; for (d = vecs; d; d = d->v_link2) if (((d->v_type == SV_POLE) || (d->v_type == SV_ZERO)) != oneval ? 1 : 0) { fprintf(cp_err,"Error: plot must be either all pole-zero or contain no poles or zeros\n"); goto quit; } if ((gtype == GRID_POLAR) || (gtype == GRID_SMITH || gtype == GRID_SMITHGRID)) { oneval = TRUE; } /* If we are plotting scalars, make sure there is enough * data to fit on the screen. */ for (d = vecs; d; d = d->v_link2) if (d->v_length == 1) xtend(d, d->v_scale->v_length); /* Now patch up each vector with the compression and thestrchr * selection. */ if (xcompress || xindices) { for (d = vecs; d; d = d->v_link2) { compress(d, xcompress, xindices); d->v_scale = vec_copy(d->v_scale); compress(d->v_scale, xcompress, xindices); } } /* Transform for smith plots */ if (gtype == GRID_SMITH) { double re, im, rex, imx; double r, i, x; struct dvec **prevvp, *n; int j; prevvp = &vecs; for (d = vecs; d; d = d->v_link2) { if (d->v_flags & VF_PERMANENT) { n = vec_copy(d); n->v_flags &= ~VF_PERMANENT; n->v_link2 = d->v_link2; d = n; *prevvp = d; } prevvp = &d->v_link2; if (isreal(d)) { fprintf(cp_err, "Warning: plotting real data \"%s\" on a smith grid\n", d->v_name); for (j = 0; j < d->v_length; j++) { r = d->v_realdata[j]; d->v_realdata[j] = (r - 1) / (r + 1); } } else { for (j = 0; j < d->v_length; j++) { /* (re - 1, im) / (re + 1, im) */ re = realpart(d->v_compdata + j); im = imagpart(d->v_compdata + j); rex = re + 1; imx = im; re = re - 1; /* (re, im) / (rex, imx) */ x = 1 - (imx / rex) * (imx / rex); r = re / rex + im / rex * imx / rex; i = im / rex - re / rex * imx / rex; realpart(d->v_compdata + j) = r / x; imagpart(d->v_compdata + j) = i / x; } } } } /* Figure out the proper x- and y-axis limits. */ if (ylim) { ylims[0] = ylim[0]; ylims[1] = ylim[1]; } else if (oneval) { ylims[0] = HUGE; ylims[1] = - ylims[0]; for (d = vecs; d; d = d->v_link2) { dd = ft_minmax(d, TRUE); if (dd[0] < ylims[0]) ylims[0] = dd[0]; if (dd[1] > ylims[1]) ylims[1] = dd[1]; } } else { ylims[0] = HUGE; ylims[1] = - ylims[0]; for (d = vecs; d; d = d->v_link2) { dd = ft_minmax(d, TRUE); if (dd[0] < ylims[0]) ylims[0] = dd[0]; if (dd[1] > ylims[1]) ylims[1] = dd[1]; } /* XXX */ for (d = vecs; d; d = d->v_link2) { if (d->v_flags & VF_MINGIVEN) if (ylims[0] < d->v_minsignal) ylims[0] = d->v_minsignal; if (d->v_flags & VF_MAXGIVEN) if (ylims[1] > d->v_maxsignal) ylims[1] = d->v_maxsignal; } } if (xlim) { xlims[0] = xlim[0]; xlims[1] = xlim[1]; } else if (oneval) { xlims[0] = HUGE; xlims[1] = - xlims[0]; for (d = vecs; d; d = d->v_link2) { dd = ft_minmax(d, FALSE); if (dd[0] < xlims[0]) xlims[0] = dd[0]; if (dd[1] > xlims[1]) xlims[1] = dd[1]; } } else { xlims[0] = HUGE; xlims[1] = - xlims[0]; for (d = vecs; d; d = d->v_link2) { dd = ft_minmax(d->v_scale, TRUE); if (dd[0] < xlims[0]) xlims[0] = dd[0]; if (dd[1] > xlims[1]) xlims[1] = dd[1]; } for (d = vecs; d; d = d->v_link2) { if (d->v_scale->v_flags & VF_MINGIVEN) if (xlims[0] < d->v_scale->v_minsignal) xlims[0] = d->v_scale->v_minsignal; if (d->v_scale->v_flags & VF_MAXGIVEN) if (xlims[1] > d->v_scale->v_maxsignal) xlims[1] = d->v_scale->v_maxsignal; } } /* Do some coercion of the limits to make them reasonable. */ if ((xlims[0] == 0) && (xlims[1] == 0)) { xlims[0] = -1.0; xlims[1] = 1.0; } if ((ylims[0] == 0) && (ylims[1] == 0)) { ylims[0] = -1.0; ylims[1] = 1.0; } if (xlims[0] > xlims[1]) { tt = xlims[1]; xlims[1] = xlims[0]; xlims[0] = tt; } if (ylims[0] > ylims[1]) { tt = ylims[1]; ylims[1] = ylims[0]; ylims[0] = tt; } if (xlims[0] == xlims[1]) { xlims[0] *= (xlims[0] > 0) ? 0.9 : 1.1; xlims[1] *= (xlims[1] > 0) ? 1.1 : 0.9; } if (ylims[0] == ylims[1]) { /* || fabs(ylims[0])/(ylims[1]-ylims[0]) > 1.0e9 || fabs(ylims[1])/(ylims[1]-ylims[0]) > 1.0e9) */ ylims[0] *= (ylims[0] > 0) ? 0.9 : 1.1; ylims[1] *= (ylims[1] > 0) ? 1.1 : 0.9; } if ((xlims[0] <= 0.0) && ((gtype == GRID_XLOG) || (gtype == GRID_LOGLOG))) { fprintf(cp_err, "Error: X values must be > 0 for log scale\n"); goto quit; } if ((ylims[0] <= 0.0) && ((gtype == GRID_YLOG) || (gtype == GRID_LOGLOG))) { fprintf(cp_err, "Error: Y values must be > 0 for log scale\n"); goto quit; } /* Fix the plot limits for smith and polar grids. */ if ((!xlim || !ylim) && (gtype == GRID_POLAR)) { /* (0,0) must be in the center of the screen. */ mx = (fabs(xlims[0]) > fabs(xlims[1])) ? fabs(xlims[0]) : fabs(xlims[1]); my = (fabs(ylims[0]) > fabs(ylims[1])) ? fabs(ylims[0]) : fabs(ylims[1]); rad = (mx > my) ? mx : my; /* rad = sqrt(mx * mx + my * my); */ xlims[0] = - rad; xlims[1] = rad; ylims[0] = - rad; ylims[1] = rad; } else if ((!xlim || !ylim) && (gtype == GRID_SMITH || gtype == GRID_SMITHGRID)) { xlims[0] = -1.0; xlims[1] = 1.0; ylims[0] = -1.0; ylims[1] = 1.0; } /* We don't want to try to deal with smith plots for asciiplot. */ if (devname && eq(devname, "lpr")) { /* check if we should (can) linearize */ if (!(!ft_curckt || !ft_curckt->ci_ckt || strcmp(ft_curckt->ci_name, plot_cur->pl_title) || !if_tranparams(ft_curckt, &tstart, &tstop, &tstep) || ((tstop - tstart) * tstep <= 0.0) || ((tstop - tstart) < tstep) || !plot_cur || !plot_cur->pl_dvecs || !plot_cur->pl_scale || !isreal(plot_cur->pl_scale) || !ciprefix("tran", plot_cur->pl_typename))) { newlen = (tstop - tstart) / tstep + 1.5; newscale = (double *) tmalloc(newlen * sizeof(double)); newv_scale = alloc(struct dvec); newv_scale->v_flags = vecs->v_scale->v_flags; newv_scale->v_type = vecs->v_scale->v_type; newv_scale->v_gridtype = vecs->v_scale->v_gridtype; newv_scale->v_length = newlen; newv_scale->v_name = copy(vecs->v_scale->v_name); newv_scale->v_realdata = newscale; for (i = 0, ttime = tstart; i < newlen; i++, ttime += tstep) newscale[i] = ttime; for (v = vecs; v; v= v->v_link2) { newdata = (double *) tmalloc(newlen * sizeof (double)); if (!ft_interpolate(v->v_realdata, newdata, v->v_scale->v_realdata, v->v_scale->v_length, newscale, newlen, 1)) { fprintf(cp_err, "Error: can't interpolate %s\n", v->v_name); goto quit; } tfree(v->v_realdata); v->v_realdata = newdata; /* Why go to all this trouble if agraf ignores it? */ nointerp = TRUE; } vecs->v_scale = newv_scale; } ft_agraf(xlims, ylims, vecs->v_scale, vecs->v_plot, vecs, xdelta ? *xdelta : 0.0, ydelta ? *ydelta : 0.0, ((gtype == GRID_XLOG) || (gtype == GRID_LOGLOG)), ((gtype == GRID_YLOG) || (gtype == GRID_LOGLOG)), nointerp); rtn = TRUE; goto quit; } /* See if there is one type we can give for the y scale... */ for (j = vecs->v_type, d = vecs->v_link2; d; d = d->v_link2) if (d->v_type != j) { j = SV_NOTYPE; break; } if (devname && eq(devname, "xgraph")) { /* Interface to XGraph-11 Plot Program */ ft_xgraph(xlims, ylims, hcopy, title ? title : vecs->v_plot->pl_title, xlabel ? xlabel : ft_typabbrev(vecs->v_scale->v_type), ylabel ? ylabel : ft_typabbrev(j), gtype, ptype, vecs); rtn = TRUE; goto quit; } for (d = vecs, i = 0; d; d = d->v_link2) i++; /* Figure out the X name and the X type. This is sort of bad... */ xn = vecs->v_scale->v_name; xt = vecs->v_scale->v_type; pname = plot_cur->pl_typename; if (!gr_init(xlims, ylims, (oneval ? (char *) NULL : xn), title ? title : vecs->v_plot->pl_title, hcopy, i, xdelta ? *xdelta : 0.0, ydelta ? *ydelta : 0.0, gtype, ptype, xlabel, ylabel, xt, j, pname, cline)) goto quit; /* Now plot all the graphs. */ for (d = vecs; d; d = d->v_link2) ft_graf(d, oneval ? (struct dvec *) NULL : d->v_scale, FALSE); gr_clean(); rtn = TRUE;quit: free_pnode(names);quit1: return rtn;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -