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 @@
+
+
+
+
+
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 );
}