From 683921f98d99de2afaa0160465ffd965d9157aaf Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Thu, 24 Nov 2011 20:57:41 +0100 Subject: [PATCH] Eeschema: fix crash in intermediate netlist generation when a component has no pins (like logos or images). Pcbnew: texts in dimensions can be now moved. Gerbview: fix incorrect number of layers in export to pcbnew function. --- common/basicframe.cpp | 10 +- eeschema/netform.cpp | 2 +- gerbview/export_to_pcbnew.cpp | 17 +- gerbview/select_layers_to_pcb.cpp | 4 +- include/wxPcbStruct.h | 3 + pcbnew/CMakeLists.txt | 1 + pcbnew/board_undo_redo.cpp | 1 + pcbnew/clean.cpp | 138 +- .../dialogs/dialog_dimension_editor_base.cpp | 118 ++ .../dialogs/dialog_dimension_editor_base.fbp | 1608 +++++++++++++++++ pcbnew/dialogs/dialog_dimension_editor_base.h | 71 + pcbnew/dimension.cpp | 226 ++- pcbnew/edit.cpp | 31 +- pcbnew/hotkeys_board_editor.cpp | 5 + pcbnew/onleftclick.cpp | 6 +- pcbnew/onrightclick.cpp | 33 +- pcbnew/pcbnew_id.h | 2 + pcbnew/tool_pcb.cpp | 2 + 18 files changed, 2079 insertions(+), 199 deletions(-) create mode 100644 pcbnew/dialogs/dialog_dimension_editor_base.cpp create mode 100644 pcbnew/dialogs/dialog_dimension_editor_base.fbp create mode 100644 pcbnew/dialogs/dialog_dimension_editor_base.h diff --git a/common/basicframe.cpp b/common/basicframe.cpp index 4f39888da3..742cca675e 100644 --- a/common/basicframe.cpp +++ b/common/basicframe.cpp @@ -328,9 +328,17 @@ void EDA_BASE_FRAME::GetKicadHelp( wxCommandEvent& event ) { // Temporary change the help filename wxString tmp = wxGetApp().m_HelpFileName; - wxGetApp().m_HelpFileName = wxT( "Getting_Started_in_KiCad.pdf" ); + + // Search for "getting_started_in_kicad.pdf" or "Getting_Started_in_KiCad.pdf" + wxGetApp().m_HelpFileName = wxT( "getting_started_in_kicad.pdf" ); wxString helpFile = wxGetApp().GetHelpFile(); + if( !helpFile ) + { // Try to find "Getting_Started_in_KiCad.pdf" + wxGetApp().m_HelpFileName = wxT( "Getting_Started_in_KiCad.pdf" ); + wxString helpFile = wxGetApp().GetHelpFile(); + } + if( !helpFile ) { msg.Printf( _( "Help file %s could not be found." ), diff --git a/eeschema/netform.cpp b/eeschema/netform.cpp index 618ed72953..d11ba12101 100644 --- a/eeschema/netform.cpp +++ b/eeschema/netform.cpp @@ -787,7 +787,7 @@ XNODE* EXPORT_HELP::makeGenericLibParts() * Common pins (VCC, GND) can also be found more than once. */ sort( pinList.begin(), pinList.end(), sortPinsByNumber ); - for( unsigned ii = 0; ii < pinList.size()-1; ii++ ) + for( int ii = 0; ii < (int)pinList.size()-1; ii++ ) { if( pinList[ii]->GetNumber() == pinList[ii+1]->GetNumber() ) { // 2 pins have the same number, remove the redundant pin at index i+1 diff --git a/gerbview/export_to_pcbnew.cpp b/gerbview/export_to_pcbnew.cpp index a7ae7d0174..3e73aa9412 100644 --- a/gerbview/export_to_pcbnew.cpp +++ b/gerbview/export_to_pcbnew.cpp @@ -66,19 +66,17 @@ GBR_TO_PCB_EXPORTER::~GBR_TO_PCB_EXPORTER() */ void GERBVIEW_FRAME::ExportDataInPcbnewFormat( wxCommandEvent& event ) { - int ii = 0; - bool no_used_layers = true; // Changed to false if any used layer found + int layercount = 0; - // Check whether any of the Gerber layers are actually currently used - while( no_used_layers && ii < 32 ) + // Count the Gerber layers which are actually currently used + for( int ii = 0; ii < 32; ii++ ) { if( g_GERBER_List[ii] != NULL ) - no_used_layers = false; + layercount++; - ii++; } - if( no_used_layers ) + if( layercount == 0 ) { DisplayInfoMessage( this, _( "None of the Gerber layers contain any data" ) ); @@ -233,6 +231,7 @@ bool GBR_TO_PCB_EXPORTER::ExportPcb( int* LayerLookUpTable ) } cleanBoard(); + m_pcb->SetCopperLayerCount( LayerLookUpTable[32] ); // Switch the locale to standard C (needed to print floating point numbers) SetLocaleTo_C_standard(); @@ -297,7 +296,7 @@ void GBR_TO_PCB_EXPORTER::export_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aL break; case GBR_ARC: -// export_segarc_copper_item( aGbrItem, aLayer ); + export_segarc_copper_item( aGbrItem, aLayer ); break; default: @@ -325,6 +324,7 @@ void GBR_TO_PCB_EXPORTER::export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem void GBR_TO_PCB_EXPORTER::export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer ) { +#if 0 // TODO: does not work in all cases, so needs some work double a = atan2( (double)( aGbrItem->m_Start.y - aGbrItem->m_ArcCentre.y ), (double)( aGbrItem->m_Start.x - aGbrItem->m_ArcCentre.x ) ); double b = atan2( (double)( aGbrItem->m_End.y - aGbrItem->m_ArcCentre.y ), @@ -374,6 +374,7 @@ void GBR_TO_PCB_EXPORTER::export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, NEGATE( newtrack->m_End.y ); m_pcb->Add( newtrack ); } +#endif } diff --git a/gerbview/select_layers_to_pcb.cpp b/gerbview/select_layers_to_pcb.cpp index 805974b94c..4bb3c49c26 100644 --- a/gerbview/select_layers_to_pcb.cpp +++ b/gerbview/select_layers_to_pcb.cpp @@ -94,7 +94,7 @@ void LAYERS_MAP_DIALOG::initDialog() // Ensure we have: // at least 2 copper layers and NB_COPPER_LAYERS copper layers max - // an even layers count because board *must* have even layers count + // and even layers count because a board *must* have even layers count // and maxi NB_COPPER_LAYERS copper layers count normalizeBrdLayersCount(); @@ -279,7 +279,7 @@ void LAYERS_MAP_DIALOG::OnResetClick( wxCommandEvent& event ) } -/* Stores the current mayers selection in config +/* Stores the current layers selection in config */ void LAYERS_MAP_DIALOG::OnStoreSetup( wxCommandEvent& event ) { diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h index d4340f8006..bc612e9442 100644 --- a/include/wxPcbStruct.h +++ b/include/wxPcbStruct.h @@ -1253,6 +1253,9 @@ public: void ShowDimensionPropertyDialog( DIMENSION* aDimension, wxDC* aDC ); DIMENSION* EditDimension( DIMENSION* aDimension, wxDC* aDC ); void DeleteDimension( DIMENSION* aDimension, wxDC* aDC ); + void BeginMoveDimensionText( DIMENSION* aItem, wxDC* DC ); + void PlaceDimensionText( DIMENSION* aItem, wxDC* DC ); + // netlist handling: void InstallNetlistFrame( wxDC* DC ); diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 211f50dd56..ca05e4661f 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -21,6 +21,7 @@ set(PCBNEW_DIALOGS dialogs/dialog_copper_zones_base.cpp dialogs/dialog_design_rules.cpp dialogs/dialog_design_rules_base.cpp + dialogs/dialog_dimension_editor_base.cpp dialogs/dialog_display_options.cpp dialogs/dialog_display_options_base.cpp dialogs/dialog_drc_base.cpp diff --git a/pcbnew/board_undo_redo.cpp b/pcbnew/board_undo_redo.cpp index 7d45e918cf..ec56177b65 100644 --- a/pcbnew/board_undo_redo.cpp +++ b/pcbnew/board_undo_redo.cpp @@ -235,6 +235,7 @@ void SwapData( BOARD_ITEM* aItem, BOARD_ITEM* aImage ) ( (DIMENSION*) aImage )->SetText( txt ); EXCHG( ( (DIMENSION*) aItem )->m_Width, ( (DIMENSION*) aImage )->m_Width ); EXCHG( ( (DIMENSION*) aItem )->m_Text->m_Size, ( (DIMENSION*) aImage )->m_Text->m_Size ); + EXCHG( ( (DIMENSION*) aItem )->m_Text->m_Pos, ( (DIMENSION*) aImage )->m_Text->m_Pos ); EXCHG( ( (DIMENSION*) aItem )->m_Text->m_Thickness, ( (DIMENSION*) aImage )->m_Text->m_Thickness ); EXCHG( ( (DIMENSION*) aItem )->m_Text->m_Mirror, diff --git a/pcbnew/clean.cpp b/pcbnew/clean.cpp index 746ebf8c06..1f9ede9387 100644 --- a/pcbnew/clean.cpp +++ b/pcbnew/clean.cpp @@ -1,29 +1,23 @@ /** * @file clean.cpp - * functions to clean tracks: remove null and redundant segments + * @brief functions to clean tracks: remove null lenght and redundant segments */ #include "fctsys.h" #include "class_drawpanel.h" -//#include "gr_basic.h" #include "pcbcommon.h" #include "wxPcbStruct.h" - #include "pcbnew.h" -//#include "protos.h" - #include "class_board.h" #include "class_track.h" -typedef long long int64; - /* local functions : */ -static void clean_segments( PCB_EDIT_FRAME* frame ); +static void clean_segments( PCB_EDIT_FRAME* aFrame ); static void clean_vias( BOARD* aPcb ); -static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ); +static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* aFrame ); static TRACK* MergeColinearSegmentIfPossible( BOARD* aPcb, TRACK* aTrackRef, TRACK* aCandidate, int aEndType ); -static void CleanupTracks( PCB_EDIT_FRAME* frame, +static void CleanupTracks( PCB_EDIT_FRAME* aFrame, bool aCleanVias, bool aMergeSegments, bool aDeleteUnconnectedSegm, bool aConnectToPads ); @@ -56,32 +50,31 @@ void PCB_EDIT_FRAME::Clean_Pcb( wxDC* DC ) * Delete * - Redundant points on tracks (merge aligned segments) * - vias on pad - * - null segments - * - Redundant segments + * - null lenght segments * Create segments when track ends are incorrectly connected: * i.e. when a track end covers a pad or a via but is not exactly on the pad or the via center */ -void CleanupTracks( PCB_EDIT_FRAME* frame, +void CleanupTracks( PCB_EDIT_FRAME* aFrame, bool aCleanVias, bool aMergeSegments, bool aDeleteUnconnectedSegm, bool aConnectToPads ) { wxBusyCursor( dummy ); - frame->MsgPanel->EraseMsgBox(); - frame->GetBoard()->GetNumSegmTrack(); // update the count + aFrame->MsgPanel->EraseMsgBox(); + aFrame->GetBoard()->GetNumSegmTrack(); // update the count // Clear undo and redo lists to avoid inconsistencies between lists - frame->GetScreen()->ClearUndoRedoList(); - frame->SetCurItem( NULL ); + aFrame->GetScreen()->ClearUndoRedoList(); + aFrame->SetCurItem( NULL ); /* Rebuild the pad infos (pad list and netcodes) to ensure an up to date info */ - frame->GetBoard()->m_Status_Pcb = 0; - frame->GetBoard()->m_NetInfo->BuildListOfNets(); + aFrame->GetBoard()->m_Status_Pcb = 0; + aFrame->GetBoard()->m_NetInfo->BuildListOfNets(); if( aCleanVias ) // delete redundant vias { - frame->SetStatusText( _( "Clean vias" ) ); - clean_vias( frame->GetBoard() ); + aFrame->SetStatusText( _( "Clean vias" ) ); + clean_vias( aFrame->GetBoard() ); } #ifdef CONN2PAD_ENBL @@ -89,35 +82,35 @@ void CleanupTracks( PCB_EDIT_FRAME* frame, * but is not on the pad or the via center */ if( aConnectToPads ) { - frame->SetStatusText( _( "Reconnect pads" ) ); + aFrame->SetStatusText( _( "Reconnect pads" ) ); /* Create missing segments when a track end covers a pad, but is not on the pad center */ - ConnectDanglingEndToPad( frame ); + ConnectDanglingEndToPad( aFrame ); /* Create missing segments when a track end covers a via, but is not on the via center */ - ConnectDanglingEndToVia( frame->GetBoard() ); + ConnectDanglingEndToVia( aFrame->GetBoard() ); } #endif /* Remove null segments and intermediate points on aligned segments */ if( aMergeSegments ) { - frame->SetStatusText( _( "Merge track segments" ) ); - clean_segments( frame ); + aFrame->SetStatusText( _( "Merge track segments" ) ); + clean_segments( aFrame ); } /* Delete dangling tracks */ if( aDeleteUnconnectedSegm ) { - frame->SetStatusText( _( "Delete unconnected tracks" ) ); - DeleteUnconnectedTracks( frame ); + aFrame->SetStatusText( _( "Delete unconnected tracks" ) ); + DeleteUnconnectedTracks( aFrame ); } - frame->SetStatusText( _( "Cleanup finished" ) ); + aFrame->SetStatusText( _( "Cleanup finished" ) ); - frame->Compile_Ratsnest( NULL, true ); + aFrame->Compile_Ratsnest( NULL, true ); - frame->OnModify(); + aFrame->OnModify(); } @@ -175,7 +168,7 @@ void clean_vias( BOARD * aPcb ) * Vias: * If a via is only connected to a dangling track, it also will be removed */ -static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) +static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* aFrame ) { TRACK* segment; TRACK* other; @@ -185,13 +178,13 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) int masklayer, oldnetcode; int type_end, flag_erase; - if( frame->GetBoard()->m_Track == NULL ) + if( aFrame->GetBoard()->m_Track == NULL ) return; - frame->DrawPanel->m_AbortRequest = false; + aFrame->DrawPanel->m_AbortRequest = false; // correct via m_End defects - for( segment = frame->GetBoard()->m_Track; segment; segment = next ) + for( segment = aFrame->GetBoard()->m_Track; segment; segment = next ) { next = segment->Next(); @@ -205,14 +198,14 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) } // removal of unconnected tracks - segment = startNetcode = frame->GetBoard()->m_Track; + segment = startNetcode = aFrame->GetBoard()->m_Track; oldnetcode = segment->GetNet(); for( int ii = 0; segment ; segment = next, ii++ ) { next = segment->Next(); - if( frame->DrawPanel->m_AbortRequest ) + if( aFrame->DrawPanel->m_AbortRequest ) break; if( segment->GetNet() != oldnetcode ) @@ -230,7 +223,7 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) D_PAD* pad; - pad = frame->GetBoard()->GetPadFast( segment->m_Start, masklayer ); + pad = aFrame->GetBoard()->GetPadFast( segment->m_Start, masklayer ); if( pad != NULL ) { @@ -238,7 +231,7 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) type_end |= START_ON_PAD; } - pad = frame->GetBoard()->GetPadFast( segment->m_End, masklayer ); + pad = aFrame->GetBoard()->GetPadFast( segment->m_End, masklayer ); if( pad != NULL ) { @@ -253,19 +246,19 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) if( (type_end & START_ON_PAD ) == 0 ) { - other = segment->GetTrace( frame->GetBoard()->m_Track, NULL, START ); + other = segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, START ); if( other == NULL ) // Test a connection to zones { if( segment->Type() != PCB_VIA_T ) { - zone = frame->GetBoard()->HitTestForAnyFilledArea( segment->m_Start, + zone = aFrame->GetBoard()->HitTestForAnyFilledArea( segment->m_Start, segment->GetLayer() ); } else { ((SEGVIA*)segment)->ReturnLayerPair( &top_layer, &bottom_layer ); - zone = frame->GetBoard()->HitTestForAnyFilledArea( segment->m_Start, + zone = aFrame->GetBoard()->HitTestForAnyFilledArea( segment->m_Start, top_layer, bottom_layer ); } } @@ -287,12 +280,12 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) segment->SetState( BUSY, ON ); SEGVIA* via = (SEGVIA*) other; - other = via->GetTrace( frame->GetBoard()->m_Track, NULL, START ); + other = via->GetTrace( aFrame->GetBoard()->m_Track, NULL, START ); if( other == NULL ) { via->ReturnLayerPair( &top_layer, &bottom_layer ); - zone = frame->GetBoard()->HitTestForAnyFilledArea( via->m_Start, + zone = aFrame->GetBoard()->HitTestForAnyFilledArea( via->m_Start, bottom_layer, top_layer ); } @@ -308,19 +301,19 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) // if not connected to a pad, test if segment's END is connected to another track if( (type_end & END_ON_PAD ) == 0 ) { - other = segment->GetTrace( frame->GetBoard()->m_Track, NULL, END ); + other = segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, END ); if( other == NULL ) // Test a connection to zones { if( segment->Type() != PCB_VIA_T ) { - zone = frame->GetBoard()->HitTestForAnyFilledArea( segment->m_End, + zone = aFrame->GetBoard()->HitTestForAnyFilledArea( segment->m_End, segment->GetLayer() ); } else { ((SEGVIA*)segment)->ReturnLayerPair( &top_layer, &bottom_layer ); - zone = frame->GetBoard()->HitTestForAnyFilledArea( segment->m_End, + zone = aFrame->GetBoard()->HitTestForAnyFilledArea( segment->m_End, top_layer, bottom_layer ); } } @@ -343,12 +336,12 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) segment->SetState( BUSY, ON ); SEGVIA* via = (SEGVIA*) other; - other = via->GetTrace( frame->GetBoard()->m_Track, NULL, END ); + other = via->GetTrace( aFrame->GetBoard()->m_Track, NULL, END ); if( other == NULL ) { via->ReturnLayerPair( &top_layer, &bottom_layer ); - zone = frame->GetBoard()->HitTestForAnyFilledArea( via->m_End, + zone = aFrame->GetBoard()->HitTestForAnyFilledArea( via->m_End, bottom_layer, top_layer ); } @@ -385,7 +378,7 @@ static void DeleteUnconnectedTracks( PCB_EDIT_FRAME* frame ) /* Delete null length segments, and intermediate points .. */ -static void clean_segments( PCB_EDIT_FRAME* frame ) +static void clean_segments( PCB_EDIT_FRAME* aFrame ) { TRACK* segment, * nextsegment; TRACK* other; @@ -393,10 +386,10 @@ static void clean_segments( PCB_EDIT_FRAME* frame ) int flag, no_inc; wxString msg; - frame->DrawPanel->m_AbortRequest = false; + aFrame->DrawPanel->m_AbortRequest = false; // Delete null segments - for( segment = frame->GetBoard()->m_Track; segment; segment = nextsegment ) + for( segment = aFrame->GetBoard()->m_Track; segment; segment = nextsegment ) { nextsegment = segment->Next(); @@ -408,7 +401,7 @@ static void clean_segments( PCB_EDIT_FRAME* frame ) } /* Delete redundant segments */ - for( segment = frame->GetBoard()->m_Track, ii = 0; segment; segment = segment->Next(), ii++ ) + for( segment = aFrame->GetBoard()->m_Track, ii = 0; segment; segment = segment->Next(), ii++ ) { for( other = segment->Next(); other; other = nextsegment ) { @@ -448,7 +441,7 @@ static void clean_segments( PCB_EDIT_FRAME* frame ) /* delete intermediate points */ ii = 0; - for( segment = frame->GetBoard()->m_Track; segment; segment = nextsegment ) + for( segment = aFrame->GetBoard()->m_Track; segment; segment = nextsegment ) { TRACK* segStart; TRACK* segEnd; @@ -456,7 +449,7 @@ static void clean_segments( PCB_EDIT_FRAME* frame ) nextsegment = segment->Next(); - if( frame->DrawPanel->m_AbortRequest ) + if( aFrame->DrawPanel->m_AbortRequest ) return; if( segment->Type() != PCB_TRACE_T ) @@ -481,7 +474,7 @@ static void clean_segments( PCB_EDIT_FRAME* frame ) /* We must have only one segment connected */ segStart->SetState( BUSY, ON ); - other = segment->GetTrace( frame->GetBoard()->m_Track, NULL, START ); + other = segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, START ); segStart->SetState( BUSY, OFF ); if( other == NULL ) @@ -494,7 +487,7 @@ static void clean_segments( PCB_EDIT_FRAME* frame ) if( flag ) // We have the starting point of the segment is connected to an other segment { - segDelete = MergeColinearSegmentIfPossible( frame->GetBoard(), segment, segStart, START ); + segDelete = MergeColinearSegmentIfPossible( aFrame->GetBoard(), segment, segStart, START ); if( segDelete ) { @@ -518,7 +511,7 @@ static void clean_segments( PCB_EDIT_FRAME* frame ) /* We must have only one segment connected */ segEnd->SetState( BUSY, ON ); - other = segment->GetTrace( frame->GetBoard()->m_Track, NULL, END ); + other = segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, END ); segEnd->SetState( BUSY, OFF ); if( other == NULL ) @@ -534,7 +527,7 @@ static void clean_segments( PCB_EDIT_FRAME* frame ) if( flag & 2 ) // We have the ending point of the segment is connected to an other segment { - segDelete = MergeColinearSegmentIfPossible( frame->GetBoard(), segment, segEnd, END ); + segDelete = MergeColinearSegmentIfPossible( aFrame->GetBoard(), segment, segEnd, END ); if( segDelete ) { @@ -608,11 +601,12 @@ TRACK* MergeColinearSegmentIfPossible( BOARD* aPcb, } /* test if alignment in other cases - * We must have refdy/refdx == (+/-)segmdy/segmdx, (i.e. same orientation) */ + * We must have refdy/refdx == segmdy/segmdx, (i.e. same slope) + * or refdy * segmdx == segmdy * refdx + */ if( is_colinear == false ) { - if( ( (int64)refdy * segmdx != (int64)refdx * segmdy ) - && ( (int64)refdy * segmdx != -(int64)refdx * segmdy ) ) + if( ( double)refdy * segmdx != (double)refdx * segmdy ) return NULL; is_colinear = true; @@ -830,33 +824,33 @@ static void ConnectDanglingEndToVia( BOARD* pcb ) * connected into the center of the pad. This allows faster control of * connections. */ -void ConnectDanglingEndToPad( PCB_EDIT_FRAME* frame ) +void ConnectDanglingEndToPad( PCB_EDIT_FRAME* aFrame ) { TRACK* segment; int nb_new_trace = 0; wxString msg; - frame->DrawPanel->m_AbortRequest = false; + aFrame->DrawPanel->m_AbortRequest = false; - for( segment = frame->GetBoard()->m_Track; segment; segment = segment->Next() ) + for( segment = aFrame->GetBoard()->m_Track; segment; segment = segment->Next() ) { D_PAD* pad; - if( frame->DrawPanel->m_AbortRequest ) + if( aFrame->DrawPanel->m_AbortRequest ) return; - pad = frame->GetBoard()->GetPad( segment, START ); + pad = aFrame->GetBoard()->GetPad( segment, START ); if( pad ) { // test if the track start point is not exactly starting on the pad if( segment->m_Start != pad->m_Pos ) { - if( segment->GetTrace( frame->GetBoard()->m_Track, NULL, START ) == NULL ) + if( segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, START ) == NULL ) { TRACK* newTrack = segment->Copy(); - frame->GetBoard()->m_Track.Insert( newTrack, segment->Next() ); + aFrame->GetBoard()->m_Track.Insert( newTrack, segment->Next() ); newTrack->m_End = pad->m_Pos; newTrack->start = segment; @@ -867,18 +861,18 @@ void ConnectDanglingEndToPad( PCB_EDIT_FRAME* frame ) } } - pad = frame->GetBoard()->GetPad( segment, END ); + pad = aFrame->GetBoard()->GetPad( segment, END ); if( pad ) { // test if the track end point is not exactly on the pad if( segment->m_End != pad->m_Pos ) { - if( segment->GetTrace( frame->GetBoard()->m_Track, NULL, END ) == NULL ) + if( segment->GetTrace( aFrame->GetBoard()->m_Track, NULL, END ) == NULL ) { TRACK* newTrack = segment->Copy(); - frame->GetBoard()->m_Track.Insert( newTrack, segment->Next() ); + aFrame->GetBoard()->m_Track.Insert( newTrack, segment->Next() ); newTrack->m_Start = pad->m_Pos; diff --git a/pcbnew/dialogs/dialog_dimension_editor_base.cpp b/pcbnew/dialogs/dialog_dimension_editor_base.cpp new file mode 100644 index 0000000000..3ee736e920 --- /dev/null +++ b/pcbnew/dialogs/dialog_dimension_editor_base.cpp @@ -0,0 +1,118 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Jun 30 2011) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_dimension_editor_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_DIMENSION_EDITOR_BASE::DIALOG_DIMENSION_EDITOR_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizerMain; + bSizerMain = new wxBoxSizer( wxVERTICAL ); + + m_staticTextDim = new wxStaticText( this, wxID_ANY, _("Text:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDim->Wrap( -1 ); + bSizerMain->Add( m_staticTextDim, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_Name = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Name->SetMinSize( wxSize( 400,-1 ) ); + + bSizerMain->Add( m_Name, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizerUpper; + bSizerUpper = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizerLeft; + bSizerLeft = new wxBoxSizer( wxVERTICAL ); + + m_staticTextSizeX = new wxStaticText( this, wxID_ANY, _("Size X"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSizeX->Wrap( -1 ); + bSizerLeft->Add( m_staticTextSizeX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_TxtSizeXCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerLeft->Add( m_TxtSizeXCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticTextSizeY = new wxStaticText( this, wxID_ANY, _("Size Y"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSizeY->Wrap( -1 ); + bSizerLeft->Add( m_staticTextSizeY, 0, wxRIGHT|wxLEFT, 5 ); + + m_TxtSizeYCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerLeft->Add( m_TxtSizeYCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticTextWidth = new wxStaticText( this, wxID_ANY, _("Width"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextWidth->Wrap( -1 ); + bSizerLeft->Add( m_staticTextWidth, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_TxtWidthCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerLeft->Add( m_TxtWidthCtrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticTextPosX = new wxStaticText( this, wxID_ANY, _("Text position X"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPosX->Wrap( -1 ); + bSizerLeft->Add( m_staticTextPosX, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_textCtrlPosX = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerLeft->Add( m_textCtrlPosX, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticTextPosY = new wxStaticText( this, wxID_ANY, _("Text position Y"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPosY->Wrap( -1 ); + bSizerLeft->Add( m_staticTextPosY, 0, wxRIGHT|wxLEFT, 5 ); + + m_textCtrlPosY = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerLeft->Add( m_textCtrlPosY, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizerUpper->Add( bSizerLeft, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizerRight; + bSizerRight = new wxBoxSizer( wxVERTICAL ); + + wxString m_rbMirrorChoices[] = { _("Normal"), _("Mirror") }; + int m_rbMirrorNChoices = sizeof( m_rbMirrorChoices ) / sizeof( wxString ); + m_rbMirror = new wxRadioBox( this, wxID_ANY, _("Display"), wxDefaultPosition, wxDefaultSize, m_rbMirrorNChoices, m_rbMirrorChoices, 1, wxRA_SPECIFY_COLS ); + m_rbMirror->SetSelection( 0 ); + bSizerRight->Add( m_rbMirror, 0, wxALL|wxEXPAND, 5 ); + + m_staticTextLayer = new wxStaticText( this, wxID_ANY, _("Layer:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLayer->Wrap( -1 ); + bSizerRight->Add( m_staticTextLayer, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_SelLayerBox = new wxComboBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizerRight->Add( m_SelLayerBox, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizerUpper->Add( bSizerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerMain->Add( bSizerUpper, 1, wxEXPAND, 5 ); + + m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMain->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 ); + + m_sdbSizerBts = new wxStdDialogButtonSizer(); + m_sdbSizerBtsOK = new wxButton( this, wxID_OK ); + m_sdbSizerBts->AddButton( m_sdbSizerBtsOK ); + m_sdbSizerBtsCancel = new wxButton( this, wxID_CANCEL ); + m_sdbSizerBts->AddButton( m_sdbSizerBtsCancel ); + m_sdbSizerBts->Realize(); + bSizerMain->Add( m_sdbSizerBts, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + this->SetSizer( bSizerMain ); + this->Layout(); + + this->Centre( wxBOTH ); + + // Connect Events + m_sdbSizerBtsCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DIMENSION_EDITOR_BASE::OnCancelClick ), NULL, this ); + m_sdbSizerBtsOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DIMENSION_EDITOR_BASE::OnOKClick ), NULL, this ); +} + +DIALOG_DIMENSION_EDITOR_BASE::~DIALOG_DIMENSION_EDITOR_BASE() +{ + // Disconnect Events + m_sdbSizerBtsCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DIMENSION_EDITOR_BASE::OnCancelClick ), NULL, this ); + m_sdbSizerBtsOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_DIMENSION_EDITOR_BASE::OnOKClick ), NULL, this ); + +} diff --git a/pcbnew/dialogs/dialog_dimension_editor_base.fbp b/pcbnew/dialogs/dialog_dimension_editor_base.fbp new file mode 100644 index 0000000000..2137edc19f --- /dev/null +++ b/pcbnew/dialogs/dialog_dimension_editor_base.fbp @@ -0,0 +1,1608 @@ + + + + + + C++ + 1 + source_name + 0 + res + UTF-8 + connect + dialog_dimension_editor_base + 1000 + none + 1 + dialog_dimension_editor_base + + . + + 1 + 1 + 0 + 0 + + 1 + 1 + 1 + 1 + 0 + + + + + 1 + wxBOTH + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + impl_virtual + + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + + 0 + + 1 + DIALOG_DIMENSION_EDITOR_BASE + 1 + + + 1 + + + Resizable + + 1 + 378,328 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + + Dimension Properties + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizerMain + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text: + + + 0 + + + 0 + + 1 + m_staticTextDim + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + 0 + + 0 + 400,-1 + 1 + m_Name + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizerUpper + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizerLeft + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Size X + + + 0 + + + 0 + + 1 + m_staticTextSizeX + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + 0 + + 0 + + 1 + m_TxtSizeXCtrl + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Size Y + + + 0 + + + 0 + + 1 + m_staticTextSizeY + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + 0 + + 0 + + 1 + m_TxtSizeYCtrl + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Width + + + 0 + + + 0 + + 1 + m_staticTextWidth + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + 0 + + 0 + + 1 + m_TxtWidthCtrl + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text position X + + + 0 + + + 0 + + 1 + m_staticTextPosX + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + 0 + + 0 + + 1 + m_textCtrlPosX + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Text position Y + + + 0 + + + 0 + + 1 + m_staticTextPosY + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + 0 + + 0 + + 1 + m_textCtrlPosY + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + bSizerRight + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + "Normal" "Mirror" + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Display + + 1 + + 0 + + + 0 + + 1 + m_rbMirror + 1 + + + protected + 1 + + + Resizable + + 0 + 1 + + wxRA_SPECIFY_COLS + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Layer: + + + 0 + + + 0 + + 1 + m_staticTextLayer + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + + 0 + + 1 + m_SelLayerBox + 1 + + + protected + 1 + + + Resizable + + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + + 0 + + + 0 + + 1 + m_staticline1 + 1 + + + protected + 1 + + + Resizable + + 1 + + wxLI_HORIZONTAL + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT + 0 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + + m_sdbSizerBts + protected + + OnCancelClick + + + + OnOKClick + + + + + + + + diff --git a/pcbnew/dialogs/dialog_dimension_editor_base.h b/pcbnew/dialogs/dialog_dimension_editor_base.h new file mode 100644 index 0000000000..beab63c95e --- /dev/null +++ b/pcbnew/dialogs/dialog_dimension_editor_base.h @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Jun 30 2011) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __DIALOG_DIMENSION_EDITOR_BASE_H__ +#define __DIALOG_DIMENSION_EDITOR_BASE_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_DIMENSION_EDITOR_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_DIMENSION_EDITOR_BASE : public wxDialog +{ + private: + + protected: + wxStaticText* m_staticTextDim; + wxTextCtrl* m_Name; + wxStaticText* m_staticTextSizeX; + wxTextCtrl* m_TxtSizeXCtrl; + wxStaticText* m_staticTextSizeY; + wxTextCtrl* m_TxtSizeYCtrl; + wxStaticText* m_staticTextWidth; + wxTextCtrl* m_TxtWidthCtrl; + wxStaticText* m_staticTextPosX; + wxTextCtrl* m_textCtrlPosX; + wxStaticText* m_staticTextPosY; + wxTextCtrl* m_textCtrlPosY; + wxRadioBox* m_rbMirror; + wxStaticText* m_staticTextLayer; + wxComboBox* m_SelLayerBox; + wxStaticLine* m_staticline1; + wxStdDialogButtonSizer* m_sdbSizerBts; + wxButton* m_sdbSizerBtsOK; + wxButton* m_sdbSizerBtsCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOKClick( wxCommandEvent& event ) { event.Skip(); } + + + public: + + DIALOG_DIMENSION_EDITOR_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Dimension Properties"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 378,328 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_DIMENSION_EDITOR_BASE(); + +}; + +#endif //__DIALOG_DIMENSION_EDITOR_BASE_H__ diff --git a/pcbnew/dimension.cpp b/pcbnew/dimension.cpp index ce6b83e05f..969d6155c1 100644 --- a/pcbnew/dimension.cpp +++ b/pcbnew/dimension.cpp @@ -10,18 +10,24 @@ #include "wxPcbStruct.h" #include "drawtxt.h" #include "dialog_helpers.h" +#include "macros.h" #include "class_board.h" #include "class_pcb_text.h" #include "class_dimension.h" #include "pcbnew.h" - +#include "dialog_dimension_editor_base.h" /* Local functions */ -static void MoveDimension( EDA_DRAW_PANEL* aPanel, wxDC* aDC, +static void BuildDimension( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, bool aErase ); +static void MoveDimensionText( EDA_DRAW_PANEL* aPanel, wxDC* aDC, + const wxPoint& aPosition, bool aErase ); +static void AbortMoveDimensionText( EDA_DRAW_PANEL* aPanel, wxDC* aDC ); + + /* Local variables : */ static int status_dimension; /* Used in dimension creation: * = 0 : initial value: no dimension in progress @@ -40,105 +46,70 @@ static int status_dimension; /* Used in dimension creation: /*********************************/ -/* class DIMENSION_EDITOR_DIALOG */ +/* class DIALOG_DIMENSION_EDITOR */ /*********************************/ -class DIMENSION_EDITOR_DIALOG : public wxDialog +class DIALOG_DIMENSION_EDITOR : public DIALOG_DIMENSION_EDITOR_BASE { private: PCB_EDIT_FRAME* m_Parent; wxDC* m_DC; DIMENSION* CurrentDimension; - wxTextCtrl* m_Name; - EDA_SIZE_CTRL* m_TxtSizeCtrl; - EDA_VALUE_CTRL* m_TxtWidthCtrl; - wxRadioBox* m_Mirror; - wxComboBox* m_SelLayerBox; public: // Constructor and destructor - DIMENSION_EDITOR_DIALOG( PCB_EDIT_FRAME* aParent, DIMENSION* aDimension, wxDC* aDC ); - ~DIMENSION_EDITOR_DIALOG() + DIALOG_DIMENSION_EDITOR( PCB_EDIT_FRAME* aParent, DIMENSION* aDimension, wxDC* aDC ); + ~DIALOG_DIMENSION_EDITOR() { } private: void OnCancelClick( wxCommandEvent& event ); - void OnOkClick( wxCommandEvent& event ); - - DECLARE_EVENT_TABLE() + void OnOKClick( wxCommandEvent& event ); }; -BEGIN_EVENT_TABLE( DIMENSION_EDITOR_DIALOG, wxDialog ) - EVT_BUTTON( wxID_OK, DIMENSION_EDITOR_DIALOG::OnOkClick ) - EVT_BUTTON( wxID_CANCEL, DIMENSION_EDITOR_DIALOG::OnCancelClick ) -END_EVENT_TABLE() - -DIMENSION_EDITOR_DIALOG::DIMENSION_EDITOR_DIALOG( PCB_EDIT_FRAME* aParent, +DIALOG_DIMENSION_EDITOR::DIALOG_DIMENSION_EDITOR( PCB_EDIT_FRAME* aParent, DIMENSION* aDimension, wxDC* aDC ) : - wxDialog( aParent, -1, wxString( _( "Dimension Properties" ) ) ) + DIALOG_DIMENSION_EDITOR_BASE( aParent ) { SetFocus(); - wxButton* Button; m_Parent = aParent; m_DC = aDC; CurrentDimension = aDimension; - wxBoxSizer* MainBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - SetSizer( MainBoxSizer ); - wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL ); - MainBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); - MainBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); - - /* Create command buttons. */ - Button = new wxButton( this, wxID_OK, _( "OK" ) ); - RightBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); - - Button = new wxButton( this, wxID_CANCEL, _( "Cancel" ) ); - RightBoxSizer->Add( Button, 0, wxGROW | wxALL, 5 ); - - wxString display_msg[2] = { _( "Normal" ), _( "Mirror" ) }; - m_Mirror = new wxRadioBox( this, -1, _( "Display" ), - wxDefaultPosition, wxSize( -1, -1 ), 2, display_msg, - 1, wxRA_SPECIFY_COLS ); - if( aDimension->m_Text->m_Mirror ) - m_Mirror->SetSelection( 1 ); + m_rbMirror->SetSelection( 1 ); + else + m_rbMirror->SetSelection( 0 ); - RightBoxSizer->Add( m_Mirror, 0, wxGROW | wxALL, 5 ); + m_Name->SetValue( aDimension->m_Text->m_Text ); - LeftBoxSizer->Add( new wxStaticText( this, -1, _( "Text:" ) ), - 0, wxGROW | wxLEFT | wxRIGHT | wxTOP | wxADJUST_MINSIZE, 5 ); + // Enter size value in dialog + PutValueInLocalUnits( *m_TxtSizeXCtrl, aDimension->m_Text->m_Size.x, + m_Parent->m_InternalUnits ); + AddUnitSymbol( *m_staticTextSizeX ); + PutValueInLocalUnits( *m_TxtSizeYCtrl, aDimension->m_Text->m_Size.y, + m_Parent->m_InternalUnits ); + AddUnitSymbol( *m_staticTextSizeY ); - m_Name = new wxTextCtrl( this, -1, aDimension->m_Text->m_Text, - wxDefaultPosition, wxSize( 200, -1 ) ); + // Enter lines thickness value in dialog + PutValueInLocalUnits( *m_TxtWidthCtrl, aDimension->m_Width, + m_Parent->m_InternalUnits ); + AddUnitSymbol( *m_staticTextWidth ); - m_Name->SetInsertionPoint( 1 ); - - LeftBoxSizer->Add( m_Name, - 0, - wxGROW | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT | wxBOTTOM, - 5 ); - - m_TxtSizeCtrl = new EDA_SIZE_CTRL( this, _( "Size" ), aDimension->m_Text->m_Size, - g_UserUnit, LeftBoxSizer, m_Parent->m_InternalUnits ); - - m_TxtWidthCtrl = new EDA_VALUE_CTRL( this, _( "Width" ), aDimension->m_Width, - g_UserUnit, LeftBoxSizer, m_Parent->m_InternalUnits ); - - wxStaticText* text = new wxStaticText( this, -1, _( "Layer:" ) ); - LeftBoxSizer->Add( text, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); - m_SelLayerBox = new wxComboBox( this, wxID_ANY, wxEmptyString, - wxDefaultPosition, wxDefaultSize, - 0, NULL, wxCB_READONLY ); - LeftBoxSizer->Add( m_SelLayerBox, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); + // Enter position value in dialog + PutValueInLocalUnits( *m_textCtrlPosX, aDimension->m_Text->m_Pos.x, + m_Parent->m_InternalUnits ); + AddUnitSymbol( *m_staticTextPosX ); + PutValueInLocalUnits( *m_textCtrlPosY, aDimension->m_Text->m_Pos.y, + m_Parent->m_InternalUnits ); + AddUnitSymbol( *m_staticTextPosY ); for( int layer = FIRST_NO_COPPER_LAYER; layerSetText( m_Name->GetValue() ); } - CurrentDimension->m_Text->m_Size = m_TxtSizeCtrl->GetValue(); + wxString msg; - int width = m_TxtWidthCtrl->GetValue(); + // Get new size value: + msg = m_TxtSizeXCtrl->GetValue(); + CurrentDimension->m_Text->m_Size.x = ReturnValueFromString( g_UserUnit, msg, + m_Parent->m_InternalUnits ); + msg = m_TxtSizeYCtrl->GetValue(); + CurrentDimension->m_Text->m_Size.y = ReturnValueFromString( g_UserUnit, msg, + m_Parent->m_InternalUnits ); + + // Get new position value: + // It will be copied later in dimension, because + msg = m_textCtrlPosX->GetValue(); + CurrentDimension->m_Text->m_Pos.x = ReturnValueFromString( g_UserUnit, msg, + m_Parent->m_InternalUnits ); + msg = m_textCtrlPosY->GetValue(); + CurrentDimension->m_Text->m_Pos.y = ReturnValueFromString( g_UserUnit, msg, + m_Parent->m_InternalUnits ); + + // Get new line thickness value: + msg = m_TxtWidthCtrl->GetValue(); + int width = ReturnValueFromString( g_UserUnit, msg, + m_Parent->m_InternalUnits ); int maxthickness = Clamp_Text_PenSize( width, CurrentDimension->m_Text->m_Size ); if( width > maxthickness ) @@ -187,12 +178,10 @@ void DIMENSION_EDITOR_DIALOG::OnOkClick( wxCommandEvent& event ) CurrentDimension->m_Text->m_Thickness = CurrentDimension->m_Width = width ; - CurrentDimension->m_Text->m_Mirror = ( m_Mirror->GetSelection() == 1 ) ? true : false; + CurrentDimension->m_Text->m_Mirror = ( m_rbMirror->GetSelection() == 1 ) ? true : false; CurrentDimension->SetLayer( m_SelLayerBox->GetCurrentSelection() + FIRST_NO_COPPER_LAYER ); - CurrentDimension->AdjustDimensionDetails( true ); - if( m_DC ) // Display new text { CurrentDimension->Draw( m_Parent->DrawPanel, m_DC, GR_OR ); @@ -203,7 +192,7 @@ void DIMENSION_EDITOR_DIALOG::OnOkClick( wxCommandEvent& event ) } -static void AbortMoveDimension( EDA_DRAW_PANEL* Panel, wxDC* aDC ) +static void AbortBuildDimension( EDA_DRAW_PANEL* Panel, wxDC* aDC ) { DIMENSION* Dimension = (DIMENSION*) Panel->GetScreen()->GetCurItem(); @@ -275,7 +264,7 @@ DIMENSION* PCB_EDIT_FRAME::EditDimension( DIMENSION* aDimension, wxDC* aDC ) aDimension->Draw( DrawPanel, aDC, GR_XOR ); - DrawPanel->SetMouseCapture( MoveDimension, AbortMoveDimension ); + DrawPanel->SetMouseCapture( BuildDimension, AbortBuildDimension ); return aDimension; } @@ -302,7 +291,7 @@ DIMENSION* PCB_EDIT_FRAME::EditDimension( DIMENSION* aDimension, wxDC* aDC ) } -static void MoveDimension( EDA_DRAW_PANEL* aPanel, wxDC* aDC, +static void BuildDimension( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, bool aErase ) { PCB_SCREEN* screen = (PCB_SCREEN*) aPanel->GetScreen(); @@ -360,7 +349,7 @@ void PCB_EDIT_FRAME::ShowDimensionPropertyDialog( DIMENSION* aDimension, wxDC* a if( aDimension == NULL ) return; - DIMENSION_EDITOR_DIALOG* frame = new DIMENSION_EDITOR_DIALOG( this, aDimension, aDC ); + DIALOG_DIMENSION_EDITOR* frame = new DIALOG_DIMENSION_EDITOR( this, aDimension, aDC ); frame->ShowModal(); frame->Destroy(); } @@ -378,3 +367,86 @@ void PCB_EDIT_FRAME::DeleteDimension( DIMENSION* aDimension, wxDC* aDC ) aDimension->UnLink(); OnModify(); } + +/* Initialize parameters to move a pcb text + */ +static wxPoint initialTextPosition; +void PCB_EDIT_FRAME::BeginMoveDimensionText( DIMENSION* aItem, wxDC* DC ) +{ + if( aItem == NULL ) + return; + + // Store the initial position for undo/abort command + initialTextPosition = aItem->m_Text->m_Pos; + + aItem->Draw( DrawPanel, DC, GR_XOR ); + aItem->m_Flags |= IS_MOVED; + aItem->DisplayInfo( this ); + + GetScreen()->SetCrossHairPosition( aItem->m_Text->m_Pos ); + DrawPanel->MoveCursorToCrossHair(); + + DrawPanel->SetMouseCapture( MoveDimensionText, AbortMoveDimensionText ); + SetCurItem( aItem ); + DrawPanel->m_mouseCaptureCallback( DrawPanel, DC, wxDefaultPosition, false ); +} + + +/* Move dimension text following the cursor. */ +static void MoveDimensionText( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, + bool aErase ) +{ + DIMENSION* dimension = (DIMENSION*) aPanel->GetScreen()->GetCurItem(); + + if( dimension == NULL ) + return; + + if( aErase ) + dimension->Draw( aPanel, aDC, GR_XOR ); + + dimension->m_Text->m_Pos = aPanel->GetScreen()->GetCrossHairPosition(); + + dimension->Draw( aPanel, aDC, GR_XOR ); +} + +/* + * Abort current text edit progress. + * + * If a text is selected, its initial coord are regenerated + */ +void AbortMoveDimensionText( EDA_DRAW_PANEL* aPanel, wxDC* aDC ) +{ + DIMENSION* dimension = (DIMENSION*) aPanel->GetScreen()->GetCurItem(); + ( (PCB_EDIT_FRAME*) aPanel->GetParent() )->SetCurItem( NULL ); + + aPanel->SetMouseCapture( NULL, NULL ); + + if( dimension == NULL ) // Should not occur + return; + + dimension->Draw( aPanel, aDC, GR_XOR ); + dimension->m_Text->m_Pos = initialTextPosition; + dimension->m_Flags = 0; + dimension->Draw( aPanel, aDC, GR_OR ); +} + +/* + * Place the current dimension text being moving + */ +void PCB_EDIT_FRAME::PlaceDimensionText( DIMENSION* aItem, wxDC* DC ) +{ + DrawPanel->SetMouseCapture( NULL, NULL ); + SetCurItem( NULL ); + + if( aItem == NULL ) + return; + + aItem->Draw( DrawPanel, DC, GR_OR ); + OnModify(); + + EXCHG( aItem->m_Text->m_Pos, initialTextPosition ); + SaveCopyInUndoList( aItem, UR_CHANGED ); + EXCHG( aItem->m_Text->m_Pos, initialTextPosition ); + + aItem->m_Flags = 0; +} diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp index e359b11ec1..73897738cb 100644 --- a/pcbnew/edit.cpp +++ b/pcbnew/edit.cpp @@ -55,9 +55,6 @@ // Uncomment following line to enable wxBell() command (which beeps speaker) // #include -static void Process_Move_Item( PCB_EDIT_FRAME* frame, EDA_ITEM* DrawStruct, wxDC* DC ); - - /* Handles the selection of command events. */ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) { @@ -142,6 +139,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_COPY_BLOCK: case ID_POPUP_PCB_EDIT_DRAWING: case ID_POPUP_PCB_GETINFO_MARKER: + case ID_POPUP_PCB_MOVE_TEXT_DIMENSION_REQUEST: break; case ID_POPUP_CANCEL_CURRENT_COMMAND: @@ -574,7 +572,7 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_PCB_MOVE_TEXTEPCB_REQUEST: - Process_Move_Item( this, GetCurItem(), &dc ); + StartMoveTextePcb( (TEXTE_PCB*) GetCurItem(), &dc ); DrawPanel->m_AutoPAN_Request = true; break; @@ -938,6 +936,10 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) DrawPanel->MoveCursorToCrossHair(); break; + case ID_POPUP_PCB_MOVE_TEXT_DIMENSION_REQUEST: + BeginMoveDimensionText( (DIMENSION*) GetCurItem(), &dc ); + break; + case ID_POPUP_PCB_DELETE_DRAWING: Delete_Segment_Edge( (DRAWSEGMENT*) GetCurItem(), &dc ); DrawPanel->MoveCursorToCrossHair(); @@ -1091,27 +1093,6 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) } -static void Process_Move_Item( PCB_EDIT_FRAME* frame, EDA_ITEM* DrawStruct, wxDC* DC ) -{ - if( DrawStruct == NULL ) - return; - - switch( DrawStruct->Type() ) - { - case PCB_TEXT_T: - frame->StartMoveTextePcb( (TEXTE_PCB*) DrawStruct, DC ); - break; - - default: - wxString msg; - msg.Printf( wxT( "PCB_EDIT_FRAME::Move_Item Error: Bad DrawType %d" ), - DrawStruct->Type() ); - DisplayError( frame, msg ); - break; - } -} - - void PCB_EDIT_FRAME::RemoveStruct( BOARD_ITEM* Item, wxDC* DC ) { if( Item == NULL ) diff --git a/pcbnew/hotkeys_board_editor.cpp b/pcbnew/hotkeys_board_editor.cpp index eb612a4c7e..76a8b6ed5c 100644 --- a/pcbnew/hotkeys_board_editor.cpp +++ b/pcbnew/hotkeys_board_editor.cpp @@ -878,6 +878,11 @@ bool PCB_EDIT_FRAME::OnHotkeyMoveItem( int aIdCommand ) break; + case PCB_DIMENSION_T: + if( aIdCommand == HK_MOVE_ITEM ) + evt_type = ID_POPUP_PCB_MOVE_TEXT_DIMENSION_REQUEST; + break; + default: break; } diff --git a/pcbnew/onleftclick.cpp b/pcbnew/onleftclick.cpp index c73dad502a..897d464993 100644 --- a/pcbnew/onleftclick.cpp +++ b/pcbnew/onleftclick.cpp @@ -119,7 +119,11 @@ void PCB_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition ) break; case PCB_DIMENSION_T: - // see above. + if( ! DrawStruct->IsNew() ) + { // We are moving the text of an existing dimension. Place it + PlaceDimensionText( (DIMENSION*) DrawStruct, aDC ); + exit = true; + } break; default: diff --git a/pcbnew/onrightclick.cpp b/pcbnew/onrightclick.cpp index 92fb54b6a3..761dbcda52 100644 --- a/pcbnew/onrightclick.cpp +++ b/pcbnew/onrightclick.cpp @@ -5,7 +5,6 @@ #include "fctsys.h" #include "class_drawpanel.h" -#include "confirm.h" #include "macros.h" #include "class_board.h" @@ -223,10 +222,14 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) msg = AddHotkeyName( _( "Edit Dimension" ), g_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM ); AddMenuItem( aPopMenu, ID_POPUP_PCB_EDIT_DIMENSION, msg, KiBitmap( edit_xpm ) ); + msg = AddHotkeyName( _( "Move Dimension Text" ), g_Board_Editor_Hokeys_Descr, + HK_MOVE_ITEM ); + AddMenuItem( aPopMenu, ID_POPUP_PCB_MOVE_TEXT_DIMENSION_REQUEST, + msg, KiBitmap( move_text_xpm ) ); + msg = AddHotkeyName( _( "Delete Dimension" ), g_Board_Editor_Hokeys_Descr, HK_DELETE ); AddMenuItem( aPopMenu, ID_POPUP_PCB_DELETE_DIMENSION, - _( "Delete Dimension" ), KiBitmap( delete_xpm ) ); + msg, KiBitmap( delete_xpm ) ); } - break; case PCB_TARGET_T: @@ -238,8 +241,9 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) msg = AddHotkeyName( _( "Edit Target" ), g_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM ); AddMenuItem( aPopMenu, ID_POPUP_PCB_EDIT_MIRE, msg, KiBitmap( edit_xpm ) ); + msg = AddHotkeyName( _( "Delete Target" ), g_Board_Editor_Hokeys_Descr, HK_DELETE ); AddMenuItem( aPopMenu, ID_POPUP_PCB_DELETE_MIRE, - _( "Delete Target" ), KiBitmap( delete_xpm ) ); + msg, KiBitmap( delete_xpm ) ); } break; @@ -250,14 +254,14 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) case PCB_T: msg.Printf( wxT( "PCB_EDIT_FRAME::OnRightClick() Error: unexpected DrawType %d" ), item->Type() ); - DisplayError( this, msg ); + wxMessageBox( msg ); SetCurItem( NULL ); break; default: msg.Printf( wxT( "PCB_EDIT_FRAME::OnRightClick() Error: unknown DrawType %d" ), item->Type() ); - DisplayError( this, msg ); + wxMessageBox( msg ); // Attempt to clear error (but should no occurs ) if( item->Type() >= MAX_STRUCT_TYPE_ID ) @@ -277,7 +281,7 @@ bool PCB_EDIT_FRAME::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) msg, KiBitmap( move_module_xpm ) ); } - /* Display context sensitive comands: */ + /* Display context sensitive commands: */ switch( GetToolId() ) { case ID_PCB_ZONES_BUTT: @@ -655,8 +659,9 @@ void PCB_EDIT_FRAME::createPopUpMenuForFootprints( MODULE* aModule, wxMenu* menu msg = AddHotkeyName( _( "Edit" ), g_Board_Editor_Hokeys_Descr, HK_EDIT_ITEM ); AddMenuItem( sub_menu_footprint, ID_POPUP_PCB_EDIT_MODULE, msg, KiBitmap( edit_module_xpm ) ); sub_menu_footprint->AppendSeparator(); + msg = AddHotkeyName( _( "Delete Module" ), g_Board_Editor_Hokeys_Descr, HK_DELETE ); AddMenuItem( sub_menu_footprint, ID_POPUP_PCB_DELETE_MODULE, - _( "Delete Module" ), KiBitmap( delete_module_xpm ) ); + msg, KiBitmap( delete_module_xpm ) ); } } @@ -724,9 +729,12 @@ void PCB_EDIT_FRAME::createPopUpMenuForFpPads( D_PAD* Pad, wxMenu* menu ) if( flags ) // Currently in edit, no others commands possible return; - GetBoard()->SetCurrentNetClass( Pad->GetNetClassName() ); - updateTraceWidthSelectBox(); - updateViaSizeSelectBox(); + if( GetBoard()->m_CurrentNetClassName != Pad->GetNetClassName() ) + { + GetBoard()->SetCurrentNetClass( Pad->GetNetClassName() ); + updateTraceWidthSelectBox(); + updateViaSizeSelectBox(); + } wxString msg = Pad->GetSelectMenuText(); @@ -798,7 +806,8 @@ void PCB_EDIT_FRAME::createPopUpMenuForTexts( TEXTE_PCB* Text, wxMenu* menu ) _( "Reset Size" ), KiBitmap( reset_text_xpm ) ); sub_menu_Text->AppendSeparator(); - AddMenuItem( sub_menu_Text, ID_POPUP_PCB_DELETE_TEXTEPCB, _( "Delete" ), KiBitmap( delete_text_xpm ) ); + msg = AddHotkeyName( _( "Delete" ), g_Board_Editor_Hokeys_Descr, HK_DELETE ); + AddMenuItem( sub_menu_Text, ID_POPUP_PCB_DELETE_TEXTEPCB, msg, KiBitmap( delete_text_xpm ) ); } diff --git a/pcbnew/pcbnew_id.h b/pcbnew/pcbnew_id.h index e891d0c42f..a321129ef2 100644 --- a/pcbnew/pcbnew_id.h +++ b/pcbnew/pcbnew_id.h @@ -100,7 +100,9 @@ enum pcbnew_ids ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_CURRENT_ZONE, ID_POPUP_PCB_DELETE_MARKER, + ID_POPUP_PCB_DELETE_DIMENSION, + ID_POPUP_PCB_MOVE_TEXT_DIMENSION_REQUEST, ID_POPUP_PCB_MOVE_MIRE_REQUEST, ID_POPUP_PCB_DELETE_MIRE, diff --git a/pcbnew/tool_pcb.cpp b/pcbnew/tool_pcb.cpp index dfec27be5e..cdce2950fa 100644 --- a/pcbnew/tool_pcb.cpp +++ b/pcbnew/tool_pcb.cpp @@ -586,6 +586,7 @@ void PCB_EDIT_FRAME::updateTraceWidthSelectBox() if( GetBoard()->m_TrackWidthSelector >= GetBoard()->m_TrackWidthList.size() ) GetBoard()->m_TrackWidthSelector = 0; + m_SelTrackWidthBox->SetSelection( GetBoard()->m_TrackWidthSelector ); } @@ -615,6 +616,7 @@ void PCB_EDIT_FRAME::updateViaSizeSelectBox() if( GetBoard()->m_ViaSizeSelector >= GetBoard()->m_ViasDimensionsList.size() ) GetBoard()->m_ViaSizeSelector = 0; + m_SelViaSizeBox->SetSelection( GetBoard()->m_ViaSizeSelector ); }