KiCad PCB EDA Suite
Loading...
Searching...
No Matches
ds_draw_item.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) 1992-2013 Jean-Pierre Charras <jp.charras at wanadoo.fr>.
5 * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26/*
27 * the class DS_DATA_ITEM (and DS_DATA_ITEM_TEXT) defines
28 * a basic shape of a drawing sheet (frame references and title block)
29 * Basic shapes are line, rect and texts
30 * the DS_DATA_ITEM coordinates units is the mm, and are relative to
31 * one of 4 page corners.
32 *
33 * These items cannot be drawn or plot "as this". they should be converted
34 * to a "draw list" (DS_DRAW_ITEM_BASE and derived items)
35
36 * The list of these items is stored in a DS_DATA_MODEL instance.
37 *
38 * When building the draw list:
39 * the DS_DATA_MODEL is used to create a DS_DRAW_ITEM_LIST
40 * coordinates are converted to draw/plot coordinates.
41 * texts are expanded if they contain format symbols.
42 * Items with m_RepeatCount > 1 are created m_RepeatCount times
43 *
44 * the DS_DATA_MODEL is created only once.
45 * the DS_DRAW_ITEM_LIST is created each time the drawing sheet is plotted/drawn
46 *
47 * the DS_DATA_MODEL instance is created from a S expression which
48 * describes the drawing sheet (can be the default drawing sheet or a custom file).
49 */
50
51#include <eda_draw_frame.h>
55#include <base_units.h>
56#include <page_info.h>
57#include <layer_ids.h>
58#include <gr_basic.h>
59#include <trigo.h>
60#include <render_settings.h>
61#include <font/font.h>
62
63
64// ============================ BASE CLASS ==============================
65
67{
69}
70
71
72void DS_DRAW_ITEM_BASE::ViewGetLayers( int aLayers[], int& aCount ) const
73{
74 aCount = 1;
75
76 DS_DATA_ITEM* dataItem = GetPeer();
77
78 if( !dataItem ) // No peer: this item is like a DS_DRAW_ITEM_PAGE
79 {
80 aLayers[0] = LAYER_DRAWINGSHEET;
81 return;
82 }
83
84 if( dataItem->GetPage1Option() == FIRST_PAGE_ONLY )
85 aLayers[0] = LAYER_DRAWINGSHEET_PAGE1;
86 else if( dataItem->GetPage1Option() == SUBSEQUENT_PAGES )
87 aLayers[0] = LAYER_DRAWINGSHEET_PAGEn;
88 else
89 aLayers[0] = LAYER_DRAWINGSHEET;
90}
91
92
93// A generic HitTest that can be used by some, but not all, sub-classes.
94bool DS_DRAW_ITEM_BASE::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
95{
96 BOX2I sel = aRect;
97
98 if ( aAccuracy )
99 sel.Inflate( aAccuracy );
100
101 if( aContained )
102 return sel.Contains( GetBoundingBox() );
103
104 return sel.Intersects( GetBoundingBox() );
105}
106
107
109 std::vector<MSG_PANEL_ITEM>& aList )
110{
111 wxString msg;
112 DS_DATA_ITEM* dataItem = GetPeer();
113
114 if( dataItem == nullptr ) // Is only a pure graphic item used in drawing sheet editor to
115 // handle the page limits
116 return;
117
118 switch( dataItem->GetType() )
119 {
121 aList.emplace_back( _( "Line" ), wxEmptyString );
122 break;
123
125 aList.emplace_back( _( "Rectangle" ), wxEmptyString );
126 break;
127
129 {
130 DS_DRAW_ITEM_TEXT* textItem = static_cast<DS_DRAW_ITEM_TEXT*>( this );
131 // Don't use GetShownText(); we want to see the variable references here
132 aList.emplace_back( _( "Text" ), KIUI::EllipsizeStatusText( aFrame, textItem->GetText() ) );
133 break;
134 }
135
137 aList.emplace_back( _( "Imported Shape" ), wxEmptyString );
138 break;
139
141 aList.emplace_back( _( "Image" ), wxEmptyString );
142 break;
143 }
144
145 switch( dataItem->GetPage1Option() )
146 {
147 case FIRST_PAGE_ONLY: msg = _( "First Page Only" ); break;
148 case SUBSEQUENT_PAGES: msg = _( "Subsequent Pages" ); break;
149 default: msg = _( "All Pages" ); break;
150 }
151
152 aList.emplace_back( _( "First Page Option" ), msg );
153
154 msg = EDA_UNIT_UTILS::UI::MessageTextFromValue( unityScale, EDA_UNITS::UNSCALED,
155 dataItem->m_RepeatCount );
156 aList.emplace_back( _( "Repeat Count" ), msg );
157
158 msg = EDA_UNIT_UTILS::UI::MessageTextFromValue( unityScale, EDA_UNITS::UNSCALED,
159 dataItem->m_IncrementLabel );
160 aList.emplace_back( _( "Repeat Label Increment" ), msg );
161
162 msg.Printf( wxT( "(%s, %s)" ),
163 aFrame->MessageTextFromValue( dataItem->m_IncrementVector.x ),
164 aFrame->MessageTextFromValue( dataItem->m_IncrementVector.y ) );
165
166 aList.emplace_back( _( "Repeat Position Increment" ), msg );
167
168 aList.emplace_back( _( "Comment" ), dataItem->m_Info );
169}
170
171
172// ============================ TEXT ==============================
173
174void DS_DRAW_ITEM_TEXT::PrintWsItem( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
175{
177
178 if( color == COLOR4D::UNSPECIFIED )
179 color = aSettings->GetLayerColor( LAYER_DRAWINGSHEET );
180
181 Print( aSettings, aOffset, color, FILLED );
182}
183
184
186{
187 // A really dumb over-approximation because doing it for real (even with the stroke font)
188 // shows up large in profiles.
189
190 const TEXT_ATTRIBUTES& attrs = GetAttributes();
191 const wxString text = GetShownText( true );
192 BOX2I bbox( GetTextPos() );
193
194 bbox.SetWidth( KiROUND( (int) text.length() * attrs.m_Size.x * 1.3 ) );
195 bbox.SetHeight( attrs.m_Size.y );
196
197 switch( attrs.m_Halign )
198 {
199 case GR_TEXT_H_ALIGN_LEFT: break;
200 case GR_TEXT_H_ALIGN_CENTER: bbox.Offset( - (int) bbox.GetWidth() / 2, 0 ); break;
201 case GR_TEXT_H_ALIGN_RIGHT: bbox.Offset( - (int) bbox.GetWidth(), 0 ); break;
203 wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) );
204 break;
205 }
206
207 switch( GetAttributes().m_Valign )
208 {
209 case GR_TEXT_V_ALIGN_TOP: break;
210 case GR_TEXT_V_ALIGN_CENTER: bbox.Offset( 0, - (int) bbox.GetHeight() / 2 ); break;
211 case GR_TEXT_V_ALIGN_BOTTOM: bbox.Offset( 0, - (int) bbox.GetHeight() ); break;
213 wxFAIL_MSG( wxT( "Indeterminate state legal only in dialogs." ) );
214 break;
215 }
216
217 bbox.Inflate( attrs.m_Size.x, attrs.m_Size.y / 2 );
218 return bbox;
219}
220
221
223{
224 return EDA_TEXT::GetTextBox();
225}
226
227
228bool DS_DRAW_ITEM_TEXT::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
229{
230 return EDA_TEXT::TextHitTest( aPosition, aAccuracy );
231}
232
233
234bool DS_DRAW_ITEM_TEXT::HitTest( const BOX2I& aRect, bool aContains, int aAccuracy ) const
235{
236 return EDA_TEXT::TextHitTest( aRect, aContains, aAccuracy );
237}
238
239
241{
242 return wxString::Format( _( "Text '%s'" ), KIUI::EllipsizeMenuText( GetText() ) );
243}
244
245
246// ============================ POLYGON =================================
247
249 const VECTOR2I& aOffset )
250{
251 wxDC* DC = aSettings->GetPrintDC();
253 int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() );
254
255 std::vector<VECTOR2I> points_moved;
256
257 for( int idx = 0; idx < m_Polygons.OutlineCount(); ++idx )
258 {
259 points_moved.clear();
260 SHAPE_LINE_CHAIN& outline = m_Polygons.Outline( idx );
261
262 for( int ii = 0; ii < outline.PointCount(); ii++ )
263 {
264 points_moved.emplace_back( outline.CPoint( ii ).x + aOffset.x,
265 outline.CPoint( ii ).y + aOffset.y );
266 }
267
268 GRPoly( DC, (int) points_moved.size(), &points_moved[0], true, penWidth, color, color );
269 }
270}
271
272
274{
275 // Note: m_pos is the anchor point of the shape.
276 VECTOR2I move_vect = aPos - m_pos;
277 m_pos = aPos;
278
279 // Move polygon corners to the new position:
280 m_Polygons.Move( move_vect );
281}
282
283
285{
286 return m_Polygons.BBox();
287}
288
289
290bool DS_DRAW_ITEM_POLYPOLYGONS::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
291{
292 return m_Polygons.Collide( aPosition, aAccuracy );
293}
294
295
296bool DS_DRAW_ITEM_POLYPOLYGONS::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
297{
298 BOX2I sel = aRect;
299
300 if ( aAccuracy )
301 sel.Inflate( aAccuracy );
302
303 if( aContained )
304 return sel.Contains( GetBoundingBox() );
305
306 // Fast test: if rect is outside the polygon bounding box, then they cannot intersect
307 if( !sel.Intersects( GetBoundingBox() ) )
308 return false;
309
310 for( int idx = 0; idx < m_Polygons.OutlineCount(); ++idx )
311 {
312 const SHAPE_LINE_CHAIN& outline = m_Polygons.COutline( idx );
313
314 for( int ii = 0; ii < outline.PointCount(); ii++ )
315 {
316 VECTOR2I corner( outline.CPoint( ii ).x, outline.CPoint( ii ).y );
317
318 // Test if the point is within aRect
319 if( sel.Contains( corner ) )
320 return true;
321
322 // Test if this edge intersects aRect
323 int ii_next = (ii+1) % outline.PointCount();
324 VECTOR2I next_corner( outline.CPoint( ii_next ).x, outline.CPoint( ii_next ).y );
325
326 if( sel.Intersects( corner, next_corner ) )
327 return true;
328 }
329 }
330
331 return false;
332}
333
334
336{
337 return _( "Imported Shape" );
338}
339
340
341// ============================ RECT ==============================
342
343void DS_DRAW_ITEM_RECT::PrintWsItem( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
344{
345 wxDC* DC = aSettings->GetPrintDC();
347 int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() );
348
349 GRRect( DC, GetStart() + aOffset, GetEnd() + aOffset, penWidth, color );
350}
351
352
354{
355 return BOX2I( GetStart(), GetEnd() - GetStart() );
356}
357
358
359bool DS_DRAW_ITEM_RECT::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
360{
361 int dist = aAccuracy + ( GetPenWidth() / 2 );
362 VECTOR2I start = GetStart();
363 VECTOR2I end;
364 end.x = GetEnd().x;
365 end.y = start.y;
366
367 // Upper line
368 if( TestSegmentHit( aPosition, start, end, dist ) )
369 return true;
370
371 // Right line
372 start = end;
373 end.y = GetEnd().y;
374
375 if( TestSegmentHit( aPosition, start, end, dist ) )
376 return true;
377
378 // lower line
379 start = end;
380 end.x = GetStart().x;
381
382 if( TestSegmentHit( aPosition, start, end, dist ) )
383 return true;
384
385 // left line
386 start = end;
387 end = GetStart();
388
389 if( TestSegmentHit( aPosition, start, end, dist ) )
390 return true;
391
392 return false;
393}
394
395
396bool DS_DRAW_ITEM_RECT::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
397{
398 BOX2I sel = aRect;
399
400 if ( aAccuracy )
401 sel.Inflate( aAccuracy );
402
403 if( aContained )
404 return sel.Contains( GetBoundingBox() );
405
406 // For greedy we need to check each side of the rect as we're pretty much always inside the
407 // rect which defines the drawing-sheet frame.
408 BOX2I side = GetBoundingBox();
409 side.SetHeight( 0 );
410
411 if( sel.Intersects( side ) )
412 return true;
413
414 side.SetY( GetBoundingBox().GetBottom() );
415
416 if( sel.Intersects( side ) )
417 return true;
418
419 side = GetBoundingBox();
420 side.SetWidth( 0 );
421
422 if( sel.Intersects( side ) )
423 return true;
424
425 side.SetX( GetBoundingBox().GetRight() );
426
427 if( sel.Intersects( side ) )
428 return true;
429
430 return false;
431}
432
433
435{
436 return wxString::Format( _( "Rectangle, width %s height %s" ),
437 aUnitsProvider->MessageTextFromValue( std::abs( GetStart().x - GetEnd().x ) ),
438 aUnitsProvider->MessageTextFromValue( std::abs( GetStart().y - GetEnd().y ) ) );
439}
440
441
442// ============================ LINE ==============================
443
444void DS_DRAW_ITEM_LINE::PrintWsItem( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
445{
446 wxDC* DC = aSettings->GetPrintDC();
448 int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() );
449
450 GRLine( DC, GetStart() + aOffset, GetEnd() + aOffset, penWidth, color );
451}
452
453
455{
456 return BOX2I( GetStart(), GetEnd() - GetStart() );
457}
458
459
460bool DS_DRAW_ITEM_LINE::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
461{
462 int mindist = aAccuracy + ( GetPenWidth() / 2 ) + 1;
463 return TestSegmentHit( aPosition, GetStart(), GetEnd(), mindist );
464}
465
466
468{
469 return wxString::Format( _( "Line, length %s" ),
470 aUnitsProvider->MessageTextFromValue( EuclideanNorm( GetStart() - GetEnd() ) ) );
471}
472
473
474// ============== BITMAP ================
475
476void DS_DRAW_ITEM_BITMAP::PrintWsItem( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
477{
479
480 if( !bitmap->m_ImageBitmap )
481 return;
482
483 bitmap->m_ImageBitmap->DrawBitmap( aSettings->GetPrintDC(), m_pos + aOffset,
484 aSettings->GetBackgroundColor() );
485}
486
487
489{
490 const DS_DATA_ITEM_BITMAP* bitmap = static_cast<const DS_DATA_ITEM_BITMAP*>( m_peer );
491 BOX2I bbox;
492
493 if( bitmap && bitmap->m_ImageBitmap )
494 {
495 VECTOR2I bm_size = bitmap->m_ImageBitmap->GetSize();
496 bbox.SetSize( bm_size );
497 bbox.SetOrigin( m_pos.x - bm_size.x / 2, m_pos.y - bm_size.y / 2 );
498 }
499
500 return bbox;
501}
502
503
504bool DS_DRAW_ITEM_BITMAP::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
505{
506 BOX2I bbox = GetBoundingBox();
507 bbox.Inflate( aAccuracy );
508
509 return bbox.Contains( aPosition );
510}
511
512
513bool DS_DRAW_ITEM_BITMAP::HitTest( const BOX2I& aRect, bool aContains, int aAccuracy ) const
514{
515 return DS_DRAW_ITEM_BASE::HitTest( aRect, aContains, aAccuracy );
516}
517
518
520{
521 return _( "Image" );
522}
523
524
526{
527 return _( "Page Limits" );
528}
529
530
532{
533 BOX2I dummy;
534
535 // We want this graphic item always visible. So gives the max size to the
536 // bounding box to avoid any clamping:
537 dummy.SetMaximum();
538
539 return dummy;
540}
541
542
543// ====================== DS_DRAW_ITEM_LIST ==============================
544
546 const TITLE_BLOCK& aTitleBlock )
547{
549
550 m_titleBlock = &aTitleBlock;
551 m_paperFormat = aPageInfo.GetType();
552
553 // Build the basic layout shape, if the layout list is empty
554 if( model.GetCount() == 0 && !model.VoidListAllowed() )
555 model.LoadDrawingSheet();
556
557 model.SetupDrawEnvironment( aPageInfo, GetMilsToIUfactor() );
558
559 for( DS_DATA_ITEM* wsItem : model.GetItems() )
560 {
561 // Generate it only if the page option allows this
562 if( wsItem->GetPage1Option() == FIRST_PAGE_ONLY && !m_isFirstPage )
563 continue;
564 else if( wsItem->GetPage1Option() == SUBSEQUENT_PAGES && m_isFirstPage )
565 continue;
566
567 wsItem->SyncDrawItems( this, nullptr );
568 }
569}
570
571
572/* Print the item list created by BuildDrawItemsList
573 * aDC = the current Device Context
574 * The not selected items are drawn first (most of items)
575 * The selected items are drawn after (usually 0 or 1)
576 * to be sure they are seen, even for overlapping items
577 */
579{
580 std::vector<DS_DRAW_ITEM_BASE*> second_items;
581
582 for( DS_DRAW_ITEM_BASE* item = GetFirst(); item; item = GetNext() )
583 {
584 if( item->Type() == WSG_BITMAP_T )
585 item->PrintWsItem( aSettings );
586 else
587 second_items.push_back( item );
588 }
589
590 for( DS_DRAW_ITEM_BASE* item : second_items )
591 item->PrintWsItem( aSettings );
592}
593
594
int color
Definition: DXF_plotter.cpp:58
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:111
BOX2< VECTOR2I > BOX2I
Definition: box2.h:877
void DrawBitmap(wxDC *aDC, const VECTOR2I &aPos, const KIGFX::COLOR4D &aBackgroundColor=KIGFX::COLOR4D::UNSPECIFIED)
VECTOR2I GetSize() const
void SetOrigin(const Vec &pos)
Definition: box2.h:227
void SetSize(const SizeVec &size)
Definition: box2.h:238
void Offset(coord_type dx, coord_type dy)
Definition: box2.h:249
void SetHeight(size_type val)
Definition: box2.h:275
size_type GetHeight() const
Definition: box2.h:205
void SetX(coord_type val)
Definition: box2.h:260
bool Intersects(const BOX2< Vec > &aRect) const
Definition: box2.h:294
void SetWidth(size_type val)
Definition: box2.h:270
void SetY(coord_type val)
Definition: box2.h:265
size_type GetWidth() const
Definition: box2.h:204
bool Contains(const Vec &aPoint) const
Definition: box2.h:158
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:541
BITMAP_BASE * m_ImageBitmap
Definition: ds_data_item.h:370
Drawing sheet structure type definitions.
Definition: ds_data_item.h:96
PAGE_OPTION GetPage1Option() const
Definition: ds_data_item.h:133
DS_ITEM_TYPE GetType() const
Definition: ds_data_item.h:128
VECTOR2D m_IncrementVector
Definition: ds_data_item.h:204
wxString m_Info
Definition: ds_data_item.h:199
int m_IncrementLabel
Definition: ds_data_item.h:205
Handle the graphic items list to draw/plot the frame and title block.
Definition: ds_data_model.h:39
void SetupDrawEnvironment(const PAGE_INFO &aPageInfo, double aMilsToIU)
static DS_DATA_MODEL & GetTheInstance()
static function: returns the instance of DS_DATA_MODEL used in the application
unsigned GetCount() const
bool VoidListAllowed()
Definition: ds_data_model.h:88
std::vector< DS_DATA_ITEM * > & GetItems()
bool LoadDrawingSheet(const wxString &aFullFileName=wxEmptyString, bool Append=false)
Populates the list with a custom layout or the default layout if no custom layout is available.
Base class to handle basic graphic items.
Definition: ds_draw_item.h:59
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
Definition: ds_draw_item.h:101
const BOX2I GetBoundingBox() const override=0
Return the orthogonal bounding box of this object for display purposes.
virtual int GetPenWidth() const
Definition: ds_draw_item.h:70
void ViewGetLayers(int aLayers[], int &aCount) const override
Return the all the layers within the VIEW the object is painted on.
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
DS_DATA_ITEM * GetPeer() const
Definition: ds_draw_item.h:63
const KIFONT::METRICS & GetFontMetrics() const
DS_DATA_ITEM * m_peer
Definition: ds_draw_item.h:123
void PrintWsItem(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset) override
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void PrintWsItem(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset) override
const VECTOR2I & GetStart() const
Definition: ds_draw_item.h:144
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
const VECTOR2I & GetEnd() const
Definition: ds_draw_item.h:146
DS_DRAW_ITEM_BASE * GetFirst()
Definition: ds_draw_item.h:511
void BuildDrawItemsList(const PAGE_INFO &aPageInfo, const TITLE_BLOCK &aTitleBlock)
Drawing or plot the drawing sheet.
void Print(const RENDER_SETTINGS *aSettings)
Draws the item list created by BuildDrawItemsList.
wxString m_paperFormat
Definition: ds_draw_item.h:574
const TITLE_BLOCK * m_titleBlock
Definition: ds_draw_item.h:573
bool m_isFirstPage
Is this the first page or not.
Definition: ds_draw_item.h:570
double GetMilsToIUfactor()
Get the scalar to convert pages units (mils) to draw/plot units.
Definition: ds_draw_item.h:475
DS_DRAW_ITEM_BASE * GetNext()
Definition: ds_draw_item.h:521
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
SHAPE_POLY_SET m_Polygons
The list of polygons.
Definition: ds_draw_item.h:206
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void SetPosition(const VECTOR2I &aPos) override
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
void PrintWsItem(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset) override
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
const VECTOR2I & GetEnd() const
Definition: ds_draw_item.h:233
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
const VECTOR2I & GetStart() const
Definition: ds_draw_item.h:231
void PrintWsItem(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset) override
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
A graphic text.
Definition: ds_draw_item.h:313
void PrintWsItem(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset) override
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
virtual const BOX2I GetApproxBBox() override
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
The base class for create windows for drawing purpose.
const VECTOR2I & GetTextPos() const
Definition: eda_text.h:234
COLOR4D GetTextColor() const
Definition: eda_text.h:231
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:98
BOX2I GetTextBox(int aLine=-1) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
Definition: eda_text.cpp:565
virtual bool TextHitTest(const VECTOR2I &aPoint, int aAccuracy=0) const
Test if aPoint is within the bounds of this object.
Definition: eda_text.cpp:699
const TEXT_ATTRIBUTES & GetAttributes() const
Definition: eda_text.h:195
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition: eda_text.h:109
void Print(const RENDER_SETTINGS *aSettings, const VECTOR2I &aOffset, const COLOR4D &aColor, OUTLINE_MODE aDisplay_mode=FILLED)
Print this text object to the device context aDC.
Definition: eda_text.cpp:724
static const METRICS & Default()
Definition: font.cpp:52
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
int GetDefaultPenWidth() const
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
virtual const COLOR4D & GetBackgroundColor() const =0
Return current background color settings.
wxDC * GetPrintDC() const
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:59
const wxString & GetType() const
Definition: page_info.h:99
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
int PointCount() const
Return the number of points (vertices) in this line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
bool Collide(const SHAPE *aShape, int aClearance=0, int *aActual=nullptr, VECTOR2I *aLocation=nullptr) const override
Check if the boundary of shape (this) lies closer to the shape aShape than aClearance,...
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int OutlineCount() const
Return the number of outlines in the set.
void Move(const VECTOR2I &aVector) override
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
GR_TEXT_H_ALIGN_T m_Halign
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition: title_block.h:41
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
@ FIRST_PAGE_ONLY
Definition: ds_data_item.h:58
@ SUBSEQUENT_PAGES
Definition: ds_data_item.h:59
#define _(s)
void GRRect(wxDC *DC, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aWidth, const COLOR4D &aColor)
Definition: gr_basic.cpp:396
void GRLine(wxDC *DC, int x1, int y1, int x2, int y2, int width, const COLOR4D &Color, wxPenStyle aStyle)
Definition: gr_basic.cpp:171
static const bool FILLED
Definition: gr_basic.cpp:30
void GRPoly(wxDC *DC, int n, const VECTOR2I *Points, bool Fill, int width, const COLOR4D &Color, const COLOR4D &BgColor)
Draw a new polyline and fill it if Fill, in drawing space.
Definition: gr_basic.cpp:341
@ LAYER_DRAWINGSHEET_PAGEn
for drawingsheetEditor previewing
Definition: layer_ids.h:251
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:221
@ LAYER_DRAWINGSHEET_PAGE1
for drawingsheetEditor previewing
Definition: layer_ids.h:250
KICOMMON_API wxString MessageTextFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A helper to convert the double length aValue to a string in inches, millimeters, or unscaled units.
Definition: eda_units.cpp:408
KICOMMON_API wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
Definition: ui_common.cpp:213
KICOMMON_API wxString EllipsizeStatusText(wxWindow *aWindow, const wxString &aString)
Ellipsize text (at the end) to be no more than 1/3 of the window width.
Definition: ui_common.cpp:195
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition: eda_angle.h:424
std::vector< FAB_LAYER_COLOR > dummy
@ GR_TEXT_H_ALIGN_CENTER
@ GR_TEXT_H_ALIGN_RIGHT
@ GR_TEXT_H_ALIGN_LEFT
@ GR_TEXT_H_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_BOTTOM
@ GR_TEXT_V_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_CENTER
@ GR_TEXT_V_ALIGN_TOP
bool TestSegmentHit(const VECTOR2I &aRefPoint, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aDist)
Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.
Definition: trigo.cpp:174
double EuclideanNorm(const VECTOR2I &vector)
Definition: trigo.h:128
@ WSG_BITMAP_T
Definition: typeinfo.h:219
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:118