KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_barcode.h
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) 2020 Thomas Pointhuber <[email protected]>
5 * Copyright (C) 2020 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, see <https://www.gnu.org/licenses/>.
19 */
20
25
26#ifndef BARCODE_H_
27#define BARCODE_H_
28
29
30#include <board_item.h>
32#include <pcb_text.h>
33#include <memory>
34
35class LINE_READER;
36class MSG_PANEL_ITEM;
37
38
39enum class BARCODE_T : int
40{
46};
47
48enum class BARCODE_ECC_T : int
49{
50 L = 1, // Low
51 M = 2, // Medium
52 Q = 3, // Quartile
53 H = 4 // High
54};
55
58
59
71
72
73class PCB_BARCODE : public BOARD_ITEM
74{
75public:
81 PCB_BARCODE( BOARD_ITEM* aParent );
82
86 PCB_BARCODE( const PCB_BARCODE& aOther );
87
94 PCB_BARCODE& operator=( const PCB_BARCODE& aOther );
95
100
106 static inline bool ClassOf( const EDA_ITEM* aItem ) { return aItem && PCB_BARCODE_T == aItem->Type(); }
107
111 VECTOR2I GetPosition() const override;
112 void SetPosition( const VECTOR2I& aPos ) override;
113
119 void SetTextSize( int aTextSize );
120
121 int GetTextSize() const;
122
128 void SetLayer( PCB_LAYER_ID aLayer ) override;
129
130 void Serialize( google::protobuf::Any& aContainer ) const override;
131 bool Deserialize( const google::protobuf::Any& aContainer ) override;
132
136 int GetWidth() const { return m_width; }
137 void SetWidth( int aWidth ) { m_width = aWidth; }
138
142 int GetHeight() const { return m_height; }
143 void SetHeight( int aHeight ) { m_height = aHeight; }
144
148 const VECTOR2I& GetMargin() const { return m_margin; }
149 void SetMargin( const VECTOR2I& aMargin ) { m_margin = aMargin; }
150
157 {
159 return m_cache->poly;
160 }
161
166 {
168 return m_cache->symbolPoly;
169 }
170
175 {
177 return m_cache->textPoly;
178 }
179
193 void TransformShapeToPolygon( SHAPE_POLY_SET& aBuffer, PCB_LAYER_ID aLayer, int aClearance,
194 int aMaxError, ERROR_LOC aErrorLoc = ERROR_INSIDE,
195 bool ignoreLineWidth = false ) const override;
196
197
199 std::shared_ptr<SHAPE> GetEffectiveShape( PCB_LAYER_ID aLayer = UNDEFINED_LAYER,
201 DRC_CONSTRAINT_T aUsage = NULL_CONSTRAINT ) const override;
202
206 void GetBoundingHull( SHAPE_POLY_SET& aBuffer, PCB_LAYER_ID aLayer, int aClearance,
207 int aMaxError, ERROR_LOC aErrorLoc = ERROR_INSIDE ) const;
208
215 void ComputeBarcode() const;
216
223 void ComputeTextPoly() const;
224
229 void AssembleBarcode() const;
230
236 void SetText( const wxString& aText );
237 wxString GetText() const;
238 wxString GetShownText( RESOLUTION_CONTEXT aContext ) const;
239
243 const std::vector<TEXT_VAR_REF_KEY>& GetTextVarReferences() const { return m_text.GetTextVarReferences(); }
244
250 void Move( const VECTOR2I& offset ) override;
251
259 void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle ) override;
260
268 void Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipLeftRight ) override;
269
270 void OnFootprintRescaled( double aRatioX, double aRatioY, double aLinearFactor, const VECTOR2I& aAnchor,
271 const EDA_ANGLE& aParentRotate ) override;
272
273 const VECTOR2I& GetLibraryPos() const { return m_libPos; }
274 EDA_ANGLE GetLibraryAngle() const { return m_libAngle.GetAngle(); }
275
276 void StyleFromSettings( const BOARD_DESIGN_SETTINGS& settings, bool aCheckSide ) override;
277
281 VECTOR2I GetCenter() const override { return GetPosition(); }
282
289 void GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList ) override;
290
298 bool HitTest( const VECTOR2I& aPosition, int aAccuracy ) const override;
299
307 bool HitTest( const BOX2I& aRect, bool aContained, int aAccuracy = 0 ) const override;
308
312 wxString GetClass() const override { return wxT( "BARCODE" ); }
313
314 // Virtual function
320 const BOX2I GetBoundingBox() const override;
321
329 wxString GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const override;
330
334 BITMAPS GetMenuImage() const override;
335
341 EDA_ITEM* Clone() const override;
342
343 void swapData( BOARD_ITEM* aImage ) override;
344
348 virtual const BOX2I ViewBBox() const override;
349
350 double ViewGetLOD( int aLayer, const KIGFX::VIEW* aView ) const override;
351
358 double Similarity( const BOARD_ITEM& aItem ) const override;
359
360 static int Compare( const PCB_BARCODE* aBarcode, const PCB_BARCODE* aOther );
361
368 bool operator==( const BOARD_ITEM& aItem ) const override;
369
370 bool operator==( const PCB_BARCODE& aBarcode ) const;
371
375 BARCODE_T GetKind() const { return m_kind; }
376 void SetKind( BARCODE_T aKind );
377 void SetBarcodeKind( BARCODE_T aKind ); // Includes re-compute
378
379 bool KeepSquare() const
380 {
381 return m_kind == BARCODE_T::QR_CODE
384 }
385
391 void SetErrorCorrection( BARCODE_ECC_T aErrorCorrection );
393 void SetBarcodeErrorCorrection( BARCODE_ECC_T aErrorCorrection ); // Includes re-compute
394
395 void SetBarcodeText( const wxString& aText ) { SetText( aText ); AssembleBarcode(); }
396 void SetShowText( bool aShow ) { m_text.SetVisible( aShow ); AssembleBarcode(); }
397 bool GetShowText() const { return m_text.IsVisible(); }
398
399 void SetBarcodeWidth( int aWidth );
400 void SetBarcodeHeight( int aHeight );
401
402 EDA_ANGLE GetAngle() const;
403 double GetOrientation() const { return GetAngle().AsDegrees(); }
404 void SetOrientation( double aDegrees )
405 {
406 EDA_ANGLE newAngle = EDA_ANGLE( aDegrees, DEGREES_T ).Normalized();
407 EDA_ANGLE oldAngle = GetAngle();
408
409 if( newAngle != oldAngle )
410 {
411 Rotate( GetPosition(), newAngle - oldAngle );
412 }
413 }
414
415 int GetMarginX() const { return m_margin.x; }
416 int GetMarginY() const { return m_margin.y; }
417
418 void SetMarginX( int aX )
419 {
420 aX = std::max( pcbIUScale.mmToIU( 1 ), aX );
421 m_margin.x = aX;
423 }
424
425 void SetMarginY( int aY )
426 {
427 aY = std::max( pcbIUScale.mmToIU( 1 ), aY );
428 m_margin.y = aY;
430 }
431
432 bool IsKnockout() const override { return BOARD_ITEM::IsKnockout(); }
433 void SetIsKnockout( bool aEnable ) override
434 {
435 BOARD_ITEM::SetIsKnockout( aEnable );
437 }
438
439 const wxString& GetLastError() const
440 {
442 return m_cache->lastError;
443 }
444
445private:
454
455 mutable std::unique_ptr<PCB_BARCODE_CACHE> m_cache;
456
460 size_t computeCacheKey() const;
461
465 void rescaleSymbolPoly( const VECTOR2I& aTopLeft, const VECTOR2I& aBotRight ) const;
466};
467
468#endif // DIMENSION_H_
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
@ ERROR_INSIDE
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:128
BITMAPS
A list of all bitmap identifiers.
BOX2< VECTOR2I > BOX2I
Definition box2.h:914
Container for design settings for a BOARD object.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition board_item.h:86
virtual bool IsKnockout() const
Definition board_item.h:414
virtual void SetIsKnockout(bool aKnockout)
Definition board_item.h:415
double AsDegrees() const
Definition eda_angle.h:115
EDA_ANGLE Normalized() const
Definition eda_angle.h:241
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
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:84
An "orientation", held as an angle constrained to the range [0, 360) degrees.
Definition eda_angle.h:473
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:63
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Definition richio.h:65
EDA_MSG_PANEL items for displaying messages.
Definition msgpanel.h:50
void SetKind(BARCODE_T aKind)
void SetTextSize(int aTextSize)
Change the height of the human-readable text displayed below the barcode.
VECTOR2I GetCenter() const override
Get the centre of the barcode (alias for GetPosition).
double GetOrientation() const
const VECTOR2I & GetLibraryPos() const
std::unique_ptr< PCB_BARCODE_CACHE > m_cache
const VECTOR2I & GetMargin() const
Get the barcode margin (in internal units).
~PCB_BARCODE()
Destructor.
const BOX2I GetBoundingBox() const override
Get the axis-aligned bounding box of the barcode including text.
void SetBarcodeErrorCorrection(BARCODE_ECC_T aErrorCorrection)
virtual const BOX2I ViewBBox() const override
Get the bbox used for drawing/view culling, may include additional view-only extents.
EDA_ANGLE GetLibraryAngle() const
void SetMargin(const VECTOR2I &aMargin)
EDA_ITEM * Clone() const override
Create a copy of this item.
void SetErrorCorrection(BARCODE_ECC_T aErrorCorrection)
Set the error correction level used for QR codes.
wxString GetShownText(RESOLUTION_CONTEXT aContext) const
void SetBarcodeHeight(int aHeight)
void SetShowText(bool aShow)
void SetMarginY(int aY)
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings, bool aCheckSide) override
bool KeepSquare() const
void SetBarcodeText(const wxString &aText)
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Produce a short human-readable description of the item for UI lists.
void SetWidth(int aWidth)
void AssembleBarcode() const
Assemble the barcode polygon and text polygons into a single polygonal representation.
void SetBarcodeKind(BARCODE_T aKind)
void GetBoundingHull(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc=ERROR_INSIDE) const
Add two rectangular polygons separately bounding the barcode's symbol and the barcode's text.
void SetHeight(int aHeight)
PCB_BARCODE & operator=(const PCB_BARCODE &aOther)
Copy assignment operator.
VECTOR2I GetPosition() const override
Get the position (center) of the barcode in internal units.
void ComputeTextPoly() const
Generate the internal polygon representation for the human-readable text.
const std::vector< TEXT_VAR_REF_KEY > & GetTextVarReferences() const
Return the text variable references used by the barcode's content string.
wxString GetText() const
void SetPosition(const VECTOR2I &aPos) override
void SetMarginX(int aX)
double ViewGetLOD(int aLayer, const KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
void SetOrientation(double aDegrees)
double Similarity(const BOARD_ITEM &aItem) const override
Compute a simple similarity score between this barcode and another board item.
int m_height
Barcode height.
PCB_TEXT m_text
void SetLayer(PCB_LAYER_ID aLayer) override
Set the drawing layer for the barcode and its text.
bool operator==(const BOARD_ITEM &aItem) const override
Equality comparison operator for board-level deduplication.
VECTOR2I m_margin
Margin around the barcode (only valid for knockout)
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate message panel information entries (e.g.
wxString GetClass() const override
Return the class name for display/debugging purposes.
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
int GetTextSize() const
void ComputeBarcode() const
Generate the internal polygon representation for the current barcode text, kind and error correction.
void SetBarcodeWidth(int aWidth)
bool IsKnockout() const override
int GetHeight() const
Get the barcode height (in internal units).
BITMAPS GetMenuImage() const override
Icon to show in context menus/toolbars for this item type.
size_t computeCacheKey() const
Compute a hash of all cache-key inputs (shown text + geometry parameters + layer).
BARCODE_ECC_T m_errorCorrection
Error correction level for QR codes.
void SetIsKnockout(bool aEnable) override
static bool ClassOf(const EDA_ITEM *aItem)
Type-check helper.
void rescaleSymbolPoly(const VECTOR2I &aTopLeft, const VECTOR2I &aBotRight) const
Scale and translate the symbol polygon to fill the given bounding rectangle.
const SHAPE_POLY_SET & GetPolyShape() const
Access the underlying polygonal representation generated for the barcode.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy) const override
Hit-test a point against the barcode (text and symbol area).
PCB_BARCODE(BOARD_ITEM *aParent)
Construct a PCB_BARCODE.
const wxString & GetLastError() const
void OnFootprintRescaled(double aRatioX, double aRatioY, double aLinearFactor, const VECTOR2I &aAnchor, const EDA_ANGLE &aParentRotate) override
Apply a parent footprint scale to this item.
int m_width
Barcode width.
const SHAPE_POLY_SET & GetTextPoly() const
Access the cached polygon for the human-readable text only (already scaled/placed).
const SHAPE_POLY_SET & GetSymbolPoly() const
Access the cached polygon for the barcode symbol only (no text, no margins/knockout).
VECTOR2I m_libPos
Position, FP-relative when in a footprint, board absolute otherwise.
int GetMarginY() const
void swapData(BOARD_ITEM *aImage) override
BARCODE_ECC_T GetErrorCorrection() const
EDA_ORIENTATION m_libAngle
Angle, FP-relative when in a footprint, board absolute otherwise.
bool GetShowText() const
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate the barcode around a given centre by the given angle.
int GetMarginX() const
BARCODE_T m_kind
static int Compare(const PCB_BARCODE *aBarcode, const PCB_BARCODE *aOther)
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aMaxError, ERROR_LOC aErrorLoc=ERROR_INSIDE, bool ignoreLineWidth=false) const override
Convert the barcode (text + symbol shapes) to polygonal geometry suitable for filling/collision tests...
EDA_ANGLE GetAngle() const
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT, DRC_CONSTRAINT_T aUsage=NULL_CONSTRAINT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipLeftRight) override
Flip the barcode horizontally or vertically around a centre point.
BARCODE_T GetKind() const
Returns the type of the barcode (QR, CODE_39, etc.).
int GetWidth() const
Get the barcode width (in internal units).
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
void SetText(const wxString &aText)
Set the barcode content text to encode.
void Move(const VECTOR2I &offset) override
Move the barcode and its text by the given offset.
Represent a set of closed polygons.
RESOLUTION_CONTEXT
Definition common.h:89
DRC_CONSTRAINT_T
Definition drc_rule.h:49
@ NULL_CONSTRAINT
Definition drc_rule.h:50
@ DEGREES_T
Definition eda_angle.h:30
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition layer_ids.h:180
@ DEFAULT
Flashing follows connectivity.
Definition layer_ids.h:181
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ UNDEFINED_LAYER
Definition layer_ids.h:57
#define H(x, y, z)
Definition md5_hash.cpp:17
FLIP_DIRECTION
Definition mirror.h:23
BARCODE_ECC_T
Definition pcb_barcode.h:49
BARCODE_T
Definition pcb_barcode.h:40
#define DECLARE_ENUM_TO_WXANY(type)
Definition property.h:851
SHAPE_POLY_SET poly
Definition pcb_barcode.h:65
SHAPE_POLY_SET textPoly
Definition pcb_barcode.h:67
size_t keyHash
Hash of all cache-key inputs (via computeCacheKey)
Definition pcb_barcode.h:62
SHAPE_POLY_SET symbolPoly
Definition pcb_barcode.h:66
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
Definition typeinfo.h:93
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708