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 );
 
 
  159    *
this = *
static_cast<const PCB_VIA*
>( aOther );
 
 
  178    default:                formatStr = 
_( 
"Via %s on %s" ); 
break;
 
 
  198    return *
this == other;
 
 
  220    double similarity = 1.0;
 
 
  251    return *
this == other;
 
 
  262    return *
this == other;
 
 
  285    double similarity = 1.0;
 
 
  319    return *
this == other;
 
 
  330    return *
this == other;
 
 
  352    double similarity = 1.0;
 
 
  390    m_padStack.SetSize( { aWidth, aWidth }, aLayer );
 
 
  402    kiapi::board::types::Track track;
 
  404    track.mutable_id()->set_value( 
m_Uuid.AsStdString() );
 
  405    track.mutable_start()->set_x_nm( 
GetStart().x );
 
  406    track.mutable_start()->set_y_nm( 
GetStart().y );
 
  407    track.mutable_end()->set_x_nm( 
GetEnd().x );
 
  408    track.mutable_end()->set_y_nm( 
GetEnd().y );
 
  409    track.mutable_width()->set_value_nm( 
GetWidth() );
 
  411    track.set_locked( 
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
 
  412                                 : kiapi::common::types::LockedState::LS_UNLOCKED );
 
  413    PackNet( track.mutable_net() );
 
  416    aContainer.PackFrom( track );
 
 
  422    kiapi::board::types::Track track;
 
  424    if( !aContainer.UnpackTo( &track ) )
 
  430    SetWidth( track.width().value_nm() );
 
  433    SetLocked( track.locked() == kiapi::common::types::LockedState::LS_LOCKED );
 
 
  442    kiapi::board::types::Arc arc;
 
  444    arc.mutable_id()->set_value( 
m_Uuid.AsStdString() );
 
  445    arc.mutable_start()->set_x_nm( 
GetStart().x );
 
  446    arc.mutable_start()->set_y_nm( 
GetStart().y );
 
  447    arc.mutable_mid()->set_x_nm( 
GetMid().x );
 
  448    arc.mutable_mid()->set_y_nm( 
GetMid().y );
 
  449    arc.mutable_end()->set_x_nm( 
GetEnd().x );
 
  450    arc.mutable_end()->set_y_nm( 
GetEnd().y );
 
  451    arc.mutable_width()->set_value_nm( 
GetWidth() );
 
  453    arc.set_locked( 
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
 
  454                               : kiapi::common::types::LockedState::LS_UNLOCKED );
 
  458    aContainer.PackFrom( arc );
 
 
  464    kiapi::board::types::Arc arc;
 
  466    if( !aContainer.UnpackTo( &arc ) )
 
  476    SetLocked( arc.locked() == kiapi::common::types::LockedState::LS_LOCKED );
 
 
  485    kiapi::board::types::Via 
via;
 
  487    via.mutable_id()->set_value( 
m_Uuid.AsStdString() );
 
  493    google::protobuf::Any padStackWrapper;
 
  495    padStackWrapper.UnpackTo( 
via.mutable_pad_stack() );
 
  498    via.mutable_pad_stack()->clear_layers();
 
  502    via.set_locked( 
IsLocked() ? kiapi::common::types::LockedState::LS_LOCKED
 
  503                               : kiapi::common::types::LockedState::LS_UNLOCKED );
 
  506    aContainer.PackFrom( 
via );
 
 
  512    kiapi::board::types::Via 
via;
 
  514    if( !aContainer.UnpackTo( &
via ) )
 
  521    google::protobuf::Any padStackWrapper;
 
  522    padStackWrapper.PackFrom( 
via.pad_stack() );
 
  524    if( !
m_padStack.Deserialize( padStackWrapper ) )
 
  532    SetLocked( 
via.locked() == kiapi::common::types::LockedState::LS_LOCKED );
 
 
  558        *aSource = constraint.
GetName();
 
  560    return constraint.
Value();
 
 
  576        *aSource = constraint.
GetName();
 
  578    return constraint.
Value();
 
 
  594        *aSource = constraint.
GetName();
 
  596    return constraint.
Value();
 
 
  605            *aSource = 
_( 
"removed annular ring" );
 
  622            *aSource = constraint.
GetName();
 
 
  663        double dist = 
m_Start.Distance( point );
 
  665        if( min_dist >= dist )
 
  668        dist = 
m_End.Distance( point );
 
  670        if( min_dist >= dist )
 
 
  682    int ymax, xmax, ymin, xmin;
 
  695        BOX2I bbox = arc->BBox();
 
  719                      VECTOR2L( (int64_t) xmax - xmin + 1, (int64_t) ymax - ymin + 1 ) );
 
 
  744                      VECTOR2L( (int64_t) xmax - xmin + 1, (int64_t) ymax - ymin + 1 ) );
 
 
  763                      VECTOR2L( (int64_t) xmax - xmin + 1, (int64_t) ymax - ymin + 1 ) );
 
 
  783                                                        .MergeTracks = 
false,
 
  784                                                        .OptimiseTracesInPads = 
false,
 
  785                                                        .InferViaInPad = 
false 
 
  864    return start_end.
Cross( start_mid ) < 0;
 
 
  894                                 const std::vector<KICAD_T>& aScanTypes )
 
  896    for( 
KICAD_T scanType : aScanTypes )
 
  898        if( scanType == 
Type() )
 
 
  928    if( 
m_padStack.FrontOuterLayers().has_solder_mask.has_value() )
 
  930        return *
m_padStack.FrontOuterLayers().has_solder_mask ?
 
 
  951    if( 
m_padStack.BackOuterLayers().has_solder_mask.has_value() )
 
  953        return *
m_padStack.BackOuterLayers().has_solder_mask ?
 
 
  974    if( 
m_padStack.FrontOuterLayers().has_covering.has_value() )
 
  976        return *
m_padStack.FrontOuterLayers().has_covering ?
 
 
  997    if( 
m_padStack.BackOuterLayers().has_covering.has_value() )
 
  999        return *
m_padStack.BackOuterLayers().has_covering ?
 
 
 1020    if( 
m_padStack.FrontOuterLayers().has_plugging.has_value() )
 
 1022        return *
m_padStack.FrontOuterLayers().has_plugging ?
 
 
 1043    if( 
m_padStack.BackOuterLayers().has_plugging.has_value() )
 
 1045        return *
m_padStack.BackOuterLayers().has_plugging ?
 
 
 1066    if( 
m_padStack.Drill().is_capped.has_value() )
 
 
 1089    if( 
m_padStack.Drill().is_filled.has_value() )
 
 
 1103                 "Invalid layer passed to IsTented" );
 
 1107    if( front && 
m_padStack.FrontOuterLayers().has_solder_mask.has_value() )
 
 1108        return *
m_padStack.FrontOuterLayers().has_solder_mask;
 
 1110    if( !front && 
m_padStack.BackOuterLayers().has_solder_mask.has_value() )
 
 1111        return *
m_padStack.BackOuterLayers().has_solder_mask;
 
 1115        return front ? board->GetDesignSettings().m_TentViasFront
 
 1116                     : board->GetDesignSettings().m_TentViasBack;
 
 
 1126        return board->GetDesignSettings().m_SolderMaskExpansion;
 
 
 1153        margin = std::max( margin, -
m_width / 2 );
 
 
 1192    else if( aLayer == 
B_Mask )
 
 
 1204    int layer_id = aCopperLayerCount*2;
 
 1208        if( 
Padstack().Drill().start > layer_id )
 
 
 1252        if( layermask.test( 
F_Cu ) )
 
 1254        else if( layermask.test( 
B_Cu ) )
 
 
 1281            layermask.
set( 
id );
 
 
 1312    bool top_found = 
false;
 
 1313    bool bottom_found = 
false;
 
 1323                    if( !top_found && layer != 
B_Cu )
 
 1334                        bottom_found = 
true;
 
 
 1362    if( aLayer == 
Padstack().Drill().start )
 
 
 1381            std::swap( b_layer, t_layer );
 
 1385        *top_layer = t_layer;
 
 1388        *bottom_layer = b_layer;
 
 
 1417std::optional<PCB_VIA::VIA_PARAMETER_ERROR>
 
 1419                                std::optional<int> aDrill,
 
 1420                                std::optional<PCB_LAYER_ID> aStartLayer,
 
 1421                                std::optional<PCB_LAYER_ID> aEndLayer )
 
 1427        error.
m_Message = 
_( 
"Via diameter is too small." );
 
 1434        error.
m_Message = 
_( 
"Via drill is too small." );
 
 1439    if( aDiameter.has_value() && !aDrill.has_value() )
 
 1441        error.
m_Message = 
_( 
"No via hole size defined." );
 
 1446    if( aDrill.has_value() && !aDiameter.has_value() )
 
 1448        error.
m_Message = 
_( 
"No via diameter defined." );
 
 1453    if( aDiameter.has_value() && aDrill.has_value()
 
 1454            && aDiameter.value() <= aDrill.value() )
 
 1456        error.
m_Message = 
_( 
"Via hole size must be smaller than via diameter" );
 
 1461    if( aStartLayer.has_value() && aEndLayer.has_value()
 
 1462            && aStartLayer.value() == aEndLayer.value() )
 
 1464        error.
m_Message = 
_( 
"Via start layer and end layer cannot be the same" );
 
 1469    return std::nullopt;
 
 
 1475                     - 
static_cast<int>( 
Padstack().Drill().
end ) ) == 2;
 
 
 1486    return startOuter ^ endOuter;
 
 
 1526    switch( 
Padstack().UnconnectedLayerMode() )
 
 
 1598        bool connected = 
false;
 
 1604        else if( 
GetBoard()->GetConnectivity()->IsConnectedOnLayer( 
this, layer, nonZoneTypes ) )
 
 
 1625    std::vector<int>   layers{
 
 1631    layers.reserve( 6 );
 
 1636            layers.push_back( 
F_Mask );
 
 1638            layers.push_back( 
B_Mask );
 
 
 1674        if( 
VECTOR2I( 
end - start ).SquaredEuclideanNorm() < nameSize * nameSize )
 
 1681        if( 
VECTOR2I( 
end - start ).SquaredEuclideanNorm() == 0 )
 
 
 1712        bbox.
Inflate( 2 * board->GetDesignSettings().GetBiggestClearanceValue() );
 
 
 1732    bool isBlindBuried =
 
 1740        cuMask &= board->GetEnabledLayers();
 
 1757        ret_layers.push_back( 
F_Mask );
 
 1760        ret_layers.push_back( 
B_Mask );
 
 
 1782            highContrastLayer = 
F_Cu;
 
 1784            highContrastLayer = 
B_Cu;
 
 1815            if( !visible.any() )
 
 1823            if( !visible.any() )
 
 
 1881    default:            
return _( 
"Track" );
 
 
 1908    if( segmentDelay == 0.0 )
 
 1914        aList.emplace_back( 
_( 
"Segment Delay" ),
 
 1922        double trackLen = 0.0;
 
 1923        double lenPadToDie = 0.0;
 
 1924        double trackDelay = 0.0;
 
 1925        double delayPadToDie = 0.0;
 
 1927        std::tie( count, trackLen, lenPadToDie, trackDelay, delayPadToDie ) = board->
GetTrackLength( *
this );
 
 1929        if( trackDelay == 0.0 )
 
 1933            if( lenPadToDie != 0 )
 
 1936                aList.emplace_back( 
_( 
"Pad To Die Length" ), msg );
 
 1939                aList.emplace_back( 
_( 
"Full Length" ), msg );
 
 1944            aList.emplace_back( 
_( 
"Routed Delay" ),
 
 1947            if( delayPadToDie != 0.0 )
 
 1950                aList.emplace_back( 
_( 
"Pad To Die Delay" ), msg );
 
 1953                aList.emplace_back( 
_( 
"Full Delay" ), msg );
 
 1960    aList.emplace_back( 
_( 
"Copper Area" ),
 
 1966    aList.emplace_back( wxString::Format( 
_( 
"Min Clearance: %s" ),
 
 1968                        wxString::Format( 
_( 
"(from %s)" ), source ) );
 
 1973    if( !msg.IsEmpty() )
 
 1975        aList.emplace_back( wxString::Format( 
_( 
"Width Constraints: %s" ), msg ),
 
 1976                            wxString::Format( 
_( 
"(from %s)" ), source ) );
 
 
 1991    default:                    msg = 
_( 
"Via" );              
break;
 
 1994    aList.emplace_back( 
_( 
"Type" ), msg );
 
 2000    aList.emplace_back( 
_( 
"Diameter" ),
 
 2007    aList.emplace_back( wxString::Format( 
_( 
"Min Clearance: %s" ),
 
 2009                        wxString::Format( 
_( 
"(from %s)" ), source ) );
 
 2013    aList.emplace_back( wxString::Format( 
_( 
"Min Annular Width: %s" ),
 
 2015                        wxString::Format( 
_( 
"(from %s)" ), source ) );
 
 
 2020                                            std::vector<MSG_PANEL_ITEM>& aList )
 const 
 2024    aList.emplace_back( 
_( 
"Resolved Netclass" ),
 
 2029        aList.emplace_back( 
_( 
"NetCode" ), fmt::format( 
"{}", 
GetNetCode() ) );
 
 2031    aList.emplace_back( wxT( 
"Flags" ), fmt::format( 
"#08X", 
m_flags ) );
 
 2033    aList.emplace_back( wxT( 
"Start pos" ), fmt::format( 
"{} {}", 
m_Start.x, 
m_Start.y ) );
 
 2034    aList.emplace_back( wxT( 
"End pos" ), fmt::format( 
"{} {}", 
m_End.x, 
m_End.y ) );
 
 2038        aList.emplace_back( 
_( 
"Status" ), 
_( 
"Locked" ) );
 
 
 2062    double max_dist = aAccuracy + ( 
GetWidth() / 2.0 );
 
 2065    if( 
GetStart().Distance( aPosition ) <= max_dist || 
GetEnd().Distance( aPosition ) <= max_dist )
 
 2083    arc_hittest -= arc_angle_start;
 
 2089        return arc_hittest >= 
ANGLE_360 + arc_angle;
 
 2091    return arc_hittest <= arc_angle;
 
 
 2105                int max_dist = aAccuracy + ( 
GetWidth( aLayer ) / 2 );
 
 2109                double dist = rel_pos.x * rel_pos.x + rel_pos.y * rel_pos.y;
 
 2111                if( dist <= 
static_cast<double>( max_dist ) * max_dist )
 
 
 2121    BOX2I arect = aRect;
 
 
 2133    BOX2I arect = aRect;
 
 
 2151    BOX2I arect = aRect;
 
 
 2183    return wxString::Format( 
Type() == 
PCB_ARC_T ? 
_(
"Track (arc) %s on %s, length %s" )
 
 2184                                                 : 
_(
"Track %s on %s, length %s" ),
 
 
 2207    std::swap( *
this, *
static_cast<PCB_ARC*
>( aImage ) );
 
 
 2228    return std::min( 
center.Distance( 
m_Start ), (
double) INT_MAX / 2.0 );
 
 
 2263    if( 
GetRadius() >= (
double)INT_MAX/2.0 )
 
 2272            && ( 
GetMid() - 
GetEnd() ).EuclideanNorm() < aThreshold;
 
 
 2301    return std::make_shared<SHAPE_SEGMENT>( 
m_Start, 
m_End, width );
 
 
 2317                    width = std::max( width, 
GetWidth( layer ) );
 
 2328        return std::make_shared<SHAPE_CIRCLE>( 
m_Start, width );
 
 
 2347        return std::make_shared<SHAPE_SEGMENT>( 
GetStart(), 
GetEnd(), width );
 
 2349    return std::make_shared<SHAPE_ARC>( arc );
 
 
 2354                                         int aClearance, 
int aError, 
ERROR_LOC aErrorLoc,
 
 2355                                         bool ignoreLineWidth )
 const 
 2357    wxASSERT_MSG( !ignoreLineWidth, wxT( 
"IgnoreLineWidth has no meaning for tracks." ) );
 
 2372        int            width = 
m_width + ( 2 * aClearance );
 
 2378                               aError, aErrorLoc );
 
 2384        int width = 
m_width + ( 2 * aClearance );
 
 
 2442        if( layerEnum.
Choices().GetCount() == 0 )
 
 2450        auto viaDiameterPropertyValidator =
 
 2453                    if( !aItem || aItem->Type() != 
PCB_VIA_T )
 
 2454                        return std::nullopt;
 
 2456                    if( !aValue.CheckType<
int>() )
 
 2457                        return std::nullopt;
 
 2461                    std::optional<int> diameter = aValue.As<
int>();
 
 2462                    std::optional<int> drill = 
via->GetDrillValue();
 
 2464                    if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
 
 2467                        return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
 
 2470                    return std::nullopt;
 
 2473        auto viaDrillPropertyValidator =
 
 2476                    if( !aItem || aItem->Type() != 
PCB_VIA_T )
 
 2477                        return std::nullopt;
 
 2479                    if( !aValue.CheckType<
int>() )
 
 2480                        return std::nullopt;
 
 2484                    std::optional<int> diameter = 
via->GetFrontWidth();
 
 2485                    std::optional<int> drill = aValue.As<
int>();
 
 2487                    if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
 
 2490                        return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
 
 2493                    return std::nullopt;
 
 2496        auto viaStartLayerPropertyValidator =
 
 2499                    if( !aItem || aItem->Type() != 
PCB_VIA_T )
 
 2500                        return std::nullopt;
 
 2506                    else if( aValue.CheckType<
int>() )
 
 2509                        return std::nullopt;
 
 2513                    if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
 
 2515                                                                layer, 
via->BottomLayer() ) )
 
 2517                        return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
 
 2520                    return std::nullopt;
 
 2523        auto viaEndLayerPropertyValidator =
 
 2526                    if( !aItem || aItem->Type() != 
PCB_VIA_T )
 
 2527                        return std::nullopt;
 
 2533                    else if( aValue.CheckType<
int>() )
 
 2536                        return std::nullopt;
 
 2540                    if( std::optional<PCB_VIA::VIA_PARAMETER_ERROR> error =
 
 2542                                                                via->TopLayer(), layer ) )
 
 2544                        return std::make_unique<VALIDATION_ERROR_MSG>( error->m_Message );
 
 2547                    return std::nullopt;
 
 2573        const wxString groupTechLayers = 
_HKI( 
"Technical Layers" );
 
 2575        auto isExternalLayerTrack =
 
 2601        const wxString groupVia = 
_HKI( 
"Via Properties" );
 
 
 
types::KiCadObjectType ToProtoEnum(KICAD_T aValue)
 
KICAD_T FromProtoEnum(types::KiCadObjectType aValue)
 
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
 
constexpr EDA_IU_SCALE pcbIUScale
 
constexpr int ARC_LOW_DEF
 
BITMAPS
A list of all bitmap identifiers.
 
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
 
BOARD_CONNECTED_ITEM(BOARD_ITEM *aParent, KICAD_T idtype)
 
void PackNet(kiapi::board::types::Net *aProto) const
 
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.
 
Container for design settings for a BOARD object.
 
std::shared_ptr< DRC_ENGINE > m_DRCEngine
 
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
 
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
 
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
 
virtual void TransformShapeToPolySet(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc) const
Convert the item shape to a polyset.
 
void SetLocked(bool aLocked) override
 
bool IsLocked() const override
 
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
 
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
 
virtual wxString LayerMaskDescribe() const
Return a string (to be shown to the user) describing a layer mask.
 
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.
 
Information pertinent to a Pcbnew printed circuit board.
 
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
 
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.
 
EDA_ITEM & operator=(const EDA_ITEM &aItem)
Assign the members of aItem to another object.
 
KICAD_T Type() const
Returns the type of object.
 
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 IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
 
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
 
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.
 
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 LSET AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
 
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.
 
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::...
 
@ REMOVE_EXCEPT_START_AND_END
 
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
 
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
 
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
 
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.
 
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
 
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.
 
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
 
const VECTOR2I & GetEnd() const
 
PCB_TRACK(BOARD_ITEM *aParent, KICAD_T idtype=PCB_TRACE_T)
 
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
 
PCB_LAYER_ID BottomLayer() const
 
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
 
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
 
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
 
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.
 
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
 
COVERING_MODE GetBackCoveringMode() const
 
bool FlashLayer(int aLayer) const
Check to see whether the via should have a pad on the specific layer.
 
static std::optional< VIA_PARAMETER_ERROR > ValidateViaParameters(std::optional< int > aDiameter, std::optional< int > aDrill, std::optional< PCB_LAYER_ID > aStartLayer=std::nullopt, std::optional< PCB_LAYER_ID > aEndLayer=std::nullopt)
 
void SetDrillDefault()
Set the drill value for vias to the default value UNDEFINED_DRILL_DIAMETER.
 
std::map< PCB_LAYER_ID, ZONE_LAYER_OVERRIDE > m_zoneLayerOverrides
 
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.
 
TENTING_MODE GetFrontTentingMode() const
 
void SetBottomLayer(PCB_LAYER_ID aLayer)
 
int GetSolderMaskExpansion() const
 
void SetDrill(int aDrill)
Set the drill value for vias.
 
PLUGGING_MODE GetBackPluggingMode() const
 
void SetBackPluggingMode(PLUGGING_MODE aMode)
 
MINOPTMAX< int > GetDrillConstraint(wxString *aSource=nullptr) const
 
void SetBackTentingMode(TENTING_MODE aMode)
 
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.
 
bool operator==(const PCB_VIA &aOther) const
 
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
 
std::mutex m_zoneLayerOverridesMutex
 
void SetTopLayer(PCB_LAYER_ID aLayer)
 
FILLING_MODE GetFillingMode() const
 
std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const override
 
int GetFrontWidth() const
 
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/.
 
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.
 
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 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
 
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)
 
PCB_VIA(BOARD_ITEM *aParent)
 
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
 
VIATYPE m_viaType
through, blind/buried or micro
 
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)
 
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.
 
MINOPTMAX< int > GetWidthConstraint(wxString *aSource=nullptr) const override
 
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.
 
const ZONE_LAYER_OVERRIDE & GetZoneLayerOverride(PCB_LAYER_ID aLayer) const
 
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)
 
bool HasValidLayerPair(int aCopperLayerCount)
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
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)
 
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
 
@ SOLDER_MASK_EXPANSION_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 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 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_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.
 
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)
 
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
 
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_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)
 
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