28#include <api/board/board_types.pb.h>
31#include <magic_enum.hpp>
79 for( std::shared_ptr<PCB_SHAPE>& shape :
CopperLayer( aLayer ).custom_shapes )
174 bool copperMatches =
true;
180 copperMatches =
false;
183 return copperMatches;
210 if( aProto.chamfered_corners().top_left() )
213 if( aProto.chamfered_corners().top_right() )
216 if( aProto.chamfered_corners().bottom_left() )
219 if( aProto.chamfered_corners().bottom_right() )
223 google::protobuf::Any a;
225 for(
const BoardGraphicShape& shapeProto : aProto.custom_shapes() )
227 a.PackFrom( shapeProto );
228 std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>(
m_parent );
230 if( shape->Deserialize( a ) )
242 auto unpackOptional = []<
typename ProtoEnum>(
const ProtoEnum& aProto,
243 std::optional<bool>& aDest, ProtoEnum aTrueValue,
244 ProtoEnum aFalseValue )
246 if( aProto == aTrueValue )
248 else if( aProto == aFalseValue )
251 aDest = std::nullopt;
254 auto unpackPostMachining = [](
const PostMachiningProperties& aProto,
257 switch( aProto.mode() )
262 default: aDest.mode = std::nullopt;
break;
265 aDest.size = aProto.size();
266 aDest.depth = aProto.depth();
267 aDest.angle = aProto.angle();
278 unpackOptional( padstack.drill().capped(),
Drill().is_capped, VDCM_CAPPED, VDCM_UNCAPPED );
279 unpackOptional( padstack.drill().filled(),
Drill().is_filled, VDFM_FILLED, VDFM_UNFILLED );
281 if( padstack.has_front_post_machining() )
284 if( padstack.has_back_post_machining() )
289 if( padstack.has_secondary_drill() )
291 const DrillProperties& secondary = padstack.secondary_drill();
298 unpackOptional( secondary.capped(),
SecondaryDrill().is_capped, VDCM_CAPPED, VDCM_UNCAPPED );
299 unpackOptional( secondary.filled(),
SecondaryDrill().is_filled, VDFM_FILLED, VDFM_UNFILLED );
311 if( padstack.has_tertiary_drill() )
313 const DrillProperties& tertiary = padstack.tertiary_drill();
320 unpackOptional( tertiary.capped(),
TertiaryDrill().is_capped, VDCM_CAPPED, VDCM_UNCAPPED );
321 unpackOptional( tertiary.filled(),
TertiaryDrill().is_filled, VDFM_FILLED, VDFM_UNFILLED );
333 for(
const PadStackLayer& layer : padstack.copper_layers() )
342 if( padstack.has_zone_settings() )
347 if( padstack.zone_settings().has_thermal_spokes() )
349 const ThermalSpokeSettings& thermals = padstack.zone_settings().thermal_spokes();
351 if( thermals.has_gap() )
354 if( thermals.has_width() )
369 unpackOptional( padstack.front_outer_layers().solder_mask_mode(),
372 unpackOptional( padstack.back_outer_layers().solder_mask_mode(),
375 unpackOptional( padstack.front_outer_layers().covering_mode(),
FrontOuterLayers().has_covering,
376 VCM_COVERED, VCM_UNCOVERED );
378 unpackOptional( padstack.back_outer_layers().covering_mode(),
BackOuterLayers().has_covering,
379 VCM_COVERED, VCM_UNCOVERED );
381 unpackOptional( padstack.front_outer_layers().plugging_mode(),
FrontOuterLayers().has_plugging,
382 VPM_PLUGGED, VPM_UNPLUGGED );
384 unpackOptional( padstack.back_outer_layers().plugging_mode(),
BackOuterLayers().has_plugging,
385 VPM_PLUGGED, VPM_UNPLUGGED );
387 unpackOptional( padstack.front_outer_layers().solder_paste_mode(),
390 unpackOptional( padstack.back_outer_layers().solder_paste_mode(),
393 if( padstack.front_outer_layers().has_solder_mask_settings()
394 && padstack.front_outer_layers().solder_mask_settings().has_solder_mask_margin() )
397 padstack.front_outer_layers().solder_mask_settings().solder_mask_margin().value_nm();
404 if( padstack.back_outer_layers().has_solder_mask_settings()
405 && padstack.back_outer_layers().solder_mask_settings().has_solder_mask_margin() )
408 padstack.back_outer_layers().solder_mask_settings().solder_mask_margin().value_nm();
415 if( padstack.front_outer_layers().has_solder_paste_settings()
416 && padstack.front_outer_layers().solder_paste_settings().has_solder_paste_margin() )
419 padstack.front_outer_layers().solder_paste_settings().solder_paste_margin().value_nm();
426 if( padstack.back_outer_layers().has_solder_paste_settings()
427 && padstack.back_outer_layers().solder_paste_settings().has_solder_paste_margin() )
430 padstack.back_outer_layers().solder_paste_settings().solder_paste_margin().value_nm();
437 if( padstack.front_outer_layers().has_solder_paste_settings()
438 && padstack.front_outer_layers().solder_paste_settings().has_solder_paste_margin_ratio() )
441 padstack.front_outer_layers().solder_paste_settings().solder_paste_margin_ratio().value();
448 if( padstack.back_outer_layers().has_solder_paste_settings()
449 && padstack.back_outer_layers().solder_paste_settings().has_solder_paste_margin_ratio() )
452 padstack.back_outer_layers().solder_paste_settings().solder_paste_margin_ratio().value();
466 kiapi::board::types::PadStack padstack;
468 if( !aContainer.UnpackTo( &padstack ) )
495 return const_cast<DRILL_PROPS*
>( std::as_const( *this ).findBackdrillDrill( aTop ) );
510 if( home.
size.
x > 0 && home.
start == otherSide )
534 if( hasTop && hasBottom )
549 auto apply = [
this](
bool aTop,
bool aWant )
557 if( drill.
size.
x <= 0 )
574 return drill->size.x;
582 if( aSize.has_value() )
585 target.
size = { *aSize, *aSize };
627 padstack.mutable_angle()->set_value_degrees(
m_orientation.AsDegrees() );
634 if(
m_drill.is_capped.has_value() )
635 padstack.mutable_drill()->set_capped(
m_drill.is_capped.value() ? VDCM_CAPPED : VDCM_UNCAPPED );
637 if(
m_drill.is_filled.has_value() )
638 padstack.mutable_drill()->set_filled(
m_drill.is_filled.value() ? VDFM_FILLED : VDFM_UNFILLED );
642 DrillProperties* secondary = padstack.mutable_secondary_drill();
649 secondary->set_capped(
m_secondaryDrill.is_capped.value() ? VDCM_CAPPED : VDCM_UNCAPPED );
652 secondary->set_filled(
m_secondaryDrill.is_filled.value() ? VDFM_FILLED : VDFM_UNFILLED );
657 DrillProperties* tertiary = padstack.mutable_tertiary_drill();
664 tertiary->set_capped(
m_tertiaryDrill.is_capped.value() ? VDCM_CAPPED : VDCM_UNCAPPED );
667 tertiary->set_filled(
m_tertiaryDrill.is_filled.value() ? VDFM_FILLED : VDFM_UNFILLED );
671 PostMachiningProperties* aProto )
673 if( aProps.
mode.has_value() )
675 switch( aProps.
mode.value() )
684 aProto->set_size( aProps.
size );
685 aProto->set_depth( aProps.
depth );
686 aProto->set_angle( aProps.
angle );
698 PadStackLayer* layer = padstack.add_copper_layers();
713 layer->mutable_chamfered_corners()->set_top_left(
true );
716 layer->mutable_chamfered_corners()->set_top_right(
true );
719 layer->mutable_chamfered_corners()->set_bottom_left(
true );
722 layer->mutable_chamfered_corners()->set_bottom_right(
true );
724 for(
const std::shared_ptr<PCB_SHAPE>& shape : props.
custom_shapes )
726 google::protobuf::Any a;
727 shape->Serialize( a );
728 a.UnpackTo( layer->add_custom_shapes() );
734 padstack.mutable_zone_settings()->set_zone_connection(
740 padstack.mutable_zone_settings()->mutable_thermal_spokes()->mutable_gap()->set_value_nm(
746 padstack.mutable_zone_settings()->mutable_thermal_spokes()->mutable_width()->set_value_nm(
752 padstack.mutable_zone_settings()->mutable_thermal_spokes()->mutable_angle()->set_value_degrees(
761 padstack.mutable_front_outer_layers()->set_solder_mask_mode(
767 padstack.mutable_back_outer_layers()->set_solder_mask_mode(
768 BackOuterLayers().has_solder_mask.value() ? SMM_MASKED : SMM_UNMASKED );
773 padstack.mutable_front_outer_layers()->set_covering_mode(
779 padstack.mutable_back_outer_layers()->set_covering_mode(
780 BackOuterLayers().has_covering.value() ? VCM_COVERED : VCM_UNCOVERED );
785 padstack.mutable_front_outer_layers()->set_plugging_mode(
791 padstack.mutable_back_outer_layers()->set_plugging_mode(
792 BackOuterLayers().has_plugging.value() ? VPM_PLUGGED : VPM_UNPLUGGED );
797 padstack.mutable_front_outer_layers()->set_solder_paste_mode(
803 padstack.mutable_back_outer_layers()->set_solder_paste_mode(
804 BackOuterLayers().has_solder_paste.value() ? SPM_PASTE : SPM_NO_PASTE );
809 padstack.mutable_front_outer_layers()->mutable_solder_mask_settings()->mutable_solder_mask_margin()->set_value_nm(
815 padstack.mutable_back_outer_layers()->mutable_solder_mask_settings()->mutable_solder_mask_margin()->set_value_nm(
821 padstack.mutable_front_outer_layers()->mutable_solder_paste_settings()->mutable_solder_paste_margin()->set_value_nm(
827 padstack.mutable_back_outer_layers()->mutable_solder_paste_settings()->mutable_solder_paste_margin()->set_value_nm(
833 padstack.mutable_front_outer_layers()->mutable_solder_paste_settings()->mutable_solder_paste_margin_ratio()->set_value(
839 padstack.mutable_back_outer_layers()->mutable_solder_paste_settings()->mutable_solder_paste_margin_ratio()->set_value(
848 kiapi::board::types::PadStack padstack;
850 aContainer.PackFrom( padstack );
962 int min_r = std::min( size.
x, size.
y );
1126 if(
CopperLayer( aLayer ).thermal_spoke_angle.has_value() )
1162 for(
const std::shared_ptr<PCB_SHAPE>& item : aList )
1166 list.emplace_back( new_shape );
1261 std::vector<PCB_LAYER_ID> layers;
1266 layers.push_back( layer );
1321 layers.
set( layer );
1326 layers.
set( layer );
1344 maxHoleSize = std::max( maxHoleSize, frontPM.
size );
1350 maxHoleSize = std::max( maxHoleSize, backPM.
size );
1357 maxHoleSize = std::max( maxHoleSize, secondaryDrill.
size.
x );
1360 maxHoleSize = std::max( maxHoleSize, tertiaryDrill.
size.
x );
1373 return std::nullopt;
1384 return std::nullopt;
1395 return std::nullopt;
1411#define TEST( a, b ) { if( a != b ) return a - b; }
1476 double similarity = 1.0;
1531 std::unordered_map<PCB_LAYER_ID, COPPER_LAYER_PROPS> oldCopperProps =
m_copperProps;
1540 std::unordered_map<PCB_LAYER_ID, COPPER_LAYER_PROPS> oldCopperProps =
m_copperProps;
1543 for(
const auto& [layer, props] : oldCopperProps )
1585 return wxEmptyString;
1591 if( aCustomName.IsEmpty() )
1601 m_customName = std::make_unique<wxString>( aCustomName );
1658 if( !(
shape == aOther.
shape ) )
return false;
1675 double similarity = 1.0;
1702#define TEST_OPT( a, b, v ) \
1704 if( a.has_value() != b.has_value() ) \
1705 return a.has_value() - b.has_value(); \
1706 if( (int) a.value_or( v ) - (int) b.value_or( v ) != 0 ) \
1707 return (int) a.value_or( v ) - (int) b.value_or( v ); \
1710#define TEST_OPT_ANGLE( a, b, v ) \
1712 if( a.has_value() != b.has_value() ) \
1713 return a.has_value() - b.has_value(); \
1714 if( abs( a.value_or( v ).AsDegrees() - b.value_or( v ).AsDegrees() ) > 0.001 ) \
1715 return a.value_or( v ).AsDegrees() > b.value_or( v ).AsDegrees() ? 1 : -1; \
1723 if( ( diff =
shape.Compare( aOther.
shape ) ) != 0 )
KICOMMON_API types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
KICOMMON_API KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
BASE_SET & set(size_t pos)
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Information pertinent to a Pcbnew printed circuit board.
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayer) const
int AsTenthsOfADegree() const
virtual void SetParent(EDA_ITEM *aParent)
LSET is a set of PCB_LAYER_IDs.
LSEQ Seq(const LSEQ &aSequence) const
Return an LSEQ from the union of this LSET and a desired sequence.
std::optional< bool > IsFilled() const
bool operator==(const PADSTACK &aOther) const
std::optional< int > & Clearance(PCB_LAYER_ID aLayer=F_Cu)
void AddPrimitive(PCB_SHAPE *aShape, PCB_LAYER_ID aLayer)
Adds a custom shape primitive to the padstack.
void ReplacePrimitives(const std::vector< std::shared_ptr< PCB_SHAPE > > &aPrimitivesList, PCB_LAYER_ID aLayer)
Clears the existing primitive list (freeing the owned shapes) and adds copies of the given shapes to ...
void SetBackdrillMode(BACKDRILL_MODE aMode)
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
MASK_LAYER_PROPS & FrontOuterLayers()
double Similarity(const PADSTACK &aOther) const
Return a measure of how likely the other object is to represent the same object.
int RoundRectRadius(PCB_LAYER_ID aLayer) const
void SetDrillShape(PAD_DRILL_SHAPE aShape)
int GetMaxHoleSize() const
std::optional< double > & SolderPasteMarginRatio(PCB_LAYER_ID aLayer=F_Cu)
void SetBackdrillSize(bool aTop, std::optional< int > aSize)
void ForEachUniqueLayer(const std::function< void(PCB_LAYER_ID)> &aMethod) const
Runs the given callable for each active unique copper layer in this padstack, meaning F_Cu for MODE::...
void SetThermalSpokeAngle(EDA_ANGLE aAngle, PCB_LAYER_ID aLayer=F_Cu)
void SetRoundRectRadiusRatio(double aRatio, PCB_LAYER_ID aLayer)
UNCONNECTED_LAYER_MODE m_unconnectedLayerMode
void ClearPrimitives(PCB_LAYER_ID aLayer)
void SetUnconnectedLayerMode(UNCONNECTED_LAYER_MODE aMode)
void SetCustomName(const wxString &aCustomName)
bool HasExplicitDefinitionForLayer(PCB_LAYER_ID aLayer) const
Check if the padstack has an explicit definition for the given layer.
std::optional< bool > IsTented(PCB_LAYER_ID aSide) const
Checks if this padstack is tented (covered in soldermask) on the given side.
std::optional< int > & ThermalSpokeWidth(PCB_LAYER_ID aLayer=F_Cu)
std::optional< int > & SolderPasteMargin(PCB_LAYER_ID aLayer=F_Cu)
void FlipLayers(BOARD *aBoard)
Flips the padstack layers in the case that the pad's parent footprint is flipped to the other side of...
POST_MACHINING_PROPS m_backPostMachining
std::optional< int > & SolderMaskMargin(PCB_LAYER_ID aLayer=F_Cu)
const DRILL_PROPS * findBackdrillDrill(bool aTop) const
Return the drill slot holding the top (aTop true) or bottom backdrill, identified by its start layer ...
void SetChamferRatio(double aRatio, PCB_LAYER_ID aLayer)
PCB_LAYER_ID EffectiveLayerFor(PCB_LAYER_ID aLayer) const
Determines which geometry layer should be used for the given input layer.
PADSTACK & operator=(const PADSTACK &aOther)
void SetOffset(const VECTOR2I &aOffset, PCB_LAYER_ID aLayer)
void SetShape(PAD_SHAPE aShape, PCB_LAYER_ID aLayer)
EDA_ANGLE DefaultThermalSpokeAngleForShape(PCB_LAYER_ID aLayer=F_Cu) const
VECTOR2I & TrapezoidDeltaSize(PCB_LAYER_ID aLayer)
DRILL_PROPS m_secondaryDrill
! Secondary drill, used to define back-drilling starting from the bottom side
void clearBackdrillSide(bool aTop)
Clear every slot whose start layer marks it as the given backdrill side, so a malformed padstack with...
VECTOR2I & Offset(PCB_LAYER_ID aLayer)
MASK_LAYER_PROPS m_backMaskProps
! The overrides applied to back outer technical layers
COPPER_LAYER_PROPS & CopperLayer(PCB_LAYER_ID aLayer)
EDA_ANGLE ThermalSpokeAngle(PCB_LAYER_ID aLayer=F_Cu) const
CUSTOM_SHAPE_ZONE_MODE m_customShapeInZoneMode
How to build the custom shape in zone, to create the clearance area: CUSTOM_SHAPE_ZONE_MODE::OUTLINE ...
bool unpackCopperLayer(const kiapi::board::types::PadStackLayer &aProto)
PAD_DRILL_SHAPE DrillShape() const
void SetChamferPositions(int aPositions, PCB_LAYER_ID aLayer)
POST_MACHINING_PROPS & FrontPostMachining()
DRILL_PROPS m_tertiaryDrill
! Tertiary drill, used to define back-drilling starting from the top side
void SetRoundRectRadius(double aRadius, PCB_LAYER_ID aLayer)
std::optional< bool > IsPlugged(PCB_LAYER_ID aSide) const
LSET RelevantShapeLayers(const PADSTACK &aOther) const
Returns the set of layers that must be considered if checking one padstack against another.
std::optional< int > & ThermalGap(PCB_LAYER_ID aLayer=F_Cu)
DRILL_PROPS & TertiaryDrill()
PAD_SHAPE Shape(PCB_LAYER_ID aLayer) const
void SetAnchorShape(PAD_SHAPE aShape, PCB_LAYER_ID aLayer)
BOARD_ITEM * m_parent
! The BOARD_ITEM this PADSTACK belongs to; will be used as the parent for owned shapes
PADSTACK(BOARD_ITEM *aParent)
std::optional< bool > IsCapped() const
std::vector< PCB_LAYER_ID > UniqueLayers() const
void SetBackdrillEndLayer(bool aTop, PCB_LAYER_ID aLayer)
LSET m_layerSet
! The board layers that this padstack is active on
std::optional< int > GetBackdrillSize(bool aTop) const
std::unordered_map< PCB_LAYER_ID, COPPER_LAYER_PROPS > m_copperProps
BACKDRILL_MODE GetBackdrillMode() const
static int Compare(const PADSTACK *aPadstackRef, const PADSTACK *aPadstackCmp)
Compare two padstacks and return 0 if they are equal.
PCB_LAYER_ID EndLayer() const
std::optional< bool > IsCovered(PCB_LAYER_ID aSide) const
DRILL_PROPS & backdrillWriteSlot(bool aTop)
Return the slot to write a backdrill side into, reusing the slot already holding that side or otherwi...
int & ChamferPositions(PCB_LAYER_ID aLayer)
MASK_LAYER_PROPS m_frontMaskProps
! The overrides applied to front outer technical layers
const VECTOR2I & Size(PCB_LAYER_ID aLayer) const
MODE
! Copper geometry mode: controls how many unique copper layer shapes this padstack has
@ NORMAL
Shape is the same on all layers.
@ CUSTOM
Shapes can be defined on arbitrary layers.
@ FRONT_INNER_BACK
Up to three shapes can be defined (F_Cu, inner copper layers, B_Cu)
void AppendPrimitives(const std::vector< std::shared_ptr< PCB_SHAPE > > &aPrimitivesList, PCB_LAYER_ID aLayer)
Appends a copy of each shape in the given list to this padstack's custom shape list.
DRILL_PROPS & SecondaryDrill()
double RoundRectRadiusRatio(PCB_LAYER_ID aLayer) const
PCB_LAYER_ID GetBackdrillEndLayer(bool aTop) const
PCB_LAYER_ID StartLayer() const
POST_MACHINING_PROPS & BackPostMachining()
POST_MACHINING_PROPS m_frontPostMachining
std::unique_ptr< wxString > m_customName
! An override for the IPC-7351 padstack name
PAD_SHAPE AnchorShape(PCB_LAYER_ID aLayer) const
MASK_LAYER_PROPS & BackOuterLayers()
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
wxString Name() const
! Returns the name of this padstack in IPC-7351 format
void SetSize(const VECTOR2I &aSize, PCB_LAYER_ID aLayer)
double ChamferRatio(PCB_LAYER_ID aLayer) const
static constexpr PCB_LAYER_ID ALL_LAYERS
! The layer identifier to use for the single defintion on normal padstacks
const wxChar * CustomName() const
static constexpr PCB_LAYER_ID INNER_LAYERS
! The layer identifier to use for "inner layers" on top/inner/bottom padstacks
void SetLayerSet(const LSET &aSet)
std::optional< ZONE_CONNECTION > & ZoneConnection(PCB_LAYER_ID aLayer=F_Cu)
@ NORMAL
Padstack for a footprint pad.
MODE m_mode
! The copper layer variation mode this padstack is in
EDA_ANGLE m_orientation
! The rotation of the pad relative to an outer reference frame
std::vector< std::shared_ptr< PCB_SHAPE > > & Primitives(PCB_LAYER_ID aLayer)
@ RECT_CHAMFER_BOTTOM_RIGHT
@ RECT_CHAMFER_BOTTOM_LEFT
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_90
static constexpr EDA_ANGLE ANGLE_45
bool IsFrontLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a front layer.
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
bool IsNonCopperLayer(int aLayerId)
Test whether a layer is a non copper layer.
PCB_LAYER_ID
A quick note on layer IDs:
This file contains miscellaneous commonly used macros and functions.
void PackLayerSet(google::protobuf::RepeatedField< int > &aOutput, const LSET &aLayerSet)
LSET UnpackLayerSet(const google::protobuf::RepeatedField< int > &aProtoLayerSet)
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput, const EDA_IU_SCALE &aScale)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput, const EDA_IU_SCALE &aScale)
#define TEST_OPT_ANGLE(a, b, v)
#define TEST_OPT(a, b, v)
PAD_DRILL_POST_MACHINING_MODE
PAD_DRILL_SHAPE
The set of pad drill shapes, used with PAD::{Set,Get}DrillShape()
PAD_SHAPE
The set of pad shapes, used with PAD::{Set,Get}Shape()
#define IMPLEMENT_ENUM_TO_WXANY(type)
The features of a padstack that can vary between copper layers All parameters are optional; leaving t...
double Similarity(const COPPER_LAYER_PROPS &aOther) const
std::optional< ZONE_CONNECTION > zone_connection
int Compare(const COPPER_LAYER_PROPS &aOther) const
std::optional< int > thermal_spoke_width
std::vector< std::shared_ptr< PCB_SHAPE > > custom_shapes
bool operator==(const COPPER_LAYER_PROPS &aOther) const
std::optional< EDA_ANGLE > thermal_spoke_angle
std::optional< int > clearance
std::optional< int > thermal_gap
The properties of a padstack drill.
bool operator==(const DRILL_PROPS &aOther) const
VECTOR2I size
Drill diameter (x == y) or slot dimensions (x != y)
std::optional< bool > is_capped
True if the drill hole should be capped.
std::optional< bool > is_filled
True if the drill hole should be filled completely.
int Compare(const DRILL_PROPS &aOther) const
The features of a padstack that can vary on outer layers.
bool operator==(const MASK_LAYER_PROPS &aOther) const
std::optional< int > solder_mask_margin
int Compare(const MASK_LAYER_PROPS &aOther) const
std::optional< bool > has_covering
True if the pad on this side should have covering.
std::optional< int > solder_paste_margin
std::optional< double > solder_paste_margin_ratio
std::optional< bool > has_solder_mask
True if this outer layer has mask (is not tented)
std::optional< bool > has_solder_paste
True if this outer layer has solder paste.
std::optional< bool > has_plugging
True if the drill hole should be plugged on this side.
std::optional< PAD_DRILL_POST_MACHINING_MODE > mode
bool operator==(const POST_MACHINING_PROPS &aOther) const
int Compare(const POST_MACHINING_PROPS &aOther) const
int chamfered_rect_positions
VECTOR2I trapezoid_delta_size
Delta for PAD_SHAPE::TRAPEZOID; half the delta squeezes one end and half expands the other.
int Compare(const SHAPE_PROPS &aOther) const
VECTOR2I offset
Offset of the shape center from the pad center.
bool operator==(const SHAPE_PROPS &aOther) const
VECTOR2I size
Size of the shape, or of the anchor pad for custom shape pads.
double chamfered_rect_ratio
Size of chamfer: ratio of smallest of X,Y size.
double round_rect_radius_ratio
PAD_SHAPE shape
Shape of the pad.
PAD_SHAPE anchor_shape
Shape of the anchor when shape == PAD_SHAPE::CUSTOM.
VECTOR2< int32_t > VECTOR2I
@ NONE
Pads are not covered.