19 #include "msdevstudio/MSconfig.h"
20 #define finite _finite
44 using namespace hippodraw;
47 : m_sci_note_x(false),
50 m_axis_y_origin ( 0.0),
52 m_axis_height ( 0.0 ),
54 m_x_tick_font_size ( 1.0 ),
55 m_y_tick_font_size ( 1.0 ),
67 : m_sci_note_x(axis_rep.m_sci_note_x),
68 m_sci_note_y(axis_rep.m_sci_note_y),
69 m_axis_x_origin( axis_rep.m_axis_x_origin ),
70 m_axis_y_origin( axis_rep.m_axis_y_origin ),
71 m_axis_width( axis_rep.m_axis_width ),
72 m_axis_height( axis_rep.m_axis_height ),
73 m_font_size( axis_rep.m_font_size ),
74 m_x_font_size( axis_rep.m_x_font_size ),
75 m_y_font_size( axis_rep.m_y_font_size ),
76 m_xLabelFont( axis_rep.m_xLabelFont ),
77 m_yLabelFont( axis_rep.m_yLabelFont ),
78 m_zLabelFont( axis_rep.m_zLabelFont ),
79 m_titleFont( axis_rep.m_titleFont ),
80 m_draw_titles( axis_rep.m_draw_titles )
124 #ifdef HAVE_TEX_UTILS
126 string tex_snippet = title.substr(4);
133 float mx = marginRect.
getX();
137 double x_font_size = ( 1.3 * mw ) / title.size();
143 float x = mx + 0.5 * marginRect.
getWidth ();
147 view.
drawText ( title, x, y, 0.0, 0.0,
'c',
't',
false,
153 #ifdef HAVE_TEX_UTILS
174 draw_rect.
getY() ) / 2.0 );
176 else if ( location ==
PLOTTOP )
182 - draw_rect.
getY() ) ) /2.0 );
195 double size = height * 0.040;
196 size = std::min ( size, 11.0 );
201 const vector<AxisTick> & labels = axisModel.
getTicks ( );
202 if ( labels.empty () == true )
return;
215 const AxisTick & tick = labels.back ( );
218 draw_rect.
getX() - yr )
236 draw_rect.
getX() ) - yr )
237 / labels[labels.size() - 1].content().size() );
252 draw_rect.
getY() ) / 2.0 );
254 else if ( location ==
PLOTTOP )
260 - draw_rect.
getY() ) ) /2.0 );
267 ViewBase & base,
const std::string & x_label )
273 const vector< AxisTick > & ticks = axisModel.
getTicks();
275 int mid = ticks.size()/2;
276 double ref = ticks[mid].value();
277 double range = ticks[mid+1].value()-ref;
281 #ifdef HAVE_TEX_UTILS
283 string tex_snippet = x_label.substr(4);
285 tex_snippet+=
"-"+ticks[mid].content();
298 label = x_label+
" - "+ticks[mid].content();
304 float x = 0., y = 0.;
307 float draw_w = draw_rect.
getWidth ();
310 float margin_x = margin_rect.
getX ();
311 float margin_w = margin_rect.
getWidth ();
313 x = margin_x + 0.5 * margin_w;
315 float tmp = 0.045 * draw_w;
316 tmp = max ( tmp, 1.0f );
320 double ratio = draw_w / ( label.size() ) * 2;
331 view.
drawText ( label, x, y, 0., 0.0,
'c',
't',
343 view.
drawText ( label, x, y, 0.0, 0.0,
'c',
't',
360 double pmag = axisModel.
getPMag();
361 int i = static_cast <
int > ( pmag );
370 double pmag = axisModel.
getPMag();
371 int i = static_cast <
int > ( pmag );
378 #ifdef HAVE_TEX_UTILS
386 ViewBase & base,
const std::string & y_label )
392 const vector< AxisTick > & ticks = axisModel.
getTicks();
394 int mid = ticks.size()/2;
395 double ref = ticks[mid].value();
396 double range = ticks[mid+1].value()-ref;
400 #ifdef HAVE_TEX_UTILS
403 string tex_snippet = y_label.substr(4);
406 tex_snippet+=
"-"+ticks[mid].content();
423 label = y_label+
" - "+ticks[mid].content();
431 float x = 0., y = 0.;
436 float tmp = draw_rect.
getHeight() * 0.05;
439 / ( label.size() ) * 2 );
449 view.
drawText ( label, x, y, 0.0, 90.0,
'c',
't',
459 view.
drawText ( label, x, y, 0.0, -90.0,
'c',
't',
475 double pmag = axisModel.
getPMag();
476 int i = static_cast <
int > ( pmag );
485 double pmag = axisModel.
getPMag();
486 int i = static_cast <
int > ( pmag );
493 #ifdef HAVE_TEX_UTILS
502 const std::string & ref)
509 float x = margin_rect.
getX() + margin_rect.getWidth ();
537 ViewBase & base ,
const std::string & mag )
542 float x = margin_rect.
getX() + margin_rect.getWidth ();
544 double pmag = axisModel.
getPMag();
545 int i =
static_cast<int> (pmag);
567 ViewBase & base,
const std::string & mag )
584 double pmag = axisModel.
getPMag();
585 int i = static_cast <
int > ( pmag );
602 const Range & x_range,
603 const Range & y_range)
607 vector< double > xv ( 100 );
608 vector< double > yv ( 100 );
609 Color black ( 0, 0, 0 );
611 xv[0] = x_range.
low( );
612 yv[0] = y_range.
low( );
613 for(
int i = 1; i < 100; i++)
615 xv[i] = xv[i-1] + ( x_range.
high() - x_range.
low() )/99;
622 xv[0] = x_range.
high( );
623 yv[0] = y_range.
low( );
624 for(
int i = 1; i < 100; i++)
627 yv[i] = yv[i-1] + ( y_range.
high() - y_range.
low() )/99; ;
633 xv[0] = x_range.
low( );
634 yv[0] = y_range.
high( );
635 for(
int i = 1; i < 100; i++)
637 xv[i] = xv[i-1] + ( x_range.
high() - x_range.
low() )/99;
645 xv[0] = x_range.
low( );
646 yv[0] = y_range.
low( );
647 for(
int i = 1; i < 100; i++)
650 yv[i] = yv[i-1] + ( y_range.
high() - y_range.
low() )/99;
670 const vector< AxisTick > & x_ticks = axisModelX.
getTicks();
671 const vector< AxisTick > & y_ticks = axisModelY.
getTicks();
673 unsigned int nxpoints = 100;
674 unsigned int nypoints = 100;
675 vector< double > xv(100), yv(100);
677 double user_x, user_y;
678 Color grey( 180, 180, 180 );
685 if ( x_ticks.empty () ==
true || y_ticks.empty () == true )
689 double dx = ( x_range.
high() - x_range.
low() ) / ( nxpoints - 1 );
690 double dy = ( y_range.
high() - y_range.
low() ) / ( nypoints - 1 ) ;
696 for (
unsigned int i = ( x_range.
low() == x_ticks[0].value() )?1:0;
697 i < x_ticks.size(); i++ )
699 user_x = x_ticks[ i ].value();
701 for (
unsigned int j = 0; j < nypoints; j++ )
703 user_y = y_range.
low() + j * dy;
719 for (
unsigned int j = ( y_range.
low() == y_ticks[0].value() )?1:0;
720 j < y_ticks.size(); j++ )
722 user_y = y_ticks[ j ].value();
724 for (
unsigned int i = 0; i < nxpoints; i++ )
726 user_x = x_range.
low() + i * dx;
750 const vector< AxisTick > & ticks = axisModelX.
getTicks();
751 if ( ticks.empty() == true )
return;
756 unsigned int size = 4 * ticks.size();
764 double tick_length = 0.05 * view_rect.
getHeight();
765 tick_length = min ( tick_length, 8. );
768 for (
unsigned int i = 0; i < ticks.size(); i++ )
770 double user_x_start = ticks[i].value ();
771 double user_x_temp = user_x_start;
773 double user_by_start = yrange.
low();
774 double user_ty_start = yrange.
high();
777 t.
transform ( user_x_start, user_by_start );
778 t.
transform ( user_x_temp, user_ty_start );
781 double view_by_start = view.
userToDrawY ( user_by_start );
782 double view_ty_start = view.
userToDrawY ( user_ty_start );
784 double view_x_end = view_x_start;
785 double view_by_end = view_by_start - tick_length;
786 double view_ty_end = view_ty_start + tick_length;
789 if( isfinite( view_x_start ) &&
790 isfinite( view_by_start ) &&
791 isfinite( view_ty_start ) &&
792 isfinite( view_x_start ) &&
793 isfinite( view_by_end ) )
795 if( finite( view_x_start ) &&
796 finite( view_by_start ) &&
797 finite( view_ty_start ) &&
798 finite( view_x_start ) &&
799 finite( view_by_end ) )
802 xv.push_back( view_x_start );
803 yv.push_back( view_by_start );
804 xv.push_back( view_x_end );
805 yv.push_back( view_by_end );
807 xv.push_back( view_x_start );
808 yv.push_back( view_ty_start );
809 xv.push_back( view_x_end );
810 yv.push_back( view_ty_end );
830 double tick_length = 0.05 * draw_rect.
getWidth ();
831 tick_length = min ( tick_length, 8. );
836 const vector< AxisTick > & ticks = axisModelY.
getTicks ();
837 unsigned int size = ticks.size ();
839 if ( size == 0 )
return;
851 for (
unsigned int i = 0; i < ticks.size(); i++ )
853 double user_lx_start = xrange.
low();
854 double user_rx_start = xrange.
high();
855 double user_y_start = ticks[i].value();
856 double user_y_temp = user_y_start;
859 t.
transform( user_lx_start, user_y_start );
860 t.
transform( user_rx_start, user_y_temp );
862 double view_lx_start = view.
userToDrawX( user_lx_start );
863 double view_rx_start = view.
userToDrawX( user_rx_start );
864 double view_y_start = view.
userToDrawY( user_y_start );
866 double view_lx_end = view_lx_start + tick_length;
867 double view_rx_end = view_rx_start - tick_length;
868 double view_y_end = view_y_start;
871 if( isfinite( view_lx_start ) &&
872 isfinite( view_y_start ) &&
873 isfinite( view_lx_start ) &&
874 isfinite( view_y_end ) )
876 if( finite( view_lx_start ) &&
877 finite( view_y_start ) &&
878 finite( view_lx_start ) &&
879 finite( view_y_end ) )
882 xv.push_back( view_lx_start );
883 yv.push_back( view_y_start );
884 xv.push_back( view_lx_end );
885 yv.push_back( view_y_end );
887 xv.push_back( view_rx_start );
888 yv.push_back( view_y_start );
889 xv.push_back( view_rx_end );
890 yv.push_back( view_y_end );
912 if ( zAxisModel != 0 )
setZFontSize ( *zAxisModel, view );
922 double padding = 1.0;
924 vector < double > xv;
925 vector < double > yv;
927 const vector < AxisTick > & ticks = axisModelX.
getTicks ();
928 unsigned int size = ticks.size ();
929 if ( size == 0 )
return;
936 for (
unsigned int i = 0; i <
size; i++ ){
937 xv.push_back ( ticks[i].value () );
938 yv.push_back ( yrange.
low() );
948 float y = margin.
getY ();
953 y = margin.getY () + margin.getHeight ();
961 int mid = ticks.size()/2;
962 ref = ticks[mid].value();
963 double range = ticks[mid+1].value()-ref;
965 sprintf(cstr,
"%.0e", range);
967 string::size_type pos = str.find (
'e' );
968 mag=string( str, pos + 1 );
971 for (
unsigned int i = 0; i < ticks.size(); i++ )
976 double user_x_start = ticks[i].value();
977 double user_y_start = yrange.
low();
979 t.
transform( user_x_start, user_y_start );
982 double view_y_start = view.
userToDrawY( user_y_start );
984 double user_x_end = ticks[i].value ();
986 yrange.
low() + .05 * ( yrange.
high() - yrange.
low() );
991 double view_y_end = view.
userToDrawY( user_y_end );
994 double dx = view_x_end - view_x_start;
995 double dy = view_y_end - view_y_start;
997 double ux = dx / sqrt( dx * dx + dy * dy );
998 double uy = dy / sqrt ( dx * dx + dy * dy );
1003 x = view_x_start - ux * padding;
1004 y = view_y_start - uy * padding;
1009 double diff=ticks[i].value()-ref;
1012 sprintf(pstr,
"%.0e", diff);
1013 const std::string str(pstr);
1014 string::size_type pos = str.find (
'e' );
1015 string m ( str, 0, pos );
1016 string e ( str, pos + 1 );
1018 if (e!=mag && m!=
"0") m+=
"0";
1037 if ( axisModelX.
isLog () == false ) {
1050 double padding = 2.0;
1052 const vector< AxisTick > & ticks = axisModelY.
getTicks ();
1053 unsigned int size = ticks.size ();
1054 if ( size == 0 )
return;
1065 int mid = ticks.size()/2;
1066 ref = ticks[mid].value();
1067 double range = ticks[mid+1].value()-ref;
1069 sprintf(cstr,
"%.0e", range);
1071 string::size_type pos = str.find (
'e' );
1072 mag=string( str, pos + 1 );
1075 for (
unsigned int i = 0; i < ticks.size(); i++ )
1080 double user_x_start = xrange.
low();
1081 double user_y_start = ticks[i].value();
1083 t.
transform( user_x_start, user_y_start );
1085 double view_x_start = view.
userToDrawX( user_x_start );
1086 double view_y_start = view.
userToDrawY( user_y_start );
1089 = xrange.
low() + .05 * ( xrange.
high() - xrange.
low() );
1090 double user_y_end = ticks[i].value ();
1094 double view_x_end = view.
userToDrawX( user_x_end );
1095 double view_y_end = view.
userToDrawY( user_y_end );
1098 double dx = view_x_end - view_x_start;
1099 double dy = view_y_end - view_y_start;
1101 double ux = dx / sqrt( dx * dx + dy * dy );
1102 double uy = dy / sqrt ( dx * dx + dy * dy );
1107 float x = view_x_start - ux * padding;
1108 float y = view_y_start - uy * 1.5;
1113 double diff=ticks[i].value()-ref;
1116 sprintf(pstr,
"%.0e", diff);
1117 const std::string str(pstr);
1118 string::size_type pos = str.find (
'e' );
1119 string m ( str, 0, pos );
1120 string e ( str, pos + 1 );
1122 if (e!=mag && m!=
"0") m+=
"0";
1137 else if ( axisModelY.
needPMag () ){
1139 if ( axisModelY.
isLog () == false ) {
1154 string::size_type pos = label.find (
'e' );
1155 if ( pos == string::npos ) {
1159 double ss_size = 0.9 * font_size;
1160 string m ( label, 0, pos );
1161 string e ( label, pos + 1 );
1164 x += 0.25 * font_size;
1165 y += 0.25 * ss_size;
1166 view.
drawText ( m, x, y, font_size, angle,
'r', yalign );
1168 if ( e[0] ==
'-' ) {
1169 x -= 0.10 * font_size;
1172 view.
drawText ( e, x, y, ss_size, angle,
'l', yalign );
1176 x += 0.25 * font_size;
1177 y += 0.25 * ss_size;
1178 view.
drawText ( m, x, y, font_size, angle,
'r', yalign );
1180 if ( e[0] ==
'-' ) {
1181 x -= 0.10 * font_size;
1184 view.
drawText ( e, x, y, ss_size, angle,
'l', yalign );
1201 string::size_type pos = label.find (
'e' );
1202 if ( pos == string::npos ) {
1203 view.
drawText ( label, x, y, font_size, angle, xalign, yalign );
1207 string m ( label, 0, pos );
1208 string e ( label, pos + 1 );
1212 x = x - 0.40 * font_size * e.size();
1213 view.
drawText ( m, x, y, font_size, angle, xalign, yalign );
1215 if ( e[0] ==
'-' ) {
1216 x -= 0.20 * font_size;
1218 y = y - 0.625 * font_size;
1219 view.
drawText ( e, x, y, 0.9 * font_size, angle,
'l', yalign );
1223 x = x - 0.40 * font_size * e.size();
1224 view.
drawText (m, x, y, font_size, angle, xalign, yalign );
1226 if ( e[0] ==
'-' ) {
1227 x -= 0.20 * font_size;
1229 y = y - 0.625 * font_size;
1230 view.
drawText ( e, x, y, 0.9 * font_size, angle,
'l', yalign );
1239 const std::vector < float > & xv,
1240 const std::vector < float> & yv,
1248 const string & alabel = ticks[0].content();
1249 string::size_type pos = alabel.find (
'e' );
1250 bool sci_notate = pos != string::npos;
1252 if ( sci_notate ==
false ) {
1253 for (
unsigned int i = 0; i < ticks.size(); i++ ) {
1254 view.
drawText ( ticks[i].content(), xv[i], yv[i],
1255 font_size, angle, xalign, yalign );
1259 bool mixed_m =
false;
1260 for (
unsigned int i = 0; i < ticks.size (); i++ ) {
1261 const string & label = ticks[i].content ();
1262 string m ( label, 0, pos );
1263 string e ( label, pos + 1 );
1264 mixed_m |= m !=
"1";
1266 if ( mixed_m ==
true ) {
1269 for (
unsigned int i = 0; i < ticks.size (); i++ ) {
1270 const string & label = ticks[i].content();
1271 string::size_type pos = alabel.find (
'e' );
1272 string m ( label, 0, pos );
1273 string e ( label, pos + 1 );
1276 float x = xv[i] - 0.40 * font_size * e.size();
1277 view.
drawText ( m, x, yv[i], font_size, angle, xalign, yalign );
1279 if ( e[0] ==
'-' ) {
1280 x -= 0.20 * font_size;
1282 float y = yv[i] - 0.625 * font_size;
1283 view.
drawText ( e, x, y, 0.9 * font_size, angle,
'l', yalign );
1287 float x = xv[i] - 0.40 * font_size * e.size();
1288 view.
drawText (m, x, yv[i], font_size, angle, xalign, yalign );
1290 if ( e[0] ==
'-' ) {
1291 x -= 0.20 * font_size;
1293 float y = yv[i] - 0.625 * font_size;
1294 view.
drawText ( e, x, y, 0.9 * font_size, angle,
'l', yalign );
1307 vector < double > xv ( 4 );
1308 vector < double > yv ( 4 );
1319 double xoffset = tp.
xOffset();
1320 double yoffset = tp.
yOffset();
1341 Color grey ( 180, 180, 180 );
1375 assert( font != 0 );
1393 assert( font != 0 );
1411 assert( font != 0 );
1428 assert( font != 0 );