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
44
46 SCH_ITEM( nullptr, SCH_BITMAP_T ),
47 m_referenceImage( schIUScale)
48{
50 m_layer = LAYER_NOTES; // used only to draw/plot a rectangle,
51 // when a bitmap cannot be drawn or plotted
52}
53
54
55SCH_BITMAP::SCH_BITMAP( const SCH_BITMAP& aSchBitmap ) :
56 SCH_ITEM( aSchBitmap ),
57 m_referenceImage( aSchBitmap.m_referenceImage )
58{
59}
60
61
63{
64 wxCHECK_MSG( Type() == aItem.Type(), *this,
65 wxT( "Cannot assign object type " ) + aItem.GetClass() + wxT( " to type " ) +
66 GetClass() );
67
68 if( &aItem != this )
69 {
70 SCH_ITEM::operator=( aItem );
71
72 const SCH_BITMAP& bitmap = static_cast<const SCH_BITMAP&>( aItem );
74 }
75
76 return *this;
77}
78
79
81{
82 return new SCH_BITMAP( *this );
83}
84
85
87{
88 wxCHECK_RET( aItem->Type() == SCH_BITMAP_T,
89 wxString::Format( wxT( "SCH_BITMAP object cannot swap data with %s object." ),
90 aItem->GetClass() ) );
91
92 SCH_BITMAP* item = (SCH_BITMAP*) aItem;
94}
95
96
98{
100}
101
102
104{
106}
107
108
109void SCH_BITMAP::SetPosition( const VECTOR2I& aPosition )
110{
111 m_referenceImage.SetPosition( aPosition );
112}
113
114
115void SCH_BITMAP::Move( const VECTOR2I& aMoveVector )
116{
117 SetPosition( GetPosition() + aMoveVector );
118}
119
120
122{
123 m_referenceImage.Flip( VECTOR2I( 0, aCenter ), FLIP_DIRECTION::TOP_BOTTOM );
124}
125
126
128{
129 m_referenceImage.Flip( VECTOR2I( aCenter, 0 ), FLIP_DIRECTION::LEFT_RIGHT );
130}
131
132
133void SCH_BITMAP::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
134{
135 m_referenceImage.Rotate( aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
136}
137
138
139#if defined(DEBUG)
140void SCH_BITMAP::Show( int nestLevel, std::ostream& os ) const
141{
142 // XML output:
143 wxString s = GetClass();
144
145 NestedSpace( nestLevel, os ) << '<' << s.Lower().mb_str() << GetPosition() << "/>\n";
146}
147#endif
148
149
150bool SCH_BITMAP::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
151{
152 return KIGEOM::BoxHitTest( aPosition, GetBoundingBox(), aAccuracy );
153}
154
155
156bool SCH_BITMAP::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
157{
158 return KIGEOM::BoxHitTest( aRect, GetBoundingBox(), aContained, aAccuracy );
159}
160
161
162void SCH_BITMAP::Plot( PLOTTER* aPlotter, bool aBackground, const SCH_PLOT_OPTS& aPlotOpts,
163 int aUnit, int aBodyStyle, const VECTOR2I& aOffset, bool aDimmed )
164{
165 if( aBackground )
166 {
167 RENDER_SETTINGS* cfg = aPlotter->RenderSettings();
168
170 cfg->GetLayerColor( GetLayer() ),
171 cfg->GetDefaultPenWidth() );
172 }
173}
174
175
177{
178 return BITMAPS::image;
179}
180
181
182void SCH_BITMAP::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
183{
184 aList.emplace_back( _( "Bitmap" ), wxEmptyString );
185
186 aList.emplace_back( _( "PPI" ),
187 wxString::Format( wxT( "%d " ), m_referenceImage.GetImage().GetPPI() ) );
188 aList.emplace_back( _( "Scale" ),
189 wxString::Format( wxT( "%f " ), m_referenceImage.GetImageScale() ) );
190
191 aList.emplace_back( _( "Width" ),
193 aList.emplace_back( _( "Height" ),
195}
196
197
198std::vector<int> SCH_BITMAP::ViewGetLayers() const
199{
201}
202
203
204bool SCH_BITMAP::operator==( const SCH_ITEM& aItem ) const
205{
206 if( Type() != aItem.Type() )
207 return false;
208
209 const SCH_BITMAP& bitmap = static_cast<const SCH_BITMAP&>( aItem );
210 return m_referenceImage == bitmap.m_referenceImage;
211}
212
213
214double SCH_BITMAP::Similarity( const SCH_ITEM& aItem ) const
215{
216 if( Type() != aItem.Type() )
217 return 0.0;
218
219 if( m_Uuid == aItem.m_Uuid )
220 return 1.0;
221
222 const SCH_BITMAP& bitmap = static_cast<const SCH_BITMAP&>( aItem );
224}
225
226
228{
230}
231
232
234{
236 offset.x = aX;
238}
239
240
242{
244}
245
246
248{
250 offset.y = aY;
252}
253
254
256{
258}
259
260
261void SCH_BITMAP::SetImageScale( double aScale )
262{
264}
265
266
268{
270}
271
272
273void SCH_BITMAP::SetWidth( int aWidth )
274{
275 m_referenceImage.SetWidth( aWidth );
276}
277
278
280{
282}
283
284
285void SCH_BITMAP::SetHeight( int aHeight )
286{
287 m_referenceImage.SetHeight( aHeight );
288}
289
290
291static struct SCH_BITMAP_DESC
292{
294 {
298
299 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Position X" ), &SCH_BITMAP::SetX,
301 PROPERTY_DISPLAY::PT_COORD ) );
302
303
304 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, int>( _HKI( "Position Y" ), &SCH_BITMAP::SetY,
306 PROPERTY_DISPLAY::PT_COORD ) );
307
308 const wxString groupImage = _HKI( "Image Properties" );
309
310 propMgr.AddProperty( new PROPERTY<SCH_BITMAP, double>( _HKI( "Scale" ),
313 groupImage );
314
316 _HKI( "Transform Offset X" ),
319 PROPERTY_DISPLAY::PT_COORD, ORIGIN_TRANSFORMS::ABS_X_COORD ),
320 groupImage );
321
323 _HKI( "Transform Offset Y" ),
326 PROPERTY_DISPLAY::PT_COORD, ORIGIN_TRANSFORMS::ABS_Y_COORD ),
327 groupImage );
328
330 _HKI( "Width" ),
333 PROPERTY_DISPLAY::PT_COORD ),
334 groupImage );
335
337 _HKI( "Height" ),
340 PROPERTY_DISPLAY::PT_COORD ),
341 groupImage );
342 }
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:114
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
void PlotImage(PLOTTER *aPlotter, const VECTOR2I &aPos, const KIGFX::COLOR4D &aDefaultColor, int aDefaultPensize) const
Plot bitmap on plotter.
int GetPPI() const
Definition: bitmap_base.h:118
VECTOR2I GetSize() const
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:98
const KIID m_Uuid
Definition: eda_item.h:516
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:110
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.
Base plotter engine class.
Definition: plotter.h:121
RENDER_SETTINGS * RenderSettings()
Definition: plotter.h:152
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:74
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:76
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void SwapData(REFERENCE_IMAGE &aItem)
void Rotate(const VECTOR2I &aCenter, const EDA_ANGLE &aAngle)
void SetTransformOriginOffset(const VECTOR2I &aCenter)
VECTOR2I GetTransformOriginOffset() const
Get the center of scaling, etc, relative to the image center (GetPosition()).
VECTOR2I GetPosition() const
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
void SetHeight(int aHeight)
VECTOR2I GetSize() const
void SetPosition(const VECTOR2I &aPos)
void SetWidth(int aWidth)
const BITMAP_BASE & GetImage() const
Get the underlying image.
double Similarity(const REFERENCE_IMAGE &aOther) const
double GetImageScale() const
void SetImageScale(double aScale)
Set the image "zoom" value.
BOX2I GetBoundingBox() const
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.
Definition: sch_bitmap.cpp:133
double GetImageScale() const
Definition: sch_bitmap.cpp:255
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: sch_bitmap.cpp:80
SCH_BITMAP(const VECTOR2I &pos=VECTOR2I(0, 0))
Definition: sch_bitmap.cpp:45
void SetWidth(int aWidth)
Definition: sch_bitmap.cpp:273
VECTOR2I GetPosition() const override
Definition: sch_bitmap.cpp:103
int GetTransformOriginOffsetY() const
Definition: sch_bitmap.cpp:241
void SetHeight(int aHeight)
Definition: sch_bitmap.cpp:285
virtual std::vector< int > ViewGetLayers() const override
Definition: sch_bitmap.cpp:198
int GetWidth() const
Definition: sch_bitmap.cpp:267
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.
Definition: sch_bitmap.cpp:162
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: sch_bitmap.cpp:97
wxString GetClass() const override
Return the class name.
Definition: sch_bitmap.h:65
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
Definition: sch_bitmap.cpp:121
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.
Definition: sch_bitmap.cpp:182
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
Definition: sch_bitmap.cpp:86
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
Definition: sch_bitmap.cpp:214
int GetHeight() const
Definition: sch_bitmap.cpp:279
void SetY(int aY)
Definition: sch_bitmap.h:58
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: sch_bitmap.cpp:176
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
Definition: sch_bitmap.cpp:150
int GetX() const
Definition: sch_bitmap.h:54
void SetTransformOriginOffsetX(int aX)
Definition: sch_bitmap.cpp:233
void SetPosition(const VECTOR2I &aPosition) override
Definition: sch_bitmap.cpp:109
void Move(const VECTOR2I &aMoveVector) override
Move the item by aMoveVector to a new position.
Definition: sch_bitmap.cpp:115
SCH_BITMAP & operator=(const SCH_ITEM &aItem)
Definition: sch_bitmap.cpp:62
void SetX(int aX)
Definition: sch_bitmap.h:55
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
Definition: sch_bitmap.cpp:127
bool operator==(const SCH_ITEM &aOther) const override
Definition: sch_bitmap.cpp:204
REFERENCE_IMAGE m_referenceImage
Definition: sch_bitmap.h:136
int GetTransformOriginOffsetX() const
Definition: sch_bitmap.cpp:227
void SetTransformOriginOffsetY(int aY)
Definition: sch_bitmap.cpp:247
void SetImageScale(double aScale)
Definition: sch_bitmap.cpp:261
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:75
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
Definition: sch_item.h:313
wxString GetClass() const override
Return the class name.
Definition: sch_item.h:178
SCH_LAYER_ID m_layer
Definition: sch_item.h:744
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 _HKI(x)
#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:283
@ LAYER_NOTES
Definition: layer_ids.h:457
@ LAYER_SELECTION_SHADOWS
Definition: layer_ids.h:484
bool BoxHitTest(const VECTOR2I &aHitPoint, const BOX2I &aHittee, int aAccuracy)
Perform a point-to-box hit test.
#define TYPE_HASH(x)
Definition: property.h:72
#define REGISTER_TYPE(x)
Definition: property_mgr.h:351
static struct SCH_BITMAP_DESC _SCH_BITMAP_DESC
@ SCH_BITMAP_T
Definition: typeinfo.h:165
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:695