KiCad PCB EDA Suite
ruler_item.cpp File Reference

Go to the source code of this file.

Classes

struct  TICK_FORMAT
 Description of a "tick format" for a scale factor - how many ticks there are between medium/major ticks and how each scale relates to the last one. More...
 

Functions

static void drawCursorStrings (KIGFX::VIEW *aView, const VECTOR2D &aCursor, const VECTOR2D &aRulerVec, EDA_UNITS_T aUnits)
 
static TICK_FORMAT getTickFormatForScale (double aScale, double &aTickSpace, EDA_UNITS_T aUnits)
 
void drawTicksAlongLine (KIGFX::VIEW *aView, const VECTOR2D &aOrigin, const VECTOR2D &aLine, double aMinorTickLen, EDA_UNITS_T aUnits)
 Draw labelled ticks on a line. More...
 
void drawBacksideTicks (KIGFX::GAL &aGal, const VECTOR2D &aOrigin, const VECTOR2D &aLine, double aTickLen, int aNumDivisions)
 Draw simple ticks on the back of a line such that the line is divided into n parts. More...
 

Variables

static const double maxTickDensity = 10.0
 
static const double midTickLengthFactor = 1.5
 
static const double majorTickLengthFactor = 2.5
 

Function Documentation

void drawBacksideTicks ( KIGFX::GAL aGal,
const VECTOR2D aOrigin,
const VECTOR2D aLine,
double  aTickLen,
int  aNumDivisions 
)

Draw simple ticks on the back of a line such that the line is divided into n parts.

Parameters
aGalthe GAL to draw on
aOriginstart of line to draw ticks on
aLineline vector
aTickLenlength of ticks in IU
aNumDivisionsnumber of parts to divide the line into

Definition at line 197 of file ruler_item.cpp.

References KIGFX::GAL::DrawLine(), VECTOR2< T >::EuclideanNorm(), i, VECTOR2< T >::Resize(), and VECTOR2< T >::Rotate().

Referenced by KIGFX::PREVIEW::RULER_ITEM::ViewDraw().

199 {
200  const double backTickSpace = aLine.EuclideanNorm() / aNumDivisions;
201  const auto backTickVec = aLine.Rotate( M_PI_2 ).Resize( aTickLen );
202 
203  for( int i = 0; i < aNumDivisions + 1; ++i )
204  {
205  const auto backTickPos = aOrigin + aLine.Resize( backTickSpace * i );
206  aGal.DrawLine( backTickPos, backTickPos + backTickVec );
207  }
208 }
VECTOR2< T > Resize(T aNewLength) const
Function Resize returns a vector of the same direction, but length specified in aNewLength.
Definition: vector2d.h:385
VECTOR2< T > Rotate(double aAngle) const
Function Rotate rotates the vector by a given angle.
Definition: vector2d.h:370
virtual void DrawLine(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a line.
T EuclideanNorm() const
Destructor.
Definition: vector2d.h:292
size_t i
Definition: json11.cpp:597
static void drawCursorStrings ( KIGFX::VIEW aView,
const VECTOR2D aCursor,
const VECTOR2D aRulerVec,
EDA_UNITS_T  aUnits 
)
static

Definition at line 42 of file ruler_item.cpp.

References VECTOR2< T >::Angle(), DEGREES, KIGFX::PREVIEW::DimensionLabel(), KIGFX::PREVIEW::DrawTextNextToCursor(), VECTOR2< T >::EuclideanNorm(), RAD2DECIDEG(), str, VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by KIGFX::PREVIEW::RULER_ITEM::ViewDraw().

44 {
45  // draw the cursor labels
46  std::vector<wxString> cursorStrings;
47 
48  cursorStrings.push_back( DimensionLabel( "x", aRulerVec.x, aUnits ) );
49  cursorStrings.push_back( DimensionLabel( "y", aRulerVec.y, aUnits ) );
50 
51  cursorStrings.push_back( DimensionLabel( "r", aRulerVec.EuclideanNorm(), aUnits ) );
52 
53  double degs = RAD2DECIDEG( -aRulerVec.Angle() );
54  cursorStrings.push_back( DimensionLabel( wxString::FromUTF8( "θ" ), degs, DEGREES ) );
55 
56  for( auto& str: cursorStrings )
57  {
58  // FIXME: remove spaces that choke OpenGL lp:1668455
59  str.erase( std::remove( str.begin(), str.end(), ' ' ), str.end() );
60  }
61 
62  auto temp = aRulerVec;
63  DrawTextNextToCursor( aView, aCursor, -temp, cursorStrings );
64 }
double RAD2DECIDEG(double rad)
Definition: trigo.h:204
const string & str
Definition: json11.cpp:596
double Angle() const
Function Angle computes the angle of the vector.
Definition: vector2d.h:306
T EuclideanNorm() const
Destructor.
Definition: vector2d.h:292
void DrawTextNextToCursor(KIGFX::VIEW *aView, const VECTOR2D &aCursorPos, const VECTOR2D &aTextQuadrant, const std::vector< wxString > &aStrings)
Draw strings next to the cursor.
wxString DimensionLabel(const wxString &prefix, double aVal, EDA_UNITS_T aUnits)
Get a formatted string showing a dimension to a sane precision with an optional prefix and unit suffi...
void drawTicksAlongLine ( KIGFX::VIEW aView,
const VECTOR2D aOrigin,
const VECTOR2D aLine,
double  aMinorTickLen,
EDA_UNITS_T  aUnits 
)

Draw labelled ticks on a line.

Ticks are spaced according to a maximum density. Miror ticks are not labelled.

Parameters
aGalthe GAL to draw on
aOriginstart of line to draw ticks on
aLineline vector
aMinorTickLenlength of minor ticks in IU

Definition at line 124 of file ruler_item.cpp.

References VECTOR2< T >::Angle(), KIGFX::PREVIEW::DimensionLabel(), VECTOR2< T >::EuclideanNorm(), KIGFX::VIEW::GetGAL(), KIGFX::VIEW::GetPainter(), KIGFX::PAINTER::GetSettings(), getTickFormatForScale(), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_RIGHT, i, LAYER_AUX_ITEMS, TICK_FORMAT::majorStep, majorTickLengthFactor, TICK_FORMAT::midStep, midTickLengthFactor, KIGFX::PREVIEW::PreviewOverlayDeemphAlpha(), VECTOR2< T >::Resize(), and VECTOR2< T >::Rotate().

Referenced by KIGFX::PREVIEW::RULER_ITEM::ViewDraw().

126 {
127  VECTOR2D tickLine = aLine.Rotate( -M_PI_2 );
128  auto gal = aView->GetGAL();
129  double tickSpace;
130  TICK_FORMAT tickF = getTickFormatForScale( gal->GetWorldScale(), tickSpace, aUnits );
131  auto rs = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( aView->GetPainter()->GetSettings() );
132 
133  // number of ticks in whole ruler
134  int numTicks = (int) std::ceil( aLine.EuclideanNorm() / tickSpace );
135 
136  // work out which way up the tick labels go
137  double labelAngle = -tickLine.Angle();
138 
139  if( aLine.Angle() > 0 )
140  {
141  gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_LEFT );
142  }
143  else
144  {
145  gal->SetHorizontalJustify( GR_TEXT_HJUSTIFY_RIGHT );
146  labelAngle += M_PI;
147  }
148 
149  // text and ticks are dimmed
150  gal->SetStrokeColor( rs->GetLayerColor( LAYER_AUX_ITEMS ).WithAlpha( PreviewOverlayDeemphAlpha( true ) ) );
151 
152  const auto labelOffset = tickLine.Resize( aMinorTickLen * ( majorTickLengthFactor + 1 ) );
153 
154  for( int i = 0; i < numTicks; ++i )
155  {
156  const auto tickPos = aOrigin + aLine.Resize( tickSpace * i );
157 
158  double length = aMinorTickLen;
159  bool drawLabel = false;
160 
161  if( i % tickF.majorStep == 0)
162  {
163  drawLabel = true;
164  length *= majorTickLengthFactor;
165  }
166  else if( tickF.midStep && i % tickF.midStep == 0 )
167  {
168  drawLabel = true;
169  length *= midTickLengthFactor;
170  }
171 
172  gal->DrawLine( tickPos, tickPos + tickLine.Resize( length ) );
173 
174  if( drawLabel )
175  {
176  wxString label = DimensionLabel( "", tickSpace * i, aUnits );
177 
178  // FIXME: spaces choke OpenGL lp:1668455
179  label.erase( std::remove( label.begin(), label.end(), ' ' ), label.end() );
180 
181  gal->BitmapText( label, tickPos + labelOffset, labelAngle );
182  }
183  }
184 }
VECTOR2< T > Resize(T aNewLength) const
Function Resize returns a vector of the same direction, but length specified in aNewLength.
Definition: vector2d.h:385
VECTOR2< T > Rotate(double aAngle) const
Function Rotate rotates the vector by a given angle.
Definition: vector2d.h:370
int midStep
ticks between major ticks
Definition: ruler_item.cpp:75
static const double majorTickLengthFactor
Definition: ruler_item.cpp:39
Class PCB_RENDER_SETTINGS Stores PCB specific render settings.
Definition: pcb_painter.h:62
double Angle() const
Function Angle computes the angle of the vector.
Definition: vector2d.h:306
Auxiliary items (guides, rule, etc)
T EuclideanNorm() const
Destructor.
Definition: vector2d.h:292
static TICK_FORMAT getTickFormatForScale(double aScale, double &aTickSpace, EDA_UNITS_T aUnits)
Definition: ruler_item.cpp:79
GAL * GetGAL() const
Function GetGAL() Returns the GAL this view is using to draw graphical primitives.
Definition: view.h:180
static const double midTickLengthFactor
Definition: ruler_item.cpp:38
PAINTER * GetPainter() const
Function GetPainter() Returns the painter object used by the view for drawing VIEW_ITEMS.
Definition: view.h:199
double PreviewOverlayDeemphAlpha(bool aDeemph=true)
Default alpha of "de-emphasised" features (like previously locked-in lines.
virtual RENDER_SETTINGS * GetSettings()=0
Function GetSettings Returns pointer to current settings that are going to be used when drawing items...
size_t i
Definition: json11.cpp:597
Description of a "tick format" for a scale factor - how many ticks there are between medium/major tic...
Definition: ruler_item.cpp:71
wxString DimensionLabel(const wxString &prefix, double aVal, EDA_UNITS_T aUnits)
Get a formatted string showing a dimension to a sane precision with an optional prefix and unit suffi...
int majorStep
multiple from the last scale
Definition: ruler_item.cpp:74
static TICK_FORMAT getTickFormatForScale ( double  aScale,
double &  aTickSpace,
EDA_UNITS_T  aUnits 
)
static

Definition at line 79 of file ruler_item.cpp.

References TICK_FORMAT::divisionBase, INCHES, and maxTickDensity.

Referenced by drawTicksAlongLine().

80 {
81  // simple 1/2/5 scales per decade
82  static std::vector<TICK_FORMAT> tickFormats =
83  {
84  { 2, 10, 5 }, // |....:....|
85  { 2, 5, 0 }, // |....|
86  { 2.5, 2, 0 }, // |.|.|
87  };
88 
89  // could start at a set number of MM, but that's not available in common
90  aTickSpace = 1;
91 
92  // convert to a round (mod-10) number of mils
93  if( aUnits == INCHES )
94  {
95  aTickSpace *= 2.54;
96  }
97 
98  int tickFormat = 0;
99 
100  while( true )
101  {
102  const auto pixelSpace = aTickSpace * aScale;
103 
104  if( pixelSpace >= maxTickDensity )
105  break;
106 
107  tickFormat = ( tickFormat + 1 ) % tickFormats.size();
108  aTickSpace *= tickFormats[tickFormat].divisionBase;
109  }
110 
111  return tickFormats[tickFormat];
112 }
Definition: common.h:160
static const double maxTickDensity
Definition: ruler_item.cpp:37

Variable Documentation

const double majorTickLengthFactor = 2.5
static

Definition at line 39 of file ruler_item.cpp.

Referenced by drawTicksAlongLine(), and KIGFX::PREVIEW::RULER_ITEM::ViewDraw().

const double maxTickDensity = 10.0
static

Definition at line 37 of file ruler_item.cpp.

Referenced by getTickFormatForScale().

const double midTickLengthFactor = 1.5
static

Definition at line 38 of file ruler_item.cpp.

Referenced by drawTicksAlongLine(), and KIGFX::PREVIEW::RULER_ITEM::ViewDraw().