KiCad PCB EDA Suite
arc_assistant.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2017 Kicad Developers, see AUTHORS.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
25 
28 
30 #include <view/view.h>
31 
32 #include <base_units.h>
33 #include <trigo.h>
34 
35 using namespace KIGFX::PREVIEW;
36 
38  EDA_ITEM( NOT_USED ),
39  m_constructMan( aManager ),
40  m_units( aUnits )
41 {
42 }
43 
44 
46 {
47  BOX2I tmp;
48 
49  // no bounding box when no graphic shown
50  if( m_constructMan.IsReset() )
51  return tmp;
52 
53  // this is an edit-time artefact; no reason to try and be smart with the bounding box
54  // (besides, we can't tell the text extents without a view to know what the scale is)
55  tmp.SetMaximum();
56  return tmp;
57 }
58 
59 
66 double getNormDeciDegFromRad( double aRadians )
67 {
68  double degs = RAD2DECIDEG( aRadians );
69 
70  // normalise to +/- 360
71  while( degs < -3600.0 )
72  degs += 3600.0;
73 
74  while( degs > 3600.0 )
75  degs -= 3600.0;
76 
77  return degs;
78 }
79 
80 
81 void ARC_ASSISTANT::ViewDraw( int aLayer, KIGFX::VIEW* aView ) const
82 {
83  KIGFX::GAL& gal = *aView->GetGAL();
84 
85  // not in a position to draw anything
86  if( m_constructMan.IsReset() )
87  return;
88 
89  gal.ResetTextAttributes();
90 
91  const VECTOR2I origin = m_constructMan.GetOrigin();
92 
93  KIGFX::PREVIEW::DRAW_CONTEXT preview_ctx( *aView );
94 
95  // draw first radius line
96  bool dimFirstLine = m_constructMan.GetStep() > ARC_GEOM_MANAGER::SET_START;
97 
99  dimFirstLine );
100 
101  std::vector<wxString> cursorStrings;
102 
104  {
105  // haven't started the angle selection phase yet
106 
107  double initAngle = m_constructMan.GetStartAngle();
108 
109  // draw the radius guide circle
110  preview_ctx.DrawCircle( origin, m_constructMan.GetRadius(), true );
111 
112  double degs = getNormDeciDegFromRad( initAngle );
113 
114  cursorStrings.push_back( DimensionLabel( "r", m_constructMan.GetRadius(), m_units ) );
115  cursorStrings.push_back( DimensionLabel( wxString::FromUTF8( "θ" ), degs,
116  EDA_UNITS::DEGREES ) );
117  }
118  else
119  {
120  preview_ctx.DrawLineWithAngleHighlight( origin, m_constructMan.GetEndRadiusEnd(), false );
121 
122  double start = m_constructMan.GetStartAngle();
123  double subtended = m_constructMan.GetSubtended();
124  double subtendedDeg = getNormDeciDegFromRad( subtended );
125  double endAngleDeg = getNormDeciDegFromRad( start + subtended );
126 
127  // draw dimmed extender line to cursor
128  preview_ctx.DrawLineWithAngleHighlight( origin, m_constructMan.GetLastPoint(), true );
129 
130  cursorStrings.push_back( DimensionLabel( wxString::FromUTF8( "Δθ" ), subtendedDeg,
131  EDA_UNITS::DEGREES ) );
132  cursorStrings.push_back( DimensionLabel( wxString::FromUTF8( "θ" ), endAngleDeg,
133  EDA_UNITS::DEGREES ) );
134  }
135 
136  // place the text next to cursor, on opposite side from radius
138  origin - m_constructMan.GetLastPoint(), cursorStrings,
139  aLayer == LAYER_SELECT_OVERLAY );
140 }
void ViewDraw(int aLayer, KIGFX::VIEW *aView) const override final
Draw the assistance (with reference to the contstruction manager.
Manage the construction of a circular arc though sequential setting of critical points: center,...
ARC_ASSISTANT(const ARC_GEOM_MANAGER &aManager, EDA_UNITS aUnits)
VECTOR2I GetEndRadiusEnd() const
Get the radius of the arc (valid if step >= SET_START)
Implementation of conversion functions that require both schematic and board internal units.
the 3d code uses this value
Definition: typeinfo.h:79
double RAD2DECIDEG(double rad)
Definition: trigo.h:236
GAL * GetGAL() const
Return the #GAL this view is using to draw graphical primitives.
Definition: view.h:189
VECTOR2I GetStartRadiusEnd() const
Get the coordinates of the arc end point.
const ARC_GEOM_MANAGER & m_constructMan
Definition: arc_assistant.h:71
wxString DimensionLabel(const wxString &prefix, double aVal, EDA_UNITS aUnits, bool aIncludeUnits=true)
Get a formatted string showing a dimension to a sane precision with an optional prefix and unit suffi...
double GetStartAngle() const
Get the angle of the vector leading to the end point (valid if step >= SET_ANGLE)
void DrawLineWithAngleHighlight(const VECTOR2I &aStart, const VECTOR2I &aEnd, bool aDeEmphasised)
Draw a straight line on the current layer, with a special highlight when the line angle is a multiple...
void ResetTextAttributes()
Reset text attributes to default styling.
Waiting to lock in the arc start point.
VECTOR2I GetOrigin() const
< Get the center point of the arc (valid when state > SET_ORIGIN)
void SetMaximum()
Definition: box2.h:73
double GetRadius() const
Get the angle of the vector leading to the start point (valid if step >= SET_START)
void DrawCircle(const VECTOR2I &aOrigin, double aRad, bool aDeEmphasised)
Draw a preview circle on the current layer.
A KIGFX::PREVIEW::DRAW_CONTEXT is a wrapper around a GAL and some other settings that makes it easy t...
Definition: draw_context.h:44
EDA_UNITS
Definition: eda_units.h:38
VECTOR2I GetLastPoint() const
Get the last point added (locked in or not).
const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
double getNormDeciDegFromRad(double aRadians)
Get deci-degrees from radians, normalised to +/- 360.
ARC_STEPS GetStep() const
Get the current step the manager is on (useful when drawing something depends on the current state)
currently selected items overlay
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:150
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:67
void DrawTextNextToCursor(KIGFX::VIEW *aView, const VECTOR2D &aCursorPos, const VECTOR2D &aTextQuadrant, const std::vector< wxString > &aStrings, bool aDrawingDropShadows)
Draw strings next to the cursor.
Abstract interface for drawing on a 2D-surface.