2
Written 1998-1999 by Uwe Langenkamp
4
This software may be used and distributed according to the terms
5
of the GNU Public License, incorporated herein by reference.
7
The author may be reached as ul@it-guru.de
11
* 98/19/03 Last Change
12
* 98/19/03 Moving Grid added
34
#include <sys/types.h>
37
#include "qtai_strip.h"
41
AIStrip::AIStrip(QWidget *parent,const char *name,int b,int t)
42
: AIPlot(parent,name,b,t)
45
for (i=0;i<traces;i++)
53
void AIStrip::addData(double xp,double *yp)
59
for (i=0;i<traces;i++) {
61
memmove((char*)&xtrace[i][0],
63
(bufsize-1)*sizeof(double));
64
memmove((char*)&ytrace[i][0],
66
(bufsize-1)*sizeof(double));
71
for (i=0;i<traces;i++) {
74
ytrace[i][qn[0]]=yp[i];
78
// ... BUT Check only on trace 0,
79
// CAUSE in Strip all Data is based on one time trace
80
if (xtrace[0][qn[0]]>=getXmax()){
81
setXRange(xtrace[0][qn[0]]-xrange,xtrace[0][qn[0]]);
83
setXRange(xtrace[0][0],xtrace[0][0]+xrange);
88
// Hide Cursor, maybe we should use a p_curs..->hide()
90
p_curs[i].set(p_curs[i].x(),p_curs[i].y());
93
void AIStrip::setViewRange(double xr,double ymn,double ymx)
96
setRanges(0,xrange,ymn,ymx);
99
void AIStrip::drawScale( QPainter *p,int direction,int w,int h)
107
//p->fillRect(0,0,w,h,c_bg);
110
if (direction & HORIZONTAL) {
112
zx1=(int)(zoomx1[zoomed_in]*(double)w/100.0f);
113
zx2=(int)((zoomx2[zoomed_in]-zoomx1[zoomed_in])*(double)w/100.0f);
115
p->setWindow(zx1,0,zx2,h);
117
shift=(double)((int)(xmin / w_of_x))*w_of_x;
120
spos=(int)(((double)shift-(double)xmin)/(double)(xmax-xmin)*(double)w);
122
if (spos>=zx1 && spos<=zx1+zx2) {
124
if (!((int)shift % (int) (5*w_of_x))) {
125
p->drawLine(spos,(int)0,
129
p->drawLine(spos,(int)0,
137
p->drawLine(zx1,(int)0,zx1,(int)h);
138
p->drawLine(zx1+zx2,(int)0,zx1+zx2,(int)h);
140
else if (direction & VERTICAL) {
142
zy1=(int)(zoomy1[zoomed_in]*(double)h/100.0f);
143
zy2=(int)((zoomy2[zoomed_in]-zoomy1[zoomed_in])*(double)h/100.0f);
145
p->setWindow(0,zy1,w,zy2);
147
// Draw vertical scale
148
for (y=0;y<=maxy;y++) {
150
if (pos>=zy1 && pos<=zy1+zy2) {
151
p->drawLine((int)w/2,pos,(int)w,pos);
157
void AIStrip::drawLabel( QPainter *p,int direction,int w,int rw,int h,int rh)
163
QFont font("Helvetica",10);
164
QFontMetrics fm(font);
167
static double lzx1,lzy1,lzx2,lzy2;
169
struct tm *ts = NULL;
171
lzx1=zoomx1[zoomed_in],lzy1=zoomy1[zoomed_in];
172
lzx2=zoomx2[zoomed_in],lzy2=zoomy2[zoomed_in];
174
//p->fillRect(0,0,w,h,c_bg);
177
// Calculate begin and end of zoom area to the real world,
178
// means orig xmin,xmax
179
if (direction & HORIZONTAL) {
180
rzb=(double)lzx1*((double)xmax-(double)xmin)/
181
(double)100.0f + (double)xmin;
182
rze=(double)lzx2*((double)xmax-(double)xmin)/
183
(double)100.0f + (double)xmin;
184
} else if (direction & VERTICAL) {
185
rzb=(double)(100.0f-lzy1)*((double)ymax-(double)ymin)/
186
(double)100.0f + (double)ymin;
187
rze=(double)(100.0f-lzy2)*((double)ymax-(double)ymin)/
188
(double)100.0f + (double)ymin;
192
// set original width,height e.g.:
193
// zoom(lzx1,lzx2,lzy1,lzy2) =0,0% to 50,50%,
194
// window width (rw)= 100 pixel
195
// => local virtual width,height (lw,hw)= 200 pixel
196
lw=rw*100.0f/(lzx2-lzx1);
197
lh=rh*100.0f/(lzy2-lzy1);
199
if (direction & HORIZONTAL) {
201
//shift=(double)((int)(xmin / w_of_x))*w_of_x;
205
spos=(int)(((double)shift-(double)xmin)/(double)(xmax-xmin)*(double)lw);
207
str.sprintf("%.2f\0",
208
(double)(xmin+(xmax-xmin)*(double)spos/(double)lw));
210
tpos=(int)(spos-lzx1*lw/100.0f-fm.width(str)/2+(w-rw)/2);
212
if (!(tpos<0 || tpos+fm.width(str)>w)) {
213
p->drawText(tpos,0+fm.height(),str);
222
if ((x_axis_display_type & X_AXIS_NUMBER)==X_AXIS_NUMBER) {
223
str.sprintf("%.2f\0",(double)rzb);
224
tpos=(w-rw)/2-fm.width(str)/2;
225
p->drawText(tpos,0+fm.height(),str);
227
str.sprintf("%.2f\0",(double)rze);
228
tpos=w-(w-rw)/2-fm.width(str)/2;
229
p->drawText(tpos,0+fm.height(),str);
230
} else if ((x_axis_display_type & X_AXIS_DATE)==X_AXIS_DATE) {
231
if ((x_axis_display_type & X_AXIS_UK)==X_AXIS_UK) {
242
str.sprintf("%02d:%02d:%02d\0",
243
ts->tm_hour,ts->tm_min,ts->tm_sec);
244
tpos=(w-rw)/2-fm.width(str)/2;
245
p->drawText(tpos,0+fm.height(),str);
247
if (ts->tm_year<80) year=2000+ts->tm_year;
248
else year=1900+ts->tm_year;
249
str.sprintf("%02d.%02d.%04d\0",
250
ts->tm_mday,ts->tm_mon+1,year);
251
p->drawText(tpos,0+2*fm.height(),str);
255
str.sprintf("%02d:%02d:%02d\0",
256
ts->tm_hour,ts->tm_min,ts->tm_sec);
257
tpos=w-(w-rw)/2-fm.width(str)/2;
258
p->drawText(tpos,0+fm.height(),str);
263
else if (direction & VERTICAL) {
265
for (y=0;y<=maxy;y++) {
267
str.sprintf("%.2f\0",(double)(ymax+(ymin-ymax)*(double)y/(double)maxy));
268
tpos=(int)(y*lh/maxy-lzy1*lh/100.0f+fm.height()/2+(h-rh)/2);
269
if (!(tpos-fm.height()<0 || tpos+fm.height()>h))
270
p->drawText(w-fm.width(str),tpos,str);
275
void AIStrip::drawGrid( QPainter *p )
279
int w=width()*20,h=height()*20;
284
static int bw=-1,bh=-1; // BG Buffer
285
static QPixmap *bg_buf=NULL;
296
// 1999-05-23 UL, disabled, enabled
297
//p->fillRect(0,0,w,h,c_bg);
300
QPen pen(c_grid,1,DotLine);
305
(int)(zoomx1[zoomed_in]*(double)w/100.0f),
306
(int)(zoomy1[zoomed_in]*(double)h/100.0f),
307
(int)((zoomx2[zoomed_in]-zoomx1[zoomed_in])*(double)w/100.0f),
308
(int)((zoomy2[zoomed_in]-zoomy1[zoomed_in])*(double)h/100.0f));
310
p->setWindow(0,0,w,h); // defines coordinate system
313
shift=(double)((int)(xmin / w_of_x))*w_of_x;
316
spos=(int)(((double)shift-(double)xmin)/(double)(xmax-xmin)*(double)w);
318
p->drawLine((int)spos,(int)0,
326
for (y=1;y<maxy;y++) {
327
p->drawLine((int)0,(int)(y*h/maxy),
328
(int)w,(int)(y*h/maxy));
331
p->drawRect(0,0,w,h);
334
void AIStrip::setGridUnit(double wox)
336
w_of_x=wox; // Set the width between 2 X Axis Scales
339
#include "qtai_strip.moc"