KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_bitmap.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) 2011 jean-pierre.charras
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
28#include "sch_bitmap.h"
29
30#include <bitmap_base.h>
31#include <bitmaps.h>
32#include <base_units.h>
33#include <common.h>
34#include <core/mirror.h>
35#include <eda_draw_frame.h>
37#include <plotters/plotter.h>
38#include <sch_draw_panel.h>
40#include <trigo.h>
41
42#include <wx/mstream.h>
43#include <properties/property.h>
45
46
48 SCH_ITEM( nullptr, SCH_BITMAP_T ),
50{
51 m_referenceImage.SetPosition( pos );
52 m_layer = LAYER_NOTES; // used only to draw/plot a rectangle,
53 // when a bitmap cannot be drawn or plotted
54}
55
56
57SCH_BITMAP::SCH_BITMAP( const SCH_BITMAP& aSchBitmap ) :
58 SCH_ITEM( aSchBitmap ),
60{
61}
62
63
65{
66 wxCHECK_MSG( Type() == aItem.Type(), *this,
67 wxT( "Cannot assign object type " ) + aItem.GetClass() + wxT( " to type " ) +
68 GetClass() );
69
70 if( &aItem != this )
71 {
72 SCH_ITEM::operator=( aItem );
73
74 const SCH_BITMAP& bitmap = static_cast<const SCH_BITMAP&>( aItem );
76 }
77
78 return *this;
79}
80
81
83{
84 return new SCH_BITMAP( *this );
85}
86
87
89{
90 wxCHECK_RET( aItem->Type() == SCH_BITMAP_T,
91 wxString::Format( wxT( "SCH_BITMAP object cannot swap data with %s object." ),
92 aItem->GetClass() ) );
93
94 SCH_BITMAP* item = (SCH_BITMAP*) aItem;
95 m_referenceImage.SwapData( item->m_referenceImage );
96}
97
98
100{
101 return m_referenceImage.GetBoundingBox();
102}
103
104
106{
107 return m_referenceImage.GetPosition();
108}
109
110
111void SCH_BITMAP::SetPosition( const VECTOR2I& aPosition )
112{
113 m_referenceImage.SetPosition( aPosition );
114}
115
116
117void SCH_BITMAP::Move( const VECTOR2I& aMoveVector )
118{
119 SetPosition( GetPosition() + aMoveVector );
120}
121
122
124{
126}
127
128
130{
132}
133
134
135void SCH_BITMAP::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
136{
137 m_referenceImage.Rotate( aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
138}
139
140
141#if defined(DEBUG)
142void SCH_BITMAP::Show( int nestLevel, std::ostream& os ) const
143{
144 // XML output:
145 wxString s = GetClass();
146
147 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << GetPosition() << "/>\n";
148}
149#endif
150
151
152bool SCH_BITMAP::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
153{
154 return KIGEOM::BoxHitTest( aPosition, GetBoundingBox(), aAccuracy );
155}
156
157
158bool SCH_BITMAP::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
159{
160 return KIGEOM::BoxHitTest( aRect, GetBoundingBox(), aContained, aAccuracy );
161}
162
163
164bool SCH_BITMAP::HitTest( const SHAPE_LINE_CHAIN& aPoly, bool aContained ) const
165{
166 return KIGEOM::BoxHitTest( aPoly, GetBoundingBox(), aContained );
167}
168
169
170
171void SCH_BITMAP::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
172 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
173{
174 if( aBackground )
175 {
176 RENDER_SETTINGS* cfg = aPlotter->RenderSettings();
177
178 m_referenceImage.GetImage().PlotImage( aPlotter, GetPosition(),
179 cfg->GetLayerColor( GetLayer() ),
180 cfg->GetDefaultPenWidth() );
181 }
182}
183
184
186{
187 return BITMAPS::image;
188}
189
190
191void SCH_BITMAP::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
192{
193 aList.emplace_back( _( "Bitmap" ), wxEmptyString );
194
195 aList.emplace_back( _( "PPI" ),
196 wxString::Format( wxT( "%d " ), m_referenceImage.GetImage().GetPPI() ) );
197 aList.emplace_back( _( "Scale" ),
198 wxString::Format( wxT( "%f " ), m_referenceImage.GetImageScale() ) );
199
200 aList.emplace_back( _( "Width" ),
201 aFrame->MessageTextFromValue( m_referenceImage.GetSize().x ) );
202 aList.emplace_back( _( "Height" ),
203 aFrame->MessageTextFromValue( m_referenceImage.GetSize().y ) );
204}
205
206
207std::vector<int> SCH_BITMAP::ViewGetLayers() const
208{
210}
211
212
213bool SCH_BITMAP::operator==( const SCH_ITEM& aItem ) const
214{
215 if( Type() != aItem.Type() )
216 return false;
217
218 const SCH_BITMAP& bitmap = static_cast<const SCH_BITMAP&>( aItem );
219 return m_referenceImage == bitmap.m_referenceImage;
220}
221
222
223double SCH_BITMAP::Similarity( const SCH_ITEM& aItem ) const
224{
225 if( Type() != aItem.Type() )
226 return 0.0;
227
228 if( m_Uuid == aItem.m_Uuid )
229 return 1.0;
230
231 const SCH_BITMAP& bitmap = static_cast<const SCH_BITMAP&>( aItem );
232 return m_referenceImage.Similarity( bitmap.m_referenceImage );
233}
234
235
237{
238 return m_referenceImage.GetTransformOriginOffset().x;
239}
240
241
243{
244 VECTOR2I offset = m_referenceImage.GetTransformOriginOffset();
245 offset.x = aX;
246 m_referenceImage.SetTransformOriginOffset( offset );
247}
248
249
251{
252 return m_referenceImage.GetTransformOriginOffset().y;
253}
254
255
257{
258 VECTOR2I offset = m_referenceImage.GetTransformOriginOffset();
259 offset.y = aY;
260 m_referenceImage.SetTransformOriginOffset( offset );
261}
262
263
265{
266 return m_referenceImage.GetImageScale();
267}
268
269
270void SCH_BITMAP::SetImageScale( double aScale )
271{
272 m_referenceImage.SetImageScale( aScale );
273}
274
275
277{
278 return m_referenceImage.GetImage().GetSize().x;
279}
280
281
282void SCH_BITMAP::SetWidth( int aWidth )
283{
284 m_referenceImage.SetWidth( aWidth );
285}
286
287
289{
290 return m_referenceImage.GetImage().GetSize().y;
291}
292
293
294void SCH_BITMAP::SetHeight( int aHeight )
295{
296 m_referenceImage.SetHeight( aHeight );
297}
298
299
300static struct SCH_BITMAP_DESC
301{
303 {
307
308 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Position X" ),
311
312
313 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Position Y" ),
316
317 const wxString groupImage = _HKI( "Image Properties" );
318
319 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, double>( _HKI( "Scale" ),
321 groupImage );
322
323 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Transform Offset X" ),
327 groupImage );
328
329 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Transform Offset Y" ),
333 groupImage );
334
335 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Width" ),
338 groupImage );
339
340 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Height" ),
343 groupImage );
344 }
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
The base class for create windows for drawing purpose.
const KIID m_Uuid
Definition eda_item.h:522
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:111
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:41
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
const COLOR4D & GetLayerColor(int aLayer) const
Return the color used to draw a layer.
Base plotter engine class.
Definition plotter.h:136
RENDER_SETTINGS * RenderSettings()
Definition plotter.h:167
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
Object to handle a bitmap image that can be inserted in a schematic.
Definition sch_bitmap.h:40
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
double GetImageScale() const
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
SCH_BITMAP(const VECTOR2I &pos=VECTOR2I(0, 0))
void SetWidth(int aWidth)
VECTOR2I GetPosition() const override
int GetTransformOriginOffsetY() const
void SetHeight(int aHeight)
virtual std::vector< int > ViewGetLayers() const override
int GetWidth() const
int GetY() const
Definition sch_bitmap.h:57
void Plot(PLOTTER *aPlotter, bool aBackground, const SCH_PLOT_OPTS &aPlotOpts, int aUnit, int aBodyStyle, const VECTOR2I &aOffset, bool aDimmed) override
Plot the item to aPlotter.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
wxString GetClass() const override
Return the class name.
Definition sch_bitmap.h:65
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
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.
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
int GetHeight() const
void SetY(int aY)
Definition sch_bitmap.h:58
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
int GetX() const
Definition sch_bitmap.h:54
void SetTransformOriginOffsetX(int aX)
void SetPosition(const VECTOR2I &aPosition) override
void Move(const VECTOR2I &aMoveVector) override
Move the item by aMoveVector to a new position.
SCH_BITMAP & operator=(const SCH_ITEM &aItem)
void SetX(int aX)
Definition sch_bitmap.h:55
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
bool operator==(const SCH_ITEM &aOther) const override
REFERENCE_IMAGE m_referenceImage
Definition sch_bitmap.h:137
int GetTransformOriginOffsetX() const
void SetTransformOriginOffsetY(int aY)
void SetImageScale(double aScale)
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:168
SCH_ITEM & operator=(const SCH_ITEM &aPin)
Definition sch_item.cpp:80
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition sch_item.h:341
SCH_ITEM(EDA_ITEM *aParent, KICAD_T aType, int aUnit=0, int aBodyStyle=0)
Definition sch_item.cpp:56
wxString GetClass() const override
Return the class name.
Definition sch_item.h:178
SCH_LAYER_ID m_layer
Definition sch_item.h:778
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
The common library.
#define _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:413
static constexpr EDA_ANGLE ANGLE_270
Definition eda_angle.h:416
a few functions useful in geometry calculations.
@ LAYER_DRAW_BITMAPS
Draw images.
Definition layer_ids.h:284
@ LAYER_NOTES
Definition layer_ids.h:467
@ LAYER_SELECTION_SHADOWS
Definition layer_ids.h:495
@ LEFT_RIGHT
Flip left to right (around the Y axis)
Definition mirror.h:28
@ TOP_BOTTOM
Flip top to bottom (around the X axis)
Definition mirror.h:29
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
#define _HKI(x)
Definition page_info.cpp:44
#define TYPE_HASH(x)
Definition property.h:74
@ PT_COORD
Coordinate expressed in distance units (mm/inch)
Definition property.h:65
#define REGISTER_TYPE(x)
static struct SCH_BITMAP_DESC _SCH_BITMAP_DESC
@ SCH_BITMAP_T
Definition typeinfo.h:168
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695