00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "PSQt/GURuler.h"
00010 #include "PSQt/QGUtils.h"
00011
00012 #include <math.h>
00013
00014 #include <QFont>
00015 #include <QGraphicsTextItem>
00016
00017
00018
00019
00020
00021
00022
00023
00024 namespace PSQt {
00025
00026
00027 GURuler::GURuler( QGraphicsView& view
00028 , const GURuler::ORIENT& orient
00029 , const float& vmin
00030 , const float& vmax
00031 , const float& vort
00032 , const unsigned& ndiv1
00033 , const unsigned& ndiv2
00034 , const unsigned& opt
00035 , const int& txt_off_h
00036 , const int& txt_off_v
00037 , const int& size_tick1
00038 , const int& size_tick2
00039 , const QColor& color
00040 , const QPen& pen
00041 , const QFont& font
00042 ) : QWidget()
00043 , m_view(view)
00044 , m_orient(orient)
00045 , m_vmin(vmin)
00046 , m_vmax(vmax)
00047 , m_vort(vort)
00048 , m_opt(opt)
00049 , m_txt_off_h(txt_off_h)
00050 , m_txt_off_v(txt_off_v)
00051 , m_color(color)
00052 , m_pen(pen)
00053 , m_font(font)
00054 , m_path()
00055 {
00056 m_pen.setCosmetic(true);
00057 m_pen.setColor(m_color);
00058
00059 m_ndiv1 = (ndiv1) ? ndiv1 : 1;
00060 m_ndiv2 = (ndiv2) ? ndiv2 : 1;
00061
00062 m_size_tick1 = (size_tick1) ? size_tick1 : 8;
00063 m_size_tick2 = (size_tick2) ? size_tick2 : 4;
00064
00065 v_textitems.clear();
00066
00067 setPars();
00068 setPathForRuler();
00069 }
00070
00071
00072
00073 GURuler::~GURuler()
00074 {
00075 m_view.scene()->removeItem((QGraphicsItem*) m_path_item);
00076
00077 for(std::vector<QGraphicsItem*>::iterator it=v_textitems.begin(); it!=v_textitems.end(); ++it)
00078 m_view.scene()->removeItem(*it);
00079
00080 delete m_path_item;
00081
00082 v_textitems.clear();
00083 }
00084
00085
00086
00087
00088
00089 void
00090 GURuler::setPars()
00091 {
00092 m_scx = m_view.transform().m11();
00093 m_scy = m_view.transform().m22();
00094
00095 switch (m_orient) {
00096
00097 default :
00098 case HU :
00099 m_p1 = QPointF(m_vmin, m_vort);
00100 m_p2 = QPointF(m_vmax, m_vort);
00101 m_dt1 = QPointF(0, m_size_tick1/m_scy);
00102 m_dt2 = QPointF(0, m_size_tick2/m_scy);
00103 m_hoff = -4/m_scx;
00104 m_dtxt = QPointF(-4/m_scx,-25/m_scy);
00105 return;
00106
00107 case HD :
00108 m_p1 = QPointF(m_vmin, m_vort);
00109 m_p2 = QPointF(m_vmax, m_vort);
00110 m_dt1 = QPointF(0, -m_size_tick1/m_scy);
00111 m_dt2 = QPointF(0, -m_size_tick2/m_scy);
00112 m_hoff = -4/m_scx;
00113 m_dtxt = QPointF(-4/m_scx,0/m_scy);
00114 return;
00115
00116 case VL :
00117 m_p1 = QPointF(m_vort, m_vmin);
00118 m_p2 = QPointF(m_vort, m_vmax);
00119 m_dt1 = QPointF(m_size_tick1/m_scx, 0);
00120 m_dt2 = QPointF(m_size_tick2/m_scx, 0);
00121 m_hoff = -8/m_scx;
00122 m_dtxt = QPointF(-20/m_scx,-15/m_scy);
00123
00124 return;
00125
00126 case VR :
00127 m_p1 = QPointF(m_vort, m_vmin);
00128 m_p2 = QPointF(m_vort, m_vmax);
00129 m_dt1 = QPointF(-m_size_tick1/m_scx, 0);
00130 m_dt2 = QPointF(-m_size_tick2/m_scx, 0);
00131 m_hoff = 0/m_scx;
00132 m_dtxt = QPointF(0,-15/m_scy);
00133 return;
00134 }
00135 }
00136
00137
00138
00139 void GURuler::printTransform()
00140 {
00141 QTransform trans = m_view.transform();
00142 std::cout << "GURuler::printTransform():"
00143 << "\n m11():" << trans.m11()
00144 << "\n m22():" << trans.m22()
00145 << "\n dx() :" << trans.dx()
00146 << "\n dy() :" << trans.dy()
00147 << '\n';
00148 }
00149
00150
00151
00152 int
00153 GURuler::precision()
00154 {
00155 double v = double(fabs(m_vmax-m_vmin));
00156 if(v==0) return 0;
00157 if(v>5) return 0;
00158 if(v>0.5) return 1;
00159 double r = log10(v);
00160 return int(-floor(r))+1;
00161 }
00162
00163
00164
00165 void
00166 GURuler::setPathForRuler()
00167 {
00168
00169
00170
00171
00172 m_path.moveTo(m_p2);
00173 m_path.lineTo(m_p1);
00174
00175 QPointF dp((m_p2-m_p1)/m_ndiv1);
00176 QPointF dpf(dp/m_ndiv2);
00177 QPointF pc(m_p1);
00178 QPointF pc_pix;
00179
00180 for(unsigned i=0; i<=m_ndiv1; i++) {
00181 m_path.moveTo(pc);
00182 m_path.lineTo(pc+m_dt1);
00183
00184 if(i==m_ndiv1) break;
00185
00186 for(unsigned j=0; j<m_ndiv2; j++) {
00187 pc += dpf;
00188 m_path.moveTo(pc);
00189 m_path.lineTo(pc+m_dt2);
00190 }
00191 }
00192
00193 m_path_item = m_view.scene()->addPath(m_path, m_pen);
00194
00195
00196
00197
00198
00199 if(! m_opt & 1) return;
00200
00201 v_textitems.clear();
00202 int prec = precision();
00203
00204 pc=m_p1;
00205 for(unsigned i=0; i<=m_ndiv1; i++, pc += dp) {
00206 float val = (m_orient==HD || m_orient==HU) ? pc.x() : pc.y();
00207
00208 QGraphicsTextItem* txtitem = m_view.scene()->addText(QString(val_to_string<float>(val,prec).c_str()), m_font);
00209 QString qstr = txtitem->toPlainText();
00210
00211
00212 txtitem->setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
00213
00214
00215
00216
00217 txtitem->setPos(pc + m_dtxt + QPointF(m_hoff*qstr.size(),0));
00218
00219 txtitem->setDefaultTextColor(m_color);
00220 txtitem->adjustSize();
00221
00222 v_textitems.push_back((QGraphicsItem*)txtitem);
00223 }
00224 }
00225
00226
00227
00228
00229 }
00230