PSQt/src/GURuler.cpp

Go to the documentation of this file.
00001 //---------------------------------------------------------------------
00002 // File and Version Information:
00003 //   $Id: GURuler.cpp 11039 2015-12-01 01:18:58Z dubrovin@SLAC.STANFORD.EDU $
00004 //
00005 // Author: Mikhail S. Dubrovin
00006 //---------------------------------------------------------------------
00007 
00008 //--------------------------
00009 #include "PSQt/GURuler.h"
00010 #include "PSQt/QGUtils.h"
00011 
00012 #include <math.h>       // log10
00013 
00014 #include <QFont>
00015 #include <QGraphicsTextItem>
00016 
00017 //#include <iostream>    // for std::cout
00018 //#include <fstream>     // for std::ifstream(fname)
00019 //#include <math.h>  // atan2
00020 //#include <cstring> // for memcpy
00021 
00022 //using namespace std; // for cout without std::
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 // for float labels evaluates number of decimal digits after dot
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     //QFont font(m_font_name.c_str(), m_font_size, false);
00169     //font.setRawMode(true);
00170 
00171     // Add ruller scale
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     // Add labels
00196 
00197     //this->printTransform();
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       //std::cout << "QString: " << qstr.toStdString() << "  size: " << qstr.size() << '\n';
00211 
00212       txtitem->setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
00213 
00214       //QPoint pv(m_view.mapFromScene(pc));
00215       //txtitem->setPos(m_view.mapToScene(pv + m_dtxt + QPoint(m_hoff*qstr.size(),0)));
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 } // namespace PSQt
00230 //--------------------------

Generated on 19 Dec 2016 for PSANAmodules by  doxygen 1.4.7