GNU Radio Manual and C++ API Reference  3.8.4.0
The Free & Open Software Radio Ecosystem
DisplayPlot.h
Go to the documentation of this file.
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2008-2012 Free Software Foundation, Inc.
4  *
5  * This file is part of GNU Radio
6  *
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  *
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING. If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22 
23 #ifndef DOMAIN_DISPLAY_PLOT_H
24 #define DOMAIN_DISPLAY_PLOT_H
25 
26 #include <gnuradio/qtgui/utils.h>
27 #include <qwt_legend.h>
28 #include <qwt_painter.h>
29 #include <qwt_plot.h>
30 #include <qwt_plot_canvas.h>
31 #include <qwt_plot_curve.h>
32 #include <qwt_plot_magnifier.h>
33 #include <qwt_plot_marker.h>
34 #include <qwt_plot_panner.h>
35 #include <qwt_plot_zoomer.h>
36 #include <qwt_scale_engine.h>
37 #include <qwt_scale_widget.h>
38 #include <qwt_symbol.h>
39 #include <stdint.h>
40 #include <cstdio>
41 #include <vector>
42 
43 #if QWT_VERSION >= 0x060200
44 typedef QPointF QwtDoublePoint;
45 typedef QRectF QwtDoubleRect;
46 
47 typedef QwtInterval QwtDoubleInterval;
48 #elif QWT_VERSION >= 0x060000
49 #include <qwt_compat.h>
50 #endif
51 
52 typedef QList<QColor> QColorList;
53 Q_DECLARE_METATYPE(QColorList)
54 
55 #if QWT_VERSION < 0x060100
56 #include <qwt_legend_item.h>
57 #else /* QWT_VERSION < 0x060100 */
58 #include <qwt_legend_data.h>
59 #include <qwt_legend_label.h>
60 #endif /* QWT_VERSION < 0x060100 */
61 
62 /*!
63  * \brief QWidget base plot to build QTGUI plotting tools.
64  * \ingroup qtgui_blk
65  */
66 class DisplayPlot : public QwtPlot
67 {
68  Q_OBJECT
69 
70  Q_PROPERTY(QColor line_color1 READ getLineColor1 WRITE setLineColor1)
71  Q_PROPERTY(QColor line_color2 READ getLineColor2 WRITE setLineColor2)
72  Q_PROPERTY(QColor line_color3 READ getLineColor3 WRITE setLineColor3)
73  Q_PROPERTY(QColor line_color4 READ getLineColor4 WRITE setLineColor4)
74  Q_PROPERTY(QColor line_color5 READ getLineColor5 WRITE setLineColor5)
75  Q_PROPERTY(QColor line_color6 READ getLineColor6 WRITE setLineColor6)
76  Q_PROPERTY(QColor line_color7 READ getLineColor7 WRITE setLineColor7)
77  Q_PROPERTY(QColor line_color8 READ getLineColor8 WRITE setLineColor8)
78  Q_PROPERTY(QColor line_color9 READ getLineColor9 WRITE setLineColor9)
79 
80  Q_PROPERTY(int line_width1 READ getLineWidth1 WRITE setLineWidth1)
81  Q_PROPERTY(int line_width2 READ getLineWidth2 WRITE setLineWidth2)
82  Q_PROPERTY(int line_width3 READ getLineWidth3 WRITE setLineWidth3)
83  Q_PROPERTY(int line_width4 READ getLineWidth4 WRITE setLineWidth4)
84  Q_PROPERTY(int line_width5 READ getLineWidth5 WRITE setLineWidth5)
85  Q_PROPERTY(int line_width6 READ getLineWidth6 WRITE setLineWidth6)
86  Q_PROPERTY(int line_width7 READ getLineWidth7 WRITE setLineWidth7)
87  Q_PROPERTY(int line_width8 READ getLineWidth8 WRITE setLineWidth8)
88  Q_PROPERTY(int line_width9 READ getLineWidth9 WRITE setLineWidth9)
89 
90  Q_PROPERTY(Qt::PenStyle line_style1 READ getLineStyle1 WRITE setLineStyle1)
91  Q_PROPERTY(Qt::PenStyle line_style2 READ getLineStyle2 WRITE setLineStyle2)
92  Q_PROPERTY(Qt::PenStyle line_style3 READ getLineStyle3 WRITE setLineStyle3)
93  Q_PROPERTY(Qt::PenStyle line_style4 READ getLineStyle4 WRITE setLineStyle4)
94  Q_PROPERTY(Qt::PenStyle line_style5 READ getLineStyle5 WRITE setLineStyle5)
95  Q_PROPERTY(Qt::PenStyle line_style6 READ getLineStyle6 WRITE setLineStyle6)
96  Q_PROPERTY(Qt::PenStyle line_style7 READ getLineStyle7 WRITE setLineStyle7)
97  Q_PROPERTY(Qt::PenStyle line_style8 READ getLineStyle8 WRITE setLineStyle8)
98  Q_PROPERTY(Qt::PenStyle line_style9 READ getLineStyle9 WRITE setLineStyle9)
99 
100  typedef QwtSymbol::Style QwtSymbolStyle;
101 
102  Q_ENUMS(QwtSymbolStyle)
103  Q_PROPERTY(QwtSymbolStyle line_marker1 READ getLineMarker1 WRITE setLineMarker1)
104  Q_PROPERTY(QwtSymbolStyle line_marker2 READ getLineMarker2 WRITE setLineMarker2)
105  Q_PROPERTY(QwtSymbolStyle line_marker3 READ getLineMarker3 WRITE setLineMarker3)
106  Q_PROPERTY(QwtSymbolStyle line_marker4 READ getLineMarker4 WRITE setLineMarker4)
107  Q_PROPERTY(QwtSymbolStyle line_marker5 READ getLineMarker5 WRITE setLineMarker5)
108  Q_PROPERTY(QwtSymbolStyle line_marker6 READ getLineMarker6 WRITE setLineMarker6)
109  Q_PROPERTY(QwtSymbolStyle line_marker7 READ getLineMarker7 WRITE setLineMarker7)
110  Q_PROPERTY(QwtSymbolStyle line_marker8 READ getLineMarker8 WRITE setLineMarker8)
111  Q_PROPERTY(QwtSymbolStyle line_marker9 READ getLineMarker9 WRITE setLineMarker9)
112 
113  Q_PROPERTY(int marker_alpha1 READ getMarkerAlpha1 WRITE setMarkerAlpha1)
114  Q_PROPERTY(int marker_alpha2 READ getMarkerAlpha2 WRITE setMarkerAlpha2)
115  Q_PROPERTY(int marker_alpha3 READ getMarkerAlpha3 WRITE setMarkerAlpha3)
116  Q_PROPERTY(int marker_alpha4 READ getMarkerAlpha4 WRITE setMarkerAlpha4)
117  Q_PROPERTY(int marker_alpha5 READ getMarkerAlpha5 WRITE setMarkerAlpha5)
118  Q_PROPERTY(int marker_alpha6 READ getMarkerAlpha6 WRITE setMarkerAlpha6)
119  Q_PROPERTY(int marker_alpha7 READ getMarkerAlpha7 WRITE setMarkerAlpha7)
120  Q_PROPERTY(int marker_alpha8 READ getMarkerAlpha8 WRITE setMarkerAlpha8)
121  Q_PROPERTY(int marker_alpha9 READ getMarkerAlpha9 WRITE setMarkerAlpha9)
122 
123  Q_PROPERTY(QColor zoomer_color READ getZoomerColor WRITE setZoomerColor)
124  Q_PROPERTY(QColor palette_color READ getPaletteColor WRITE setPaletteColor)
125  Q_PROPERTY(
127  Q_PROPERTY(
129  Q_PROPERTY(
131 
132 public:
133  DisplayPlot(int nplots, QWidget*);
134  virtual ~DisplayPlot();
135 
136  virtual void replot() = 0;
137 
138  const QColor getLineColor1() const;
139  const QColor getLineColor2() const;
140  const QColor getLineColor3() const;
141  const QColor getLineColor4() const;
142  const QColor getLineColor5() const;
143  const QColor getLineColor6() const;
144  const QColor getLineColor7() const;
145  const QColor getLineColor8() const;
146  const QColor getLineColor9() const;
147 
148  int getLineWidth1() const;
149  int getLineWidth2() const;
150  int getLineWidth3() const;
151  int getLineWidth4() const;
152  int getLineWidth5() const;
153  int getLineWidth6() const;
154  int getLineWidth7() const;
155  int getLineWidth8() const;
156  int getLineWidth9() const;
157 
158  const Qt::PenStyle getLineStyle1() const;
159  const Qt::PenStyle getLineStyle2() const;
160  const Qt::PenStyle getLineStyle3() const;
161  const Qt::PenStyle getLineStyle4() const;
162  const Qt::PenStyle getLineStyle5() const;
163  const Qt::PenStyle getLineStyle6() const;
164  const Qt::PenStyle getLineStyle7() const;
165  const Qt::PenStyle getLineStyle8() const;
166  const Qt::PenStyle getLineStyle9() const;
167 
168  const QwtSymbol::Style getLineMarker1() const;
169  const QwtSymbol::Style getLineMarker2() const;
170  const QwtSymbol::Style getLineMarker3() const;
171  const QwtSymbol::Style getLineMarker4() const;
172  const QwtSymbol::Style getLineMarker5() const;
173  const QwtSymbol::Style getLineMarker6() const;
174  const QwtSymbol::Style getLineMarker7() const;
175  const QwtSymbol::Style getLineMarker8() const;
176  const QwtSymbol::Style getLineMarker9() const;
177 
178  int getMarkerAlpha1() const;
179  int getMarkerAlpha2() const;
180  int getMarkerAlpha3() const;
181  int getMarkerAlpha4() const;
182  int getMarkerAlpha5() const;
183  int getMarkerAlpha6() const;
184  int getMarkerAlpha7() const;
185  int getMarkerAlpha8() const;
186  int getMarkerAlpha9() const;
187 
188  QColor getZoomerColor() const;
189  QColor getPaletteColor() const;
190  int getAxisLabelFontSize(int axisId) const;
191  int getYaxisLabelFontSize() const;
192  int getXaxisLabelFontSize() const;
193  int getAxesLabelFontSize() const;
194 
195  // Make sure to create your won PlotNewData method in the derived
196  // class:
197  // void PlotNewData(...);
198 
199 public slots:
200  virtual void disableLegend();
201  virtual void setAxisLabels(bool en);
202  virtual void setYaxis(double min, double max);
203  virtual void setXaxis(double min, double max);
204  virtual void setLineLabel(unsigned int which, QString label);
205  virtual QString getLineLabel(unsigned int which);
206  virtual void setLineColor(unsigned int which, QColor color);
207  virtual QColor getLineColor(unsigned int which) const;
208  virtual void setLineWidth(unsigned int which, int width);
209  virtual int getLineWidth(unsigned int which) const;
210  virtual void setLineStyle(unsigned int which, Qt::PenStyle style);
211  virtual const Qt::PenStyle getLineStyle(unsigned int which) const;
212  virtual void setLineMarker(unsigned int which, QwtSymbol::Style marker);
213  virtual const QwtSymbol::Style getLineMarker(unsigned int which) const;
214  virtual void setMarkerAlpha(unsigned int which, int alpha);
215  virtual int getMarkerAlpha(unsigned int which) const;
216 
217  // Need a function for each curve for setting via stylesheet.
218  // Can't use preprocessor directives because we're inside a Q_OBJECT.
219  void setLineColor1(QColor);
220  void setLineColor2(QColor);
221  void setLineColor3(QColor);
222  void setLineColor4(QColor);
223  void setLineColor5(QColor);
224  void setLineColor6(QColor);
225  void setLineColor7(QColor);
226  void setLineColor8(QColor);
227  void setLineColor9(QColor);
228 
229  void setLineWidth1(int);
230  void setLineWidth2(int);
231  void setLineWidth3(int);
232  void setLineWidth4(int);
233  void setLineWidth5(int);
234  void setLineWidth6(int);
235  void setLineWidth7(int);
236  void setLineWidth8(int);
237  void setLineWidth9(int);
238 
239  void setLineStyle1(Qt::PenStyle);
240  void setLineStyle2(Qt::PenStyle);
241  void setLineStyle3(Qt::PenStyle);
242  void setLineStyle4(Qt::PenStyle);
243  void setLineStyle5(Qt::PenStyle);
244  void setLineStyle6(Qt::PenStyle);
245  void setLineStyle7(Qt::PenStyle);
246  void setLineStyle8(Qt::PenStyle);
247  void setLineStyle9(Qt::PenStyle);
248 
249  void setLineMarker1(QwtSymbol::Style);
250  void setLineMarker2(QwtSymbol::Style);
251  void setLineMarker3(QwtSymbol::Style);
252  void setLineMarker4(QwtSymbol::Style);
253  void setLineMarker5(QwtSymbol::Style);
254  void setLineMarker6(QwtSymbol::Style);
255  void setLineMarker7(QwtSymbol::Style);
256  void setLineMarker8(QwtSymbol::Style);
257  void setLineMarker9(QwtSymbol::Style);
258 
259  void setMarkerAlpha1(int);
260  void setMarkerAlpha2(int);
261  void setMarkerAlpha3(int);
262  void setMarkerAlpha4(int);
263  void setMarkerAlpha5(int);
264  void setMarkerAlpha6(int);
265  void setMarkerAlpha7(int);
266  void setMarkerAlpha8(int);
267  void setMarkerAlpha9(int);
268 
269  void setZoomerColor(QColor c);
270  void setPaletteColor(QColor c);
271  void setAxisLabelFontSize(int axisId, int fs);
272  void setYaxisLabelFontSize(int fs);
273  void setXaxisLabelFontSize(int fs);
274  void setAxesLabelFontSize(int fs);
275 
276  void setStop(bool on);
277 
278  void resizeSlot(QSize* s);
279 
280  // Because of the preprocessing of slots in QT, these are not
281  // easily separated by the version check. Make one for each
282  // version until it's worked out.
283  void onPickerPointSelected(const QwtDoublePoint& p);
284  void onPickerPointSelected6(const QPointF& p);
285 
286 signals:
287  void plotPointSelected(const QPointF p);
288 
289 protected slots:
290  virtual void legendEntryChecked(QwtPlotItem* plotItem, bool on);
291  virtual void legendEntryChecked(const QVariant& plotItem, bool on, int index);
292 
293 protected:
294  unsigned int d_nplots;
295  std::vector<QwtPlotCurve*> d_plot_curve;
296 
297  QwtPlotPanner* d_panner;
298  QwtPlotZoomer* d_zoomer;
299 
301  QwtPlotMagnifier* d_magnifier;
302 
303  int64_t d_numPoints;
304 
305  bool d_stop;
306 
307  QList<QColor> d_trace_colors;
308 
310 };
311 
312 #endif /* DOMAIN_DISPLAY_PLOT_H */
int line_width3
Definition: DisplayPlot.h:82
void setLineStyle6(Qt::PenStyle)
int getLineWidth8() const
const QwtSymbol::Style getLineMarker2() const
void setLineWidth9(int)
void setLineStyle2(Qt::PenStyle)
virtual void setLineMarker(unsigned int which, QwtSymbol::Style marker)
const Qt::PenStyle getLineStyle4() const
QColor line_color3
Definition: DisplayPlot.h:72
Qt::PenStyle line_style2
Definition: DisplayPlot.h:91
int line_width5
Definition: DisplayPlot.h:84
void setMarkerAlpha4(int)
QColor line_color6
Definition: DisplayPlot.h:75
unsigned int d_nplots
Definition: DisplayPlot.h:294
void setLineMarker1(QwtSymbol::Style)
QColor palette_color
Definition: DisplayPlot.h:124
void setLineWidth7(int)
QwtSymbolStyle line_marker7
Definition: DisplayPlot.h:109
virtual QColor getLineColor(unsigned int which) const
QWidget base plot to build QTGUI plotting tools.
Definition: DisplayPlot.h:66
virtual void setXaxis(double min, double max)
void setLineWidth2(int)
int xaxis_label_font_size
Definition: DisplayPlot.h:128
QList< QColor > QColorList
Definition: DisplayPlot.h:52
QwtSymbolStyle line_marker6
Definition: DisplayPlot.h:108
const QwtSymbol::Style getLineMarker4() const
const QwtSymbol::Style getLineMarker3() const
float min(float a, float b)
int getMarkerAlpha8() const
virtual void setYaxis(double min, double max)
int getAxesLabelFontSize() const
int getLineWidth5() const
QwtPlotZoomer * d_zoomer
Definition: DisplayPlot.h:298
void setPaletteColor(QColor c)
void setLineStyle9(Qt::PenStyle)
int getLineWidth1() const
void setLineStyle7(Qt::PenStyle)
void setLineMarker5(QwtSymbol::Style)
int marker_alpha5
Definition: DisplayPlot.h:117
QwtSymbolStyle line_marker1
Definition: DisplayPlot.h:103
void setLineWidth6(int)
QwtSymbolStyle line_marker8
Definition: DisplayPlot.h:110
Qt::PenStyle line_style7
Definition: DisplayPlot.h:96
virtual void legendEntryChecked(QwtPlotItem *plotItem, bool on)
virtual void setLineColor(unsigned int which, QColor color)
int getLineWidth9() const
STL namespace.
QwtPlotMagnifier * d_magnifier
Definition: DisplayPlot.h:301
QwtSymbolStyle line_marker2
Definition: DisplayPlot.h:104
int marker_alpha8
Definition: DisplayPlot.h:120
void setAxisLabelFontSize(int axisId, int fs)
int line_width8
Definition: DisplayPlot.h:87
Qt::PenStyle line_style4
Definition: DisplayPlot.h:93
Qt::PenStyle line_style9
Definition: DisplayPlot.h:98
int marker_alpha3
Definition: DisplayPlot.h:115
void onPickerPointSelected6(const QPointF &p)
int getMarkerAlpha6() const
std::vector< QwtPlotCurve * > d_plot_curve
Definition: DisplayPlot.h:295
const Qt::PenStyle getLineStyle7() const
int line_width9
Definition: DisplayPlot.h:88
void setLineColor5(QColor)
void setMarkerAlpha9(int)
const QColor getLineColor3() const
void setLineColor4(QColor)
QwtSymbolStyle line_marker4
Definition: DisplayPlot.h:106
const QColor getLineColor8() const
int getLineWidth4() const
int marker_alpha2
Definition: DisplayPlot.h:114
void setLineMarker4(QwtSymbol::Style)
void resizeSlot(QSize *s)
const Qt::PenStyle getLineStyle2() const
int line_width1
Definition: DisplayPlot.h:80
QwtSymbolStyle line_marker3
Definition: DisplayPlot.h:105
QList< QColor > d_trace_colors
Definition: DisplayPlot.h:307
void setZoomerColor(QColor c)
QColor line_color1
Definition: DisplayPlot.h:70
QColor line_color8
Definition: DisplayPlot.h:77
QColor line_color9
Definition: DisplayPlot.h:78
void plotPointSelected(const QPointF p)
void setLineWidth3(int)
int getMarkerAlpha7() const
int getMarkerAlpha9() const
QColor line_color7
Definition: DisplayPlot.h:76
Qt::PenStyle line_style3
Definition: DisplayPlot.h:92
const QColor getLineColor5() const
void setLineColor3(QColor)
virtual void setLineLabel(unsigned int which, QString label)
virtual QString getLineLabel(unsigned int which)
const QColor getLineColor9() const
void setLineMarker7(QwtSymbol::Style)
int64_t d_numPoints
Definition: DisplayPlot.h:303
void setMarkerAlpha2(int)
void setLineMarker3(QwtSymbol::Style)
void onPickerPointSelected(const QwtDoublePoint &p)
void setLineColor7(QColor)
QColor line_color5
Definition: DisplayPlot.h:74
void setLineWidth1(int)
void setLineMarker2(QwtSymbol::Style)
void setLineStyle3(Qt::PenStyle)
const QwtSymbol::Style getLineMarker5() const
void setLineStyle4(Qt::PenStyle)
bool d_stop
Definition: DisplayPlot.h:305
int getLineWidth2() const
virtual void replot()=0
QwtDblClickPlotPicker * d_picker
Definition: DisplayPlot.h:300
const QColor getLineColor7() const
int getYaxisLabelFontSize() const
void setYaxisLabelFontSize(int fs)
virtual void setMarkerAlpha(unsigned int which, int alpha)
virtual int getLineWidth(unsigned int which) const
const Qt::PenStyle getLineStyle3() const
const QColor getLineColor4() const
int getMarkerAlpha3() const
int marker_alpha4
Definition: DisplayPlot.h:116
virtual const Qt::PenStyle getLineStyle(unsigned int which) const
void setAxesLabelFontSize(int fs)
int getMarkerAlpha1() const
int getLineWidth6() const
int axes_label_font_size
Definition: DisplayPlot.h:130
virtual void setLineWidth(unsigned int which, int width)
virtual void setLineStyle(unsigned int which, Qt::PenStyle style)
QwtSymbolStyle line_marker9
Definition: DisplayPlot.h:111
const QColor getLineColor1() const
int getLineWidth3() const
void setLineWidth5(int)
Qt::PenStyle line_style6
Definition: DisplayPlot.h:95
int marker_alpha9
Definition: DisplayPlot.h:121
void setLineWidth8(int)
virtual void disableLegend()
void setLineColor9(QColor)
const Qt::PenStyle getLineStyle8() const
void setMarkerAlpha5(int)
QColor zoomer_color
Definition: DisplayPlot.h:123
Qt::PenStyle line_style5
Definition: DisplayPlot.h:94
int getLineWidth7() const
Qt::PenStyle line_style8
Definition: DisplayPlot.h:97
QColor getZoomerColor() const
const Qt::PenStyle getLineStyle5() const
virtual void setAxisLabels(bool en)
void setMarkerAlpha3(int)
void setLineColor2(QColor)
Qt::PenStyle line_style1
Definition: DisplayPlot.h:90
const QColor getLineColor6() const
const Qt::PenStyle getLineStyle9() const
int getMarkerAlpha2() const
void setMarkerAlpha8(int)
void setLineColor6(QColor)
int line_width6
Definition: DisplayPlot.h:85
const QwtSymbol::Style getLineMarker9() const
void setStop(bool on)
const Qt::PenStyle getLineStyle1() const
int getMarkerAlpha4() const
void setLineColor8(QColor)
void setLineColor1(QColor)
int line_width4
Definition: DisplayPlot.h:83
QwtPlotPanner * d_panner
Definition: DisplayPlot.h:297
Definition: utils.h:41
QwtSymbolStyle line_marker5
Definition: DisplayPlot.h:107
void setLineStyle8(Qt::PenStyle)
int marker_alpha1
Definition: DisplayPlot.h:113
void setMarkerAlpha7(int)
int marker_alpha7
Definition: DisplayPlot.h:119
QColor line_color2
Definition: DisplayPlot.h:71
QColor getPaletteColor() const
int yaxis_label_font_size
Definition: DisplayPlot.h:126
int line_width7
Definition: DisplayPlot.h:86
const QwtSymbol::Style getLineMarker1() const
void setLineWidth4(int)
void setXaxisLabelFontSize(int fs)
const QColor getLineColor2() const
int marker_alpha6
Definition: DisplayPlot.h:118
QColor line_color4
Definition: DisplayPlot.h:73
int getAxisLabelFontSize(int axisId) const
void setMarkerAlpha6(int)
void setLineMarker8(QwtSymbol::Style)
void setLineMarker6(QwtSymbol::Style)
void setLineStyle5(Qt::PenStyle)
void setMarkerAlpha1(int)
const QwtSymbol::Style getLineMarker8() const
int getMarkerAlpha5() const
const QwtSymbol::Style getLineMarker7() const
int getXaxisLabelFontSize() const
int line_width2
Definition: DisplayPlot.h:81
void setLineStyle1(Qt::PenStyle)
virtual int getMarkerAlpha(unsigned int which) const
const QwtSymbol::Style getLineMarker6() const
virtual const QwtSymbol::Style getLineMarker(unsigned int which) const
const Qt::PenStyle getLineStyle6() const
void setLineMarker9(QwtSymbol::Style)
bool d_autoscale_state
Definition: DisplayPlot.h:309