00001
00012
00013 #ifdef _MSC_VER
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016
00017 #include "AxisModelBase.h"
00018 #include "AxisTick.h"
00019
00020 #include <algorithm>
00021
00022 #include <cassert>
00023
00024 using std::string;
00025 using std::vector;
00026
00027 AxisModelBase::AxisModelBase ( AxisLoc label, AxisLoc scale )
00028 : m_range( 0.0, 1.0 ),
00029 m_start_range ( -1.0, 1.0 ),
00030 m_is_dragging ( false ),
00031 m_auto_range ( true ),
00032 m_empty( true ),
00033 m_scale_factor ( 1.0 ),
00034 m_scaling_on ( false ),
00035 m_first_tick( 0.0 ),
00036 m_max_ticks( 20 ),
00037 m_num_minor_ticks( 0 ),
00038 m_label_location( label ),
00039 m_scale_location( scale ),
00040 m_pmag( 0.0 ),
00041 m_use_pmag( false ),
00042 m_ticks( m_max_ticks ),
00043 m_auto_ticks ( true )
00044 {
00045 }
00046
00047 AxisModelBase::AxisModelBase( const AxisModelBase & axis_model )
00048 : m_range( axis_model.m_range ),
00049 m_start_range ( 0.0, 1.0 ),
00050 m_is_dragging ( false ),
00051 m_auto_range( axis_model.m_auto_range ),
00052 m_empty( axis_model.m_empty ),
00053 m_scale_factor( axis_model.m_scale_factor ),
00054 m_scaling_on ( axis_model.m_scaling_on ),
00055 m_first_tick( axis_model.m_first_tick ),
00056 m_tick_step( axis_model.m_tick_step ),
00057 m_max_ticks( 20 ),
00058 m_num_minor_ticks( axis_model.m_num_minor_ticks ),
00059 m_label_location( axis_model.m_label_location ),
00060 m_scale_location( axis_model.m_scale_location ),
00061 m_pmag( axis_model.m_pmag ),
00062 m_use_pmag( axis_model.m_use_pmag ),
00063 m_ticks( axis_model.m_ticks ),
00064 m_auto_ticks ( axis_model.m_auto_ticks )
00065 {
00066 }
00067
00068 AxisModelBase::~AxisModelBase()
00069 {
00070 }
00071
00072 void AxisModelBase::setTickStep( const double & t_step )
00073 {
00074 m_tick_step = t_step;
00075 }
00076
00077 double AxisModelBase::getTickStep() const
00078 {
00079 return m_tick_step;
00080 }
00081
00082 void AxisModelBase::setFirstTick( const double & first_tick )
00083 {
00084 m_first_tick = first_tick;
00085 }
00086
00087 double AxisModelBase::getFirstTick() const
00088 {
00089 return m_first_tick;
00090 }
00091
00092 double AxisModelBase::getMaxTicks() const
00093 {
00094 return m_max_ticks;
00095 }
00096
00097 void AxisModelBase::setRMag( const double & rmag )
00098 {
00099 m_rmag = rmag;
00100 }
00101
00102 double AxisModelBase::getRMag() const
00103 {
00104 return m_rmag;
00105 }
00106
00107 void AxisModelBase::setPMag( const double & pmag )
00108 {
00109 m_pmag = pmag;
00110 }
00111
00112 double AxisModelBase::getPMag() const
00113 {
00114 return m_pmag;
00115 }
00116
00117 bool AxisModelBase::needPMag() const
00118 {
00119 return m_use_pmag;
00120 }
00121
00122 void AxisModelBase::setUsePMag( const bool & use_p_mag )
00123 {
00124 m_use_pmag = use_p_mag;
00125 }
00126
00127 AxisLoc AxisModelBase::getLabelLocation() const
00128 {
00129 return m_label_location;
00130 }
00131
00132 AxisLoc AxisModelBase::getScaleLocation() const
00133 {
00134 return m_scale_location;
00135 }
00136
00137 void
00138 AxisModelBase::
00139 setAutoTicks ( bool yes )
00140 {
00141 m_auto_ticks = yes;
00142 }
00143
00144 bool
00145 AxisModelBase::
00146 isAutoTicks ( ) const
00147 {
00148 return m_auto_ticks;
00149 }
00150
00151 void
00152 AxisModelBase::
00153 setTicks ( const std::vector < AxisTick > & ticks)
00154 {
00155 m_ticks = ticks;
00156 }
00157
00158 const vector<AxisTick> &
00159 AxisModelBase::getTicks() const
00160 {
00161 return m_ticks;
00162 }
00163
00164
00165 void AxisModelBase::setRange ( double low, double high, double pos )
00166 {
00167 if ( low > high ) std::swap ( low, high );
00168 m_range.setRange ( low, high, pos );
00169 }
00170
00171 void AxisModelBase::setRange( const Range & range, bool scaled )
00172 {
00173 if ( range.length () < DBL_EPSILON ) {
00174 return;
00175 }
00176 Range myrange = range;
00177 if( scaled ){
00178 Range newrange( range.low() / m_scale_factor,
00179 range.high() / m_scale_factor,
00180 range.pos() );
00181 myrange = newrange;
00182 }
00183
00184 m_range = myrange;
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 if( isLog() ) adjustLogValues();
00195
00196 m_empty = false;
00197
00198 }
00199
00200 void AxisModelBase::setIntersectRange ( const Range & r1, const Range & r2 )
00201 {
00202 m_range = r1;
00203 m_range.setIntersect ( r2 );
00204 }
00205
00206 void
00207 AxisModelBase::
00208 setRangePos ( double pos )
00209 {
00210 assert( pos > 0.0 );
00211 m_range.setPos( pos );
00212 }
00213
00214 void AxisModelBase::setUnionRange ( const Range & range )
00215 {
00216 if( m_empty ) {
00217 m_range = range;
00218 m_range.setEmpty ( false );
00219 m_empty = false;
00220 }
00221 else {
00222 m_range.setUnion( range );
00223 }
00224 }
00225
00226 void AxisModelBase::setEmpty()
00227 {
00228 m_empty = true;
00229 }
00230
00231 const Range & AxisModelBase::getRange(bool scaled) const
00232 {
00233
00234 if(!scaled)
00235 return m_range;
00236
00237 double low = m_range.low() * m_scale_factor;
00238 double high = m_range.high() * m_scale_factor;
00239
00240 Range range ( low, high );
00241 m_scaled_range = range;
00242
00243 return m_scaled_range;
00244 }
00245
00246 void AxisModelBase::setAutoRanging ( bool flag )
00247 {
00248 m_auto_range = flag;
00249 }
00250
00251 bool AxisModelBase::isAutoRanging () const
00252 {
00253 return m_auto_range;
00254 }
00255
00256 void AxisModelBase::setScaleFactor ( double sf )
00257 {
00258 m_scale_factor = sf;
00259 m_scaling_on = true;
00260 }
00261
00262 double AxisModelBase::getScaleFactor () const
00263 {
00264 if ( m_scaling_on == false ) return 1.0;
00265
00266 return m_scale_factor;
00267 }
00268
00269 bool AxisModelBase:: isScaling ( ) const
00270 {
00271 return m_scaling_on;
00272 }
00273
00274 void AxisModelBase:: setScaling ( bool on )
00275 {
00276 m_scaling_on = on;
00277 if ( on == false ) m_scale_factor = 1.0;
00278 }
00279
00280 void AxisModelBase::startDragging ( bool dragging )
00281 {
00282 if ( m_is_dragging == false ) {
00283 m_start_range = m_range;
00284 }
00285 m_is_dragging = dragging;
00286 }