KiCad PCB EDA Suite
KIGFX::GERBVIEW_PAINTER Class Reference

Class GERBVIEW_PAINTER Contains methods for drawing GerbView-specific items. More...

#include <gerbview_painter.h>

Inheritance diagram for KIGFX::GERBVIEW_PAINTER:
KIGFX::PAINTER

Public Member Functions

 GERBVIEW_PAINTER (GAL *aGal)
 
virtual void ApplySettings (const RENDER_SETTINGS *aSettings) override
 Function ApplySettings Loads colors and display modes settings that are going to be used when drawing items. More...
 
virtual GERBVIEW_RENDER_SETTINGSGetSettings () override
 Function GetSettings Returns pointer to current settings that are going to be used when drawing items. More...
 
virtual bool Draw (const VIEW_ITEM *aItem, int aLayer) override
 Function Draw Takes an instance of VIEW_ITEM and passes it to a function that know how to draw the item. More...
 
void SetGAL (GAL *aGal)
 Function SetGAL Changes Graphics Abstraction Layer used for drawing items for a new one. More...
 

Protected Member Functions

void draw (GERBER_DRAW_ITEM *aVia, int aLayer)
 
void drawPolygon (GERBER_DRAW_ITEM *aParent, SHAPE_POLY_SET &aPolygon, bool aFilled)
 Helper routine to draw a polygon. More...
 
void drawFlashedShape (GERBER_DRAW_ITEM *aItem, bool aFilled)
 Helper to draw a flashed shape (aka spot) More...
 
void drawApertureMacro (GERBER_DRAW_ITEM *aParent, bool aFilled)
 Helper to draw an aperture macro shape. More...
 
int getLineThickness (int aActualThickness) const
 Function getLineThickness() Get the thickness to draw for a line (e.g. More...
 

Protected Attributes

GERBVIEW_RENDER_SETTINGS m_gerbviewSettings
 
GALm_gal
 Instance of graphic abstraction layer that gives an interface to call commands used to draw (eg. More...
 
COLOR4D m_brightenedColor
 Color of brightened item frame. More...
 

Detailed Description

Class GERBVIEW_PAINTER Contains methods for drawing GerbView-specific items.

Definition at line 157 of file gerbview_painter.h.

Constructor & Destructor Documentation

GERBVIEW_PAINTER::GERBVIEW_PAINTER ( GAL aGal)

Definition at line 149 of file gerbview_painter.cpp.

149  :
150  PAINTER( aGal )
151 {
152 }
PAINTER(GAL *aGal)
Constructor PAINTER( GAL* ) initializes this object for painting on any of the polymorphic GRAPHICS_A...
Definition: painter.cpp:68

Member Function Documentation

virtual void KIGFX::GERBVIEW_PAINTER::ApplySettings ( const RENDER_SETTINGS aSettings)
inlineoverridevirtual

Function ApplySettings Loads colors and display modes settings that are going to be used when drawing items.

Parameters
aSettingsare settings to be applied.

Implements KIGFX::PAINTER.

Definition at line 163 of file gerbview_painter.h.

164  {
165  m_gerbviewSettings = *static_cast<const GERBVIEW_RENDER_SETTINGS*>( aSettings );
166  }
GERBVIEW_RENDER_SETTINGS m_gerbviewSettings
bool GERBVIEW_PAINTER::Draw ( const VIEW_ITEM aItem,
int  aLayer 
)
overridevirtual

Function Draw Takes an instance of VIEW_ITEM and passes it to a function that know how to draw the item.

Parameters
aItemis an item to be drawn.
aLayertells which layer is currently rendered so that draw functions may know what to draw (eg. for pads there are separate layers for holes, because they have other dimensions then the pad itself.

Implements KIGFX::PAINTER.

Definition at line 168 of file gerbview_painter.cpp.

References draw(), GERBER_DRAW_ITEM_T, and EDA_ITEM::Type().

169 {
170  const EDA_ITEM* item = static_cast<const EDA_ITEM*>( aItem );
171 
172  // the "cast" applied in here clarifies which overloaded draw() is called
173  switch( item->Type() )
174  {
175  case GERBER_DRAW_ITEM_T:
176  draw( static_cast<GERBER_DRAW_ITEM*>( const_cast<EDA_ITEM*>( item ) ), aLayer );
177  break;
178 
179  default:
180  // Painter does not know how to draw the object
181  return false;
182  }
183 
184  return true;
185 }
KICAD_T Type() const
Function Type()
Definition: base_struct.h:198
void draw(GERBER_DRAW_ITEM *aVia, int aLayer)
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:151
void GERBVIEW_PAINTER::draw ( GERBER_DRAW_ITEM aVia,
int  aLayer 
)
protected

Definition at line 190 of file gerbview_painter.cpp.

References VECTOR2< T >::Angle(), APT_RECT, KIGFX::GAL::BitmapText(), color, GERBER_DRAW_ITEM::ConvertSegmentToPolygon(), SHAPE_POLY_SET::COutline(), KIGFX::GAL::DrawArcSegment(), KIGFX::GAL::DrawCircle(), drawFlashedShape(), KIGFX::GAL::DrawPolygon(), drawPolygon(), KIGFX::GAL::DrawPolyline(), KIGFX::GAL::DrawRectangle(), KIGFX::GAL::DrawSegment(), GBR_ARC, GBR_CIRCLE, GBR_POLYGON, GBR_SEGMENT, GBR_SPOT_CIRCLE, GBR_SPOT_MACRO, GBR_SPOT_OVAL, GBR_SPOT_POLY, GBR_SPOT_RECT, GERBER_DRAW_ITEM::GetABPosition(), KIGFX::GERBVIEW_RENDER_SETTINGS::GetColor(), GERBER_DRAW_ITEM::GetDcodeDescr(), BOX2< Vec >::GetEnd(), GERBER_DRAW_ITEM::GetLayerPolarity(), GetLineLength(), BOX2< Vec >::GetOrigin(), GetSettings(), GERBER_DRAW_ITEM::GetTextD_CodePrms(), GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, EDA_ITEM::IsBrightened(), IsDCodeLayer(), SHAPE_POLY_SET::Iterate(), GERBER_DRAW_ITEM::m_ArcCentre, GERBER_DRAW_ITEM::m_DCode, GERBER_DRAW_ITEM::m_End, KIGFX::PAINTER::m_gal, GERBER_DRAW_ITEM::m_GerberImageFile, m_gerbviewSettings, GERBER_FILE_IMAGE::m_ImageNegative, KIGFX::GERBVIEW_RENDER_SETTINGS::m_lineFill, KIGFX::RENDER_SETTINGS::m_outlineWidth, GERBER_DRAW_ITEM::m_Polygon, KIGFX::GERBVIEW_RENDER_SETTINGS::m_polygonFill, GERBER_DRAW_ITEM::m_Shape, D_CODE::m_Shape, GERBER_DRAW_ITEM::m_Size, KIGFX::GERBVIEW_RENDER_SETTINGS::m_spotFill, GERBER_DRAW_ITEM::m_Start, SHAPE_POLY_SET::OutlineCount(), KIGFX::GAL::SetFillColor(), KIGFX::GAL::SetFontBold(), KIGFX::GAL::SetFontItalic(), KIGFX::GAL::SetGlyphSize(), KIGFX::GAL::SetHorizontalJustify(), KIGFX::GAL::SetIsFill(), KIGFX::GAL::SetIsStroke(), KIGFX::GAL::SetLineWidth(), KIGFX::GAL::SetNegativeDrawMode(), KIGFX::GAL::SetStrokeColor(), KIGFX::GAL::SetTextMirrored(), KIGFX::GAL::SetVerticalJustify(), and GERBER_DRAW_ITEM::ViewBBox().

Referenced by Draw().

191 {
192  VECTOR2D start( aItem->GetABPosition( aItem->m_Start ) ); // TODO(JE) Getter
193  VECTOR2D end( aItem->GetABPosition( aItem->m_End ) ); // TODO(JE) Getter
194  int width = aItem->m_Size.x; // TODO(JE) Getter
195  bool isFilled = true;
196  COLOR4D color;
197  // TODO(JE) This doesn't actually work properly for ImageNegative
198  bool isNegative = ( aItem->GetLayerPolarity() ^ aItem->m_GerberImageFile->m_ImageNegative );
199 
200  // Draw DCODE overlay text
201  if( IsDCodeLayer( aLayer ) )
202  {
203  wxString codeText;
204  VECTOR2D textPosition;
205  double textSize;
206  double orient;
207 
208  if( !aItem->GetTextD_CodePrms( textSize, textPosition, orient ) )
209  return;
210 
211  color = m_gerbviewSettings.GetColor( aItem, aLayer );
212  codeText.Printf( "D%d", aItem->m_DCode );
213 
214  m_gal->SetIsStroke( true );
215  m_gal->SetIsFill( false );
216  m_gal->SetStrokeColor( color );
217  m_gal->SetFillColor( COLOR4D( 0, 0, 0, 0 ) );
218  m_gal->SetLineWidth( 2 );
219  m_gal->SetFontBold( false );
220  m_gal->SetFontItalic( false );
221  m_gal->SetTextMirrored( false );
222  m_gal->SetGlyphSize( VECTOR2D( textSize, textSize) );
225  m_gal->BitmapText( codeText, textPosition, orient );
226 
227  return;
228  }
229 
230  color = m_gerbviewSettings.GetColor( aItem, aLayer );
231 
232  // TODO: Should brightened color be a preference?
233  if( aItem->IsBrightened() )
234  color = COLOR4D( 0.0, 1.0, 0.0, 0.75 );
235 
236  m_gal->SetNegativeDrawMode( isNegative );
237  m_gal->SetStrokeColor( color );
238  m_gal->SetFillColor( color );
239  m_gal->SetIsFill( isFilled );
240  m_gal->SetIsStroke( !isFilled );
241 
242  switch( aItem->m_Shape )
243  {
244  case GBR_POLYGON:
245  {
247  m_gal->SetIsFill( isFilled );
248  m_gal->SetIsStroke( !isFilled );
249 
250  if( isNegative && !isFilled )
251  {
252  m_gal->SetNegativeDrawMode( false );
253  m_gal->SetStrokeColor( GetSettings()->GetColor( aItem, aLayer ) );
254  }
255 
256  if( !isFilled )
258 
259  SHAPE_POLY_SET absolutePolygon = aItem->m_Polygon;
260 
261  for( auto it = absolutePolygon.Iterate( 0 ); it; ++it )
262  *it = aItem->GetABPosition( *it );
263 
264  if( !isFilled )
265  m_gal->DrawPolyline( absolutePolygon.COutline( 0 ) );
266  else
267  m_gal->DrawPolygon( absolutePolygon );
268  break;
269  }
270 
271  case GBR_CIRCLE:
272  {
273  isFilled = m_gerbviewSettings.m_lineFill;
274  double radius = GetLineLength( aItem->m_Start, aItem->m_End );
275  m_gal->DrawCircle( start, radius );
276  break;
277  }
278 
279  case GBR_ARC:
280  {
281  isFilled = m_gerbviewSettings.m_lineFill;
282 
283  // These are swapped because wxDC fills arcs counterclockwise and GAL
284  // fills them clockwise.
285  wxPoint arcStart = aItem->m_End;
286  wxPoint arcEnd = aItem->m_Start;
287 
288  // Gerber arcs are 3-point (start, center, end)
289  // GAL needs center, radius, start angle, end angle
290  double radius = GetLineLength( arcStart, aItem->m_ArcCentre );
291  VECTOR2D center = aItem->GetABPosition( aItem->m_ArcCentre );
292  VECTOR2D startVec = VECTOR2D( aItem->GetABPosition( arcStart ) ) - center;
293  VECTOR2D endVec = VECTOR2D( aItem->GetABPosition( arcEnd ) ) - center;
294 
295  m_gal->SetIsFill( isFilled );
296  m_gal->SetIsStroke( !isFilled );
297  m_gal->SetLineWidth( isFilled ? width : m_gerbviewSettings.m_outlineWidth );
298 
299  double startAngle = startVec.Angle();
300  double endAngle = endVec.Angle();
301 
302  // GAL fills in direction of increasing angle, so we have to convert
303  // the angle from the -PI to PI domain of atan2() to ensure that
304  // the arc goes in the right direction
305  if( startAngle > endAngle )
306  endAngle += (2 * M_PI);
307 
308  // 360-degree arcs are stored in the file with start equal to end
309  if( arcStart == arcEnd )
310  {
311  startAngle = 0;
312  endAngle = 2 * M_PI;
313  }
314 
315  m_gal->DrawArcSegment( center, radius, startAngle, endAngle, width );
316 
317  // Arc Debugging
318  // m_gal->SetLineWidth( 5 );
319  // m_gal->SetStrokeColor( COLOR4D( 0.0, 1.0, 0.0, 1.0 ) );
320  // m_gal->DrawLine( center, aItem->GetABPosition( arcStart ) );
321  // m_gal->SetStrokeColor( COLOR4D( 1.0, 0.0, 0.0, 1.0 ) );
322  // m_gal->DrawLine( center, aItem->GetABPosition( arcEnd ) );
323  break;
324  }
325 
326  case GBR_SPOT_CIRCLE:
327  case GBR_SPOT_RECT:
328  case GBR_SPOT_OVAL:
329  case GBR_SPOT_POLY:
330  case GBR_SPOT_MACRO:
331  {
332  isFilled = m_gerbviewSettings.m_spotFill;
333  drawFlashedShape( aItem, isFilled );
334  break;
335  }
336 
337  case GBR_SEGMENT:
338  {
339  /* Plot a line from m_Start to m_End.
340  * Usually, a round pen is used, but some gerber files use a rectangular pen
341  * In fact, any aperture can be used to plot a line.
342  * currently: only a square pen is handled (I believe using a polygon gives a strange plot).
343  */
344  isFilled = m_gerbviewSettings.m_lineFill;
345  m_gal->SetIsFill( isFilled );
346  m_gal->SetIsStroke( !isFilled );
347 
348  if( isNegative && !isFilled )
349  m_gal->SetStrokeColor( GetSettings()->GetColor( aItem, aLayer ) );
350 
351  // TODO(JE) Refactor this to allow const aItem
352  D_CODE* code = aItem->GetDcodeDescr();
353  if( code && code->m_Shape == APT_RECT )
354  {
355  if( aItem->m_Polygon.OutlineCount() == 0 )
356  aItem->ConvertSegmentToPolygon();
357  drawPolygon( aItem, aItem->m_Polygon, isFilled );
358  }
359  else
360  {
361  if( !isFilled )
363 
364  m_gal->DrawSegment( start, end, width );
365  }
366  break;
367  }
368 
369  default:
370  wxASSERT_MSG( false, wxT( "GERBER_DRAW_ITEM shape is unknown!" ) );
371  break;
372  }
373 
374  // Enable for bounding box debugging
375  #if 0
376  const BOX2I& bb = aItem->ViewBBox();
377  m_gal->SetIsStroke( true );
378  m_gal->SetIsFill( true );
379  m_gal->SetLineWidth( 3 );
380  m_gal->SetStrokeColor( COLOR4D(0.9, 0.9, 0, 0.4) );
381  m_gal->SetFillColor( COLOR4D(0.9, 0.9, 0, 0.1) );
382  m_gal->DrawRectangle( bb.GetOrigin(), bb.GetEnd() );
383  #endif
384 }
GERBVIEW_RENDER_SETTINGS m_gerbviewSettings
const Vec & GetOrigin() const
Definition: box2.h:191
virtual void SetFillColor(const COLOR4D &aColor)
Set the fill color.
void SetFontItalic(const bool aItalic)
Set italic property of current font.
virtual void DrawPolyline(const std::deque< VECTOR2D > &aPointList)
Draw a polyline.
virtual const COLOR4D & GetColor(const VIEW_ITEM *aItem, int aLayer) const override
Function GetColor Returns the color that should be used to draw the specific VIEW_ITEM on the specifi...
virtual void DrawRectangle(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a rectangle.
bool IsDCodeLayer(int aLayer)
double GetLineLength(const wxPoint &aPointA, const wxPoint &aPointB)
Function GetLineLength returns the length of a line segment defined by aPointA and aPointB...
Definition: trigo.h:191
void drawPolygon(GERBER_DRAW_ITEM *aParent, SHAPE_POLY_SET &aPolygon, bool aFilled)
Helper routine to draw a polygon.
float m_outlineWidth
Line width used when drawing outlines.
Definition: painter.h:269
virtual void BitmapText(const wxString &aText, const VECTOR2D &aPosition, double aRotationAngle)
Draws a text using a bitmap font.
APERTURE_T m_Shape
shape ( Line, rectangle, circle , oval .. )
Definition: dcode.h:95
const Vec GetEnd() const
Definition: box2.h:193
int color
Definition: DXF_plotter.cpp:62
bool m_lineFill
Flag determining if lines should be drawn with fill.
void drawFlashedShape(GERBER_DRAW_ITEM *aItem, bool aFilled)
Helper to draw a flashed shape (aka spot)
ITERATOR Iterate(int aFirst, int aLast, bool aIterateHoles=false)
Function Iterate returns an object to iterate through the points of the polygons between aFirst and a...
bool m_spotFill
Flag determining if spots should be drawn with fill.
Definition: dcode.h:52
GAL * m_gal
Instance of graphic abstraction layer that gives an interface to call commands used to draw (eg...
Definition: painter.h:342
void SetFontBold(const bool aBold)
Set bold property of current font.
double Angle() const
Function Angle computes the angle of the vector.
Definition: vector2d.h:306
virtual void SetLineWidth(double aLineWidth)
Set the line width.
virtual void DrawSegment(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint, double aWidth)
Draw a rounded segment.
VECTOR2< double > VECTOR2D
Definition: vector2d.h:586
virtual void SetIsFill(bool aIsFillEnabled)
Enable/disable fill.
Class SHAPE_POLY_SET.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
void SetTextMirrored(const bool aMirrored)
Set a mirrored property of text.
void SetVerticalJustify(const EDA_TEXT_VJUSTIFY_T aVerticalJustify)
Set the vertical justify for text drawing.
virtual void SetStrokeColor(const COLOR4D &aColor)
Set the stroke color.
virtual GERBVIEW_RENDER_SETTINGS * GetSettings() override
Function GetSettings Returns pointer to current settings that are going to be used when drawing items...
bool m_polygonFill
Flag determining if polygons should be drawn with fill.
virtual void DrawPolygon(const std::deque< VECTOR2D > &aPointList)
Draw a polygon.
Class D_CODE holds a gerber DCODE (also called Aperture) definition.
Definition: dcode.h:82
virtual void DrawCircle(const VECTOR2D &aCenterPoint, double aRadius)
Draw a circle using world coordinates.
void SetGlyphSize(const VECTOR2D aGlyphSize)
Set the font glyph size.
virtual void DrawArcSegment(const VECTOR2D &aCenterPoint, double aRadius, double aStartAngle, double aEndAngle, double aWidth)
Draw an arc segment.
void SetHorizontalJustify(const EDA_TEXT_HJUSTIFY_T aHorizontalJustify)
Set the horizontal justify for text drawing.
virtual void SetIsStroke(bool aIsStrokeEnabled)
Enable/disable stroked outlines.
virtual void SetNegativeDrawMode(bool aSetting)
Sets negative draw mode in the renderer.
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39
void GERBVIEW_PAINTER::drawApertureMacro ( GERBER_DRAW_ITEM aParent,
bool  aFilled 
)
protected

Helper to draw an aperture macro shape.

Definition at line 543 of file gerbview_painter.cpp.

References SHAPE_POLY_SET::COutline(), KIGFX::GAL::DrawPolygon(), KIGFX::GAL::DrawPolyline(), APERTURE_MACRO::GetApertureMacroShape(), GERBER_DRAW_ITEM::GetDcodeDescr(), D_CODE::GetMacro(), i, KIGFX::PAINTER::m_gal, m_gerbviewSettings, KIGFX::RENDER_SETTINGS::m_outlineWidth, KIGFX::GERBVIEW_RENDER_SETTINGS::m_polygonFill, GERBER_DRAW_ITEM::m_Start, KIGFX::GERBVIEW_RENDER_SETTINGS::MAX_FONT_SIZE, SHAPE_POLY_SET::OutlineCount(), and KIGFX::GAL::SetLineWidth().

Referenced by drawFlashedShape().

544 {
545  D_CODE* code = aParent->GetDcodeDescr();
546  APERTURE_MACRO* macro = code->GetMacro();
547 
548  SHAPE_POLY_SET* macroShape = macro->GetApertureMacroShape( aParent, aParent->m_Start );
549 
552 
553  if( !aFilled )
554  {
555  for( int i = 0; i < macroShape->OutlineCount(); i++ )
556  m_gal->DrawPolyline( macroShape->COutline( i ) );
557  }
558  else
559  m_gal->DrawPolygon( *macroShape );
560 }
GERBVIEW_RENDER_SETTINGS m_gerbviewSettings
virtual void DrawPolyline(const std::deque< VECTOR2D > &aPointList)
Draw a polyline.
float m_outlineWidth
Line width used when drawing outlines.
Definition: painter.h:269
int OutlineCount() const
Returns the number of outlines in the set
GAL * m_gal
Instance of graphic abstraction layer that gives an interface to call commands used to draw (eg...
Definition: painter.h:342
D_CODE * GetDcodeDescr() const
Function GetDcodeDescr returns the GetDcodeDescr of this object, or NULL.
SHAPE_POLY_SET * GetApertureMacroShape(const GERBER_DRAW_ITEM *aParent, wxPoint aShapePos)
Function GetApertureMacroShape Calculate the primitive shape for flashed items.
virtual void SetLineWidth(double aLineWidth)
Set the line width.
Class SHAPE_POLY_SET.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
bool m_polygonFill
Flag determining if polygons should be drawn with fill.
virtual void DrawPolygon(const std::deque< VECTOR2D > &aPointList)
Draw a polygon.
Class D_CODE holds a gerber DCODE (also called Aperture) definition.
Definition: dcode.h:82
size_t i
Definition: json11.cpp:597
APERTURE_MACRO * GetMacro() const
Definition: dcode.h:157
Struct APERTURE_MACRO helps support the "aperture macro" defined within standard RS274X.
Definition: am_primitive.h:163
void GERBVIEW_PAINTER::drawFlashedShape ( GERBER_DRAW_ITEM aItem,
bool  aFilled 
)
protected

Helper to draw a flashed shape (aka spot)

Definition at line 407 of file gerbview_painter.cpp.

References APT_DEF_NO_HOLE, D_CODE::ConvertShapeToPolygon(), delta, drawApertureMacro(), KIGFX::GAL::DrawCircle(), drawPolygon(), KIGFX::GAL::DrawRectangle(), KIGFX::GAL::DrawSegment(), GBR_SPOT_CIRCLE, GBR_SPOT_MACRO, GBR_SPOT_OVAL, GBR_SPOT_POLY, GBR_SPOT_RECT, GERBER_DRAW_ITEM::GetABPosition(), GERBER_DRAW_ITEM::GetDcodeDescr(), D_CODE::m_DrillShape, KIGFX::PAINTER::m_gal, m_gerbviewSettings, KIGFX::RENDER_SETTINGS::m_outlineWidth, D_CODE::m_Polygon, GERBER_DRAW_ITEM::m_Shape, D_CODE::m_Size, GERBER_DRAW_ITEM::m_Start, SHAPE_POLY_SET::Move(), SHAPE_POLY_SET::OutlineCount(), KIGFX::GAL::SetIsFill(), KIGFX::GAL::SetIsStroke(), KIGFX::GAL::SetLineWidth(), wxPoint::x, and wxPoint::y.

Referenced by draw().

408 {
409  D_CODE* code = aItem->GetDcodeDescr();
410 
411  wxASSERT_MSG( code, wxT( "drawFlashedShape: Item has no D_CODE!" ) );
412 
413  if( !code )
414  return;
415 
416  m_gal->SetIsFill( aFilled );
417  m_gal->SetIsStroke( !aFilled );
419 
420  switch( aItem->m_Shape )
421  {
422  case GBR_SPOT_CIRCLE:
423  {
424  int radius = code->m_Size.x >> 1;
425  VECTOR2D start( aItem->GetABPosition( aItem->m_Start ) );
426 
427  if( !aFilled )
428  {
429  m_gal->DrawCircle( start, radius );
430  }
431  else
432  {
433  if( code->m_DrillShape == APT_DEF_NO_HOLE )
434  {
435  m_gal->DrawCircle( start, radius );
436  }
437  else // rectangular hole
438  {
439  if( code->m_Polygon.OutlineCount() == 0 )
440  code->ConvertShapeToPolygon();
441 
442  SHAPE_POLY_SET poly = code->m_Polygon;
443  poly.Move( aItem->m_Start );
444 
445  drawPolygon( aItem, poly, aFilled );
446  }
447  }
448  break;
449  }
450 
451  case GBR_SPOT_RECT:
452  {
453  wxPoint codeStart;
454  wxPoint aShapePos = aItem->m_Start;
455  codeStart.x = aShapePos.x - code->m_Size.x / 2;
456  codeStart.y = aShapePos.y - code->m_Size.y / 2;
457  wxPoint codeEnd = codeStart + code->m_Size;
458  codeStart = aItem->GetABPosition( codeStart );
459  codeEnd = aItem->GetABPosition( codeEnd );
460 
461  if( !aFilled || code->m_DrillShape == APT_DEF_NO_HOLE )
462  {
463  m_gal->DrawRectangle( VECTOR2D( codeStart ), VECTOR2D( codeEnd ) );
464  }
465  else
466  {
467  if( code->m_Polygon.OutlineCount() == 0 )
468  code->ConvertShapeToPolygon();
469 
470  SHAPE_POLY_SET poly = code->m_Polygon;
471  poly.Move( aItem->m_Start );
472 
473  drawPolygon( aItem, poly, aFilled );
474  }
475  break;
476  }
477 
478  case GBR_SPOT_OVAL:
479  {
480  int radius = 0;
481 
482  wxPoint codeStart = aItem->m_Start;
483  wxPoint codeEnd = aItem->m_Start;
484 
485  if( code->m_Size.x > code->m_Size.y ) // horizontal oval
486  {
487  int delta = (code->m_Size.x - code->m_Size.y) / 2;
488  codeStart.x -= delta;
489  codeEnd.x += delta;
490  radius = code->m_Size.y;
491  }
492  else // horizontal oval
493  {
494  int delta = (code->m_Size.y - code->m_Size.x) / 2;
495  codeStart.y -= delta;
496  codeEnd.y += delta;
497  radius = code->m_Size.x;
498  }
499 
500  codeStart = aItem->GetABPosition( codeStart );
501  codeEnd = aItem->GetABPosition( codeEnd );
502 
503  if( !aFilled || code->m_DrillShape == APT_DEF_NO_HOLE )
504  {
505  m_gal->DrawSegment( codeStart, codeEnd, radius );
506  }
507  else
508  {
509  if( code->m_Polygon.OutlineCount() == 0 )
510  code->ConvertShapeToPolygon();
511 
512  SHAPE_POLY_SET poly = code->m_Polygon;
513  poly.Move( aItem->m_Start );
514 
515  drawPolygon( aItem, poly, aFilled );
516  }
517  break;
518  }
519 
520  case GBR_SPOT_POLY:
521  {
522  if( code->m_Polygon.OutlineCount() == 0 )
523  code->ConvertShapeToPolygon();
524 
525  SHAPE_POLY_SET poly = code->m_Polygon;
526  poly.Move( aItem->m_Start );
527 
528  drawPolygon( aItem, poly, aFilled );
529  break;
530  }
531 
532  case GBR_SPOT_MACRO:
533  drawApertureMacro( aItem, aFilled );
534  break;
535 
536  default:
537  wxASSERT_MSG( false, wxT( "Unknown Gerber flashed shape!" ) );
538  break;
539  }
540 }
GERBVIEW_RENDER_SETTINGS m_gerbviewSettings
virtual void DrawRectangle(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a rectangle.
void drawPolygon(GERBER_DRAW_ITEM *aParent, SHAPE_POLY_SET &aPolygon, bool aFilled)
Helper routine to draw a polygon.
float m_outlineWidth
Line width used when drawing outlines.
Definition: painter.h:269
wxSize m_Size
Horizontal and vertical dimensions.
Definition: dcode.h:94
int OutlineCount() const
Returns the number of outlines in the set
static const int delta[8][2]
Definition: solve.cpp:112
GAL * m_gal
Instance of graphic abstraction layer that gives an interface to call commands used to draw (eg...
Definition: painter.h:342
D_CODE * GetDcodeDescr() const
Function GetDcodeDescr returns the GetDcodeDescr of this object, or NULL.
void drawApertureMacro(GERBER_DRAW_ITEM *aParent, bool aFilled)
Helper to draw an aperture macro shape.
virtual void SetLineWidth(double aLineWidth)
Set the line width.
virtual void DrawSegment(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint, double aWidth)
Draw a rounded segment.
VECTOR2< double > VECTOR2D
Definition: vector2d.h:586
void Move(const VECTOR2I &aVector) override
virtual void SetIsFill(bool aIsFillEnabled)
Enable/disable fill.
Class SHAPE_POLY_SET.
APERTURE_DEF_HOLETYPE m_DrillShape
shape of the hole (0 = no hole, round = 1, rect = 2) */
Definition: dcode.h:98
Class D_CODE holds a gerber DCODE (also called Aperture) definition.
Definition: dcode.h:82
virtual void DrawCircle(const VECTOR2D &aCenterPoint, double aRadius)
Draw a circle using world coordinates.
SHAPE_POLY_SET m_Polygon
Definition: dcode.h:107
void ConvertShapeToPolygon()
Function ConvertShapeToPolygon convert a shape to an equivalent polygon.
Definition: dcode.cpp:303
virtual void SetIsStroke(bool aIsStrokeEnabled)
Enable/disable stroked outlines.
wxPoint GetABPosition(const wxPoint &aXYPosition) const
Function GetABPosition returns the image position of aPosition for this object.
void GERBVIEW_PAINTER::drawPolygon ( GERBER_DRAW_ITEM aParent,
SHAPE_POLY_SET aPolygon,
bool  aFilled 
)
protected

Helper routine to draw a polygon.

Definition at line 387 of file gerbview_painter.cpp.

References SHAPE_POLY_SET::COutline(), KIGFX::GAL::DrawPolygon(), KIGFX::GAL::DrawPolyline(), GERBER_DRAW_ITEM::GetABPosition(), i, SHAPE_POLY_SET::Iterate(), KIGFX::PAINTER::m_gal, m_gerbviewSettings, KIGFX::RENDER_SETTINGS::m_outlineWidth, KIGFX::GERBVIEW_RENDER_SETTINGS::m_polygonFill, SHAPE_POLY_SET::OutlineCount(), and KIGFX::GAL::SetLineWidth().

Referenced by draw(), and drawFlashedShape().

390 {
391  for( auto it = aPolygon.Iterate( 0 ); it; ++it )
392  *it = aParent->GetABPosition( *it );
393 
396 
397  if( !aFilled )
398  {
399  for( int i = 0; i < aPolygon.OutlineCount(); i++ )
400  m_gal->DrawPolyline( aPolygon.COutline( i ) );
401  }
402  else
403  m_gal->DrawPolygon( aPolygon );
404 }
GERBVIEW_RENDER_SETTINGS m_gerbviewSettings
virtual void DrawPolyline(const std::deque< VECTOR2D > &aPointList)
Draw a polyline.
float m_outlineWidth
Line width used when drawing outlines.
Definition: painter.h:269
ITERATOR Iterate(int aFirst, int aLast, bool aIterateHoles=false)
Function Iterate returns an object to iterate through the points of the polygons between aFirst and a...
int OutlineCount() const
Returns the number of outlines in the set
GAL * m_gal
Instance of graphic abstraction layer that gives an interface to call commands used to draw (eg...
Definition: painter.h:342
virtual void SetLineWidth(double aLineWidth)
Set the line width.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
bool m_polygonFill
Flag determining if polygons should be drawn with fill.
virtual void DrawPolygon(const std::deque< VECTOR2D > &aPointList)
Draw a polygon.
size_t i
Definition: json11.cpp:597
wxPoint GetABPosition(const wxPoint &aXYPosition) const
Function GetABPosition returns the image position of aPosition for this object.
int GERBVIEW_PAINTER::getLineThickness ( int  aActualThickness) const
protected

Function getLineThickness() Get the thickness to draw for a line (e.g.

0 thickness lines get a minimum value).

Parameters
aActualThicknessline own thickness
Returns
the thickness to draw

Definition at line 156 of file gerbview_painter.cpp.

References m_gerbviewSettings, and KIGFX::RENDER_SETTINGS::m_outlineWidth.

157 {
158  // if items have 0 thickness, draw them with the outline
159  // width, otherwise respect the set value (which, no matter
160  // how small will produce something)
161  if( aActualThickness == 0 )
163 
164  return aActualThickness;
165 }
GERBVIEW_RENDER_SETTINGS m_gerbviewSettings
float m_outlineWidth
Line width used when drawing outlines.
Definition: painter.h:269
virtual GERBVIEW_RENDER_SETTINGS* KIGFX::GERBVIEW_PAINTER::GetSettings ( )
inlineoverridevirtual

Function GetSettings Returns pointer to current settings that are going to be used when drawing items.

Returns
Current rendering settings.

Implements KIGFX::PAINTER.

Definition at line 169 of file gerbview_painter.h.

Referenced by draw(), and PANEL_GERBVIEW_DISPLAY_OPTIONS::TransferDataFromWindow().

170  {
171  return &m_gerbviewSettings;
172  }
GERBVIEW_RENDER_SETTINGS m_gerbviewSettings
void KIGFX::PAINTER::SetGAL ( GAL aGal)
inlineinherited

Function SetGAL Changes Graphics Abstraction Layer used for drawing items for a new one.

Parameters
aGalis the new GAL instance.

Definition at line 310 of file painter.h.

311  {
312  m_gal = aGal;
313  }
GAL * m_gal
Instance of graphic abstraction layer that gives an interface to call commands used to draw (eg...
Definition: painter.h:342

Member Data Documentation

COLOR4D KIGFX::PAINTER::m_brightenedColor
protectedinherited

Color of brightened item frame.

Definition at line 345 of file painter.h.

GAL* KIGFX::PAINTER::m_gal
protectedinherited

Instance of graphic abstraction layer that gives an interface to call commands used to draw (eg.

DrawLine, DrawCircle, etc.)

Definition at line 342 of file painter.h.

Referenced by draw(), KIGFX::PCB_PAINTER::draw(), drawApertureMacro(), drawFlashedShape(), and drawPolygon().

GERBVIEW_RENDER_SETTINGS KIGFX::GERBVIEW_PAINTER::m_gerbviewSettings
protected

The documentation for this class was generated from the following files: