9 changed files with 300 additions and 0 deletions
-
6ChangeLog
-
2src/frontend/Makefile.am
-
41src/frontend/com_gnuplot.c
-
6src/frontend/com_gnuplot.h
-
9src/frontend/commands.c
-
2src/frontend/plotting/Makefile.am
-
203src/frontend/plotting/gnuplot.c
-
16src/frontend/plotting/gnuplot.h
-
15src/frontend/plotting/plotit.c
@ -0,0 +1,41 @@ |
|||||
|
#include <stddef.h> |
||||
|
|
||||
|
#include <ngspice.h> |
||||
|
#include <bool.h> |
||||
|
#include <wordlist.h> |
||||
|
|
||||
|
#include "plotting/plotit.h" |
||||
|
|
||||
|
#include "com_gnuplot.h" |
||||
|
|
||||
|
|
||||
|
/* gnuplot file plotargs */ |
||||
|
void |
||||
|
com_gnuplot(wordlist *wl) |
||||
|
{ |
||||
|
char *fname; |
||||
|
bool tempf = FALSE; |
||||
|
|
||||
|
if (wl) { |
||||
|
fname = wl->wl_word; |
||||
|
wl = wl->wl_next; |
||||
|
} |
||||
|
if (!wl) { |
||||
|
return; |
||||
|
} |
||||
|
if (cieq(fname, "temp") || cieq(fname, "tmp")) { |
||||
|
fname = smktemp("gp"); /* Is this the correct name ? */ |
||||
|
tempf = TRUE; |
||||
|
} |
||||
|
|
||||
|
(void) plotit(wl, fname, "gnuplot"); |
||||
|
|
||||
|
#if 0 |
||||
|
/* Leave temp file sitting around so gnuplot can grab it from |
||||
|
background. */ |
||||
|
if (tempf) |
||||
|
(void) unlink(fname); |
||||
|
#endif |
||||
|
|
||||
|
return; |
||||
|
} |
||||
@ -0,0 +1,6 @@ |
|||||
|
#ifndef _COM_GNUPLOT_H |
||||
|
#define _COM_GNUPLOT_H |
||||
|
|
||||
|
void com_gnuplot(wordlist *wl); |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,203 @@ |
|||||
|
/********** |
||||
|
* From xgraph.c: |
||||
|
* Copyright 1992 Regents of the University of California. All rights reserved. |
||||
|
* Author: 1992 David A. Gates, U. C. Berkeley CAD Group |
||||
|
* |
||||
|
* Author: 2008 Stefano Pedretti |
||||
|
**********/ |
||||
|
|
||||
|
/* |
||||
|
* gnuplot plots. |
||||
|
*/ |
||||
|
|
||||
|
#include "ngspice.h" |
||||
|
#include "cpdefs.h" |
||||
|
#include "ftedefs.h" |
||||
|
#include "dvec.h" |
||||
|
#include "fteparse.h" |
||||
|
#include "gnuplot.h" |
||||
|
|
||||
|
#include <variable.h> |
||||
|
|
||||
|
#define GP_MAXVECTORS 64 |
||||
|
|
||||
|
void |
||||
|
ft_gnuplot(double *xlims, double *ylims, char *filename, char *title, char *xlabel, char *ylabel, GRIDTYPE gridtype, PLOTTYPE plottype, struct dvec *vecs) |
||||
|
{ |
||||
|
|
||||
|
FILE *file, *file_data; |
||||
|
struct dvec *v, *scale; |
||||
|
double xval, yval; |
||||
|
int i, numVecs, linewidth; |
||||
|
bool xlog, ylog, nogrid, markers; |
||||
|
char buf[BSIZE_SP], pointstyle[BSIZE_SP], *text; |
||||
|
|
||||
|
char filename_data[15]; |
||||
|
sprintf(filename_data, "%s.data", filename); |
||||
|
|
||||
|
|
||||
|
/* Sanity checking. */ |
||||
|
for ( v = vecs, numVecs = 0; v; v = v->v_link2 ) { |
||||
|
numVecs++; |
||||
|
} |
||||
|
if (numVecs == 0) { |
||||
|
return; |
||||
|
} else if (numVecs > GP_MAXVECTORS) { |
||||
|
fprintf( cp_err, "Error: too many vectors for gnuplot.\n" ); |
||||
|
return; |
||||
|
} |
||||
|
if (!cp_getvar("xbrushwidth", VT_NUM, &linewidth)) |
||||
|
linewidth = 1; |
||||
|
if (linewidth < 1) linewidth = 1; |
||||
|
|
||||
|
if (!cp_getvar("pointstyle", VT_STRING, pointstyle)) { |
||||
|
markers = FALSE; |
||||
|
} else { |
||||
|
if (cieq(pointstyle,"markers")) { |
||||
|
markers = TRUE; |
||||
|
} else { |
||||
|
markers = FALSE; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* Make sure the gridtype is supported. */ |
||||
|
switch (gridtype) { |
||||
|
case GRID_LIN: |
||||
|
nogrid = xlog = ylog = FALSE; |
||||
|
break; |
||||
|
case GRID_XLOG: |
||||
|
xlog = TRUE; |
||||
|
nogrid = ylog = FALSE; |
||||
|
break; |
||||
|
case GRID_YLOG: |
||||
|
ylog = TRUE; |
||||
|
nogrid = xlog = FALSE; |
||||
|
break; |
||||
|
case GRID_LOGLOG: |
||||
|
xlog = ylog = TRUE; |
||||
|
nogrid = FALSE; |
||||
|
break; |
||||
|
case GRID_NONE: |
||||
|
nogrid = TRUE; |
||||
|
xlog = ylog = FALSE; |
||||
|
break; |
||||
|
default: |
||||
|
fprintf( cp_err, "Error: grid type unsupported by gnuplot.\n" ); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
/* Open the output gnuplot file. */ |
||||
|
if (!(file = fopen(filename, "w"))) { |
||||
|
perror(filename); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
/* Set up the file header. */ |
||||
|
if (title) { |
||||
|
text = cp_unquote(title); |
||||
|
fprintf( file, "set title \"%s\"\n", text ); |
||||
|
tfree(text); |
||||
|
} |
||||
|
if (xlabel) { |
||||
|
text = cp_unquote(xlabel); |
||||
|
fprintf( file, "set xlabel \"%s\"\n", text ); |
||||
|
tfree(text); |
||||
|
} |
||||
|
if (ylabel) { |
||||
|
text = cp_unquote(ylabel); |
||||
|
fprintf( file, "set ylabel \"%s\"\n", text ); |
||||
|
tfree(text); |
||||
|
} |
||||
|
if (nogrid) { |
||||
|
fprintf( file, "set grid\n" ); |
||||
|
} |
||||
|
if (xlog) { |
||||
|
fprintf( file, "set logscale x\n" ); |
||||
|
if (xlims) { |
||||
|
fprintf( file, "set xrange [% e: % e]\n", log10(xlims[0]),log10(xlims[1]) ); |
||||
|
} |
||||
|
} else { |
||||
|
fprintf( file, "unset logscale x \n" ); |
||||
|
if (xlims) { |
||||
|
fprintf( file, "set xrange [% e: % e]\n", xlims[0],xlims[1] ); |
||||
|
} |
||||
|
} |
||||
|
if (ylog) { |
||||
|
fprintf( file, "set logscale y \n" ); |
||||
|
if (ylims) { |
||||
|
fprintf( file, "set yrange [% e: % e]\n", log10(ylims[0]),log10(ylims[1]) ); |
||||
|
} |
||||
|
} else { |
||||
|
fprintf( file, "unset logscale y \n" ); |
||||
|
if (ylims) { |
||||
|
fprintf( file, "set yrange [% e: % e]\n", ylims[0],ylims[1] ); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
fprintf( file, "#set xtics 1\n" ); |
||||
|
fprintf( file, "#set x2tics 1\n" ); |
||||
|
fprintf( file, "#set ytics 1\n" ); |
||||
|
fprintf( file, "#set y2tics 1\n" ); |
||||
|
|
||||
|
/* TODO |
||||
|
fprintf( file, "LineWidth: %d\n", linewidth ); |
||||
|
if (plottype == PLOT_COMB) { |
||||
|
fprintf( file, "BarGraph: True\n" ); |
||||
|
fprintf( file, "NoLines: True\n" ); |
||||
|
} else if (plottype == PLOT_POINT) { |
||||
|
if (markers) { |
||||
|
fprintf( file, "Markers: True\n" ); |
||||
|
} else { |
||||
|
fprintf( file, "LargePixels: True\n" ); |
||||
|
} |
||||
|
fprintf( file, "NoLines: True\n" ); |
||||
|
} |
||||
|
*/ |
||||
|
|
||||
|
/* Open the output gnuplot data file. */ |
||||
|
|
||||
|
if (!(file_data = fopen(filename_data, "w"))) { |
||||
|
perror(filename); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
fprintf( file, "plot ", v->v_name ); |
||||
|
i = 0; |
||||
|
|
||||
|
/* Write out the data and setup arrays */ |
||||
|
for ( v = vecs; v; v = v->v_link2 ) { |
||||
|
scale = v->v_scale; |
||||
|
if (v->v_name) { |
||||
|
i= i+2; |
||||
|
fprintf( file, "\'%s\' using %d:%d with lines t \"%s\" ,", filename_data , i , i+1 , v->v_name ); |
||||
|
} |
||||
|
} |
||||
|
fprintf( file, "\n"); |
||||
|
fprintf (file, "set terminal postscript eps\nset out %s.eps\nreplot\nset term pop", filename); |
||||
|
|
||||
|
for ( i = 0; i < scale->v_length; i++ ) { |
||||
|
for ( v = vecs; v; v = v->v_link2 ) { |
||||
|
scale = v->v_scale; |
||||
|
|
||||
|
xval = isreal(scale) ? |
||||
|
scale->v_realdata[i] : realpart(&scale->v_compdata[i]); |
||||
|
|
||||
|
yval = isreal(v) ? |
||||
|
v->v_realdata[i] : realpart(&v->v_compdata[i]); |
||||
|
|
||||
|
fprintf( file_data, "% e % e ", xval, yval ); |
||||
|
} |
||||
|
fprintf( file_data, "\n"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
(void) fclose( file ); |
||||
|
(void) fclose( file_data ); |
||||
|
|
||||
|
(void) sprintf( buf, "gnuplot %s &", filename ); |
||||
|
(void) system( buf ); |
||||
|
|
||||
|
|
||||
|
return; |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
/************* |
||||
|
* Header file for gnuplot.c |
||||
|
* 2008 Stefano Pedretti |
||||
|
************/ |
||||
|
|
||||
|
#ifndef GNUPLOT_H_INCLUDED |
||||
|
#define GNUPLOT_H_INCLUDED |
||||
|
|
||||
|
void ft_gnuplot(double *xlims, double *ylims, char *filename, char *title, |
||||
|
char *xlabel, char *ylabel, GRIDTYPE gridtype, PLOTTYPE plottype, |
||||
|
struct dvec *vecs); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#endif |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue