29#include <google/protobuf/any.pb.h> 
   30#include <magic_enum.hpp> 
   46#include <api/board/board_types.pb.h> 
   75    *
this = *
static_cast<const PCB_SHAPE*
>( aOther );
 
 
   83    BoardGraphicShape msg;
 
   87    msg.mutable_id()->set_value( 
m_Uuid.AsStdString() );
 
   88    msg.set_locked( 
IsLocked() ? types::LockedState::LS_LOCKED : types::LockedState::LS_UNLOCKED );
 
   90    google::protobuf::Any 
any;
 
   92    any.UnpackTo( msg.mutable_shape() );
 
   96    aContainer.PackFrom( msg );
 
 
  105    BoardGraphicShape msg;
 
  107    if( !aContainer.UnpackTo( &msg ) )
 
  123    SetLocked( msg.locked() == types::LS_LOCKED );
 
  127    google::protobuf::Any 
any;
 
  128    any.PackFrom( msg.shape() );
 
 
  142    bool sametype = 
false;
 
  144    for( 
KICAD_T scanType : aScanTypes )
 
 
  206        margin = std::max( margin, -
GetWidth() / 2 );
 
 
  236        if( layermask.test( 
F_Cu ) )
 
  239        if( layermask.test( 
B_Cu ) )
 
 
  262    std::vector<VECTOR2I> ret;
 
  278            ret.emplace_back( pt.m_point );
 
  289        ret.emplace_back( 
GetEnd() );
 
  293        for( 
auto iter = 
GetPolyShape().CIterate(); iter; ++iter )
 
  294            ret.emplace_back( *iter );
 
  300            ret.emplace_back( pt );
 
 
  336                    item->TransformShapeToPolygon( holes, layer, margin, maxError, 
ERROR_OUTSIDE );
 
  349                if( item->GetLayer() == layer && item->GetBoundingBox().Intersects( bbox ) )
 
  350                    knockoutItem( item );
 
  360            holes.
Append( footprint->GetCourtyard( layer ) );
 
  363            footprint->RunOnChildren(
 
  370                            knockoutItem( item );
 
 
  445    std::vector<VECTOR2I> pts;
 
  456                pts.emplace_back( pt );
 
  464    while( pts.size() < 4 )
 
  465        pts.emplace_back( pts.back() + 
VECTOR2I( 10, 10 ) );
 
 
  501                    return seg.A.y == seg.B.y;
 
  507                    return seg.A.x == seg.B.x;
 
  511        if( 
m_poly.OutlineCount() == 1 && 
m_poly.Outline( 0 ).SegmentCount() == 4 )
 
  515            if( horizontal( outline.
Segment( 0 ) )
 
  516                && vertical( outline.
Segment( 1 ) )
 
  517                && horizontal( outline.
Segment( 2 ) )
 
  518                && vertical( outline.
Segment( 3 ) ) )
 
  526            else if( vertical( outline.
Segment( 0 ) )
 
  527                  && horizontal( outline.
Segment( 1 ) )
 
  528                  && vertical( outline.
Segment( 2 ) )
 
  529                  && horizontal( outline.
Segment( 3 ) ) )
 
 
  552        if( ( start.
x > 
end.x )
 
  553            || ( start.
x == 
end.x && start.
y < 
end.y ) )
 
 
  566    rotate( aRotCentre, aAngle );
 
 
  572    flip( aCentre, aFlipDirection );
 
 
  580    flip( aCentre, aFlipDirection );
 
 
  586    PAD* parentPad = 
nullptr;
 
  592            for( 
PAD* 
pad : fp->Pads() )
 
  594                if( 
pad->IsEntered() )
 
 
  660    std::vector<int> layers;
 
  672                layers.push_back( 
F_Mask );
 
  674                layers.push_back( 
B_Mask );
 
 
  690            aList.emplace_back( 
_( 
"Footprint" ), parent->GetReference() );
 
  693    aList.emplace_back( 
_( 
"Type" ), 
_( 
"Drawing" ) );
 
  696        aList.emplace_back( 
_( 
"Status" ), 
_( 
"Locked" ) );
 
 
  716            return wxString::Format( 
_( 
"%s %s of %s on %s" ),
 
  724            return wxString::Format( 
_( 
"%s %s on %s" ),
 
  734            return wxString::Format( 
_( 
"%s of %s on %s" ),
 
  741            return wxString::Format( 
_( 
"%s on %s" ),
 
 
  810    if( aFirst->
Type() != aSecond->
Type() )
 
  811        return aFirst->
Type() < aSecond->
Type();
 
 
  830                                         int aClearance, 
int aError, 
ERROR_LOC aErrorLoc,
 
  831                                         bool ignoreLineWidth )
 const 
 
  839                                         int aClearance, 
int aError, 
ERROR_LOC aErrorLoc )
 const 
 
  852    return *
this == other;
 
 
  898    double similarity = 1.0;
 
 
  944        if( layerEnum.
Choices().GetCount() == 0 )
 
  956                _HKI( 
"Layer" ), shapeLayerSetter, shapeLayerGetter );
 
  972                                      _HKI( 
"Position X" ), isPolygon );
 
  974                                      _HKI( 
"Position Y" ), isPolygon );
 
  992                                      _HKI( 
"Fill" ), isNotBezier );
 
 1013                                      _HKI( 
"Start X" ), isNotCircle );
 
 1015                                      _HKI( 
"Start Y" ), isNotCircle );
 
 1017                                      _HKI( 
"End X" ), isNotCircle );
 
 1019                                      _HKI( 
"End Y" ), isNotCircle );
 
 1021                                      _HKI( 
"Center X" ), isCircle );
 
 1023                                      _HKI( 
"Center Y" ), isCircle );
 
 1025                                      _HKI( 
"Radius" ), isCircle );
 
 1031                        return shape->IsOnCopperLayer();
 
 1039        auto isPadEditMode =
 
 1040                []( 
BOARD* aBoard ) -> 
bool 
 1042                    if( aBoard && aBoard->IsFootprintHolder() )
 
 1044                        for( 
FOOTPRINT* fp : aBoard->Footprints() )
 
 1046                            for( 
PAD* 
pad : fp->Pads() )
 
 1048                                if( 
pad->IsEntered() )
 
 1057        auto showNumberBoxProperty =
 
 1063                            return isPadEditMode( shape->GetBoard() );
 
 1069        auto showSpokeTemplateProperty =
 
 1075                            return isPadEditMode( shape->GetBoard() );
 
 1081        const wxString groupPadPrimitives = 
_HKI( 
"Pad Primitives" );
 
 1086                             groupPadPrimitives )
 
 1092                     groupPadPrimitives )
 
 1096        const wxString groupTechLayers = 
_HKI( 
"Technical Layers" );
 
 1098        auto isExternalCuLayer =
 
 1101                    if( 
auto shape = 
dynamic_cast<PCB_SHAPE*
>( aItem ) )
 
 
 
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
 
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
 
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
 
constexpr EDA_IU_SCALE pcbIUScale
 
constexpr int ARC_LOW_DEF
 
BITMAPS
A list of all bitmap identifiers.
 
#define DEFAULT_LINE_WIDTH
 
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
 
wxString GetNetnameMsg() const
 
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
 
BOARD_CONNECTED_ITEM(BOARD_ITEM *aParent, KICAD_T idtype)
 
void PackNet(kiapi::board::types::Net *aProto) const
 
NETINFO_ITEM * m_netinfo
Store all information about the net that item belongs to.
 
void UnpackNet(const kiapi::board::types::Net &aProto)
Assigns a net to this item from an API message.
 
Container for design settings for a BOARD object.
 
std::shared_ptr< DRC_ENGINE > m_DRCEngine
 
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
 
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
 
void SetLocked(bool aLocked) override
 
bool IsLocked() const override
 
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
 
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
 
FOOTPRINT * GetParentFootprint() const
 
virtual bool IsOnCopperLayer() const
 
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
 
Information pertinent to a Pcbnew printed circuit board.
 
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
 
constexpr const Vec & GetPosition() const
 
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
 
constexpr const Vec GetEnd() const
 
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
 
constexpr bool Intersects(const BOX2< Vec > &aRect) const
 
Represent basic circle geometry with utility geometry functions.
 
The base class for create windows for drawing purpose.
 
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
 
KICAD_T Type() const
Returns the type of object.
 
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
 
virtual const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
 
EDA_ITEM * m_parent
Owner.
 
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
 
virtual int GetHatchLineSpacing() const
 
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false, bool includeFill=false) const
Convert the shape to a closed polygon.
 
void rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
 
SHAPE_POLY_SET m_hatching
 
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
 
SHAPE_POLY_SET & GetPolyShape()
 
void ShapeGetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
 
bool operator==(const EDA_SHAPE &aOther) const
 
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
 
void flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
 
EDA_SHAPE(SHAPE_T aType, int aLineWidth, FILL_T aFill)
 
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
 
void SetStart(const VECTOR2I &aStart)
 
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
 
void SwapShape(EDA_SHAPE *aImage)
 
std::vector< VECTOR2I > GetRectCorners() const
 
virtual void UpdateHatching() const
 
void SetEnd(const VECTOR2I &aEnd)
 
wxString SHAPE_T_asString() const
 
double Similarity(const EDA_SHAPE &aOther) const
 
virtual int GetWidth() const
 
void SetWidth(int aWidth)
 
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
 
VECTOR2I GetArcMid() const
 
ENUM_MAP & Map(T aValue, const wxString &aName)
 
static ENUM_MAP< T > & Instance()
 
ENUM_MAP & Undefined(T aValue)
 
Class that other classes need to inherit from, in order to be inspectable.
 
Contains methods for drawing PCB-specific items.
 
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
 
PCB specific render settings.
 
PCB_LAYER_ID GetPrimaryHighContrastLayer() const
Return the board layer which is in high-contrast mode.
 
bool GetHighContrast() const
 
static constexpr double LOD_HIDE
Return this constant from ViewGetLOD() to hide the item unconditionally.
 
static constexpr double LOD_SHOW
Return this constant from ViewGetLOD() to show the item unconditionally.
 
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
 
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
 
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
 
LSET is a set of PCB_LAYER_IDs.
 
void RunOnLayers(const std::function< void(PCB_LAYER_ID)> &aFunction) const
Execute a function on each layer of the LSET.
 
static const LSET & AllLayersMask()
 
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
 
std::optional< int > GetLocalThermalSpokeWidthOverride() const
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
virtual void Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Mirror this object relative to a given horizontal axis the layer is not changed.
 
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 StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings, bool aCheckSide) override
 
void swapData(BOARD_ITEM *aImage) override
 
bool IsConnected() const override
Returns information if the object is derived from BOARD_CONNECTED_ITEM.
 
double ViewGetLOD(int aLayer, const KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
 
std::optional< int > GetLocalSolderMaskMargin() const
 
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
 
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
 
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
 
PCB_SHAPE(BOARD_ITEM *aParent, KICAD_T aItemType, SHAPE_T aShapeType)
 
int GetWidth() const override
 
const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
 
bool HasSolderMask() const
 
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Make a set of SHAPE objects representing the PCB_SHAPE.
 
void SetHasSolderMask(bool aVal)
 
std::optional< int > m_solderMaskMargin
 
int GetSolderMaskExpansion() const
 
void NormalizeForCompare() override
Normalize coordinates to compare 2 similar PCB_SHAPES similat to Normalize(), but also normalize SEGM...
 
const VECTOR2I GetFocusPosition() const override
Allows items to return their visual center rather than their anchor.
 
virtual void SetLayerSet(const LSET &aLayers) override
 
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
 
virtual std::vector< VECTOR2I > GetCorners() const
Return 4 corners for a rectangle or rotated rectangle (stored as a poly).
 
bool IsProxyItem() const override
 
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
 
bool operator==(const PCB_SHAPE &aShape) const
 
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
 
wxString GetFriendlyName() const override
 
void TransformShapeToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc) const override
Convert the item shape to a polyset.
 
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the shape to a closed polygon.
 
void SetIsProxyItem(bool aIsProxy=true) override
 
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
 
void Move(const VECTOR2I &aMoveVector) override
Move this object.
 
std::vector< VECTOR2I > GetConnectionPoints() const
 
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
 
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
 
int getMaxError() const override
 
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
 
void UpdateHatching() const override
 
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
 
void Scale(double aScale)
 
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
 
void Normalize() override
Perform any normalization required after a user rotate and/or flip.
 
bool IsType(const std::vector< KICAD_T > &aScanTypes) const override
Check whether the item is one of the listed types.
 
void CopyFrom(const BOARD_ITEM *aOther) override
 
std::vector< int > ViewGetLayers() const override
 
double Similarity(const BOARD_ITEM &aBoardItem) const override
Return a measure of how likely the other object is to represent the same object.
 
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
 
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
 
PROPERTY_BASE & SetIsHiddenFromRulesEditor(bool aHide=true)
 
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.
 
void Mask(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName)
Sets a base class property as masked in a derived class.
 
static PROPERTY_MANAGER & Instance()
 
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
 
void OverrideAvailability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override availability functor for a base class property of a given derived class.
 
PROPERTY_BASE & ReplaceProperty(size_t aBase, const wxString &aName, PROPERTY_BASE *aNew, const wxString &aGroup=wxEmptyString)
Replace an existing property for a specific type.
 
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
SEG Segment(int aIndex) const
Return a copy of the aIndex-th segment in the line chain.
 
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
 
Represent a set of closed polygons.
 
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
 
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
 
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.
 
A type-safe container of any type.
 
@ SOLDER_MASK_EXPANSION_CONSTRAINT
 
#define PCB_EDIT_FRAME_NAME
 
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
 
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
 
bool IsSolderMaskLayer(int aLayer)
 
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
 
int GetNetnameLayer(int aLayer)
Return a netname layer corresponding to the given layer.
 
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
 
@ LAYER_LOCKED_ITEM_SHADOW
Shadow layer for locked items.
 
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
 
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
 
bool IsExternalCopperLayer(int aLayerId)
Test whether a layer is an external (F_Cu or B_Cu) copper layer.
 
PCB_LAYER_ID
A quick note on layer IDs:
 
This file contains miscellaneous commonly used macros and functions.
 
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
 
#define UNIMPLEMENTED_FOR(type)
 
std::vector< TYPED_POINT2I > GetCircleKeyPoints(const CIRCLE &aCircle, bool aIncludeCenter)
Get key points of an CIRCLE.
 
static struct PCB_SHAPE_DESC _PCB_SHAPE_DESC
 
static bool isCopper(const PNS::ITEM *aItem)
 
@ PT_SIZE
Size expressed in distance units (mm/inch)
 
Utility functions for working with shapes.
 
bool operator()(const BOARD_ITEM *aFirst, const BOARD_ITEM *aSecond) const
 
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
 
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
 
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
 
@ PCB_LOCATE_BOARD_EDGE_T
 
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
 
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
 
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
 
@ PCB_SHAPE_LOCATE_CIRCLE_T
 
@ PCB_SHAPE_LOCATE_SEGMENT_T
 
@ PCB_SHAPE_LOCATE_RECT_T
 
@ PCB_SHAPE_LOCATE_BEZIER_T
 
@ PCB_SHAPE_LOCATE_POLY_T
 
VECTOR2< int32_t > VECTOR2I
 
#define ZONE_THERMAL_RELIEF_COPPER_WIDTH_MM