Move Pin, Symbol Text and Symbol Anchor to modern toolset.

This commit is contained in:
Jeff Young 2019-05-07 19:49:53 +01:00
parent 2e4d948535
commit 469231ae15
21 changed files with 892 additions and 474 deletions

View File

@ -121,7 +121,6 @@ set ( EESCHEMA_LIBEDIT_SRCS
libedit/lib_edit_frame.cpp
libedit/libfield.cpp
libedit/menubar_libedit.cpp
libedit/pinedit.cpp
libedit/symbdraw.cpp
libedit/symbedit.cpp
libedit/toolbars_libedit.cpp
@ -234,8 +233,10 @@ set( EESCHEMA_SRCS
netlist_exporters/netlist_exporter_orcadpcb2.cpp
netlist_exporters/netlist_exporter_pspice.cpp
tools/lib_drawing_tools.cpp
tools/lib_pin_tool.cpp
tools/sch_actions.cpp
tools/sch_drawing_tool.cpp
tools/sch_drawing_tools.cpp
tools/sch_edit_tool.cpp
tools/sch_editor_control.cpp
tools/sch_inspection_tool.cpp

View File

@ -89,10 +89,10 @@ bool DIALOG_LIB_EDIT_TEXT::TransferDataToWindow()
}
else
{
m_textSize.SetValue( m_parent->m_textSize );
m_textSize.SetValue( m_parent->g_LastTextSize );
m_CommonUnit->SetValue( !m_parent->m_drawSpecificUnit );
m_CommonConvert->SetValue( !m_parent->m_drawSpecificConvert );
m_CommonUnit->SetValue( !m_parent->m_DrawSpecificUnit );
m_CommonConvert->SetValue( !m_parent->m_DrawSpecificConvert );
m_orientChoice->SetSelection( m_graphicText->GetTextAngle() == TEXT_ANGLE_HORIZ ? 0 : 1 );
}
@ -102,11 +102,11 @@ bool DIALOG_LIB_EDIT_TEXT::TransferDataToWindow()
bool DIALOG_LIB_EDIT_TEXT::TransferDataFromWindow()
{
m_parent->m_current_text_angle = m_orientChoice->GetSelection() ? TEXT_ANGLE_VERT
m_parent->g_LastTextAngle = m_orientChoice->GetSelection() ? TEXT_ANGLE_VERT
: TEXT_ANGLE_HORIZ;
m_parent->m_textSize = m_textSize.GetValue();
m_parent->m_drawSpecificConvert = !m_CommonConvert->GetValue();
m_parent->m_drawSpecificUnit = !m_CommonUnit->GetValue();
m_parent->g_LastTextSize = m_textSize.GetValue();
m_parent->m_DrawSpecificConvert = !m_CommonConvert->GetValue();
m_parent->m_DrawSpecificUnit = !m_CommonUnit->GetValue();
if( m_graphicText )
{
@ -116,15 +116,15 @@ bool DIALOG_LIB_EDIT_TEXT::TransferDataFromWindow()
m_graphicText->SetText( m_TextValue->GetValue() );
m_graphicText->SetPosition( wxPoint( m_posX.GetValue(), m_posY.GetValue() ) );
m_graphicText->SetTextSize( wxSize( m_parent->m_textSize, m_parent->m_textSize ) );
m_graphicText->SetTextAngle( m_parent->m_current_text_angle );
m_graphicText->SetTextSize( wxSize( m_parent->g_LastTextSize, m_parent->g_LastTextSize ) );
m_graphicText->SetTextAngle( m_parent->g_LastTextAngle );
if( m_parent->m_drawSpecificUnit )
if( m_parent->m_DrawSpecificUnit )
m_graphicText->SetUnit( m_parent->GetUnit() );
else
m_graphicText->SetUnit( 0 );
if( m_parent->m_drawSpecificConvert )
if( m_parent->m_DrawSpecificConvert )
m_graphicText->SetConvert( m_parent->GetConvert() );
else
m_graphicText->SetConvert( 0 );

View File

@ -69,17 +69,18 @@
#include <tools/sch_selection_tool.h>
#include <tools/sch_picker_tool.h>
#include <tools/sch_inspection_tool.h>
#include <tools/lib_pin_tool.h>
#include <tools/lib_drawing_tools.h>
#include <sch_view.h>
#include <sch_painter.h>
int LIB_EDIT_FRAME:: m_unit = 1;
int LIB_EDIT_FRAME:: m_convert = 1;
LIB_ITEM* LIB_EDIT_FRAME:: m_lastDrawItem = NULL;
bool LIB_EDIT_FRAME:: m_showDeMorgan = false;
int LIB_EDIT_FRAME:: m_textSize = -1;
double LIB_EDIT_FRAME:: m_current_text_angle = TEXT_ANGLE_HORIZ;
int LIB_EDIT_FRAME:: g_LastTextSize = -1;
double LIB_EDIT_FRAME:: g_LastTextAngle = TEXT_ANGLE_HORIZ;
int LIB_EDIT_FRAME:: m_drawLineWidth = 0;
// these values are overridden when reading the config
@ -205,8 +206,8 @@ LIB_EDIT_FRAME::LIB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
{
m_showAxis = true; // true to draw axis
SetShowDeMorgan( false );
m_drawSpecificConvert = true;
m_drawSpecificUnit = false;
m_DrawSpecificConvert = true;
m_DrawSpecificUnit = false;
m_hotkeysDescrList = g_Libedit_Hotkeys_Descr;
m_syncPinEdit = false;
m_repeatPinStep = DEFAULT_REPEAT_OFFSET_PIN;
@ -219,8 +220,8 @@ LIB_EDIT_FRAME::LIB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
m_libMgr = nullptr;
// Delayed initialization
if( m_textSize == -1 )
m_textSize = GetDefaultTextSize();
if( g_LastTextSize == -1 )
g_LastTextSize = GetDefaultTextSize();
// Initialize grid id to the default value 50 mils:
m_LastGridSizeId = ID_POPUP_GRID_LEVEL_50 - ID_POPUP_GRID_LEVEL_1000;
@ -337,6 +338,8 @@ void LIB_EDIT_FRAME::setupTools()
m_toolManager->RegisterTool( new SCH_SELECTION_TOOL );
m_toolManager->RegisterTool( new SCH_PICKER_TOOL );
m_toolManager->RegisterTool( new SCH_INSPECTION_TOOL );
m_toolManager->RegisterTool( new LIB_PIN_TOOL );
m_toolManager->RegisterTool( new LIB_DRAWING_TOOLS );
m_toolManager->InitTools();
// Run the selection tool, it is supposed to be always active
@ -1054,7 +1057,7 @@ void LIB_EDIT_FRAME::OnEditComponentProperties( wxCommandEvent& event )
// also set default edit options to the better value
// Usually if units are locked, graphic items are specific to each unit
// and if units are interchangeable, graphic items are common to units
m_drawSpecificUnit = GetCurPart()->UnitsLocked();
m_DrawSpecificUnit = GetCurPart()->UnitsLocked();
}
if( oldName != GetCurPart()->GetName() )
@ -1091,7 +1094,11 @@ void LIB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent )
switch( id )
{
case ID_NO_TOOL_SELECTED:
case ID_ZOOM_SELECTION:
case ID_LIBEDIT_PIN_BUTT:
case ID_LIBEDIT_BODY_TEXT_BUTT:
case ID_LIBEDIT_ANCHOR_ITEM_BUTT:
// moved to modern toolset
return;
default:
@ -1102,31 +1109,6 @@ void LIB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent )
switch( id )
{
case ID_NO_TOOL_SELECTED:
SetToolID( id, GetGalCanvas()->GetDefaultCursor(), wxEmptyString );
break;
case ID_LIBEDIT_PIN_BUTT:
if( part )
{
SetToolID( id, wxCURSOR_PENCIL, _( "Add pin" ) );
}
else
{
SetToolID( id, wxCURSOR_ARROW, _( "Set pin options" ) );
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
cmd.SetId( ID_LIBEDIT_EDIT_PIN );
GetEventHandler()->ProcessEvent( cmd );
SetNoToolSelected();
}
break;
case ID_LIBEDIT_BODY_TEXT_BUTT:
SetToolID( id, wxCURSOR_PENCIL, _( "Add text" ) );
break;
case ID_LIBEDIT_BODY_RECT_BUTT:
SetToolID( id, wxCURSOR_PENCIL, _( "Add rectangle" ) );
break;
@ -1143,10 +1125,6 @@ void LIB_EDIT_FRAME::OnSelectTool( wxCommandEvent& aEvent )
SetToolID( id, wxCURSOR_PENCIL, _( "Add line" ) );
break;
case ID_LIBEDIT_ANCHOR_ITEM_BUTT:
SetToolID( id, wxCURSOR_HAND, _( "Set anchor position" ) );
break;
case ID_LIBEDIT_IMPORT_BODY_BUTT:
SetToolID( id, GetGalCanvas()->GetDefaultCursor(), _( "Import" ) );
LoadOneSymbol();

View File

@ -57,17 +57,6 @@ class LIB_EDIT_FRAME : public SCH_BASE_FRAME
SYMBOL_TREE_PANE* m_treePane; ///< component search tree widget
LIB_MANAGER* m_libMgr; ///< manager taking care of temporary modificatoins
/** Convert of the item currently being drawn. */
bool m_drawSpecificConvert;
/**
* Specify which component parts the current draw item applies to.
*
* If true, the item being drawn or edited applies only to the selected
* part. Otherwise it applies to all parts in the component.
*/
bool m_drawSpecificUnit;
/**
* Set to true to not synchronize pins at the same position when editing
* symbols with multiple units or multiple body styles.
@ -116,12 +105,6 @@ class LIB_EDIT_FRAME : public SCH_BASE_FRAME
// these tools must left enabled
static bool m_showDeMorgan;
/// The current text size setting.
static int m_textSize;
/// Current text angle setting.
static double m_current_text_angle;
/// The default pin num text size setting.
static int m_textPinNumDefaultSize;
@ -136,10 +119,22 @@ class LIB_EDIT_FRAME : public SCH_BASE_FRAME
int m_defaultLibWidth;
friend class DIALOG_LIB_EDIT_TEXT;
public:
/** Convert of the item currently being drawn. */
bool m_DrawSpecificConvert;
/**
* Specify which component parts the current draw item applies to.
*
* If true, the item being drawn or edited applies only to the selected
* part. Otherwise it applies to all parts in the component.
*/
bool m_DrawSpecificUnit;
static int g_LastTextSize;
static double g_LastTextAngle;
public:
LIB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent );
~LIB_EDIT_FRAME();

View File

@ -707,7 +707,7 @@ void LIB_EDIT_FRAME::loadPart( const wxString& aAlias, const wxString& aLibrary,
// Optimize default edit options for this symbol
// Usually if units are locked, graphic items are specific to each unit
// and if units are interchangeable, graphic items are common to units
m_drawSpecificUnit = part->UnitsLocked() ? true : false;
m_DrawSpecificUnit = part->UnitsLocked() ? true : false;
LoadOneLibraryPartAux( alias, aLibrary, aUnit, 0 );
}

View File

@ -74,18 +74,10 @@ void LIB_EDIT_FRAME::OnLeftClick( wxDC* DC, const wxPoint& aPosition )
}
break;
case ID_LIBEDIT_PIN_BUTT:
if( no_item_edited )
CreatePin( DC );
else
PlacePin();
break;
case ID_LIBEDIT_BODY_LINE_BUTT:
case ID_LIBEDIT_BODY_ARC_BUTT:
case ID_LIBEDIT_BODY_CIRCLE_BUTT:
case ID_LIBEDIT_BODY_RECT_BUTT:
case ID_LIBEDIT_BODY_TEXT_BUTT:
if( no_item_edited )
SetDrawItem( CreateGraphicItem( part, DC ) );
else if( item )
@ -104,10 +96,10 @@ void LIB_EDIT_FRAME::OnLeftClick( wxDC* DC, const wxPoint& aPosition )
deleteItem( DC, item );
break;
case ID_LIBEDIT_BODY_TEXT_BUTT:
case ID_LIBEDIT_ANCHOR_ITEM_BUTT:
SaveCopyInUndoList( part );
PlaceAnchor();
SetNoToolSelected();
case ID_LIBEDIT_PIN_BUTT:
// Moved to modern toolset
break;
default:

View File

@ -63,8 +63,8 @@ void LIB_EDIT_FRAME::EditGraphicSymbol( wxDC* DC, LIB_ITEM* DrawItem )
// Init default values (used to create a new draw item)
m_drawLineWidth = dialog.GetWidth();
m_drawSpecificConvert = !dialog.GetApplyToAllConversions();
m_drawSpecificUnit = !dialog.GetApplyToAllUnits();
m_DrawSpecificConvert = !dialog.GetApplyToAllConversions();
m_DrawSpecificUnit = !dialog.GetApplyToAllUnits();
#if 0
/* TODO: see if m_drawFillStyle must retain the last fill option or not.
@ -80,12 +80,12 @@ void LIB_EDIT_FRAME::EditGraphicSymbol( wxDC* DC, LIB_ITEM* DrawItem )
if( !DrawItem->InEditMode() )
SaveCopyInUndoList( DrawItem->GetParent() );
if( m_drawSpecificUnit )
if( m_DrawSpecificUnit )
DrawItem->SetUnit( GetUnit() );
else
DrawItem->SetUnit( 0 );
if( m_drawSpecificConvert )
if( m_DrawSpecificConvert )
DrawItem->SetConvert( GetConvert() );
else
DrawItem->SetConvert( 0 );
@ -163,28 +163,7 @@ LIB_ITEM* LIB_EDIT_FRAME::CreateGraphicItem( LIB_PART* LibEntry, wxDC* DC )
break;
case ID_LIBEDIT_BODY_TEXT_BUTT:
{
LIB_TEXT* text = new LIB_TEXT( LibEntry );
text->SetTextSize( wxSize( m_textSize, m_textSize ) );
text->SetTextAngle( m_current_text_angle );
// Enter the graphic text info
m_canvas->SetIgnoreMouseEvents( true );
EditSymbolText( NULL, text );
m_canvas->SetIgnoreMouseEvents( false );
m_canvas->MoveCursorToCrossHair();
if( text->GetText().IsEmpty() )
{
delete text;
item = NULL;
}
else
{
item = text;
}
}
// Moved to modern toolset
break;
default:
@ -203,10 +182,10 @@ LIB_ITEM* LIB_EDIT_FRAME::CreateGraphicItem( LIB_PART* LibEntry, wxDC* DC )
item->SetFillMode( m_drawFillStyle );
}
if( m_drawSpecificUnit )
if( m_DrawSpecificUnit )
item->SetUnit( m_unit );
if( m_drawSpecificConvert )
if( m_DrawSpecificConvert )
item->SetConvert( m_convert );
// Draw initial symbol:

View File

@ -23,11 +23,6 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file symbedit.cpp
* @brief Functions to load and save individual symbols.
*/
#include <fctsys.h>
#include <kiway.h>
#include <pgm_base.h>
@ -35,14 +30,14 @@
#include <confirm.h>
#include <kicad_string.h>
#include <gestfich.h>
#include <lib_pin.h>
#include <lib_edit_frame.h>
#include <class_libentry.h>
#include <wildcards_and_files_ext.h>
#include <sch_legacy_plugin.h>
#include <properties.h>
#include <view/view.h>
#include <dialogs/dialog_display_info_HTML_base.h>
void LIB_EDIT_FRAME::LoadOneSymbol()
{
@ -211,22 +206,147 @@ void LIB_EDIT_FRAME::SaveOneSymbol()
}
void LIB_EDIT_FRAME::PlaceAnchor()
// helper function to sort pins by pin num
bool sort_by_pin_number( const LIB_PIN* ref, const LIB_PIN* tst )
{
if( LIB_PART* part = GetCurPart() )
{
const wxPoint& cross_hair = GetCrossHairPosition();
// Use number as primary key
int test = ref->GetNumber().Cmp( tst->GetNumber() );
wxPoint offset( -cross_hair.x, cross_hair.y );
part->SetOffset( offset );
OnModify();
// Use DeMorgan variant as secondary key
if( test == 0 )
test = ref->GetConvert() - tst->GetConvert();
// Refresh the view without changing the viewport
auto view = GetGalCanvas()->GetView();
auto center = view->GetCenter();
center.x += offset.x;
center.y -= offset.y;
view->SetCenter( center );
view->RecacheAllItems();
}
// Use unit as tertiary key
if( test == 0 )
test = ref->GetUnit() - tst->GetUnit();
return test < 0;
}
void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
{
LIB_PART* part = GetCurPart();
if( !part )
return;
wxRealPoint curr_grid_size = GetScreen()->GetGridSize();
const int min_grid_size = 25;
const int grid_size = KiROUND( curr_grid_size.x );
const int clamped_grid_size = ( grid_size < min_grid_size ) ? min_grid_size : grid_size;
LIB_PINS pinList;
part->GetPins( pinList );
if( pinList.size() == 0 )
{
DisplayInfoMessage( this, _( "No pins!" ) );
return;
}
// Sort pins by pin num, so 2 duplicate pins
// (pins with the same number) will be consecutive in list
sort( pinList.begin(), pinList.end(), sort_by_pin_number );
// Test for duplicates:
DIALOG_DISPLAY_HTML_TEXT_BASE error_display( this, wxID_ANY,
_( "Marker Information" ),
wxDefaultPosition,
wxSize( 750, 600 ) );
int dup_error = 0;
for( unsigned ii = 1; ii < pinList.size(); ii++ )
{
LIB_PIN* curr_pin = pinList[ii];
LIB_PIN* pin = pinList[ii - 1];
if( pin->GetNumber() != curr_pin->GetNumber()
|| pin->GetConvert() != curr_pin->GetConvert() )
continue;
dup_error++;
/* TODO I dare someone to find a way to make happy translators on
this thing! Lorenzo */
wxString msg = wxString::Format( _(
"<b>Duplicate pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>"
" conflicts with pin %s \"%s\" at location <b>(%.3f, %.3f)</b>" ),
GetChars( curr_pin->GetNumber() ),
GetChars( curr_pin->GetName() ),
curr_pin->GetPosition().x / 1000.0,
-curr_pin->GetPosition().y / 1000.0,
GetChars( pin->GetNumber() ),
GetChars( pin->GetName() ),
pin->GetPosition().x / 1000.0,
-pin->GetPosition().y / 1000.0
);
if( part->GetUnitCount() > 1 )
{
msg += wxString::Format( _( " in units %c and %c" ),
'A' + curr_pin->GetUnit() - 1,
'A' + pin->GetUnit() - 1 );
}
if( m_showDeMorgan )
{
if( curr_pin->GetConvert() )
msg += _( " of converted" );
else
msg += _( " of normal" );
}
msg += wxT( ".<br>" );
error_display.m_htmlWindow->AppendToPage( msg );
}
// Test for off grid pins:
int offgrid_error = 0;
for( unsigned ii = 0; ii < pinList.size(); ii++ )
{
LIB_PIN* pin = pinList[ii];
if( ( (pin->GetPosition().x % clamped_grid_size) == 0 ) &&
( (pin->GetPosition().y % clamped_grid_size) == 0 ) )
continue;
// "pin" is off grid here.
offgrid_error++;
wxString msg = wxString::Format( _(
"<b>Off grid pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>" ),
GetChars( pin->GetNumber() ),
GetChars( pin->GetName() ),
pin->GetPosition().x / 1000.0,
-pin->GetPosition().y / 1000.0
);
if( part->GetUnitCount() > 1 )
{
msg += wxString::Format( _( " in symbol %c" ), 'A' + pin->GetUnit() - 1 );
}
if( m_showDeMorgan )
{
if( pin->GetConvert() )
msg += _( " of converted" );
else
msg += _( " of normal" );
}
msg += wxT( ".<br>" );
error_display.m_htmlWindow->AppendToPage( msg );
}
if( !dup_error && !offgrid_error )
DisplayInfoMessage( this, _( "No off grid or duplicate pins were found." ) );
else
error_display.ShowModal();
}

View File

@ -61,7 +61,7 @@
#include <tools/sch_actions.h>
#include <tools/sch_selection_tool.h>
#include <tools/sch_picker_tool.h>
#include <tools/sch_drawing_tool.h>
#include <tools/sch_drawing_tools.h>
#include <tools/sch_wire_bus_tool.h>
#include <tools/sch_move_tool.h>
#include <tools/sch_edit_tool.h>
@ -429,7 +429,7 @@ void SCH_EDIT_FRAME::setupTools()
m_toolManager->RegisterTool( new ZOOM_TOOL );
m_toolManager->RegisterTool( new SCH_SELECTION_TOOL );
m_toolManager->RegisterTool( new SCH_PICKER_TOOL );
m_toolManager->RegisterTool( new SCH_DRAWING_TOOL );
m_toolManager->RegisterTool( new SCH_DRAWING_TOOLS );
m_toolManager->RegisterTool( new SCH_WIRE_BUS_TOOL );
m_toolManager->RegisterTool( new SCH_MOVE_TOOL );
m_toolManager->RegisterTool( new SCH_EDIT_TOOL );

View File

@ -43,8 +43,6 @@
#include <sch_marker.h>
#include <bus_alias.h>
#include <../eeschema/general.h>
class LIB_PIN;
class SCH_COMPONENT;

View File

@ -0,0 +1,347 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "lib_drawing_tools.h"
#include "lib_pin_tool.h"
#include <sch_actions.h>
#include <lib_edit_frame.h>
#include <sch_view.h>
#include <class_draw_panel_gal.h>
#include <project.h>
#include <id.h>
#include <eeschema_id.h>
#include <confirm.h>
#include <view/view_group.h>
#include <view/view_controls.h>
#include <view/view.h>
#include <tool/tool_manager.h>
#include <tools/sch_selection_tool.h>
#include <hotkeys.h>
#include <class_libentry.h>
#include <bitmaps.h>
#include <lib_text.h>
#include <dialogs/dialog_lib_edit_text.h>
// Drawing tool actions
TOOL_ACTION SCH_ACTIONS::placeSymbolPin( "libedit.InteractiveDrawing.placeSymbolPin",
AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_LIBEDIT_CREATE_PIN ),
_( "Add Pin" ), _( "Add a pin" ),
pin_xpm, AF_ACTIVATE );
TOOL_ACTION SCH_ACTIONS::placeSymbolText( "libedit.InteractiveDrawing.placeSymbolText",
AS_GLOBAL, 0,
_( "Add Text" ), _( "Add a text item" ),
text_xpm, AF_ACTIVATE );
TOOL_ACTION SCH_ACTIONS::drawSymbolRectangle( "libedit.InteractiveDrawing.drawSymbolRectangle",
AS_GLOBAL, 0,
_( "Add Rectangle" ), _( "Add a rectangle" ),
add_rectangle_xpm, AF_ACTIVATE );
TOOL_ACTION SCH_ACTIONS::drawSymbolCircle( "libedit.InteractiveDrawing.drawSymbolCircle",
AS_GLOBAL, 0,
_( "Add Circle" ), _( "Add a circle" ),
add_circle_xpm, AF_ACTIVATE );
TOOL_ACTION SCH_ACTIONS::drawSymbolArc( "libedit.InteractiveDrawing.drawSymbolArc",
AS_GLOBAL, 0,
_( "Add Arc" ), _( "Add an arc" ),
add_circle_xpm, AF_ACTIVATE );
TOOL_ACTION SCH_ACTIONS::drawSymbolLines( "libedit.InteractiveDrawing.drawSymbolLines",
AS_GLOBAL, 0,
_( "Add Lines" ), _( "Add connected graphic lines" ),
add_circle_xpm, AF_ACTIVATE );
TOOL_ACTION SCH_ACTIONS::placeSymbolAnchor( "libedit.InteractiveDrawing.placeSymbolAnchor",
AS_GLOBAL, 0,
_( "Move symbol anchor" ), _( "Specify a new location for the symobl anchor" ),
anchor_xpm, AF_ACTIVATE );
LIB_DRAWING_TOOLS::LIB_DRAWING_TOOLS() :
TOOL_INTERACTIVE( "libedit.InteractiveDrawing" ),
m_selectionTool( nullptr ),
m_view( nullptr ),
m_controls( nullptr ),
m_frame( nullptr ),
m_menu( *this )
{
}
LIB_DRAWING_TOOLS::~LIB_DRAWING_TOOLS()
{
}
bool LIB_DRAWING_TOOLS::Init()
{
m_frame = getEditFrame<LIB_EDIT_FRAME>();
m_selectionTool = m_toolMgr->GetTool<SCH_SELECTION_TOOL>();
auto activeTool = [ this ] ( const SELECTION& aSel ) {
return ( m_frame->GetToolId() != ID_NO_TOOL_SELECTED );
};
auto& ctxMenu = m_menu.GetMenu();
//
// Build the drawing tool menu
//
ctxMenu.AddItem( ACTIONS::cancelInteractive, activeTool, 1 );
ctxMenu.AddSeparator( activeTool, 1000 );
m_menu.AddStandardSubMenus( m_frame );
return true;
}
void LIB_DRAWING_TOOLS::Reset( RESET_REASON aReason )
{
// Init variables used by every drawing tool
m_view = static_cast<KIGFX::SCH_VIEW*>( getView() );
m_controls = getViewControls();
m_frame = getEditFrame<LIB_EDIT_FRAME>();
}
int LIB_DRAWING_TOOLS::PlacePin( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_LIBEDIT_PIN_BUTT, wxCURSOR_PENCIL, _( "Add pin" ) );
return doTwoClickPlace( LIB_PIN_T );
}
int LIB_DRAWING_TOOLS::PlaceText( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_LIBEDIT_BODY_TEXT_BUTT, wxCURSOR_PENCIL, _( "Add text" ) );
return doTwoClickPlace( LIB_TEXT_T );
}
int LIB_DRAWING_TOOLS::doTwoClickPlace( KICAD_T aType )
{
VECTOR2I cursorPos = m_controls->GetCursorPosition();
EDA_ITEM* item = nullptr;
m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true );
m_controls->ShowCursor( true );
Activate();
// Main loop: keep receiving events
while( OPT_TOOL_EVENT evt = Wait() )
{
cursorPos = m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) );
if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{
if( item )
{
m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true );
m_view->ClearPreview();
delete item;
item = nullptr;
if( !evt->IsActivate() )
continue;
}
break;
}
else if( evt->IsClick( BUT_LEFT ) )
{
LIB_PART* part = m_frame->GetCurPart();
if( !part )
continue;
// First click creates...
if( !item )
{
m_frame->GetCanvas()->SetIgnoreMouseEvents( true );
switch( aType )
{
case LIB_PIN_T:
{
LIB_PIN_TOOL* pinTool = m_toolMgr->GetTool<LIB_PIN_TOOL>();
item = pinTool->CreatePin( wxPoint( cursorPos.x, -cursorPos.y), part );
break;
}
case LIB_TEXT_T:
{
LIB_TEXT* text = new LIB_TEXT( part );
text->SetPosition( wxPoint( cursorPos.x, -cursorPos.y) );
text->SetTextSize( wxSize( m_frame->g_LastTextSize, m_frame->g_LastTextSize ) );
text->SetTextAngle( m_frame->g_LastTextAngle );
DIALOG_LIB_EDIT_TEXT dlg( m_frame, text );
if( dlg.ShowModal() != wxID_OK )
delete text;
else
item = text;
break;
}
default:
wxFAIL_MSG( "doTwoClickPlace(): unknown type" );
}
m_frame->GetCanvas()->SetIgnoreMouseEvents( false );
// Restore cursor after dialog
m_frame->GetCanvas()->MoveCursorToCrossHair();
if( item )
{
item->SetFlags( IS_NEW | IS_MOVED );
m_view->ClearPreview();
m_view->AddToPreview( item->Clone() );
m_selectionTool->AddItemToSel( item );
}
m_controls->SetCursorPosition( cursorPos, false );
}
// ... and second click places:
else
{
m_frame->SaveCopyInUndoList( part );
part->AddDrawItem( (LIB_ITEM*) item );
item->ClearFlags( item->GetEditFlags() );
m_frame->SetDrawItem( nullptr );
item = nullptr;
m_view->ClearPreview();
m_frame->RebuildView();
m_frame->OnModify();
}
}
else if( evt->IsClick( BUT_RIGHT ) )
{
// Warp after context menu only if dragging...
if( !item )
m_toolMgr->VetoContextMenuMouseWarp();
m_menu.ShowContextMenu( m_selectionTool->GetSelection() );
}
else if( TOOL_EVT_UTILS::IsSelectionEvent( evt.get() ) )
{
// This happens if our text was replaced out from under us by ConvertTextType()
SELECTION& selection = m_selectionTool->GetSelection();
if( selection.GetSize() == 1 )
{
item = (LIB_ITEM*) selection.Front();
m_view->ClearPreview();
m_view->AddToPreview( item->Clone() );
}
else
item = nullptr;
}
else if( item && ( evt->IsAction( &SCH_ACTIONS::refreshPreview ) || evt->IsMotion() ) )
{
static_cast<LIB_ITEM*>( item )->SetPosition( wxPoint( cursorPos.x, -cursorPos.y) );
m_view->ClearPreview();
m_view->AddToPreview( item->Clone() );
}
// Enable autopanning and cursor capture only when there is a module to be placed
m_controls->SetAutoPan( !!item );
m_controls->CaptureCursor( !!item );
}
m_frame->SetNoToolSelected();
return 0;
}
int LIB_DRAWING_TOOLS::PlaceAnchor( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_LIBEDIT_ANCHOR_ITEM_BUTT, wxCURSOR_PENCIL, _( "Move symbol anchor" ) );
m_controls->ShowCursor( true );
m_controls->SetSnapping( true );
Activate();
// Main loop: keep receiving events
while( OPT_TOOL_EVENT evt = Wait() )
{
if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
{
break;
}
else if( evt->IsClick( BUT_LEFT ) )
{
LIB_PART* part = m_frame->GetCurPart();
if( !part )
continue;
VECTOR2I cursorPos = m_controls->GetCursorPosition( !evt->Modifier( MD_ALT ) );
wxPoint offset( -cursorPos.x, cursorPos.y );
part->SetOffset( offset );
// Refresh the view without changing the viewport
auto center = m_view->GetCenter();
center.x += offset.x;
center.y -= offset.y;
m_view->SetCenter( center );
m_view->RecacheAllItems();
m_frame->OnModify();
}
else if( evt->IsClick( BUT_RIGHT ) )
{
SELECTION emptySelection;
m_menu.ShowContextMenu( emptySelection );
}
}
m_frame->SetNoToolSelected();
return 0;
}
void LIB_DRAWING_TOOLS::setTransitions()
{
Go( &LIB_DRAWING_TOOLS::PlacePin, SCH_ACTIONS::placeSymbolPin.MakeEvent() );
Go( &LIB_DRAWING_TOOLS::PlaceText, SCH_ACTIONS::placeSymbolText.MakeEvent() );
// Go( &LIB_DRAWING_TOOLS::DrawRectangle, SCH_ACTIONS::drawSymbolRectangle.MakeEvent() );
// Go( &LIB_DRAWING_TOOLS::DrawCircle, SCH_ACTIONS::drawSymbolCircle.MakeEvent() );
// Go( &LIB_DRAWING_TOOLS::DrawArc, SCH_ACTIONS::drawSymbolArc.MakeEvent() );
// Go( &LIB_DRAWING_TOOLS::DrawLines, SCH_ACTIONS::drawSymbolLines.MakeEvent() );
Go( &LIB_DRAWING_TOOLS::PlaceAnchor, SCH_ACTIONS::placeSymbolAnchor.MakeEvent() );
}

View File

@ -0,0 +1,86 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef LIB_DRAWING_TOOLS_H
#define LIB_DRAWING_TOOLS_H
#include <tool/tool_interactive.h>
#include <tool/tool_menu.h>
#include <core/optional.h>
#include <sch_base_frame.h>
class LIB_EDIT_FRAME;
class SCH_SELECTION_TOOL;
/**
* Class LIB_DRAWING_TOOLS
*
* Tool responsible for drawing/placing items (body outlines, pins, etc.)
*/
class LIB_DRAWING_TOOLS : public TOOL_INTERACTIVE
{
public:
LIB_DRAWING_TOOLS();
~LIB_DRAWING_TOOLS();
/// @copydoc TOOL_INTERACTIVE::Init()
bool Init() override;
/// @copydoc TOOL_INTERACTIVE::Reset()
void Reset( RESET_REASON aReason ) override;
///> Get the SCH_DRAWING_TOOL top-level context menu
inline TOOL_MENU& GetToolMenu() { return m_menu; }
int PlacePin( const TOOL_EVENT& aEvent );
int PlaceText( const TOOL_EVENT& aEvent );
int DrawRectangle( const TOOL_EVENT& aEvent );
int DrawCircle( const TOOL_EVENT& aEvent );
int DrawArc( const TOOL_EVENT& aEvent );
int DrawLines( const TOOL_EVENT& aEvent );
int PlaceAnchor( const TOOL_EVENT& aEvent );
private:
void createPin();
int doTwoClickPlace( KICAD_T aType );
int doSingleClickPlace( KICAD_T aType );
///> Sets up handlers for various events.
void setTransitions() override;
private:
SCH_SELECTION_TOOL* m_selectionTool;
KIGFX::SCH_VIEW* m_view;
KIGFX::VIEW_CONTROLS* m_controls;
LIB_EDIT_FRAME* m_frame;
TOOL_MENU m_menu;
};
#endif /* LIB_DRAWING_TOOLS_H */

View File

@ -1,9 +1,7 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2008-2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-2018 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -23,74 +21,91 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file pinedit.cpp
* @brief Eeschema pin edit code.
*/
#include <fctsys.h>
#include <gr_basic.h>
#include <sch_draw_panel.h>
#include <confirm.h>
#include <base_units.h>
#include <msgpanel.h>
#include <tool/tool_manager.h>
#include <tools/sch_selection_tool.h>
#include <lib_edit_frame.h>
#include <eeschema_id.h>
#include <class_libentry.h>
#include <lib_pin.h>
#include <general.h>
#include <confirm.h>
#include <../common/dialogs/dialog_display_info_HTML_base.h>
#include <dialog_lib_edit_pin.h>
#include <sch_view.h>
extern void IncrementLabelMember( wxString& name, int aIncrement );
#include <dialogs/dialog_display_info_HTML_base.h>
#include <dialogs/dialog_lib_edit_pin.h>
#include "lib_pin_tool.h"
static void AbortPinMove( EDA_DRAW_PANEL* Panel, wxDC* DC );
static void DrawMovePin( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPositon, bool aErase );
static wxPoint OldPos;
static ELECTRICAL_PINTYPE LastPinType = PIN_INPUT;
static int LastPinOrient = PIN_RIGHT;
static GRAPHIC_PINSHAPE LastPinShape = PINSHAPE_LINE;
static bool LastPinCommonConvert = false;
static bool LastPinCommonUnit = false;
static bool LastPinVisible = true;
static ELECTRICAL_PINTYPE g_LastPinType = PIN_INPUT;
static int g_LastPinOrient = PIN_RIGHT;
static GRAPHIC_PINSHAPE g_LastPinShape = PINSHAPE_LINE;
static bool g_LastPinCommonConvert = false;
static bool g_LastPinCommonUnit = false;
static bool g_LastPinVisible = true;
// The -1 is a non-valid value to trigger delayed initialization
static int LastPinLength = -1;
static int LastPinNameSize = -1;
static int LastPinNumSize = -1;
static int g_LastPinLength = -1;
static int g_LastPinNameSize = -1;
static int g_LastPinNumSize = -1;
static int GetLastPinLength()
{
if( LastPinLength == -1 )
LastPinLength = LIB_EDIT_FRAME::GetDefaultPinLength();
if( g_LastPinLength == -1 )
g_LastPinLength = LIB_EDIT_FRAME::GetDefaultPinLength();
return LastPinLength;
return g_LastPinLength;
}
static int GetLastPinNameSize()
{
if( LastPinNameSize == -1 )
LastPinNameSize = LIB_EDIT_FRAME::GetPinNameDefaultSize();
if( g_LastPinNameSize == -1 )
g_LastPinNameSize = LIB_EDIT_FRAME::GetPinNameDefaultSize();
return LastPinNameSize;
return g_LastPinNameSize;
}
static int GetLastPinNumSize()
{
if( LastPinNumSize == -1 )
LastPinNumSize = LIB_EDIT_FRAME::GetPinNumDefaultSize();
if( g_LastPinNumSize == -1 )
g_LastPinNumSize = LIB_EDIT_FRAME::GetPinNumDefaultSize();
return LastPinNumSize;
return g_LastPinNumSize;
}
extern void IncrementLabelMember( wxString& name, int aIncrement );
LIB_PIN_TOOL::LIB_PIN_TOOL() :
TOOL_INTERACTIVE( "eeschema.PinEditing" ),
m_selectionTool( nullptr ),
m_frame( nullptr )
{
}
LIB_PIN_TOOL::~LIB_PIN_TOOL()
{
}
bool LIB_PIN_TOOL::Init()
{
m_frame = getEditFrame<LIB_EDIT_FRAME>();
m_selectionTool = m_toolMgr->GetTool<SCH_SELECTION_TOOL>();
wxASSERT_MSG( m_selectionTool, "eeshema.InteractiveSelection tool is not available" );
return true;
}
void LIB_PIN_TOOL::Reset( RESET_REASON aReason )
{
if( aReason == MODEL_RELOAD )
{
// Init variables used by every drawing tool
m_frame = getEditFrame<LIB_EDIT_FRAME>();
}
}
void LIB_EDIT_FRAME::OnEditPin( wxCommandEvent& event )
{
if( GetDrawItem() == NULL || GetDrawItem()->Type() != LIB_PIN_T )
@ -131,17 +146,18 @@ void LIB_EDIT_FRAME::OnEditPin( wxCommandEvent& event )
pin->SetFlags( item_flags );
// Save the pin properties to use for the next new pin.
LastPinNameSize = pin->GetNameTextSize();
LastPinNumSize = pin->GetNumberTextSize();
LastPinOrient = pin->GetOrientation();
LastPinLength = pin->GetLength();
LastPinShape = pin->GetShape();
LastPinType = pin->GetType();
LastPinCommonConvert = pin->GetConvert() == 0;
LastPinCommonUnit = pin->GetUnit() == 0;
LastPinVisible = pin->IsVisible();
g_LastPinNameSize = pin->GetNameTextSize();
g_LastPinNumSize = pin->GetNumberTextSize();
g_LastPinOrient = pin->GetOrientation();
g_LastPinLength = pin->GetLength();
g_LastPinShape = pin->GetShape();
g_LastPinType = pin->GetType();
g_LastPinCommonConvert = pin->GetConvert() == 0;
g_LastPinCommonUnit = pin->GetUnit() == 0;
g_LastPinVisible = pin->IsVisible();
}
/**
* Clean up after aborting a move pin command.
*/
@ -150,7 +166,6 @@ static void AbortPinMove( EDA_DRAW_PANEL* aPanel, wxDC* DC )
LIB_EDIT_FRAME* parent = (LIB_EDIT_FRAME*) aPanel->GetParent();
auto panel = static_cast<SCH_DRAW_PANEL*>( aPanel );
if( parent == NULL )
return;
@ -246,9 +261,9 @@ void LIB_EDIT_FRAME::PlacePin()
if( cur_pin->IsNew() )
{
LastPinOrient = cur_pin->GetOrientation();
LastPinType = cur_pin->GetType();
LastPinShape = cur_pin->GetShape();
g_LastPinOrient = cur_pin->GetOrientation();
g_LastPinType = cur_pin->GetType();
g_LastPinShape = cur_pin->GetShape();
if( SynchronizePins() )
CreateImagePins( cur_pin );
@ -275,6 +290,34 @@ void LIB_EDIT_FRAME::PlacePin()
}
/* Move pin to the current mouse position. This function is called by the
* cursor management code. */
static void DrawMovePin( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
bool aErase )
{
LIB_EDIT_FRAME* parent = (LIB_EDIT_FRAME*) aPanel->GetParent();
if( parent == NULL )
return;
LIB_PIN* cur_pin = (LIB_PIN*) parent->GetDrawItem();
if( cur_pin == NULL || cur_pin->Type() != LIB_PIN_T )
return;
auto p = aPanel->GetParent()->GetCrossHairPosition( true );
// Redraw pin in new position
cur_pin->Move(p);
KIGFX::SCH_VIEW* view = parent->GetCanvas()->GetView();
view->Hide( cur_pin );
view->ClearPreview();
view->AddToPreview( cur_pin->Clone() );
}
void LIB_EDIT_FRAME::StartMovePin( LIB_ITEM* aItem )
{
LIB_PIN* cur_pin = (LIB_PIN*) aItem;
@ -314,84 +357,42 @@ void LIB_EDIT_FRAME::StartMovePin( LIB_ITEM* aItem )
}
/* Move pin to the current mouse position. This function is called by the
* cursor management code. */
static void DrawMovePin( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
bool aErase )
{
LIB_EDIT_FRAME* parent = (LIB_EDIT_FRAME*) aPanel->GetParent();
if( parent == NULL )
return;
LIB_PIN* cur_pin = (LIB_PIN*) parent->GetDrawItem();
if( cur_pin == NULL || cur_pin->Type() != LIB_PIN_T )
return;
auto p = aPanel->GetParent()->GetCrossHairPosition( true );
// Redraw pin in new position
cur_pin->Move(p);
auto view = parent->GetCanvas()->GetView();
view->Hide( cur_pin );
view->ClearPreview();
view->AddToPreview( cur_pin->Clone() );
}
/*
* Create a new pin.
*/
void LIB_EDIT_FRAME::CreatePin( wxDC* DC )
LIB_PIN* LIB_PIN_TOOL::CreatePin( const VECTOR2I& aPosition, LIB_PART* aPart )
{
LIB_PART* part = GetCurPart();
aPart->ClearStatus();
if( !part )
return;
part->ClearStatus();
LIB_PIN* pin = new LIB_PIN( part );
SetDrawItem( pin );
LIB_PIN* pin = new LIB_PIN( aPart );
pin->SetFlags( IS_NEW );
pin->SetUnit( m_unit );
pin->SetConvert( m_convert );
// Flag pins to consider
if( SynchronizePins() )
if( m_frame->SynchronizePins() )
pin->SetFlags( IS_LINKED );
pin->Move( GetCrossHairPosition( ) );
pin->Move( (wxPoint) aPosition );
pin->SetLength( GetLastPinLength() );
pin->SetOrientation( LastPinOrient );
pin->SetType( LastPinType );
pin->SetShape( LastPinShape );
pin->SetOrientation( g_LastPinOrient );
pin->SetType( g_LastPinType );
pin->SetShape( g_LastPinShape );
pin->SetNameTextSize( GetLastPinNameSize() );
pin->SetNumberTextSize( GetLastPinNumSize() );
pin->SetConvert( LastPinCommonConvert ? 0 : m_convert );
pin->SetUnit( LastPinCommonUnit ? 0 : m_unit );
pin->SetVisible( LastPinVisible );
m_canvas->SetIgnoreMouseEvents( true );
pin->SetConvert( g_LastPinCommonConvert ? 0 : m_frame->GetConvert() );
pin->SetUnit( g_LastPinCommonUnit ? 0 : m_frame->GetUnit() );
pin->SetVisible( g_LastPinVisible );
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
cmd.SetId( ID_LIBEDIT_EDIT_PIN );
GetEventHandler()->ProcessEvent( cmd );
m_canvas->MoveCursorToCrossHair();
m_canvas->SetIgnoreMouseEvents( false );
m_frame->OnEditPin( cmd );
if( pin->GetFlags() & IS_CANCELLED )
{
deleteItem( DC, pin );
}
else
{
ClearTempCopyComponent();
m_canvas->SetMouseCapture( DrawMovePin, AbortPinMove );
delete pin;
pin = nullptr;
}
return pin;
}
@ -513,21 +514,10 @@ void LIB_EDIT_FRAME::RepeatPinItem( wxDC* DC, LIB_PIN* SourcePin )
switch( pin->GetOrientation() )
{
case PIN_UP:
step.x = GetRepeatPinStep();
break;
case PIN_DOWN:
step.x = GetRepeatPinStep();
break;
case PIN_LEFT:
step.y = - GetRepeatPinStep();
break;
case PIN_RIGHT:
step.y = - GetRepeatPinStep();
break;
case PIN_UP: step.x = GetRepeatPinStep(); break;
case PIN_DOWN: step.x = GetRepeatPinStep(); break;
case PIN_LEFT: step.y = -GetRepeatPinStep(); break;
case PIN_RIGHT: step.y = -GetRepeatPinStep(); break;
}
pin->Move( pin->GetPosition() + step );
@ -568,148 +558,3 @@ void LIB_EDIT_FRAME::RepeatPinItem( wxDC* DC, LIB_PIN* SourcePin )
}
// helper function to sort pins by pin num
bool sort_by_pin_number( const LIB_PIN* ref, const LIB_PIN* tst )
{
int test = ref->GetNumber().Cmp( tst->GetNumber() );
if( test == 0 )
{
test = ref->GetConvert() - tst->GetConvert();
}
if( test == 0 )
{
test = ref->GetUnit() - tst->GetUnit();
}
return test < 0;
}
void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
{
LIB_PART* part = GetCurPart();
if( !part )
return;
wxRealPoint curr_grid_size = GetScreen()->GetGridSize();
const int min_grid_size = 25;
const int grid_size = KiROUND( curr_grid_size.x );
const int clamped_grid_size = ( grid_size < min_grid_size ) ? min_grid_size : grid_size;
LIB_PINS pinList;
part->GetPins( pinList );
if( pinList.size() == 0 )
{
DisplayInfoMessage( this, _( "No pins!" ) );
return;
}
// Sort pins by pin num, so 2 duplicate pins
// (pins with the same number) will be consecutive in list
sort( pinList.begin(), pinList.end(), sort_by_pin_number );
// Test for duplicates:
DIALOG_DISPLAY_HTML_TEXT_BASE error_display( this, wxID_ANY,
_( "Marker Information" ),
wxDefaultPosition,
wxSize( 750, 600 ) );
int dup_error = 0;
for( unsigned ii = 1; ii < pinList.size(); ii++ )
{
LIB_PIN* curr_pin = pinList[ii];
LIB_PIN* pin = pinList[ii - 1];
if( pin->GetNumber() != curr_pin->GetNumber()
|| pin->GetConvert() != curr_pin->GetConvert() )
continue;
dup_error++;
/* TODO I dare someone to find a way to make happy translators on
this thing! Lorenzo */
wxString msg = wxString::Format( _(
"<b>Duplicate pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>"
" conflicts with pin %s \"%s\" at location <b>(%.3f, %.3f)</b>" ),
GetChars( curr_pin->GetNumber() ),
GetChars( curr_pin->GetName() ),
curr_pin->GetPosition().x / 1000.0,
-curr_pin->GetPosition().y / 1000.0,
GetChars( pin->GetNumber() ),
GetChars( pin->GetName() ),
pin->GetPosition().x / 1000.0,
-pin->GetPosition().y / 1000.0
);
if( part->GetUnitCount() > 1 )
{
msg += wxString::Format( _( " in units %c and %c" ),
'A' + curr_pin->GetUnit() - 1,
'A' + pin->GetUnit() - 1 );
}
if( m_showDeMorgan )
{
if( curr_pin->GetConvert() )
msg += _( " of converted" );
else
msg += _( " of normal" );
}
msg += wxT( ".<br>" );
error_display.m_htmlWindow->AppendToPage( msg );
}
// Test for off grid pins:
int offgrid_error = 0;
for( unsigned ii = 0; ii < pinList.size(); ii++ )
{
LIB_PIN* pin = pinList[ii];
if( ( (pin->GetPosition().x % clamped_grid_size) == 0 ) &&
( (pin->GetPosition().y % clamped_grid_size) == 0 ) )
continue;
// "pin" is off grid here.
offgrid_error++;
wxString msg = wxString::Format( _(
"<b>Off grid pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>" ),
GetChars( pin->GetNumber() ),
GetChars( pin->GetName() ),
pin->GetPosition().x / 1000.0,
-pin->GetPosition().y / 1000.0
);
if( part->GetUnitCount() > 1 )
{
msg += wxString::Format( _( " in symbol %c" ), 'A' + pin->GetUnit() - 1 );
}
if( m_showDeMorgan )
{
if( pin->GetConvert() )
msg += _( " of converted" );
else
msg += _( " of normal" );
}
msg += wxT( ".<br>" );
error_display.m_htmlWindow->AppendToPage( msg );
}
if( !dup_error && !offgrid_error )
DisplayInfoMessage( this, _( "No off grid or duplicate pins were found." ) );
else
error_display.ShowModal();
}

View File

@ -0,0 +1,59 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef KICAD_LIB_PIN_TOOL_H
#define KICAD_LIB_PIN_TOOL_H
#include <tool/tool_interactive.h>
#include <tool/tool_menu.h>
#include <sch_base_frame.h>
class LIB_EDIT_FRAME;
class SCH_SELECTION_TOOL;
class LIB_PIN_TOOL : public TOOL_INTERACTIVE
{
public:
LIB_PIN_TOOL();
~LIB_PIN_TOOL();
/// @copydoc TOOL_INTERACTIVE::Init()
bool Init() override;
/// @copydoc TOOL_INTERACTIVE::Reset()
void Reset( RESET_REASON aReason ) override;
LIB_PIN* CreatePin( const VECTOR2I& aPosition, LIB_PART* aPart );
private:
///> Sets up handlers for various events.
void setTransitions() override { }
private:
SCH_SELECTION_TOOL* m_selectionTool;
LIB_EDIT_FRAME* m_frame;
};
#endif //KICAD_LIB_PIN_TOOL_H

View File

@ -213,6 +213,15 @@ OPT<TOOL_EVENT> SCH_ACTIONS::TranslateLegacyId( int aId )
case ID_MOUSE_DOUBLECLICK:
return SCH_ACTIONS::cursorDblClick.MakeEvent();
case ID_LIBEDIT_PIN_BUTT:
return SCH_ACTIONS::placeSymbolPin.MakeEvent();
case ID_LIBEDIT_BODY_TEXT_BUTT:
return SCH_ACTIONS::placeSymbolText.MakeEvent();
case ID_LIBEDIT_ANCHOR_ITEM_BUTT:
return SCH_ACTIONS::placeSymbolAnchor.MakeEvent();
}
return OPT<TOOL_EVENT>();

View File

@ -72,7 +72,7 @@ public:
static TOOL_ACTION lock;
static TOOL_ACTION unlock;
// Tools
// Schematic Tools
static TOOL_ACTION selectionTool;
static TOOL_ACTION pickerTool;
static TOOL_ACTION placeSymbol;
@ -103,6 +103,15 @@ public:
static TOOL_ACTION finishLine;
static TOOL_ACTION finishSheet;
// Symbol Tools
static TOOL_ACTION placeSymbolPin;
static TOOL_ACTION placeSymbolText;
static TOOL_ACTION drawSymbolRectangle;
static TOOL_ACTION drawSymbolCircle;
static TOOL_ACTION drawSymbolArc;
static TOOL_ACTION drawSymbolLines;
static TOOL_ACTION placeSymbolAnchor;
// Editing
static TOOL_ACTION move;
static TOOL_ACTION drag;

View File

@ -21,7 +21,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "sch_drawing_tool.h"
#include "sch_drawing_tools.h"
#include "sch_selection_tool.h"
#include <sch_actions.h>
@ -140,7 +140,7 @@ TOOL_ACTION SCH_ACTIONS::addHierLabel( "eeschema.InteractiveEditing.addHierLabel
add_hierarchical_label_xpm, AF_NONE );
SCH_DRAWING_TOOL::SCH_DRAWING_TOOL() :
SCH_DRAWING_TOOLS::SCH_DRAWING_TOOLS() :
TOOL_INTERACTIVE( "eeschema.InteractiveDrawing" ),
m_selectionTool( nullptr ),
m_view( nullptr ),
@ -151,12 +151,12 @@ SCH_DRAWING_TOOL::SCH_DRAWING_TOOL() :
};
SCH_DRAWING_TOOL::~SCH_DRAWING_TOOL()
SCH_DRAWING_TOOLS::~SCH_DRAWING_TOOLS()
{
}
bool SCH_DRAWING_TOOL::Init()
bool SCH_DRAWING_TOOLS::Init()
{
m_frame = getEditFrame<SCH_EDIT_FRAME>();
m_selectionTool = m_toolMgr->GetTool<SCH_SELECTION_TOOL>();
@ -184,7 +184,7 @@ bool SCH_DRAWING_TOOL::Init()
}
void SCH_DRAWING_TOOL::Reset( RESET_REASON aReason )
void SCH_DRAWING_TOOLS::Reset( RESET_REASON aReason )
{
// Init variables used by every drawing tool
m_view = static_cast<KIGFX::SCH_VIEW*>( getView() );
@ -193,7 +193,7 @@ void SCH_DRAWING_TOOL::Reset( RESET_REASON aReason )
}
int SCH_DRAWING_TOOL::AddJunction( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::AddJunction( const TOOL_EVENT& aEvent )
{
m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true );
@ -204,7 +204,7 @@ int SCH_DRAWING_TOOL::AddJunction( const TOOL_EVENT& aEvent )
}
int SCH_DRAWING_TOOL::AddLabel( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::AddLabel( const TOOL_EVENT& aEvent )
{
m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true );
@ -229,7 +229,7 @@ static SCH_BASE_FRAME::HISTORY_LIST s_SymbolHistoryList;
static SCH_BASE_FRAME::HISTORY_LIST s_PowerHistoryList;
int SCH_DRAWING_TOOL::PlaceSymbol( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceSymbol( const TOOL_EVENT& aEvent )
{
SCH_COMPONENT* component = aEvent.Parameter<SCH_COMPONENT*>();
@ -239,7 +239,7 @@ int SCH_DRAWING_TOOL::PlaceSymbol( const TOOL_EVENT& aEvent )
}
int SCH_DRAWING_TOOL::PlacePower( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlacePower( const TOOL_EVENT& aEvent )
{
SCH_COMPONENT* component = aEvent.Parameter<SCH_COMPONENT*>();
SCHLIB_FILTER filter;
@ -251,7 +251,7 @@ int SCH_DRAWING_TOOL::PlacePower( const TOOL_EVENT& aEvent )
}
int SCH_DRAWING_TOOL::doPlaceComponent( SCH_COMPONENT* aComponent, SCHLIB_FILTER* aFilter,
int SCH_DRAWING_TOOLS::doPlaceComponent( SCH_COMPONENT* aComponent, SCHLIB_FILTER* aFilter,
SCH_BASE_FRAME::HISTORY_LIST aHistoryList )
{
VECTOR2I cursorPos = m_controls->GetCursorPosition();
@ -377,7 +377,7 @@ int SCH_DRAWING_TOOL::doPlaceComponent( SCH_COMPONENT* aComponent, SCHLIB_FILTER
}
int SCH_DRAWING_TOOL::PlaceImage( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceImage( const TOOL_EVENT& aEvent )
{
SCH_BITMAP* image = aEvent.Parameter<SCH_BITMAP*>();
@ -495,35 +495,35 @@ int SCH_DRAWING_TOOL::PlaceImage( const TOOL_EVENT& aEvent )
}
int SCH_DRAWING_TOOL::PlaceNoConnect( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceNoConnect( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_NOCONN_BUTT, wxCURSOR_PENCIL, _( "Add no connect" ) );
return doSingleClickPlace( SCH_NO_CONNECT_T );
}
int SCH_DRAWING_TOOL::PlaceJunction( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceJunction( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_JUNCTION_BUTT, wxCURSOR_PENCIL, _( "Add junction" ) );
return doSingleClickPlace( SCH_JUNCTION_T );
}
int SCH_DRAWING_TOOL::PlaceBusWireEntry( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceBusWireEntry( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_WIRETOBUS_ENTRY_BUTT, wxCURSOR_PENCIL, _( "Add wire to bus entry" ) );
return doSingleClickPlace( SCH_BUS_WIRE_ENTRY_T );
}
int SCH_DRAWING_TOOL::PlaceBusBusEntry( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceBusBusEntry( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_BUSTOBUS_ENTRY_BUTT, wxCURSOR_PENCIL, _( "Add bus to bus entry" ) );
return doSingleClickPlace( SCH_BUS_BUS_ENTRY_T );
}
int SCH_DRAWING_TOOL::doSingleClickPlace( KICAD_T aType )
int SCH_DRAWING_TOOLS::doSingleClickPlace( KICAD_T aType )
{
m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true );
m_controls->ShowCursor( true );
@ -591,49 +591,49 @@ int SCH_DRAWING_TOOL::doSingleClickPlace( KICAD_T aType )
}
int SCH_DRAWING_TOOL::PlaceLabel( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceLabel( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_LABEL_BUTT, wxCURSOR_PENCIL, _( "Add net label" ) );
return doTwoClickPlace( SCH_LABEL_T );
}
int SCH_DRAWING_TOOL::PlaceGlobalLabel( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceGlobalLabel( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_GLOBALLABEL_BUTT, wxCURSOR_PENCIL, _( "Add global label" ) );
return doTwoClickPlace( SCH_GLOBAL_LABEL_T );
}
int SCH_DRAWING_TOOL::PlaceHierarchicalLabel( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceHierarchicalLabel( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_HIERLABEL_BUTT, wxCURSOR_PENCIL, _( "Add hierarchical label" ) );
return doTwoClickPlace( SCH_HIER_LABEL_T );
}
int SCH_DRAWING_TOOL::PlaceSheetPin( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceSheetPin( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_SHEET_PIN_BUTT, wxCURSOR_PENCIL, _( "Add sheet pins" ) );
return doTwoClickPlace( SCH_SHEET_PIN_T );
}
int SCH_DRAWING_TOOL::ImportSheetPin( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::ImportSheetPin( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_IMPORT_HLABEL_BUTT, wxCURSOR_PENCIL, _( "Import sheet pins" ) );
return doTwoClickPlace( SCH_SHEET_PIN_T );
}
int SCH_DRAWING_TOOL::PlaceSchematicText( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::PlaceSchematicText( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_TEXT_COMMENT_BUTT, wxCURSOR_PENCIL, _( "Add text" ) );
return doTwoClickPlace( SCH_TEXT_T );
}
int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
int SCH_DRAWING_TOOLS::doTwoClickPlace( KICAD_T aType )
{
VECTOR2I cursorPos = m_controls->GetCursorPosition();
EDA_ITEM* item = nullptr;
@ -765,14 +765,14 @@ int SCH_DRAWING_TOOL::doTwoClickPlace( KICAD_T aType )
}
int SCH_DRAWING_TOOL::DrawSheet( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::DrawSheet( const TOOL_EVENT& aEvent )
{
m_frame->SetToolID( ID_SHEET_SYMBOL_BUTT, wxCURSOR_PENCIL, _( "Add sheet" ) );
return doDrawSheet( nullptr );
}
int SCH_DRAWING_TOOL::ResizeSheet( const TOOL_EVENT& aEvent )
int SCH_DRAWING_TOOLS::ResizeSheet( const TOOL_EVENT& aEvent )
{
SELECTION& selection = m_selectionTool->RequestSelection( SCH_COLLECTOR::SheetsOnly );
@ -788,7 +788,7 @@ int SCH_DRAWING_TOOL::ResizeSheet( const TOOL_EVENT& aEvent )
}
int SCH_DRAWING_TOOL::doDrawSheet( SCH_SHEET *aSheet )
int SCH_DRAWING_TOOLS::doDrawSheet( SCH_SHEET *aSheet )
{
m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true );
m_controls->ShowCursor( true );
@ -905,7 +905,7 @@ int SCH_DRAWING_TOOL::doDrawSheet( SCH_SHEET *aSheet )
}
void SCH_DRAWING_TOOL::sizeSheet( SCH_SHEET* aSheet, VECTOR2I aPos )
void SCH_DRAWING_TOOLS::sizeSheet( SCH_SHEET* aSheet, VECTOR2I aPos )
{
wxPoint pos = aSheet->GetPosition();
wxPoint size = (wxPoint) aPos - pos;
@ -929,26 +929,26 @@ void SCH_DRAWING_TOOL::sizeSheet( SCH_SHEET* aSheet, VECTOR2I aPos )
}
void SCH_DRAWING_TOOL::setTransitions()
void SCH_DRAWING_TOOLS::setTransitions()
{
Go( &SCH_DRAWING_TOOL::PlaceSymbol, SCH_ACTIONS::placeSymbol.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlacePower, SCH_ACTIONS::placePower.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceNoConnect, SCH_ACTIONS::placeNoConnect.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceJunction, SCH_ACTIONS::placeJunction.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceBusWireEntry, SCH_ACTIONS::placeBusWireEntry.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceBusBusEntry, SCH_ACTIONS::placeBusBusEntry.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceLabel, SCH_ACTIONS::placeLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceHierarchicalLabel,SCH_ACTIONS::placeHierarchicalLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceGlobalLabel, SCH_ACTIONS::placeGlobalLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOL::DrawSheet, SCH_ACTIONS::drawSheet.MakeEvent() );
Go( &SCH_DRAWING_TOOL::ResizeSheet, SCH_ACTIONS::resizeSheet.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceSheetPin, SCH_ACTIONS::placeSheetPin.MakeEvent() );
Go( &SCH_DRAWING_TOOL::ImportSheetPin, SCH_ACTIONS::importSheetPin.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceSchematicText, SCH_ACTIONS::placeSchematicText.MakeEvent() );
Go( &SCH_DRAWING_TOOL::PlaceImage, SCH_ACTIONS::placeImage.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceSymbol, SCH_ACTIONS::placeSymbol.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlacePower, SCH_ACTIONS::placePower.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceNoConnect, SCH_ACTIONS::placeNoConnect.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceJunction, SCH_ACTIONS::placeJunction.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceBusWireEntry, SCH_ACTIONS::placeBusWireEntry.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceBusBusEntry, SCH_ACTIONS::placeBusBusEntry.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceLabel, SCH_ACTIONS::placeLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceHierarchicalLabel,SCH_ACTIONS::placeHierarchicalLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceGlobalLabel, SCH_ACTIONS::placeGlobalLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::DrawSheet, SCH_ACTIONS::drawSheet.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::ResizeSheet, SCH_ACTIONS::resizeSheet.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceSheetPin, SCH_ACTIONS::placeSheetPin.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::ImportSheetPin, SCH_ACTIONS::importSheetPin.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceSchematicText, SCH_ACTIONS::placeSchematicText.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::PlaceImage, SCH_ACTIONS::placeImage.MakeEvent() );
Go( &SCH_DRAWING_TOOL::AddJunction, SCH_ACTIONS::addJunction.MakeEvent() );
Go( &SCH_DRAWING_TOOL::AddLabel, SCH_ACTIONS::addLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOL::AddLabel, SCH_ACTIONS::addGlobalLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOL::AddLabel, SCH_ACTIONS::addHierLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::AddJunction, SCH_ACTIONS::addJunction.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::AddLabel, SCH_ACTIONS::addLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::AddLabel, SCH_ACTIONS::addGlobalLabel.MakeEvent() );
Go( &SCH_DRAWING_TOOLS::AddLabel, SCH_ACTIONS::addHierLabel.MakeEvent() );
}

View File

@ -21,8 +21,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef SCH_DRAWING_TOOL_H
#define SCH_DRAWING_TOOL_H
#ifndef SCH_DRAWING_TOOLS_H
#define SCH_DRAWING_TOOLS_H
#include <tool/tool_interactive.h>
#include <tool/tool_menu.h>
@ -39,16 +39,16 @@ class SCH_SELECTION_TOOL;
/**
* Class SCH_DRAWING_TOOL
* Class SCH_DRAWING_TOOLS
*
* Tool responsible for drawing/placing items (symbols, wires, busses, labels, etc.)
*/
class SCH_DRAWING_TOOL : public TOOL_INTERACTIVE
class SCH_DRAWING_TOOLS : public TOOL_INTERACTIVE
{
public:
SCH_DRAWING_TOOL();
~SCH_DRAWING_TOOL();
SCH_DRAWING_TOOLS();
~SCH_DRAWING_TOOLS();
/// @copydoc TOOL_INTERACTIVE::Init()
bool Init() override;
@ -102,4 +102,4 @@ private:
TOOL_MENU m_menu;
};
#endif /* SCH_DRAWING_TOOL_H */
#endif /* SCH_DRAWING_TOOLS_H */

View File

@ -46,7 +46,7 @@
#include <eeschema_id.h>
#include <status_popup.h>
#include <wx/gdicmn.h>
#include "sch_drawing_tool.h"
#include "sch_drawing_tools.h"
TOOL_ACTION SCH_ACTIONS::duplicate( "eeschema.InteractiveEdit.duplicate",
@ -242,7 +242,7 @@ bool SCH_EDIT_TOOL::Init()
{
m_frame = getEditFrame<SCH_EDIT_FRAME>();
m_selectionTool = m_toolMgr->GetTool<SCH_SELECTION_TOOL>();
SCH_DRAWING_TOOL* drawingTool = m_toolMgr->GetTool<SCH_DRAWING_TOOL>();
SCH_DRAWING_TOOLS* drawingTool = m_toolMgr->GetTool<SCH_DRAWING_TOOLS>();
SCH_MOVE_TOOL* moveTool = m_toolMgr->GetTool<SCH_MOVE_TOOL>();
wxASSERT_MSG( m_selectionTool, "eeshema.InteractiveSelection tool is not available" );

View File

@ -38,7 +38,7 @@
#include <tools/sch_picker_tool.h>
#include <tools/sch_editor_control.h>
#include <tools/sch_selection_tool.h>
#include <tools/sch_drawing_tool.h>
#include <tools/sch_drawing_tools.h>
#include <project.h>
#include <hotkeys.h>
#include <advanced_config.h>

View File

@ -24,7 +24,7 @@
#include <tool/tool_manager.h>
#include <tools/sch_edit_tool.h>
#include <tools/sch_selection_tool.h>
#include <tools/sch_drawing_tool.h>
#include <tools/sch_drawing_tools.h>
#include <tools/sch_wire_bus_tool.h>
#include <tools/sch_picker_tool.h>
#include <sch_actions.h>