You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

572 lines
18 KiB

2 years ago
3 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. /*
  2. * This program source code file is part of KiCad, a free EDA CAD application.
  3. *
  4. * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version 2
  9. * of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, you may find one here:
  18. * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
  19. * or you may search the http://www.gnu.org website for the version 2 license,
  20. * or you may write to the Free Software Foundation, Inc.,
  21. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
  22. */
  23. #include <pcb_edit_frame.h>
  24. #include <board_design_settings.h>
  25. #include <bitmaps.h>
  26. #include <widgets/wx_grid.h>
  27. #include <widgets/std_bitmap_button.h>
  28. #include <grid_tricks.h>
  29. #include <panel_setup_tracks_and_vias.h>
  30. enum TRACK_VAR_GRID_COLUMNS
  31. {
  32. TR_WIDTH_COL = 0
  33. };
  34. enum VIA_VAR_GRID_COLUMNS
  35. {
  36. VIA_SIZE_COL = 0,
  37. VIA_DRILL_COL
  38. };
  39. enum DIFF_VAR_GRID_COLUMNS
  40. {
  41. DP_WIDTH_COL = 0,
  42. DP_GAP_COL,
  43. DP_VIA_GAP_COL
  44. };
  45. PANEL_SETUP_TRACKS_AND_VIAS::PANEL_SETUP_TRACKS_AND_VIAS( wxWindow* aParentWindow,
  46. PCB_EDIT_FRAME* aFrame ) :
  47. PANEL_SETUP_TRACKS_AND_VIAS_BASE( aParentWindow )
  48. {
  49. m_Frame = aFrame;
  50. m_Pcb = m_Frame->GetBoard();
  51. m_BrdSettings = &m_Pcb->GetDesignSettings();
  52. m_trackWidthsAddButton->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
  53. m_trackWidthsSortButton->SetBitmap( KiBitmapBundle( BITMAPS::small_sort_desc ) );
  54. m_trackWidthsRemoveButton->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
  55. m_viaSizesAddButton->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
  56. m_viaSizesSortButton->SetBitmap( KiBitmapBundle( BITMAPS::small_sort_desc ) );
  57. m_viaSizesRemoveButton->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
  58. m_diffPairsAddButton->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
  59. m_diffPairsSortButton->SetBitmap( KiBitmapBundle( BITMAPS::small_sort_desc ) );
  60. m_diffPairsRemoveButton->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
  61. m_trackWidthsGrid->PushEventHandler( new GRID_TRICKS( m_trackWidthsGrid,
  62. [this]( wxCommandEvent& aEvent )
  63. {
  64. OnAddTrackWidthsClick( aEvent );
  65. } ) );
  66. m_viaSizesGrid->PushEventHandler( new GRID_TRICKS( m_viaSizesGrid,
  67. [this]( wxCommandEvent& aEvent )
  68. {
  69. OnAddViaSizesClick( aEvent );
  70. } ) );
  71. m_diffPairsGrid->PushEventHandler( new GRID_TRICKS( m_diffPairsGrid,
  72. [this]( wxCommandEvent& aEvent )
  73. {
  74. OnAddDiffPairsClick( aEvent );
  75. } ) );
  76. m_trackWidthsGrid->SetSelectionMode( wxGrid::wxGridSelectionModes::wxGridSelectRows );
  77. m_viaSizesGrid->SetSelectionMode( wxGrid::wxGridSelectionModes::wxGridSelectRows );
  78. m_diffPairsGrid->SetSelectionMode( wxGrid::wxGridSelectionModes::wxGridSelectRows );
  79. m_trackWidthsGrid->SetUnitsProvider( m_Frame );
  80. m_viaSizesGrid->SetUnitsProvider( m_Frame );
  81. m_diffPairsGrid->SetUnitsProvider( m_Frame );
  82. m_trackWidthsGrid->SetAutoEvalCols( { 0 } );
  83. m_viaSizesGrid->SetAutoEvalCols( { 0, 1 } );
  84. m_diffPairsGrid->SetAutoEvalCols( { 0, 1, 2 } );
  85. m_trackWidthsGrid->SetUseNativeColLabels();
  86. m_viaSizesGrid->SetUseNativeColLabels();
  87. m_diffPairsGrid->SetUseNativeColLabels();
  88. // Ensure width of columns is enough to enter any reasonable value
  89. WX_GRID* grid_list[] = { m_trackWidthsGrid, m_viaSizesGrid, m_diffPairsGrid, nullptr };
  90. int min_linesize = m_trackWidthsGrid->GetTextExtent( wxT( "000.000000 mm " ) ).x;
  91. for( int ii = 0; grid_list[ii]; ii++ )
  92. {
  93. WX_GRID* curr_grid = grid_list[ii];
  94. for( int col = 0; col < curr_grid->GetNumberCols(); col++ )
  95. {
  96. int min_w = curr_grid->GetVisibleWidth( col, true, true, true );
  97. int best_w = std::max( min_linesize, min_w );
  98. curr_grid->SetColMinimalWidth( col, best_w );
  99. curr_grid->SetColSize( col,best_w );
  100. }
  101. }
  102. m_Frame->Bind( EDA_EVT_UNITS_CHANGED, &PANEL_SETUP_TRACKS_AND_VIAS::onUnitsChanged, this );
  103. }
  104. PANEL_SETUP_TRACKS_AND_VIAS::~PANEL_SETUP_TRACKS_AND_VIAS()
  105. {
  106. // Delete the GRID_TRICKS.
  107. m_trackWidthsGrid->PopEventHandler( true );
  108. m_viaSizesGrid->PopEventHandler( true );
  109. m_diffPairsGrid->PopEventHandler( true );
  110. m_Frame->Unbind( EDA_EVT_UNITS_CHANGED, &PANEL_SETUP_TRACKS_AND_VIAS::onUnitsChanged, this );
  111. }
  112. void PANEL_SETUP_TRACKS_AND_VIAS::OnSortTrackWidthsClick( wxCommandEvent& aEvent )
  113. {
  114. std::vector<int> trackWidths;
  115. wxString msg;
  116. m_trackWidthsGrid->ClearSelection();
  117. wxSafeYield();
  118. wxGridUpdateLocker lock( m_trackWidthsGrid );
  119. for( int row = 0; row < m_trackWidthsGrid->GetNumberRows(); ++row )
  120. {
  121. msg = m_trackWidthsGrid->GetCellValue( row, TR_WIDTH_COL );
  122. if( !msg.IsEmpty() )
  123. trackWidths.push_back( m_Frame->ValueFromString( msg ) );
  124. }
  125. std::sort( trackWidths.begin(), trackWidths.end() );
  126. m_trackWidthsGrid->DeleteRows( 0, m_trackWidthsGrid->GetNumberRows(), false );
  127. for( int width : trackWidths )
  128. AppendTrackWidth( width );
  129. }
  130. void PANEL_SETUP_TRACKS_AND_VIAS::OnSortViaSizesClick( wxCommandEvent& aEvent )
  131. {
  132. std::vector<VIA_DIMENSION> vias;
  133. wxString msg;
  134. m_trackWidthsGrid->ClearSelection();
  135. wxSafeYield();
  136. wxGridUpdateLocker lock( m_viaSizesGrid );
  137. for( int row = 0; row < m_viaSizesGrid->GetNumberRows(); ++row )
  138. {
  139. msg = m_viaSizesGrid->GetCellValue( row, VIA_SIZE_COL );
  140. if( !msg.IsEmpty() )
  141. {
  142. VIA_DIMENSION via_dim;
  143. via_dim.m_Diameter = m_Frame->ValueFromString( msg );
  144. msg = m_viaSizesGrid->GetCellValue( row, VIA_DRILL_COL );
  145. if( !msg.IsEmpty() )
  146. via_dim.m_Drill = m_Frame->ValueFromString( msg );
  147. vias.push_back( via_dim );
  148. }
  149. }
  150. std::sort( vias.begin(), vias.end() );
  151. m_viaSizesGrid->DeleteRows( 0, m_viaSizesGrid->GetNumberRows(), false );
  152. for( const VIA_DIMENSION& via : vias )
  153. AppendViaSize( via.m_Diameter, via.m_Drill );
  154. }
  155. void PANEL_SETUP_TRACKS_AND_VIAS::OnSortDiffPairsClick( wxCommandEvent& aEvent )
  156. {
  157. wxString msg;
  158. std::vector<DIFF_PAIR_DIMENSION> diffPairs;
  159. m_trackWidthsGrid->ClearSelection();
  160. wxSafeYield();
  161. wxGridUpdateLocker lock( m_diffPairsGrid );
  162. for( int row = 0; row < m_diffPairsGrid->GetNumberRows(); ++row )
  163. {
  164. msg = m_diffPairsGrid->GetCellValue( row, DP_WIDTH_COL );
  165. if( !msg.IsEmpty() )
  166. {
  167. DIFF_PAIR_DIMENSION diffPair_dim;
  168. diffPair_dim.m_Width = m_Frame->ValueFromString( msg );
  169. msg = m_diffPairsGrid->GetCellValue( row, DP_GAP_COL );
  170. diffPair_dim.m_Gap = m_Frame->ValueFromString( msg );
  171. msg = m_diffPairsGrid->GetCellValue( row, DP_VIA_GAP_COL );
  172. if( !msg.IsEmpty() )
  173. diffPair_dim.m_ViaGap = m_Frame->ValueFromString( msg );
  174. diffPairs.push_back( diffPair_dim );
  175. }
  176. }
  177. std::sort( diffPairs.begin(), diffPairs.end() );
  178. m_diffPairsGrid->DeleteRows( 0, m_diffPairsGrid->GetNumberRows(), false );
  179. for( const DIFF_PAIR_DIMENSION& dp : diffPairs )
  180. AppendDiffPairs( dp.m_Width, dp.m_Gap, dp.m_ViaGap );
  181. }
  182. void PANEL_SETUP_TRACKS_AND_VIAS::onUnitsChanged( wxCommandEvent& aEvent )
  183. {
  184. BOARD_DESIGN_SETTINGS tempBDS( nullptr, "dummy" );
  185. BOARD_DESIGN_SETTINGS* saveBDS = m_BrdSettings;
  186. m_BrdSettings = &tempBDS; // No, address of stack var does not escape function
  187. TransferDataFromWindow();
  188. TransferDataToWindow();
  189. m_BrdSettings = saveBDS;
  190. aEvent.Skip();
  191. }
  192. bool PANEL_SETUP_TRACKS_AND_VIAS::TransferDataToWindow()
  193. {
  194. m_trackWidthsGrid->ClearRows();
  195. m_viaSizesGrid->ClearRows();
  196. m_diffPairsGrid->ClearRows();
  197. // Skip the first item, which is the current netclass value
  198. for( unsigned ii = 1; ii < m_BrdSettings->m_TrackWidthList.size(); ii++ )
  199. {
  200. AppendTrackWidth( m_BrdSettings->m_TrackWidthList[ii] );
  201. }
  202. // Skip the first item, which is the current netclass value
  203. for( unsigned ii = 1; ii < m_BrdSettings->m_ViasDimensionsList.size(); ii++ )
  204. {
  205. AppendViaSize( m_BrdSettings->m_ViasDimensionsList[ii].m_Diameter,
  206. m_BrdSettings->m_ViasDimensionsList[ii].m_Drill );
  207. }
  208. // Skip the first item, which is the current netclass value
  209. for( unsigned ii = 1; ii < m_BrdSettings->m_DiffPairDimensionsList.size(); ii++ )
  210. {
  211. AppendDiffPairs( m_BrdSettings->m_DiffPairDimensionsList[ii].m_Width,
  212. m_BrdSettings->m_DiffPairDimensionsList[ii].m_Gap,
  213. m_BrdSettings->m_DiffPairDimensionsList[ii].m_ViaGap );
  214. }
  215. return true;
  216. }
  217. bool PANEL_SETUP_TRACKS_AND_VIAS::TransferDataFromWindow()
  218. {
  219. if( !m_trackWidthsGrid->CommitPendingChanges()
  220. || !m_viaSizesGrid->CommitPendingChanges()
  221. || !m_diffPairsGrid->CommitPendingChanges() )
  222. {
  223. return false;
  224. }
  225. std::vector<int> trackWidths;
  226. std::vector<VIA_DIMENSION> vias;
  227. std::vector<DIFF_PAIR_DIMENSION> diffPairs;
  228. // Test ONLY for malformed data. Design rules and constraints are the business of DRC.
  229. for( int row = 0; row < m_trackWidthsGrid->GetNumberRows(); ++row )
  230. {
  231. if( !m_trackWidthsGrid->GetCellValue( row, TR_WIDTH_COL ).IsEmpty() )
  232. trackWidths.push_back( m_trackWidthsGrid->GetUnitValue( row, TR_WIDTH_COL ) );
  233. }
  234. for( int row = 0; row < m_viaSizesGrid->GetNumberRows(); ++row )
  235. {
  236. if( !m_viaSizesGrid->GetCellValue( row, VIA_SIZE_COL ).IsEmpty() )
  237. {
  238. VIA_DIMENSION via_dim;
  239. via_dim.m_Diameter = m_viaSizesGrid->GetUnitValue( row, VIA_SIZE_COL );
  240. if( !m_viaSizesGrid->GetCellValue( row, VIA_DRILL_COL ).IsEmpty() )
  241. via_dim.m_Drill = m_viaSizesGrid->GetUnitValue( row, VIA_DRILL_COL );
  242. vias.push_back( via_dim );
  243. }
  244. }
  245. for( int row = 0; row < m_diffPairsGrid->GetNumberRows(); ++row )
  246. {
  247. if( !m_diffPairsGrid->GetCellValue( row, DP_WIDTH_COL ).IsEmpty() )
  248. {
  249. DIFF_PAIR_DIMENSION diffPair_dim;
  250. diffPair_dim.m_Width = m_diffPairsGrid->GetUnitValue( row, DP_WIDTH_COL );
  251. if( !m_diffPairsGrid->GetCellValue( row, DP_GAP_COL ).IsEmpty() )
  252. diffPair_dim.m_Gap = m_diffPairsGrid->GetUnitValue( row, DP_GAP_COL );
  253. if( !m_diffPairsGrid->GetCellValue( row, DP_VIA_GAP_COL ).IsEmpty() )
  254. diffPair_dim.m_ViaGap = m_diffPairsGrid->GetUnitValue( row, DP_VIA_GAP_COL );
  255. diffPairs.push_back( diffPair_dim );
  256. }
  257. }
  258. // Sort lists by increasing value
  259. sort( trackWidths.begin(), trackWidths.end() );
  260. sort( vias.begin(), vias.end() );
  261. sort( diffPairs.begin(), diffPairs.end() );
  262. // These are all stored in project file, not board, so no need for OnModify()
  263. trackWidths.insert( trackWidths.begin(), 0 ); // dummy value for "use netclass"
  264. m_BrdSettings->m_TrackWidthList = trackWidths;
  265. vias.insert( vias.begin(), { 0, 0 } ); // dummy value for "use netclass"
  266. m_BrdSettings->m_ViasDimensionsList = vias;
  267. diffPairs.insert( diffPairs.begin(), { 0, 0, 0 } ); // dummy value for "use netclass"
  268. m_BrdSettings->m_DiffPairDimensionsList = diffPairs;
  269. return true;
  270. }
  271. bool PANEL_SETUP_TRACKS_AND_VIAS::Validate()
  272. {
  273. if( !m_trackWidthsGrid->CommitPendingChanges()
  274. || !m_viaSizesGrid->CommitPendingChanges()
  275. || !m_diffPairsGrid->CommitPendingChanges() )
  276. {
  277. return false;
  278. }
  279. wxString msg;
  280. // Test vias
  281. for( int row = 0; row < m_viaSizesGrid->GetNumberRows(); ++row )
  282. {
  283. wxString viaDia = m_viaSizesGrid->GetCellValue( row, VIA_SIZE_COL );
  284. wxString viaDrill = m_viaSizesGrid->GetCellValue( row, VIA_DRILL_COL );
  285. if( !viaDia.IsEmpty() && viaDrill.IsEmpty() )
  286. {
  287. msg = _( "No via hole size defined." );
  288. PAGED_DIALOG::GetDialog( this )->SetError( msg, this, m_viaSizesGrid, row, VIA_DRILL_COL );
  289. return false;
  290. }
  291. }
  292. // Test diff pairs
  293. for( int row = 0; row < m_diffPairsGrid->GetNumberRows(); ++row )
  294. {
  295. wxString dpWidth = m_diffPairsGrid->GetCellValue( row, 0 );
  296. wxString dpGap = m_diffPairsGrid->GetCellValue( row, 1 );
  297. if( !dpWidth.IsEmpty() && dpGap.IsEmpty() )
  298. {
  299. msg = _( "No differential pair gap defined." );
  300. PAGED_DIALOG::GetDialog( this )->SetError( msg, this, m_diffPairsGrid, row, 1 );
  301. return false;
  302. }
  303. }
  304. return true;
  305. }
  306. void PANEL_SETUP_TRACKS_AND_VIAS::AppendTrackWidth( const int aWidth )
  307. {
  308. int i = m_trackWidthsGrid->GetNumberRows();
  309. m_trackWidthsGrid->AppendRows( 1 );
  310. m_trackWidthsGrid->SetUnitValue( i, TR_WIDTH_COL, aWidth );
  311. }
  312. void PANEL_SETUP_TRACKS_AND_VIAS::AppendViaSize( int aSize, int aDrill )
  313. {
  314. int i = m_viaSizesGrid->GetNumberRows();
  315. m_viaSizesGrid->AppendRows( 1 );
  316. m_viaSizesGrid->SetUnitValue( i, VIA_SIZE_COL, aSize );
  317. if( aDrill > 0 )
  318. m_viaSizesGrid->SetUnitValue( i, VIA_DRILL_COL, aDrill );
  319. }
  320. void PANEL_SETUP_TRACKS_AND_VIAS::AppendDiffPairs( int aWidth, int aGap, int aViaGap )
  321. {
  322. int i = m_diffPairsGrid->GetNumberRows();
  323. m_diffPairsGrid->AppendRows( 1 );
  324. m_diffPairsGrid->SetUnitValue( i, DP_WIDTH_COL, aWidth );
  325. if( aGap > 0 )
  326. m_diffPairsGrid->SetUnitValue( i, DP_GAP_COL, aGap );
  327. if( aViaGap > 0 )
  328. m_diffPairsGrid->SetUnitValue( i, DP_VIA_GAP_COL, aViaGap );
  329. }
  330. void removeSelectedRows( WX_GRID* aGrid )
  331. {
  332. wxArrayInt selectedRows = aGrid->GetSelectedRows();
  333. int curRow = aGrid->GetGridCursorRow();
  334. if( selectedRows.empty() && curRow >= 0 && curRow < aGrid->GetNumberRows() )
  335. selectedRows.Add( curRow );
  336. for( int ii = (int) selectedRows.Count() - 1; ii >= 0; --ii )
  337. {
  338. int row = selectedRows.Item( ii );
  339. aGrid->DeleteRows( row, 1 );
  340. curRow = std::min( curRow, row );
  341. }
  342. curRow = std::max( 0, curRow - 1 );
  343. aGrid->MakeCellVisible( curRow, aGrid->GetGridCursorCol() );
  344. aGrid->SetGridCursor( curRow, aGrid->GetGridCursorCol() );
  345. }
  346. void PANEL_SETUP_TRACKS_AND_VIAS::OnAddTrackWidthsClick( wxCommandEvent& aEvent )
  347. {
  348. if( !m_trackWidthsGrid->CommitPendingChanges()
  349. || !m_viaSizesGrid->CommitPendingChanges()
  350. || !m_diffPairsGrid->CommitPendingChanges() )
  351. {
  352. return;
  353. }
  354. AppendTrackWidth( 0 );
  355. m_trackWidthsGrid->MakeCellVisible( m_trackWidthsGrid->GetNumberRows() - 1, TR_WIDTH_COL );
  356. m_trackWidthsGrid->SetGridCursor( m_trackWidthsGrid->GetNumberRows() - 1, TR_WIDTH_COL );
  357. m_trackWidthsGrid->EnableCellEditControl( true );
  358. m_trackWidthsGrid->ShowCellEditControl();
  359. }
  360. void PANEL_SETUP_TRACKS_AND_VIAS::OnRemoveTrackWidthsClick( wxCommandEvent& event )
  361. {
  362. if( !m_trackWidthsGrid->CommitPendingChanges()
  363. || !m_viaSizesGrid->CommitPendingChanges()
  364. || !m_diffPairsGrid->CommitPendingChanges() )
  365. {
  366. return;
  367. }
  368. removeSelectedRows( m_trackWidthsGrid );
  369. }
  370. void PANEL_SETUP_TRACKS_AND_VIAS::OnAddViaSizesClick( wxCommandEvent& event )
  371. {
  372. if( !m_trackWidthsGrid->CommitPendingChanges()
  373. || !m_viaSizesGrid->CommitPendingChanges()
  374. || !m_diffPairsGrid->CommitPendingChanges() )
  375. {
  376. return;
  377. }
  378. AppendViaSize( 0, 0 );
  379. m_viaSizesGrid->MakeCellVisible( m_viaSizesGrid->GetNumberRows() - 1, VIA_SIZE_COL );
  380. m_viaSizesGrid->SetGridCursor( m_viaSizesGrid->GetNumberRows() - 1, VIA_SIZE_COL );
  381. m_viaSizesGrid->EnableCellEditControl( true );
  382. m_viaSizesGrid->ShowCellEditControl();
  383. }
  384. void PANEL_SETUP_TRACKS_AND_VIAS::OnRemoveViaSizesClick( wxCommandEvent& event )
  385. {
  386. if( !m_trackWidthsGrid->CommitPendingChanges()
  387. || !m_viaSizesGrid->CommitPendingChanges()
  388. || !m_diffPairsGrid->CommitPendingChanges() )
  389. {
  390. return;
  391. }
  392. removeSelectedRows( m_viaSizesGrid );
  393. }
  394. void PANEL_SETUP_TRACKS_AND_VIAS::OnAddDiffPairsClick( wxCommandEvent& event )
  395. {
  396. if( !m_trackWidthsGrid->CommitPendingChanges()
  397. || !m_viaSizesGrid->CommitPendingChanges()
  398. || !m_diffPairsGrid->CommitPendingChanges() )
  399. {
  400. return;
  401. }
  402. AppendDiffPairs( 0, 0, 0 );
  403. m_diffPairsGrid->MakeCellVisible( m_diffPairsGrid->GetNumberRows() - 1, DP_WIDTH_COL );
  404. m_diffPairsGrid->SetGridCursor( m_diffPairsGrid->GetNumberRows() - 1, DP_WIDTH_COL );
  405. m_diffPairsGrid->EnableCellEditControl( true );
  406. m_diffPairsGrid->ShowCellEditControl();
  407. }
  408. void PANEL_SETUP_TRACKS_AND_VIAS::OnRemoveDiffPairsClick( wxCommandEvent& event )
  409. {
  410. if( !m_trackWidthsGrid->CommitPendingChanges()
  411. || !m_viaSizesGrid->CommitPendingChanges()
  412. || !m_diffPairsGrid->CommitPendingChanges() )
  413. {
  414. return;
  415. }
  416. removeSelectedRows( m_diffPairsGrid );
  417. }
  418. void PANEL_SETUP_TRACKS_AND_VIAS::ImportSettingsFrom( BOARD* aBoard )
  419. {
  420. m_trackWidthsGrid->CommitPendingChanges( true );
  421. m_viaSizesGrid->CommitPendingChanges( true );
  422. m_diffPairsGrid->CommitPendingChanges( true );
  423. // Note: do not change the board, as we need to get the current nets from it for
  424. // netclass memberships. All the netclass definitions and dimension lists are in
  425. // the BOARD_DESIGN_SETTINGS.
  426. BOARD_DESIGN_SETTINGS* savedSettings = m_BrdSettings;
  427. m_BrdSettings = &aBoard->GetDesignSettings();
  428. TransferDataToWindow();
  429. m_BrdSettings = savedSettings;
  430. }