72#include <wx/filename.h>
95#include <wx/hyperlink.h>
98using namespace std::placeholders;
132 double backgroundBrightness =
m_frame->GetCanvas()->GetGAL()->GetClearColor().GetBrightness();
135 if( backgroundBrightness > 0.5 )
184 const wxString fn = *aEvent.
Parameter<wxString*>();
193 const wxString fn = *aEvent.
Parameter<wxString*>();
195 m_frame->Zoom_Automatique(
false );
253 editFrame->OnDisplayOptionsChanged();
285 if(
Pgm().GetCommonSettings()->m_DoNotShowAgain.zone_fill_warning )
288 bool unfilledZones =
false;
290 for(
const ZONE* zone :
board()->Zones() )
292 if( !zone->GetIsRuleArea() && !zone->IsFilled() )
294 unfilledZones =
true;
302 wxHyperlinkCtrl* button =
new wxHyperlinkCtrl( infobar, wxID_ANY,
_(
"Don't show again" ), wxEmptyString );
304 button->Bind( wxEVT_COMMAND_HYPERLINK, std::function<
void( wxHyperlinkEvent& aEvent )>(
305 [&]( wxHyperlinkEvent& aEvent )
308 m_frame->GetInfoBar()->Dismiss();
315 msg.Printf(
_(
"Not all zones are filled. Use Edit > Fill All Zones (%s) "
316 "if you wish to see all fills." ),
359 m_frame->SetDisplayOptions( opts );
377 m_frame->SetDisplayOptions( opts );
393 m_frame->SetDisplayOptions( opts );
402 if( !
Pgm().GetCommonSettings()->m_Input.hotkey_feedback )
407 wxArrayString labels;
408 labels.Add(
_(
"Normal" ) );
409 labels.Add(
_(
"Dimmed" ) );
410 labels.Add(
_(
"Hidden" ) );
412 if( !
m_frame->GetHotkeyPopup() )
437 m_frame->SetDisplayOptions( opts );
462 editFrame->OnDisplayOptionsChanged();
484 bool wraparound =
false;
498 for( ; ii < (int) layerStack.size(); ii++ )
500 if( layer == layerStack[ii] )
505 for( ; ii < (int) layerStack.size(); ii++ )
509 if( jj >= (
int) layerStack.size() )
512 layer = layerStack[jj];
543 bool wraparound =
false;
557 for( ; ii < (int) layerStack.size(); ii++ )
559 if( layer == layerStack[ii] )
564 for( ; ii >= 0; ii-- )
569 jj = (int) layerStack.size() - 1;
571 layer = layerStack[jj];
600 int currentLayer =
m_frame->GetActiveLayer();
614#define ALPHA_MIN 0.20
615#define ALPHA_MAX 1.00
616#define ALPHA_STEP 0.05
622 int currentLayer =
m_frame->GetActiveLayer();
628 settings->
SetColor( currentLayer, currentColor );
629 m_frame->GetCanvas()->UpdateColors();
632 view->UpdateLayerColor( currentLayer );
638 m_frame->GetCanvas()->ForceRefresh();
652 int currentLayer =
m_frame->GetActiveLayer();
658 settings->
SetColor( currentLayer, currentColor );
659 m_frame->GetCanvas()->UpdateColors();
662 view->UpdateLayerColor( currentLayer );
668 m_frame->GetCanvas()->ForceRefresh();
691 if( presets.size() < 2 )
694 if( currentIndex < 0 )
696 wxASSERT_MSG(
false,
"Current layer pair not found in layer settings" );
700 const int nextIndex = ( currentIndex + 1 ) % presets.size();
701 const LAYER_PAIR& nextPair = presets[nextIndex].GetLayerPair();
714 if( !
Pgm().GetCommonSettings()->m_Input.hotkey_feedback )
729 wxArrayString labels;
732 wxString label = layerPresentation.
getLayerPairName( layerPairInfo.GetLayerPair() );
734 if( layerPairInfo.GetName() )
735 label += wxT(
" (" ) + *layerPairInfo.GetName() + wxT(
")" );
740 if( !editFrame->GetHotkeyPopup() )
741 editFrame->CreateHotkeyPopup();
794 [
this](
const VECTOR2D& pt ) ->
bool
816#define HITTEST_THRESHOLD_PIXELS 5
837 [
this](
const VECTOR2D& aPosition ) ->
bool
880 for(
int i = collector.
GetCount() - 1; i >= 0; --i )
882 if( !selectionTool->
Selectable( collector[i] ) )
907 [
this](
const int& aFinalState )
916 m_frame->GetCanvas()->Refresh();
926 std::vector<BOARD_ITEM*>& aPastedItems )
934 pad->SetParent( editorFootprint );
935 aPastedItems.push_back(
pad );
938 aClipFootprint->
Pads().clear();
945 wxCHECK2( field,
continue );
947 if( field->IsMandatory() )
949 if(
EDA_GROUP* parentGroup = field->GetParentGroup() )
950 parentGroup->RemoveItem( field );
959 VECTOR2I pos = field->GetFPRelativePosition();
960 field->SetParent( editorFootprint );
961 field->SetFPRelativePosition( pos );
963 aPastedItems.push_back( field );
979 item->Rotate( item->GetPosition(), -aClipFootprint->
GetOrientation() );
980 item->Rotate( item->GetPosition(), editorFootprint->
GetOrientation() );
982 VECTOR2I pos = item->GetFPRelativePosition();
983 item->SetParent( editorFootprint );
984 item->SetFPRelativePosition( pos );
986 aPastedItems.push_back( item );
991 for(
ZONE* zone : aClipFootprint->
Zones() )
993 zone->SetParent( editorFootprint );
994 aPastedItems.push_back( zone );
997 aClipFootprint->
Zones().clear();
1001 group->SetParent( editorFootprint );
1002 aPastedItems.push_back(
group );
1005 aClipFootprint->
Groups().clear();
1019 std::vector<BOARD_ITEM*> returnItems;
1020 bool fpItemDeleted =
false;
1035 returnItems.push_back( fp );
1039 returnItems.push_back( item );
1043 LSET allowed = item->GetLayerSet() & enabledLayers;
1044 bool item_valid =
true;
1050 item_valid =
static_cast<PCB_VIA*
>( item )->HasValidLayerPair(
board()->GetCopperLayerCount() );
1052 if( allowed.any() && item_valid )
1054 item->SetLayerSet( allowed );
1055 returnItems.push_back( item );
1059 if(
EDA_GROUP* parentGroup = item->GetParentGroup() )
1060 parentGroup->RemoveItem( item );
1065 if( ( returnItems.size() < aItems.size() ) || fpItemDeleted )
1068 "present in the current board.\n"
1069 "These items could not be pasted.\n" ) );
1072 aItems = returnItems;
1091 if( wxDialog::OSXHasModalDialogsOpen() )
1105 if( selTool && clipItem )
1109 bool hasTableCells =
false;
1115 hasTableCells =
true;
1126 BOARD* clipBoard =
static_cast<BOARD*
>( clipItem );
1132 clipboardTable =
static_cast<PCB_TABLE*
>( item );
1138 if( clipboardTable )
1154 commit.
Push(
_(
"Paste Cells" ) );
1170 std::vector<BOARD_ITEM*> newItems;
1174 auto refImg = std::make_unique<PCB_REFERENCE_IMAGE>(
m_frame->GetModel() );
1176 if( refImg->GetReferenceImage().SetImage( clipImg->ConvertToImage() ) )
1177 newItems.push_back( refImg.release() );
1183 if( clipText.empty() )
1190 "Do you want to continue?" ) );
1195 std::unique_ptr<PCB_TEXT> item = std::make_unique<PCB_TEXT>(
m_frame->GetModel() );
1196 item->SetText( clipText );
1197 item->SetLayer(
m_frame->GetActiveLayer() );
1199 newItems.push_back( item.release() );
1202 bool cancelled = !
placeBoardItems( &commit, newItems,
true,
false,
false,
false );
1207 commit.
Push(
_(
"Paste Text" ) );
1214 bool clear_nets =
false;
1215 const wxString defaultRef = wxT(
"REF**" );
1232 BOARD* clipBoard =
static_cast<BOARD*
>( clipItem );
1234 if( isFootprintEditor || clear_nets )
1245 bool cancelled =
false;
1247 switch( clipItem->
Type() )
1251 BOARD* clipBoard =
static_cast<BOARD*
>( clipItem );
1253 if( isFootprintEditor )
1256 std::vector<BOARD_ITEM*> pastedItems;
1260 group->SetParent( editorFootprint );
1261 pastedItems.push_back(
group );
1271 switch( clipDrawItem->Type() )
1283 clipDrawItem->SetParent( editorFootprint );
1284 pastedItems.push_back( clipDrawItem );
1290 if(
EDA_GROUP* parentGroup = clipDrawItem->GetParentGroup() )
1291 parentGroup->RemoveItem( clipDrawItem );
1302 [&](
EDA_ITEM* item,
void* testData )
1331 fp->ResolveComponentClassNames(
board(), fp->GetTransientComponentClassNames() );
1332 fp->ClearTransientComponentClassNames();
1338 fp->SetReference( defaultRef );
1350 std::vector<BOARD_ITEM*> pastedItems;
1352 if( isFootprintEditor )
1355 delete clipFootprint;
1365 pastedItems.push_back( clipFootprint );
1375 m_frame->DisplayToolMsg(
_(
"Invalid clipboard contents" ) );
1382 commit.
Push(
_(
"Paste" ) );
1423 std::unique_ptr<DESIGN_BLOCK> designBlock( designBlockPane->
GetDesignBlock( selectedLibId,
true,
true ) );
1428 msg.Printf(
_(
"Could not find design block %s." ), selectedLibId.
GetUniStringLibId() );
1433 if( designBlock->GetBoardFile().IsEmpty() || !wxFileName::FileExists( designBlock->GetBoardFile() ) )
1435 editFrame->
ShowInfoBarError(
_(
"Design block has no layout to place." ),
true );
1445 bool repeatPlacement =
false;
1448 repeatPlacement = cfg->m_DesignBlockChooserPanel.repeated_placement;
1454 ret =
AppendBoard( *pi, designBlock->GetBoardFile(), designBlock.get() );
1455 }
while( repeatPlacement && ret == 0 );
1475 std::vector<PCB_GROUP*> linkedGroups;
1476 int skippedNoLink = 0;
1486 linkedGroups.push_back( g );
1491 if( linkedGroups.empty() )
1493 m_frame->ShowInfoBarError(
_(
"No groups with a linked design block are selected." ),
true );
1499 bool hasLocked =
false;
1503 for(
EDA_ITEM* item : g->GetItems() )
1518 m_frame->ShowInfoBarWarning(
_(
"Selection contains locked items. "
1519 "Enable 'Override locks' to operate on them." ),
1533 std::vector<Failure> failures;
1535 bool cancelled =
false;
1537 std::unique_ptr<WX_PROGRESS_REPORTER> progress;
1539 if( linkedGroups.size() > 1 &&
Pgm().IsGUI() )
1541 progress = std::make_unique<WX_PROGRESS_REPORTER>(
m_frame,
_(
"Applying Design Block Layouts" ),
1545 auto generateBoundingBox = [](
const std::unordered_set<EDA_ITEM*>& aItems )
1547 std::vector<VECTOR2I> bbCorners;
1548 bbCorners.reserve( aItems.size() * 4 );
1552 const BOX2I bb = item->GetBoundingBox().GetInflated( 100000 );
1556 std::vector<VECTOR2I> hullVertices;
1565 auto applyOneGroup = [&](
PCB_GROUP*
group, wxString& outErr ) ->
bool
1568 std::unique_ptr<DESIGN_BLOCK> designBlock( pane->
GetDesignBlock(
group->GetDesignBlockLibId(),
true,
true ) );
1572 outErr =
_(
"design block is not in the loaded libraries" );
1576 if( designBlock->GetBoardFile().IsEmpty() )
1578 outErr =
_(
"design block has no saved PCB layout" );
1590 auto clearFlags = [&]()
1606 if( !pi ||
AppendBoard( *pi, designBlock->GetBoardFile(), designBlock.get(), &tempCommit,
true ) != 0 )
1609 outErr =
_(
"could not load the design block's layout" );
1636 outErr =
_(
"design block layout could not be loaded" );
1669 outErr =
_(
"group has no footprints" );
1675 group->GetDesignBlockLibId().GetUniStringLibId() ) );
1691 .m_connectedRoutingOnly =
false,
1692 .m_copyPlacement =
true,
1693 .m_copyOtherItems =
true,
1694 .m_groupItems =
false,
1695 .m_includeLockedItems =
true,
1696 .m_anchorFp =
nullptr };
1699 int result = mct->
RepeatLayout( aEvent, dbRA, destRA, options, &sharedCommit, &repeatErr );
1708 outErr = repeatErr.IsEmpty() ?
_(
"layout copy failed" ) : repeatErr;
1715 for(
size_t i = 0; i < linkedGroups.size(); ++i )
1721 progress->SetCurrentProgress(
static_cast<double>( i ) / linkedGroups.size() );
1723 wxString::Format(
_(
"Applying layout to group %zu of %zu..." ), i + 1, linkedGroups.size() ) );
1725 if( !progress->KeepRefreshing() )
1734 if( applyOneGroup( g, err ) )
1737 failures.push_back( { g, err } );
1741 progress->SetCurrentProgress( 1.0 );
1745 sharedCommit.Revert();
1746 m_frame->ShowInfoBarMsg(
_(
"Apply design block layout cancelled." ),
true );
1752 sharedCommit.Push( wxString::Format(
_(
"Apply design block layout to %d group(s)" ), applied ) );
1756 sharedCommit.Revert();
1759 if( skippedNoLink > 0 || !failures.empty() || linkedGroups.size() > 1 )
1763 html << wxT(
"<p>" )
1764 << wxString::Format(
_(
"Applied design block layout to %d of %d group(s)." ), applied,
1765 (
int) linkedGroups.size() )
1768 if( skippedNoLink > 0 )
1770 html << wxT(
"<p>" )
1771 << wxString::Format(
_(
"Skipped %d selected item(s) that are not groups linked to a "
1777 if( !failures.empty() )
1779 html << wxT(
"<p>" ) <<
_(
"The following groups could not be processed:" ) << wxT(
"</p><ul>" );
1781 for(
const Failure& f : failures )
1783 wxString
name = f.group->GetName().IsEmpty() ?
_(
"(unnamed group)" ) : f.group->GetName();
1784 html << wxString::Format( wxT(
"<li><b>%s</b>: %s</li>" ),
name, f.reason );
1787 html << wxT(
"</ul>" );
1796 return applied > 0 ? 0 : 1;
1815 if( !
group->HasDesignBlockLink() )
1820 std::unique_ptr<DESIGN_BLOCK> designBlock( designBlockPane->
GetDesignBlock(
group->GetDesignBlockLibId(),
1826 msg.Printf(
_(
"Could not find design block %s." ),
group->GetDesignBlockLibId().GetUniStringLibId() );
1827 m_frame->GetInfoBar()->ShowMessageFor( msg, 5000, wxICON_WARNING );
1831 if( designBlock->GetBoardFile().IsEmpty() )
1834 msg.Printf(
_(
"Design block %s does not have a board file." ),
1835 group->GetDesignBlockLibId().GetUniStringLibId() );
1836 m_frame->GetInfoBar()->ShowMessageFor( msg, 5000, wxICON_WARNING );
1847 if( aEvent.
Parameter<
bool*>() !=
nullptr )
1848 return AppendBoard( *pi, designBlock->GetBoardFile(), designBlock.get(),
1851 return AppendBoard( *pi, designBlock->GetBoardFile(), designBlock.get() );
1871 if( !
group->HasDesignBlockLink() )
1876 std::unique_ptr<DESIGN_BLOCK> designBlock( designBlockPane->
GetDesignBlock(
group->GetDesignBlockLibId(),
1882 msg.Printf(
_(
"Could not find design block %s." ),
group->GetDesignBlockLibId().GetUniStringLibId() );
1883 m_frame->GetInfoBar()->ShowMessageFor( msg, 5000, wxICON_WARNING );
1894 bool aReannotateDuplicates,
bool aSkipMove )
1897 bool isNew =
board() != aBoard;
1898 std::vector<BOARD_ITEM*> items;
1906 bool doCopy = ( item->GetFlags() &
SKIP_STRUCT ) == 0;
1909 item->SetFlags( isNew ?
IS_NEW : 0 );
1912 items.push_back( item );
1923 item->SetParent(
board() );
1928 return placeBoardItems( aCommit, items, isNew, aAnchorAtOrigin, aReannotateDuplicates, aSkipMove );
1933 bool aAnchorAtOrigin,
bool aReannotateDuplicates,
bool aSkipMove )
1939 std::vector<BOARD_ITEM*> itemsToSel;
1940 itemsToSel.reserve( aItems.size() );
1948 item->RunOnChildren(
1959 if( item->IsGroupableType() && !item->GetParentGroup() )
1962 enteredGroup->AddItem( item );
1966 item->SetParent(
board() );
1992 if( !item->GetParentGroup() || !
alg::contains( aItems, item->GetParentGroup()->AsEdaItem() ) )
1993 itemsToSel.push_back( item );
1997 EDA_ITEMS toSel( itemsToSel.begin(), itemsToSel.end() );
2007 aCommit->
Add( item );
2009 aCommit->
Added( item );
2016 if( aAnchorAtOrigin )
2022 selection.SetReferencePoint( item->GetPosition() );
2051 std::unique_ptr<BOARD_COMMIT> tempCommit;
2056 tempCommit = std::make_unique<BOARD_COMMIT>( editFrame );
2057 commit = tempCommit.get();
2067 auto clearSkipStructOnExistingItems =
2074 std::map<wxString, wxString> oldProperties = brd->
GetProperties();
2075 std::map<wxString, wxString> newProperties;
2087 std::map<std::string, UTF8> props;
2091 props[
"page_width"] = std::to_string( editFrame->
GetPageSizeIU().
x );
2092 props[
"page_height"] = std::to_string( editFrame->
GetPageSizeIU().
y );
2096 [&]( wxString aTitle,
int aIcon, wxString aMessage, wxString aAction ) ->
bool
2098 KIDIALOG dlg( editFrame, aMessage, aTitle, wxOK | wxCANCEL | aIcon );
2100 if( !aAction.IsEmpty() )
2101 dlg.SetOKLabel( aAction );
2111 pi.
LoadBoard( fileName, brd, &props,
nullptr );
2116 clearSkipStructOnExistingItems();
2123 for(
const std::pair<const wxString, wxString>& prop : oldProperties )
2124 newProperties[prop.first] = prop.second;
2146 connectedItem->SetLocalRatsnestVisible( showGlobalRatsnest );
2151 pad->SetLocalRatsnestVisible( showGlobalRatsnest );
2159 if( copperLayerCount > initialCopperLayerCount )
2164 enabledLayers |= initialEnabledLayers;
2171 bool placeAsGroup =
false;
2174 placeAsGroup = cfg->m_DesignBlockChooserPanel.place_as_group;
2184 int groupableCount = 0;
2188 if( eda_item->IsBOARD_ITEM()
2195 if( groupableCount >= 2 )
2211 if( eda_item->IsBOARD_ITEM() )
2213 if(
static_cast<BOARD_ITEM*
>( eda_item )->IsLocked() )
2214 group->SetLocked(
true );
2222 if( eda_item->IsBOARD_ITEM()
2225 commit->
Modify( eda_item );
2226 group->AddItem( eda_item );
2241 commit->
Push( aDesignBlock ?
_(
"Place Design Block" ) :
_(
"Append Board" ) );
2257 clearSkipStructOnExistingItems();
2266 wxCommandEvent
dummy;
2278 wxCommandEvent
dummy;
2290 :
m_frame->GetPcbNewSettings()->m_MagneticItems;
2298 snapMode = !snapMode;
2308 if( !
Pgm().GetCommonSettings()->m_Input.hotkey_feedback )
2311 wxArrayString labels;
2312 labels.Add(
_(
"Active Layer" ) );
2313 labels.Add(
_(
"All Layers" ) );
2315 if( !
m_frame->GetHotkeyPopup() )
2321 :
m_frame->GetPcbNewSettings()->m_MagneticItems;
2324 popup->
Popup(
_(
"Object Snapping" ), labels,
static_cast<int>( settings.
allLayers ) );
2336 std::shared_ptr<DRC_ENGINE> drcEngine =
m_frame->GetBoard()->GetDesignSettings().m_DRCEngine;
2339 std::vector<MSG_PANEL_ITEM> msgItems;
2341 if( routerTool && routerTool->RoutingInProgress() )
2343 routerTool->UpdateMessagePanel();
2347 if( !pcbFrame && !
m_frame->GetModel() )
2367 msgItems.emplace_back(
_(
"UUID" ), *uuid );
2383 if( candidate->GetNet() != coupledNet )
2388 if( !coupledItem || dist_sq < closestDist_sq )
2390 coupledItem = candidate;
2391 closestDist_sq = dist_sq;
2397 wxString msg =
m_frame->MessageTextFromMinOptMax( constraint.
Value() );
2399 if( !msg.IsEmpty() )
2401 msgItems.emplace_back( wxString::Format(
_(
"DP Gap Constraints: %s" ), msg ),
2402 wxString::Format(
_(
"(from %s)" ), constraint.
GetName() ) );
2410 msgItems.emplace_back( wxString::Format(
_(
"DP Max Uncoupled-length: %s" ), msg ),
2411 wxString::Format(
_(
"(from %s)" ), constraint.
GetName() ) );
2415 else if( pcbFrame &&
selection.GetSize() == 2 )
2432 if( a_conn && b_conn )
2438 if( overlap.count() > 0 )
2442 if( a_netcode != b_netcode || a_netcode < 0 || b_netcode < 0 )
2445 msgItems.emplace_back(
_(
"Resolved Clearance" ),
2452 int actual_clearance = a_shape->GetClearance( b_shape.get() );
2454 if( actual_clearance > -1 && actual_clearance < std::numeric_limits<int>::max() )
2456 msgItems.emplace_back(
_(
"Actual Clearance" ),
2457 m_frame->MessageTextFromValue( actual_clearance ) );
2478 int actual = std::numeric_limits<int>::max();
2485 actual = std::min(
actual, hole->GetClearance( other.get() ) );
2493 actual = std::min(
actual, hole->GetClearance( other.get() ) );
2496 if(
actual < std::numeric_limits<int>::max() )
2499 msgItems.emplace_back(
_(
"Resolved Hole Clearance" ),
2502 if(
actual > -1 &&
actual < std::numeric_limits<int>::max() )
2504 msgItems.emplace_back(
_(
"Actual Hole Clearance" ),
2539 msgItems.emplace_back(
_(
"Resolved Edge Clearance" ),
2544 msgItems.emplace_back(
_(
"Resolved Margin Clearance" ),
2554 if( msgItems.empty() )
2557 std::map<KICAD_T, int> typeCounts;
2560 typeCounts[item->Type()]++;
2563 bool allSameType = ( typeCounts.size() == 1 );
2564 KICAD_T commonType = allSameType ? typeCounts.begin()->first :
NOT_USED;
2569 wxString typeName =
selection.Front()->GetFriendlyName();
2570 msgItems.emplace_back( typeName,
2571 wxString::Format( wxT(
"%d" ),
selection.GetSize() ) );
2576 std::set<wxString> layers;
2577 std::set<PAD_SHAPE> shapes;
2578 std::set<VECTOR2I> sizes;
2583 layers.insert(
pad->LayerMaskDescribe() );
2588 if( layers.size() == 1 )
2589 msgItems.emplace_back(
_(
"Layer" ), *layers.begin() );
2591 if( shapes.size() == 1 )
2594 msgItems.emplace_back(
_(
"Pad Shape" ),
2598 if( sizes.size() == 1 )
2601 msgItems.emplace_back(
_(
"Pad Size" ),
2602 wxString::Format( wxT(
"%s x %s" ),
2603 m_frame->MessageTextFromValue( size.
x ),
2604 m_frame->MessageTextFromValue( size.
y ) ) );
2613 for(
const auto& [type, count] : typeCounts )
2615 if( !breakdown.IsEmpty() )
2616 breakdown += wxT(
", " );
2623 if( item->Type() == type )
2625 typeName = item->GetFriendlyName();
2630 breakdown += wxString::Format( wxT(
"%s: %d" ), typeName, count );
2633 msgItems.emplace_back(
_(
"Selected Items" ),
2634 wxString::Format( wxT(
"%d (%s)" ),
2640 std::set<wxString> netNames;
2641 std::set<wxString> netClasses;
2651 netClasses.insert(
UnescapeString( bci->GetEffectiveNetClass()->GetHumanReadableName() ) );
2653 if( netNames.size() > 1 && netClasses.size() > 1 )
2658 if( netNames.size() == 1 )
2659 msgItems.emplace_back(
_(
"Net" ), *netNames.begin() );
2661 if( netClasses.size() == 1 )
2662 msgItems.emplace_back(
_(
"Resolved Netclass" ), *netClasses.begin() );
2668 bool lengthValid =
true;
2669 double selectedLength = 0;
2672 std::function<void(
EDA_ITEM* )> accumulateTrackLength;
2674 accumulateTrackLength =
2679 selectedLength +=
static_cast<PCB_TRACK*
>( aItem )->GetLength();
2697 lengthValid =
false;
2707 lengthValid =
false;
2714 accumulateTrackLength( item );
2719 msgItems.emplace_back(
_(
"Selected 2D Length" ),
2720 m_frame->MessageTextFromValue( selectedLength ) );
2726 LSET enabledLayers =
m_frame->GetBoard()->GetEnabledLayers();
2728 bool areaValid =
true;
2729 bool hasCopper =
false;
2730 bool hasNonCopper =
false;
2732 std::map<PCB_LAYER_ID, SHAPE_POLY_SET> layerPolys;
2735 std::function<void(
EDA_ITEM* )> accumulateArea;
2756 LSET itemLayers = boardItem->GetLayerSet() & enabledLayers;
2760 boardItem->TransformShapeToPolySet( layerPolys[layer], layer, 0,
2763 if( enabledCopper.
Contains( layer ) )
2766 hasNonCopper =
true;
2771 static_cast<PAD*
>( aItem )->TransformHoleToPolygon( holes, 0,
ARC_LOW_DEF,
2778 int R =
via->GetDrillValue() / 2;
2788 accumulateArea( item );
2795 for(
auto& [layer, layerPoly] : layerPolys )
2798 if( enabledCopper.
Contains( layer ) )
2799 layerPoly.BooleanSubtract( holes );
2801 area += layerPoly.Area();
2807 if( hasCopper && !hasNonCopper )
2808 areaLabel =
_(
"Selected 2D Copper Area" );
2809 else if( !hasCopper && hasNonCopper )
2810 areaLabel =
_(
"Selected 2D Area" );
2812 areaLabel =
_(
"Selected 2D Total Area" );
2814 msgItems.emplace_back( areaLabel,
2824 m_frame->SetMsgPanel( msgItems );
2841 wxFileName fileName = wxFileName( *aEvent.
Parameter<wxString*>() );
2848 wxString filePath = fileName.GetFullPath();
2866 std::vector<BOARD_ITEM*> items;
2867 items.push_back(
table );
2870 commit.
Push(
_(
"Place Board Characteristics" ) );
2886 std::vector<BOARD_ITEM*> items;
2887 items.push_back(
table );
2890 commit.
Push(
_(
"Place Board Stackup Table" ) );
2902 m_frame->SetDisplayOptions( opts );
2912 static_cast<PCB_SHAPE*
>( aItem )->UpdateHatching();
2944 std::vector<const EMBEDDED_FILES*> stack;
2948 int embeddedCount = 0;
2952 bool fpModified =
false;
2963 wxFileName fname( fullPath );
2964 wxString ext = fname.GetExt().Upper();
2966 if( fname.Exists() )
2971 model.m_Filename = file->GetLink();
2976 if( ext ==
"WRL" || ext ==
"WRZ" )
2981 alts.Add( wxT(
"stp" ) );
2982 alts.Add( wxT(
"step" ) );
2983 alts.Add( wxT(
"STP" ) );
2984 alts.Add( wxT(
"STEP" ) );
2985 alts.Add( wxT(
"Stp" ) );
2986 alts.Add( wxT(
"Step" ) );
2987 alts.Add( wxT(
"stpz" ) );
2988 alts.Add( wxT(
"stpZ" ) );
2989 alts.Add( wxT(
"STPZ" ) );
2991 for(
const auto& alt : alts )
2993 wxFileName altFile( fname.GetPath(),
2994 fname.GetName() + wxT(
"." ) + alt );
2996 if( altFile.IsOk() && altFile.FileExists() )
3011 if( embeddedCount > 0 )
3013 commit.
Push(
_(
"Embed 3D Models" ) );
3014 wxString msg = wxString::Format(
_(
"%d 3D model(s) successfully embedded." ), embeddedCount );
3015 m_frame->GetInfoBar()->ShowMessageFor( msg, 5000 );
constexpr int ARC_LOW_DEF
std::set< BOARD_ITEM *, CompareByUuid > BOARD_ITEM_SET
Set of BOARD_ITEMs ordered by UUID.
PCB_TABLE * Build_Board_Characteristics_Table(BOARD *aBoard, EDA_UNITS aDisplayUnits)
@ NORMAL
Inactive layers are shown normally (no high-contrast mode)
@ HIDDEN
Inactive layers are hidden.
@ DIMMED
Inactive layers are dimmed (old high-contrast mode)
@ RATSNEST
Net/netclass colors are shown on ratsnest lines only.
@ ALL
Net/netclass colors are shown on all net copper.
@ OFF
Net (and netclass) colors are not shown.
@ VISIBLE
Ratsnest lines are drawn to items on visible layers only.
@ ALL
Ratsnest lines are drawn to items on all layers (default)
PCB_TABLE * Build_Board_Stackup_Table(BOARD *aBoard, EDA_UNITS aDisplayUnits)
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
static TOOL_ACTION addLibrary
static TOOL_ACTION pickerTool
static TOOL_ACTION gridResetOrigin
static TOOL_ACTION pasteSpecial
static TOOL_ACTION highContrastModeCycle
static TOOL_ACTION highContrastMode
static TOOL_ACTION deleteTool
static TOOL_ACTION selectionClear
Clear the current selection.
static TOOL_ACTION newLibrary
static TOOL_ACTION gridSetOrigin
static TOOL_ACTION ddAddLibrary
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
virtual void Push(const wxString &aMessage=wxEmptyString, int aCommitFlags=0) override
Execute the changes.
virtual void Revert() override
Revert the commit by restoring the modified items state.
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
NETINFO_ITEM * GetNet() const
Return #NET_INFO object for a given item.
void SetGridOrigin(const VECTOR2I &aOrigin)
BOARD_STACKUP & GetStackupDescriptor()
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual bool IsOnLayer(PCB_LAYER_ID aLayer) const
Test to see if this object is on the given layer.
virtual std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
FOOTPRINT * GetParentFootprint() const
virtual LSET GetLayerSet() const
Return a std::bitset of all layers on which the item physically resides.
virtual bool IsOnCopperLayer() const
virtual std::shared_ptr< SHAPE_SEGMENT > GetEffectiveHoleShape() const
virtual bool HasHole() const
bool SynchronizeWithBoard(BOARD_DESIGN_SETTINGS *aSettings)
Synchronize the BOARD_STACKUP_ITEM* list with the board.
Information pertinent to a Pcbnew printed circuit board.
INSPECT_RESULT Visit(INSPECTOR inspector, void *testData, const std::vector< KICAD_T > &scanTypes) override
May be re-implemented for each derived class in order to handle all the types given by its member dat...
EMBEDDED_FILES * GetEmbeddedFiles() override
void SetVisibleLayers(const LSET &aLayerMask)
A proxy function that calls the correspondent function in m_BoardSettings changes the bit-mask of vis...
void MapNets(BOARD *aDestBoard)
Map all nets in the given board to nets with the same name (if any) in the destination board.
const std::vector< BOARD_CONNECTED_ITEM * > AllConnectedItems()
const PAGE_INFO & GetPageSettings() const
void SetProperties(const std::map< wxString, wxString > &aProps)
const GROUPS & Groups() const
The groups must maintain the following invariants.
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
void SynchronizeNetsAndNetClasses(bool aResetTrackAndViaSizes)
Copy NETCLASS info to each NET, based on NET membership in a NETCLASS.
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
TITLE_BLOCK & GetTitleBlock()
int GetCopperLayerCount() const
const std::map< wxString, wxString > & GetProperties() const
const FOOTPRINTS & Footprints() const
void RemoveAll(std::initializer_list< KICAD_T > aTypes={ PCB_NETINFO_T, PCB_MARKER_T, PCB_GROUP_T, PCB_ZONE_T, PCB_GENERATOR_T, PCB_FOOTPRINT_T, PCB_TRACE_T, PCB_SHAPE_T })
An efficient way to remove all items of a certain type from the board.
const BOARD_ITEM_SET GetItemSet()
void SetPageSettings(const PAGE_INFO &aPageSettings)
void SetCopperLayerCount(int aCount)
bool IsLayerVisible(PCB_LAYER_ID aLayer) const
A proxy function that calls the correspondent function in m_BoardSettings tests whether a given layer...
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
void SetEnabledLayers(const LSET &aLayerMask)
A proxy function that calls the correspondent function in m_BoardSettings.
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
const DRAWINGS & Drawings() const
int GetCount() const
Return the number of objects in the list.
void Remove(int aIndex)
Remove the item at aIndex (first position is 0).
Color settings are a bit different than most of the settings objects in that there can be more than o...
void SetColor(int aLayer, const COLOR4D &aColor)
COLOR4D GetColor(int aLayer) const
COMMIT & Added(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Notify observers that aItem has been added.
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr, RECURSE_MODE aRecurse=RECURSE_MODE::NO_RECURSE)
Modify a given item in the model.
COMMIT & Add(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Add a new item to the model.
DO_NOT_SHOW_AGAIN m_DoNotShowAgain
void SelectLibId(const LIB_ID &aLibId)
LIB_ID GetSelectedLibId(int *aUnit=nullptr) const
DESIGN_BLOCK * GetDesignBlock(const LIB_ID &aLibId, bool aUseCacheLib, bool aShowErrorMsg)
Load design block from design block library table.
const LIB_ID & GetLibId() const
bool GetClearNets() const
MINOPTMAX< int > & Value()
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, INFOBAR_MESSAGE_TYPE aType=INFOBAR_MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
bool GetOverrideLocks() const
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
A set of EDA_ITEMs (i.e., without duplicates).
bool HasDesignBlockLink() const
void RemoveItem(EDA_ITEM *aItem)
Remove item from group.
A base class for most all the KiCad significant classes used in schematics and boards.
virtual void SetPosition(const VECTOR2I &aPos)
void SetFlags(EDA_ITEM_FLAGS aMask)
virtual wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const
Return a user-visible description string of this item.
virtual EDA_GROUP * GetParentGroup() const
KICAD_T Type() const
Returns the type of object.
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
virtual void SetParent(EDA_ITEM *aParent)
EMBEDDED_FILE * AddFile(const wxFileName &aName, bool aOverwrite)
Load a file from disk and adds it to the collection.
static const TOOL_EVENT ClearedEvent
static const TOOL_EVENT SelectedEvent
static const TOOL_EVENT SelectedItemsModified
Selected items were moved, this can be very high frequency on the canvas, use with care.
static const TOOL_EVENT PointSelectedEvent
static const TOOL_EVENT ContrastModeChangedByKeyEvent
static const TOOL_EVENT ConnectivityChangedEvent
Selected item had a property changed (except movement)
static const TOOL_EVENT UnselectedEvent
Provide an extensible class to resolve 3D model paths.
A general implementation of a COLLECTORS_GUIDE.
Used when the right click button is pressed, or when the select tool is in effect.
static const std::vector< KICAD_T > BoardLevelItems
A scan list for all primary board items, omitting items which are subordinate to a FOOTPRINT,...
static const std::vector< KICAD_T > AllBoardItems
A scan list for all editable board items.
void Collect(BOARD_ITEM *aItem, const std::vector< KICAD_T > &aScanList, const VECTOR2I &aRefPos, const COLLECTORS_GUIDE &aGuide)
Scan a BOARD_ITEM using this class's Inspector method, which does the collection.
static const std::vector< KICAD_T > FootprintItems
A scan list for primary footprint items.
void SetDialogSizeInDU(int aWidth, int aHeight)
Set the dialog size, using a "logical" value.
void AddHTML_Text(const wxString &message)
Add HTML text (without any change) to message list.
virtual void SetProgressReporter(PROGRESS_REPORTER *aReporter)
Set an optional progress reporter.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
void DoNotShowCheckbox(wxString file, int line)
Shows the 'do not show again' checkbox.
A color representation with 4 components: red, green, blue, alpha.
COLOR4D & Darken(double aFactor)
Makes the color darker by a given factor.
COLOR4D & Brighten(double aFactor)
Makes the color brighter by a given factor.
void SetGridOrigin(const VECTOR2D &aGridOrigin)
Set the origin point for the grid.
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
virtual void SetCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true, bool aTriggeredByArrows=false, long aArrowCommand=0)=0
Move cursor to the requested position expressed in world coordinates.
bool IsBOARD_ITEM() const
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1)
Add a VIEW_ITEM to the view.
virtual void Remove(VIEW_ITEM *aItem)
Remove a VIEW_ITEM from the view.
GAL * GetGAL() const
Return the GAL this view is using to draw graphical primitives.
void MarkDirty()
Force redraw of view on the next rendering.
All information about a layer pair as stored in the layer pair store.
Management class for layer pairs in a PCB.
std::vector< LAYER_PAIR_INFO > GetEnabledLayerPairs(int &aCurrentIndex) const
Get a vector of all enabled layer pairs, in order.
void SetCurrentLayerPair(const LAYER_PAIR &aPair)
Set the "active" layer pair.
A logical library item identifier and consists of various portions much like a URI.
bool IsValid() const
Check if this LID_ID is valid.
wxString GetUniStringLibId() const
const UTF8 & GetLibItemName() const
LSEQ is a sequence (and therefore also a set) of PCB_LAYER_IDs.
LSET is a set of PCB_LAYER_IDs.
static const LSET & AllCuMask()
return AllCuMask( MAX_CU_LAYERS );
LSEQ UIOrder() const
Return the copper, technical and user layers in the order shown in layer widget.
LSEQ CuStack() const
Return a sequence of copper layers in starting from the front/top and extending to the back/bottom.
static LSET AllCuMask(int aCuLayerCount)
Return a mask holding the requested number of Cu PCB_LAYER_IDs.
bool Contains(PCB_LAYER_ID aLayer) const
See if the layer set contains a PCB layer.
EDA_MSG_PANEL items for displaying messages.
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 ...
static NETINFO_ITEM * OrphanedItem()
NETINFO_ITEM meaning that there was no net assigned for an item, as there was no board storing net li...
static constexpr PCB_LAYER_ID ALL_LAYERS
! Temporary layer identifier to identify code that is not padstack-aware
static wxString ShowPadShape(PAD_SHAPE aShape)
bool HasHole() const override
Describe the page size and margins of a paper page on which to eventually print or plot.
static TOOL_ACTION layerToggle
static TOOL_ACTION layerInner12
static TOOL_ACTION nextFootprint
static TOOL_ACTION layerInner8
static TOOL_ACTION zoneDisplayToggle
static TOOL_ACTION previousFootprint
static TOOL_ACTION layerInner3
static TOOL_ACTION layerPrev
static TOOL_ACTION showRatsnest
static TOOL_ACTION zoneFillAll
static TOOL_ACTION layerInner2
static TOOL_ACTION magneticSnapAllLayers
static TOOL_ACTION collect3DModels
static TOOL_ACTION saveToLinkedDesignBlock
static TOOL_ACTION ddAppendBoard
Drag and drop.
static TOOL_ACTION layerInner25
static TOOL_ACTION magneticSnapActiveLayer
Snapping controls.
static TOOL_ACTION layerAlphaDec
static TOOL_ACTION zoneDisplayFilled
static TOOL_ACTION layerInner24
static TOOL_ACTION viaDisplayMode
static TOOL_ACTION layerInner29
static TOOL_ACTION placeCharacteristics
static TOOL_ACTION layerInner11
static TOOL_ACTION layerAlphaInc
static TOOL_ACTION layerPairPresetsCycle
static TOOL_ACTION layerInner16
static TOOL_ACTION layerInner26
static TOOL_ACTION layerInner18
static TOOL_ACTION layerInner14
static TOOL_ACTION trackDisplayMode
static TOOL_ACTION magneticSnapToggle
static TOOL_ACTION layerInner6
static TOOL_ACTION applyDesignBlockLayout
static TOOL_ACTION ddImportFootprint
static TOOL_ACTION zoneDisplayTriangulated
static TOOL_ACTION rehatchShapes
static TOOL_ACTION layerInner22
static TOOL_ACTION placeDesignBlock
static TOOL_ACTION layerInner5
static TOOL_ACTION zoneDisplayFractured
static TOOL_ACTION ratsnestModeCycle
static TOOL_ACTION layerInner20
static TOOL_ACTION layerInner7
static TOOL_ACTION layerInner27
static TOOL_ACTION loadFpFromBoard
static TOOL_ACTION appendBoard
static TOOL_ACTION netColorModeCycle
static TOOL_ACTION layerInner1
static TOOL_ACTION layerInner10
static TOOL_ACTION layerInner15
static TOOL_ACTION layerInner17
static TOOL_ACTION flipBoard
static TOOL_ACTION layerBottom
static TOOL_ACTION zoneDisplayOutline
static TOOL_ACTION ratsnestLineMode
static TOOL_ACTION layerInner19
static TOOL_ACTION layerInner9
static TOOL_ACTION move
move or drag an item
static TOOL_ACTION layerInner30
static TOOL_ACTION layerTop
static TOOL_ACTION updateDesignBlockFromSelection
static TOOL_ACTION layerInner4
static TOOL_ACTION layerInner13
static TOOL_ACTION layerInner21
static TOOL_ACTION saveFpToBoard
static TOOL_ACTION layerNext
static TOOL_ACTION placeLinkedDesignBlock
static TOOL_ACTION placeStackup
static TOOL_ACTION layerInner23
static TOOL_ACTION layerInner28
Common, abstract interface for edit frames.
void RestoreCopyFromUndoList(wxCommandEvent &aEvent)
Undo the last edit:
APPEARANCE_CONTROLS * GetAppearancePanel()
void RestoreCopyFromRedoList(wxCommandEvent &aEvent)
Redo the last edit:
void UpdateVertexEditorSelection(BOARD_ITEM *aItem)
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
const VECTOR2I GetPageSizeIU() const override
Works off of GetPageSettings() to return the size of the paper page in the internal units of this par...
void OnModify() override
Must be called after a change in order to set the "modify" flag and update other data structures and ...
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Return the BOARD_DESIGN_SETTINGS for the open project.
int RehatchShapes(const TOOL_EVENT &aEvent)
void setTransitions() override
< Sets up handlers for various events.
int AppendBoardFromFile(const TOOL_EVENT &aEvent)
int AddLibrary(const TOOL_EVENT &aEvent)
int DdAppendBoard(const TOOL_EVENT &aEvent)
int LoadFpFromBoard(const TOOL_EVENT &aEvent)
int SaveToLinkedDesignBlock(const TOOL_EVENT &aEvent)
int DdImportFootprint(const TOOL_EVENT &aEvent)
int SnapModeFeedback(const TOOL_EVENT &aEvent)
int NetColorModeCycle(const TOOL_EVENT &aEvent)
int SaveFpToBoard(const TOOL_EVENT &aEvent)
int RatsnestModeCycle(const TOOL_EVENT &aEvent)
int TrackDisplayMode(const TOOL_EVENT &aEvent)
int DdAddLibrary(const TOOL_EVENT &aEvent)
int Redo(const TOOL_EVENT &aEvent)
int PlaceLinkedDesignBlock(const TOOL_EVENT &aEvent)
bool placeBoardItems(BOARD_COMMIT *aCommit, std::vector< BOARD_ITEM * > &aItems, bool aIsNew, bool aAnchorAtOrigin, bool aReannotateDuplicates, bool aSkipMove)
Add and select or just select for move/place command a list of board items.
int LayerPresetFeedback(const TOOL_EVENT &aEvent)
int UpdateMessagePanel(const TOOL_EVENT &aEvent)
int LayerAlphaDec(const TOOL_EVENT &aEvent)
int LayerNext(const TOOL_EVENT &aEvent)
int PlaceStackup(const TOOL_EVENT &aEvent)
std::unique_ptr< STATUS_TEXT_POPUP > m_statusPopup
int ToggleRatsnest(const TOOL_EVENT &aEvent)
int LayerAlphaInc(const TOOL_EVENT &aEvent)
int HighContrastModeCycle(const TOOL_EVENT &aEvent)
std::unique_ptr< KIGFX::ORIGIN_VIEWITEM > m_gridOrigin
int HighContrastMode(const TOOL_EVENT &aEvent)
int Undo(const TOOL_EVENT &aEvent)
int ViaDisplayMode(const TOOL_EVENT &aEvent)
static void DoSetGridOrigin(KIGFX::VIEW *aView, PCB_BASE_FRAME *aFrame, EDA_ITEM *originViewItem, const VECTOR2D &aPoint)
int CollectAndEmbed3DModels(const TOOL_EVENT &aEvent)
void pruneItemLayers(std::vector< BOARD_ITEM * > &aItems)
Helper for pasting.
int GridPlaceOrigin(const TOOL_EVENT &aEvent)
int FlipPcbView(const TOOL_EVENT &aEvent)
int PlaceCharacteristics(const TOOL_EVENT &aEvent)
int ApplyDesignBlockLayout(const TOOL_EVENT &aEvent)
int SnapMode(const TOOL_EVENT &aEvent)
int ContrastModeFeedback(const TOOL_EVENT &aEvent)
int LayerToggle(const TOOL_EVENT &aEvent)
int AppendBoard(PCB_IO &pi, const wxString &fileName, DESIGN_BLOCK *aDesignBlock=nullptr, BOARD_COMMIT *aCommit=nullptr, bool aSkipMove=false)
void Reset(RESET_REASON aReason) override
Bring the tool to a known, initial state.
int IterateFootprint(const TOOL_EVENT &aEvent)
int Print(const TOOL_EVENT &aEvent)
void rehatchBoardItem(BOARD_ITEM *aItem)
int ZoneDisplayMode(const TOOL_EVENT &aEvent)
int GridResetOrigin(const TOOL_EVENT &aEvent)
BOARD_ITEM * m_pickerItem
int InteractiveDelete(const TOOL_EVENT &aEvent)
int AppendDesignBlock(const TOOL_EVENT &aEvent)
int LayerPrev(const TOOL_EVENT &aEvent)
int CycleLayerPresets(const TOOL_EVENT &aEvent)
int Paste(const TOOL_EVENT &aEvent)
void unfilledZoneCheck()
We have bug reports indicating that some new users confuse zone filling/unfilling with the display mo...
int LayerSwitch(const TOOL_EVENT &aEvent)
bool m_FlipBoardView
true if the board is flipped to show the mirrored view
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
NET_COLOR_MODE m_NetColorMode
How to use color overrides on specific nets and netclasses.
ZONE_DISPLAY_MODE m_ZoneDisplayMode
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
The main frame for Pcbnew.
PCB_DESIGN_BLOCK_PANE * GetDesignBlockPane() const
static const TOOL_EVENT & SnappingModeChangedByKeyEvent()
Hotkey feedback.
static const TOOL_EVENT & LayerPairPresetChangedByKeyEvent()
A set of BOARD_ITEMs (i.e., without duplicates).
PCB_FILE_T
The set of file types that the PCB_IO_MGR knows about, and for which there has been a plugin written,...
@ KICAD_SEXP
S-expression Pcbnew file format.
static PCB_IO * FindPlugin(PCB_FILE_T aFileType)
Return a #PLUGIN which the caller can use to import, export, save, or load design documents.
static PCB_FILE_T FindPluginTypeFromBoardPath(const wxString &aFileName, int aCtl=0)
Return a plugin type given a path for a board file.
A base class that BOARD loading and saving plugins should derive from.
virtual void SetQueryUserCallback(std::function< bool(wxString aTitle, int aIcon, wxString aMessage, wxString aAction)> aCallback)
Registers a KIDIALOG callback for collecting info from the user.
virtual BOARD * LoadBoard(const wxString &aFileName, BOARD *aAppendToMe, const std::map< std::string, UTF8 > *aProperties=nullptr, PROJECT *aProject=nullptr)
Load information from some input file format that this PCB_IO implementation knows about into either ...
Class that manages the presentation of PCB layers in a PCB frame.
wxString getLayerPairName(const LAYER_PAIR &aPair) const
PCB_LAYER_ID m_Route_Layer_TOP
PCB_LAYER_ID m_Route_Layer_BOTTOM
const VECTOR2I & GetStart() const
const VECTOR2I & GetEnd() const
virtual COMMON_SETTINGS * GetCommonSettings() const
static S3D_CACHE * Get3DCacheManager(PROJECT *aProject, bool updateProjDir=false)
Return a pointer to an instance of the 3D cache manager.
Container for project specific data.
virtual const wxString GetProjectPath() const
Return the full path of the project.
Cache for storing the 3D shapes.
FILENAME_RESOLVER * GetResolver() noexcept
ecoord SquaredDistance(const SEG &aSeg) const
VECTOR2I::extended_type ecoord
virtual void Add(EDA_ITEM *aItem)
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.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
virtual VECTOR2I Centre() const
Compute a center-of-mass of the shape.
Hold the information shown in the lower right corner of a plot, printout, or editing view.
static constexpr extended_type ECOORD_MAX
A modified version of the wxInfoBar class that allows us to:
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
void AddButton(wxButton *aButton)
Add an already created button to the infobar.
Multi-thread safe progress reporter dialog, intended for use of tasks that parallel reporting back of...
Handle a list of polygons defining a copper zone.
void SetDoNotAllowPads(bool aEnable)
void AddPolygon(std::vector< VECTOR2I > &aPolygon)
Add a polygon to the zone outline.
void SetPlacementAreaSource(const wxString &aSource)
void SetPlacementAreaSourceType(PLACEMENT_SOURCE_T aType)
SHAPE_POLY_SET * Outline()
void SetHatchStyle(ZONE_BORDER_DISPLAY_STYLE aStyle)
void SetIsRuleArea(bool aEnable)
void SetDoNotAllowTracks(bool aEnable)
void SetLayerSet(const LSET &aLayerSet) override
void SetDoNotAllowVias(bool aEnable)
void SetDoNotAllowFootprints(bool aEnable)
void SetDoNotAllowZoneFills(bool aEnable)
void SetZoneName(const wxString &aName)
void SetPlacementAreaEnabled(bool aEnabled)
std::unique_ptr< wxBitmap > GetImageFromClipboard()
Get image data from the clipboard, if there is any.
std::string GetClipboardUTF8()
Return the information currently stored in the system clipboard.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
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 BuildConvexHull(std::vector< VECTOR2I > &aResult, const std::vector< VECTOR2I > &aPoly)
Calculate the convex hull of a list of points in counter-clockwise order.
@ DIFF_PAIR_GAP_CONSTRAINT
@ EDGE_CLEARANCE_CONSTRAINT
@ MAX_UNCOUPLED_CONSTRAINT
@ HOLE_CLEARANCE_CONSTRAINT
Declaration of the eda_3d_viewer class.
#define IS_NEW
New item, just created.
#define MCT_SKIP_STRUCT
flag used by the multichannel tool to mark items that should be skipped
#define SKIP_STRUCT
flag indicating that the structure should be ignored
static FILENAME_RESOLVER * resolver
static const std::string KiCadUriPrefix
wxString KeyNameFromKeyCode(int aKeycode, bool *aIsFound)
Return the key name from the key code.
std::unique_ptr< T > IO_RELEASER
Helper to hold and release an IO_BASE object when exceptions are thrown.
#define KICTL_KICAD_ONLY
chosen file is from KiCad according to user
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.
PCB_LAYER_ID
A quick note on layer IDs:
#define ZONE_LAYER_FOR(boardLayer)
std::optional< wxString > GetMsgPanelDisplayUuid(const KIID &aKiid)
Get a formatted UUID string for display in the message panel, according to the current advanced confi...
SHAPE_LINE_CHAIN RectifyPolygon(const SHAPE_LINE_CHAIN &aPoly)
void CollectBoxCorners(const BOX2I &aBox, std::vector< VECTOR2I > &aCorners)
Add the 4 corners of a BOX2I to a vector.
@ REPAINT
Item needs to be redrawn.
constexpr char APPEND_PRESERVE_DESTINATION_STACKUP[]
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
bool AskLoadBoardFileName(PCB_EDIT_FRAME *aParent, wxString *aFileName, int aCtl=0)
Show a wxFileDialog asking for a BOARD filename to open.
PCB_TABLE * Build_Board_Characteristics_Table(BOARD *aBoard, EDA_UNITS aDisplayUnits)
PCB_TABLE * Build_Board_Stackup_Table(BOARD *aBoard, EDA_UNITS aDisplayUnits)
static void pasteFootprintItemsToFootprintEditor(FOOTPRINT *aClipFootprint, BOARD *aBoard, std::vector< BOARD_ITEM * > &aPastedItems)
Class to handle a set of BOARD_ITEMs.
bool AskLoadBoardFileName(PCB_EDIT_FRAME *aParent, wxString *aFileName, int aCtl=0)
Show a wxFileDialog asking for a BOARD filename to open.
PGM_BASE & Pgm()
The global program "get" accessor.
#define HITTEST_THRESHOLD_PIXELS
std::vector< EDA_ITEM * > EDA_ITEMS
Utility functions for working with shapes.
std::vector< FAB_LAYER_COLOR > dummy
wxString UnescapeString(const wxString &aSource)
RATSNEST_MODE m_RatsnestMode
bool m_ShowGlobalRatsnest
std::unordered_set< EDA_ITEM * > m_designBlockItems
PLACEMENT_SOURCE_T m_sourceType
std::set< FOOTPRINT * > m_components
std::vector< std::vector< std::string > > table
wxString result
Test unit parsing edge cases and error handling.
constexpr KICAD_T BaseType(const KICAD_T aType)
Return the underlying type of the given type.
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
@ PCB_GENERATOR_T
class PCB_GENERATOR, generator on a layer
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
@ NOT_USED
the 3d code uses this value
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
@ PCB_TABLECELL_T
class PCB_TABLECELL, PCB_TEXTBOX for use in tables
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
@ 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_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
@ PCB_TABLE_T
class PCB_TABLE, table of PCB_TABLECELLs
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D
Definition of file extensions used in Kicad.