133 bestPosition.
x = pageSize.
x / 2;
134 bestPosition.
y = pageSize.
y / 2;
147 msg.Printf(
_(
"Cannot add %s (no footprint assigned)." ),
156 if( footprint ==
nullptr )
158 msg.Printf(
_(
"Cannot add %s (footprint '%s' not found)." ),
167 m_board->GetComponentClassManager().GetNoneComponentClass() );
171 msg.Printf(
_(
"Add %s (footprint '%s')." ),
183 pad->SetLocalRatsnestVisible(
m_frame->GetPcbNewSettings()->m_Display.m_ShowGlobalRatsnest );
186 pad->SetNetCode( 0 );
201 msg.Printf(
_(
"Added %s (footprint '%s')." ),
214 wxString curClassName, newClassName;
218 curClassName = curClass->
GetName();
228 newClass =
m_board->GetComponentClassManager().GetEffectiveStaticComponentClass(
230 newClassName = newClass->
GetName();
233 if( curClassName == newClassName )
240 if( curClassName == wxEmptyString && newClassName != wxEmptyString )
242 msg.Printf(
_(
"Change %s component class to '%s'." ),
246 else if( curClassName != wxEmptyString && newClassName == wxEmptyString )
248 msg.Printf(
_(
"Remove %s component class (currently '%s')." ),
254 msg.Printf(
_(
"Change %s component class from '%s' to '%s'." ),
262 wxASSERT_MSG( newClass !=
nullptr,
"Component class should not be nullptr" );
266 if( curClassName == wxEmptyString && newClassName != wxEmptyString )
268 msg.Printf(
_(
"Changed %s component class to '%s'." ),
272 else if( curClassName != wxEmptyString && newClassName == wxEmptyString )
274 msg.Printf(
_(
"Removed %s component class (was '%s')." ),
280 msg.Printf(
_(
"Changed %s component class from '%s' to '%s'." ),
298 msg.Printf(
_(
"Cannot update %s (no footprint assigned)." ),
307 if( newFootprint ==
nullptr )
309 msg.Printf(
_(
"Cannot update %s (footprint '%s' not found)." ),
321 msg.Printf(
_(
"Cannot change %s footprint from '%s' to '%s' (footprint is locked)."),
332 msg.Printf(
_(
"Change %s footprint from '%s' to '%s'."),
346 msg.Printf(
_(
"Could not change %s footprint from '%s' to '%s' (footprint is locked)."),
362 msg.Printf(
_(
"Changed %s footprint from '%s' to '%s'."),
382 if( !
m_commit.GetStatus( aPcbFootprint ) )
385 copy->SetParentGroup(
nullptr );
388 bool changed =
false;
395 msg.Printf(
_(
"Change %s reference designator to %s." ),
401 msg.Printf(
_(
"Changed %s reference designator to %s." ),
417 msg.Printf(
_(
"Change %s value from %s to %s." ),
424 msg.Printf(
_(
"Changed %s value from %s to %s." ),
439 if( !aNetlistComponent->
GetKIIDs().empty() )
440 new_path.push_back( aNetlistComponent->
GetKIIDs().front() );
442 if( aPcbFootprint->
GetPath() != new_path )
446 msg.Printf(
_(
"Update %s symbol association from %s to %s." ),
453 msg.Printf(
_(
"Updated %s symbol association from %s to %s." ),
459 aPcbFootprint->
SetPath( new_path );
465 nlohmann::ordered_map<wxString, wxString> fpFieldsAsMap;
470 if( field->IsReference() || field->IsValue() || field->IsComponentClass() )
475 fpFieldsAsMap[field->GetName()] = field->GetText();
479 nlohmann::ordered_map<wxString, wxString> compFields = aNetlistComponent->
GetFields();
485 compFields.erase( wxT(
"Component Class" ) );
491 bool remove_only =
true;
493 for(
const auto& [
name, value] : compFields )
495 if( fpFieldsAsMap.count(
name ) == 0 || fpFieldsAsMap[
name] != value )
503 for(
const auto& [
name, value] : fpFieldsAsMap )
505 if( compFields.count(
name ) == 0 )
518 msg.Printf(
_(
"Update %s fields." ), aPcbFootprint->
GetReference() );
525 if( field->IsMandatory() )
528 if( compFields.count( field->GetName() ) == 0 )
532 msg.Printf(
_(
"Remove %s footprint fields not in symbol." ),
545 msg.Printf(
_(
"Updated %s fields." ), aPcbFootprint->
GetReference() );
551 for(
auto& [
name, value] : compFields )
560 aPcbFootprint->
Add( newField );
582 std::vector<PCB_FIELD*> fieldList;
583 aPcbFootprint->
GetFields( fieldList,
false );
587 if( field->IsMandatory() )
590 if( compFields.count( field->GetName() ) == 0 )
595 msg.Printf(
_(
"Removed %s footprint fields not in symbol." ),
600 aPcbFootprint->
Remove( field );
603 m_frame->GetCanvas()->GetView()->Remove( field );
618 if( !humanSheetPath.empty() )
619 sheetname = humanSheetPath;
620 else if( aNetlistComponent->
GetProperties().count( wxT(
"Sheetname" ) ) > 0 )
621 sheetname = aNetlistComponent->
GetProperties().at( wxT(
"Sheetname" ) );
623 if( aNetlistComponent->
GetProperties().count( wxT(
"Sheetfile" ) ) > 0 )
624 sheetfile = aNetlistComponent->
GetProperties().at( wxT(
"Sheetfile" ) );
626 if( aNetlistComponent->
GetProperties().count( wxT(
"ki_fp_filters" ) ) > 0 )
627 fpFilters = aNetlistComponent->
GetProperties().at( wxT(
"ki_fp_filters" ) );
633 msg.Printf(
_(
"Update %s sheetname to '%s'." ),
640 msg.Printf(
_(
"Updated %s sheetname to '%s'." ),
652 msg.Printf(
_(
"Update %s sheetfile to '%s'." ),
659 msg.Printf(
_(
"Updated %s sheetfile to '%s'." ),
667 if( fpFilters != aPcbFootprint->
GetFilters() )
671 msg.Printf(
_(
"Update %s footprint filters to '%s'." ),
678 msg.Printf(
_(
"Updated %s footprint filters to '%s'." ),
686 if( ( aNetlistComponent->
GetProperties().count( wxT(
"exclude_from_bom" ) ) > 0 )
691 if( aNetlistComponent->
GetProperties().count( wxT(
"exclude_from_bom" ) ) )
693 msg.Printf(
_(
"Add %s 'exclude from BOM' fabrication attribute." ),
698 msg.Printf(
_(
"Remove %s 'exclude from BOM' fabrication attribute." ),
706 if( aNetlistComponent->
GetProperties().count( wxT(
"exclude_from_bom" ) ) )
709 msg.Printf(
_(
"Added %s 'exclude from BOM' fabrication attribute." ),
715 msg.Printf(
_(
"Removed %s 'exclude from BOM' fabrication attribute." ),
726 if( ( aNetlistComponent->
GetProperties().count( wxT(
"dnp" ) ) > 0 )
731 if( aNetlistComponent->
GetProperties().count( wxT(
"dnp" ) ) )
733 msg.Printf(
_(
"Add %s 'Do not place' fabrication attribute." ),
738 msg.Printf(
_(
"Remove %s 'Do not place' fabrication attribute." ),
746 if( aNetlistComponent->
GetProperties().count( wxT(
"dnp" ) ) )
749 msg.Printf(
_(
"Added %s 'Do not place' fabrication attribute." ),
755 msg.Printf(
_(
"Removed %s 'Do not place' fabrication attribute." ),
778 msg.Printf(
_(
"Added %s 'duplicate pad numbers are jumpers' attribute." ),
783 msg.Printf(
_(
"Removed %s 'duplicate pad numbers are jumpers' attribute." ),
791 msg.Printf(
_(
"Add %s 'duplicate pad numbers are jumpers' attribute." ),
796 msg.Printf(
_(
"Remove %s 'duplicate pad numbers are jumpers' attribute." ),
810 msg.Printf(
_(
"Updated %s jumper pad groups" ), aPcbFootprint->
GetReference() );
814 msg.Printf(
_(
"Update %s jumper pad groups" ), aPcbFootprint->
GetReference() );
820 if( changed &&
copy )
840 if( !
m_commit.GetStatus( aPcbFootprint ) )
843 copy->SetParentGroup(
nullptr );
846 bool changed =
false;
855 KIID existingGroupKIID = existingGroup ? existingGroup->
m_Uuid : 0;
858 auto it = std::find_if(
m_board->Groups().begin(),
m_board->Groups().end(),
860 return group->m_Uuid == newGroupKIID;
864 if( it !=
m_board->Groups().end() )
868 if( newGroupKIID == existingGroupKIID )
872 if( existingGroupKIID != 0 )
876 msg.Printf(
_(
"Remove %s from group '%s'." ),
882 msg.Printf(
_(
"Removed %s from group '%s'." ),
895 if( newGroupKIID != 0 )
899 msg.Printf(
_(
"Add %s to group '%s'." ),
905 msg.Printf(
_(
"Added %s group '%s'." ),
911 if( newGroup ==
nullptr )
914 const_cast<KIID&
>( newGroup->
m_Uuid ) = newGroupKIID;
927 newGroup->
AddItem( aPcbFootprint );
933 if( changed &&
copy )
953 copy->SetParentGroup(
nullptr );
956 bool changed =
false;
959 std::deque<PAD*> pads = aFootprint->
Pads();
960 std::set<wxString> padNetnames;
962 std::sort( pads.begin(), pads.end(),
965 return a->m_Uuid < b->m_Uuid;
972 wxLogTrace( wxT(
"NETLIST_UPDATE" ),
973 wxT(
"Processing pad %s of component %s" ),
977 wxString pinFunction;
982 wxLogTrace( wxT(
"NETLIST_UPDATE" ),
983 wxT(
" Found valid net: %s" ),
990 wxLogTrace( wxT(
"NETLIST_UPDATE" ),
991 wxT(
" No net found for pad %s" ),
997 if(
pad->GetPinFunction() != pinFunction )
1000 pad->SetPinFunction( pinFunction );
1003 if(
pad->GetPinType() != pinType )
1006 pad->SetPinType( pinType );
1015 if( !net.
IsValid() || !
pad->IsOnCopperLayer() )
1017 if( !
pad->GetNetname().IsEmpty() )
1021 msg.Printf(
_(
"Disconnect %s pin %s." ),
1027 msg.Printf(
_(
"Disconnected %s pin %s." ),
1034 else if(
pad->IsOnCopperLayer() && !
pad->GetNumber().IsEmpty() )
1037 msg.Printf(
_(
"No net found for component %s pad %s (no pin %s in symbol)." ),
1052 if(
pad->GetNetname().IsEmpty() )
1053 pad->SetPinFunction( wxEmptyString );
1065 if(
pad->IsNoConnectPad() )
1067 netName = wxString::Format( wxS(
"%s" ), net.
GetNetName() );
1069 for(
int jj = 1; !padNetnames.insert( netName ).second; jj++ )
1071 netName = wxString::Format( wxS(
"%s_%d" ), net.
GetNetName(), jj );
1080 if(
pad->GetNetname() != netName )
1083 if( netinfo ==
nullptr )
1090 if( netinfo ==
nullptr )
1102 msg.Printf(
_(
"Add net %s." ),
1107 if( !
pad->GetNetname().IsEmpty() )
1113 msg.Printf(
_(
"Reconnect %s pin %s from %s to %s."),
1121 msg.Printf(
_(
"Reconnected %s pin %s from %s to %s."),
1132 msg.Printf(
_(
"Connect %s pin %s to %s."),
1139 msg.Printf(
_(
"Connected %s pin %s to %s."),
1151 pad->SetNet( netinfo );
1161 if( changed &&
copy )
1173 std::vector<FOOTPRINT::FP_UNIT_INFO> newUnits;
1176 newUnits.push_back( { u.m_unitName, u.m_pins } );
1178 const std::vector<FOOTPRINT::FP_UNIT_INFO>& curUnits = aFootprint->
GetUnitInfo();
1180 auto unitsEqual = [](
const std::vector<FOOTPRINT::FP_UNIT_INFO>& a,
1181 const std::vector<FOOTPRINT::FP_UNIT_INFO>& b )
1183 if( a.size() != b.size() )
1186 for(
size_t i = 0; i < a.size(); ++i )
1188 if( a[i].m_unitName != b[i].m_unitName )
1191 if( a[i].m_pins != b[i].m_pins )
1198 if( unitsEqual( curUnits, newUnits ) )
1205 msg.Printf(
_(
"Update %s unit metadata." ), aFootprint->
GetReference() );
1213 if( !
m_commit.GetStatus( aFootprint ) )
1216 copy->SetParentGroup(
nullptr );
1221 msg.Printf(
_(
"Updated %s unit metadata." ), aFootprint->
GetReference() );
1235 if( !zone->IsOnCopperLayer() || zone->GetIsRuleArea() )
1246 std::set<wxString> netlistNetnames;
1248 for(
int ii = 0; ii < (int) aNetlist.
GetCount(); ii++ )
1252 for(
unsigned jj = 0; jj < component->
GetNetCount(); jj++ )
1264 if( netlistNetnames.count(
via->GetNetname() ) == 0 )
1266 wxString updatedNetname = wxEmptyString;
1275 if( !updatedNetname.IsEmpty() )
1279 wxString originalNetname =
via->GetNetname();
1281 msg.Printf(
_(
"Reconnect via from %s to %s." ),
1296 wxString originalNetname =
via->GetNetname();
1299 via->SetNet( netinfo );
1301 msg.Printf(
_(
"Reconnected via from %s to %s." ),
1311 msg.Printf(
_(
"Via connected to unknown net (%s)." ),
1323 auto isInNetlist = [&](
const wxString& aNetName ) ->
bool
1325 if( netlistNetnames.count( aNetName ) )
1330 for(
const wxString& netName : netlistNetnames )
1332 if( aNetName.StartsWith( netName ) )
1342 if( !zone->IsOnCopperLayer() || zone->GetIsRuleArea() )
1345 if( !isInNetlist( zone->GetNetname() ) )
1350 wxString updatedNetname = wxEmptyString;
1363 if( updatedNetname.IsEmpty() &&
m_oldToNewNets.count( zone->GetNetname() ) )
1368 if( !updatedNetname.IsEmpty() )
1372 wxString originalNetname = zone->GetNetname();
1374 if( !zone->GetZoneName().IsEmpty() )
1376 msg.Printf(
_(
"Reconnect copper zone '%s' from %s to %s." ),
1377 zone->GetZoneName(),
1383 msg.Printf(
_(
"Reconnect copper zone from %s to %s." ),
1399 wxString originalNetname = zone->GetNetname();
1402 zone->SetNet( netinfo );
1404 if( !zone->GetZoneName().IsEmpty() )
1406 msg.Printf(
_(
"Reconnected copper zone '%s' from %s to %s." ),
1413 msg.Printf(
_(
"Reconnected copper zone from %s to %s." ),
1424 if( !zone->GetZoneName().IsEmpty() )
1426 msg.Printf(
_(
"Copper zone '%s' has no pads connected." ),
1431 wxString layerNames = zone->LayerMaskDescribe();
1436 if(
m_frame->GetPcbNewSettings()->m_Display.m_DisplayInvertXAxis )
1439 if(
m_frame->GetPcbNewSettings()->m_Display.m_DisplayInvertYAxis )
1443 msg.Printf(
_(
"Copper zone on %s at (%s, %s) has no pads connected to net \"%s\"." ),
1449 zone->GetNetname() );
1471 if( netlistGroup ==
nullptr )
1474 if( netlistGroup->
name != pcbGroup->GetName() )
1479 msg.Printf(
_(
"Change group name to '%s' to '%s'." ),
EscapeHTML( pcbGroup->GetName() ),
1486 msg.Printf(
_(
"Changed group name to '%s' to '%s'." ),
EscapeHTML( pcbGroup->GetName() ),
1489 pcbGroup->SetName( netlistGroup->
name );
1493 if( netlistGroup->
libId != pcbGroup->GetDesignBlockLibId() )
1498 msg.Printf(
_(
"Change group library link to '%s'." ),
1505 msg.Printf(
_(
"Changed group library link to '%s'." ),
1508 pcbGroup->SetDesignBlockLibId( netlistGroup->
libId );
1518 std::map<COMPONENT*, FOOTPRINT*>& aFootprintMap )
1526 for(
int i = 0; i < (int) aNetlist.
GetCount(); i++ )
1529 FOOTPRINT* footprint = aFootprintMap[component];
1535 for(
unsigned jj = 0; jj < component->
GetNetCount(); jj++ )
1539 if( padNumber.IsEmpty() )
1542 msg.Printf(
_(
"Symbol %s has pins with no number. These pins can not be matched "
1552 msg.Printf(
_(
"%s pad %s not found in %s." ),
1568 FOOTPRINT* lastPreexistingFootprint =
nullptr;
1571 std::unordered_set<wxString> sheetPaths;
1577 std::map<COMPONENT*, FOOTPRINT*> footprintMap;
1579 if( !
m_board->Footprints().empty() )
1580 lastPreexistingFootprint =
m_board->Footprints().back();
1590 net->SetIsCurrent( net->GetNetCode() == 0 );
1592 m_board->GetComponentClassManager().InitNetlistUpdate();
1598 for(
unsigned i = 0; i < aNetlist.
GetCount(); i++ )
1602 if( component->
GetProperties().count( wxT(
"exclude_from_board" ) ) )
1605 msg.Printf(
_(
"Processing symbol '%s:%s'." ),
1621 base.push_back( uuid );
1623 if( footprint->GetPath() == base )
1632 match = footprint->GetReference().CmpNoCase( component->
GetReference() ) == 0;
1647 footprintMap[ component ] = tmp;
1655 sheetPaths.insert( footprint->GetSheetname() );
1661 if( footprint == lastPreexistingFootprint )
1668 if( matchCount == 0 )
1674 footprintMap[ component ] = footprint;
1685 else if( matchCount > 1 )
1687 msg.Printf(
_(
"Multiple footprints found for %s." ),
1702 bool matched =
false;
1713 if( component && component->
GetProperties().count( wxT(
"exclude_from_board" ) ) == 0 )
1716 if( doDelete && !matched && footprint->IsLocked() && !
m_overrideLocks )
1720 msg.Printf(
_(
"Cannot remove unused footprint %s (footprint is locked)." ),
1721 footprint->GetReference() );
1725 msg.Printf(
_(
"Could not remove unused footprint %s (footprint is locked)." ),
1726 footprint->GetReference() );
1734 if( doDelete && !matched )
1738 msg.Printf(
_(
"Remove unused footprint %s." ),
1739 footprint->GetReference() );
1744 msg.Printf(
_(
"Removed unused footprint %s." ),
1745 footprint->GetReference() );
1755 for(
PAD*
pad : footprint->Pads() )
1758 pad->GetNet()->SetIsCurrent(
true );
1766 m_board->GetComponentClassManager().FinishNetlistUpdate();
1767 m_board->SynchronizeComponentClasses( sheetPaths );
1774 if( !net->IsCurrent() )
1776 msg.Printf(
_(
"Removed unused net %s." ),
1791 m_board->SynchronizeNetsAndNetClasses(
true );
1802 for(
const std::pair<const wxString, NETINFO_ITEM*>& addedNet :
m_addedNets )
1803 delete addedNet.second;
constexpr EDA_IU_SCALE pcbIUScale
wxString GetNetname() const
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
std::map< PAD *, wxString > m_padNets
bool m_deleteUnusedFootprints
void cacheNetname(PAD *aPad, const wxString &aNetname)
bool UpdateNetlist(NETLIST &aNetlist)
Update the board's components according to the new netlist.
wxString getNetname(PAD *aPad)
wxString getPinFunction(PAD *aPad)
std::vector< FOOTPRINT * > m_addedFootprints
std::map< wxString, wxString > m_oldToNewNets
void updateComponentClass(FOOTPRINT *aFootprint, COMPONENT *aNewComponent)
bool updateFootprintGroup(FOOTPRINT *aPcbFootprint, COMPONENT *aNetlistComponent)
bool updateFootprintParameters(FOOTPRINT *aPcbFootprint, COMPONENT *aNetlistComponent)
std::map< wxString, NETINFO_ITEM * > m_addedNets
bool testConnectivity(NETLIST &aNetlist, std::map< COMPONENT *, FOOTPRINT * > &aFootprintMap)
bool updateCopperZoneNets(NETLIST &aNetlist)
void cachePinFunction(PAD *aPad, const wxString &aPinFunction)
bool updateGroups(NETLIST &aNetlist)
BOARD_NETLIST_UPDATER(PCB_EDIT_FRAME *aFrame, BOARD *aBoard)
bool updateComponentPadConnections(FOOTPRINT *aFootprint, COMPONENT *aNewComponent)
VECTOR2I estimateFootprintInsertionPosition()
std::map< PAD *, wxString > m_padPinFunctions
std::map< ZONE *, std::vector< PAD * > > m_zoneConnectionsCache
FOOTPRINT * replaceFootprint(NETLIST &aNetlist, FOOTPRINT *aFootprint, COMPONENT *aNewComponent)
void cacheCopperZoneConnections()
bool updateComponentUnits(FOOTPRINT *aFootprint, COMPONENT *aNewComponent)
FOOTPRINT * addNewFootprint(COMPONENT *aComponent)
Information pertinent to a Pcbnew printed circuit board.
constexpr size_type GetWidth() const
constexpr Vec Centre() const
constexpr size_type GetHeight() const
constexpr coord_type GetBottom() const
static wxString GetFullClassNameForConstituents(const std::unordered_set< wxString > &classNames)
Gets the full effective class name for the given set of constituent classes.
A lightweight representation of a component class.
const wxString & GetName() const
Fetches the full name of this component class.
Used to store the component pin name to net name (and pin function) associations stored in a netlist.
const wxString & GetNetName() const
const wxString & GetPinFunction() const
const wxString & GetPinName() const
const wxString & GetPinType() const
Store all of the related component information found in a netlist.
const std::vector< UNIT_INFO > & GetUnitInfo() const
const wxString & GetHumanReadablePath() const
const COMPONENT_NET & GetNet(unsigned aIndex) const
const KIID_PATH & GetPath() const
const wxString & GetReference() const
const wxString & GetValue() const
const nlohmann::ordered_map< wxString, wxString > & GetFields() const
const std::map< wxString, wxString > & GetProperties() const
NETLIST_GROUP * GetGroup() const
const std::vector< KIID > & GetKIIDs() const
bool GetDuplicatePadNumbersAreJumpers() const
const LIB_ID & GetFPID() const
unsigned GetNetCount() const
std::unordered_set< wxString > & GetComponentClassNames()
std::vector< std::set< wxString > > & JumperPadGroups()
void RemoveItem(EDA_ITEM *aItem)
Remove item from group.
void AddItem(EDA_ITEM *aItem)
Add item to group.
void SetName(const wxString &aName)
virtual EDA_GROUP * GetParentGroup() const
virtual void SetParent(EDA_ITEM *aParent)
virtual void SetVisible(bool aVisible)
virtual void SetText(const wxString &aText)
wxString AsString() const
wxString GetUniStringLibId() const
Handle the data for a net.
void SetIsCurrent(bool isCurrent)
static const int UNCONNECTED
Constant that holds the "unconnected net" number (typically 0) all items "connected" to this net are ...
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
unsigned GetCount() const
COMPONENT * GetComponentByPath(const KIID_PATH &aPath)
Return a COMPONENT by aPath.
COMPONENT * GetComponentByReference(const wxString &aReference)
Return a COMPONENT by aReference.
NETLIST_GROUP * GetGroupByUuid(const KIID &aUuid)
Return a NETLIST_GROUP by aUuid.
COMPONENT * GetComponent(unsigned aIndex)
Return the COMPONENT at aIndex.
static REPORTER & GetInstance()
const wxString & GetPinFunction() const
The main frame for Pcbnew.
void SetName(const wxString &aName)
A set of BOARD_ITEMs (i.e., without duplicates).
EDA_ITEM * AsEdaItem() override
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings, bool aCheckSide) override
virtual void SetPosition(const VECTOR2I &aPos) override
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
Handle a list of polygons defining a copper zone.
KICOMMON_API wxString MessageTextFromValue(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits, double aValue, bool aAddUnitsText=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A helper to convert the double length aValue to a string in inches, millimeters, or unscaled units.
Class to handle a set of BOARD_ITEMs.
wxString EscapeHTML(const wxString &aString)
Return a new wxString escaped for embedding in HTML.
wxString UnescapeString(const wxString &aSource)
@ USER
The field ID hasn't been set yet; field is invalid.
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString GetCanonicalFieldName(FIELD_T aFieldType)
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
VECTOR2< int32_t > VECTOR2I