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( (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( -bbox.GetWidth() / 2, 0 ); break;
201 case GR_TEXT_H_ALIGN_RIGHT: bbox.Offset( -bbox.GetWidth(), 0 ); break;
202 }
203
204 switch( GetAttributes().m_Valign )
205 {
206 case GR_TEXT_V_ALIGN_TOP: break;
207 case GR_TEXT_V_ALIGN_CENTER: bbox.Offset( 0, -bbox.GetHeight() / 2 ); break;
208 case GR_TEXT_V_ALIGN_BOTTOM: bbox.Offset( 0, -bbox.GetHeight() ); break;
209 }
210
211 bbox.Inflate( attrs.m_Size.x, attrs.m_Size.y / 2 );
212 return bbox;
213}
214
215
217{
218 return EDA_TEXT::GetTextBox();
219}
220
221
222bool DS_DRAW_ITEM_TEXT::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
223{
224 return EDA_TEXT::TextHitTest( aPosition, aAccuracy );
225}
226
227
228bool DS_DRAW_ITEM_TEXT::HitTest( const BOX2I& aRect, bool aContains, int aAccuracy ) const
229{
230 return EDA_TEXT::TextHitTest( aRect, aContains, aAccuracy );
231}
232
233
235{
236 return wxString::Format( _( "Text '%s'" ), KIUI::EllipsizeMenuText( GetText() ) );
237}
238
239
240// ============================ POLYGON =================================
241
243 const VECTOR2I& aOffset )
244{
245 wxDC* DC = aSettings->GetPrintDC();
247 int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() );
248
249 std::vector<VECTOR2I> points_moved;
250
251 for( int idx = 0; idx < m_Polygons.OutlineCount(); ++idx )
252 {
253 points_moved.clear();
254 SHAPE_LINE_CHAIN& outline = m_Polygons.Outline( idx );
255
256 for( int ii = 0; ii < outline.PointCount(); ii++ )
257 {
258 points_moved.emplace_back( outline.CPoint( ii ).x + aOffset.x,
259 outline.CPoint( ii ).y + aOffset.y );
260 }
261
262 GRPoly( DC, points_moved.size(), &points_moved[0], true, penWidth, color, color );
263 }
264}
265
266
268{
269 // Note: m_pos is the anchor point of the shape.
270 VECTOR2I move_vect = aPos - m_pos;
271 m_pos = aPos;
272
273 // Move polygon corners to the new position:
274 m_Polygons.Move( move_vect );
275}
276
277
279{
280 return m_Polygons.BBox();
281}
282
283
284bool DS_DRAW_ITEM_POLYPOLYGONS::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
285{
286 return m_Polygons.Collide( aPosition, aAccuracy );
287}
288
289
290bool DS_DRAW_ITEM_POLYPOLYGONS::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
291{
292 BOX2I sel = aRect;
293
294 if ( aAccuracy )
295 sel.Inflate( aAccuracy );
296
297 if( aContained )
298 return sel.Contains( GetBoundingBox() );
299
300 // Fast test: if rect is outside the polygon bounding box, then they cannot intersect
301 if( !sel.Intersects( GetBoundingBox() ) )
302 return false;
303
304 for( int idx = 0; idx < m_Polygons.OutlineCount(); ++idx )
305 {
306 const SHAPE_LINE_CHAIN& outline = m_Polygons.COutline( idx );
307
308 for( int ii = 0; ii < outline.PointCount(); ii++ )
309 {
310 VECTOR2I corner( outline.CPoint( ii ).x, outline.CPoint( ii ).y );
311
312 // Test if the point is within aRect
313 if( sel.Contains( corner ) )
314 return true;
315
316 // Test if this edge intersects aRect
317 int ii_next = (ii+1) % outline.PointCount();
318 VECTOR2I next_corner( outline.CPoint( ii_next ).x, outline.CPoint( ii_next ).y );
319
320 if( sel.Intersects( corner, next_corner ) )
321 return true;
322 }
323 }
324
325 return false;
326}
327
328
330{
331 return _( "Imported Shape" );
332}
333
334
335// ============================ RECT ==============================
336
337void DS_DRAW_ITEM_RECT::PrintWsItem( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
338{
339 wxDC* DC = aSettings->GetPrintDC();
341 int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() );
342
343 GRRect( DC, GetStart() + aOffset, GetEnd() + aOffset, penWidth, color );
344}
345
346
348{
349 return BOX2I( GetStart(), GetEnd() - GetStart() );
350}
351
352
353bool DS_DRAW_ITEM_RECT::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
354{
355 int dist = aAccuracy + ( GetPenWidth() / 2 );
356 VECTOR2I start = GetStart();
357 VECTOR2I end;
358 end.x = GetEnd().x;
359 end.y = start.y;
360
361 // Upper line
362 if( TestSegmentHit( aPosition, start, end, dist ) )
363 return true;
364
365 // Right line
366 start = end;
367 end.y = GetEnd().y;
368 if( TestSegmentHit( aPosition, start, end, dist ) )
369 return true;
370
371 // lower line
372 start = end;
373 end.x = GetStart().x;
374 if( TestSegmentHit( aPosition, start, end, dist ) )
375 return true;
376
377 // left line
378 start = end;
379 end = GetStart();
380 if( TestSegmentHit( aPosition, start, end, dist ) )
381 return true;
382
383 return false;
384}
385
386
387bool DS_DRAW_ITEM_RECT::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
388{
389 BOX2I sel = aRect;
390
391 if ( aAccuracy )
392 sel.Inflate( aAccuracy );
393
394 if( aContained )
395 return sel.Contains( GetBoundingBox() );
396
397 // For greedy we need to check each side of the rect as we're pretty much always inside the
398 // rect which defines the drawing-sheet frame.
399 BOX2I side = GetBoundingBox();
400 side.SetHeight( 0 );
401
402 if( sel.Intersects( side ) )
403 return true;
404
405 side.SetY( GetBoundingBox().GetBottom() );
406
407 if( sel.Intersects( side ) )
408 return true;
409
410 side = GetBoundingBox();
411 side.SetWidth( 0 );
412
413 if( sel.Intersects( side ) )
414 return true;
415
416 side.SetX( GetBoundingBox().GetRight() );
417
418 if( sel.Intersects( side ) )
419 return true;
420
421 return false;
422}
423
424
426{
427 return wxString::Format( _( "Rectangle, width %s height %s" ),
428 aUnitsProvider->MessageTextFromValue( std::abs( GetStart().x - GetEnd().x ) ),
429 aUnitsProvider->MessageTextFromValue( std::abs( GetStart().y - GetEnd().y ) ) );
430}
431
432
433// ============================ LINE ==============================
434
435void DS_DRAW_ITEM_LINE::PrintWsItem( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
436{
437 wxDC* DC = aSettings->GetPrintDC();
439 int penWidth = std::max( GetPenWidth(), aSettings->GetDefaultPenWidth() );
440
441 GRLine( DC, GetStart() + aOffset, GetEnd() + aOffset, penWidth, color );
442}
443
444
446{
447 return BOX2I( GetStart(), GetEnd() - GetStart() );
448}
449
450
451bool DS_DRAW_ITEM_LINE::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
452{
453 int mindist = aAccuracy + ( GetPenWidth() / 2 ) + 1;
454 return TestSegmentHit( aPosition, GetStart(), GetEnd(), mindist );
455}
456
457
459{
460 return wxString::Format( _( "Line, length %s" ),
461 aUnitsProvider->MessageTextFromValue( EuclideanNorm( GetStart() - GetEnd() ) ) );
462}
463
464
465// ============== BITMAP ================
466
467void DS_DRAW_ITEM_BITMAP::PrintWsItem( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffset )
468{
470
471 if( !bitmap->m_ImageBitmap )
472 return;
473
474 bitmap->m_ImageBitmap->DrawBitmap( aSettings->GetPrintDC(), m_pos + aOffset,
475 aSettings->GetBackgroundColor() );
476}
477
478
480{
481 const DS_DATA_ITEM_BITMAP* bitmap = static_cast<const DS_DATA_ITEM_BITMAP*>( m_peer );
482 BOX2I bbox;
483
484 if( bitmap && bitmap->m_ImageBitmap )
485 {
486 VECTOR2I bm_size = bitmap->m_ImageBitmap->GetSize();
487 bbox.SetSize( bm_size );
488 bbox.SetOrigin( m_pos.x - bm_size.x / 2, m_pos.y - bm_size.y / 2 );
489 }
490
491 return bbox;
492}
493
494
495bool DS_DRAW_ITEM_BITMAP::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
496{
497 BOX2I bbox = GetBoundingBox();
498 bbox.Inflate( aAccuracy );
499
500 return bbox.Contains( aPosition );
501}
502
503
504bool DS_DRAW_ITEM_BITMAP::HitTest( const BOX2I& aRect, bool aContains, int aAccuracy ) const
505{
506 return DS_DRAW_ITEM_BASE::HitTest( aRect, aContains, aAccuracy );
507}
508
509
511{
512 return _( "Image" );
513}
514
515
517{
518 return _( "Page Limits" );
519}
520
521
523{
524 BOX2I dummy;
525
526 // We want this graphic item always visible. So gives the max size to the
527 // bounding box to avoid any clamping:
528 dummy.SetMaximum();
529
530 return dummy;
531}
532
533
534// ====================== DS_DRAW_ITEM_LIST ==============================
535
537 const TITLE_BLOCK& aTitleBlock )
538{
540
541 m_titleBlock = &aTitleBlock;
542 m_paperFormat = aPageInfo.GetType();
543
544 // Build the basic layout shape, if the layout list is empty
545 if( model.GetCount() == 0 && !model.VoidListAllowed() )
546 model.LoadDrawingSheet();
547
548 model.SetupDrawEnvironment( aPageInfo, GetMilsToIUfactor() );
549
550 for( DS_DATA_ITEM* wsItem : model.GetItems() )
551 {
552 // Generate it only if the page option allows this
553 if( wsItem->GetPage1Option() == FIRST_PAGE_ONLY && !m_isFirstPage )
554 continue;
555 else if( wsItem->GetPage1Option() == SUBSEQUENT_PAGES && m_isFirstPage )
556 continue;
557
558 wsItem->SyncDrawItems( this, nullptr );
559 }
560}
561
562
563/* Print the item list created by BuildDrawItemsList
564 * aDC = the current Device Context
565 * The not selected items are drawn first (most of items)
566 * The selected items are drawn after (usually 0 or 1)
567 * to be sure they are seen, even for overlapping items
568 */
570{
571 std::vector<DS_DRAW_ITEM_BASE*> second_items;
572
573 for( DS_DRAW_ITEM_BASE* item = GetFirst(); item; item = GetNext() )
574 {
575 if( item->Type() == WSG_BITMAP_T )
576 item->PrintWsItem( aSettings );
577 else
578 second_items.push_back( item );
579 }
580
581 for( DS_DRAW_ITEM_BASE* item : second_items )
582 item->PrintWsItem( aSettings );
583}
584
585
int color
Definition: DXF_plotter.cpp:58
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:112
BOX2< VECTOR2I > BOX2I
Definition: box2.h:853
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:203
void Offset(coord_type dx, coord_type dy)
Definition: box2.h:225
void SetX(coord_type val)
Definition: box2.h:236
bool Intersects(const BOX2< Vec > &aRect) const
Definition: box2.h:270
void SetY(coord_type val)
Definition: box2.h:241
coord_type GetHeight() const
Definition: box2.h:189
coord_type GetWidth() const
Definition: box2.h:188
void SetWidth(coord_type val)
Definition: box2.h:246
void SetSize(const Vec &size)
Definition: box2.h:214
bool Contains(const Vec &aPoint) const
Definition: box2.h:142
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:507
void SetHeight(coord_type val)
Definition: box2.h:251
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.
BOX2I GetTextBox(int aLine=-1, bool aInvertY=false) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
Definition: eda_text.cpp:546
const VECTOR2I & GetTextPos() const
Definition: eda_text.h:219
COLOR4D GetTextColor() const
Definition: eda_text.h:216
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition: eda_text.h:95
virtual bool TextHitTest(const VECTOR2I &aPoint, int aAccuracy=0) const
Test if aPoint is within the bounds of this object.
Definition: eda_text.cpp:677
const TEXT_ATTRIBUTES & GetAttributes() const
Definition: eda_text.h:183
virtual wxString GetShownText(bool aAllowExtraText, int aDepth=0) const
Return the string actually shown after processing of the base text.
Definition: eda_text.h:106
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:702
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:53
const wxString & GetType() const
Definition: page_info.h:93
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)
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:248
@ LAYER_DRAWINGSHEET
drawingsheet frame and titleblock
Definition: layer_ids.h:218
@ LAYER_DRAWINGSHEET_PAGE1
for drawingsheetEditor previewing
Definition: layer_ids.h:247
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:315
wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
Definition: ui_common.cpp:219
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:201
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition: eda_angle.h:426
std::vector< FAB_LAYER_COLOR > dummy
@ GR_TEXT_H_ALIGN_CENTER
@ GR_TEXT_H_ALIGN_RIGHT
@ GR_TEXT_H_ALIGN_LEFT
@ GR_TEXT_V_ALIGN_BOTTOM
@ 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:129
double EuclideanNorm(const VECTOR2I &vector)
Definition: trigo.h:129
@ WSG_BITMAP_T
Definition: typeinfo.h:223