29#include <google/protobuf/any.pb.h>
30#include <magic_enum.hpp>
46#include <api/board/board_types.pb.h>
76 BoardGraphicShape msg;
78 msg.set_layer( ToProtoEnum<PCB_LAYER_ID, BoardLayer>(
GetLayer() ) );
79 msg.mutable_net()->mutable_code()->set_value(
GetNetCode() );
82 msg.set_locked(
IsLocked() ? types::LockedState::LS_LOCKED : types::LockedState::LS_UNLOCKED );
84 google::protobuf::Any any;
86 any.UnpackTo( msg.mutable_shape() );
90 aContainer.PackFrom( msg );
99 BoardGraphicShape msg;
101 if( !aContainer.UnpackTo( &msg ) )
117 SetLocked( msg.locked() == types::LS_LOCKED );
118 SetLayer( FromProtoEnum<PCB_LAYER_ID, BoardLayer>( msg.layer() ) );
121 google::protobuf::Any any;
122 any.PackFrom( msg.shape() );
136 bool sametype =
false;
138 for(
KICAD_T scanType : aScanTypes )
143 sametype =
m_shape == SHAPE_T::ARC;
145 sametype =
m_shape == SHAPE_T::CIRCLE;
147 sametype =
m_shape == SHAPE_T::RECTANGLE;
149 sametype =
m_shape == SHAPE_T::SEGMENT;
151 sametype =
m_shape == SHAPE_T::POLY;
153 sametype =
m_shape == SHAPE_T::BEZIER;
194 margin = std::max( margin, -
GetWidth() / 2 );
224 if( layermask.test(
F_Cu ) )
227 if( layermask.test(
B_Cu ) )
250 std::vector<VECTOR2I> ret;
261 case SHAPE_T::CIRCLE:
266 ret.emplace_back( pt.m_point );
274 case SHAPE_T::SEGMENT:
275 case SHAPE_T::BEZIER:
277 ret.emplace_back(
GetEnd() );
281 for(
auto iter =
GetPolyShape().CIterate(); iter; ++iter )
282 ret.emplace_back( *iter );
286 case SHAPE_T::RECTANGLE:
288 ret.emplace_back( pt );
292 case SHAPE_T::UNDEFINED:
324 case SHAPE_T::CIRCLE:
330 case SHAPE_T::RECTANGLE:
350 case SHAPE_T::BEZIER:
361 std::vector<VECTOR2I> pts;
363 if(
GetShape() == SHAPE_T::RECTANGLE )
367 else if(
GetShape() == SHAPE_T::POLY )
372 pts.emplace_back( pt );
380 while( pts.size() < 4 )
381 pts.emplace_back( pts.back() +
VECTOR2I( 10, 10 ) );
401 if(
m_shape == SHAPE_T::RECTANGLE )
406 BOX2I rect( start, end - start );
412 else if(
m_shape == SHAPE_T::POLY )
417 return seg.A.y == seg.B.y;
423 return seg.A.x == seg.B.x;
431 if( horizontal( outline.
Segment( 0 ) )
432 && vertical( outline.
Segment( 1 ) )
433 && horizontal( outline.
Segment( 2 ) )
434 && vertical( outline.
Segment( 3 ) ) )
442 else if( vertical( outline.
Segment( 0 ) )
443 && horizontal( outline.
Segment( 1 ) )
444 && vertical( outline.
Segment( 2 ) )
445 && horizontal( outline.
Segment( 3 ) ) )
460 if(
m_shape == SHAPE_T::SEGMENT )
468 if( ( start.
x > end.
x )
469 || ( start.
x == end.
x && start.
y < end.
y ) )
482 rotate( aRotCentre, aAngle );
488 flip( aCentre, aFlipDirection );
502 case SHAPE_T::SEGMENT:
503 case SHAPE_T::RECTANGLE:
504 case SHAPE_T::CIRCLE:
505 case SHAPE_T::BEZIER:
532 PAD* parentPad =
nullptr;
538 for(
PAD*
pad : fp->Pads() )
540 if(
pad->IsEntered() )
551 if(
GetShape() == SHAPE_T::SEGMENT )
574 constexpr double HIDE = std::numeric_limits<double>::max();
575 constexpr double SHOW = 0.0;
609 std::vector<int> layers;
621 layers.push_back(
F_Mask );
623 layers.push_back(
B_Mask );
639 aList.emplace_back(
_(
"Footprint" ), parent->GetReference() );
642 aList.emplace_back(
_(
"Type" ),
_(
"Drawing" ) );
645 aList.emplace_back(
_(
"Status" ),
_(
"Locked" ) );
667 return wxString::Format(
_(
"%s %s of %s on %s" ),
675 return wxString::Format(
_(
"%s %s on %s" ),
685 return wxString::Format(
_(
"%s of %s on %s" ),
692 return wxString::Format(
_(
"%s on %s" ),
703 return BITMAPS::show_mod_edge;
705 return BITMAPS::add_dashed_line;
755 if( aFirst->
Type() != aSecond->
Type() )
756 return aFirst->
Type() < aSecond->
Type();
775 int aClearance,
int aError,
ERROR_LOC aErrorLoc,
776 bool ignoreLineWidth )
const
789 return *
this == other;
835 double similarity = 1.0;
881 if( layerEnum.
Choices().GetCount() == 0 )
893 _HKI(
"Layer" ), shapeLayerSetter, shapeLayerGetter );
903 return shape->GetShape() == SHAPE_T::POLY;
909 _HKI(
"Position X" ), isPolygon );
911 _HKI(
"Position Y" ), isPolygon );
920 return shape->IsOnCopperLayer();
929 [](
BOARD* aBoard ) ->
bool
931 if( aBoard && aBoard->IsFootprintHolder() )
933 for(
FOOTPRINT* fp : aBoard->Footprints() )
935 for(
PAD*
pad : fp->Pads() )
937 if(
pad->IsEntered() )
946 auto showNumberBoxProperty =
951 if( shape->GetShape() == SHAPE_T::RECTANGLE )
952 return isPadEditMode( shape->GetBoard() );
958 auto showSpokeTemplateProperty =
963 if( shape->GetShape() == SHAPE_T::SEGMENT )
964 return isPadEditMode( shape->GetBoard() );
970 const wxString groupPadPrimitives =
_HKI(
"Pad Primitives" );
986 const wxString groupTechLayers =
_HKI(
"Technical Layers" );
988 auto isExternalCuLayer =
991 if(
auto shape =
dynamic_cast<PCB_SHAPE*
>( aItem ) )
1001 .SetAvailableFunc( isExternalCuLayer );
1004 _HKI(
"Soldermask Margin Override" ),
1007 PROPERTY_DISPLAY::PT_SIZE ),
1009 .SetAvailableFunc( isExternalCuLayer );
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
constexpr int ARC_HIGH_DEF
constexpr EDA_IU_SCALE pcbIUScale
BITMAPS
A list of all bitmap identifiers.
#define DEFAULT_LINE_WIDTH
BASE_SET & set(size_t pos)
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.
wxString GetNetname() const
NETINFO_ITEM * m_netinfo
Store all information about the net that item belongs to.
Container for design settings for a BOARD object.
int m_SolderMaskExpansion
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...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual void SetLocked(bool aLocked)
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 IsLocked() 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.
Represent basic circle geometry with utility geometry functions.
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
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
Linked list: Link (parent struct)
void rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
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 RebuildBezierToSegmentsPointsList(int aMaxError)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
void flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
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
void SetEnd(const VECTOR2I &aEnd)
wxString SHAPE_T_asString() const
double Similarity(const EDA_SHAPE &aOther) const
virtual int GetWidth() const
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const
Convert the shape to a closed polygon.
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
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.
std::string AsStdString() const
LSET is a set of PCB_LAYER_IDs.
static LSET AllLayersMask()
void RunOnLayers(const std::function< void(PCB_LAYER_ID)> &aFunction) const
Execute a function on each layer of the LSET.
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
int GetThermalSpokeWidth() const
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 swapData(BOARD_ITEM *aImage) override
bool IsConnected() const override
Returns information if the object is derived from BOARD_CONNECTED_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 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 StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings) 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.
double ViewGetLOD(int aLayer, KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
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.
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.
int SegmentCount() const
Return the number of segments in this line chain.
const std::vector< VECTOR2I > & CPoints() const
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
void Mirror(const VECTOR2I &aRef, FLIP_DIRECTION aFlipDirection)
Mirror the line points about y or x (or both)
int OutlineCount() const
Return the number of outlines in the set.
void SetWidth(int aWidth)
#define PCB_EDIT_FRAME_NAME
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)
Returns a netname layer corresponding to the given layer.
bool IsCopperLayer(int aLayerId)
Tests 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)
Tests 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)
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
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)
Utility functions for working with shapes.
constexpr int mmToIU(double mm) const
bool operator()(const BOARD_ITEM *aFirst, const BOARD_ITEM *aSecond) const
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_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