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 aUnits)
 
static TICK_FORMAT getTickFormatForScale (double aScale, double &aTickSpace, EDA_UNITS aUnits)
 
void drawTicksAlongLine (KIGFX::VIEW *aView, const VECTOR2D &aOrigin, const VECTOR2D &aLine, double aMinorTickLen, EDA_UNITS 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

◆ drawBacksideTicks()

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 188 of file ruler_item.cpp.

190 {
191  const double backTickSpace = aLine.EuclideanNorm() / aNumDivisions;
192  const auto backTickVec = aLine.Rotate( M_PI_2 ).Resize( aTickLen );
193 
194  for( int i = 0; i < aNumDivisions + 1; ++i )
195  {
196  const auto backTickPos = aOrigin + aLine.Resize( backTickSpace * i );
197  aGal.DrawLine( backTickPos, backTickPos + backTickVec );
198  }
199 }
#define M_PI_2
Definition: transline.cpp:36
virtual void DrawLine(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a line.
VECTOR2< T > Resize(T aNewLength) const
Function Resize returns a vector of the same direction, but length specified in aNewLength.
Definition: vector2d.h:392
VECTOR2< T > Rotate(double aAngle) const
Function Rotate rotates the vector by a given angle.
Definition: vector2d.h:377
T EuclideanNorm() const
Destructor.
Definition: vector2d.h:299

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

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

◆ drawCursorStrings()

static void drawCursorStrings ( KIGFX::VIEW aView,
const VECTOR2D aCursor,
const VECTOR2D aRulerVec,
EDA_UNITS  aUnits 
)
static

Definition at line 42 of file ruler_item.cpp.

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(
55  DimensionLabel( wxString::FromUTF8( "θ" ), degs, EDA_UNITS::DEGREES ) );
56 
57  auto temp = aRulerVec;
58  DrawTextNextToCursor( aView, aCursor, -temp, cursorStrings );
59 }
wxString DimensionLabel(const wxString &prefix, double aVal, EDA_UNITS aUnits)
Get a formatted string showing a dimension to a sane precision with an optional prefix and unit suffi...
double RAD2DECIDEG(double rad)
Definition: trigo.h:215
void DrawTextNextToCursor(KIGFX::VIEW *aView, const VECTOR2D &aCursorPos, const VECTOR2D &aTextQuadrant, const std::vector< wxString > &aStrings)
Draw strings next to the cursor.
double Angle() const
Function Angle computes the angle of the vector.
Definition: vector2d.h:313
T EuclideanNorm() const
Destructor.
Definition: vector2d.h:299

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

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

◆ drawTicksAlongLine()

void drawTicksAlongLine ( KIGFX::VIEW aView,
const VECTOR2D aOrigin,
const VECTOR2D aLine,
double  aMinorTickLen,
EDA_UNITS  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 119 of file ruler_item.cpp.

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

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, LAYER_AUX_ITEMS, M_PI_2, 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().

◆ getTickFormatForScale()

static TICK_FORMAT getTickFormatForScale ( double  aScale,
double &  aTickSpace,
EDA_UNITS  aUnits 
)
static

Definition at line 74 of file ruler_item.cpp.

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

References TICK_FORMAT::divisionBase, INCHES, and maxTickDensity.

Referenced by drawTicksAlongLine().

Variable Documentation

◆ majorTickLengthFactor

const double majorTickLengthFactor = 2.5
static

Definition at line 39 of file ruler_item.cpp.

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

◆ maxTickDensity

const double maxTickDensity = 10.0
static

Definition at line 37 of file ruler_item.cpp.

Referenced by getTickFormatForScale().

◆ midTickLengthFactor

const double midTickLengthFactor = 1.5
static

Definition at line 38 of file ruler_item.cpp.

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