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 via.mutable_id()->set_value(
m_Uuid.AsStdString() );
572 via.mutable_pad_stack()->clear_layers();
576 via.set_locked(
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
577 : kiapi::common::types::LockedState::LS_UNLOCKED );
581 via.mutable_parent()->set_value( board->m_Uuid.AsStdString() );
589 std::map<PCB_LAYER_ID, ZONE_LAYER_OVERRIDE> overrides;
598 aContainer.PackFrom(
via );
604 kiapi::board::types::Via
via;
606 if( !aContainer.UnpackTo( &
via ) )
613 google::protobuf::Any padStackWrapper;
614 padStackWrapper.PackFrom(
via.pad_stack() );
616 if( !
m_padStack.Deserialize( padStackWrapper ) )
624 SetLocked(
via.locked() == kiapi::common::types::LockedState::LS_LOCKED );
627 if(
via.has_teardrop() )
637 std::map<PCB_LAYER_ID, ZONE_LAYER_OVERRIDE> overrides;
640 for(
const auto& [layer, value] : overrides )
668 *aSource = constraint.
GetName();
670 return constraint.
Value();
686 *aSource = constraint.
GetName();
688 return constraint.
Value();
704 *aSource = constraint.
GetName();
706 return constraint.
Value();
715 *aSource =
_(
"removed annular ring" );
732 *aSource = constraint.
GetName();
805 std::map<int, int> ordinals;
809 ordinals[layer] = n++;
811 std::vector<PCB_VIA*> microvias;
824 if(
via->TopLayer() ==
via->BottomLayer() )
827 if( ordinals.count(
via->TopLayer() ) && ordinals.count(
via->BottomLayer() ) )
828 microvias.push_back(
via );
831 auto upper = [&](
PCB_VIA* aVia )
833 return std::min( ordinals[aVia->TopLayer()], ordinals[aVia->BottomLayer()] );
836 auto lower = [&](
PCB_VIA* aVia )
838 return std::max( ordinals[aVia->TopLayer()], ordinals[aVia->BottomLayer()] );
844 double reach = ( aFirst->
GetDrillValue() + aSecond->GetDrillValue() ) / 2.0;
846 return ( aFirst->
GetPosition() - aSecond->GetPosition() ).EuclideanNorm() <= reach;
854 cellSize = std::max( cellSize,
via->GetDrillValue() );
856 auto cellOf = [&](
int aCoord )
858 return (
int) std::floor( (
double) aCoord / cellSize );
861 std::map<std::tuple<int, int, int>, std::vector<PCB_VIA*>> byCell;
866 byCell[{ upper(
via ), cellOf( pos.
x ), cellOf( pos.
y ) }].push_back(
via );
874 for(
int dx = -1; dx <= 1; ++dx )
876 for(
int dy = -1; dy <= 1; ++dy )
878 auto it = byCell.find( { lower( aVia ), cellOf( pos.
x ) + dx, cellOf( pos.
y ) + dy } );
880 if( it == byCell.end() )
883 for(
PCB_VIA* other : it->second )
885 if( other != aVia && overlaps( aVia, other ) )
894 std::set<PCB_VIA*> carried;
899 carried.insert( under );
902 std::vector<std::vector<PCB_VIA*>> columns;
903 std::set<PCB_VIA*> taken;
908 if( carried.count(
via ) )
911 std::vector<PCB_VIA*> column;
912 bool landsOnAnother =
false;
914 for(
PCB_VIA* step =
via; step; step = below( step ) )
916 if( !taken.insert( step ).second )
918 landsOnAnother =
true;
922 column.push_back( step );
924 if( column.size() > ordinals.size() )
928 if( column.size() > 1 || landsOnAnother )
929 columns.push_back( std::move( column ) );
965 if( aDrill.has_value() && *aDrill > 0 )
1013 if( aDrill.has_value() && *aDrill > 0 )
1025 return std::nullopt;
1060 if( secondaryDrill.
size.
x > 0
1073 if( tertiaryDrill.
size.
x > 0
1104 if( frontPM.
mode.has_value()
1107 && frontPM.
size > 0 )
1109 int pmDepth = frontPM.
depth;
1114 && frontPM.
angle > 0 )
1116 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
1117 pmDepth =
static_cast<int>( ( frontPM.
size / 2.0 ) / tan( halfAngleRad ) );
1125 if( layerDist < pmDepth )
1130 double halfAngleRad = ( frontPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
1131 int diameterAtLayer = frontPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
1132 return std::max( 0, diameterAtLayer );
1137 return frontPM.
size;
1146 if( backPM.
mode.has_value()
1149 && backPM.
size > 0 )
1151 int pmDepth = backPM.
depth;
1156 && backPM.
angle > 0 )
1158 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
1159 pmDepth =
static_cast<int>( ( backPM.
size / 2.0 ) / tan( halfAngleRad ) );
1167 if( layerDist < pmDepth )
1172 double halfAngleRad = ( backPM.
angle / 10.0 ) *
M_PI / 180.0 / 2.0;
1173 int diameterAtLayer = backPM.
size -
static_cast<int>( 2.0 * layerDist * tan( halfAngleRad ) );
1174 return std::max( 0, diameterAtLayer );
1201 if(
m_End == point )
1206 double dist =
m_Start.Distance( point );
1208 if( min_dist >= dist )
1211 dist =
m_End.Distance( point );
1213 if( min_dist >= dist )
1225 int ymax, xmax, ymin, xmin;
1230 BOX2I bbox = arc->BBox();
1254 VECTOR2L( (int64_t) xmax - xmin + 1, (int64_t) ymax - ymin + 1 ) );
1268 diameter = std::max( diameter,
GetWidth( aLayer ) );
1271 diameter = std::max( diameter,
Padstack().GetMaxHoleSize() );
1274 int radius = ( diameter + 1 ) / 2;
1284 VECTOR2L( (int64_t) xmax - xmin + 1, (int64_t) ymax - ymin + 1 ) );
1293 diameter = std::max( diameter,
Padstack().GetMaxHoleSize() );
1296 int radius = ( diameter + 1 ) / 2;
1306 VECTOR2L( (int64_t) xmax - xmin + 1, (int64_t) ymax - ymin + 1 ) );
1326 .MergeTracks =
false,
1327 .OptimiseTracesInPads =
false,
1328 .InferViaInPad =
false
1407 return start_end.
Cross( start_mid ) < 0;
1438 for(
KICAD_T scanType : aScanTypes )
1440 if( scanType ==
Type() )
1463 holeSize = std::max( holeSize,
Padstack().GetMaxHoleSize() );
1483 if(
m_padStack.FrontOuterLayers().has_solder_mask.has_value() )
1506 if(
m_padStack.BackOuterLayers().has_solder_mask.has_value() )
1529 if(
m_padStack.FrontOuterLayers().has_covering.has_value() )
1552 if(
m_padStack.BackOuterLayers().has_covering.has_value() )
1575 if(
m_padStack.FrontOuterLayers().has_plugging.has_value() )
1598 if(
m_padStack.BackOuterLayers().has_plugging.has_value() )
1621 if(
m_padStack.Drill().is_capped.has_value() )
1644 if(
m_padStack.Drill().is_filled.has_value() )
1660 if( front &&
m_padStack.FrontOuterLayers().has_solder_mask.has_value() )
1661 return *
m_padStack.FrontOuterLayers().has_solder_mask;
1663 if( !front &&
m_padStack.BackOuterLayers().has_solder_mask.has_value() )
1664 return *
m_padStack.BackOuterLayers().has_solder_mask;
1668 return front ? board->GetDesignSettings().m_TentViasFront
1669 : board->GetDesignSettings().m_TentViasBack;
1679 return board->GetDesignSettings().m_SolderMaskExpansion;
1706 margin = board->GetDesignSettings().m_SolderMaskExpansion;
1711 margin = std::max( margin, -
m_width / 2 );
1746 else if( aLayer ==
B_Mask )
1764 int layer_id = aCopperLayerCount*2;
1768 if(
Padstack().Drill().start > layer_id )
1812 if( layermask.test(
F_Cu ) )
1814 else if( layermask.test(
B_Cu ) )
1841 layermask.
set(
id );
1872 bool top_found =
false;
1873 bool bottom_found =
false;
1883 if( !top_found && layer !=
B_Cu )
1894 bottom_found =
true;
1909 board->InvalidateClearanceCache(
m_Uuid );
1926 board->InvalidateClearanceCache(
m_Uuid );
1934 if( aLayer ==
Padstack().Drill().start )
1943 board->InvalidateClearanceCache(
m_Uuid );
1959 std::swap( b_layer, t_layer );
1963 *top_layer = t_layer;
1966 *bottom_layer = b_layer;
1995 auto sanitizeBackdrill =
2004 if( copperCount > 0 )
2017 aDrill.size = { 0, 0 };
2020 sanitizeBackdrill(
Padstack().SecondaryDrill() );
2021 sanitizeBackdrill(
Padstack().TertiaryDrill() );
2025std::optional<PCB_VIA::VIA_PARAMETER_ERROR>
2027 std::optional<int> aPrimaryDrill,
2028 std::optional<PCB_LAYER_ID> aPrimaryStartLayer,
2029 std::optional<PCB_LAYER_ID> aPrimaryEndLayer,
2030 std::optional<int> aSecondaryDrill,
2031 std::optional<PCB_LAYER_ID> aSecondaryStartLayer,
2032 std::optional<PCB_LAYER_ID> aSecondaryEndLayer,
2033 std::optional<int> aTertiaryDrill,
2034 std::optional<PCB_LAYER_ID> aTertiaryStartLayer,
2035 std::optional<PCB_LAYER_ID> aTertiaryEndLayer,
2036 int aCopperLayerCount )
2042 error.
m_Message =
_(
"Via diameter is too small." );
2043 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DIAMETER;
2049 error.
m_Message =
_(
"Via drill is too small." );
2050 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DRILL;
2054 if( aDiameter.has_value() && !aPrimaryDrill.has_value() )
2056 error.
m_Message =
_(
"No via hole size defined." );
2057 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DRILL;
2061 if( aPrimaryDrill.has_value() && !aDiameter.has_value() )
2063 error.
m_Message =
_(
"No via diameter defined." );
2064 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DIAMETER;
2068 if( aDiameter.has_value() && aPrimaryDrill.has_value()
2069 && aDiameter.value() <= aPrimaryDrill.value() )
2071 error.
m_Message =
_(
"Via hole size must be smaller than via diameter" );
2072 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::DRILL;
2076 std::optional<LSET> copperMask;
2078 auto validateLayer = [&]( std::optional<PCB_LAYER_ID> aLayer,
2081 if( !aLayer.has_value() )
2091 error.
m_Message =
_(
"Via layer must be a copper layer." );
2096 if( aCopperLayerCount > 0 )
2098 if( !copperMask.has_value() )
2101 if( !copperMask->Contains( layer ) )
2103 error.
m_Message =
_(
"Via layer is outside the board stack." );
2112 if( !validateLayer( aPrimaryStartLayer, VIA_PARAMETER_ERROR::FIELD::START_LAYER ) )
2115 if( !validateLayer( aPrimaryEndLayer, VIA_PARAMETER_ERROR::FIELD::END_LAYER ) )
2118 if( aPrimaryStartLayer.has_value() && aPrimaryEndLayer.has_value()
2119 && aPrimaryStartLayer.value() == aPrimaryEndLayer.value() )
2121 error.
m_Message =
_(
"Via start layer and end layer cannot be the same" );
2122 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::START_LAYER;
2126 if( aSecondaryDrill.has_value() )
2130 error.
m_Message =
_(
"Backdrill diameter is too small." );
2131 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::SECONDARY_DRILL;
2135 if( !validateLayer( aSecondaryStartLayer, VIA_PARAMETER_ERROR::FIELD::SECONDARY_START_LAYER ) )
2138 if( !validateLayer( aSecondaryEndLayer, VIA_PARAMETER_ERROR::FIELD::SECONDARY_END_LAYER ) )
2142 if( aTertiaryDrill.has_value() )
2146 error.
m_Message =
_(
"Tertiary backdrill diameter is too small." );
2147 error.
m_Field = VIA_PARAMETER_ERROR::FIELD::TERTIARY_DRILL;
2151 if( !validateLayer( aTertiaryStartLayer, VIA_PARAMETER_ERROR::FIELD::TERTIARY_START_LAYER ) )
2154 if( !validateLayer( aTertiaryEndLayer, VIA_PARAMETER_ERROR::FIELD::TERTIARY_END_LAYER ) )
2158 return std::nullopt;
2177 return startOuter ^ endOuter;
2224 wxFAIL_MSG( wxT(
"Unsupported layer for FRONT_INNER_BACK" ) );
2262 switch(
Padstack().UnconnectedLayerMode() )
2308 entry.store(
ZLO_NONE, std::memory_order_relaxed );
2341 bool connected =
false;
2347 else if(
GetBoard()->GetConnectivity()->IsConnectedOnLayer(
this, layer, nonZoneTypes ) )
2368 std::vector<int> layers{
2374 layers.reserve( 6 );
2379 layers.push_back(
F_Mask );
2381 layers.push_back(
B_Mask );
2417 if(
VECTOR2I(
end - start ).SquaredEuclideanNorm() < nameSize * nameSize )
2424 if(
VECTOR2I(
end - start ).SquaredEuclideanNorm() == 0 )
2456 bbox.
Inflate( 2 * board->GetDesignSettings().GetBiggestClearanceValue() );
2460 bbox = board->ExpandBoundingBoxForDrillSymbols( bbox );
2481 for(
PCB_LAYER_ID mapLayer : drillBoard->DrillSymbolLayers().Seq() )
2491 bool isBlindBuried =
2499 cuMask &= board->GetEnabledLayers();
2516 ret_layers.push_back(
F_Mask );
2519 ret_layers.push_back(
B_Mask );
2549 highContrastLayer =
F_Cu;
2551 highContrastLayer =
B_Cu;
2582 if( !visible.any() )
2590 if( !visible.any() )
2648 default:
return _(
"Track" );
2671 aList.emplace_back(
_(
"Angle" ), wxString::Format(
"%.2fdeg",
2672 static_cast<PCB_ARC*
>(
this)->GetAngle().AsDegrees() ) );
2678 if( segmentDelay == 0.0 )
2684 aList.emplace_back(
_(
"Segment Delay" ),
2692 double trackLen = 0.0;
2693 double lenPadToDie = 0.0;
2694 double trackDelay = 0.0;
2695 double delayPadToDie = 0.0;
2697 std::tie( count, trackLen, lenPadToDie, trackDelay, delayPadToDie ) = board->
GetTrackLength( *
this );
2699 if( trackDelay == 0.0 )
2703 if( lenPadToDie != 0 )
2706 aList.emplace_back(
_(
"Pad To Die Length" ), msg );
2709 aList.emplace_back(
_(
"Full Length" ), msg );
2714 aList.emplace_back(
_(
"Routed Delay" ),
2717 if( delayPadToDie != 0.0 )
2720 aList.emplace_back(
_(
"Pad To Die Delay" ), msg );
2723 aList.emplace_back(
_(
"Full Delay" ), msg );
2730 aList.emplace_back(
_(
"Copper Area" ),
2736 aList.emplace_back( wxString::Format(
_(
"Min Clearance: %s" ),
2738 wxString::Format(
_(
"(from %s)" ), source ) );
2743 if( !msg.IsEmpty() )
2745 aList.emplace_back( wxString::Format(
_(
"Width Constraints: %s" ), msg ),
2746 wxString::Format(
_(
"(from %s)" ), source ) );
2761 default: msg =
_(
"Via" );
break;
2764 aList.emplace_back(
_(
"Type" ), msg );
2770 std::set<int> widths;
2777 widths.insert(
GetWidth( aLayer ) );
2780 if( widths.size() == 1 )
2783 aList.emplace_back(
_(
"Diameter" ),
_(
"(mixed)" ) );
2791 wxString::Format(
_(
"(from %s)" ), source ) );
2795 aList.emplace_back( wxString::Format(
_(
"Min Annular Width: %s" ), aFrame->
MessageTextFromValue( minAnnulus ) ),
2796 wxString::Format(
_(
"(from %s)" ), source ) );
2806 const wxString& chainName = netInfo->GetNetChain();
2808 if( !chainName.IsEmpty() )
2812 aList.emplace_back(
_(
"Resolved Netclass" ),
2817 aList.emplace_back(
_(
"NetCode" ), fmt::format(
"{}",
GetNetCode() ) );
2819 aList.emplace_back( wxT(
"Flags" ), fmt::format(
"#08X",
m_flags ) );
2821 aList.emplace_back( wxT(
"Start pos" ), fmt::format(
"{} {}",
m_Start.x,
m_Start.y ) );
2822 aList.emplace_back( wxT(
"End pos" ), fmt::format(
"{} {}",
m_End.x,
m_End.y ) );
2826 aList.emplace_back(
_(
"Status" ),
_(
"Locked" ) );
2850 double max_dist = aAccuracy + (
GetWidth() / 2.0 );
2853 if(
GetStart().Distance( aPosition ) <= max_dist ||
GetEnd().Distance( aPosition ) <= max_dist )
2871 arc_hittest -= arc_angle_start;
2877 return arc_hittest >=
ANGLE_360 + arc_angle;
2879 return arc_hittest <= arc_angle;
2896 int max_dist = aAccuracy + (
GetWidth( aLayer ) / 2 );
2900 double dist = rel_pos.x * rel_pos.x + rel_pos.y * rel_pos.y;
2902 if( dist <=
static_cast<double>( max_dist ) * max_dist )
2912 BOX2I arect = aRect;
2924 BOX2I arect = aRect;
2942 BOX2I arect = aRect;
2977 return wxString::Format(
Type() ==
PCB_ARC_T ?
_(
"Track (arc) %s on %s, length %s" )
2978 :
_(
"Track %s on %s, length %s" ),
3003 std::swap( *
this, *
static_cast<PCB_ARC*
>( aImage ) );
3025 return std::min(
center.Distance(
m_Start ), (
double) INT_MAX / 2.0 );
3060 if(
GetRadius() >= (
double)INT_MAX/2.0 )
3069 && (
GetMid() -
GetEnd() ).EuclideanNorm() < aThreshold;
3098 return std::make_shared<SHAPE_SEGMENT>(
m_Start,
m_End, width );
3117 diameter = std::max( diameter,
GetWidth( layer ) );
3135 diameter = std::max( diameter,
Padstack().GetMaxHoleSize() );
3138 return std::make_shared<SHAPE_CIRCLE>(
m_Start, diameter / 2 );
3152 return std::make_shared<SHAPE_SEGMENT>(
GetStart(),
GetEnd(), width );
3154 return std::make_shared<SHAPE_ARC>( arc );
3159 int aError,
ERROR_LOC aErrorLoc,
bool ignoreLineWidth )
const
3161 wxASSERT_MSG( !ignoreLineWidth, wxT(
"IgnoreLineWidth has no meaning for tracks." ) );
3175 int width =
m_width + ( 2 * aClearance );
3186 int width =
m_width + ( 2 * aClearance );
3246 if( pmMap.
Choices().GetCount() == 0 )
3256 if( bdMap.
Choices().GetCount() == 0 )
3267 if( layerEnum.
Choices().GetCount() == 0 )
3275 auto viaDiameterPropertyValidator =
3278 if( !aItem || aItem->Type() !=
PCB_VIA_T )
3279 return std::nullopt;
3281 if( !aValue.CheckType<
int>() )
3282 return std::nullopt;
3286 std::optional<int> diameter = aValue.As<
int>();
3287 std::optional<int> drill =
via->GetDrillValue();
3289 std::optional<PCB_LAYER_ID> startLayer;
3292 startLayer =
via->Padstack().Drill().start;
3294 std::optional<PCB_LAYER_ID> endLayer;
3297 endLayer =
via->Padstack().Drill().end;
3299 int copperLayerCount =
via->BoardCopperLayerCount();
3301 if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
3303 std::nullopt, std::nullopt, std::nullopt,
3304 std::nullopt, std::nullopt, std::nullopt,
3305 copperLayerCount ) )
3307 return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
3310 return std::nullopt;
3313 auto viaDrillPropertyValidator =
3316 if( !aItem || aItem->Type() !=
PCB_VIA_T )
3317 return std::nullopt;
3319 if( !aValue.CheckType<
int>() )
3320 return std::nullopt;
3324 std::optional<int> diameter =
via->GetFrontWidth();
3325 std::optional<int> drill = aValue.As<
int>();
3327 std::optional<PCB_LAYER_ID> startLayer;
3330 startLayer =
via->Padstack().Drill().start;
3332 std::optional<PCB_LAYER_ID> endLayer;
3335 endLayer =
via->Padstack().Drill().end;
3337 std::optional<int> secondaryDrill =
via->GetSecondaryDrillSize();
3339 std::optional<PCB_LAYER_ID> secondaryStart;
3342 secondaryStart =
via->GetSecondaryDrillStartLayer();
3344 std::optional<PCB_LAYER_ID> secondaryEnd;
3347 secondaryEnd =
via->GetSecondaryDrillEndLayer();
3349 std::optional<int> tertiaryDrill =
via->GetTertiaryDrillSize();
3351 std::optional<PCB_LAYER_ID> tertiaryStart;
3354 tertiaryStart =
via->GetTertiaryDrillStartLayer();
3356 std::optional<PCB_LAYER_ID> tertiaryEnd;
3359 tertiaryEnd =
via->GetTertiaryDrillEndLayer();
3361 int copperLayerCount =
via->BoardCopperLayerCount();
3363 if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
3365 secondaryDrill, secondaryStart, secondaryEnd,
3366 tertiaryDrill, tertiaryStart, tertiaryEnd,
3367 copperLayerCount ) )
3369 return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
3372 return std::nullopt;
3375 auto viaStartLayerPropertyValidator =
3378 if( !aItem || aItem->Type() !=
PCB_VIA_T )
3379 return std::nullopt;
3385 else if( aValue.CheckType<
int>() )
3388 return std::nullopt;
3392 std::optional<int> diameter =
via->GetFrontWidth();
3393 std::optional<int> drill =
via->GetDrillValue();
3395 std::optional<PCB_LAYER_ID> endLayer;
3398 endLayer =
via->BottomLayer();
3400 std::optional<int> secondaryDrill =
via->GetSecondaryDrillSize();
3402 std::optional<PCB_LAYER_ID> secondaryStart;
3405 secondaryStart =
via->GetSecondaryDrillStartLayer();
3407 std::optional<PCB_LAYER_ID> secondaryEnd;
3410 secondaryEnd =
via->GetSecondaryDrillEndLayer();
3412 int copperLayerCount =
via->BoardCopperLayerCount();
3414 if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
3416 secondaryDrill, secondaryStart, secondaryEnd,
3417 std::nullopt, std::nullopt, std::nullopt,
3418 copperLayerCount ) )
3420 return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
3423 return std::nullopt;
3426 auto viaEndLayerPropertyValidator =
3429 if( !aItem || aItem->Type() !=
PCB_VIA_T )
3430 return std::nullopt;
3436 else if( aValue.CheckType<
int>() )
3439 return std::nullopt;
3443 std::optional<int> diameter =
via->GetFrontWidth();
3444 std::optional<int> drill =
via->GetDrillValue();
3446 std::optional<PCB_LAYER_ID> startLayer;
3449 startLayer =
via->TopLayer();
3451 std::optional<int> secondaryDrill =
via->GetSecondaryDrillSize();
3453 std::optional<PCB_LAYER_ID> secondaryStart;
3456 secondaryStart =
via->GetSecondaryDrillStartLayer();
3458 std::optional<PCB_LAYER_ID> secondaryEnd;
3461 secondaryEnd =
via->GetSecondaryDrillEndLayer();
3463 int copperLayerCount =
via->BoardCopperLayerCount();
3465 if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
3467 secondaryDrill, secondaryStart, secondaryEnd,
3468 std::nullopt, std::nullopt, std::nullopt,
3469 copperLayerCount ) )
3471 return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
3474 return std::nullopt;
3500 const wxString groupTechLayers =
_HKI(
"Technical Layers" );
3502 auto isExternalLayerTrack =
3528 const wxString groupVia =
_HKI(
"Via Properties" );
3529 const wxString groupBackdrill =
_HKI(
"Backdrill" );
3530 const wxString groupPostMachining =
_HKI(
"Post-machining" );
3659 groupPostMachining );
3664 groupPostMachining )
3670 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetFrontPostMachining();
3672 if( mode.has_value() )
3685 groupPostMachining )
3691 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetFrontPostMachining();
3693 if( mode.has_value() )
3703 groupPostMachining )
3709 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetFrontPostMachining();
3711 if( mode.has_value() )
3723 groupPostMachining )
3729 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetBackPostMachining();
3731 if( mode.has_value() )
3743 groupPostMachining )
3749 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetBackPostMachining();
3751 if( mode.has_value() )
3760 groupPostMachining )
3766 std::optional<PAD_DRILL_POST_MACHINING_MODE> mode =
via->GetBackPostMachining();
3768 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 #NET_INFO 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 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.
KICAD_T Type() const
Returns the type of object.
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_ITEMS.
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::...
@ 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
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
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 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
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)
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.
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 ENUM_TO_WXANY(type)
Macro to define read-only fields (no setter method available)
@ PT_COORD
Coordinate expressed in distance units (mm/inch)
@ PT_DECIDEGREE
Angle expressed in decidegrees.
@ PT_SIZE
Size expressed in distance units (mm/inch)
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