54#include <google/protobuf/any.pb.h>
58#include <api/board/board_types.pb.h>
80 *
this = *
static_cast<const PCB_TRACK*
>( aOther );
102 *
this = *
static_cast<const PCB_ARC*
>( aOther );
140 std::memory_order_relaxed );
163 *
this = *
static_cast<const PCB_VIA*
>( aOther );
182 default: formatStr =
_(
"Via %s on %s" );
break;
202 return *
this == other;
224 double similarity = 1.0;
255 return *
this == other;
266 return *
this == other;
289 double similarity = 1.0;
323 return *
this == other;
334 return *
this == other;
371 double similarity = 1.0;
398 wxFAIL_MSG( wxT(
"Warning: PCB_VIA::SetWidth() called without a layer argument" ) );
406 wxT(
"Warning: PCB_VIA::GetWidth() called without a layer argument" ) );
412 m_padStack.SetSize( { aWidth, aWidth }, aLayer );
424 kiapi::board::types::Track track;
426 track.mutable_id()->set_value(
m_Uuid.AsStdString() );
427 track.mutable_start()->set_x_nm(
GetStart().x );
428 track.mutable_start()->set_y_nm(
GetStart().y );
429 track.mutable_end()->set_x_nm(
GetEnd().x );
430 track.mutable_end()->set_y_nm(
GetEnd().y );
431 track.mutable_width()->set_value_nm(
GetWidth() );
433 track.set_locked(
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
434 : kiapi::common::types::LockedState::LS_UNLOCKED );
435 PackNet( track.mutable_net() );
438 track.mutable_parent()->set_value( board->m_Uuid.AsStdString() );
442 kiapi::board::types::SolderMaskOverrides* sm = track.mutable_solder_mask();
443 sm->set_expose_copper(
true );
450 aContainer.PackFrom( track );
456 kiapi::board::types::Track track;
458 if( !aContainer.UnpackTo( &track ) )
464 SetWidth( track.width().value_nm() );
467 SetLocked( track.locked() == kiapi::common::types::LockedState::LS_LOCKED );
470 if( track.has_solder_mask() )
474 if( track.solder_mask().has_solder_mask_margin() )
491 kiapi::board::types::Arc arc;
493 arc.mutable_id()->set_value(
m_Uuid.AsStdString() );
494 arc.mutable_start()->set_x_nm(
GetStart().x );
495 arc.mutable_start()->set_y_nm(
GetStart().y );
496 arc.mutable_mid()->set_x_nm(
GetMid().x );
497 arc.mutable_mid()->set_y_nm(
GetMid().y );
498 arc.mutable_end()->set_x_nm(
GetEnd().x );
499 arc.mutable_end()->set_y_nm(
GetEnd().y );
500 arc.mutable_width()->set_value_nm(
GetWidth() );
502 arc.set_locked(
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
503 : kiapi::common::types::LockedState::LS_UNLOCKED );
507 arc.mutable_parent()->set_value( board->m_Uuid.AsStdString() );
511 kiapi::board::types::SolderMaskOverrides* sm = arc.mutable_solder_mask();
512 sm->set_expose_copper(
true );
519 aContainer.PackFrom( arc );
525 kiapi::board::types::Arc arc;
527 if( !aContainer.UnpackTo( &arc ) )
537 SetLocked( arc.locked() == kiapi::common::types::LockedState::LS_LOCKED );
540 if( arc.has_solder_mask() )
544 if( arc.solder_mask().has_solder_mask_margin() )
561 kiapi::board::types::Via
via;
563 aContainer.PackFrom(
via );
569 aVia.mutable_id()->set_value(
m_Uuid.AsStdString() );
570 aVia.mutable_position()->set_x_nm(
GetPosition().x );
571 aVia.mutable_position()->set_y_nm(
GetPosition().y );
575 padstack.
Serialize( *aVia.mutable_pad_stack() );
578 aVia.mutable_pad_stack()->clear_layers();
582 aVia.set_locked(
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
583 : kiapi::common::types::LockedState::LS_UNLOCKED );
587 aVia.mutable_parent()->set_value( board->m_Uuid.AsStdString() );
595 std::map<PCB_LAYER_ID, ZONE_LAYER_OVERRIDE> overrides;
609 kiapi::board::types::Via
via;
611 if( !aContainer.UnpackTo( &
via ) )
624 google::protobuf::Any padStackWrapper;
625 padStackWrapper.PackFrom( aVia.pad_stack() );
627 if( !
m_padStack.Deserialize( padStackWrapper ) )
635 SetLocked( aVia.locked() == kiapi::common::types::LockedState::LS_LOCKED );
638 if( aVia.has_teardrop() )
648 std::map<PCB_LAYER_ID, ZONE_LAYER_OVERRIDE> overrides;
651 for(
const auto& [layer, value] : overrides )
679 *aSource = constraint.
GetName();
681 return constraint.
Value();
697 *aSource = constraint.
GetName();
699 return constraint.
Value();
716 *aSource = constraint.
GetName();
718 return constraint.
Value();
749 *aSource =
_(
"removed annular ring" );
766 *aSource = constraint.
GetName();
839 std::map<int, int> ordinals;
843 ordinals[layer] = n++;
845 std::vector<PCB_VIA*> microvias;
858 if(
via->TopLayer() ==
via->BottomLayer() )
861 if( ordinals.count(
via->TopLayer() ) && ordinals.count(
via->BottomLayer() ) )
862 microvias.push_back(
via );
865 auto upper = [&](
PCB_VIA* aVia )
867 return std::min( ordinals[aVia->TopLayer()], ordinals[aVia->BottomLayer()] );
870 auto lower = [&](
PCB_VIA* aVia )
872 return std::max( ordinals[aVia->TopLayer()], ordinals[aVia->BottomLayer()] );
878 double reach = ( aFirst->
GetDrillValue() + aSecond->GetDrillValue() ) / 2.0;
880 return ( aFirst->
GetPosition() - aSecond->GetPosition() ).EuclideanNorm() <= reach;
888 cellSize = std::max( cellSize,
via->GetDrillValue() );
890 auto cellOf = [&](
int aCoord )
892 return (
int) std::floor( (
double) aCoord / cellSize );
895 std::map<std::tuple<int, int, int>, std::vector<PCB_VIA*>> byCell;
900 byCell[{ upper(
via ), cellOf( pos.
x ), cellOf( pos.
y ) }].push_back(
via );
908 for(
int dx = -1; dx <= 1; ++dx )
910 for(
int dy = -1; dy <= 1; ++dy )
912 auto it = byCell.find( { lower( aVia ), cellOf( pos.
x ) + dx, cellOf( pos.
y ) + dy } );
914 if( it == byCell.end() )
917 for(
PCB_VIA* other : it->second )
919 if( other != aVia && overlaps( aVia, other ) )
928 std::set<PCB_VIA*> carried;
933 carried.insert( under );
936 std::vector<std::vector<PCB_VIA*>> columns;
937 std::set<PCB_VIA*> taken;
942 if( carried.count(
via ) )
945 std::vector<PCB_VIA*> column;
946 bool landsOnAnother =
false;
948 for(
PCB_VIA* step =
via; step; step = below( step ) )
950 if( !taken.insert( step ).second )
952 landsOnAnother =
true;
956 column.push_back( step );
958 if( column.size() > ordinals.size() )
962 if( column.size() > 1 || landsOnAnother )
963 columns.push_back( std::move( column ) );
999 if( aDrill.has_value() && *aDrill > 0 )
1011 return std::nullopt;
1047 if( aDrill.has_value() && *aDrill > 0 )
1059 return std::nullopt;
1094 if( secondaryDrill.
size.
x > 0
1107 if( tertiaryDrill.
size.
x > 0
1138 if( frontPM.
mode.has_value()
1141 && frontPM.
size > 0 )
1143 int pmDepth = frontPM.
depth;
1148 && frontPM.
angle > 0 )
1150 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
1151 pmDepth =
static_cast<int>( ( frontPM.
size / 2.0 ) / tan( halfAngleRad ) );
1159 if( layerDist < pmDepth )
1164 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
1165 int diameterAtLayer = frontPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
1166 return std::max( 0, diameterAtLayer );
1171 return frontPM.
size;
1180 if( backPM.
mode.has_value()
1183 && backPM.
size > 0 )
1185 int pmDepth = backPM.
depth;
1190 && backPM.
angle > 0 )
1192 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
1193 pmDepth =
static_cast<int>( ( backPM.
size / 2.0 ) / tan( halfAngleRad ) );
1201 if( layerDist < pmDepth )
1206 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
1207 int diameterAtLayer = backPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
1208 return std::max( 0, diameterAtLayer );
1235 if(
m_End == point )
1240 double dist =
m_Start.Distance( point );
1242 if( min_dist >= dist )
1245 dist =
m_End.Distance( point );
1247 if( min_dist >= dist )
1259 int ymax, xmax, ymin, xmin;
1264 BOX2I bbox = arc->BBox();
1288 VECTOR2L( (int64_t) xmax - xmin + 1, (int64_t) ymax - ymin + 1 ) );
1302 diameter = std::max( diameter,
GetWidth( aLayer ) );
1305 diameter = std::max( diameter,
Padstack().GetMaxHoleSize() );
1308 int radius = ( diameter + 1 ) / 2;
1318 VECTOR2L( (int64_t) xmax - xmin + 1, (int64_t) ymax - ymin + 1 ) );
1327 diameter = std::max( diameter,
Padstack().GetMaxHoleSize() );
1330 int radius = ( diameter + 1 ) / 2;
1340 VECTOR2L( (int64_t) xmax - xmin + 1, (int64_t) ymax - ymin + 1 ) );
1360 .MergeTracks =
false,
1361 .OptimiseTracesInPads =
false,
1362 .InferViaInPad =
false
1441 return start_end.
Cross( start_mid ) < 0;
1472 for(
KICAD_T scanType : aScanTypes )
1474 if( scanType ==
Type() )
1497 holeSize = std::max( holeSize,
Padstack().GetMaxHoleSize() );
1517 if(
m_padStack.FrontOuterLayers().has_solder_mask.has_value() )
1540 if(
m_padStack.BackOuterLayers().has_solder_mask.has_value() )
1563 if(
m_padStack.FrontOuterLayers().has_covering.has_value() )
1586 if(
m_padStack.BackOuterLayers().has_covering.has_value() )
1609 if(
m_padStack.FrontOuterLayers().has_plugging.has_value() )
1632 if(
m_padStack.BackOuterLayers().has_plugging.has_value() )
1655 if(
m_padStack.Drill().is_capped.has_value() )
1678 if(
m_padStack.Drill().is_filled.has_value() )
1694 if( front &&
m_padStack.FrontOuterLayers().has_solder_mask.has_value() )
1695 return *
m_padStack.FrontOuterLayers().has_solder_mask;
1697 if( !front &&
m_padStack.BackOuterLayers().has_solder_mask.has_value() )
1698 return *
m_padStack.BackOuterLayers().has_solder_mask;
1702 return front ? board->GetDesignSettings().m_TentViasFront
1703 : board->GetDesignSettings().m_TentViasBack;
1713 return board->GetDesignSettings().m_SolderMaskExpansion;
1740 margin = board->GetDesignSettings().m_SolderMaskExpansion;
1745 margin = std::max( margin, -
m_width / 2 );
1780 else if( aLayer ==
B_Mask )
1798 int layer_id = aCopperLayerCount*2;
1802 if(
Padstack().Drill().start > layer_id )
1846 if( layermask.test(
F_Cu ) )
1848 else if( layermask.test(
B_Cu ) )
1875 layermask.
set(
id );
1906 bool top_found =
false;
1907 bool bottom_found =
false;
1917 if( !top_found && layer !=
B_Cu )
1928 bottom_found =
true;
1943 board->InvalidateClearanceCache(
m_Uuid );
1960 board->InvalidateClearanceCache(
m_Uuid );
1968 if( aLayer ==
Padstack().Drill().start )
1977 board->InvalidateClearanceCache(
m_Uuid );
1993 std::swap( b_layer, t_layer );
1997 *top_layer = t_layer;
2000 *bottom_layer = b_layer;
2029 auto sanitizeBackdrill =
2038 if( copperCount > 0 )
2051 aDrill.size = { 0, 0 };
2054 sanitizeBackdrill(
Padstack().SecondaryDrill() );
2055 sanitizeBackdrill(
Padstack().TertiaryDrill() );
2059std::optional<PCB_VIA::VIA_PARAMETER_ERROR>
2061 std::optional<int> aPrimaryDrill,
2062 std::optional<PCB_LAYER_ID> aPrimaryStartLayer,
2063 std::optional<PCB_LAYER_ID> aPrimaryEndLayer,
2064 std::optional<int> aSecondaryDrill,
2065 std::optional<PCB_LAYER_ID> aSecondaryStartLayer,
2066 std::optional<PCB_LAYER_ID> aSecondaryEndLayer,
2067 std::optional<int> aTertiaryDrill,
2068 std::optional<PCB_LAYER_ID> aTertiaryStartLayer,
2069 std::optional<PCB_LAYER_ID> aTertiaryEndLayer,
2070 int aCopperLayerCount )
2076 error.
m_Message =
_(
"Via diameter is too small." );
2077 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DIAMETER;
2083 error.
m_Message =
_(
"Via drill is too small." );
2084 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DRILL;
2088 if( aDiameter.has_value() && !aPrimaryDrill.has_value() )
2090 error.
m_Message =
_(
"No via hole size defined." );
2091 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DRILL;
2095 if( aPrimaryDrill.has_value() && !aDiameter.has_value() )
2097 error.
m_Message =
_(
"No via diameter defined." );
2098 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DIAMETER;
2102 if( aDiameter.has_value() && aPrimaryDrill.has_value()
2103 && aDiameter.value() <= aPrimaryDrill.value() )
2105 error.
m_Message =
_(
"Via hole size must be smaller than via diameter" );
2106 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DRILL;
2110 std::optional<LSET> copperMask;
2112 auto validateLayer = [&]( std::optional<PCB_LAYER_ID> aLayer,
2115 if( !aLayer.has_value() )
2125 error.
m_Message =
_(
"Via layer must be a copper layer." );
2130 if( aCopperLayerCount > 0 )
2132 if( !copperMask.has_value() )
2135 if( !copperMask->Contains( layer ) )
2137 error.
m_Message =
_(
"Via layer is outside the board stack." );
2146 if( !validateLayer( aPrimaryStartLayer, VIA_PARAMETER_ERROR::FIELD::START_LAYER ) )
2149 if( !validateLayer( aPrimaryEndLayer, VIA_PARAMETER_ERROR::FIELD::END_LAYER ) )
2152 if( aPrimaryStartLayer.has_value() && aPrimaryEndLayer.has_value()
2153 && aPrimaryStartLayer.value() == aPrimaryEndLayer.value() )
2155 error.
m_Message =
_(
"Via start layer and end layer cannot be the same" );
2156 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::START_LAYER;
2160 if( aSecondaryDrill.has_value() )
2164 error.
m_Message =
_(
"Backdrill diameter is too small." );
2165 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::SECONDARY_DRILL;
2169 if( !validateLayer( aSecondaryStartLayer, VIA_PARAMETER_ERROR::FIELD::SECONDARY_START_LAYER ) )
2172 if( !validateLayer( aSecondaryEndLayer, VIA_PARAMETER_ERROR::FIELD::SECONDARY_END_LAYER ) )
2176 if( aTertiaryDrill.has_value() )
2180 error.
m_Message =
_(
"Tertiary backdrill diameter is too small." );
2181 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::TERTIARY_DRILL;
2185 if( !validateLayer( aTertiaryStartLayer, VIA_PARAMETER_ERROR::FIELD::TERTIARY_START_LAYER ) )
2188 if( !validateLayer( aTertiaryEndLayer, VIA_PARAMETER_ERROR::FIELD::TERTIARY_END_LAYER ) )
2192 return std::nullopt;
2211 return startOuter ^ endOuter;
2258 wxFAIL_MSG( wxT(
"Unsupported layer for FRONT_INNER_BACK" ) );
2296 switch(
Padstack().UnconnectedLayerMode() )
2342 entry.store(
ZLO_NONE, std::memory_order_relaxed );
2375 bool connected =
false;
2381 else if(
GetBoard()->GetConnectivity()->IsConnectedOnLayer(
this, layer, nonZoneTypes ) )
2402 std::vector<int> layers{
2408 layers.reserve( 6 );
2413 layers.push_back(
F_Mask );
2415 layers.push_back(
B_Mask );
2451 if(
VECTOR2I(
end - start ).SquaredEuclideanNorm() < nameSize * nameSize )
2458 if(
VECTOR2I(
end - start ).SquaredEuclideanNorm() == 0 )
2490 bbox.
Inflate( 2 * board->GetDesignSettings().GetBiggestClearanceValue() );
2494 bbox = board->ExpandBoundingBoxForDrillSymbols( bbox );
2515 for(
PCB_LAYER_ID mapLayer : drillBoard->DrillSymbolLayers().Seq() )
2525 bool isBlindBuried =
2533 cuMask &= board->GetEnabledLayers();
2550 ret_layers.push_back(
F_Mask );
2553 ret_layers.push_back(
B_Mask );
2583 highContrastLayer =
F_Cu;
2585 highContrastLayer =
B_Cu;
2616 if( !visible.any() )
2624 if( !visible.any() )
2682 default:
return _(
"Track" );
2705 aList.emplace_back(
_(
"Angle" ), wxString::Format(
"%.2fdeg",
2706 static_cast<PCB_ARC*
>(
this)->GetAngle().AsDegrees() ) );
2712 if( segmentDelay == 0.0 )
2718 aList.emplace_back(
_(
"Segment Delay" ),
2726 double trackLen = 0.0;
2727 double lenPadToDie = 0.0;
2728 double trackDelay = 0.0;
2729 double delayPadToDie = 0.0;
2731 std::tie( count, trackLen, lenPadToDie, trackDelay, delayPadToDie ) = board->
GetTrackLength( *
this );
2733 if( trackDelay == 0.0 )
2737 if( lenPadToDie != 0 )
2740 aList.emplace_back(
_(
"Pad To Die Length" ), msg );
2743 aList.emplace_back(
_(
"Full Length" ), msg );
2748 aList.emplace_back(
_(
"Routed Delay" ),
2751 if( delayPadToDie != 0.0 )
2754 aList.emplace_back(
_(
"Pad To Die Delay" ), msg );
2757 aList.emplace_back(
_(
"Full Delay" ), msg );
2764 aList.emplace_back(
_(
"Copper Area" ),
2770 aList.emplace_back( wxString::Format(
_(
"Min Clearance: %s" ),
2772 wxString::Format(
_(
"(from %s)" ),
source ) );
2777 if( !msg.IsEmpty() )
2779 aList.emplace_back( wxString::Format(
_(
"Width Constraints: %s" ), msg ),
2780 wxString::Format(
_(
"(from %s)" ),
source ) );
2795 default: msg =
_(
"Via" );
break;
2798 aList.emplace_back(
_(
"Type" ), msg );
2804 std::set<int> widths;
2811 widths.insert(
GetWidth( aLayer ) );
2814 if( widths.size() == 1 )
2817 aList.emplace_back(
_(
"Diameter" ),
_(
"(mixed)" ) );
2825 wxString::Format(
_(
"(from %s)" ),
source ) );
2829 aList.emplace_back( wxString::Format(
_(
"Min Annular Width: %s" ), aFrame->
MessageTextFromValue( minAnnulus ) ),
2830 wxString::Format(
_(
"(from %s)" ),
source ) );
2840 const wxString& chainName = netInfo->GetNetChain();
2842 if( !chainName.IsEmpty() )
2846 aList.emplace_back(
_(
"Resolved Netclass" ),
2851 aList.emplace_back(
_(
"NetCode" ), fmt::format(
"{}",
GetNetCode() ) );
2853 aList.emplace_back( wxT(
"Flags" ), fmt::format(
"#08X",
m_flags ) );
2855 aList.emplace_back( wxT(
"Start pos" ), fmt::format(
"{} {}",
m_Start.x,
m_Start.y ) );
2856 aList.emplace_back( wxT(
"End pos" ), fmt::format(
"{} {}",
m_End.x,
m_End.y ) );
2860 aList.emplace_back(
_(
"Status" ),
_(
"Locked" ) );
2880 return width * width;
2892 double max_dist = aAccuracy + (
GetWidth() / 2.0 );
2895 if(
GetStart().Distance( aPosition ) <= max_dist ||
GetEnd().Distance( aPosition ) <= max_dist )
2913 arc_hittest -= arc_angle_start;
2919 return arc_hittest >=
ANGLE_360 + arc_angle;
2921 return arc_hittest <= arc_angle;
2945 int max_dist = aAccuracy + (
GetWidth( aLayer ) / 2 );
2949 double dist = rel_pos.x * rel_pos.x + rel_pos.y * rel_pos.y;
2951 if( dist <=
static_cast<double>( max_dist ) * max_dist )
2961 BOX2I arect = aRect;
2973 BOX2I arect = aRect;
2991 BOX2I arect = aRect;
3026 return wxString::Format(
Type() ==
PCB_ARC_T ?
_(
"Track (arc) %s on %s, length %s" )
3027 :
_(
"Track %s on %s, length %s" ),
3052 std::swap( *
this, *
static_cast<PCB_ARC*
>( aImage ) );
3074 return std::min(
center.Distance(
m_Start ), (
double) INT_MAX / 2.0 );
3109 if(
GetRadius() >= (
double)INT_MAX/2.0 )
3118 && (
GetMid() -
GetEnd() ).EuclideanNorm() < aThreshold;
3147 return std::make_shared<SHAPE_SEGMENT>(
m_Start,
m_End, width );
3166 diameter = std::max( diameter,
GetWidth( layer ) );
3184 diameter = std::max( diameter,
Padstack().GetMaxHoleSize() );
3187 return std::make_shared<SHAPE_CIRCLE>(
m_Start, diameter / 2 );
3201 return std::make_shared<SHAPE_SEGMENT>(
GetStart(),
GetEnd(), width );
3203 return std::make_shared<SHAPE_ARC>( arc );
3208 int aError,
ERROR_LOC aErrorLoc,
bool ignoreLineWidth )
const
3210 wxASSERT_MSG( !ignoreLineWidth, wxT(
"IgnoreLineWidth has no meaning for tracks." ) );
3224 int width =
m_width + ( 2 * aClearance );
3235 int width =
m_width + ( 2 * aClearance );
3295 if( pmMap.
Choices().GetCount() == 0 )
3305 if( bdMap.
Choices().GetCount() == 0 )
3316 if( layerEnum.
Choices().GetCount() == 0 )
3324 auto viaDiameterPropertyValidator =
3327 if( !aItem || aItem->Type() !=
PCB_VIA_T )
3328 return std::nullopt;
3330 if( !aValue.CheckType<
int>() )
3331 return std::nullopt;
3335 std::optional<int> diameter = aValue.As<
int>();
3336 std::optional<int> drill =
via->GetDrillValue();
3338 std::optional<PCB_LAYER_ID> startLayer;
3341 startLayer =
via->Padstack().Drill().start;
3343 std::optional<PCB_LAYER_ID> endLayer;
3346 endLayer =
via->Padstack().Drill().end;
3348 int copperLayerCount =
via->BoardCopperLayerCount();
3350 if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
3352 std::nullopt, std::nullopt, std::nullopt,
3353 std::nullopt, std::nullopt, std::nullopt,
3354 copperLayerCount ) )
3356 return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
3359 return std::nullopt;
3362 auto viaDrillPropertyValidator =
3365 if( !aItem || aItem->Type() !=
PCB_VIA_T )
3366 return std::nullopt;
3368 if( !aValue.CheckType<
int>() )
3369 return std::nullopt;
3373 std::optional<int> diameter =
via->GetFrontWidth();
3374 std::optional<int> drill = aValue.As<
int>();
3376 std::optional<PCB_LAYER_ID> startLayer;
3379 startLayer =
via->Padstack().Drill().start;
3381 std::optional<PCB_LAYER_ID> endLayer;
3384 endLayer =
via->Padstack().Drill().end;
3386 std::optional<int> secondaryDrill =
via->GetSecondaryDrillSize();
3388 std::optional<PCB_LAYER_ID> secondaryStart;
3391 secondaryStart =
via->GetSecondaryDrillStartLayer();
3393 std::optional<PCB_LAYER_ID> secondaryEnd;
3396 secondaryEnd =
via->GetSecondaryDrillEndLayer();
3398 std::optional<int> tertiaryDrill =
via->GetTertiaryDrillSize();
3400 std::optional<PCB_LAYER_ID> tertiaryStart;
3403 tertiaryStart =
via->GetTertiaryDrillStartLayer();
3405 std::optional<PCB_LAYER_ID> tertiaryEnd;
3408 tertiaryEnd =
via->GetTertiaryDrillEndLayer();
3410 int copperLayerCount =
via->BoardCopperLayerCount();
3412 if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
3414 secondaryDrill, secondaryStart, secondaryEnd,
3415 tertiaryDrill, tertiaryStart, tertiaryEnd,
3416 copperLayerCount ) )
3418 return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
3421 return std::nullopt;
3424 auto viaStartLayerPropertyValidator =
3427 if( !aItem || aItem->Type() !=
PCB_VIA_T )
3428 return std::nullopt;
3434 else if( aValue.CheckType<
int>() )
3437 return std::nullopt;
3441 std::optional<int> diameter =
via->GetFrontWidth();
3442 std::optional<int> drill =
via->GetDrillValue();
3444 std::optional<PCB_LAYER_ID> endLayer;
3447 endLayer =
via->BottomLayer();
3449 std::optional<int> secondaryDrill =
via->GetSecondaryDrillSize();
3451 std::optional<PCB_LAYER_ID> secondaryStart;
3454 secondaryStart =
via->GetSecondaryDrillStartLayer();
3456 std::optional<PCB_LAYER_ID> secondaryEnd;
3459 secondaryEnd =
via->GetSecondaryDrillEndLayer();
3461 int copperLayerCount =
via->BoardCopperLayerCount();
3463 if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
3465 secondaryDrill, secondaryStart, secondaryEnd,
3466 std::nullopt, std::nullopt, std::nullopt,
3467 copperLayerCount ) )
3469 return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
3472 return std::nullopt;
3475 auto viaEndLayerPropertyValidator =
3478 if( !aItem || aItem->Type() !=
PCB_VIA_T )
3479 return std::nullopt;
3485 else if( aValue.CheckType<
int>() )
3488 return std::nullopt;
3492 std::optional<int> diameter =
via->GetFrontWidth();
3493 std::optional<int> drill =
via->GetDrillValue();
3495 std::optional<PCB_LAYER_ID> startLayer;
3498 startLayer =
via->TopLayer();
3500 std::optional<int> secondaryDrill =
via->GetSecondaryDrillSize();
3502 std::optional<PCB_LAYER_ID> secondaryStart;
3505 secondaryStart =
via->GetSecondaryDrillStartLayer();
3507 std::optional<PCB_LAYER_ID> secondaryEnd;
3510 secondaryEnd =
via->GetSecondaryDrillEndLayer();
3512 int copperLayerCount =
via->BoardCopperLayerCount();
3514 if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
3516 secondaryDrill, secondaryStart, secondaryEnd,
3517 std::nullopt, std::nullopt, std::nullopt,
3518 copperLayerCount ) )
3520 return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
3523 return std::nullopt;
3549 const wxString groupTechLayers =
_HKI(
"Technical Layers" );
3551 auto isExternalLayerTrack =
3577 const wxString groupVia =
_HKI(
"Via Properties" );
3578 const wxString groupBackdrill =
_HKI(
"Backdrill" );
3579 const wxString groupPostMachining =
_HKI(
"Post-machining" );
3708 groupPostMachining );
3713 groupPostMachining )
3719 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetFrontPostMachining();
3721 if( mode.has_value() )
3734 groupPostMachining )
3740 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetFrontPostMachining();
3742 if( mode.has_value() )
3752 groupPostMachining )
3758 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetFrontPostMachining();
3760 if( mode.has_value() )
3772 groupPostMachining )
3778 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetBackPostMachining();
3780 if( mode.has_value() )
3792 groupPostMachining )
3798 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetBackPostMachining();
3800 if( mode.has_value() )
3809 groupPostMachining )
3815 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetBackPostMachining();
3817 if( mode.has_value() )
KICOMMON_API types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
KICOMMON_API 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.
ZONE_LAYER_OVERRIDE
Conditionally flashed vias and pads that interact with zones of different priority can be very squirr...
constexpr BOX2I BOX2ISafe(const BOX2D &aInput)
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
virtual NETCLASS * GetEffectiveNetClass() const
Return the NETCLASS for this item.
wxString GetNetname() const
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
BOARD_CONNECTED_ITEM(BOARD_ITEM *aParent, KICAD_T idtype)
void PackNet(kiapi::board::types::Net *aProto) const
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
NETINFO_ITEM * GetNet() const
Return NETINFO_ITEM object for a given item.
const wxString & GetDisplayNetname() const
virtual int GetOwnClearance(PCB_LAYER_ID aLayer, wxString *aSource=nullptr) const
Return an item's "own" clearance in internal units.
void UnpackNet(const kiapi::board::types::Net &aProto)
Assigns a net to this item from an API message.
TEARDROP_PARAMETERS & GetTeardropParams()
void SetTeardropsEnabled(bool aEnable)
Container for design settings for a BOARD object.
std::shared_ptr< DRC_ENGINE > m_DRCEngine
BOARD_STACKUP & GetStackupDescriptor()
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)
void SetUuidDirect(const KIID &aUuid)
Raw UUID assignment.
void SetLocked(bool aLocked) override
bool IsLocked() const override
virtual double GetCoverageArea(int aTextMargin) const
Return the board area this item covers, used to rank candidates under the cursor so a click on a smal...
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
virtual void TransformShapeToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, KIGFX::RENDER_SETTINGS *aRenderSettings=nullptr) const
Convert the item shape to a polyset.
virtual wxString LayerMaskDescribe() const
Return a string (to be shown to the user) describing a layer mask.
BOARD_ITEM & operator=(const BOARD_ITEM &aOther)
BOARD_ITEM_CONTAINER * GetParent() const
virtual int BoardCopperLayerCount() const
Return the total number of copper layers for the board that this item resides on.
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
virtual bool HasHole() const
Manage layers needed to make a physical board.
int GetLayerDistance(PCB_LAYER_ID aFirstLayer, PCB_LAYER_ID aSecondLayer) const
Calculate the distance (height) between the two given copper layers.
LENGTH_DELAY_CALCULATION * GetLengthCalculation() const
Returns the track length calculator.
std::tuple< int, double, double, double, double > GetTrackLength(const PCB_TRACK &aTrack) const
Return data on the length and number of track segments connected to a given track.
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayer) const
int GetCopperLayerCount() const
const TRACKS & Tracks() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
constexpr BOX2< Vec > & Merge(const BOX2< Vec > &aRect)
Modify the position and size of the rectangle in order to contain aRect.
bool IntersectsCircle(const Vec &aCenter, const int aRadius) const
constexpr coord_type GetLeft() const
constexpr bool Contains(const Vec &aPoint) const
constexpr coord_type GetRight() const
constexpr coord_type GetTop() const
constexpr bool Intersects(const BOX2< Vec > &aRect) const
constexpr coord_type GetBottom() const
bool IsConnectedOnLayer(const BOARD_CONNECTED_ITEM *aItem, int aLayer, const std::initializer_list< KICAD_T > &aTypes={}) const
MINOPTMAX< int > & Value()
DRC_CONSTRAINT EvalRules(DRC_CONSTRAINT_T aConstraintType, const BOARD_ITEM *a, const BOARD_ITEM *b, PCB_LAYER_ID aLayer, REPORTER *aReporter=nullptr)
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
void SetFlags(EDA_ITEM_FLAGS aMask)
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
EDA_ITEM_FLAGS GetFlags() const
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
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 double lodScaleForThreshold(const KIGFX::VIEW *aView, int aWhatIu, int aThresholdIu)
Get the scale at which aWhatIu would be drawn at the same size as aThresholdIu on screen.
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...
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
bool IsLayerVisibleCached(int aLayer) const
PAINTER * GetPainter() const
Return the painter object used by the view for drawing VIEW_ITEM objects.
static bool Contains(int aStart_layer, int aEnd_layer, int aTest_layer)
Class which calculates lengths (and associated routing statistics) in a BOARD context.
int64_t CalculateDelay(std::vector< LENGTH_DELAY_CALCULATION_ITEM > &aItems, PATH_OPTIMISATIONS aOptimisations, const PAD *aStartPad=nullptr, const PAD *aEndPad=nullptr) const
Calculates the electrical propagation delay of the given items.
LENGTH_DELAY_CALCULATION_ITEM GetLengthCalculationItem(const BOARD_CONNECTED_ITEM *aBoardItem) const
Return a LENGTH_CALCULATION_ITEM constructed from the given BOARD_CONNECTED_ITEM.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
void RunOnLayers(const std::function< void(PCB_LAYER_ID)> &aFunction) const
Execute a function on each layer of the LSET.
static const LSET & BackTechMask()
Return a mask holding all technical layers (no CU layer) on back side.
static const LSET & AllLayersMask()
static const LSET & PhysicalLayersMask()
Return a mask holding all layers which are physically realized.
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
bool Contains(PCB_LAYER_ID aLayer) const
See if the layer set contains a PCB layer.
static const LSET & FrontTechMask()
Return a mask holding all technical layers (no CU layer) on front side.
A collection of nets and the parameters used to route or test these nets.
Handle the data for a net.
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
A PADSTACK defines the characteristics of a single or multi-layer pad, in the IPC sense of the word.
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::...
@ NORMAL
Shape is the same on all layers.
@ FRONT_INNER_BACK
Up to three shapes can be defined (F_Cu, inner copper layers, B_Cu)
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
static constexpr PCB_LAYER_ID ALL_LAYERS
! The layer identifier to use for the single defintion on normal padstacks
static constexpr PCB_LAYER_ID INNER_LAYERS
! The layer identifier to use for "inner layers" on top/inner/bottom padstacks
virtual VECTOR2I GetPosition() const override
bool IsDegenerated(int aThreshold=5) const
virtual void swapData(BOARD_ITEM *aImage) override
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
EDA_ANGLE GetArcAngleStart() 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 Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Mirror this object relative to a given horizontal axis the layer is not changed.
virtual bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
EDA_ANGLE GetArcAngleEnd() const
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
void SetMid(const VECTOR2I &aMid)
EDA_ANGLE GetAngle() const
const VECTOR2I & GetMid() const
PCB_ARC(BOARD_ITEM *aParent)
double Similarity(const BOARD_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
VECTOR2I m_Mid
Arc mid point, halfway between start and end.
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
bool operator==(const PCB_ARC &aOther) const
void CopyFrom(const BOARD_ITEM *aOther) override
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
virtual void SetLayerSet(const LSET &aLayers) override
int GetSolderMaskExpansion() const
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
void SetHasSolderMask(bool aVal)
virtual double GetLength() const
Get the length of the track using the hypotenuse calculation.
double ViewGetLOD(int aLayer, const KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
virtual void swapData(BOARD_ITEM *aImage) override
void SetEnd(const VECTOR2I &aEnd)
bool HasSolderMask() const
void SetStart(const VECTOR2I &aStart)
const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
virtual void Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Mirror this object relative to a given horizontal axis the layer is not changed.
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &aScanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
bool ApproxCollinear(const PCB_TRACK &aTrack)
VECTOR2I m_End
Line end point.
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
std::optional< int > m_solderMaskMargin
void CopyFrom(const BOARD_ITEM *aOther) override
std::optional< int > GetLocalSolderMaskMargin() const
virtual double GetDelay() const
Get the time delay of the track.
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.
virtual EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the track shape to a closed polygon.
const VECTOR2I & GetStart() const
virtual bool operator==(const BOARD_ITEM &aOther) const override
VECTOR2I m_Start
Line start point.
wxString GetFriendlyName() const override
virtual std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
virtual double Similarity(const BOARD_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
const VECTOR2I & GetEnd() const
PCB_TRACK(BOARD_ITEM *aParent, KICAD_T idtype=PCB_TRACE_T)
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.
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
virtual MINOPTMAX< int > GetWidthConstraint(wxString *aSource=nullptr) const
double GetCoverageArea(int aTextMargin) const override
Return the board area this item covers, used to rank candidates under the cursor so a click on a smal...
int m_width
Thickness of track (or arc) – no longer the width of a via.
EDA_ITEM_FLAGS IsPointOnEnds(const VECTOR2I &point, int min_dist=0) const
Return STARTPOINT if point if near (dist = min_dist) start point, ENDPOINT if point if near (dist = m...
virtual void SetWidth(int aWidth)
virtual int GetWidth() const
void GetMsgPanelInfoBase_Common(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) const
bool GetIsFree() const
Check if the via is a free via (as opposed to one created on a track by the router).
int GetFrontPostMachiningSize() const
PCB_LAYER_ID BottomLayer() const
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
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.
PLUGGING_MODE GetFrontPluggingMode() const
VECTOR2I GetPosition() const override
bool IsTented(PCB_LAYER_ID aLayer) const override
Checks if the given object is tented (its copper shape is covered by solder mask) on a given side of ...
void CopyFrom(const BOARD_ITEM *aOther) override
double GetCoverageArea(int aTextMargin) const override
Return the board area this item covers, used to rank candidates under the cursor so a click on a smal...
PCB_LAYER_ID GetTopBackdrillLayer() const
bool IsGhostLayer(PCB_LAYER_ID aLayer) const
void SetFrontPostMachiningDepth(int aDepth)
void SetCappingMode(CAPPING_MODE aMode)
void SetFrontCoveringMode(COVERING_MODE aMode)
wxString LayerMaskDescribe() const override
Return a string (to be shown to the user) describing a layer mask.
int GetBackPostMachiningDepth() const
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
void SetBackPostMachiningAngle(int aAngle)
int GetBackPostMachiningAngle() const
COVERING_MODE GetBackCoveringMode() const
std::optional< int > GetTertiaryDrillSize() const
void SetTopBackdrillSize(std::optional< int > aSize)
bool FlashLayer(int aLayer) const
Check to see whether the via should have a pad on the specific layer.
ZONE_LAYER_OVERRIDE GetZoneLayerOverride(PCB_LAYER_ID aLayer) const
void SetBackPostMachiningMode(PAD_DRILL_POST_MACHINING_MODE aMode)
std::optional< int > GetTopBackdrillSize() const
void SetBackdrillMode(BACKDRILL_MODE aMode)
void SetDrillDefault()
Set the drill value for vias to the default value UNDEFINED_DRILL_DIAMETER.
void SetBottomBackdrillSize(std::optional< int > aSize)
void ClearZoneLayerOverrides()
CAPPING_MODE GetCappingMode() const
const PADSTACK & Padstack() const
void SetFrontTentingMode(TENTING_MODE aMode)
bool m_isFree
"Free" vias don't get their nets auto-updated
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
int GetFrontPostMachiningDepth() const
static std::vector< std::vector< PCB_VIA * > > CollectMicroviaColumns(BOARD *aBoard)
Runs of microvias that land on one another, each ordered from its outermost hop down.
TENTING_MODE GetFrontTentingMode() const
int GetPostMachiningKnockout(PCB_LAYER_ID aLayer) const
Get the knockout diameter for a layer affected by post-machining.
void SetBottomLayer(PCB_LAYER_ID aLayer)
void SetPrimaryDrillSize(const VECTOR2I &aSize)
Set the drill value for vias.
bool IsBackdrilledOrPostMachined(PCB_LAYER_ID aLayer) const
Check if a layer is affected by backdrilling or post-machining operations.
std::optional< int > GetSecondaryDrillSize() const
void SetPrimaryDrillCappedFlag(bool aCapped)
int GetSolderMaskExpansion() const
void SetSecondaryDrillStartLayer(PCB_LAYER_ID aLayer)
void SetTertiaryDrillEndLayer(PCB_LAYER_ID aLayer)
bool HasValidLayerPair(int aCopperLayerCount) const
void ClearSecondaryDrillSize()
void SetBackPostMachiningDepth(int aDepth)
void SetDrill(int aDrill)
PLUGGING_MODE GetBackPluggingMode() const
void SetBackPluggingMode(PLUGGING_MODE aMode)
MINOPTMAX< int > GetDrillConstraint(wxString *aSource=nullptr) const
void SetPadstackMode(PADSTACK::MODE aMode)
void SetBackTentingMode(TENTING_MODE aMode)
void SetIsFree(bool aFree=true)
void SetFrontPluggingMode(PLUGGING_MODE aMode)
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
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.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
void SetFrontPostMachining(const std::optional< PAD_DRILL_POST_MACHINING_MODE > &aMode)
bool operator==(const PCB_VIA &aOther) const
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
void SetSecondaryDrillEndLayer(PCB_LAYER_ID aLayer)
int GetFrontPostMachiningAngle() const
std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, DRC_CONSTRAINT_T aUsage=NULL_CONSTRAINT) const override
void SetFrontPostMachiningAngle(int aAngle)
void SetTopLayer(PCB_LAYER_ID aLayer)
FILLING_MODE GetFillingMode() const
int GetFrontWidth() const
void SetSizeFromRules(int aDiameter, int aDrill)
Give the via a uniform padstack sized from its diameter and hole rules.
std::array< std::atomic< ZONE_LAYER_OVERRIDE >, MAX_CU_LAYERS > m_zoneLayerOverrides
void SetLayerPair(PCB_LAYER_ID aTopLayer, PCB_LAYER_ID aBottomLayer)
For a via m_layer contains the top layer, the other layer is in m_bottomLayer/.
PAD_DRILL_POST_MACHINING_MODE GetFrontPostMachiningMode() const
bool IsOnCopperLayer() const override
void SetFrontPostMachiningSize(int aSize)
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
double Similarity(const BOARD_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
void SetTertiaryDrillStartLayer(PCB_LAYER_ID aLayer)
PCB_LAYER_ID GetBottomBackdrillLayer() const
void SetPrimaryDrillShape(PAD_DRILL_SHAPE aShape)
static std::optional< VIA_PARAMETER_ERROR > ValidateViaParameters(std::optional< int > aDiameter, std::optional< int > aPrimaryDrill, std::optional< PCB_LAYER_ID > aPrimaryStartLayer=std::nullopt, std::optional< PCB_LAYER_ID > aPrimaryEndLayer=std::nullopt, std::optional< int > aSecondaryDrill=std::nullopt, std::optional< PCB_LAYER_ID > aSecondaryStartLayer=std::nullopt, std::optional< PCB_LAYER_ID > aSecondaryEndLayer=std::nullopt, std::optional< int > aTertiaryDrill=std::nullopt, std::optional< PCB_LAYER_ID > aTertiaryStartLayer=std::nullopt, std::optional< PCB_LAYER_ID > aTertiaryEndLayer=std::nullopt, int aCopperLayerCount=0)
void SetTertiaryDrillShape(PAD_DRILL_SHAPE aShape)
virtual void SetLayerSet(const LSET &aLayers) override
Note SetLayerSet() initialize the first and last copper layers connected by the via.
void GetOutermostConnectedLayers(PCB_LAYER_ID *aTopmost, PCB_LAYER_ID *aBottommost) const
Return the top-most and bottom-most connected layers.
void SetSecondaryDrillShape(PAD_DRILL_SHAPE aShape)
void SanitizeLayers()
Check so that the layers are correct depending on the type of via, and so that the top actually is on...
int GetWidth() const override
void SetBackPostMachining(const std::optional< PAD_DRILL_POST_MACHINING_MODE > &aMode)
PCB_VIA & operator=(const PCB_VIA &aOther)
void swapData(BOARD_ITEM *aImage) override
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
void SetFillingMode(FILLING_MODE aMode)
bool GetIsNotFree() const
PCB_VIA(BOARD_ITEM *aParent)
void SetPrimaryDrillFilledFlag(bool aFilled)
std::optional< int > GetBottomBackdrillSize() const
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
void SetViaType(VIATYPE aViaType)
int GetMinAnnulus(PCB_LAYER_ID aLayer, wxString *aSource) const
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
TENTING_MODE GetBackTentingMode() const
PCB_LAYER_ID TopLayer() const
void ClearTertiaryDrillSize()
VIATYPE m_viaType
through, blind/buried or micro
void SetBottomBackdrillLayer(PCB_LAYER_ID aLayer)
int GetBackPostMachiningSize() const
void SetTertiaryDrillSize(const VECTOR2I &aSize)
void SetIsNotFree(bool aNotFree)
void SetSecondaryDrillSize(const VECTOR2I &aSize)
COVERING_MODE GetFrontCoveringMode() const
int GetDrillValue() const
Calculate the drill value for vias (m_drill if > 0, or default drill value for the board).
void SetZoneLayerOverride(PCB_LAYER_ID aLayer, ZONE_LAYER_OVERRIDE aOverride)
bool sameZoneLayerOverrides(const PCB_VIA &aOther) const
PAD_DRILL_POST_MACHINING_MODE GetBackPostMachiningMode() const
void SetFrontWidth(int aWidth)
VIATYPE GetViaType() const
double ViewGetLOD(int aLayer, const KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
void SetPrimaryDrillCapped(const std::optional< bool > &aCapped)
MINOPTMAX< int > GetWidthConstraint(wxString *aSource=nullptr) const override
BACKDRILL_MODE GetBackdrillMode() const
void SetWidth(int aWidth) override
void SetBackCoveringMode(COVERING_MODE aMode)
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
void SetPrimaryDrillFilled(const std::optional< bool > &aFilled)
void SetTopBackdrillLayer(PCB_LAYER_ID aLayer)
void LayerPair(PCB_LAYER_ID *top_layer, PCB_LAYER_ID *bottom_layer) const
Return the 2 layers used by the via (the via actually uses all layers between these 2 layers)
void SetFrontPostMachiningMode(PAD_DRILL_POST_MACHINING_MODE aMode)
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
void SetBackPostMachiningSize(int aSize)
void SetPrimaryDrillEndLayer(PCB_LAYER_ID aLayer)
void SetPrimaryDrillStartLayer(PCB_LAYER_ID aLayer)
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
PROPERTY_BASE & SetValidator(PROPERTY_VALIDATOR_FN &&aValidator)
PROPERTY_BASE & SetIsCopyable(bool aIsCopyable=true)
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.
PROPERTY_BASE & ReplaceProperty(size_t aBase, const wxString &aName, PROPERTY_BASE *aNew, const wxString &aGroup=wxEmptyString)
Replace an existing property for a specific type.
VECTOR2I::extended_type ecoord
bool ApproxCollinear(const SEG &aSeg, int aDistanceThreshold=1) const
const VECTOR2I & GetArcMid() const
const VECTOR2I & GetP1() const
bool IsEffectiveLine() const
const VECTOR2I & GetP0() const
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
Represent a set of closed polygons.
double Area()
Return the area of this poly set.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
wxString MessageTextFromMinOptMax(const MINOPTMAX< int > &aValue, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
constexpr extended_type Cross(const VECTOR2< T > &aVector) const
Compute cross product of self with aVector.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
void TransformCircleToPolygon(SHAPE_LINE_CHAIN &aBuffer, const VECTOR2I &aCenter, int aRadius, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a circle to a polygon, using multiple straight lines.
void TransformArcToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc)
Convert arc to multiple straight segments.
void TransformOvalToPolygon(SHAPE_POLY_SET &aBuffer, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aWidth, int aError, ERROR_LOC aErrorLoc, int aMinSegCount=0)
Convert a oblong shape to a polygon, using multiple segments.
@ ANNULAR_WIDTH_CONSTRAINT
@ VIA_DIAMETER_CONSTRAINT
@ SILK_CLEARANCE_CONSTRAINT
@ HOLE_CLEARANCE_CONSTRAINT
@ SOLDER_MASK_EXPANSION_CONSTRAINT
@ PHYSICAL_CLEARANCE_CONSTRAINT
@ HOLE_TO_HOLE_CONSTRAINT
static constexpr EDA_ANGLE ANGLE_0
static constexpr EDA_ANGLE ANGLE_360
#define PCB_EDIT_FRAME_NAME
const INSPECTOR_FUNC & INSPECTOR
std::function passed to nested users by ref, avoids copying std::function.
#define ROUTER_TRANSIENT
transient items that should NOT be cached
#define ENDPOINT
ends. (Used to support dragging.)
std::uint32_t EDA_ITEM_FLAGS
#define STARTPOINT
When a line is selected, these flags indicate which.
a few functions useful in geometry calculations.
bool ClipLine(const BOX2I *aClipBox, int &x1, int &y1, int &x2, int &y2)
Test if any part of a line falls within the bounds of a rectangle.
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
bool IsSolderMaskLayer(int aLayer)
bool IsDrillSymbolLayer(int aLayer)
bool IsCopperLayerLowerThan(PCB_LAYER_ID aLayerA, PCB_LAYER_ID aLayerB)
Return true if copper aLayerA is placed lower than aLayerB, false otherwise.
constexpr PCB_LAYER_ID PCBNEW_LAYER_ID_START
bool IsFrontLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a front layer.
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
@ DEFAULT
Flashing follows connectivity.
@ ALWAYS_FLASHED
Always flashed for connectivity.
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
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_DRILL_SYMBOL_START
Drill symbols, one channel per board layer.
@ LAYER_LOCKED_ITEM_SHADOW
Shadow layer for locked items.
@ LAYER_VIA_COPPER_START
Virtual layers for via copper on a given copper layer.
@ LAYER_CLEARANCE_START
Virtual layers for pad/via/track clearance outlines for a given copper layer.
@ LAYER_VIA_HOLES
Draw via holes (pad holes do not use this layer).
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
size_t CopperLayerToOrdinal(PCB_LAYER_ID aLayer)
Converts KiCad copper layer enum to an ordinal between the front and back layers.
#define DRILL_SYMBOL_LAYER_FOR(boardLayer)
bool IsNetnameLayer(int aLayer)
Test whether a layer is a netname layer.
bool IsHoleLayer(int aLayer)
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:
PCB_LAYER_ID ToLAYER_ID(int aLayer)
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
@ LEFT_RIGHT
Flip left to right (around the Y axis)
bool ShapeHitTest(const SHAPE_LINE_CHAIN &aHitter, const SHAPE &aHittee, bool aHitteeContained)
Perform a shape-to-shape hit test.
void PackLayerSet(google::protobuf::RepeatedField< int > &aOutput, const LSET &aLayerSet)
void PackZoneLayerOverrides(google::protobuf::RepeatedPtrField< types::ZoneLayerOverrideEntry > *aOutput, const std::map< PCB_LAYER_ID, ZONE_LAYER_OVERRIDE > &aInput)
void UnpackTeardropSettings(TEARDROP_PARAMETERS &aOutput, const types::PadTeardropSettings &aProto)
void UnpackZoneLayerOverrides(std::map< PCB_LAYER_ID, ZONE_LAYER_OVERRIDE > &aOutput, const google::protobuf::RepeatedPtrField< types::ZoneLayerOverrideEntry > &aInput)
void PackTeardropSettings(types::PadTeardropSettings &aOutput, const TEARDROP_PARAMETERS &aParams)
KICOMMON_API void PackCustomProperties(google::protobuf::RepeatedPtrField< types::CustomProperty > *aOutput, const EDA_ITEM &aItem)
KICOMMON_API void UnpackCustomProperties(const google::protobuf::RepeatedPtrField< types::CustomProperty > &aInput, EDA_ITEM &aItem)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
PAD_DRILL_SHAPE
The set of pad drill shapes, used with PAD::{Set,Get}DrillShape()
@ REMOVE_EXCEPT_START_AND_END
static bool hasLayerOrdinal(PCB_LAYER_ID aLayer)
static struct TRACK_VIA_DESC _TRACK_VIA_DESC
#define GEOMETRY_MIN_SIZE
#define TYPE_HASH(x)
Macro to generate unique identifier for a type.
#define ENUM_TO_WXANY(type)
@ PT_COORD
Coordinate expressed in distance units (mm/inch)
@ PT_DECIDEGREE
Angle expressed in decidegrees.
@ PT_SIZE
Size expressed in distance units (mm/inch)
#define REGISTER_TYPE(x)
Helper macro to map type hashes to names.
std::optional< std::unique_ptr< VALIDATION_ERROR > > VALIDATOR_RESULT
Null optional means validation succeeded.
wxString UnescapeString(const wxString &aSource)
The properties of a padstack drill.
VECTOR2I size
Drill diameter (x == y) or slot dimensions (x != y)
std::optional< PAD_DRILL_POST_MACHINING_MODE > mode
Struct to control which optimisations the length calculation code runs on the given path objects.
bool operator()(const PCB_TRACK *aFirst, const PCB_TRACK *aSecond) const
wxString result
Test unit parsing edge cases and error handling.
bool TestSegmentHit(const VECTOR2I &aRefPoint, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aDist)
Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
const VECTOR2I CalcArcCenter(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Determine the center of an arc or circle given three points on its circumference.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_PAD_T
class PAD, a pad in a footprint
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D
VECTOR2< int64_t > VECTOR2L