Remove a bunch more legacy editing code.
This commit is contained in:
parent
133ff9b552
commit
c0909611d3
|
@ -83,7 +83,6 @@ BEGIN_EVENT_TABLE( EDA_DRAW_FRAME, KIWAY_PLAYER )
|
||||||
EVT_MENU_OPEN( EDA_DRAW_FRAME::OnMenuOpen )
|
EVT_MENU_OPEN( EDA_DRAW_FRAME::OnMenuOpen )
|
||||||
EVT_MENU_CLOSE( EDA_DRAW_FRAME::OnMenuOpen )
|
EVT_MENU_CLOSE( EDA_DRAW_FRAME::OnMenuOpen )
|
||||||
EVT_MENU_HIGHLIGHT_ALL( EDA_DRAW_FRAME::OnMenuOpen )
|
EVT_MENU_HIGHLIGHT_ALL( EDA_DRAW_FRAME::OnMenuOpen )
|
||||||
EVT_MOUSEWHEEL( EDA_DRAW_FRAME::OnMouseEvent )
|
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
|
||||||
|
@ -364,12 +363,6 @@ void EDA_DRAW_FRAME::ReCreateMenuBar()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool EDA_DRAW_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int EDA_DRAW_FRAME::WriteHotkeyConfig( struct EDA_HOTKEY_CONFIG* aDescList,
|
int EDA_DRAW_FRAME::WriteHotkeyConfig( struct EDA_HOTKEY_CONFIG* aDescList,
|
||||||
wxString* aFullFileName )
|
wxString* aFullFileName )
|
||||||
{
|
{
|
||||||
|
@ -410,12 +403,6 @@ double EDA_DRAW_FRAME::GetZoom()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_FRAME::OnMouseEvent( wxMouseEvent& event )
|
|
||||||
{
|
|
||||||
event.Skip();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_FRAME::DisplayToolMsg( const wxString& msg )
|
void EDA_DRAW_FRAME::DisplayToolMsg( const wxString& msg )
|
||||||
{
|
{
|
||||||
m_toolMsg = msg;
|
m_toolMsg = msg;
|
||||||
|
|
|
@ -100,7 +100,6 @@ static const wxString MaxUndoItemsEntry(wxT( "DevelMaxUndoItems" ) );
|
||||||
BEGIN_EVENT_TABLE( EDA_DRAW_FRAME, KIWAY_PLAYER )
|
BEGIN_EVENT_TABLE( EDA_DRAW_FRAME, KIWAY_PLAYER )
|
||||||
EVT_CHAR_HOOK( EDA_DRAW_FRAME::OnCharHook )
|
EVT_CHAR_HOOK( EDA_DRAW_FRAME::OnCharHook )
|
||||||
|
|
||||||
EVT_MOUSEWHEEL( EDA_DRAW_FRAME::OnMouseEvent )
|
|
||||||
EVT_MENU_OPEN( EDA_DRAW_FRAME::OnMenuOpen )
|
EVT_MENU_OPEN( EDA_DRAW_FRAME::OnMenuOpen )
|
||||||
EVT_MENU_CLOSE( EDA_DRAW_FRAME::OnMenuOpen )
|
EVT_MENU_CLOSE( EDA_DRAW_FRAME::OnMenuOpen )
|
||||||
EVT_MENU_HIGHLIGHT_ALL( EDA_DRAW_FRAME::OnMenuOpen )
|
EVT_MENU_HIGHLIGHT_ALL( EDA_DRAW_FRAME::OnMenuOpen )
|
||||||
|
@ -387,11 +386,6 @@ void EDA_DRAW_FRAME::ReCreateMenuBar()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool EDA_DRAW_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int EDA_DRAW_FRAME::WriteHotkeyConfig( struct EDA_HOTKEY_CONFIG* aDescList,
|
int EDA_DRAW_FRAME::WriteHotkeyConfig( struct EDA_HOTKEY_CONFIG* aDescList,
|
||||||
wxString* aFullFileName )
|
wxString* aFullFileName )
|
||||||
{
|
{
|
||||||
|
@ -495,12 +489,6 @@ double EDA_DRAW_FRAME::GetZoom()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_FRAME::OnMouseEvent( wxMouseEvent& event )
|
|
||||||
{
|
|
||||||
event.Skip();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_FRAME::DisplayToolMsg( const wxString& msg )
|
void EDA_DRAW_FRAME::DisplayToolMsg( const wxString& msg )
|
||||||
{
|
{
|
||||||
m_toolMsg = msg;
|
m_toolMsg = msg;
|
||||||
|
|
|
@ -62,14 +62,10 @@ BEGIN_EVENT_TABLE( EDA_DRAW_PANEL, wxScrolledWindow )
|
||||||
#if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
|
#if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
|
||||||
EVT_MAGNIFY( EDA_DRAW_PANEL::OnMagnify )
|
EVT_MAGNIFY( EDA_DRAW_PANEL::OnMagnify )
|
||||||
#endif
|
#endif
|
||||||
EVT_MOUSE_EVENTS( EDA_DRAW_PANEL::OnMouseEvent )
|
|
||||||
EVT_CHAR( EDA_DRAW_PANEL::OnKeyEvent )
|
|
||||||
EVT_CHAR_HOOK( EDA_DRAW_PANEL::OnKeyEvent )
|
|
||||||
EVT_PAINT( EDA_DRAW_PANEL::OnPaint )
|
EVT_PAINT( EDA_DRAW_PANEL::OnPaint )
|
||||||
EVT_ERASE_BACKGROUND( EDA_DRAW_PANEL::OnEraseBackground )
|
EVT_ERASE_BACKGROUND( EDA_DRAW_PANEL::OnEraseBackground )
|
||||||
EVT_SCROLLWIN( EDA_DRAW_PANEL::OnScroll )
|
EVT_SCROLLWIN( EDA_DRAW_PANEL::OnScroll )
|
||||||
EVT_ACTIVATE( EDA_DRAW_PANEL::OnActivate )
|
EVT_ACTIVATE( EDA_DRAW_PANEL::OnActivate )
|
||||||
EVT_TIMER( ID_MOUSE_DOUBLECLICK, EDA_DRAW_PANEL::OnTimer )
|
|
||||||
EVT_MENU_RANGE( ID_PAN_UP, ID_PAN_RIGHT, EDA_DRAW_PANEL::OnPan )
|
EVT_MENU_RANGE( ID_PAN_UP, ID_PAN_RIGHT, EDA_DRAW_PANEL::OnPan )
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
|
@ -351,14 +347,6 @@ void EDA_DRAW_PANEL::OnActivate( wxActivateEvent& event )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_PANEL::OnTimer( wxTimerEvent& event )
|
|
||||||
{
|
|
||||||
INSTALL_UNBUFFERED_DC( DC, this );
|
|
||||||
DC.SetBackground( *wxBLACK_BRUSH );
|
|
||||||
GetParent()->OnLeftClick( &DC, m_CursorClickPos );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_PANEL::OnScroll( wxScrollWinEvent& event )
|
void EDA_DRAW_PANEL::OnScroll( wxScrollWinEvent& event )
|
||||||
{
|
{
|
||||||
int id = event.GetEventType();
|
int id = event.GetEventType();
|
||||||
|
@ -827,33 +815,6 @@ void EDA_DRAW_PANEL::DrawGridAxis( wxDC* aDC, GR_DRAWMODE aDrawMode, const wxPoi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool EDA_DRAW_PANEL::OnRightClick( wxMouseEvent& event )
|
|
||||||
{
|
|
||||||
wxPoint pos;
|
|
||||||
wxMenu MasterMenu;
|
|
||||||
|
|
||||||
INSTALL_UNBUFFERED_DC( dc, this );
|
|
||||||
|
|
||||||
pos = event.GetLogicalPosition( dc );
|
|
||||||
|
|
||||||
if( !GetParent()->OnRightClick( pos, &MasterMenu ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GetParent()->AddMenuZoomAndGrid( &MasterMenu );
|
|
||||||
|
|
||||||
pos = event.GetPosition();
|
|
||||||
m_ignoreMouseEvents = true;
|
|
||||||
PopupMenu( &MasterMenu, pos );
|
|
||||||
|
|
||||||
// The ZoomAndGrid menu is only invoked over empty space so there's no point in warping
|
|
||||||
// the cursor back to the crosshair, and it's very annoying if one clicked out of the menu.
|
|
||||||
|
|
||||||
m_ignoreMouseEvents = false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_PANEL::OnMouseEntering( wxMouseEvent& aEvent )
|
void EDA_DRAW_PANEL::OnMouseEntering( wxMouseEvent& aEvent )
|
||||||
{
|
{
|
||||||
// This is an ugly hack that fixes some cross hair display bugs when the mouse leaves the
|
// This is an ugly hack that fixes some cross hair display bugs when the mouse leaves the
|
||||||
|
@ -1025,177 +986,6 @@ void EDA_DRAW_PANEL::OnMagnify( wxMouseEvent& event )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_PANEL::OnMouseEvent( wxMouseEvent& event )
|
|
||||||
{
|
|
||||||
int localbutt = 0;
|
|
||||||
BASE_SCREEN* screen = GetScreen();
|
|
||||||
|
|
||||||
if( !screen )
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Adjust value to filter mouse displacement before consider the drag
|
|
||||||
* mouse is really a drag command, not just a movement while click
|
|
||||||
*/
|
|
||||||
#define MIN_DRAG_COUNT_FOR_START_BLOCK_COMMAND 5
|
|
||||||
|
|
||||||
if( event.Leaving() )
|
|
||||||
m_canStartBlock = -1;
|
|
||||||
|
|
||||||
if( !IsMouseCaptured() ) // No mouse capture in progress.
|
|
||||||
SetAutoPanRequest( false );
|
|
||||||
|
|
||||||
if( GetParent()->IsActive() )
|
|
||||||
SetFocus();
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( !event.IsButton() && !event.Moving() && !event.Dragging() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( event.RightDown() )
|
|
||||||
{
|
|
||||||
OnRightClick( event );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( m_ignoreMouseEvents )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( event.LeftDown() )
|
|
||||||
localbutt = GR_M_LEFT_DOWN;
|
|
||||||
|
|
||||||
if( event.ButtonDClick( 1 ) )
|
|
||||||
localbutt = GR_M_LEFT_DOWN | GR_M_DCLICK;
|
|
||||||
|
|
||||||
if( event.MiddleDown() )
|
|
||||||
localbutt = GR_M_MIDDLE_DOWN;
|
|
||||||
|
|
||||||
INSTALL_UNBUFFERED_DC( DC, this );
|
|
||||||
DC.SetBackground( *wxBLACK_BRUSH );
|
|
||||||
|
|
||||||
// Compute the cursor position in drawing (logical) units.
|
|
||||||
GetParent()->SetMousePosition( event.GetLogicalPosition( DC ) );
|
|
||||||
|
|
||||||
int kbstat = 0;
|
|
||||||
|
|
||||||
if( event.ShiftDown() )
|
|
||||||
kbstat |= GR_KB_SHIFT;
|
|
||||||
|
|
||||||
if( event.ControlDown() )
|
|
||||||
kbstat |= GR_KB_CTRL;
|
|
||||||
|
|
||||||
if( event.AltDown() )
|
|
||||||
kbstat |= GR_KB_ALT;
|
|
||||||
|
|
||||||
// Calling Double Click and Click functions :
|
|
||||||
if( localbutt == (int) ( GR_M_LEFT_DOWN | GR_M_DCLICK ) )
|
|
||||||
{
|
|
||||||
if( m_ClickTimer )
|
|
||||||
{
|
|
||||||
m_ClickTimer->Stop();
|
|
||||||
wxDELETE( m_ClickTimer );
|
|
||||||
}
|
|
||||||
GetParent()->OnLeftDClick( &DC, GetParent()->RefPos( true ) );
|
|
||||||
|
|
||||||
// inhibit a response to the mouse left button release,
|
|
||||||
// because we have a double click, and we do not want a new
|
|
||||||
// OnLeftClick command at end of this Double Click
|
|
||||||
m_ignoreNextLeftButtonRelease = true;
|
|
||||||
}
|
|
||||||
else if( event.LeftUp() )
|
|
||||||
{
|
|
||||||
// A block command is in progress: a left up is the end of block
|
|
||||||
// or this is the end of a double click, already seen
|
|
||||||
// Note also m_ignoreNextLeftButtonRelease can be set by
|
|
||||||
// the call to OnLeftClick(), so do not change it after calling OnLeftClick
|
|
||||||
m_ignoreNextLeftButtonRelease = false;
|
|
||||||
}
|
|
||||||
else if( !event.LeftIsDown() )
|
|
||||||
{
|
|
||||||
/* be sure there is a response to a left button release command
|
|
||||||
* even when a LeftUp event is not seen. This happens when a
|
|
||||||
* double click opens a dialog box, and the release mouse button
|
|
||||||
* is made when the dialog box is opened.
|
|
||||||
*/
|
|
||||||
m_ignoreNextLeftButtonRelease = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( event.ButtonDown( wxMOUSE_BTN_MIDDLE ) )
|
|
||||||
{
|
|
||||||
m_PanStartCenter = GetParent()->GetScrollCenterPosition();
|
|
||||||
m_PanStartEventPosition = event.GetPosition();
|
|
||||||
|
|
||||||
INSTALL_UNBUFFERED_DC( dc, this );
|
|
||||||
CrossHairOff( &dc );
|
|
||||||
SetCursor( wxCURSOR_SIZING );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( event.ButtonUp( wxMOUSE_BTN_MIDDLE ) )
|
|
||||||
{
|
|
||||||
INSTALL_UNBUFFERED_DC( dc, this );
|
|
||||||
CrossHairOn( &dc );
|
|
||||||
SetCursor( (wxStockCursor) m_currentCursor );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( event.MiddleIsDown() )
|
|
||||||
{
|
|
||||||
wxPoint currentPosition = event.GetPosition();
|
|
||||||
|
|
||||||
double scale = GetParent()->GetScreen()->GetScalingFactor();
|
|
||||||
int x = m_PanStartCenter.x +
|
|
||||||
KiROUND( (double) ( m_PanStartEventPosition.x - currentPosition.x ) / scale );
|
|
||||||
int y = m_PanStartCenter.y +
|
|
||||||
KiROUND( (double) ( m_PanStartEventPosition.y - currentPosition.y ) / scale );
|
|
||||||
|
|
||||||
GetParent()->RedrawScreen( wxPoint( x, y ), false );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calling the general function on mouse changes (and pseudo key commands)
|
|
||||||
GetParent()->GeneralControl( &DC, event.GetLogicalPosition( DC ), 0 );
|
|
||||||
|
|
||||||
/*******************************/
|
|
||||||
/* Control of block commands : */
|
|
||||||
/*******************************/
|
|
||||||
|
|
||||||
// Command block can't start if mouse is dragging a new panel
|
|
||||||
static EDA_DRAW_PANEL* lastPanel;
|
|
||||||
if( lastPanel != this )
|
|
||||||
{
|
|
||||||
m_minDragEventCount = 0;
|
|
||||||
m_canStartBlock = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A new command block can start after a release buttons
|
|
||||||
* and if the drag is enough
|
|
||||||
* This is to avoid a false start block when a dialog box is dismissed,
|
|
||||||
* or when changing panels in hierarchy navigation
|
|
||||||
* or when clicking while and moving mouse
|
|
||||||
*/
|
|
||||||
if( !event.LeftIsDown() && !event.MiddleIsDown() )
|
|
||||||
{
|
|
||||||
m_minDragEventCount = 0;
|
|
||||||
m_canStartBlock = 0;
|
|
||||||
|
|
||||||
/* Remember the last cursor position when a drag mouse starts
|
|
||||||
* this is the last position ** before ** clicking a button
|
|
||||||
* this is useful to start a block command from the point where the
|
|
||||||
* mouse was clicked first
|
|
||||||
* (a filter creates a delay for the real block command start, and
|
|
||||||
* we must remember this point)
|
|
||||||
*/
|
|
||||||
m_CursorStartPos = GetParent()->GetCrossHairPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
lastPanel = this;
|
|
||||||
|
|
||||||
#ifdef __WXGTK3__
|
|
||||||
// Screen has to be updated on every operation, otherwise the cursor leaves a trail (when xor
|
|
||||||
// operation is changed to copy) or is not updated at all.
|
|
||||||
Refresh();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_PANEL::OnCharHook( wxKeyEvent& event )
|
void EDA_DRAW_PANEL::OnCharHook( wxKeyEvent& event )
|
||||||
{
|
{
|
||||||
wxLogTrace( kicadTraceKeyEvent, "EDA_DRAW_PANEL::OnCharHook %s", dump( event ) );
|
wxLogTrace( kicadTraceKeyEvent, "EDA_DRAW_PANEL::OnCharHook %s", dump( event ) );
|
||||||
|
@ -1203,73 +993,6 @@ void EDA_DRAW_PANEL::OnCharHook( wxKeyEvent& event )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_PANEL::OnKeyEvent( wxKeyEvent& event )
|
|
||||||
{
|
|
||||||
int localkey;
|
|
||||||
wxPoint pos;
|
|
||||||
|
|
||||||
wxLogTrace( kicadTraceKeyEvent, "EDA_DRAW_PANEL::OnKeyEvent %s", dump( event ) );
|
|
||||||
|
|
||||||
localkey = event.GetKeyCode();
|
|
||||||
bool keyWasHandled = false;
|
|
||||||
|
|
||||||
switch( localkey )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WXK_ESCAPE:
|
|
||||||
m_abortRequest = true;
|
|
||||||
|
|
||||||
if( IsMouseCaptured() )
|
|
||||||
EndMouseCapture();
|
|
||||||
else
|
|
||||||
EndMouseCapture( ID_NO_TOOL_SELECTED, m_defaultCursor, wxEmptyString );
|
|
||||||
|
|
||||||
keyWasHandled = true; // The key is captured: the key event must not be skipped
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Normalize keys code to easily handle keys from Ctrl+A to Ctrl+Z
|
|
||||||
* They have an ascii code from 1 to 27 remapped
|
|
||||||
* to GR_KB_CTRL + 'A' to GR_KB_CTRL + 'Z'
|
|
||||||
*/
|
|
||||||
if( event.ControlDown() && localkey >= WXK_CONTROL_A && localkey <= WXK_CONTROL_Z )
|
|
||||||
localkey += 'A' - 1;
|
|
||||||
|
|
||||||
/* Disallow shift for keys that have two keycodes on them (e.g. number and
|
|
||||||
* punctuation keys) leaving only the "letter keys" of A-Z.
|
|
||||||
* Then, you can have, e.g. Ctrl-5 and Ctrl-% (GB layout)
|
|
||||||
* and Ctrl-( and Ctrl-5 (FR layout).
|
|
||||||
* Otherwise, you'd have to have to say Ctrl-Shift-5 on a FR layout
|
|
||||||
*/
|
|
||||||
bool keyIsLetter = ( localkey >= 'A' && localkey <= 'Z' ) ||
|
|
||||||
( localkey >= 'a' && localkey <= 'z' );
|
|
||||||
|
|
||||||
if( event.ShiftDown() && ( keyIsLetter || localkey > 256 ) )
|
|
||||||
localkey |= GR_KB_SHIFT;
|
|
||||||
|
|
||||||
if( event.ControlDown() )
|
|
||||||
localkey |= GR_KB_CTRL;
|
|
||||||
|
|
||||||
if( event.AltDown() )
|
|
||||||
localkey |= GR_KB_ALT;
|
|
||||||
|
|
||||||
INSTALL_UNBUFFERED_DC( DC, this );
|
|
||||||
|
|
||||||
// Some key commands use the current mouse position: refresh it.
|
|
||||||
pos = wxGetMousePosition() - GetScreenPosition();
|
|
||||||
|
|
||||||
// Compute the cursor position in drawing units. Also known as logical units to wxDC.
|
|
||||||
pos = wxPoint( DC.DeviceToLogicalX( pos.x ), DC.DeviceToLogicalY( pos.y ) );
|
|
||||||
|
|
||||||
GetParent()->SetMousePosition( pos );
|
|
||||||
|
|
||||||
if( !GetParent()->GeneralControl( &DC, pos, localkey ) && !keyWasHandled )
|
|
||||||
event.Skip(); // Skip this event only when the key was not handled
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void EDA_DRAW_PANEL::OnPan( wxCommandEvent& event )
|
void EDA_DRAW_PANEL::OnPan( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
|
|
|
@ -333,74 +333,6 @@ void DISPLAY_FOOTPRINTS_FRAME::ApplyDisplaySettingsToGAL()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DISPLAY_FOOTPRINTS_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition,
|
|
||||||
EDA_KEY aHotKey )
|
|
||||||
{
|
|
||||||
bool eventHandled = true;
|
|
||||||
|
|
||||||
// Filter out the 'fake' mouse motion after a keyboard movement
|
|
||||||
if( !aHotKey && m_movingCursorWithKeyboard )
|
|
||||||
{
|
|
||||||
m_movingCursorWithKeyboard = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
wxPoint pos = aPosition;
|
|
||||||
wxPoint oldpos = GetCrossHairPosition();
|
|
||||||
GeneralControlKeyMovement( aHotKey, &pos, true );
|
|
||||||
|
|
||||||
switch( aHotKey )
|
|
||||||
{
|
|
||||||
case WXK_F1:
|
|
||||||
cmd.SetId( ID_KEY_ZOOM_IN );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WXK_F2:
|
|
||||||
cmd.SetId( ID_KEY_ZOOM_OUT );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WXK_F3:
|
|
||||||
cmd.SetId( ID_ZOOM_REDRAW );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WXK_F4:
|
|
||||||
cmd.SetId( ID_POPUP_ZOOM_CENTER );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WXK_HOME:
|
|
||||||
cmd.SetId( ID_ZOOM_PAGE );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ' ':
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GR_KB_ALT + '3':
|
|
||||||
cmd.SetId( ID_CVPCB_SHOW3D_FRAME );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
eventHandled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetCrossHairPosition( pos );
|
|
||||||
RefreshCrossHair( oldpos, aPosition, aDC );
|
|
||||||
|
|
||||||
UpdateStatusBar(); /* Display new cursor coordinates */
|
|
||||||
|
|
||||||
return eventHandled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DISPLAY_FOOTPRINTS_FRAME::Show3D_Frame( wxCommandEvent& event )
|
void DISPLAY_FOOTPRINTS_FRAME::Show3D_Frame( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
bool forceRecreateIfNotOwner = true;
|
bool forceRecreateIfNotOwner = true;
|
||||||
|
|
|
@ -108,7 +108,6 @@ public:
|
||||||
*/
|
*/
|
||||||
COLOR4D GetGridColor() override;
|
COLOR4D GetGridColor() override;
|
||||||
|
|
||||||
bool GeneralControl( wxDC* DC, const wxPoint& aPosition, EDA_KEY aHotKey = 0 ) override;
|
|
||||||
void InstallOptionsDisplay( wxCommandEvent& event );
|
void InstallOptionsDisplay( wxCommandEvent& event );
|
||||||
MODULE* Get_Module( const wxString& CmpName );
|
MODULE* Get_Module( const wxString& CmpName );
|
||||||
|
|
||||||
|
|
|
@ -392,66 +392,6 @@ EDA_HOTKEY* SCH_EDIT_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hot keys. Commands are case insensitive.
|
|
||||||
*/
|
|
||||||
bool SCH_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
if( aHotKey == 0 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
|
|
||||||
/* Convert lower to upper case (the usual toupper function has problem
|
|
||||||
* with non ascii codes like function keys */
|
|
||||||
if( (aHotKey >= 'a') && (aHotKey <= 'z') )
|
|
||||||
aHotKey += 'A' - 'a';
|
|
||||||
|
|
||||||
// Search command from key :
|
|
||||||
EDA_HOTKEY* hotKey = GetDescriptorFromHotkey( aHotKey, common_Hotkey_List );
|
|
||||||
|
|
||||||
if( hotKey == NULL )
|
|
||||||
hotKey = GetDescriptorFromHotkey( aHotKey, schematic_Hotkey_List );
|
|
||||||
|
|
||||||
if( hotKey == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch( hotKey->m_Idcommand )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case HK_NOT_FOUND:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case HK_HELP: // Display Current hotkey list
|
|
||||||
DisplayHotkeyList( this, g_Schematic_Hotkeys_Descr );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_PREFERENCES:
|
|
||||||
cmd.SetId( wxID_PREFERENCES );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_LOCAL_COORD: // Reset the relative coord
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_CANVAS_CAIRO:
|
|
||||||
case HK_CANVAS_OPENGL:
|
|
||||||
{
|
|
||||||
EDA_HOTKEY_CLIENT_DATA data( aPosition );
|
|
||||||
cmd.SetInt( hotKey->m_Idcommand );
|
|
||||||
cmd.SetClientObject( &data );
|
|
||||||
cmd.SetId( hotKey->m_IdMenuEvent );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hot key handled.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
EDA_HOTKEY* LIB_EDIT_FRAME::GetHotKeyDescription( int aCommand ) const
|
EDA_HOTKEY* LIB_EDIT_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
{
|
{
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
||||||
|
@ -463,52 +403,6 @@ EDA_HOTKEY* LIB_EDIT_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LIB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
if( aHotKey == 0 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
/* Convert lower to upper case (the usual toupper function has problem
|
|
||||||
* with non ascii codes like function keys */
|
|
||||||
if( (aHotKey >= 'a') && (aHotKey <= 'z') )
|
|
||||||
aHotKey += 'A' - 'a';
|
|
||||||
|
|
||||||
EDA_HOTKEY* hotKey = GetDescriptorFromHotkey( aHotKey, common_Hotkey_List );
|
|
||||||
|
|
||||||
if( hotKey == NULL )
|
|
||||||
hotKey = GetDescriptorFromHotkey( aHotKey, libEdit_Hotkey_List );
|
|
||||||
|
|
||||||
if( hotKey == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch( hotKey->m_Idcommand )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case HK_NOT_FOUND:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case HK_HELP: // Display Current hotkey list
|
|
||||||
DisplayHotkeyList( this, g_Libedit_Hotkeys_Descr );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_PREFERENCES:
|
|
||||||
cmd.SetId( wxID_PREFERENCES );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_LOCAL_COORD: // Reset the relative coord
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hot key handled.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
EDA_HOTKEY* LIB_VIEW_FRAME::GetHotKeyDescription( int aCommand ) const
|
EDA_HOTKEY* LIB_VIEW_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
{
|
{
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
||||||
|
@ -520,47 +414,3 @@ EDA_HOTKEY* LIB_VIEW_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LIB_VIEW_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
if( aHotKey == 0 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
/* Convert lower to upper case (the usual toupper function has problem with non ascii
|
|
||||||
* codes like function keys */
|
|
||||||
if( (aHotKey >= 'a') && (aHotKey <= 'z') )
|
|
||||||
aHotKey += 'A' - 'a';
|
|
||||||
|
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromHotkey( aHotKey, common_basic_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
HK_Descr = GetDescriptorFromHotkey( aHotKey, viewlib_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch( HK_Descr->m_Idcommand )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case HK_NOT_FOUND:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case HK_HELP: // Display Current hotkey list
|
|
||||||
DisplayHotkeyList( this, g_Viewlib_Hotkeys_Descr );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_LOCAL_COORD: // set local (relative) coordinate origin
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_CANVAS_CAIRO:
|
|
||||||
case HK_CANVAS_OPENGL:
|
|
||||||
cmd.SetInt( HK_Descr->m_Idcommand );
|
|
||||||
cmd.SetId( HK_Descr->m_IdMenuEvent );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1034,33 +1034,3 @@ void LIB_EDIT_FRAME::OnSwitchCanvas( wxCommandEvent& aEvent )
|
||||||
GetGalCanvas()->GetGAL()->SetAxesEnabled( true );
|
GetGalCanvas()->GetGAL()->SetAxesEnabled( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LIB_EDIT_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey )
|
|
||||||
{
|
|
||||||
bool keyHandled = false;
|
|
||||||
wxPoint pos = aPosition;
|
|
||||||
|
|
||||||
// Filter out the 'fake' mouse motion after a keyboard movement
|
|
||||||
if( !aHotKey && m_movingCursorWithKeyboard )
|
|
||||||
{
|
|
||||||
m_movingCursorWithKeyboard = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( aHotKey )
|
|
||||||
keyHandled = GeneralControlKeyMovement( aHotKey, &pos, true );
|
|
||||||
|
|
||||||
GetGalCanvas()->GetViewControls()->SetSnapping( false );
|
|
||||||
SetCrossHairPosition( pos, false );
|
|
||||||
|
|
||||||
if( aHotKey && OnHotKey( aDC, aHotKey, aPosition, NULL ) )
|
|
||||||
keyHandled = true;
|
|
||||||
|
|
||||||
// Make sure current-part highlighting doesn't get lost in seleciton highlighting
|
|
||||||
ClearSearchTreeSelection();
|
|
||||||
|
|
||||||
UpdateStatusBar();
|
|
||||||
|
|
||||||
return keyHandled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -323,10 +323,6 @@ public:
|
||||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||||
|
|
||||||
bool OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem = NULL ) override;
|
|
||||||
|
|
||||||
bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey = 0 ) override;
|
|
||||||
|
|
||||||
void LoadSettings( wxConfigBase* aCfg ) override;
|
void LoadSettings( wxConfigBase* aCfg ) override;
|
||||||
void SaveSettings( wxConfigBase* aCfg ) override;
|
void SaveSettings( wxConfigBase* aCfg ) override;
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,6 @@ using namespace std::placeholders;
|
||||||
|
|
||||||
// Events used by EDA_DRAW_PANEL
|
// Events used by EDA_DRAW_PANEL
|
||||||
BEGIN_EVENT_TABLE( SCH_DRAW_PANEL, wxScrolledCanvas )
|
BEGIN_EVENT_TABLE( SCH_DRAW_PANEL, wxScrolledCanvas )
|
||||||
EVT_CHAR( SCH_DRAW_PANEL::OnKeyEvent )
|
|
||||||
EVT_CHAR_HOOK( SCH_DRAW_PANEL::OnCharHook )
|
EVT_CHAR_HOOK( SCH_DRAW_PANEL::OnCharHook )
|
||||||
EVT_PAINT( SCH_DRAW_PANEL::onPaint )
|
EVT_PAINT( SCH_DRAW_PANEL::onPaint )
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
@ -84,7 +83,6 @@ SCH_DRAW_PANEL::SCH_DRAW_PANEL( wxWindow* aParentWindow, wxWindowID aWindowId,
|
||||||
// on updated viewport data.
|
// on updated viewport data.
|
||||||
m_viewControls = new KIGFX::WX_VIEW_CONTROLS( m_view, this );
|
m_viewControls = new KIGFX::WX_VIEW_CONTROLS( m_view, this );
|
||||||
|
|
||||||
Connect( wxEVT_CHAR, wxKeyEventHandler( SCH_DRAW_PANEL::OnKeyEvent ), NULL, this );
|
|
||||||
Connect( wxEVT_CHAR_HOOK, wxKeyEventHandler( SCH_DRAW_PANEL::OnCharHook ), NULL, this );
|
Connect( wxEVT_CHAR_HOOK, wxKeyEventHandler( SCH_DRAW_PANEL::OnCharHook ), NULL, this );
|
||||||
|
|
||||||
Pgm().CommonSettings()->Read( ENBL_MOUSEWHEEL_PAN_KEY, &m_enableMousewheelPan, false );
|
Pgm().CommonSettings()->Read( ENBL_MOUSEWHEEL_PAN_KEY, &m_enableMousewheelPan, false );
|
||||||
|
@ -254,68 +252,6 @@ void SCH_DRAW_PANEL::OnCharHook( wxKeyEvent& event )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_DRAW_PANEL::OnKeyEvent( wxKeyEvent& event )
|
|
||||||
{
|
|
||||||
SCH_BASE_FRAME* frame = (SCH_BASE_FRAME*) m_parent;
|
|
||||||
int localkey = event.GetKeyCode();
|
|
||||||
bool keyWasHandled = false;
|
|
||||||
|
|
||||||
if( localkey == WXK_ESCAPE )
|
|
||||||
{
|
|
||||||
m_abortRequest = true;
|
|
||||||
|
|
||||||
if( frame->IsModal() )
|
|
||||||
frame->DismissModal( wxID_CANCEL );
|
|
||||||
else
|
|
||||||
GetParent()->GetToolManager()->RunAction( ACTIONS::cancelInteractive, true );
|
|
||||||
|
|
||||||
keyWasHandled = true; // The key is captured: the key event will be not skipped
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Normalize keys code to easily handle keys from Ctrl+A to Ctrl+Z
|
|
||||||
* They have an ascii code from 1 to 27 remapped
|
|
||||||
* to GR_KB_CTRL + 'A' to GR_KB_CTRL + 'Z'
|
|
||||||
*/
|
|
||||||
if( event.ControlDown() && localkey >= WXK_CONTROL_A && localkey <= WXK_CONTROL_Z )
|
|
||||||
localkey += 'A' - 1;
|
|
||||||
|
|
||||||
/* Disallow shift for keys that have two keycodes on them (e.g. number and
|
|
||||||
* punctuation keys) leaving only the "letter keys" of A-Z.
|
|
||||||
* Then, you can have, e.g. Ctrl-5 and Ctrl-% (GB layout)
|
|
||||||
* and Ctrl-( and Ctrl-5 (FR layout).
|
|
||||||
* Otherwise, you'd have to have to say Ctrl-Shift-5 on a FR layout
|
|
||||||
*/
|
|
||||||
bool keyIsLetter = ( localkey >= 'A' && localkey <= 'Z' ) ||
|
|
||||||
( localkey >= 'a' && localkey <= 'z' );
|
|
||||||
|
|
||||||
if( event.ShiftDown() && ( keyIsLetter || localkey > 256 ) )
|
|
||||||
localkey |= GR_KB_SHIFT;
|
|
||||||
|
|
||||||
if( event.ControlDown() )
|
|
||||||
localkey |= GR_KB_CTRL;
|
|
||||||
|
|
||||||
if( event.AltDown() )
|
|
||||||
localkey |= GR_KB_ALT;
|
|
||||||
|
|
||||||
|
|
||||||
// Some key commands use the current mouse position: refresh it.
|
|
||||||
//pos = wxGetMousePosition() - GetScreenPosition();
|
|
||||||
|
|
||||||
// Compute the cursor position in drawing units. Also known as logical units to wxDC.
|
|
||||||
//pos = wxPoint( DC.DeviceToLogicalX( pos.x ), DC.DeviceToLogicalY( pos.y ) );
|
|
||||||
|
|
||||||
auto p = GetViewControls()->GetCursorPosition( false );
|
|
||||||
|
|
||||||
wxPoint pos ((int)p.x, (int)p.y);
|
|
||||||
|
|
||||||
GetParent()->SetMousePosition( pos );
|
|
||||||
|
|
||||||
// a Key event has to be skipped only if it is not handled:
|
|
||||||
if( !GetParent()->GeneralControl( nullptr, pos, localkey ) && !keyWasHandled )
|
|
||||||
event.Skip();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SCH_DRAW_PANEL::onPaint( wxPaintEvent& aEvent )
|
void SCH_DRAW_PANEL::onPaint( wxPaintEvent& aEvent )
|
||||||
{
|
{
|
||||||
if( !m_gal->IsInitialized() || !m_gal->IsVisible() )
|
if( !m_gal->IsInitialized() || !m_gal->IsVisible() )
|
||||||
|
|
|
@ -41,7 +41,6 @@ public:
|
||||||
void DisplaySheet( const SCH_SCREEN *aScreen );
|
void DisplaySheet( const SCH_SCREEN *aScreen );
|
||||||
|
|
||||||
bool SwitchBackend( GAL_TYPE aGalType ) override;
|
bool SwitchBackend( GAL_TYPE aGalType ) override;
|
||||||
void OnKeyEvent( wxKeyEvent& event );
|
|
||||||
void OnCharHook( wxKeyEvent& event );
|
void OnCharHook( wxKeyEvent& event );
|
||||||
|
|
||||||
void SetEnableMousewheelPan( bool aEnable ) override;
|
void SetEnableMousewheelPan( bool aEnable ) override;
|
||||||
|
|
|
@ -310,8 +310,6 @@ public:
|
||||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||||
|
|
||||||
bool OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem ) override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Must be called after a schematic change in order to set the "modify" flag of the
|
* Must be called after a schematic change in order to set the "modify" flag of the
|
||||||
* current screen and update the date in frame reference.
|
* current screen and update the date in frame reference.
|
||||||
|
|
|
@ -846,39 +846,6 @@ void LIB_VIEW_FRAME::OnAddPartToSchematic( wxCommandEvent& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LIB_VIEW_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey )
|
|
||||||
{
|
|
||||||
bool eventHandled = true;
|
|
||||||
|
|
||||||
// Filter out the 'fake' mouse motion after a keyboard movement
|
|
||||||
if( !aHotKey && m_movingCursorWithKeyboard )
|
|
||||||
{
|
|
||||||
m_movingCursorWithKeyboard = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxPoint pos = aPosition;
|
|
||||||
GeneralControlKeyMovement( aHotKey, &pos, true );
|
|
||||||
|
|
||||||
// Update cursor position.
|
|
||||||
SetCrossHairPosition( pos, true );
|
|
||||||
|
|
||||||
if( aHotKey )
|
|
||||||
{
|
|
||||||
SCH_SCREEN* screen = GetScreen();
|
|
||||||
|
|
||||||
if( screen->GetCurItem() && screen->GetCurItem()->GetEditFlags() )
|
|
||||||
eventHandled = OnHotKey( aDC, aHotKey, aPosition, screen->GetCurItem() );
|
|
||||||
else
|
|
||||||
eventHandled = OnHotKey( aDC, aHotKey, aPosition, NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateStatusBar(); // Display cursor coordinates info.
|
|
||||||
|
|
||||||
return eventHandled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void LIB_VIEW_FRAME::OnDisplayHotkeyList( wxCommandEvent& event )
|
void LIB_VIEW_FRAME::OnDisplayHotkeyList( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
DisplayHotkeyList( this, g_Viewlib_Hotkeys_Descr );
|
DisplayHotkeyList( this, g_Viewlib_Hotkeys_Descr );
|
||||||
|
|
|
@ -97,21 +97,9 @@ public:
|
||||||
void OnSetRelativeOffset( wxCommandEvent& event );
|
void OnSetRelativeOffset( wxCommandEvent& event );
|
||||||
void OnSelectSymbol( wxCommandEvent& aEvent );
|
void OnSelectSymbol( wxCommandEvent& aEvent );
|
||||||
|
|
||||||
bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey ) override;
|
|
||||||
|
|
||||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle hot key events.
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* Some commands are relative to the item under the mouse cursor. Commands are
|
|
||||||
* case insensitive
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
bool OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem ) override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displays the hotkey dialog
|
* Displays the hotkey dialog
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -40,7 +40,6 @@ set( GERBVIEW_SRCS
|
||||||
gbr_layer_box_selector.cpp
|
gbr_layer_box_selector.cpp
|
||||||
X2_gerber_attributes.cpp
|
X2_gerber_attributes.cpp
|
||||||
clear_gbr_drawlayers.cpp
|
clear_gbr_drawlayers.cpp
|
||||||
controle.cpp
|
|
||||||
dcode.cpp
|
dcode.cpp
|
||||||
draw_gerber_screen.cpp
|
draw_gerber_screen.cpp
|
||||||
evaluate.cpp
|
evaluate.cpp
|
||||||
|
@ -55,7 +54,6 @@ set( GERBVIEW_SRCS
|
||||||
job_file_reader.cpp
|
job_file_reader.cpp
|
||||||
locate.cpp
|
locate.cpp
|
||||||
menubar.cpp
|
menubar.cpp
|
||||||
onleftclick.cpp
|
|
||||||
readgerb.cpp
|
readgerb.cpp
|
||||||
rs274_read_XY_and_IJ_coordinates.cpp
|
rs274_read_XY_and_IJ_coordinates.cpp
|
||||||
rs274d.cpp
|
rs274d.cpp
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1992-2017 <Jean-Pierre Charras>
|
|
||||||
* Copyright (C) 1992-2017 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file gerbview/controle.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <gerbview_frame.h>
|
|
||||||
|
|
||||||
|
|
||||||
bool GERBVIEW_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey )
|
|
||||||
{
|
|
||||||
// Filter out the 'fake' mouse motion after a keyboard movement
|
|
||||||
if( !aHotKey && m_movingCursorWithKeyboard )
|
|
||||||
{
|
|
||||||
m_movingCursorWithKeyboard = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxPoint pos = aPosition;
|
|
||||||
wxPoint oldpos = GetCrossHairPosition();
|
|
||||||
bool eventHandled = GeneralControlKeyMovement( aHotKey, &pos, true );
|
|
||||||
|
|
||||||
SetCrossHairPosition( pos );
|
|
||||||
RefreshCrossHair( oldpos, aPosition, aDC );
|
|
||||||
|
|
||||||
if( aHotKey && OnHotKey( aDC, aHotKey, aPosition ) )
|
|
||||||
{
|
|
||||||
eventHandled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateStatusBar();
|
|
||||||
|
|
||||||
return eventHandled;
|
|
||||||
}
|
|
|
@ -30,9 +30,7 @@ const KICAD_T GERBER_COLLECTOR::AllItems[] = {
|
||||||
/**
|
/**
|
||||||
* Function Inspect
|
* Function Inspect
|
||||||
* is the examining function within the INSPECTOR which is passed to the
|
* is the examining function within the INSPECTOR which is passed to the
|
||||||
* Iterate function. Searches and collects all the objects that the old
|
* Iterate function.
|
||||||
* function PcbGeneralLocateAndDisplay() would find, except that it keeps all
|
|
||||||
* that it finds and does not do any displaying.
|
|
||||||
*
|
*
|
||||||
* @param testItem An EDA_ITEM to examine.
|
* @param testItem An EDA_ITEM to examine.
|
||||||
* @param testData not used here.
|
* @param testData not used here.
|
||||||
|
|
|
@ -230,8 +230,6 @@ public:
|
||||||
void ReCreateOptToolbar();
|
void ReCreateOptToolbar();
|
||||||
|
|
||||||
void ReCreateMenuBar() override;
|
void ReCreateMenuBar() override;
|
||||||
void OnLeftClick( wxDC* aDC, const wxPoint& aMousePos ) override;
|
|
||||||
void OnLeftDClick( wxDC* aDC, const wxPoint& aMousePos ) override;
|
|
||||||
void OnUpdateSelectZoom( wxUpdateUIEvent& aEvent );
|
void OnUpdateSelectZoom( wxUpdateUIEvent& aEvent );
|
||||||
double BestZoom() override;
|
double BestZoom() override;
|
||||||
void UpdateStatusBar() override;
|
void UpdateStatusBar() override;
|
||||||
|
@ -463,17 +461,6 @@ public:
|
||||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Function OnHotKey.
|
|
||||||
* ** Commands are case insensitive **
|
|
||||||
* Some commands are relatives to the item under the mouse cursor
|
|
||||||
* @param aDC = current device context
|
|
||||||
* @param aHotkeyCode = hotkey code (ascii or wxWidget code for special keys)
|
|
||||||
* @param aPosition The cursor position in logical (drawing) units.
|
|
||||||
* @param aItem = NULL or pointer on a EDA_ITEM under the mouse cursor
|
|
||||||
*/
|
|
||||||
bool OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition, EDA_ITEM* aItem = NULL ) override;
|
|
||||||
|
|
||||||
GERBER_DRAW_ITEM* Locate( const wxPoint& aPosition, int typeloc );
|
GERBER_DRAW_ITEM* Locate( const wxPoint& aPosition, int typeloc );
|
||||||
|
|
||||||
void Process_Config( wxCommandEvent& event );
|
void Process_Config( wxCommandEvent& event );
|
||||||
|
@ -568,8 +555,6 @@ public:
|
||||||
bool LoadGerberJobFile( const wxString& aFileName );
|
bool LoadGerberJobFile( const wxString& aFileName );
|
||||||
|
|
||||||
|
|
||||||
bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey = 0 ) override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set Size Items (Lines, Flashes) from DCodes List
|
* Set Size Items (Lines, Flashes) from DCodes List
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -150,68 +150,3 @@ EDA_HOTKEY* GERBVIEW_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool GERBVIEW_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition, EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
#define CHANGE( x ) ( x ) = not (x )
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
/* Convert lower to upper case (the usual toupper function has problem with non ascii
|
|
||||||
* codes like function keys */
|
|
||||||
if( (aHotkeyCode >= 'a') && (aHotkeyCode <= 'z') )
|
|
||||||
aHotkeyCode += 'A' - 'a';
|
|
||||||
|
|
||||||
EDA_HOTKEY * HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, gerbviewHotkeyList );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch( HK_Descr->m_Idcommand )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case HK_NOT_FOUND:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case HK_HELP: // Display Current hotkey list
|
|
||||||
DisplayHotkeyList( this, GerbviewHotkeysDescr );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_PREFERENCES:
|
|
||||||
cmd.SetId( wxID_PREFERENCES );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_LOCAL_COORD: // Reset the relative coord
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_PREVIOUS:
|
|
||||||
if( GetActiveLayer() > 0 )
|
|
||||||
{
|
|
||||||
SetActiveLayer( GetActiveLayer() - 1, true );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_NEXT:
|
|
||||||
if( GetActiveLayer() < GERBER_DRAWLAYERS_COUNT - 1 )
|
|
||||||
{
|
|
||||||
SetActiveLayer( GetActiveLayer() + 1, true );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_CANVAS_CAIRO:
|
|
||||||
cmd.SetId( ID_MENU_CANVAS_CAIRO );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_CANVAS_OPENGL:
|
|
||||||
cmd.SetId( ID_MENU_CANVAS_OPENGL );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2011-2014 Jean-Pierre Charras jp.charras at wanadoo.fr
|
|
||||||
* Copyright (C) 1992-2014 KiCad Developers, see change_log.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 <fctsys.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
|
|
||||||
#include <gerbview.h>
|
|
||||||
#include <gerbview_frame.h>
|
|
||||||
#include <gerber_file_image.h>
|
|
||||||
#include <gerber_file_image_list.h>
|
|
||||||
#include <dialog_helpers.h>
|
|
||||||
#include <gerbview_id.h>
|
|
||||||
|
|
||||||
/* Process the command triggered by the left button of the mouse
|
|
||||||
* currently: just display info in the message panel.
|
|
||||||
*/
|
|
||||||
void GERBVIEW_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|
||||||
{
|
|
||||||
SetToolID( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor(), wxEmptyString );
|
|
||||||
|
|
||||||
GERBER_DRAW_ITEM* DrawStruct = Locate( aPosition, CURSEUR_OFF_GRILLE );
|
|
||||||
|
|
||||||
GetScreen()->SetCurItem( DrawStruct );
|
|
||||||
|
|
||||||
if( DrawStruct == NULL )
|
|
||||||
{
|
|
||||||
GERBER_FILE_IMAGE* gerber = GetGbrImage( GetActiveLayer() );
|
|
||||||
|
|
||||||
if( gerber )
|
|
||||||
gerber->DisplayImageInfo( this );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Called on a double click of left mouse button.
|
|
||||||
*/
|
|
||||||
void GERBVIEW_FRAME::OnLeftDClick( wxDC* aDC, const wxPoint& aPosition )
|
|
||||||
{
|
|
||||||
// Currently: no nothing
|
|
||||||
}
|
|
|
@ -425,7 +425,6 @@ public:
|
||||||
virtual void ExecuteRemoteCommand( const char* cmdline ){}
|
virtual void ExecuteRemoteCommand( const char* cmdline ){}
|
||||||
|
|
||||||
void OnMenuOpen( wxMenuEvent& event );
|
void OnMenuOpen( wxMenuEvent& event );
|
||||||
void OnMouseEvent( wxMouseEvent& event );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* After calling this function, if the left mouse button
|
* After calling this function, if the left mouse button
|
||||||
|
@ -455,9 +454,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const = 0;
|
virtual EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const = 0;
|
||||||
|
|
||||||
virtual bool OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
|
|
||||||
EDA_ITEM* aItem = NULL );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add standard zoom commands and submenu zoom and grid selection to a popup menu
|
* Add standard zoom commands and submenu zoom and grid selection to a popup menu
|
||||||
* uses zoom hotkeys info base to add hotkeys info to menu commands
|
* uses zoom hotkeys info base to add hotkeys info to menu commands
|
||||||
|
@ -609,22 +605,6 @@ public:
|
||||||
// EDA_DRAW_FRAME.
|
// EDA_DRAW_FRAME.
|
||||||
void OnUpdateSelectGrid( wxUpdateUIEvent& aEvent );
|
void OnUpdateSelectGrid( wxUpdateUIEvent& aEvent );
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform application specific control using \a aDC at \a aPosition in logical units.
|
|
||||||
* <p>
|
|
||||||
* Override this function for application specific control. This function gets
|
|
||||||
* called on every mouse and key event.
|
|
||||||
*</p>
|
|
||||||
* @param aDC A device context.
|
|
||||||
* @param aPosition The current cursor position in logical (drawing) units.
|
|
||||||
* @param aHotKey A key event used for application specific control if not zero.
|
|
||||||
* @return true if the hotkey code is handled (captured).
|
|
||||||
*/
|
|
||||||
virtual bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey = 0 )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recalculate the size of toolbars and display panel when the frame size changes.
|
* Recalculate the size of toolbars and display panel when the frame size changes.
|
||||||
*/
|
*/
|
||||||
|
@ -723,8 +703,6 @@ public:
|
||||||
wxString GetToolMsg() { return m_toolMsg; }
|
wxString GetToolMsg() { return m_toolMsg; }
|
||||||
virtual void RedrawActiveWindow( wxDC* DC, bool EraseBg ) = 0;
|
virtual void RedrawActiveWindow( wxDC* DC, bool EraseBg ) = 0;
|
||||||
virtual void OnLeftClick( wxDC* DC, const wxPoint& MousePos ) {}
|
virtual void OnLeftClick( wxDC* DC, const wxPoint& MousePos ) {}
|
||||||
virtual void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) {}
|
|
||||||
virtual bool OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu ) { return true; }
|
|
||||||
virtual void ToolOnRightClick( wxCommandEvent& event );
|
virtual void ToolOnRightClick( wxCommandEvent& event );
|
||||||
void AdjustScrollBars( const wxPoint& aCenterPosition );
|
void AdjustScrollBars( const wxPoint& aCenterPosition );
|
||||||
|
|
||||||
|
|
|
@ -215,17 +215,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void OnActivate( wxActivateEvent& event );
|
void OnActivate( wxActivateEvent& event );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function OnTimer
|
|
||||||
* handle timer events
|
|
||||||
* <p>
|
|
||||||
* The class will start a timer when a mouse-up event is handled. If a
|
|
||||||
* double-click event is not handled inside of a specified interval,
|
|
||||||
* the timer event will fire, causing the single-click event to be handled.
|
|
||||||
* Otherwise, the system will process the double-click.
|
|
||||||
*/
|
|
||||||
void OnTimer( wxTimerEvent& event );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function DoPrepareDC
|
* Function DoPrepareDC
|
||||||
* sets up the device context \a aDC for drawing.
|
* sets up the device context \a aDC for drawing.
|
||||||
|
@ -269,10 +258,8 @@ public:
|
||||||
#if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
|
#if wxCHECK_VERSION( 3, 1, 0 ) || defined( USE_OSX_MAGNIFY_EVENT )
|
||||||
void OnMagnify( wxMouseEvent& event );
|
void OnMagnify( wxMouseEvent& event );
|
||||||
#endif
|
#endif
|
||||||
void OnMouseEvent( wxMouseEvent& event );
|
|
||||||
void OnMouseEntering( wxMouseEvent& aEvent );
|
void OnMouseEntering( wxMouseEvent& aEvent );
|
||||||
void OnMouseLeaving( wxMouseEvent& event );
|
void OnMouseLeaving( wxMouseEvent& event );
|
||||||
void OnKeyEvent( wxKeyEvent& event );
|
|
||||||
void OnCharHook( wxKeyEvent& event );
|
void OnCharHook( wxKeyEvent& event );
|
||||||
|
|
||||||
void OnPan( wxCommandEvent& event );
|
void OnPan( wxCommandEvent& event );
|
||||||
|
@ -287,13 +274,6 @@ public:
|
||||||
void SetGrid( const wxRealPoint& size );
|
void SetGrid( const wxRealPoint& size );
|
||||||
wxRealPoint GetGrid();
|
wxRealPoint GetGrid();
|
||||||
|
|
||||||
/**
|
|
||||||
* Function OnRightClick
|
|
||||||
* builds and displays a context menu on a right mouse button click.
|
|
||||||
* @return true if the context menu is shown, or false
|
|
||||||
*/
|
|
||||||
bool OnRightClick( wxMouseEvent& event );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function IsPointOnDisplay
|
* Function IsPointOnDisplay
|
||||||
* @param aPosition The position to test in logical (drawing) units.
|
* @param aPosition The position to test in logical (drawing) units.
|
||||||
|
@ -470,33 +450,4 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class EDA_CROSS_HAIR_MANAGER
|
|
||||||
* is used to hide the cross hair and restore it when the class goes out of scope.
|
|
||||||
*/
|
|
||||||
class EDA_CROSS_HAIR_MANAGER
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
EDA_CROSS_HAIR_MANAGER( EDA_DRAW_PANEL* aPanel, wxDC* aDC ) :
|
|
||||||
m_panel( aPanel ),
|
|
||||||
m_dc( aDC )
|
|
||||||
{
|
|
||||||
if( aPanel && aDC )
|
|
||||||
aPanel->CrossHairOff( aDC );
|
|
||||||
}
|
|
||||||
|
|
||||||
~EDA_CROSS_HAIR_MANAGER()
|
|
||||||
{
|
|
||||||
if( m_panel && m_dc )
|
|
||||||
m_panel->CrossHairOn( m_dc );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
EDA_DRAW_PANEL* m_panel;
|
|
||||||
wxDC* m_dc;
|
|
||||||
|
|
||||||
DECLARE_NO_COPY_CLASS( EDA_CROSS_HAIR_MANAGER )
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* #ifndef PANEL_WXSTRUCT_H */
|
#endif /* #ifndef PANEL_WXSTRUCT_H */
|
||||||
|
|
|
@ -240,23 +240,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual bool CreateAndShow3D_Frame( bool aForceRecreateIfNotOwner );
|
virtual bool CreateAndShow3D_Frame( bool aForceRecreateIfNotOwner );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function PcbGeneralLocateAndDisplay
|
|
||||||
* searches for an item under the mouse cursor.
|
|
||||||
* Items are searched first on the current working layer.
|
|
||||||
* If nothing found, an item will be searched without layer restriction.
|
|
||||||
* If more than one item is found meeting the current working layer
|
|
||||||
* criterion, then a popup menu is shown which allows the user to pick
|
|
||||||
* which item he/she is interested in. Once an item is chosen, then it
|
|
||||||
* is make the "current item" and the status window is updated to reflect
|
|
||||||
* this.
|
|
||||||
*
|
|
||||||
* @param aHotKeyCode The hotkey which relates to the caller and determines
|
|
||||||
* the type of search to be performed. If zero, then
|
|
||||||
* the mouse tools will be tested instead.
|
|
||||||
*/
|
|
||||||
BOARD_ITEM* PcbGeneralLocateAndDisplay( int aHotKeyCode = 0 );
|
|
||||||
|
|
||||||
void ProcessItemSelection( wxCommandEvent& event );
|
void ProcessItemSelection( wxCommandEvent& event );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -341,21 +324,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void PlaceModule( MODULE* aModule, wxDC* aDC, bool aRecreateRatsnest = true );
|
void PlaceModule( MODULE* aModule, wxDC* aDC, bool aRecreateRatsnest = true );
|
||||||
|
|
||||||
// module texts
|
|
||||||
void RotateTextModule( TEXTE_MODULE* Text, wxDC* DC );
|
|
||||||
void DeleteTextModule( TEXTE_MODULE* Text );
|
|
||||||
void PlaceTexteModule( TEXTE_MODULE* Text, wxDC* DC );
|
|
||||||
void StartMoveTexteModule( TEXTE_MODULE* Text, wxDC* DC );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function ResetTextSize
|
|
||||||
* resets given field text size and width to current settings in
|
|
||||||
* Preferences->Dimensions->Texts and Drawings.
|
|
||||||
* @param aItem is the item to be reset, either TEXTE_PCB or TEXTE_MODULE.
|
|
||||||
* @param aDC is the drawing context.
|
|
||||||
*/
|
|
||||||
void ResetTextSize( BOARD_ITEM* aItem, wxDC* aDC );
|
|
||||||
|
|
||||||
void InstallPadOptionsFrame( D_PAD* pad );
|
void InstallPadOptionsFrame( D_PAD* pad );
|
||||||
|
|
||||||
void AddPad( MODULE* Module, bool draw );
|
void AddPad( MODULE* Module, bool draw );
|
||||||
|
|
|
@ -139,85 +139,3 @@ EDA_HOTKEY* PL_EDITOR_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PL_EDITOR_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition,
|
|
||||||
EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
/* Convert lower to upper case (the usual toupper function has problem with non ascii
|
|
||||||
* codes like function keys */
|
|
||||||
if( (aHotkeyCode >= 'a') && (aHotkeyCode <= 'z') )
|
|
||||||
aHotkeyCode += 'A' - 'a';
|
|
||||||
|
|
||||||
EDA_HOTKEY * HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, s_PlEditor_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, s_Common_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch( HK_Descr->m_Idcommand )
|
|
||||||
{
|
|
||||||
case HK_NOT_FOUND:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case HK_LEFT_CLICK:
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
OnLeftDClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_NEW:
|
|
||||||
cmd.SetId( wxID_NEW );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_OPEN:
|
|
||||||
cmd.SetId( wxID_OPEN );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SAVE:
|
|
||||||
cmd.SetId( wxID_SAVE );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SAVEAS:
|
|
||||||
cmd.SetId( wxID_SAVEAS );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_PRINT:
|
|
||||||
cmd.SetId( wxID_PRINT );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_LOCAL_COORD: // Reset the relative coord
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_HELP: // Display Current hotkey list
|
|
||||||
DisplayHotkeyList( this, PlEditorHotkeysDescr );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_PREFERENCES:
|
|
||||||
cmd.SetId( wxID_PREFERENCES );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SET_GRID_ORIGIN:
|
|
||||||
SetGridOrigin( GetCrossHairPosition() );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
wxMessageBox( wxT( "Unknown hotkey" ) );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
|
@ -217,18 +217,6 @@ public:
|
||||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Function OnHotKey.
|
|
||||||
* ** Commands are case insensitive **
|
|
||||||
* Some commands are relatives to the item under the mouse cursor
|
|
||||||
* @param aDC = current device context
|
|
||||||
* @param aHotkeyCode = hotkey code (ascii or wxWidget code for special keys)
|
|
||||||
* @param aPosition The cursor position in logical (drawing) units.
|
|
||||||
* @param aItem = NULL or pointer on a EDA_ITEM under the mouse cursor
|
|
||||||
*/
|
|
||||||
bool OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition,
|
|
||||||
EDA_ITEM* aItem = NULL ) override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function ToPrinter
|
* Function ToPrinter
|
||||||
* Open a dialog frame to print layers
|
* Open a dialog frame to print layers
|
||||||
|
|
|
@ -232,31 +232,24 @@ set( PCBNEW_CLASS_SRCS
|
||||||
action_plugin.cpp
|
action_plugin.cpp
|
||||||
array_creator.cpp
|
array_creator.cpp
|
||||||
array_pad_name_provider.cpp
|
array_pad_name_provider.cpp
|
||||||
attribut.cpp
|
|
||||||
board_netlist_updater.cpp
|
board_netlist_updater.cpp
|
||||||
build_BOM_from_board.cpp
|
build_BOM_from_board.cpp
|
||||||
connect.cpp
|
connect.cpp
|
||||||
controle.cpp
|
|
||||||
cross-probing.cpp
|
cross-probing.cpp
|
||||||
deltrack.cpp
|
deltrack.cpp
|
||||||
dimension.cpp
|
dimension.cpp
|
||||||
dragsegm.cpp
|
dragsegm.cpp
|
||||||
drc.cpp
|
drc.cpp
|
||||||
drc_clearance_test_functions.cpp
|
drc_clearance_test_functions.cpp
|
||||||
edgemod.cpp
|
|
||||||
edit.cpp
|
edit.cpp
|
||||||
edit_pcb_text.cpp
|
|
||||||
edit_track_width.cpp
|
edit_track_width.cpp
|
||||||
editedge.cpp
|
|
||||||
editrack-part2.cpp
|
editrack-part2.cpp
|
||||||
editrack.cpp
|
editrack.cpp
|
||||||
edtxtmod.cpp
|
|
||||||
event_handlers_tracks_vias_sizes.cpp
|
event_handlers_tracks_vias_sizes.cpp
|
||||||
files.cpp
|
files.cpp
|
||||||
footprint_info_impl.cpp
|
footprint_info_impl.cpp
|
||||||
footprint_wizard.cpp
|
footprint_wizard.cpp
|
||||||
footprint_editor_utils.cpp
|
footprint_editor_utils.cpp
|
||||||
footprint_editor_onclick.cpp
|
|
||||||
footprint_editor_options.cpp
|
footprint_editor_options.cpp
|
||||||
fp_tree_synchronizing_adapter.cpp
|
fp_tree_synchronizing_adapter.cpp
|
||||||
footprint_edit_frame.cpp
|
footprint_edit_frame.cpp
|
||||||
|
@ -266,10 +259,7 @@ set( PCBNEW_CLASS_SRCS
|
||||||
generate_footprint_info.cpp
|
generate_footprint_info.cpp
|
||||||
grid_layer_box_helpers.cpp
|
grid_layer_box_helpers.cpp
|
||||||
grid_layer_box_helpers.h
|
grid_layer_box_helpers.h
|
||||||
highlight.cpp
|
|
||||||
hotkeys.cpp
|
hotkeys.cpp
|
||||||
hotkeys_board_editor.cpp
|
|
||||||
hotkeys_footprint_editor.cpp
|
|
||||||
initpcb.cpp
|
initpcb.cpp
|
||||||
layer_widget.cpp
|
layer_widget.cpp
|
||||||
load_select_footprint.cpp
|
load_select_footprint.cpp
|
||||||
|
@ -278,10 +268,7 @@ set( PCBNEW_CLASS_SRCS
|
||||||
menubar_pcb_editor.cpp
|
menubar_pcb_editor.cpp
|
||||||
microwave.cpp
|
microwave.cpp
|
||||||
minimun_spanning_tree.cpp
|
minimun_spanning_tree.cpp
|
||||||
move-drag_pads.cpp
|
|
||||||
move_or_drag_track.cpp
|
|
||||||
netlist.cpp
|
netlist.cpp
|
||||||
onleftclick.cpp
|
|
||||||
pad_edit_functions.cpp
|
pad_edit_functions.cpp
|
||||||
pad_naming.cpp
|
pad_naming.cpp
|
||||||
pcb_base_edit_frame.cpp
|
pcb_base_edit_frame.cpp
|
||||||
|
|
|
@ -1,126 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
|
|
||||||
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
|
||||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
|
||||||
* Copyright (C) 1992-2011 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file attribut.cpp
|
|
||||||
* @brief Track attribute flags editing.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <gr_basic.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <msgpanel.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <protos.h>
|
|
||||||
|
|
||||||
#include <class_track.h>
|
|
||||||
#include <class_board.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* Attribute change for 1 track segment.
|
|
||||||
* Attributes are
|
|
||||||
* TRACK_LOCKED protection against global delete
|
|
||||||
* TRACK_AR AutoRouted segment
|
|
||||||
*/
|
|
||||||
void PCB_EDIT_FRAME::Attribut_Segment( TRACK* track, wxDC* DC, bool Flag_On )
|
|
||||||
{
|
|
||||||
if( track == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
m_canvas->CrossHairOff( DC ); // Erase cursor shape
|
|
||||||
track->SetState( TRACK_LOCKED, Flag_On );
|
|
||||||
track->Draw( m_canvas, DC, GR_OR | GR_HIGHLIGHT );
|
|
||||||
m_canvas->CrossHairOn( DC ); // Display cursor shape
|
|
||||||
|
|
||||||
MSG_PANEL_ITEMS items;
|
|
||||||
track->GetMsgPanelInfo( m_UserUnits, items );
|
|
||||||
SetMsgPanel( items );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Attribute change for an entire track */
|
|
||||||
void PCB_EDIT_FRAME::Attribut_Track( TRACK* track, wxDC* DC, bool Flag_On )
|
|
||||||
{
|
|
||||||
TRACK* Track;
|
|
||||||
int nb_segm;
|
|
||||||
|
|
||||||
if( track == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_canvas->CrossHairOff( DC ); // Erase cursor shape
|
|
||||||
Track = GetBoard()->MarkTrace( GetBoard()->m_Track, track, &nb_segm, NULL, NULL, true );
|
|
||||||
DrawTraces( m_canvas, DC, Track, nb_segm, GR_OR | GR_HIGHLIGHT );
|
|
||||||
|
|
||||||
for( ; (Track != NULL) && (nb_segm > 0); nb_segm-- )
|
|
||||||
{
|
|
||||||
Track->SetState( TRACK_LOCKED, Flag_On );
|
|
||||||
Track->SetState( BUSY, false );
|
|
||||||
Track = Track->Next();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->CrossHairOn( DC ); // Display cursor shape
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Modify the flag TRACK_LOCKED according to Flag_On value,
|
|
||||||
* for all the segments related to net_code.
|
|
||||||
* if net_code < 0 all the segments are modified.
|
|
||||||
*/
|
|
||||||
void PCB_EDIT_FRAME::Attribut_net( wxDC* DC, int net_code, bool Flag_On )
|
|
||||||
{
|
|
||||||
TRACK* Track = GetBoard()->m_Track;
|
|
||||||
|
|
||||||
/* search the first segment for the selected net_code */
|
|
||||||
if( net_code >= 0 )
|
|
||||||
{
|
|
||||||
for( ; Track != NULL; Track = Track->Next() )
|
|
||||||
{
|
|
||||||
if( net_code == Track->GetNetCode() )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->CrossHairOff( DC ); // Erase cursor shape
|
|
||||||
|
|
||||||
while( Track ) /* Flag change */
|
|
||||||
{
|
|
||||||
if( ( net_code >= 0 ) && ( net_code != Track->GetNetCode() ) )
|
|
||||||
break;
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
Track->SetState( TRACK_LOCKED, Flag_On );
|
|
||||||
Track->Draw( m_canvas, DC, GR_OR | GR_HIGHLIGHT );
|
|
||||||
Track = Track->Next();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->CrossHairOn( DC ); // Display cursor shape
|
|
||||||
OnModify();
|
|
||||||
}
|
|
|
@ -1,314 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
|
|
||||||
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
|
||||||
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net>
|
|
||||||
* Copyright (C) 1992-2012 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file pcbnew/controle.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <pcbnew_id.h>
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_module.h>
|
|
||||||
#include <class_zone.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <protos.h>
|
|
||||||
#include <collectors.h>
|
|
||||||
#include <menus_helpers.h>
|
|
||||||
|
|
||||||
//external functions used here:
|
|
||||||
extern bool Magnetize( PCB_BASE_EDIT_FRAME* frame, int aCurrentTool,
|
|
||||||
wxSize aGridSize, wxPoint on_grid, wxPoint* curpos );
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function AllAreModulesAndReturnSmallestIfSo
|
|
||||||
* tests that all items in the collection are MODULEs and if so, returns the
|
|
||||||
* smallest MODULE.
|
|
||||||
* @return BOARD_ITEM* - The smallest or NULL.
|
|
||||||
*/
|
|
||||||
static BOARD_ITEM* AllAreModulesAndReturnSmallestIfSo( GENERAL_COLLECTOR* aCollector )
|
|
||||||
{
|
|
||||||
#if 0 // Dick: this is not consistent with name of this function, and does not
|
|
||||||
// work correctly using 'M' (move hotkey) when another module's (2nd module) reference
|
|
||||||
// is under a module (first module) and you want to move the reference.
|
|
||||||
// Another way to fix this would be to
|
|
||||||
// treat module text as copper layer content, and put the module text into
|
|
||||||
// the primary list. I like the coded behavior best. If it breaks something
|
|
||||||
// perhaps you need a different test before calling this function, which should
|
|
||||||
// do what its name says it does.
|
|
||||||
int count = aCollector->GetPrimaryCount(); // try to use preferred layer
|
|
||||||
if( 0 == count ) count = aCollector->GetCount();
|
|
||||||
#else
|
|
||||||
int count = aCollector->GetCount();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for( int i = 0; i<count; ++i )
|
|
||||||
{
|
|
||||||
if( (*aCollector)[i]->Type() != PCB_MODULE_T )
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// all are modules, now find smallest MODULE
|
|
||||||
|
|
||||||
int minDim = 0x7FFFFFFF;
|
|
||||||
int minNdx = 0;
|
|
||||||
|
|
||||||
for( int i = 0; i<count; ++i )
|
|
||||||
{
|
|
||||||
MODULE* module = (MODULE*) (*aCollector)[i];
|
|
||||||
|
|
||||||
int lx = module->GetBoundingBox().GetWidth();
|
|
||||||
int ly = module->GetBoundingBox().GetHeight();
|
|
||||||
|
|
||||||
int lmin = std::min( lx, ly );
|
|
||||||
|
|
||||||
if( lmin < minDim )
|
|
||||||
{
|
|
||||||
minDim = lmin;
|
|
||||||
minNdx = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (*aCollector)[minNdx];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// JEY TODO: RETIRE THIS
|
|
||||||
BOARD_ITEM* PCB_BASE_FRAME::PcbGeneralLocateAndDisplay( int aHotKeyCode )
|
|
||||||
{
|
|
||||||
BOARD_ITEM* item;
|
|
||||||
|
|
||||||
GENERAL_COLLECTORS_GUIDE guide = GetCollectorsGuide();
|
|
||||||
auto displ_opts = (PCB_DISPLAY_OPTIONS*)( GetDisplayOptions() );
|
|
||||||
|
|
||||||
// Assign to scanList the proper item types desired based on tool type
|
|
||||||
// or hotkey that is in play.
|
|
||||||
|
|
||||||
const KICAD_T* scanList = NULL;
|
|
||||||
|
|
||||||
if( aHotKeyCode )
|
|
||||||
{
|
|
||||||
// @todo: add switch here and add calls to PcbGeneralLocateAndDisplay( int aHotKeyCode )
|
|
||||||
// when searching is needed from a hotkey handler
|
|
||||||
}
|
|
||||||
else if( GetToolId() == ID_NO_TOOL_SELECTED )
|
|
||||||
{
|
|
||||||
scanList = (displ_opts->m_DisplayZonesMode == 0) ?
|
|
||||||
GENERAL_COLLECTOR::AllBoardItems :
|
|
||||||
GENERAL_COLLECTOR::AllButZones;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch( GetToolId() )
|
|
||||||
{
|
|
||||||
case ID_LOCAL_RATSNEST_BUTT:
|
|
||||||
scanList = GENERAL_COLLECTOR::PadsOrModules;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_TRACK_BUTT:
|
|
||||||
scanList = GENERAL_COLLECTOR::Tracks;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_MODULE_BUTT:
|
|
||||||
scanList = GENERAL_COLLECTOR::Modules;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_ZONES_BUTT:
|
|
||||||
case ID_PCB_KEEPOUT_BUTT:
|
|
||||||
scanList = GENERAL_COLLECTOR::Zones;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
scanList = displ_opts->m_DisplayZonesMode == 0 ?
|
|
||||||
GENERAL_COLLECTOR::AllBoardItems :
|
|
||||||
GENERAL_COLLECTOR::AllButZones;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_Collector->Collect( m_Pcb, scanList, RefPos( true ), guide );
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// debugging: print out the collected items, showing their priority order too.
|
|
||||||
for( int i = 0; i<m_Collector->GetCount(); ++i )
|
|
||||||
(*m_Collector)[i]->Show( 0, std::cout );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Trigger the selection of the current edge for zones
|
|
||||||
for( int ii = 0; ii < m_Collector->GetCount(); ii++ )
|
|
||||||
{
|
|
||||||
item = (*m_Collector)[ii];
|
|
||||||
|
|
||||||
if( item->Type() == PCB_ZONE_AREA_T )
|
|
||||||
{
|
|
||||||
// We need to do the selection now because the menu text depends on it
|
|
||||||
ZONE_CONTAINER *zone = static_cast<ZONE_CONTAINER*>( item );
|
|
||||||
int accuracy = KiROUND( 5 * guide.OnePixelInIU() );
|
|
||||||
zone->SetSelectedCorner( RefPos( true ), accuracy );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( m_Collector->GetCount() <= 1 )
|
|
||||||
{
|
|
||||||
item = (*m_Collector)[0];
|
|
||||||
SetCurItem( item );
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the count is 2, and first item is a pad or module text, and the 2nd item is its
|
|
||||||
// parent module:
|
|
||||||
else if( m_Collector->GetCount() == 2
|
|
||||||
&& ( (*m_Collector)[0]->Type() == PCB_PAD_T || (*m_Collector)[0]->Type() ==
|
|
||||||
PCB_MODULE_TEXT_T )
|
|
||||||
&& (*m_Collector)[1]->Type() == PCB_MODULE_T && (*m_Collector)[0]->GetParent()==
|
|
||||||
(*m_Collector)[1] )
|
|
||||||
{
|
|
||||||
item = (*m_Collector)[0];
|
|
||||||
SetCurItem( item );
|
|
||||||
}
|
|
||||||
// if all are modules, find the smallest one among the primary choices
|
|
||||||
else if( ( item = AllAreModulesAndReturnSmallestIfSo( m_Collector ) ) != NULL )
|
|
||||||
{
|
|
||||||
SetCurItem( item );
|
|
||||||
}
|
|
||||||
|
|
||||||
else // we can't figure out which item user wants, do popup menu so user can choose
|
|
||||||
{
|
|
||||||
wxMenu itemMenu;
|
|
||||||
|
|
||||||
// Give a title to the selection menu. This is also a cancel menu item
|
|
||||||
AddMenuItem( &itemMenu, wxID_NONE, _( "Clarify Selection" ),
|
|
||||||
KiBitmap( info_xpm ) );
|
|
||||||
itemMenu.AppendSeparator();
|
|
||||||
|
|
||||||
int limit = std::min( MAX_ITEMS_IN_PICKER, m_Collector->GetCount() );
|
|
||||||
|
|
||||||
for( int i = 0; i<limit; ++i )
|
|
||||||
{
|
|
||||||
wxString text;
|
|
||||||
item = (*m_Collector)[i];
|
|
||||||
|
|
||||||
text = item->GetSelectMenuText( m_UserUnits );
|
|
||||||
|
|
||||||
BITMAP_DEF xpm = item->GetMenuImage();
|
|
||||||
|
|
||||||
AddMenuItem( &itemMenu, ID_POPUP_PCB_ITEM_SELECTION_START + i, text, KiBitmap( xpm ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* @todo: rather than assignment to true, these should be increment and decrement
|
|
||||||
* operators throughout _everywhere_.
|
|
||||||
* That way we can handle nesting.
|
|
||||||
* But I tried that and found there cases where the assignment to true (converted to
|
|
||||||
* a m_IgnoreMouseEvents++ )
|
|
||||||
* was not balanced with the -- (now m_IgnoreMouseEvents=false), so I had to revert.
|
|
||||||
* Somebody should track down these and make them balanced.
|
|
||||||
* m_canvas->SetIgnoreMouseEvents( true );
|
|
||||||
*/
|
|
||||||
|
|
||||||
// this menu's handler is void PCB_BASE_FRAME::ProcessItemSelection()
|
|
||||||
// and it calls SetCurItem() which in turn calls DisplayInfo() on the item.
|
|
||||||
m_canvas->SetAbortRequest( true ); // changed in false if an item is selected
|
|
||||||
PopupMenu( &itemMenu );
|
|
||||||
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
|
|
||||||
// The function ProcessItemSelection() has set the current item, return it.
|
|
||||||
if( m_canvas->GetAbortRequest() ) // Nothing selected
|
|
||||||
item = NULL;
|
|
||||||
else
|
|
||||||
item = GetCurItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PCB_EDIT_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey )
|
|
||||||
{
|
|
||||||
// Filter out the 'fake' mouse motion after a keyboard movement
|
|
||||||
if( !aHotKey && m_movingCursorWithKeyboard )
|
|
||||||
{
|
|
||||||
m_movingCursorWithKeyboard = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// when moving mouse, use the "magnetic" grid, unless the shift+ctrl keys is pressed
|
|
||||||
// for next cursor position
|
|
||||||
// ( shift or ctrl key down are PAN command with mouse wheel)
|
|
||||||
bool snapToGrid = true;
|
|
||||||
|
|
||||||
if( !aHotKey && wxGetKeyState( WXK_SHIFT ) && wxGetKeyState( WXK_CONTROL ) )
|
|
||||||
snapToGrid = false;
|
|
||||||
|
|
||||||
wxPoint oldpos = GetCrossHairPosition();
|
|
||||||
wxPoint pos = aPosition;
|
|
||||||
bool keyHandled = GeneralControlKeyMovement( aHotKey, &pos, snapToGrid );
|
|
||||||
|
|
||||||
// Put cursor in new position, according to the zoom keys (if any).
|
|
||||||
SetCrossHairPosition( pos, snapToGrid );
|
|
||||||
|
|
||||||
/* Put cursor on grid or a pad centre if requested. If the tool DELETE is active the
|
|
||||||
* cursor is left off grid this is better to reach items to delete off grid,
|
|
||||||
*/
|
|
||||||
if( GetToolId() == ID_PCB_DELETE_ITEM_BUTT )
|
|
||||||
snapToGrid = false;
|
|
||||||
|
|
||||||
wxPoint curs_pos = pos;
|
|
||||||
|
|
||||||
wxRealPoint gridSize = GetScreen()->GetGridSize();
|
|
||||||
wxSize igridsize;
|
|
||||||
igridsize.x = KiROUND( gridSize.x );
|
|
||||||
igridsize.y = KiROUND( gridSize.y );
|
|
||||||
|
|
||||||
if( Magnetize( this, GetToolId(), igridsize, curs_pos, &pos ) )
|
|
||||||
{
|
|
||||||
SetCrossHairPosition( pos, false );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// If there's no intrusion and DRC is active, we pass the cursor
|
|
||||||
// "as is", and let ShowNewTrackWhenMovingCursor figure out what to do.
|
|
||||||
if( !Settings().m_legacyDrcOn || !g_CurrentTrackSegment ||
|
|
||||||
(BOARD_ITEM*)g_CurrentTrackSegment != this->GetCurItem() ||
|
|
||||||
!LocateIntrusion( m_Pcb->m_Track, g_CurrentTrackSegment,
|
|
||||||
GetScreen()->m_Active_Layer, RefPos( true ) ) )
|
|
||||||
{
|
|
||||||
SetCrossHairPosition( curs_pos, snapToGrid );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RefreshCrossHair( oldpos, aPosition, aDC );
|
|
||||||
|
|
||||||
if( aHotKey && OnHotKey( aDC, aHotKey, aPosition ) )
|
|
||||||
{
|
|
||||||
keyHandled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateStatusBar(); // Display new cursor coordinates
|
|
||||||
|
|
||||||
return keyHandled;
|
|
||||||
}
|
|
|
@ -172,34 +172,4 @@ void DrawSegmentWhileMovingFootprint( EDA_DRAW_PANEL* panel, wxDC* DC );
|
||||||
*/
|
*/
|
||||||
void EraseDragList();
|
void EraseDragList();
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Collect_TrackSegmentsToDrag.
|
|
||||||
* used to collect track segments in drag track segment
|
|
||||||
* Build the list of tracks connected to the ref point by calling
|
|
||||||
* AddSegmentToDragList for each selected track
|
|
||||||
* Net codes must be up to date, because only tracks having the right net code are tested.
|
|
||||||
*
|
|
||||||
* @param aPcb A point the the #BOARD object to collect track segment to drag.
|
|
||||||
* @param aRefPos = reference point of connection
|
|
||||||
* @param aLayerMask = layers mask to collect tracks
|
|
||||||
* @param aNetCode = the net code to consider
|
|
||||||
* @param aMaxDist = max distance from aRefPos to a track end candidate to collect the track
|
|
||||||
*/
|
|
||||||
void Collect_TrackSegmentsToDrag( BOARD* aPcb, const wxPoint& aRefPos, LSET aLayerMask,
|
|
||||||
int aNetCode, int aMaxDist );
|
|
||||||
|
|
||||||
/* Add aTrack to the drag list
|
|
||||||
* flag = STARTPOINT (if the point to drag is the start point of Track)
|
|
||||||
* or ENDPOINT (if the point to drag is the end point of Track)
|
|
||||||
*/
|
|
||||||
void AddSegmentToDragList( int flag, TRACK* aTrack );
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Undraw the track segments in list, and set the EDIT flag
|
|
||||||
* Usually called after the track list is built, to prepare
|
|
||||||
* the redraw of the list when the mouse is moved
|
|
||||||
*/
|
|
||||||
void UndrawAndMarkSegmentsToDrag( EDA_DRAW_PANEL* aCanvas, wxDC* aDC );
|
|
||||||
|
|
||||||
|
|
||||||
#endif // _DRAG_H_
|
#endif // _DRAG_H_
|
||||||
|
|
|
@ -299,108 +299,3 @@ void EraseDragList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AddSegmentToDragList( int flag, TRACK* aTrack )
|
|
||||||
{
|
|
||||||
DRAG_SEGM_PICKER wrapper( aTrack );
|
|
||||||
|
|
||||||
if( flag & STARTPOINT )
|
|
||||||
{
|
|
||||||
wrapper.m_TempFlags |= STARTPOINT;
|
|
||||||
aTrack->SetFlags( STARTPOINT );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( flag & ENDPOINT )
|
|
||||||
{
|
|
||||||
wrapper.m_TempFlags |= ENDPOINT;
|
|
||||||
aTrack->SetFlags( ENDPOINT );
|
|
||||||
}
|
|
||||||
|
|
||||||
g_DragSegmentList.push_back( wrapper );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Collect_TrackSegmentsToDrag( BOARD* aPcb, const wxPoint& aRefPos, LSET aLayerMask,
|
|
||||||
int aNetCode, int aMaxDist )
|
|
||||||
{
|
|
||||||
TRACK* track = aPcb->m_Track->GetStartNetCode( aNetCode );
|
|
||||||
|
|
||||||
for( ; track; track = track->Next() )
|
|
||||||
{
|
|
||||||
if( track->GetNetCode() != aNetCode ) // not the same netcode: all candidates tested
|
|
||||||
break;
|
|
||||||
|
|
||||||
if( !( aLayerMask & track->GetLayerSet() ).any() )
|
|
||||||
continue; // Cannot be connected, not on the same layer
|
|
||||||
|
|
||||||
if( track->IsDragging() )
|
|
||||||
continue; // already put in list
|
|
||||||
|
|
||||||
STATUS_FLAGS flag = 0;
|
|
||||||
int maxdist = std::max( aMaxDist, track->GetWidth() / 2 );
|
|
||||||
|
|
||||||
if( (track->GetFlags() & STARTPOINT) == 0 )
|
|
||||||
{
|
|
||||||
wxPoint delta = track->GetStart() - aRefPos;
|
|
||||||
|
|
||||||
if( std::abs( delta.x ) <= maxdist && std::abs( delta.y ) <= maxdist )
|
|
||||||
{
|
|
||||||
int dist = KiROUND( EuclideanNorm( delta ) );
|
|
||||||
|
|
||||||
if( dist <= maxdist )
|
|
||||||
{
|
|
||||||
flag |= STARTPOINT;
|
|
||||||
|
|
||||||
if( track->Type() == PCB_VIA_T )
|
|
||||||
flag |= ENDPOINT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( (track->GetFlags() & ENDPOINT) == 0 )
|
|
||||||
{
|
|
||||||
wxPoint delta = track->GetEnd() - aRefPos;
|
|
||||||
|
|
||||||
if( std::abs( delta.x ) <= maxdist && std::abs( delta.y ) <= maxdist )
|
|
||||||
{
|
|
||||||
int dist = KiROUND( EuclideanNorm( delta ) );
|
|
||||||
|
|
||||||
if( dist <= maxdist )
|
|
||||||
flag |= ENDPOINT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: vias will be flagged with both STARTPOINT and ENDPOINT
|
|
||||||
// and must not be entered twice.
|
|
||||||
if( flag )
|
|
||||||
{
|
|
||||||
AddSegmentToDragList( flag, track );
|
|
||||||
|
|
||||||
// If a connected via is found at location aRefPos,
|
|
||||||
// collect also tracks connected by this via.
|
|
||||||
if( track->Type() == PCB_VIA_T )
|
|
||||||
Collect_TrackSegmentsToDrag( aPcb, aRefPos, track->GetLayerSet(),
|
|
||||||
aNetCode, track->GetWidth() / 2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void UndrawAndMarkSegmentsToDrag( EDA_DRAW_PANEL* aCanvas, wxDC* aDC )
|
|
||||||
{
|
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
|
||||||
{
|
|
||||||
TRACK* track = g_DragSegmentList[ii].m_Track;
|
|
||||||
|
|
||||||
track->Draw( aCanvas, aDC, GR_XOR );
|
|
||||||
track->SetState( IN_EDIT, false );
|
|
||||||
track->SetFlags( IS_DRAGGED );
|
|
||||||
|
|
||||||
if( g_DragSegmentList[ii].m_TempFlags & STARTPOINT )
|
|
||||||
track->SetFlags( STARTPOINT );
|
|
||||||
|
|
||||||
if( g_DragSegmentList[ii].m_TempFlags & ENDPOINT )
|
|
||||||
track->SetFlags( ENDPOINT );
|
|
||||||
|
|
||||||
track->Draw( aCanvas, aDC, GR_XOR );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,408 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
|
||||||
* Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
|
||||||
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@verizon.net>
|
|
||||||
* Copyright (C) 1992-2013 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file edgemod.cpp:
|
|
||||||
* @brief Functions to edit graphic items used to draw footprint edges.
|
|
||||||
*
|
|
||||||
* @todo - Arc functions not compete but menus are ready to use.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <trigo.h>
|
|
||||||
#include <gr_basic.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <confirm.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <base_units.h>
|
|
||||||
#include <dialog_text_entry.h>
|
|
||||||
|
|
||||||
#include <footprint_edit_frame.h>
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_module.h>
|
|
||||||
#include <class_edge_mod.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
|
|
||||||
|
|
||||||
static void ShowNewEdgeModule( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
|
|
||||||
bool erase );
|
|
||||||
static void Abort_Move_ModuleOutline( EDA_DRAW_PANEL* Panel, wxDC* DC );
|
|
||||||
static void ShowCurrentOutlineWhileMoving( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|
||||||
const wxPoint& aPosition, bool aErase );
|
|
||||||
|
|
||||||
static double ArcValue = 900;
|
|
||||||
static wxPoint MoveVector; // Move vector for move edge
|
|
||||||
static wxPoint CursorInitialPosition; // Mouse cursor initial position for move command
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::Start_Move_EdgeMod( EDGE_MODULE* aEdge, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( aEdge == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
aEdge->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
aEdge->SetFlags( IS_MOVED );
|
|
||||||
MoveVector.x = MoveVector.y = 0;
|
|
||||||
CursorInitialPosition = GetCrossHairPosition();
|
|
||||||
m_canvas->SetMouseCapture( ShowCurrentOutlineWhileMoving, Abort_Move_ModuleOutline );
|
|
||||||
SetCurItem( aEdge );
|
|
||||||
m_canvas->CallMouseCapture( DC, wxDefaultPosition, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::Place_EdgeMod( EDGE_MODULE* aEdge )
|
|
||||||
{
|
|
||||||
if( aEdge == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
aEdge->Move( -MoveVector );
|
|
||||||
|
|
||||||
aEdge->ClearFlags();
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
OnModify();
|
|
||||||
|
|
||||||
MODULE* module = (MODULE*) aEdge->GetParent();
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
|
|
||||||
m_canvas->Refresh( );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Redraw the current moved graphic item when mouse is moving
|
|
||||||
* Use this function to show an existing outline, in move command
|
|
||||||
*/
|
|
||||||
static void ShowCurrentOutlineWhileMoving( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|
||||||
const wxPoint& aPosition, bool aErase )
|
|
||||||
{
|
|
||||||
BASE_SCREEN* screen = aPanel->GetScreen();
|
|
||||||
EDGE_MODULE* edge = (EDGE_MODULE*) screen->GetCurItem();
|
|
||||||
|
|
||||||
if( edge == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MODULE* module = (MODULE*) edge->GetParent();
|
|
||||||
|
|
||||||
if( aErase )
|
|
||||||
{
|
|
||||||
edge->Draw( aPanel, aDC, GR_XOR, MoveVector );
|
|
||||||
}
|
|
||||||
|
|
||||||
MoveVector = -(aPanel->GetParent()->GetCrossHairPosition() - CursorInitialPosition);
|
|
||||||
|
|
||||||
edge->Draw( aPanel, aDC, GR_XOR, MoveVector );
|
|
||||||
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Redraw the current graphic item during its creation
|
|
||||||
* Use this function to show a new outline, in begin command
|
|
||||||
*/
|
|
||||||
static void ShowNewEdgeModule( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
|
|
||||||
bool aErase )
|
|
||||||
{
|
|
||||||
BASE_SCREEN* screen = aPanel->GetScreen();
|
|
||||||
EDGE_MODULE* edge = (EDGE_MODULE*) screen->GetCurItem();
|
|
||||||
|
|
||||||
if( edge == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MODULE* module = (MODULE*) edge->GetParent();
|
|
||||||
|
|
||||||
// if( erase )
|
|
||||||
{
|
|
||||||
edge->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
}
|
|
||||||
|
|
||||||
edge->SetEnd( aPanel->GetParent()->GetCrossHairPosition() );
|
|
||||||
|
|
||||||
// Update relative coordinate.
|
|
||||||
edge->SetEnd0( edge->GetEnd() - module->GetPosition() );
|
|
||||||
|
|
||||||
wxPoint pt( edge->GetEnd0() );
|
|
||||||
|
|
||||||
RotatePoint( &pt, -module->GetOrientation() );
|
|
||||||
|
|
||||||
edge->SetEnd0( pt );
|
|
||||||
|
|
||||||
edge->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::Edit_Edge_Width( EDGE_MODULE* aEdge )
|
|
||||||
{
|
|
||||||
MODULE* module = GetBoard()->m_Modules;
|
|
||||||
|
|
||||||
SaveCopyInUndoList( module, UR_CHANGED );
|
|
||||||
|
|
||||||
if( aEdge == NULL )
|
|
||||||
{
|
|
||||||
for( BOARD_ITEM *item = module->GraphicalItemsList(); item; item = item->Next() )
|
|
||||||
{
|
|
||||||
aEdge = dyn_cast<EDGE_MODULE*>( item );
|
|
||||||
|
|
||||||
if( aEdge )
|
|
||||||
aEdge->SetWidth( GetDesignSettings().GetLineThickness( aEdge->GetLayer() ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
aEdge->SetWidth( GetDesignSettings().GetLineThickness( aEdge->GetLayer() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
module->SetLastEditTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::Edit_Edge_Layer( EDGE_MODULE* aEdge )
|
|
||||||
{
|
|
||||||
// note: if aEdge == NULL, all outline segments will be modified
|
|
||||||
|
|
||||||
MODULE* module = GetBoard()->m_Modules;
|
|
||||||
PCB_LAYER_ID layer = F_SilkS;
|
|
||||||
bool modified = false;
|
|
||||||
|
|
||||||
if( aEdge )
|
|
||||||
layer = aEdge->GetLayer();
|
|
||||||
|
|
||||||
// Ask for the new layer
|
|
||||||
PCB_LAYER_ID new_layer = SelectLayer( layer, Edge_Cuts );
|
|
||||||
|
|
||||||
if( layer < 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( IsCopperLayer( new_layer ) )
|
|
||||||
{
|
|
||||||
// an edge is put on a copper layer, and it is very dangerous.
|
|
||||||
// A confirmation is requested
|
|
||||||
if( !IsOK( this,
|
|
||||||
_( "The graphic item will be on a copper layer.\n"
|
|
||||||
"This is very dangerous. Are you sure?" ) ) )
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !aEdge )
|
|
||||||
{
|
|
||||||
for( BOARD_ITEM *item = module->GraphicalItemsList() ; item != NULL;
|
|
||||||
item = item->Next() )
|
|
||||||
{
|
|
||||||
aEdge = dyn_cast<EDGE_MODULE*>( item );
|
|
||||||
|
|
||||||
if( aEdge && (aEdge->GetLayer() != new_layer) )
|
|
||||||
{
|
|
||||||
if( ! modified ) // save only once
|
|
||||||
SaveCopyInUndoList( module, UR_CHANGED );
|
|
||||||
aEdge->SetLayer( new_layer );
|
|
||||||
modified = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( aEdge->GetLayer() != new_layer )
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( module, UR_CHANGED );
|
|
||||||
aEdge->SetLayer( new_layer );
|
|
||||||
modified = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( modified )
|
|
||||||
{
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
module->SetLastEditTime();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::Delete_Edge_Module( EDGE_MODULE* aEdge )
|
|
||||||
{
|
|
||||||
if( aEdge == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( aEdge->Type() != PCB_MODULE_EDGE_T )
|
|
||||||
{
|
|
||||||
wxLogDebug( wxT( "StructType error: PCB_MODULE_EDGE_T expected" ) );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MODULE* module = (MODULE*) aEdge->GetParent();
|
|
||||||
|
|
||||||
// Delete segment.
|
|
||||||
aEdge->DeleteStructure();
|
|
||||||
module->SetLastEditTime();
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* abort function in moving outline.
|
|
||||||
*/
|
|
||||||
static void Abort_Move_ModuleOutline( EDA_DRAW_PANEL* Panel, wxDC* DC )
|
|
||||||
{
|
|
||||||
EDGE_MODULE* edge = (EDGE_MODULE*) Panel->GetScreen()->GetCurItem();
|
|
||||||
|
|
||||||
Panel->SetMouseCapture( NULL, NULL );
|
|
||||||
|
|
||||||
if( edge && ( edge->Type() == PCB_MODULE_EDGE_T ) )
|
|
||||||
{
|
|
||||||
if( edge->IsNew() ) // On aborting, delete new outline.
|
|
||||||
{
|
|
||||||
MODULE* module = (MODULE*) edge->GetParent();
|
|
||||||
edge->Draw( Panel, DC, GR_XOR, MoveVector );
|
|
||||||
edge->DeleteStructure();
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
}
|
|
||||||
else // On aborting, move existing outline to its initial position.
|
|
||||||
{
|
|
||||||
edge->Draw( Panel, DC, GR_XOR, MoveVector );
|
|
||||||
edge->ClearFlags();
|
|
||||||
edge->Draw( Panel, DC, GR_OR );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Panel->GetScreen()->SetCurItem( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
EDGE_MODULE* FOOTPRINT_EDIT_FRAME::Begin_Edge_Module( EDGE_MODULE* aEdge,
|
|
||||||
wxDC* DC,
|
|
||||||
STROKE_T type_edge )
|
|
||||||
{
|
|
||||||
MODULE* module = GetBoard()->m_Modules;
|
|
||||||
|
|
||||||
if( module == NULL )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if( aEdge == NULL ) // Start a new edge item
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( module, UR_CHANGED );
|
|
||||||
|
|
||||||
aEdge = new EDGE_MODULE( module );
|
|
||||||
MoveVector.x = MoveVector.y = 0;
|
|
||||||
|
|
||||||
// Add the new item to the Drawings list head
|
|
||||||
module->GraphicalItemsList().PushFront( aEdge );
|
|
||||||
|
|
||||||
// Update characteristics of the segment or arc.
|
|
||||||
aEdge->SetFlags( IS_NEW );
|
|
||||||
aEdge->SetAngle( 0 );
|
|
||||||
aEdge->SetShape( type_edge );
|
|
||||||
|
|
||||||
if( aEdge->GetShape() == S_ARC )
|
|
||||||
aEdge->SetAngle( ArcValue );
|
|
||||||
|
|
||||||
aEdge->SetWidth( GetDesignSettings().GetLineThickness( GetActiveLayer() ) );
|
|
||||||
aEdge->SetLayer( GetActiveLayer() );
|
|
||||||
|
|
||||||
// Initialize the starting point of the new segment or arc
|
|
||||||
aEdge->SetStart( GetCrossHairPosition() );
|
|
||||||
|
|
||||||
// Initialize the ending point of the new segment or arc
|
|
||||||
aEdge->SetEnd( aEdge->GetStart() );
|
|
||||||
|
|
||||||
// Initialize the relative coordinates
|
|
||||||
aEdge->SetStart0( aEdge->GetStart() - module->GetPosition() );
|
|
||||||
|
|
||||||
RotatePoint( &aEdge->m_Start0, -module->GetOrientation() );
|
|
||||||
|
|
||||||
aEdge->m_End0 = aEdge->m_Start0;
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
m_canvas->SetMouseCapture( ShowNewEdgeModule, Abort_Move_ModuleOutline );
|
|
||||||
}
|
|
||||||
/* Segment creation in progress.
|
|
||||||
* The ending coordinate is updated by the function
|
|
||||||
* ShowNewEdgeModule() called on move mouse event
|
|
||||||
* during the segment creation
|
|
||||||
*/
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( type_edge == S_SEGMENT )
|
|
||||||
{
|
|
||||||
if( aEdge->m_Start0 != aEdge->m_End0 )
|
|
||||||
{
|
|
||||||
aEdge->Draw( m_canvas, DC, GR_OR );
|
|
||||||
|
|
||||||
EDGE_MODULE* newedge = new EDGE_MODULE( *aEdge );
|
|
||||||
|
|
||||||
// insert _after_ aEdge, which is the same as inserting before aEdge->Next()
|
|
||||||
module->GraphicalItemsList().Insert( newedge, aEdge->Next() );
|
|
||||||
aEdge->ClearFlags();
|
|
||||||
|
|
||||||
aEdge = newedge; // point now new item
|
|
||||||
|
|
||||||
aEdge->SetFlags( IS_NEW );
|
|
||||||
aEdge->SetWidth( GetDesignSettings().GetLineThickness( aEdge->GetLayer() ) );
|
|
||||||
aEdge->SetStart( GetCrossHairPosition() );
|
|
||||||
aEdge->SetEnd( aEdge->GetStart() );
|
|
||||||
|
|
||||||
// Update relative coordinate.
|
|
||||||
aEdge->SetStart0( aEdge->GetStart() - module->GetPosition() );
|
|
||||||
|
|
||||||
wxPoint pt( aEdge->GetStart0() );
|
|
||||||
|
|
||||||
RotatePoint( &pt, -module->GetOrientation() );
|
|
||||||
|
|
||||||
aEdge->SetStart0( pt );
|
|
||||||
|
|
||||||
aEdge->SetEnd0( aEdge->GetStart0() );
|
|
||||||
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
module->SetLastEditTime();
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxLogDebug( wxT( "Begin_Edge() error" ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return aEdge;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::End_Edge_Module( EDGE_MODULE* aEdge )
|
|
||||||
{
|
|
||||||
MODULE* module = GetBoard()->m_Modules;
|
|
||||||
|
|
||||||
if( aEdge )
|
|
||||||
{
|
|
||||||
aEdge->ClearFlags();
|
|
||||||
|
|
||||||
// If last segment length is 0: remove it
|
|
||||||
if( aEdge->GetStart() == aEdge->GetEnd() )
|
|
||||||
aEdge->DeleteStructure();
|
|
||||||
}
|
|
||||||
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
module->SetLastEditTime();
|
|
||||||
OnModify();
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
}
|
|
278
pcbnew/edit.cpp
278
pcbnew/edit.cpp
|
@ -48,6 +48,8 @@
|
||||||
#include <class_track.h>
|
#include <class_track.h>
|
||||||
#include <class_zone.h>
|
#include <class_zone.h>
|
||||||
#include <class_pcb_text.h>
|
#include <class_pcb_text.h>
|
||||||
|
#include <class_pcb_target.h>
|
||||||
|
#include <class_dimension.h>
|
||||||
#include <footprint_viewer_frame.h>
|
#include <footprint_viewer_frame.h>
|
||||||
#include <pcb_layer_box_selector.h>
|
#include <pcb_layer_box_selector.h>
|
||||||
#include <dialog_drc.h>
|
#include <dialog_drc.h>
|
||||||
|
@ -79,16 +81,6 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
||||||
case wxID_COPY:
|
case wxID_COPY:
|
||||||
case ID_TOOLBARH_PCB_SELECT_LAYER:
|
case ID_TOOLBARH_PCB_SELECT_LAYER:
|
||||||
case ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR:
|
case ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR:
|
||||||
case ID_POPUP_PCB_PLACE_THROUGH_VIA:
|
|
||||||
case ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_THROUGH_VIA:
|
|
||||||
case ID_POPUP_PCB_PLACE_BLIND_BURIED_VIA:
|
|
||||||
case ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_BLIND_BURIED_VIA:
|
|
||||||
case ID_POPUP_PCB_PLACE_MICROVIA:
|
|
||||||
case ID_POPUP_PCB_SWITCH_TRACK_POSTURE:
|
|
||||||
case ID_POPUP_PCB_FILL_ALL_ZONES:
|
|
||||||
case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES:
|
|
||||||
case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_CURRENT_ZONE:
|
|
||||||
case ID_POPUP_PCB_FILL_ZONE:
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: // Finish (abort) the command
|
default: // Finish (abort) the command
|
||||||
|
@ -179,137 +171,6 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
||||||
InstallNetlistFrame( &dc );
|
InstallNetlistFrame( &dc );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_POPUP_PCB_SWITCH_TRACK_POSTURE:
|
|
||||||
/* change the position of initial segment when creating new tracks
|
|
||||||
* switch from _/ to -\ .
|
|
||||||
* If a track is in progress, it will be redrawn
|
|
||||||
*/
|
|
||||||
if( m_canvas->IsMouseCaptured() )
|
|
||||||
m_canvas->CallMouseCapture( &dc, wxDefaultPosition, false );
|
|
||||||
|
|
||||||
g_Alternate_Track_Posture = !g_Alternate_Track_Posture;
|
|
||||||
|
|
||||||
if( m_canvas->IsMouseCaptured() )
|
|
||||||
m_canvas->CallMouseCapture( &dc, wxDefaultPosition, false );
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_POPUP_PCB_PLACE_MICROVIA:
|
|
||||||
if( !IsMicroViaAcceptable() )
|
|
||||||
break;
|
|
||||||
// fall through
|
|
||||||
case ID_POPUP_PCB_PLACE_BLIND_BURIED_VIA:
|
|
||||||
case ID_POPUP_PCB_PLACE_THROUGH_VIA:
|
|
||||||
case ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_THROUGH_VIA:
|
|
||||||
case ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_BLIND_BURIED_VIA:
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
|
|
||||||
if( GetCurItem()->IsDragging() )
|
|
||||||
{
|
|
||||||
// JEY TODO: reachable?
|
|
||||||
PlaceDraggedOrMovedTrackSegment( (TRACK*) GetCurItem(), &dc );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
BOARD_DESIGN_SETTINGS &settings = GetDesignSettings();
|
|
||||||
VIATYPE_T v_type = settings.m_CurrentViaType;
|
|
||||||
switch( id )
|
|
||||||
{
|
|
||||||
case ID_POPUP_PCB_PLACE_BLIND_BURIED_VIA:
|
|
||||||
case ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_BLIND_BURIED_VIA:
|
|
||||||
settings.m_CurrentViaType = VIA_BLIND_BURIED;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_POPUP_PCB_PLACE_MICROVIA:
|
|
||||||
settings.m_CurrentViaType = VIA_MICROVIA;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
settings.m_CurrentViaType = VIA_THROUGH;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// place via and switch layer.
|
|
||||||
if( id == ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_THROUGH_VIA ||
|
|
||||||
id == ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_BLIND_BURIED_VIA )
|
|
||||||
{
|
|
||||||
m_canvas->SetIgnoreMouseEvents( true );
|
|
||||||
|
|
||||||
wxPoint dlgPosition;
|
|
||||||
|
|
||||||
wxGetMousePosition( &dlgPosition.x, &dlgPosition.y );
|
|
||||||
|
|
||||||
PCB_LAYER_ID layer = SelectLayer( GetActiveLayer(), LSET::AllNonCuMask(), dlgPosition );
|
|
||||||
|
|
||||||
m_canvas->SetIgnoreMouseEvents( false );
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
|
|
||||||
if( GetActiveLayer() != layer )
|
|
||||||
{
|
|
||||||
GetScreen()->m_Route_Layer_TOP = GetActiveLayer();
|
|
||||||
GetScreen()->m_Route_Layer_BOTTOM = layer;
|
|
||||||
Other_Layer_Route( (TRACK*) GetCurItem(), &dc );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
Other_Layer_Route( (TRACK*) GetCurItem(), &dc );
|
|
||||||
|
|
||||||
settings.m_CurrentViaType = v_type;
|
|
||||||
|
|
||||||
if( displ_opts->m_ContrastModeDisplay )
|
|
||||||
m_canvas->Refresh();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_POPUP_PCB_FILL_ALL_ZONES:
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
Fill_All_Zones();
|
|
||||||
m_canvas->Refresh();
|
|
||||||
SetMsgPanel( GetBoard() );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_CURRENT_ZONE:
|
|
||||||
if( ( GetCurItem() )->Type() == PCB_ZONE_AREA_T )
|
|
||||||
{
|
|
||||||
ZONE_CONTAINER* zone_container = (ZONE_CONTAINER*) GetCurItem();
|
|
||||||
zone_container->UnFill();
|
|
||||||
GetBoard()->GetConnectivity()->Update( zone_container );
|
|
||||||
OnModify();
|
|
||||||
SetMsgPanel( GetBoard() );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
Compile_Ratsnest( &dc, false );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES: // Remove all zones :
|
|
||||||
for( int ii = 0; ii < GetBoard()->GetAreaCount(); ii++ )
|
|
||||||
{
|
|
||||||
// Remove filled areas in zone
|
|
||||||
ZONE_CONTAINER* zone_container = GetBoard()->GetArea( ii );
|
|
||||||
zone_container->UnFill();
|
|
||||||
GetBoard()->GetConnectivity()->Update( zone_container );
|
|
||||||
}
|
|
||||||
|
|
||||||
Compile_Ratsnest( &dc, false );
|
|
||||||
SetCurItem( NULL ); // CurItem might be deleted by this command, clear the pointer
|
|
||||||
OnModify();
|
|
||||||
SetMsgPanel( GetBoard() );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_POPUP_PCB_FILL_ZONE:
|
|
||||||
{
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
ZONE_FILLER filler( GetBoard() );
|
|
||||||
filler.Fill( { (ZONE_CONTAINER*) GetCurItem() } );
|
|
||||||
SetMsgPanel( GetBoard() );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR:
|
case ID_AUX_TOOLBAR_PCB_SELECT_LAYER_PAIR:
|
||||||
SelectCopperLayerPair();
|
SelectCopperLayerPair();
|
||||||
break;
|
break;
|
||||||
|
@ -321,14 +182,6 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
||||||
m_canvas->Refresh( true );
|
m_canvas->Refresh( true );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_POPUP_PCB_MOVE_EXACT:
|
|
||||||
moveExact();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_POPUP_PCB_CREATE_ARRAY:
|
|
||||||
createArray();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_MENU_PCB_CLEAN:
|
case ID_MENU_PCB_CLEAN:
|
||||||
Clean_Pcb();
|
Clean_Pcb();
|
||||||
break;
|
break;
|
||||||
|
@ -369,75 +222,6 @@ void PCB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::RemoveStruct( BOARD_ITEM* Item, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( Item == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch( Item->Type() )
|
|
||||||
{
|
|
||||||
case PCB_MODULE_T:
|
|
||||||
Delete_Module( (MODULE*) Item, DC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_DIMENSION_T:
|
|
||||||
DeleteDimension( (DIMENSION*) Item, DC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TARGET_T:
|
|
||||||
DeleteTarget( (PCB_TARGET*) Item, DC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_LINE_T:
|
|
||||||
Delete_Segment_Edge( (DRAWSEGMENT*) Item, DC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TEXT_T:
|
|
||||||
Delete_Texte_Pcb( (TEXTE_PCB*) Item, DC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TRACE_T:
|
|
||||||
Delete_Track( DC, (TRACK*) Item );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_VIA_T:
|
|
||||||
Delete_Segment( DC, (TRACK*) Item );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_ZONE_AREA_T:
|
|
||||||
{
|
|
||||||
SetCurItem( NULL );
|
|
||||||
int netcode = ( (ZONE_CONTAINER*) Item )->GetNetCode();
|
|
||||||
Delete_Zone_Contour( DC, (ZONE_CONTAINER*) Item );
|
|
||||||
TestNetConnection( NULL, netcode );
|
|
||||||
SetMsgPanel( GetBoard() );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MARKER_T:
|
|
||||||
if( Item == GetCurItem() )
|
|
||||||
SetCurItem( NULL );
|
|
||||||
|
|
||||||
( (MARKER_PCB*) Item )->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
|
|
||||||
// delete the marker, and free memory. Don't use undo stack.
|
|
||||||
GetBoard()->Delete( Item );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_PAD_T:
|
|
||||||
case PCB_MODULE_TEXT_T:
|
|
||||||
case PCB_MODULE_EDGE_T:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TYPE_NOT_INIT:
|
|
||||||
case PCB_T:
|
|
||||||
default:
|
|
||||||
wxLogDebug( wxT( "Remove: item type %d unknown." ), Item->Type() );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::SwitchLayer( wxDC* DC, PCB_LAYER_ID layer )
|
void PCB_EDIT_FRAME::SwitchLayer( wxDC* DC, PCB_LAYER_ID layer )
|
||||||
{
|
{
|
||||||
PCB_LAYER_ID curLayer = GetActiveLayer();
|
PCB_LAYER_ID curLayer = GetActiveLayer();
|
||||||
|
@ -719,3 +503,61 @@ void PCB_BASE_EDIT_FRAME::createArray()
|
||||||
|
|
||||||
array_creator.Invoke();
|
array_creator.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PCB_EDIT_FRAME::OnEditItemRequest( wxDC* aDC, BOARD_ITEM* aItem )
|
||||||
|
{
|
||||||
|
switch( aItem->Type() )
|
||||||
|
{
|
||||||
|
case PCB_TRACE_T:
|
||||||
|
case PCB_VIA_T:
|
||||||
|
Edit_TrackSegm_Width( aDC, static_cast<TRACK*>( aItem ) );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_TEXT_T:
|
||||||
|
InstallTextOptionsFrame( aItem, aDC );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_PAD_T:
|
||||||
|
InstallPadOptionsFrame( static_cast<D_PAD*>( aItem ) );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_MODULE_T:
|
||||||
|
InstallFootprintPropertiesDialog( static_cast<MODULE*>( aItem ), aDC );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_TARGET_T:
|
||||||
|
ShowTargetOptionsDialog( static_cast<PCB_TARGET*>( aItem ), aDC );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_DIMENSION_T:
|
||||||
|
ShowDimensionPropertyDialog( static_cast<DIMENSION*>( aItem ), aDC );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_MODULE_TEXT_T:
|
||||||
|
InstallTextOptionsFrame( aItem, aDC );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_LINE_T:
|
||||||
|
InstallGraphicItemPropertiesDialog( aItem );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_ZONE_AREA_T:
|
||||||
|
Edit_Zone_Params( aDC, static_cast<ZONE_CONTAINER*>( aItem ) );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PCB_EDIT_FRAME::HighLight( wxDC* DC )
|
||||||
|
{
|
||||||
|
if( GetBoard()->IsHighLightNetON() )
|
||||||
|
GetBoard()->HighLightOFF();
|
||||||
|
else
|
||||||
|
GetBoard()->HighLightON();
|
||||||
|
|
||||||
|
GetBoard()->DrawHighLight( m_canvas, DC, GetBoard()->GetHighLightNetCode() );
|
||||||
|
}
|
||||||
|
|
|
@ -1,284 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
|
|
||||||
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
|
||||||
* Copyright (C) 1992-2012 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file edit_pcb_text.cpp
|
|
||||||
* @brief Editing of text on copper and technical layers (TEXTE_PCB class)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <gr_basic.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <macros.h>
|
|
||||||
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_pcb_text.h>
|
|
||||||
#include <class_board_item.h>
|
|
||||||
|
|
||||||
|
|
||||||
static void Move_Texte_Pcb( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
|
|
||||||
bool aErase );
|
|
||||||
static void Abort_Edit_Pcb_Text( EDA_DRAW_PANEL* Panel, wxDC* DC );
|
|
||||||
|
|
||||||
|
|
||||||
static TEXTE_PCB s_TextCopy( (BOARD_ITEM*) NULL ); // copy of the edited text used to
|
|
||||||
// undo/redo/abort a complex edit command
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Abort current text edit progress.
|
|
||||||
* If a text is selected, its initial coord are regenerated
|
|
||||||
*/
|
|
||||||
void Abort_Edit_Pcb_Text( EDA_DRAW_PANEL* Panel, wxDC* DC )
|
|
||||||
{
|
|
||||||
TEXTE_PCB* TextePcb = (TEXTE_PCB*) Panel->GetScreen()->GetCurItem();
|
|
||||||
( (PCB_EDIT_FRAME*) Panel->GetParent() )->SetCurItem( NULL );
|
|
||||||
|
|
||||||
Panel->SetMouseCapture( NULL, NULL );
|
|
||||||
|
|
||||||
if( TextePcb == NULL ) // Should not occur
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifndef USE_WX_OVERLAY
|
|
||||||
TextePcb->Draw( Panel, DC, GR_XOR );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if( TextePcb->IsNew() ) // If new: remove it
|
|
||||||
{
|
|
||||||
TextePcb->DeleteStructure();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TextePcb->SwapData( &s_TextCopy );
|
|
||||||
TextePcb->ClearFlags();
|
|
||||||
#ifndef USE_WX_OVERLAY
|
|
||||||
TextePcb->Draw( Panel, DC, GR_OR );
|
|
||||||
#else
|
|
||||||
Panel->Refresh();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Place the current text being moving
|
|
||||||
*/
|
|
||||||
void PCB_EDIT_FRAME::Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
|
|
||||||
{
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
|
|
||||||
if( TextePcb == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
TextePcb->Draw( m_canvas, DC, GR_OR );
|
|
||||||
OnModify();
|
|
||||||
|
|
||||||
if( TextePcb->IsNew() ) // If new: prepare undo command
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( TextePcb, UR_NEW );
|
|
||||||
TextePcb->ClearFlags();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( TextePcb->IsMoving() ) // If moved only
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( TextePcb, UR_MOVED,
|
|
||||||
TextePcb->GetTextPos() - s_TextCopy.GetTextPos() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Restore initial params
|
|
||||||
TextePcb->SwapData( &s_TextCopy );
|
|
||||||
// Prepare undo command
|
|
||||||
SaveCopyInUndoList( TextePcb, UR_CHANGED );
|
|
||||||
// Restore current params
|
|
||||||
TextePcb->SwapData( &s_TextCopy );
|
|
||||||
}
|
|
||||||
|
|
||||||
TextePcb->ClearFlags();
|
|
||||||
#ifdef USE_WX_OVERLAY
|
|
||||||
m_canvas->Refresh();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::StartMoveTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC, bool aErase )
|
|
||||||
{
|
|
||||||
if( aTextePcb == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// if it is an existing item: prepare a copy to undo/abort command
|
|
||||||
if( !aTextePcb->IsNew() )
|
|
||||||
s_TextCopy = *aTextePcb;
|
|
||||||
|
|
||||||
aTextePcb->SetFlags( IS_MOVED );
|
|
||||||
SetMsgPanel( aTextePcb );
|
|
||||||
|
|
||||||
#ifdef USE_WX_OVERLAY
|
|
||||||
m_canvas->Refresh();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SetCrossHairPosition( aTextePcb->GetTextPos() );
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
|
|
||||||
m_canvas->SetMouseCapture( Move_Texte_Pcb, Abort_Edit_Pcb_Text );
|
|
||||||
SetCurItem( aTextePcb );
|
|
||||||
m_canvas->CallMouseCapture( aDC, wxDefaultPosition, aErase );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Move PCB text following the cursor.
|
|
||||||
static void Move_Texte_Pcb( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
|
|
||||||
bool aErase )
|
|
||||||
{
|
|
||||||
TEXTE_PCB* TextePcb = (TEXTE_PCB*) aPanel->GetScreen()->GetCurItem();
|
|
||||||
|
|
||||||
if( TextePcb == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( aErase )
|
|
||||||
TextePcb->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
|
|
||||||
TextePcb->SetTextPos( aPanel->GetParent()->GetCrossHairPosition() );
|
|
||||||
|
|
||||||
TextePcb->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( TextePcb == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
TextePcb->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
|
|
||||||
SaveCopyInUndoList( TextePcb, UR_DELETED );
|
|
||||||
TextePcb->UnLink();
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TEXTE_PCB* PCB_EDIT_FRAME::CreateTextePcb( wxDC* aDC, TEXTE_PCB* aText )
|
|
||||||
{
|
|
||||||
TEXTE_PCB* textePcb = new TEXTE_PCB( GetBoard() );
|
|
||||||
|
|
||||||
if( aText )
|
|
||||||
{
|
|
||||||
*textePcb = *aText;
|
|
||||||
GetBoard()->Add( textePcb );
|
|
||||||
textePcb->SetFlags( IS_NEW );
|
|
||||||
if( aDC )
|
|
||||||
StartMoveTextePcb( textePcb, aDC, false ); // Don't erase aText when copying
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GetBoard()->Add( textePcb );
|
|
||||||
textePcb->SetFlags( IS_NEW );
|
|
||||||
|
|
||||||
PCB_LAYER_ID layer = GetActiveLayer();
|
|
||||||
|
|
||||||
textePcb->SetLayer( layer );
|
|
||||||
|
|
||||||
// Set the mirrored option for layers on the BACK side of the board
|
|
||||||
if( layer == B_Cu || layer == B_SilkS ||
|
|
||||||
layer == B_Paste || layer == B_Mask ||
|
|
||||||
layer == B_Adhes
|
|
||||||
)
|
|
||||||
textePcb->SetMirrored( true );
|
|
||||||
|
|
||||||
textePcb->SetTextSize( GetBoard()->GetDesignSettings().GetTextSize( layer ) );
|
|
||||||
textePcb->SetTextPos( GetCrossHairPosition() );
|
|
||||||
textePcb->SetThickness( GetBoard()->GetDesignSettings().GetTextThickness( layer ) );
|
|
||||||
textePcb->SetItalic( GetBoard()->GetDesignSettings().GetTextItalic( layer ) );
|
|
||||||
|
|
||||||
InstallTextOptionsFrame( textePcb, aDC );
|
|
||||||
|
|
||||||
if( textePcb->GetText().IsEmpty() )
|
|
||||||
{
|
|
||||||
textePcb->DeleteStructure();
|
|
||||||
textePcb = NULL;
|
|
||||||
}
|
|
||||||
else if( aDC )
|
|
||||||
{
|
|
||||||
StartMoveTextePcb( textePcb, aDC );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return textePcb;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( TextePcb == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Erase previous text:
|
|
||||||
TextePcb->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
|
|
||||||
TextePcb->SetTextAngle( TextePcb->GetTextAngle() + 900 );
|
|
||||||
|
|
||||||
// Redraw text in new position:
|
|
||||||
TextePcb->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
SetMsgPanel( TextePcb );
|
|
||||||
|
|
||||||
if( TextePcb->GetEditFlags() == 0 ) // i.e. not edited, or moved
|
|
||||||
SaveCopyInUndoList( TextePcb, UR_ROTATED, TextePcb->GetTextPos() );
|
|
||||||
else // set flag edit, to show it was a complex command
|
|
||||||
TextePcb->SetFlags( IN_EDIT );
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
#ifdef USE_WX_OVERLAY
|
|
||||||
m_canvas->Refresh();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::FlipTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC )
|
|
||||||
{
|
|
||||||
if( aTextePcb == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
aTextePcb->Draw( m_canvas, aDC, GR_XOR );
|
|
||||||
|
|
||||||
aTextePcb->Flip( aTextePcb->GetTextPos() );
|
|
||||||
|
|
||||||
aTextePcb->Draw( m_canvas, aDC, GR_XOR );
|
|
||||||
SetMsgPanel( aTextePcb );
|
|
||||||
|
|
||||||
if( aTextePcb->GetEditFlags() == 0 ) // i.e. not edited, or moved
|
|
||||||
SaveCopyInUndoList( aTextePcb, UR_FLIPPED, aTextePcb->GetTextPos() );
|
|
||||||
else // set edit flag, for the current command
|
|
||||||
aTextePcb->SetFlags( IN_EDIT );
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
#ifdef USE_WX_OVERLAY
|
|
||||||
m_canvas->Refresh();
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -1,296 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
|
|
||||||
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
|
||||||
* Copyright (C) 1992-2012 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file editedge.cpp
|
|
||||||
* @brief Edit segments and edges of PCB.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <confirm.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <gr_basic.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <protos.h>
|
|
||||||
#include <macros.h>
|
|
||||||
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_drawsegment.h>
|
|
||||||
|
|
||||||
|
|
||||||
static void Abort_EditEdge( EDA_DRAW_PANEL* aPanel, wxDC* DC );
|
|
||||||
static void DrawSegment( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, bool aErase );
|
|
||||||
static void Move_Segment( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
|
|
||||||
bool aErase );
|
|
||||||
|
|
||||||
|
|
||||||
static wxPoint s_InitialPosition; // Initial cursor position.
|
|
||||||
static wxPoint s_LastPosition; // Current cursor position.
|
|
||||||
|
|
||||||
|
|
||||||
// Start move of a graphic element type DRAWSEGMENT
|
|
||||||
void PCB_EDIT_FRAME::Start_Move_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( drawitem == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
drawitem->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
drawitem->SetFlags( IS_MOVED );
|
|
||||||
s_InitialPosition = s_LastPosition = GetCrossHairPosition();
|
|
||||||
SetMsgPanel( drawitem );
|
|
||||||
m_canvas->SetMouseCapture( Move_Segment, Abort_EditEdge );
|
|
||||||
SetCurItem( drawitem );
|
|
||||||
m_canvas->CallMouseCapture( DC, wxDefaultPosition, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Place graphic element of type DRAWSEGMENT.
|
|
||||||
*/
|
|
||||||
void PCB_EDIT_FRAME::Place_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( drawitem == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
drawitem->ClearFlags();
|
|
||||||
SaveCopyInUndoList(drawitem, UR_MOVED, s_LastPosition - s_InitialPosition);
|
|
||||||
drawitem->Draw( m_canvas, DC, GR_OR );
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Redraw segment during cursor movement.
|
|
||||||
*/
|
|
||||||
static void Move_Segment( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
|
|
||||||
bool aErase )
|
|
||||||
{
|
|
||||||
DRAWSEGMENT* segment = (DRAWSEGMENT*) aPanel->GetScreen()->GetCurItem();
|
|
||||||
|
|
||||||
if( segment == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( aErase )
|
|
||||||
segment->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
|
|
||||||
wxPoint delta;
|
|
||||||
delta = aPanel->GetParent()->GetCrossHairPosition() - s_LastPosition;
|
|
||||||
|
|
||||||
segment->Move( delta );
|
|
||||||
|
|
||||||
s_LastPosition = aPanel->GetParent()->GetCrossHairPosition();
|
|
||||||
|
|
||||||
segment->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Delete_Segment_Edge( DRAWSEGMENT* Segment, wxDC* DC )
|
|
||||||
{
|
|
||||||
auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions();
|
|
||||||
bool tmp = displ_opts->m_DisplayDrawItemsFill;
|
|
||||||
|
|
||||||
if( Segment == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( Segment->IsNew() ) // Trace in progress.
|
|
||||||
{
|
|
||||||
// Delete current segment.
|
|
||||||
displ_opts->m_DisplayDrawItemsFill = SKETCH;
|
|
||||||
Segment->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
Segment->DeleteStructure();
|
|
||||||
displ_opts->m_DisplayDrawItemsFill = tmp;
|
|
||||||
SetCurItem( NULL );
|
|
||||||
}
|
|
||||||
else if( Segment->GetEditFlags() == 0 ) // i.e. not edited, or moved
|
|
||||||
{
|
|
||||||
Segment->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
Segment->ClearFlags();
|
|
||||||
SaveCopyInUndoList(Segment, UR_DELETED);
|
|
||||||
Segment->UnLink();
|
|
||||||
SetCurItem( NULL );
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void Abort_EditEdge( EDA_DRAW_PANEL* aPanel, wxDC* DC )
|
|
||||||
{
|
|
||||||
DRAWSEGMENT* Segment = (DRAWSEGMENT*) aPanel->GetScreen()->GetCurItem();
|
|
||||||
|
|
||||||
if( Segment == NULL )
|
|
||||||
{
|
|
||||||
aPanel->SetMouseCapture( NULL, NULL );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Segment->IsNew() )
|
|
||||||
{
|
|
||||||
aPanel->CallMouseCapture( DC, wxDefaultPosition, false );
|
|
||||||
Segment ->DeleteStructure();
|
|
||||||
Segment = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxPoint pos = aPanel->GetParent()->GetCrossHairPosition();
|
|
||||||
aPanel->GetParent()->SetCrossHairPosition( s_InitialPosition );
|
|
||||||
aPanel->CallMouseCapture( DC, wxDefaultPosition, true );
|
|
||||||
aPanel->GetParent()->SetCrossHairPosition( pos );
|
|
||||||
Segment->ClearFlags();
|
|
||||||
Segment->Draw( aPanel, DC, GR_OR );
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_WX_OVERLAY
|
|
||||||
aPanel->Refresh();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
aPanel->SetMouseCapture( NULL, NULL );
|
|
||||||
( (PCB_EDIT_FRAME*) aPanel->GetParent() )->SetCurItem( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the drawing of a segment of type other than trace.
|
|
||||||
*/
|
|
||||||
DRAWSEGMENT* PCB_EDIT_FRAME::Begin_DrawSegment( DRAWSEGMENT* Segment, STROKE_T shape, wxDC* DC )
|
|
||||||
{
|
|
||||||
int lineWidth;
|
|
||||||
DRAWSEGMENT* DrawItem;
|
|
||||||
|
|
||||||
lineWidth = GetDesignSettings().GetLineThickness( GetActiveLayer() );
|
|
||||||
|
|
||||||
if( Segment == NULL ) // Create new segment.
|
|
||||||
{
|
|
||||||
SetCurItem( Segment = new DRAWSEGMENT( GetBoard() ) );
|
|
||||||
Segment->SetFlags( IS_NEW );
|
|
||||||
Segment->SetLayer( GetActiveLayer() );
|
|
||||||
Segment->SetWidth( lineWidth );
|
|
||||||
Segment->SetShape( shape );
|
|
||||||
Segment->SetAngle( 900 );
|
|
||||||
Segment->SetStart( GetCrossHairPosition() );
|
|
||||||
Segment->SetEnd( GetCrossHairPosition() );
|
|
||||||
m_canvas->SetMouseCapture( DrawSegment, Abort_EditEdge );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// The ending point coordinate Segment->m_End was updated by the function
|
|
||||||
// DrawSegment() called on a move mouse event during the segment creation
|
|
||||||
if( Segment->GetStart() != Segment->GetEnd() )
|
|
||||||
{
|
|
||||||
if( Segment->GetShape() == S_SEGMENT )
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( Segment, UR_NEW );
|
|
||||||
GetBoard()->Add( Segment );
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
Segment->ClearFlags();
|
|
||||||
|
|
||||||
Segment->Draw( m_canvas, DC, GR_OR );
|
|
||||||
|
|
||||||
DrawItem = Segment;
|
|
||||||
|
|
||||||
SetCurItem( Segment = new DRAWSEGMENT( GetBoard() ) );
|
|
||||||
|
|
||||||
Segment->SetFlags( IS_NEW );
|
|
||||||
Segment->SetLayer( DrawItem->GetLayer() );
|
|
||||||
Segment->SetWidth( lineWidth );
|
|
||||||
Segment->SetShape( DrawItem->GetShape() );
|
|
||||||
Segment->SetType( DrawItem->GetType() );
|
|
||||||
Segment->SetAngle( DrawItem->GetAngle() );
|
|
||||||
Segment->SetStart( DrawItem->GetEnd() );
|
|
||||||
Segment->SetEnd( DrawItem->GetEnd() );
|
|
||||||
DrawSegment( m_canvas, DC, wxDefaultPosition, false );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
End_Edge( Segment, DC );
|
|
||||||
Segment = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Segment;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::End_Edge( DRAWSEGMENT* Segment, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( Segment == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
Segment->Draw( m_canvas, DC, GR_OR );
|
|
||||||
|
|
||||||
// Delete if segment length is zero.
|
|
||||||
if( Segment->GetStart() == Segment->GetEnd() )
|
|
||||||
{
|
|
||||||
Segment->DeleteStructure();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Segment->ClearFlags();
|
|
||||||
GetBoard()->Add( Segment );
|
|
||||||
OnModify();
|
|
||||||
SaveCopyInUndoList( Segment, UR_NEW );
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Redraw segment during cursor movement
|
|
||||||
*/
|
|
||||||
static void DrawSegment( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, bool aErase )
|
|
||||||
{
|
|
||||||
DRAWSEGMENT* Segment = (DRAWSEGMENT*) aPanel->GetScreen()->GetCurItem();
|
|
||||||
auto frame = (PCB_EDIT_FRAME*) ( aPanel->GetParent() );
|
|
||||||
if( Segment == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto displ_opts = (PCB_DISPLAY_OPTIONS*) ( aPanel->GetDisplayOptions() );
|
|
||||||
bool tmp = displ_opts->m_DisplayDrawItemsFill;
|
|
||||||
|
|
||||||
displ_opts->m_DisplayDrawItemsFill = SKETCH;
|
|
||||||
|
|
||||||
if( aErase )
|
|
||||||
Segment->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
|
|
||||||
if( frame->Settings().m_use45DegreeGraphicSegments && Segment->GetShape() == S_SEGMENT )
|
|
||||||
{
|
|
||||||
wxPoint pt;
|
|
||||||
|
|
||||||
pt = CalculateSegmentEndPoint( aPanel->GetParent()->GetCrossHairPosition(),
|
|
||||||
Segment->GetStart() );
|
|
||||||
Segment->SetEnd( pt );
|
|
||||||
}
|
|
||||||
else // here the angle is arbitrary
|
|
||||||
{
|
|
||||||
Segment->SetEnd( aPanel->GetParent()->GetCrossHairPosition() );
|
|
||||||
}
|
|
||||||
|
|
||||||
Segment->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
displ_opts->m_DisplayDrawItemsFill = tmp;
|
|
||||||
}
|
|
|
@ -46,9 +46,7 @@
|
||||||
static void Abort_Create_Track( EDA_DRAW_PANEL* panel, wxDC* DC );
|
static void Abort_Create_Track( EDA_DRAW_PANEL* panel, wxDC* DC );
|
||||||
void ShowNewTrackWhenMovingCursor( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
void ShowNewTrackWhenMovingCursor( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
||||||
const wxPoint& aPosition, bool aErase );
|
const wxPoint& aPosition, bool aErase );
|
||||||
static void ComputeBreakPoint( TRACK* track, int n, wxPoint end );
|
static void ComputeBreakPoint( TRACK* track, int SegmentCount, wxPoint end );
|
||||||
static void DeleteNullTrackSegments( BOARD* pcb, DLIST<TRACK>& aTrackList );
|
|
||||||
static void EnsureEndTrackOnPad( D_PAD* Pad );
|
|
||||||
|
|
||||||
// A PICKED_ITEMS_LIST to store tracks which are modified/added/deleted
|
// A PICKED_ITEMS_LIST to store tracks which are modified/added/deleted
|
||||||
// during a track editing:
|
// during a track editing:
|
||||||
|
@ -410,126 +408,6 @@ bool PCB_EDIT_FRAME::Add45DegreeSegment( wxDC* aDC )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PCB_EDIT_FRAME::End_Route( TRACK* aTrack, wxDC* aDC )
|
|
||||||
{
|
|
||||||
LSET layerMask( GetScreen()->m_Active_Layer );
|
|
||||||
|
|
||||||
if( aTrack == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if( Settings().m_legacyDrcOn &&
|
|
||||||
BAD_DRC == m_drc->DrcOnCreatingTrack( g_CurrentTrackSegment, GetBoard()->m_Track ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Saving the coordinate of end point of the trace
|
|
||||||
wxPoint pos = g_CurrentTrackSegment->GetEnd();
|
|
||||||
|
|
||||||
DBG( g_CurrentTrackList.VerifyListIntegrity(); );
|
|
||||||
|
|
||||||
if( Begin_Route( aTrack, aDC ) == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Update last track position
|
|
||||||
ShowNewTrackWhenMovingCursor( m_canvas, aDC, wxDefaultPosition, true );
|
|
||||||
// Erase the last drawings
|
|
||||||
ShowNewTrackWhenMovingCursor( m_canvas, aDC, wxDefaultPosition, false );
|
|
||||||
|
|
||||||
DBG( g_CurrentTrackList.VerifyListIntegrity(); );
|
|
||||||
|
|
||||||
/* The track here is now chained to the list of track segments.
|
|
||||||
* It must be seen in the area of net
|
|
||||||
* As close as possible to the segment base (or end), because
|
|
||||||
* This helps to reduce the computing time */
|
|
||||||
|
|
||||||
// Attaching the end point of the new track to a pad or a track
|
|
||||||
BOARD_CONNECTED_ITEM* lockPoint = GetBoard()->GetLockPoint( pos, layerMask );
|
|
||||||
|
|
||||||
if( lockPoint )
|
|
||||||
{
|
|
||||||
if( lockPoint->Type() == PCB_PAD_T ) // End of track is on a pad.
|
|
||||||
{
|
|
||||||
EnsureEndTrackOnPad( (D_PAD*) lockPoint );
|
|
||||||
}
|
|
||||||
else // If end point of is on a different track,
|
|
||||||
// creates a lock point if not exists
|
|
||||||
{
|
|
||||||
// Creates a lock point, if not already exists:
|
|
||||||
wxPoint hp = g_CurrentTrackSegment->GetEnd();
|
|
||||||
lockPoint = GetBoard()->CreateLockPoint( hp, (TRACK*) lockPoint, &s_ItemsListPicker );
|
|
||||||
g_CurrentTrackSegment->SetEnd(hp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete null length segments:
|
|
||||||
DeleteNullTrackSegments( GetBoard(), g_CurrentTrackList );
|
|
||||||
|
|
||||||
// Insert new segments if they exist.
|
|
||||||
// g_FirstTrackSegment can be NULL on a double click on the starting point
|
|
||||||
if( g_FirstTrackSegment != NULL )
|
|
||||||
{
|
|
||||||
int netcode = g_FirstTrackSegment->GetNetCode();
|
|
||||||
TRACK* firstTrack = g_FirstTrackSegment;
|
|
||||||
int newCount = 0;
|
|
||||||
|
|
||||||
// Put entire new current segment list in BOARD, and prepare undo command
|
|
||||||
TRACK* track;
|
|
||||||
TRACK* insertBeforeMe = g_CurrentTrackSegment->GetBestInsertPoint( GetBoard() );
|
|
||||||
|
|
||||||
while( ( track = g_CurrentTrackList.PopFront() ) != nullptr )
|
|
||||||
{
|
|
||||||
ITEM_PICKER picker( track, UR_NEW );
|
|
||||||
s_ItemsListPicker.PushItem( picker );
|
|
||||||
GetBoard()->m_Track.Insert( track, insertBeforeMe );
|
|
||||||
GetBoard()->GetConnectivity()->Add( track );
|
|
||||||
track->ClearFlags();
|
|
||||||
track->SetState( BUSY, false );
|
|
||||||
newCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete the old track, if it exists and is redundant
|
|
||||||
if( Settings().m_legacyAutoDeleteOldTrack )
|
|
||||||
{
|
|
||||||
EraseRedundantTrack( aDC, firstTrack, newCount, &s_ItemsListPicker );
|
|
||||||
}
|
|
||||||
|
|
||||||
SaveCopyInUndoList( s_ItemsListPicker, UR_UNSPECIFIED );
|
|
||||||
s_ItemsListPicker.ClearItemsList(); // s_ItemsListPicker is no more owner of picked items
|
|
||||||
|
|
||||||
// Erase old ratsnest
|
|
||||||
if( GetBoard()->IsElementVisible( LAYER_RATSNEST ) && aDC )
|
|
||||||
{
|
|
||||||
GRSetDrawMode( aDC, GR_XOR );
|
|
||||||
DrawGeneralRatsnest( aDC, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// compute and display the new ratsnest
|
|
||||||
TestNetConnection( aDC, netcode );
|
|
||||||
OnModify();
|
|
||||||
SetMsgPanel( GetBoard() );
|
|
||||||
|
|
||||||
// Redraw the entire new track.
|
|
||||||
DrawTraces( m_canvas, aDC, firstTrack, newCount, GR_OR );
|
|
||||||
}
|
|
||||||
|
|
||||||
wxASSERT( g_FirstTrackSegment == NULL );
|
|
||||||
wxASSERT( g_CurrentTrackSegment == NULL );
|
|
||||||
wxASSERT( g_CurrentTrackList.GetCount() == 0 );
|
|
||||||
|
|
||||||
if( GetBoard()->IsHighLightNetON() )
|
|
||||||
HighLight( aDC );
|
|
||||||
|
|
||||||
GetBoard()->PopHighLight();
|
|
||||||
|
|
||||||
if( GetBoard()->IsHighLightNetON() )
|
|
||||||
GetBoard()->DrawHighLight( m_canvas, aDC, GetBoard()->GetHighLightNetCode() );
|
|
||||||
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TRACK* LocateIntrusion( TRACK* listStart, TRACK* aTrack, LAYER_NUM aLayer, const wxPoint& aRef )
|
TRACK* LocateIntrusion( TRACK* listStart, TRACK* aTrack, LAYER_NUM aLayer, const wxPoint& aRef )
|
||||||
{
|
{
|
||||||
int net = aTrack->GetNetCode();
|
int net = aTrack->GetNetCode();
|
||||||
|
@ -963,111 +841,3 @@ void ComputeBreakPoint( TRACK* track, int SegmentCount, wxPoint end )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Delete track segments which have len = 0 after creating a new track
|
|
||||||
* return a pointer on the first segment (start of track list)
|
|
||||||
*/
|
|
||||||
void DeleteNullTrackSegments( BOARD* pcb, DLIST<TRACK>& aTrackList )
|
|
||||||
{
|
|
||||||
if( aTrackList.GetCount() == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
TRACK* track = aTrackList.GetFirst();
|
|
||||||
TRACK* firsttrack = track;
|
|
||||||
TRACK* oldtrack;
|
|
||||||
|
|
||||||
BOARD_CONNECTED_ITEM* lockPoint = track->start;
|
|
||||||
|
|
||||||
while( track != NULL )
|
|
||||||
{
|
|
||||||
oldtrack = track;
|
|
||||||
track = track->Next();
|
|
||||||
|
|
||||||
if( !oldtrack->IsNull() )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NULL segment, delete it
|
|
||||||
if( firsttrack == oldtrack )
|
|
||||||
firsttrack = track;
|
|
||||||
|
|
||||||
delete aTrackList.Remove( oldtrack );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( aTrackList.GetCount() == 0 )
|
|
||||||
return; // all the new track segments have been deleted
|
|
||||||
|
|
||||||
// we must set the pointers on connected items and the connection status
|
|
||||||
oldtrack = track = firsttrack;
|
|
||||||
firsttrack->start = NULL;
|
|
||||||
|
|
||||||
while( track != NULL )
|
|
||||||
{
|
|
||||||
oldtrack = track;
|
|
||||||
track = track->Next();
|
|
||||||
oldtrack->end = track;
|
|
||||||
|
|
||||||
if( track )
|
|
||||||
track->start = oldtrack;
|
|
||||||
|
|
||||||
oldtrack->SetStatus( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
firsttrack->start = lockPoint;
|
|
||||||
|
|
||||||
if( lockPoint && lockPoint->Type()==PCB_PAD_T )
|
|
||||||
firsttrack->SetState( BEGIN_ONPAD, true );
|
|
||||||
|
|
||||||
track = firsttrack;
|
|
||||||
|
|
||||||
while( track != NULL )
|
|
||||||
{
|
|
||||||
TRACK* next_track = track->Next();
|
|
||||||
lockPoint = pcb->GetPad( track, ENDPOINT_END );
|
|
||||||
|
|
||||||
if( lockPoint )
|
|
||||||
{
|
|
||||||
track->end = lockPoint;
|
|
||||||
track->SetState( END_ONPAD, true );
|
|
||||||
|
|
||||||
if( next_track )
|
|
||||||
{
|
|
||||||
next_track->start = lockPoint;
|
|
||||||
next_track->SetState( BEGIN_ONPAD, true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
track = next_track;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Ensure the end point of g_CurrentTrackSegment is on the pad "Pad"
|
|
||||||
* if no, create a new track segment if necessary
|
|
||||||
* and move current (or new) end segment on pad
|
|
||||||
*/
|
|
||||||
void EnsureEndTrackOnPad( D_PAD* aPad )
|
|
||||||
{
|
|
||||||
if( g_CurrentTrackSegment->GetEnd() == aPad->GetPosition() ) // Ok !
|
|
||||||
{
|
|
||||||
g_CurrentTrackSegment->end = aPad;
|
|
||||||
g_CurrentTrackSegment->SetState( END_ONPAD, true );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACK* lasttrack = g_CurrentTrackSegment;
|
|
||||||
|
|
||||||
if( !g_CurrentTrackSegment->IsNull() )
|
|
||||||
{
|
|
||||||
// Must create a new segment, from track end to pad center
|
|
||||||
g_CurrentTrackList.PushBack( (TRACK*)lasttrack->Clone() );
|
|
||||||
|
|
||||||
lasttrack->end = g_CurrentTrackSegment;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_CurrentTrackSegment->SetEnd( aPad->GetPosition() );
|
|
||||||
g_CurrentTrackSegment->SetState( END_ONPAD, false );
|
|
||||||
|
|
||||||
g_CurrentTrackSegment->end = aPad;
|
|
||||||
g_CurrentTrackSegment->SetState( END_ONPAD, true );
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,334 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
|
||||||
* Copyright (C) 1992-2018 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file edtxtmod.cpp
|
|
||||||
* @brief Edit texts in footprints.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <gr_basic.h>
|
|
||||||
#include <common.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <draw_graphic_text.h>
|
|
||||||
#include <trigo.h>
|
|
||||||
#include <pcb_base_frame.h>
|
|
||||||
#include <macros.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <footprint_edit_frame.h>
|
|
||||||
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_module.h>
|
|
||||||
#include <class_text_mod.h>
|
|
||||||
#include <class_pcb_text.h>
|
|
||||||
|
|
||||||
|
|
||||||
static void Show_MoveTexte_Module( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
|
|
||||||
bool aErase );
|
|
||||||
static void AbortMoveTextModule( EDA_DRAW_PANEL* Panel, wxDC* DC );
|
|
||||||
|
|
||||||
|
|
||||||
wxPoint MoveVector; // Move vector for move edge, exported
|
|
||||||
// to dialog_edit mod_text.cpp
|
|
||||||
static wxPoint TextInitialPosition; // Mouse cursor initial position for
|
|
||||||
// undo/abort move command
|
|
||||||
static double TextInitialOrientation; // module text initial orientation for
|
|
||||||
// undo/abort move+rot command+rot
|
|
||||||
|
|
||||||
|
|
||||||
/* Add a new graphical text to the active module (footprint)
|
|
||||||
* Note there always are 2 mandatory texts: reference and value.
|
|
||||||
* New texts have the member TEXTE_MODULE.GetType() set to TEXT_is_DIVERS
|
|
||||||
*/
|
|
||||||
TEXTE_MODULE* FOOTPRINT_EDIT_FRAME::CreateTextModule( MODULE* aModule, wxDC* aDC )
|
|
||||||
{
|
|
||||||
TEXTE_MODULE* text = new TEXTE_MODULE( aModule );
|
|
||||||
|
|
||||||
text->SetFlags( IS_NEW );
|
|
||||||
|
|
||||||
if( LSET::AllTechMask().test( GetActiveLayer() ) ) // i.e. a possible layer for a text
|
|
||||||
text->SetLayer( GetActiveLayer() );
|
|
||||||
|
|
||||||
InstallTextOptionsFrame( text, NULL );
|
|
||||||
|
|
||||||
if( text->GetText().IsEmpty() )
|
|
||||||
{
|
|
||||||
delete text;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the new text object to the beginning of the footprint draw list.
|
|
||||||
if( aModule )
|
|
||||||
aModule->GraphicalItemsList().PushFront( text );
|
|
||||||
|
|
||||||
text->ClearFlags();
|
|
||||||
|
|
||||||
if( aDC )
|
|
||||||
text->Draw( m_canvas, aDC, GR_OR );
|
|
||||||
|
|
||||||
SetMsgPanel( text );
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_BASE_FRAME::RotateTextModule( TEXTE_MODULE* Text, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( Text == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MODULE* module = (MODULE*) Text->GetParent();
|
|
||||||
|
|
||||||
if( module && module->GetEditFlags() == 0 && Text->GetEditFlags() == 0 ) // prepare undo command
|
|
||||||
{
|
|
||||||
if( IsType( FRAME_PCB ) )
|
|
||||||
SaveCopyInUndoList( module, UR_CHANGED );
|
|
||||||
}
|
|
||||||
|
|
||||||
// we expect MoveVector to be (0,0) if there is no move in progress
|
|
||||||
Text->Draw( m_canvas, DC, GR_XOR, MoveVector );
|
|
||||||
|
|
||||||
Text->SetTextAngle( Text->GetTextAngle() + 900 );
|
|
||||||
|
|
||||||
Text->Draw( m_canvas, DC, GR_XOR, MoveVector );
|
|
||||||
SetMsgPanel( Text );
|
|
||||||
|
|
||||||
if( module )
|
|
||||||
module->SetLastEditTime();
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_BASE_FRAME::DeleteTextModule( TEXTE_MODULE* aText )
|
|
||||||
{
|
|
||||||
MODULE* module;
|
|
||||||
|
|
||||||
if( aText == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
module = static_cast<MODULE*>( aText->GetParent() );
|
|
||||||
|
|
||||||
if( aText->GetType() == TEXTE_MODULE::TEXT_is_DIVERS )
|
|
||||||
{
|
|
||||||
if( module && module->GetEditFlags() == 0 && aText->GetEditFlags() == 0 )
|
|
||||||
{
|
|
||||||
if( IsType( FRAME_PCB ) )
|
|
||||||
SaveCopyInUndoList( module, UR_CHANGED );
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->RefreshDrawingRect( aText->GetBoundingBox() );
|
|
||||||
aText->DeleteStructure();
|
|
||||||
OnModify();
|
|
||||||
|
|
||||||
if( module )
|
|
||||||
module->SetLastEditTime();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abort text move in progress.
|
|
||||||
*
|
|
||||||
* If a text is selected, its initial coordinates are regenerated.
|
|
||||||
*/
|
|
||||||
static void AbortMoveTextModule( EDA_DRAW_PANEL* Panel, wxDC* DC )
|
|
||||||
{
|
|
||||||
BASE_SCREEN* screen = Panel->GetScreen();
|
|
||||||
TEXTE_MODULE* Text = static_cast<TEXTE_MODULE*>( screen->GetCurItem() );
|
|
||||||
MODULE* Module;
|
|
||||||
|
|
||||||
Panel->SetMouseCapture( NULL, NULL );
|
|
||||||
|
|
||||||
if( Text == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
Module = static_cast<MODULE*>( Text->GetParent() );
|
|
||||||
|
|
||||||
Text->DrawUmbilical( Panel, DC, GR_XOR, -MoveVector );
|
|
||||||
Text->Draw( Panel, DC, GR_XOR, MoveVector );
|
|
||||||
|
|
||||||
// If the text was moved (the move does not change internal data)
|
|
||||||
// it could be rotated while moving. So set old value for orientation
|
|
||||||
if( Text->IsMoving() )
|
|
||||||
Text->SetTextAngle( TextInitialOrientation );
|
|
||||||
|
|
||||||
// Redraw the text
|
|
||||||
Panel->RefreshDrawingRect( Text->GetBoundingBox() );
|
|
||||||
|
|
||||||
// leave it at (0,0) so we can use it Rotate when not moving.
|
|
||||||
MoveVector.x = MoveVector.y = 0;
|
|
||||||
|
|
||||||
Text->ClearFlags();
|
|
||||||
Module->ClearFlags();
|
|
||||||
|
|
||||||
screen->SetCurItem( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_BASE_FRAME::StartMoveTexteModule( TEXTE_MODULE* Text, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( Text == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MODULE *Module = static_cast<MODULE*>( Text->GetParent() );
|
|
||||||
|
|
||||||
Text->SetFlags( IS_MOVED );
|
|
||||||
Module->SetFlags( IN_EDIT );
|
|
||||||
|
|
||||||
MoveVector.x = MoveVector.y = 0;
|
|
||||||
|
|
||||||
TextInitialPosition = Text->GetTextPos();
|
|
||||||
TextInitialOrientation = Text->GetTextAngle();
|
|
||||||
|
|
||||||
// Center cursor on initial position of text
|
|
||||||
SetCrossHairPosition( TextInitialPosition );
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
|
|
||||||
SetMsgPanel( Text );
|
|
||||||
SetCurItem( Text );
|
|
||||||
m_canvas->SetMouseCapture( Show_MoveTexte_Module, AbortMoveTextModule );
|
|
||||||
m_canvas->CallMouseCapture( DC, wxDefaultPosition, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_BASE_FRAME::PlaceTexteModule( TEXTE_MODULE* Text, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( Text != NULL )
|
|
||||||
{
|
|
||||||
m_canvas->RefreshDrawingRect( Text->GetBoundingBox() );
|
|
||||||
Text->DrawUmbilical( m_canvas, DC, GR_XOR, -MoveVector );
|
|
||||||
|
|
||||||
// Update the coordinates for anchor.
|
|
||||||
MODULE* Module = static_cast<MODULE*>( Text->GetParent() );
|
|
||||||
|
|
||||||
if( Module )
|
|
||||||
{
|
|
||||||
// Prepare undo command (a rotation can be made while moving)
|
|
||||||
double tmp = Text->GetTextAngle();
|
|
||||||
Text->SetTextAngle( TextInitialOrientation );
|
|
||||||
|
|
||||||
if( IsType( FRAME_PCB ) )
|
|
||||||
SaveCopyInUndoList( Module, UR_CHANGED );
|
|
||||||
else
|
|
||||||
SaveCopyInUndoList( Module, UR_CHANGED );
|
|
||||||
|
|
||||||
Text->SetTextAngle( tmp );
|
|
||||||
|
|
||||||
// Set the new position for text.
|
|
||||||
Text->SetTextPos( GetCrossHairPosition() );
|
|
||||||
wxPoint textRelPos = Text->GetTextPos() - Module->GetPosition();
|
|
||||||
RotatePoint( &textRelPos, -Module->GetOrientation() );
|
|
||||||
Text->SetPos0( textRelPos );
|
|
||||||
Text->ClearFlags();
|
|
||||||
Module->ClearFlags();
|
|
||||||
Module->SetLastEditTime();
|
|
||||||
OnModify();
|
|
||||||
|
|
||||||
// Redraw text.
|
|
||||||
m_canvas->RefreshDrawingRect( Text->GetBoundingBox() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Text->SetTextPos( GetCrossHairPosition() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// leave it at (0,0) so we can use it Rotate when not moving.
|
|
||||||
MoveVector.x = MoveVector.y = 0;
|
|
||||||
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void Show_MoveTexte_Module( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
|
|
||||||
bool aErase )
|
|
||||||
{
|
|
||||||
BASE_SCREEN* screen = aPanel->GetScreen();
|
|
||||||
TEXTE_MODULE* Text = static_cast<TEXTE_MODULE*>( screen->GetCurItem() );
|
|
||||||
|
|
||||||
if( Text == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Erase umbilical and text if necessary
|
|
||||||
if( aErase )
|
|
||||||
{
|
|
||||||
Text->DrawUmbilical( aPanel, aDC, GR_XOR, -MoveVector );
|
|
||||||
Text->Draw( aPanel, aDC, GR_XOR, MoveVector );
|
|
||||||
}
|
|
||||||
|
|
||||||
MoveVector = TextInitialPosition - aPanel->GetParent()->GetCrossHairPosition();
|
|
||||||
|
|
||||||
// Draw umbilical if text moved
|
|
||||||
if( MoveVector.x || MoveVector.y )
|
|
||||||
Text->DrawUmbilical( aPanel, aDC, GR_XOR, -MoveVector );
|
|
||||||
|
|
||||||
// Redraw text
|
|
||||||
Text->Draw( aPanel, aDC, GR_XOR, MoveVector );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_BASE_FRAME::ResetTextSize( BOARD_ITEM* aItem, wxDC* aDC )
|
|
||||||
{
|
|
||||||
wxSize newSize = GetDesignSettings().GetTextSize( aItem->GetLayer() );
|
|
||||||
int newThickness = GetDesignSettings().GetTextThickness( aItem->GetLayer() );
|
|
||||||
bool newItalic = GetDesignSettings().GetTextItalic( aItem->GetLayer() );
|
|
||||||
|
|
||||||
if( aItem->Type() == PCB_TEXT_T )
|
|
||||||
{
|
|
||||||
TEXTE_PCB* text = static_cast<TEXTE_PCB*>( aItem );
|
|
||||||
|
|
||||||
// Exit if there's nothing to do
|
|
||||||
if( text->GetTextSize() == newSize && text->GetThickness() == newThickness )
|
|
||||||
return;
|
|
||||||
|
|
||||||
SaveCopyInUndoList( text, UR_CHANGED );
|
|
||||||
text->SetTextSize( newSize );
|
|
||||||
text->SetThickness( newThickness );
|
|
||||||
text->SetItalic( newItalic );
|
|
||||||
}
|
|
||||||
|
|
||||||
else if( aItem->Type() == PCB_MODULE_TEXT_T )
|
|
||||||
{
|
|
||||||
TEXTE_MODULE* text = static_cast<TEXTE_MODULE*>( aItem );
|
|
||||||
|
|
||||||
// Exit if there's nothing to do
|
|
||||||
if( text->GetTextSize() == newSize && text->GetThickness() == newThickness )
|
|
||||||
return;
|
|
||||||
|
|
||||||
SaveCopyInUndoList( text->GetParent(), UR_CHANGED );
|
|
||||||
text->SetTextSize( newSize );
|
|
||||||
text->SetThickness( newThickness );
|
|
||||||
text->SetItalic( newItalic );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( aDC )
|
|
||||||
m_canvas->Refresh();
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
}
|
|
|
@ -686,41 +686,6 @@ void FOOTPRINT_EDIT_FRAME::Show3D_Frame( wxCommandEvent& event )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FOOTPRINT_EDIT_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey )
|
|
||||||
{
|
|
||||||
// Filter out the 'fake' mouse motion after a keyboard movement
|
|
||||||
if( !aHotKey && m_movingCursorWithKeyboard )
|
|
||||||
{
|
|
||||||
m_movingCursorWithKeyboard = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// when moving mouse, use the "magnetic" grid, unless the shift+ctrl keys is pressed
|
|
||||||
// for next cursor position
|
|
||||||
// ( shift or ctrl key down are PAN command with mouse wheel)
|
|
||||||
bool snapToGrid = true;
|
|
||||||
|
|
||||||
if( !aHotKey && wxGetKeyState( WXK_SHIFT ) && wxGetKeyState( WXK_CONTROL ) )
|
|
||||||
snapToGrid = false;
|
|
||||||
|
|
||||||
wxPoint oldpos = GetCrossHairPosition();
|
|
||||||
wxPoint pos = aPosition;
|
|
||||||
bool keyHandled = GeneralControlKeyMovement( aHotKey, &pos, snapToGrid );
|
|
||||||
|
|
||||||
SetCrossHairPosition( pos, snapToGrid );
|
|
||||||
RefreshCrossHair( oldpos, aPosition, aDC );
|
|
||||||
|
|
||||||
if( aHotKey && OnHotKey( aDC, aHotKey, aPosition ) )
|
|
||||||
{
|
|
||||||
keyHandled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateStatusBar();
|
|
||||||
|
|
||||||
return keyHandled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::OnModify()
|
void FOOTPRINT_EDIT_FRAME::OnModify()
|
||||||
{
|
{
|
||||||
PCB_BASE_FRAME::OnModify();
|
PCB_BASE_FRAME::OnModify();
|
||||||
|
|
|
@ -124,15 +124,6 @@ public:
|
||||||
|
|
||||||
void ReCreateVToolbar() override;
|
void ReCreateVToolbar() override;
|
||||||
void ReCreateOptToolbar() override;
|
void ReCreateOptToolbar() override;
|
||||||
void OnLeftClick( wxDC* DC, const wxPoint& MousePos ) override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle the double click in the footprint editor.
|
|
||||||
*
|
|
||||||
* If the double clicked item is editable: call the corresponding editor.
|
|
||||||
*/
|
|
||||||
void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) override;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief (Re)Create the menubar for the module editor frame
|
* @brief (Re)Create the menubar for the module editor frame
|
||||||
|
@ -161,15 +152,6 @@ public:
|
||||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle hot key events.
|
|
||||||
* <p>
|
|
||||||
* Some commands are relative to the item under the mouse cursor. Commands are
|
|
||||||
* case insensitive
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
bool OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem = NULL ) override;
|
|
||||||
|
|
||||||
BOARD_ITEM* PrepareItemForHotkey( bool failIfCurrentlyEdited );
|
BOARD_ITEM* PrepareItemForHotkey( bool failIfCurrentlyEdited );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -177,7 +159,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void Show3D_Frame( wxCommandEvent& event ) override;
|
void Show3D_Frame( wxCommandEvent& event ) override;
|
||||||
|
|
||||||
bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey = 0 ) override;
|
|
||||||
void OnVerticalToolbar( wxCommandEvent& aEvent );
|
void OnVerticalToolbar( wxCommandEvent& aEvent );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -240,16 +221,12 @@ public:
|
||||||
*/
|
*/
|
||||||
bool Clear_Pcb( bool aQuery );
|
bool Clear_Pcb( bool aQuery );
|
||||||
|
|
||||||
BOARD_ITEM* ModeditLocateAndDisplay( int aHotKeyCode = 0 );
|
|
||||||
|
|
||||||
/// Return the LIB_ID of the part selected in the footprint or the part being edited.
|
/// Return the LIB_ID of the part selected in the footprint or the part being edited.
|
||||||
LIB_ID getTargetFPID() const;
|
LIB_ID getTargetFPID() const;
|
||||||
|
|
||||||
/// Return the LIB_ID of the part being edited.
|
/// Return the LIB_ID of the part being edited.
|
||||||
LIB_ID GetLoadedFPID() const;
|
LIB_ID GetLoadedFPID() const;
|
||||||
|
|
||||||
void RemoveStruct( EDA_ITEM* Item );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Perform a geometric transform on the current footprint.
|
* Perform a geometric transform on the current footprint.
|
||||||
*/
|
*/
|
||||||
|
@ -297,51 +274,6 @@ public:
|
||||||
|
|
||||||
// functions to edit footprint edges
|
// functions to edit footprint edges
|
||||||
|
|
||||||
/**
|
|
||||||
* Change the width of module perimeter lines, EDGE_MODULEs.
|
|
||||||
*
|
|
||||||
* param ModuleSegmentWidth (global) = new width
|
|
||||||
* @param aEdge = edge to edit, or NULL. If aEdge == NULL change
|
|
||||||
* the width of all footprint's edges
|
|
||||||
*/
|
|
||||||
void Edit_Edge_Width( EDGE_MODULE* aEdge );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Change the EDGE_MODULE Edge layer, (The new layer will be asked)
|
|
||||||
* if Edge == NULL change the layer of the entire footprint edges
|
|
||||||
*
|
|
||||||
* @param Edge = edge to edit, or NULL
|
|
||||||
*/
|
|
||||||
void Edit_Edge_Layer( EDGE_MODULE* Edge );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete EDGE_MODULE ddge.
|
|
||||||
*
|
|
||||||
* @param Edge = edge to delete
|
|
||||||
*/
|
|
||||||
void Delete_Edge_Module( EDGE_MODULE* Edge );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new edge item (line, arc ..).
|
|
||||||
*
|
|
||||||
* @param Edge = if NULL: create new edge else terminate edge and create a new edge
|
|
||||||
* @param DC = current Device Context
|
|
||||||
* @param type_edge = S_SEGMENT,S_ARC ..
|
|
||||||
* @return the new created edge.
|
|
||||||
*/
|
|
||||||
EDGE_MODULE* Begin_Edge_Module( EDGE_MODULE* Edge, wxDC* DC, STROKE_T type_edge );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Terminate a move or create edge function.
|
|
||||||
*/
|
|
||||||
void End_Edge_Module( EDGE_MODULE* Edge );
|
|
||||||
|
|
||||||
/// Function to initialize the move function params of a graphic item type DRAWSEGMENT
|
|
||||||
void Start_Move_EdgeMod( EDGE_MODULE* drawitem, wxDC* DC );
|
|
||||||
|
|
||||||
/// Function to place a graphic item type EDGE_MODULE currently moved
|
|
||||||
void Place_EdgeMod( EDGE_MODULE* drawitem );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete the given module from its library.
|
* Delete the given module from its library.
|
||||||
*/
|
*/
|
||||||
|
@ -474,14 +406,6 @@ protected:
|
||||||
void restoreLastFootprint();
|
void restoreLastFootprint();
|
||||||
void retainLastFootprint();
|
void retainLastFootprint();
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new text for the footprint
|
|
||||||
* @param aModule is the owner of the text
|
|
||||||
* @param aDC is the current DC (can be NULL )
|
|
||||||
* @return a pointer to the new text, or NULL if aborted
|
|
||||||
*/
|
|
||||||
TEXTE_MODULE* CreateTextModule( MODULE* aModule, wxDC* aDC );
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -490,12 +414,6 @@ private:
|
||||||
void editFootprintProperties( MODULE* aFootprint );
|
void editFootprintProperties( MODULE* aFootprint );
|
||||||
|
|
||||||
bool saveFootprintInLibrary( MODULE* aModule, const wxString& aLibraryName );
|
bool saveFootprintInLibrary( MODULE* aModule, const wxString& aLibraryName );
|
||||||
|
|
||||||
/**
|
|
||||||
* Move the selected item exactly, popping up a dialog to allow the
|
|
||||||
* user the enter the move delta
|
|
||||||
*/
|
|
||||||
void moveExact();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FOOTPRINT_EDIT_FRAME_H
|
#endif // FOOTPRINT_EDIT_FRAME_H
|
||||||
|
|
|
@ -1,275 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2007-2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
|
||||||
* Copyright (C) 1992-2012 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file footprint_editor_onclick.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <confirm.h>
|
|
||||||
#include <gr_basic.h>
|
|
||||||
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_module.h>
|
|
||||||
#include <class_edge_mod.h>
|
|
||||||
#include <origin_viewitem.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <pcbnew_id.h>
|
|
||||||
#include <tools/pcbnew_control.h>
|
|
||||||
#include <hotkeys.h>
|
|
||||||
#include <footprint_edit_frame.h>
|
|
||||||
#include <dialog_edit_footprint_for_fp_editor.h>
|
|
||||||
#include <menus_helpers.h>
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
|
|
||||||
{
|
|
||||||
BOARD_ITEM* item = GetCurItem();
|
|
||||||
|
|
||||||
m_canvas->CrossHairOff( DC );
|
|
||||||
|
|
||||||
if( GetToolId() == ID_NO_TOOL_SELECTED )
|
|
||||||
{
|
|
||||||
if( item && item->GetEditFlags() ) // Move item command in progress
|
|
||||||
{
|
|
||||||
switch( item->Type() )
|
|
||||||
{
|
|
||||||
case PCB_MODULE_TEXT_T:
|
|
||||||
PlaceTexteModule( static_cast<TEXTE_MODULE*>( item ), DC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MODULE_EDGE_T:
|
|
||||||
SaveCopyInUndoList( GetBoard()->m_Modules, UR_CHANGED );
|
|
||||||
Place_EdgeMod( static_cast<EDGE_MODULE*>( item ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_PAD_T:
|
|
||||||
PlacePad( static_cast<D_PAD*>( item ), DC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
wxLogDebug( wxT( "WinEDA_ModEditFrame::OnLeftClick err:Struct %d, m_Flag %X" ),
|
|
||||||
item->Type(), item->GetEditFlags() );
|
|
||||||
item->ClearFlags();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( !wxGetKeyState( WXK_SHIFT ) && !wxGetKeyState( WXK_ALT )
|
|
||||||
&& !wxGetKeyState( WXK_CONTROL ) )
|
|
||||||
item = ModeditLocateAndDisplay();
|
|
||||||
|
|
||||||
SetCurItem( item );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
item = GetCurItem();
|
|
||||||
bool no_item_edited = item == NULL || item->GetEditFlags() == 0;
|
|
||||||
|
|
||||||
switch( GetToolId() )
|
|
||||||
{
|
|
||||||
case ID_NO_TOOL_SELECTED:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_MODEDIT_CIRCLE_TOOL:
|
|
||||||
case ID_MODEDIT_ARC_TOOL:
|
|
||||||
case ID_MODEDIT_LINE_TOOL:
|
|
||||||
if( no_item_edited )
|
|
||||||
{
|
|
||||||
STROKE_T shape = S_SEGMENT;
|
|
||||||
|
|
||||||
if( GetToolId() == ID_MODEDIT_CIRCLE_TOOL )
|
|
||||||
shape = S_CIRCLE;
|
|
||||||
|
|
||||||
if( GetToolId() == ID_MODEDIT_ARC_TOOL )
|
|
||||||
shape = S_ARC;
|
|
||||||
|
|
||||||
SetCurItem( Begin_Edge_Module( (EDGE_MODULE*) NULL, DC, shape ) );
|
|
||||||
}
|
|
||||||
else if( item->IsNew() )
|
|
||||||
{
|
|
||||||
if( ( (EDGE_MODULE*) item )->GetShape() == S_CIRCLE )
|
|
||||||
{
|
|
||||||
End_Edge_Module( (EDGE_MODULE*) item );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
}
|
|
||||||
else if( ( (EDGE_MODULE*) item )->GetShape() == S_ARC )
|
|
||||||
{
|
|
||||||
End_Edge_Module( (EDGE_MODULE*) item );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
}
|
|
||||||
else if( ( (EDGE_MODULE*) item )->GetShape() == S_SEGMENT )
|
|
||||||
{
|
|
||||||
SetCurItem( Begin_Edge_Module( (EDGE_MODULE*) item, DC, S_SEGMENT ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
wxLogDebug( wxT( "ProcessCommand error: unknown shape" ) );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_MODEDIT_DELETE_TOOL:
|
|
||||||
if( ! no_item_edited ) // Item in edit, cannot delete it
|
|
||||||
break;
|
|
||||||
|
|
||||||
item = ModeditLocateAndDisplay();
|
|
||||||
|
|
||||||
if( item && item->Type() != PCB_MODULE_T ) // Cannot delete the module itself
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( GetBoard()->m_Modules, UR_CHANGED );
|
|
||||||
RemoveStruct( item );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_MODEDIT_ANCHOR_TOOL:
|
|
||||||
{
|
|
||||||
MODULE* module = GetBoard()->m_Modules;
|
|
||||||
|
|
||||||
if( module == NULL || module->GetEditFlags() != 0 )
|
|
||||||
break;
|
|
||||||
|
|
||||||
SaveCopyInUndoList( module, UR_CHANGED );
|
|
||||||
|
|
||||||
// set the new relative internal local coordinates of footprint items
|
|
||||||
wxPoint moveVector = module->GetPosition() - GetCrossHairPosition();
|
|
||||||
module->MoveAnchorPosition( moveVector );
|
|
||||||
|
|
||||||
// Usually, we do not need to change twice the anchor position,
|
|
||||||
// so deselect the active tool
|
|
||||||
SetNoToolSelected();
|
|
||||||
SetCurItem( NULL );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_MODEDIT_PLACE_GRID_COORD:
|
|
||||||
PCBNEW_CONTROL::SetGridOrigin( GetGalCanvas()->GetView(), this,
|
|
||||||
new KIGFX::ORIGIN_VIEWITEM( GetBoard()->GetGridOrigin(), UR_TRANSIENT ),
|
|
||||||
GetCrossHairPosition() );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_MODEDIT_TEXT_TOOL:
|
|
||||||
if( GetBoard()->m_Modules == NULL )
|
|
||||||
break;
|
|
||||||
|
|
||||||
SaveCopyInUndoList( GetBoard()->m_Modules, UR_CHANGED );
|
|
||||||
CreateTextModule( GetBoard()->m_Modules, DC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_MODEDIT_PAD_TOOL:
|
|
||||||
if( GetBoard()->m_Modules )
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( GetBoard()->m_Modules, UR_CHANGED );
|
|
||||||
AddPad( GetBoard()->m_Modules, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_MODEDIT_MEASUREMENT_TOOL:
|
|
||||||
DisplayError( this, _( "Measurement Tool not available in Legacy Toolset" ) );
|
|
||||||
SetNoToolSelected();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
wxLogDebug( wxT( "FOOTPRINT_EDIT_FRAME::ProcessCommand error" ) );
|
|
||||||
SetNoToolSelected();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->CrossHairOn( DC );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called on a mouse left button double click
|
|
||||||
*/
|
|
||||||
void FOOTPRINT_EDIT_FRAME::OnLeftDClick( wxDC* DC, const wxPoint& MousePos )
|
|
||||||
{
|
|
||||||
BOARD_ITEM* item = GetCurItem();
|
|
||||||
|
|
||||||
switch( GetToolId() )
|
|
||||||
{
|
|
||||||
case ID_NO_TOOL_SELECTED:
|
|
||||||
if( item == NULL || item->GetEditFlags() == 0 )
|
|
||||||
item = ModeditLocateAndDisplay();
|
|
||||||
|
|
||||||
if( item == NULL || item->GetEditFlags() != 0 )
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Item found
|
|
||||||
SetCurItem( item );
|
|
||||||
OnEditItemRequest( DC, item );
|
|
||||||
break; // end case 0
|
|
||||||
|
|
||||||
case ID_PCB_ADD_LINE_BUTT:
|
|
||||||
{
|
|
||||||
if( item && item->IsNew() )
|
|
||||||
{
|
|
||||||
End_Edge_Module( (EDGE_MODULE*) item );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::OnEditItemRequest( wxDC* aDC, BOARD_ITEM* aItem )
|
|
||||||
{
|
|
||||||
switch( aItem->Type() )
|
|
||||||
{
|
|
||||||
case PCB_PAD_T:
|
|
||||||
InstallPadOptionsFrame( static_cast<D_PAD*>( aItem ) );
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MODULE_T:
|
|
||||||
editFootprintProperties( (MODULE*) aItem );
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MODULE_TEXT_T:
|
|
||||||
InstallTextOptionsFrame( aItem, aDC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MODULE_EDGE_T :
|
|
||||||
InstallGraphicItemPropertiesDialog( aItem );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -71,109 +71,6 @@
|
||||||
using namespace std::placeholders;
|
using namespace std::placeholders;
|
||||||
|
|
||||||
|
|
||||||
// Functions defined in block_module_editor, but used here
|
|
||||||
// These 3 functions are used in modedit to rotate, mirror or move the
|
|
||||||
// whole footprint so they are called with force_all = true
|
|
||||||
void MirrorMarkedItems( MODULE* module, wxPoint offset, bool force_all = false );
|
|
||||||
void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all = false );
|
|
||||||
void MoveMarkedItemsExactly( MODULE* module, const wxPoint& centre,
|
|
||||||
const wxPoint& translation, double rotation,
|
|
||||||
bool force_all = false );
|
|
||||||
|
|
||||||
|
|
||||||
BOARD_ITEM* FOOTPRINT_EDIT_FRAME::ModeditLocateAndDisplay( int aHotKeyCode )
|
|
||||||
{
|
|
||||||
BOARD_ITEM* item = GetCurItem();
|
|
||||||
|
|
||||||
if( GetBoard()->m_Modules == NULL )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
GENERAL_COLLECTORS_GUIDE guide = GetCollectorsGuide();
|
|
||||||
|
|
||||||
// Assign to scanList the proper item types desired based on tool type
|
|
||||||
// or hotkey that is in play.
|
|
||||||
|
|
||||||
const KICAD_T* scanList = NULL;
|
|
||||||
|
|
||||||
if( aHotKeyCode )
|
|
||||||
{
|
|
||||||
// @todo: add switch here and add calls to PcbGeneralLocateAndDisplay(
|
|
||||||
// int aHotKeyCode ) when searching is needed from a hotkey handler
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
scanList = GENERAL_COLLECTOR::ModulesAndTheirItems;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_Collector->Collect( GetBoard(), scanList, RefPos( true ), guide );
|
|
||||||
|
|
||||||
// Remove redundancies: when an item is found, we can remove the module from list
|
|
||||||
if( m_Collector->GetCount() > 1 )
|
|
||||||
{
|
|
||||||
for( int ii = 0; ii < m_Collector->GetCount(); ii++ )
|
|
||||||
{
|
|
||||||
item = (*m_Collector)[ii];
|
|
||||||
|
|
||||||
if( item->Type() != PCB_MODULE_T )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
m_Collector->Remove( ii );
|
|
||||||
ii--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( m_Collector->GetCount() <= 1 )
|
|
||||||
{
|
|
||||||
item = (*m_Collector)[0];
|
|
||||||
SetCurItem( item );
|
|
||||||
}
|
|
||||||
else // we can't figure out which item user wants, do popup menu so user can choose
|
|
||||||
{
|
|
||||||
wxMenu itemMenu;
|
|
||||||
|
|
||||||
// Give a title to the selection menu. It also allows one to close the popup menu without any action
|
|
||||||
AddMenuItem( &itemMenu, wxID_NONE, _( "Clarify Selection" ),
|
|
||||||
KiBitmap( info_xpm ) );
|
|
||||||
itemMenu.AppendSeparator();
|
|
||||||
|
|
||||||
int limit = std::min( MAX_ITEMS_IN_PICKER, m_Collector->GetCount() );
|
|
||||||
|
|
||||||
for( int ii = 0; ii<limit; ++ii )
|
|
||||||
{
|
|
||||||
item = (*m_Collector)[ii];
|
|
||||||
|
|
||||||
wxString text = item->GetSelectMenuText( GetUserUnits() );
|
|
||||||
BITMAP_DEF xpm = item->GetMenuImage();
|
|
||||||
|
|
||||||
AddMenuItem( &itemMenu,
|
|
||||||
ID_POPUP_PCB_ITEM_SELECTION_START + ii,
|
|
||||||
text,
|
|
||||||
KiBitmap( xpm ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// this menu's handler is void
|
|
||||||
// PCB_BASE_FRAME::ProcessItemSelection()
|
|
||||||
// and it calls SetCurItem() which in turn calls DisplayInfo() on the
|
|
||||||
// item.
|
|
||||||
m_canvas->SetAbortRequest( true ); // changed in false if an item is selected
|
|
||||||
PopupMenu( &itemMenu ); // m_AbortRequest = false if an item is selected
|
|
||||||
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
m_canvas->SetIgnoreMouseEvents( false );
|
|
||||||
|
|
||||||
// The function ProcessItemSelection() has set the current item, return it.
|
|
||||||
item = GetCurItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( item )
|
|
||||||
{
|
|
||||||
SetMsgPanel( item );
|
|
||||||
}
|
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::LoadModuleFromBoard( wxCommandEvent& event )
|
void FOOTPRINT_EDIT_FRAME::LoadModuleFromBoard( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
Load_Module_From_BOARD( NULL );
|
Load_Module_From_BOARD( NULL );
|
||||||
|
@ -588,16 +485,6 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ID_POPUP_PCB_MOVE_EXACT:
|
|
||||||
moveExact();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_POPUP_PCB_CREATE_ARRAY:
|
|
||||||
createArray();
|
|
||||||
break;
|
|
||||||
|
|
||||||
// JEY TODO: many (most? all?) of these are legacy-only and can be removed.
|
|
||||||
|
|
||||||
case ID_GEN_IMPORT_GRAPHICS_FILE:
|
case ID_GEN_IMPORT_GRAPHICS_FILE:
|
||||||
if( GetBoard()->m_Modules )
|
if( GetBoard()->m_Modules )
|
||||||
{
|
{
|
||||||
|
@ -626,44 +513,6 @@ void FOOTPRINT_EDIT_FRAME::editFootprintProperties( MODULE* aModule )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::moveExact()
|
|
||||||
{
|
|
||||||
wxPoint translation;
|
|
||||||
double rotation;
|
|
||||||
ROTATION_ANCHOR rotationAnchor = ROTATE_AROUND_ITEM_ANCHOR;
|
|
||||||
|
|
||||||
DIALOG_MOVE_EXACT dialog( this, translation, rotation, rotationAnchor );
|
|
||||||
int ret = dialog.ShowModal();
|
|
||||||
|
|
||||||
if( ret == wxID_OK )
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( GetBoard()->m_Modules, UR_CHANGED );
|
|
||||||
|
|
||||||
BOARD_ITEM* item = GetScreen()->GetCurItem();
|
|
||||||
|
|
||||||
item->Move( translation );
|
|
||||||
|
|
||||||
switch( rotationAnchor )
|
|
||||||
{
|
|
||||||
case ROTATE_AROUND_ITEM_ANCHOR:
|
|
||||||
item->Rotate( item->GetPosition(), rotation );
|
|
||||||
break;
|
|
||||||
case ROTATE_AROUND_USER_ORIGIN:
|
|
||||||
item->Rotate( GetScreen()->m_O_Curseur, rotation );
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
wxFAIL_MSG( "Rotation choice shouldn't have been available in this context." );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
item->Rotate( item->GetPosition(), rotation );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::OnVerticalToolbar( wxCommandEvent& aEvent )
|
void FOOTPRINT_EDIT_FRAME::OnVerticalToolbar( wxCommandEvent& aEvent )
|
||||||
{
|
{
|
||||||
int id = aEvent.GetId();
|
int id = aEvent.GetId();
|
||||||
|
@ -738,55 +587,35 @@ void FOOTPRINT_EDIT_FRAME::OnVerticalToolbar( wxCommandEvent& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_EDIT_FRAME::RemoveStruct( EDA_ITEM* Item )
|
void FOOTPRINT_EDIT_FRAME::OnEditItemRequest( wxDC* aDC, BOARD_ITEM* aItem )
|
||||||
{
|
{
|
||||||
if( Item == NULL )
|
switch( aItem->Type() )
|
||||||
return;
|
|
||||||
|
|
||||||
switch( Item->Type() )
|
|
||||||
{
|
{
|
||||||
case PCB_PAD_T:
|
case PCB_PAD_T:
|
||||||
DeletePad( (D_PAD*) Item, false );
|
InstallPadOptionsFrame( static_cast<D_PAD*>( aItem ) );
|
||||||
break;
|
m_canvas->MoveCursorToCrossHair();
|
||||||
|
|
||||||
case PCB_MODULE_TEXT_T:
|
|
||||||
{
|
|
||||||
TEXTE_MODULE* text = static_cast<TEXTE_MODULE*>( Item );
|
|
||||||
|
|
||||||
switch( text->GetType() )
|
|
||||||
{
|
|
||||||
case TEXTE_MODULE::TEXT_is_REFERENCE:
|
|
||||||
DisplayError( this, _( "Cannot delete REFERENCE!" ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TEXTE_MODULE::TEXT_is_VALUE:
|
|
||||||
DisplayError( this, _( "Cannot delete VALUE!" ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TEXTE_MODULE::TEXT_is_DIVERS:
|
|
||||||
DeleteTextModule( text );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MODULE_EDGE_T:
|
|
||||||
Delete_Edge_Module( (EDGE_MODULE*) Item );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PCB_MODULE_T:
|
case PCB_MODULE_T:
|
||||||
|
editFootprintProperties( (MODULE*) aItem );
|
||||||
|
m_canvas->MoveCursorToCrossHair();
|
||||||
|
m_canvas->Refresh();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_MODULE_TEXT_T:
|
||||||
|
InstallTextOptionsFrame( aItem, aDC );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PCB_MODULE_EDGE_T :
|
||||||
|
InstallGraphicItemPropertiesDialog( aItem );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
break;
|
||||||
wxString Line;
|
|
||||||
Line.Printf( wxT( " RemoveStruct: item type %d unknown." ), Item->Type() );
|
|
||||||
wxMessageBox( Line );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
COLOR4D FOOTPRINT_EDIT_FRAME::GetGridColor()
|
COLOR4D FOOTPRINT_EDIT_FRAME::GetGridColor()
|
||||||
{
|
{
|
||||||
return Settings().Colors().GetItemColor( LAYER_GRID );
|
return Settings().Colors().GetItemColor( LAYER_GRID );
|
||||||
|
|
|
@ -652,38 +652,6 @@ bool FOOTPRINT_VIEWER_FRAME::ShowModal( wxString* aFootprint, wxWindow* aParent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FOOTPRINT_VIEWER_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey )
|
|
||||||
{
|
|
||||||
bool eventHandled = true;
|
|
||||||
|
|
||||||
// Filter out the 'fake' mouse motion after a keyboard movement
|
|
||||||
if( !aHotKey && m_movingCursorWithKeyboard )
|
|
||||||
{
|
|
||||||
m_movingCursorWithKeyboard = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
wxPoint oldpos = GetCrossHairPosition();
|
|
||||||
wxPoint pos = aPosition;
|
|
||||||
GeneralControlKeyMovement( aHotKey, &pos, true );
|
|
||||||
|
|
||||||
if( aHotKey )
|
|
||||||
{
|
|
||||||
eventHandled = OnHotKey( aDC, aHotKey, aPosition );
|
|
||||||
}
|
|
||||||
|
|
||||||
SetCrossHairPosition( pos );
|
|
||||||
RefreshCrossHair( oldpos, aPosition, aDC );
|
|
||||||
|
|
||||||
UpdateStatusBar(); // Display new cursor coordinates
|
|
||||||
|
|
||||||
return eventHandled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_VIEWER_FRAME::Show3D_Frame( wxCommandEvent& event )
|
void FOOTPRINT_VIEWER_FRAME::Show3D_Frame( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||||
|
|
|
@ -135,21 +135,9 @@ private:
|
||||||
|
|
||||||
void InstallDisplayOptions( wxCommandEvent& event );
|
void InstallDisplayOptions( wxCommandEvent& event );
|
||||||
|
|
||||||
bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey = 0 ) override;
|
|
||||||
|
|
||||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Function OnHotKey
|
|
||||||
* handle hot key events.
|
|
||||||
* <p?
|
|
||||||
* Some commands are relative to the item under the mouse cursor. Commands are
|
|
||||||
* case insensitive
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
bool OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem = NULL ) override;
|
|
||||||
|
|
||||||
void LoadSettings( wxConfigBase* aCfg ) override;
|
void LoadSettings( wxConfigBase* aCfg ) override;
|
||||||
void SaveSettings( wxConfigBase* aCfg ) override;
|
void SaveSettings( wxConfigBase* aCfg ) override;
|
||||||
|
|
||||||
|
|
|
@ -590,42 +590,6 @@ void FOOTPRINT_WIZARD_FRAME::OnActivate( wxActivateEvent& event )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FOOTPRINT_WIZARD_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey )
|
|
||||||
{
|
|
||||||
// Filter out the 'fake' mouse motion after a keyboard movement
|
|
||||||
if( !aHotKey && m_movingCursorWithKeyboard )
|
|
||||||
{
|
|
||||||
m_movingCursorWithKeyboard = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
wxPoint pos = aPosition;
|
|
||||||
wxPoint oldpos = GetCrossHairPosition();
|
|
||||||
bool keyHandled = GeneralControlKeyMovement( aHotKey, &pos, true );
|
|
||||||
|
|
||||||
switch( aHotKey )
|
|
||||||
{
|
|
||||||
case ' ':
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
keyHandled = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetCrossHairPosition( pos );
|
|
||||||
RefreshCrossHair( oldpos, aPosition, aDC );
|
|
||||||
|
|
||||||
UpdateStatusBar(); // Display new cursor coordinates
|
|
||||||
|
|
||||||
return keyHandled;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void FOOTPRINT_WIZARD_FRAME::Show3D_Frame( wxCommandEvent& event )
|
void FOOTPRINT_WIZARD_FRAME::Show3D_Frame( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
EDA_3D_VIEWER* draw3DFrame = Get3DViewerFrame();
|
||||||
|
|
|
@ -182,21 +182,9 @@ private:
|
||||||
void ClickOnPageList( wxCommandEvent& event );
|
void ClickOnPageList( wxCommandEvent& event );
|
||||||
void OnSetRelativeOffset( wxCommandEvent& event );
|
void OnSetRelativeOffset( wxCommandEvent& event );
|
||||||
|
|
||||||
bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey = 0 ) override;
|
|
||||||
|
|
||||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Function OnHotKey
|
|
||||||
* handle hot key events.
|
|
||||||
* <p?
|
|
||||||
* Some commands are relative to the item under the mouse cursor. Commands are
|
|
||||||
* case insensitive
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
bool OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition, EDA_ITEM* aItem = NULL ) override;
|
|
||||||
|
|
||||||
void LoadSettings( wxConfigBase* aCfg ) override;
|
void LoadSettings( wxConfigBase* aCfg ) override;
|
||||||
void SaveSettings( wxConfigBase* aCfg ) override;
|
void SaveSettings( wxConfigBase* aCfg ) override;
|
||||||
|
|
||||||
|
|
|
@ -1,112 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
|
|
||||||
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
|
||||||
* Copyright (C) 1992-2012 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file highlight.cpp
|
|
||||||
* @brief Highlight nets.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <kicad_device_context.h>
|
|
||||||
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_track.h>
|
|
||||||
#include <class_zone.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <collectors.h>
|
|
||||||
|
|
||||||
|
|
||||||
int PCB_EDIT_FRAME::SelectHighLight( wxDC* DC )
|
|
||||||
{
|
|
||||||
int netcode = -1;
|
|
||||||
|
|
||||||
if( GetBoard()->IsHighLightNetON() )
|
|
||||||
HighLight( DC );
|
|
||||||
|
|
||||||
// use this scheme because a pad is a higher priority than a track in the
|
|
||||||
// search, and finding a pad, instead of a track on a pad,
|
|
||||||
// allows us to fire a message to Eeschema.
|
|
||||||
|
|
||||||
GENERAL_COLLECTORS_GUIDE guide = GetCollectorsGuide();
|
|
||||||
|
|
||||||
// optionally, modify the "guide" here as needed using its member functions
|
|
||||||
|
|
||||||
m_Collector->Collect( GetBoard(), GENERAL_COLLECTOR::PadsOrTracks,
|
|
||||||
RefPos( true ), guide );
|
|
||||||
|
|
||||||
if( m_Collector->GetCount() == 0 )
|
|
||||||
m_Collector->Collect( GetBoard(), GENERAL_COLLECTOR::Zones,
|
|
||||||
RefPos( true ), guide );
|
|
||||||
|
|
||||||
BOARD_ITEM* item = (*m_Collector)[0];
|
|
||||||
|
|
||||||
if( item )
|
|
||||||
{
|
|
||||||
switch( item->Type() )
|
|
||||||
{
|
|
||||||
case PCB_PAD_T:
|
|
||||||
netcode = ( (D_PAD*) item )->GetNetCode();
|
|
||||||
SendMessageToEESCHEMA( item );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TRACE_T:
|
|
||||||
case PCB_VIA_T:
|
|
||||||
// since these classes are all derived from TRACK, use a common
|
|
||||||
// GetNet() function:
|
|
||||||
netcode = ( (TRACK*) item )->GetNetCode();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_ZONE_AREA_T:
|
|
||||||
netcode = ( (ZONE_CONTAINER*) item )->GetNetCode();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
; // until somebody changes GENERAL_COLLECTOR::PadsOrTracks,
|
|
||||||
// this should not happen.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( netcode >= 0 )
|
|
||||||
{
|
|
||||||
GetBoard()->SetHighLightNet( netcode );
|
|
||||||
HighLight( DC );
|
|
||||||
}
|
|
||||||
|
|
||||||
return netcode; // HitTest() failed.
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::HighLight( wxDC* DC )
|
|
||||||
{
|
|
||||||
if( GetBoard()->IsHighLightNetON() )
|
|
||||||
GetBoard()->HighLightOFF();
|
|
||||||
else
|
|
||||||
GetBoard()->HighLightON();
|
|
||||||
|
|
||||||
GetBoard()->DrawHighLight( m_canvas, DC, GetBoard()->GetHighLightNetCode() );
|
|
||||||
}
|
|
|
@ -22,13 +22,10 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* @file pcbnew/hotkeys.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
#include <fctsys.h>
|
||||||
#include <pcbnew.h>
|
#include <pcbnew.h>
|
||||||
#include <pcb_edit_frame.h>
|
#include <pcb_edit_frame.h>
|
||||||
|
#include <footprint_edit_frame.h>
|
||||||
#include <footprint_viewer_frame.h>
|
#include <footprint_viewer_frame.h>
|
||||||
#include <footprint_wizard_frame.h>
|
#include <footprint_wizard_frame.h>
|
||||||
#include <pcbnew_id.h>
|
#include <pcbnew_id.h>
|
||||||
|
@ -583,57 +580,6 @@ EDA_HOTKEY* FOOTPRINT_VIEWER_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FOOTPRINT_VIEWER_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
|
|
||||||
EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
if( aHotKey == 0 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
/* Convert lower to upper case (the usual toupper function has problem with non ascii
|
|
||||||
* codes like function keys */
|
|
||||||
if( (aHotKey >= 'a') && (aHotKey <= 'z') )
|
|
||||||
aHotKey += 'A' - 'a';
|
|
||||||
|
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromHotkey( aHotKey, common_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
HK_Descr = GetDescriptorFromHotkey( aHotKey, module_viewer_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch( HK_Descr->m_Idcommand )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case HK_NOT_FOUND:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case HK_HELP: // Display Current hotkey list
|
|
||||||
DisplayHotkeyList( this, g_Module_Viewer_Hotkeys_Descr );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_LOCAL_COORD: // set local (relative) coordinate origin
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_LEFT_CLICK:
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
OnLeftDClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EDA_HOTKEY* FOOTPRINT_WIZARD_FRAME::GetHotKeyDescription( int aCommand ) const
|
EDA_HOTKEY* FOOTPRINT_WIZARD_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
{
|
{
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
||||||
|
@ -642,47 +588,23 @@ EDA_HOTKEY* FOOTPRINT_WIZARD_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FOOTPRINT_WIZARD_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
|
EDA_HOTKEY* PCB_EDIT_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
EDA_ITEM* aItem )
|
|
||||||
{
|
{
|
||||||
if( aHotKey == 0 )
|
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
||||||
return false;
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
/* Convert lower to upper case (the usual toupper function has problem with non ascii
|
|
||||||
* codes like function keys */
|
|
||||||
if( (aHotKey >= 'a') && (aHotKey <= 'z') )
|
|
||||||
aHotKey += 'A' - 'a';
|
|
||||||
|
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromHotkey( aHotKey, common_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
if( HK_Descr == NULL )
|
||||||
return false;
|
HK_Descr = GetDescriptorFromCommand( aCommand, board_edit_Hotkey_List );
|
||||||
|
|
||||||
switch( HK_Descr->m_Idcommand )
|
return HK_Descr;
|
||||||
{
|
}
|
||||||
default:
|
|
||||||
case HK_NOT_FOUND:
|
|
||||||
return false;
|
EDA_HOTKEY* FOOTPRINT_EDIT_FRAME::GetHotKeyDescription( int aCommand ) const
|
||||||
|
{
|
||||||
case HK_HELP: // Display Current hotkey list
|
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
||||||
DisplayHotkeyList( this, g_Module_Viewer_Hotkeys_Descr );
|
|
||||||
break;
|
if( HK_Descr == NULL )
|
||||||
|
HK_Descr = GetDescriptorFromCommand( aCommand, module_edit_Hotkey_List );
|
||||||
case HK_RESET_LOCAL_COORD: // set local (relative) coordinate origin
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
return HK_Descr;
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_LEFT_CLICK:
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
OnLeftDClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,15 +139,12 @@ extern struct EDA_HOTKEY_CONFIG g_Module_Editor_Hotkeys_Descr[];
|
||||||
extern struct EDA_HOTKEY_CONFIG g_Module_Viewer_Hotkeys_Descr[];
|
extern struct EDA_HOTKEY_CONFIG g_Module_Viewer_Hotkeys_Descr[];
|
||||||
|
|
||||||
// List of common hotkey descriptors
|
// List of common hotkey descriptors
|
||||||
// used in hotkeys_board_editor.cpp and hotkeys_module_editor.cpp
|
|
||||||
extern EDA_HOTKEY* common_Hotkey_List[];
|
extern EDA_HOTKEY* common_Hotkey_List[];
|
||||||
|
|
||||||
// List of hotkey descriptors for pcbnew
|
// List of hotkey descriptors for pcbnew
|
||||||
// used in hotkeys_board_editor.cpp
|
|
||||||
extern EDA_HOTKEY* board_edit_Hotkey_List[];
|
extern EDA_HOTKEY* board_edit_Hotkey_List[];
|
||||||
|
|
||||||
// List of hotkey descriptors for the module editor
|
// List of hotkey descriptors for the module editor
|
||||||
// used in hotkeys_module_editor.cpp
|
|
||||||
extern EDA_HOTKEY* module_edit_Hotkey_List[];
|
extern EDA_HOTKEY* module_edit_Hotkey_List[];
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,512 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2009 Jean-Pierre Charras, jp.charras@wanadoo.fr
|
|
||||||
* Copyright (C) 1992-2016 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file hotkeys_board_editor.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <confirm.h>
|
|
||||||
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_module.h>
|
|
||||||
#include <class_track.h>
|
|
||||||
#include <class_pcb_text.h>
|
|
||||||
#include <class_pcb_target.h>
|
|
||||||
#include <class_drawsegment.h>
|
|
||||||
#include <origin_viewitem.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <pcbnew_id.h>
|
|
||||||
#include <hotkeys.h>
|
|
||||||
#include <class_zone.h>
|
|
||||||
#include <tool/tool_manager.h>
|
|
||||||
#include <tools/pcbnew_control.h>
|
|
||||||
#include <tools/selection_tool.h>
|
|
||||||
#include <tool/actions.h>
|
|
||||||
|
|
||||||
/* How to add a new hotkey:
|
|
||||||
* see hotkeys.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
EDA_HOTKEY* PCB_EDIT_FRAME::GetHotKeyDescription( int aCommand ) const
|
|
||||||
{
|
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
HK_Descr = GetDescriptorFromCommand( aCommand, board_edit_Hotkey_List );
|
|
||||||
|
|
||||||
return HK_Descr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition,
|
|
||||||
EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
if( aHotkeyCode == 0 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
SELECTION& selection = GetToolManager()->GetTool<SELECTION_TOOL>()->GetSelection();
|
|
||||||
bool itemCurrentlyEdited = selection.Front() && selection.Front()->GetEditFlags();
|
|
||||||
MODULE* module = NULL;
|
|
||||||
int evt_type = 0; //Used to post a wxCommandEvent on demand
|
|
||||||
PCB_SCREEN* screen = GetScreen();
|
|
||||||
auto displ_opts = (PCB_DISPLAY_OPTIONS*) GetDisplayOptions();
|
|
||||||
|
|
||||||
/* Convert lower to upper case
|
|
||||||
* (the usual toupper function has problem with non ascii codes like function keys
|
|
||||||
*/
|
|
||||||
if( (aHotkeyCode >= 'a') && (aHotkeyCode <= 'z') )
|
|
||||||
aHotkeyCode += 'A' - 'a';
|
|
||||||
|
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, common_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
HK_Descr = GetDescriptorFromHotkey( aHotkeyCode, board_edit_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
int hk_id = HK_Descr->m_Idcommand;
|
|
||||||
|
|
||||||
// Create a wxCommandEvent that will be posted in some hot keys functions
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
LAYER_NUM ll;
|
|
||||||
|
|
||||||
switch( hk_id )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case HK_NOT_FOUND:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case HK_LEFT_CLICK:
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
OnLeftDClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_TRACK_WIDTH_TO_NEXT:
|
|
||||||
if( GetCanvas()->IsMouseCaptured() )
|
|
||||||
GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false );
|
|
||||||
|
|
||||||
if( GetDesignSettings().GetTrackWidthIndex() < GetDesignSettings().m_TrackWidthList.size() - 1 )
|
|
||||||
GetDesignSettings().SetTrackWidthIndex( GetDesignSettings().GetTrackWidthIndex() + 1 );
|
|
||||||
else
|
|
||||||
GetDesignSettings().SetTrackWidthIndex( 0 );
|
|
||||||
|
|
||||||
if( GetCanvas()->IsMouseCaptured() )
|
|
||||||
GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false );
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_TRACK_WIDTH_TO_PREVIOUS:
|
|
||||||
if( GetCanvas()->IsMouseCaptured() )
|
|
||||||
GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false );
|
|
||||||
|
|
||||||
if( GetDesignSettings().GetTrackWidthIndex() <= 0 )
|
|
||||||
GetDesignSettings().SetTrackWidthIndex( GetDesignSettings().m_TrackWidthList.size() -1 );
|
|
||||||
else
|
|
||||||
GetDesignSettings().SetTrackWidthIndex( GetDesignSettings().GetTrackWidthIndex() - 1 );
|
|
||||||
|
|
||||||
if( GetCanvas()->IsMouseCaptured() )
|
|
||||||
GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false );
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_GRID_TO_FASTGRID1:
|
|
||||||
SetFastGrid1();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_GRID_TO_FASTGRID2:
|
|
||||||
SetFastGrid2();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_GRID_TO_NEXT:
|
|
||||||
evt_type = ID_POPUP_GRID_NEXT;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_GRID_TO_PREVIOUS:
|
|
||||||
evt_type = ID_POPUP_GRID_PREV;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_PREVIOUS:
|
|
||||||
ll = GetActiveLayer();
|
|
||||||
|
|
||||||
if( !IsCopperLayer( ll ) )
|
|
||||||
break;
|
|
||||||
|
|
||||||
if( ll == F_Cu )
|
|
||||||
ll = B_Cu;
|
|
||||||
else if( ll == B_Cu )
|
|
||||||
ll = ToLAYER_ID( GetBoard()->GetCopperLayerCount() - 2 );
|
|
||||||
else
|
|
||||||
ll = ll - 1;
|
|
||||||
|
|
||||||
SwitchLayer( aDC, ToLAYER_ID( ll ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_NEXT:
|
|
||||||
ll = GetActiveLayer();
|
|
||||||
|
|
||||||
if( !IsCopperLayer( ll ) )
|
|
||||||
break;
|
|
||||||
|
|
||||||
if( ll == B_Cu )
|
|
||||||
ll = F_Cu;
|
|
||||||
else if( ++ll >= GetBoard()->GetCopperLayerCount() - 1 )
|
|
||||||
ll = B_Cu;
|
|
||||||
|
|
||||||
SwitchLayer( aDC, ToLAYER_ID( ll ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_COMPONENT:
|
|
||||||
SwitchLayer( aDC, F_Cu );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_COPPER:
|
|
||||||
SwitchLayer( aDC, B_Cu );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_INNER1:
|
|
||||||
SwitchLayer( aDC, In1_Cu );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_INNER2:
|
|
||||||
SwitchLayer( aDC, In2_Cu );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_INNER3:
|
|
||||||
SwitchLayer( aDC, In3_Cu );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_INNER4:
|
|
||||||
SwitchLayer( aDC, In4_Cu );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_INNER5:
|
|
||||||
SwitchLayer( aDC, In5_Cu );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_LAYER_TO_INNER6:
|
|
||||||
SwitchLayer( aDC, In6_Cu );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_HELP: // Display Current hotkey list
|
|
||||||
DisplayHotkeyList( this, g_Board_Editor_Hotkeys_Descr );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_PREFERENCES:
|
|
||||||
evt_type = wxID_PREFERENCES;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_ADD_MODULE:
|
|
||||||
evt_type = ID_PCB_MODULE_BUTT;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_LOCAL_COORD: // Set the relative coord
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SET_GRID_ORIGIN:
|
|
||||||
PCBNEW_CONTROL::SetGridOrigin( GetGalCanvas()->GetView(), this,
|
|
||||||
new KIGFX::ORIGIN_VIEWITEM( GetGridOrigin(), UR_TRANSIENT ),
|
|
||||||
GetCrossHairPosition() );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_GRID_ORIGIN:
|
|
||||||
PCBNEW_CONTROL::SetGridOrigin( GetGalCanvas()->GetView(), this,
|
|
||||||
new KIGFX::ORIGIN_VIEWITEM( GetGridOrigin(), UR_TRANSIENT ),
|
|
||||||
wxPoint( 0, 0 ) );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_TRACK_DISPLAY_MODE:
|
|
||||||
displ_opts->m_DisplayPcbTrackFill = !displ_opts->m_DisplayPcbTrackFill;
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_BACK_SPACE:
|
|
||||||
m_toolManager->RunAction( ACTIONS::doDelete );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_GET_AND_MOVE_FOOTPRINT:
|
|
||||||
if( !itemCurrentlyEdited )
|
|
||||||
evt_type = ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_OPEN:
|
|
||||||
if( !itemCurrentlyEdited )
|
|
||||||
evt_type = ID_LOAD_FILE ;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SAVE:
|
|
||||||
if( !itemCurrentlyEdited )
|
|
||||||
evt_type = ID_SAVE_BOARD;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_ADD_MICROVIA: // Place a micro via if a track is in progress
|
|
||||||
if( GetToolId() != ID_TRACK_BUTT )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( !itemCurrentlyEdited ) // no track in progress: nothing to do
|
|
||||||
break;
|
|
||||||
|
|
||||||
if( GetCurItem()->Type() != PCB_TRACE_T ) // Should not occur
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( !GetCurItem()->IsNew() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// place micro via and switch layer
|
|
||||||
if( IsMicroViaAcceptable() )
|
|
||||||
evt_type = ID_POPUP_PCB_PLACE_MICROVIA;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_ADD_BLIND_BURIED_VIA:
|
|
||||||
case HK_ADD_THROUGH_VIA: // Switch to alternate layer and Place a via if a track is in progress
|
|
||||||
if( GetBoard()->GetDesignSettings().m_BlindBuriedViaAllowed &&
|
|
||||||
hk_id == HK_ADD_BLIND_BURIED_VIA )
|
|
||||||
GetBoard()->GetDesignSettings().m_CurrentViaType = VIA_BLIND_BURIED;
|
|
||||||
else
|
|
||||||
GetBoard()->GetDesignSettings().m_CurrentViaType = VIA_THROUGH;
|
|
||||||
|
|
||||||
if( !itemCurrentlyEdited ) // no track in progress: switch layer only
|
|
||||||
{
|
|
||||||
Other_Layer_Route( NULL, aDC );
|
|
||||||
if( displ_opts->m_ContrastModeDisplay )
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( GetToolId() != ID_TRACK_BUTT )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( GetCurItem()->Type() != PCB_TRACE_T )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( !GetCurItem()->IsNew() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
evt_type = hk_id == HK_ADD_BLIND_BURIED_VIA ?
|
|
||||||
ID_POPUP_PCB_PLACE_BLIND_BURIED_VIA : ID_POPUP_PCB_PLACE_THROUGH_VIA;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SEL_LAYER_AND_ADD_THROUGH_VIA:
|
|
||||||
case HK_SEL_LAYER_AND_ADD_BLIND_BURIED_VIA:
|
|
||||||
if( GetCurItem() == NULL || !GetCurItem()->IsNew() ||
|
|
||||||
GetCurItem()->Type() != PCB_TRACE_T )
|
|
||||||
break;
|
|
||||||
|
|
||||||
evt_type = hk_id == HK_SEL_LAYER_AND_ADD_BLIND_BURIED_VIA ?
|
|
||||||
ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_BLIND_BURIED_VIA :
|
|
||||||
ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_THROUGH_VIA;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_TRACK_POSTURE:
|
|
||||||
/* change the position of initial segment when creating new tracks
|
|
||||||
* switch from _/ to -\ .
|
|
||||||
*/
|
|
||||||
evt_type = ID_POPUP_PCB_SWITCH_TRACK_POSTURE ;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_ADD_NEW_TRACK: // Start new track, if possible
|
|
||||||
OnHotkeyBeginRoute( aDC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_LOCK_UNLOCK_FOOTPRINT: // toggle module "MODULE_is_LOCKED" status:
|
|
||||||
// get any module, locked or not locked and toggle its locked status
|
|
||||||
if( !itemCurrentlyEdited )
|
|
||||||
{
|
|
||||||
wxPoint pos = RefPos( true );
|
|
||||||
module = GetBoard()->GetFootprint( pos, screen->m_Active_Layer, true );
|
|
||||||
}
|
|
||||||
else if( GetCurItem()->Type() == PCB_MODULE_T )
|
|
||||||
{
|
|
||||||
module = (MODULE*) GetCurItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( module )
|
|
||||||
{
|
|
||||||
SetCurItem( module );
|
|
||||||
module->SetLocked( !module->IsLocked() );
|
|
||||||
OnModify();
|
|
||||||
SetMsgPanel( module );
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_MOVE_ITEM_EXACT:
|
|
||||||
case HK_DUPLICATE:
|
|
||||||
case HK_DUPLICATE_ITEM_AND_INCREMENT:
|
|
||||||
case HK_CREATE_ARRAY:
|
|
||||||
OnHotkeyDuplicateOrArrayItem( HK_Descr->m_Idcommand );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SWITCH_HIGHCONTRAST_MODE: // switch to high contrast mode and refresh the canvas
|
|
||||||
displ_opts->m_ContrastModeDisplay = !displ_opts->m_ContrastModeDisplay;
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_CANVAS_CAIRO:
|
|
||||||
evt_type = ID_MENU_CANVAS_CAIRO;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_CANVAS_OPENGL:
|
|
||||||
evt_type = ID_MENU_CANVAS_OPENGL;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_ZONE_FILL_OR_REFILL:
|
|
||||||
evt_type = ID_POPUP_PCB_FILL_ALL_ZONES;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_ZONE_REMOVE_FILLED:
|
|
||||||
evt_type = ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( evt_type != 0 )
|
|
||||||
{
|
|
||||||
wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
evt.SetEventObject( this );
|
|
||||||
evt.SetId( evt_type );
|
|
||||||
GetEventHandler()->ProcessEvent( evt );
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TRACK * PCB_EDIT_FRAME::OnHotkeyBeginRoute( wxDC* aDC )
|
|
||||||
{
|
|
||||||
if( !IsCopperLayer( GetActiveLayer() ) )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
bool itemCurrentlyEdited = GetCurItem() && GetCurItem()->GetEditFlags();
|
|
||||||
|
|
||||||
// Ensure the track tool is active
|
|
||||||
if( GetToolId() != ID_TRACK_BUTT && !itemCurrentlyEdited )
|
|
||||||
{
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
cmd.SetId( ID_TRACK_BUTT );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( GetToolId() != ID_TRACK_BUTT )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
TRACK* track = NULL;
|
|
||||||
|
|
||||||
if( !itemCurrentlyEdited ) // no track in progress:
|
|
||||||
{
|
|
||||||
track = Begin_Route( NULL, aDC );
|
|
||||||
SetCurItem( track );
|
|
||||||
|
|
||||||
if( track )
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
}
|
|
||||||
else if( GetCurItem()->IsNew() )
|
|
||||||
{
|
|
||||||
track = Begin_Route( (TRACK*) GetCurItem(), aDC );
|
|
||||||
|
|
||||||
// SetCurItem() must not write to the msg panel
|
|
||||||
// because a track info is displayed while moving the mouse cursor
|
|
||||||
if( track ) // A new segment was created
|
|
||||||
SetCurItem( track, false );
|
|
||||||
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
return track;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PCB_EDIT_FRAME::OnHotkeyDuplicateOrArrayItem( int aIdCommand )
|
|
||||||
{
|
|
||||||
BOARD_ITEM* item = GetCurItem();
|
|
||||||
bool itemCurrentlyEdited = item && item->GetEditFlags();
|
|
||||||
|
|
||||||
if( itemCurrentlyEdited )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
item = PcbGeneralLocateAndDisplay();
|
|
||||||
|
|
||||||
if( item == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
SetCurItem( item );
|
|
||||||
|
|
||||||
int evt_type = 0; // Used to post a wxCommandEvent on demand
|
|
||||||
|
|
||||||
bool canDuplicate = true;
|
|
||||||
|
|
||||||
switch( item->Type() )
|
|
||||||
{
|
|
||||||
// Only handle items we know we can handle
|
|
||||||
case PCB_PAD_T:
|
|
||||||
canDuplicate = false;
|
|
||||||
// no break
|
|
||||||
case PCB_MODULE_T:
|
|
||||||
case PCB_LINE_T:
|
|
||||||
case PCB_TEXT_T:
|
|
||||||
case PCB_TRACE_T:
|
|
||||||
case PCB_ZONE_AREA_T:
|
|
||||||
case PCB_TARGET_T:
|
|
||||||
case PCB_DIMENSION_T:
|
|
||||||
switch( aIdCommand )
|
|
||||||
{
|
|
||||||
case HK_CREATE_ARRAY:
|
|
||||||
if( canDuplicate )
|
|
||||||
evt_type = ID_POPUP_PCB_CREATE_ARRAY;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_MOVE_ITEM_EXACT:
|
|
||||||
evt_type = ID_POPUP_PCB_MOVE_EXACT;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// We don't handle other commands here
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
evt_type = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PostCommandMenuEvent( evt_type );
|
|
||||||
}
|
|
|
@ -1,127 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2010-2014 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
|
||||||
* Copyright (C) 1992-2016 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file hotkeys_module_editor.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <footprint_edit_frame.h>
|
|
||||||
#include <pcbnew_id.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <confirm.h>
|
|
||||||
#include <board_design_settings.h>
|
|
||||||
#include <origin_viewitem.h>
|
|
||||||
#include <tools/pcbnew_control.h>
|
|
||||||
|
|
||||||
#include <hotkeys.h>
|
|
||||||
|
|
||||||
/* How to add a new hotkey:
|
|
||||||
* See hotkeys.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
EDA_HOTKEY* FOOTPRINT_EDIT_FRAME::GetHotKeyDescription( int aCommand ) const
|
|
||||||
{
|
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromCommand( aCommand, common_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
HK_Descr = GetDescriptorFromCommand( aCommand, module_edit_Hotkey_List );
|
|
||||||
|
|
||||||
return HK_Descr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool FOOTPRINT_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
|
|
||||||
EDA_ITEM* aItem )
|
|
||||||
{
|
|
||||||
if( aHotKey == 0 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
|
|
||||||
cmd.SetEventObject( this );
|
|
||||||
|
|
||||||
/* Convert lower to upper case (the usual toupper function has problem with non ascii
|
|
||||||
* codes like function keys */
|
|
||||||
if( (aHotKey >= 'a') && (aHotKey <= 'z') )
|
|
||||||
aHotKey += 'A' - 'a';
|
|
||||||
|
|
||||||
EDA_HOTKEY* HK_Descr = GetDescriptorFromHotkey( aHotKey, common_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
HK_Descr = GetDescriptorFromHotkey( aHotKey, module_edit_Hotkey_List );
|
|
||||||
|
|
||||||
if( HK_Descr == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch( HK_Descr->m_Idcommand )
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case HK_NOT_FOUND:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case HK_HELP: // Display Current hotkey list
|
|
||||||
DisplayHotkeyList( this, g_Module_Editor_Hotkeys_Descr );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_PREFERENCES:
|
|
||||||
cmd.SetId( wxID_PREFERENCES );
|
|
||||||
GetEventHandler()->ProcessEvent( cmd );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_LOCAL_COORD: // set local (relative) coordinate origin
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_LEFT_CLICK:
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_LEFT_DCLICK: // Simulate a double left click: generate 2 events
|
|
||||||
OnLeftClick( aDC, aPosition );
|
|
||||||
OnLeftDClick( aDC, aPosition );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_SET_GRID_ORIGIN:
|
|
||||||
PCBNEW_CONTROL::SetGridOrigin( GetGalCanvas()->GetView(), this,
|
|
||||||
new KIGFX::ORIGIN_VIEWITEM( GetGridOrigin(), UR_TRANSIENT ),
|
|
||||||
GetCrossHairPosition() );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_RESET_GRID_ORIGIN:
|
|
||||||
PCBNEW_CONTROL::SetGridOrigin( GetGalCanvas()->GetView(), this,
|
|
||||||
new KIGFX::ORIGIN_VIEWITEM( GetGridOrigin(), UR_TRANSIENT ),
|
|
||||||
wxPoint( 0, 0 ) );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HK_CREATE_ARRAY:
|
|
||||||
PostCommandMenuEvent( ID_POPUP_PCB_CREATE_ARRAY );
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -59,130 +59,9 @@ static wxSize ShapeSize;
|
||||||
static int PolyShapeType;
|
static int PolyShapeType;
|
||||||
|
|
||||||
|
|
||||||
static void Exit_Self( EDA_DRAW_PANEL* aPanel, wxDC* aDC );
|
|
||||||
|
|
||||||
static void ShowBoundingBoxMicroWaveInductor( EDA_DRAW_PANEL* aPanel,
|
|
||||||
wxDC* aDC,
|
|
||||||
const wxPoint& aPosition,
|
|
||||||
bool aErase );
|
|
||||||
|
|
||||||
|
|
||||||
///> An inductor pattern temporarily used during mu-wave inductor creation
|
///> An inductor pattern temporarily used during mu-wave inductor creation
|
||||||
static MWAVE::INDUCTOR_PATTERN s_inductor_pattern;
|
static MWAVE::INDUCTOR_PATTERN s_inductor_pattern;
|
||||||
|
|
||||||
///> A flag set to true when mu-wave inductor is being created
|
|
||||||
static bool s_inductorInProgress = false;
|
|
||||||
|
|
||||||
|
|
||||||
/* This function shows on screen the bounding box of the inductor that will be
|
|
||||||
* created at the end of the build inductor process
|
|
||||||
*/
|
|
||||||
static void ShowBoundingBoxMicroWaveInductor( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|
||||||
const wxPoint& aPosition, bool aErase )
|
|
||||||
{
|
|
||||||
/* Calculate the orientation and size of the box containing the inductor:
|
|
||||||
* the box is a rectangle with height = length/2
|
|
||||||
* the shape is defined by a rectangle, nor necessary horizontal or vertical
|
|
||||||
*/
|
|
||||||
GRSetDrawMode( aDC, GR_XOR );
|
|
||||||
|
|
||||||
wxPoint poly[5];
|
|
||||||
wxPoint pt = s_inductor_pattern.m_End - s_inductor_pattern.m_Start;
|
|
||||||
double angle = -ArcTangente( pt.y, pt.x );
|
|
||||||
int len = KiROUND( EuclideanNorm( pt ) );
|
|
||||||
|
|
||||||
// calculate corners
|
|
||||||
pt.x = 0; pt.y = len / 4;
|
|
||||||
RotatePoint( &pt, angle );
|
|
||||||
poly[0] = s_inductor_pattern.m_Start + pt;
|
|
||||||
poly[1] = s_inductor_pattern.m_End + pt;
|
|
||||||
pt.x = 0; pt.y = -len / 4;
|
|
||||||
RotatePoint( &pt, angle );
|
|
||||||
poly[2] = s_inductor_pattern.m_End + pt;
|
|
||||||
poly[3] = s_inductor_pattern.m_Start + pt;
|
|
||||||
poly[4] = poly[0];
|
|
||||||
|
|
||||||
if( aErase )
|
|
||||||
{
|
|
||||||
GRPoly( aPanel->GetClipBox(), aDC, 5, poly, false, 0, YELLOW, YELLOW );
|
|
||||||
}
|
|
||||||
|
|
||||||
s_inductor_pattern.m_End = aPanel->GetParent()->GetCrossHairPosition();
|
|
||||||
pt = s_inductor_pattern.m_End - s_inductor_pattern.m_Start;
|
|
||||||
angle = -ArcTangente( pt.y, pt.x );
|
|
||||||
len = KiROUND( EuclideanNorm( pt ) );
|
|
||||||
|
|
||||||
// calculate new corners
|
|
||||||
pt.x = 0; pt.y = len / 4;
|
|
||||||
RotatePoint( &pt, angle );
|
|
||||||
poly[0] = s_inductor_pattern.m_Start + pt;
|
|
||||||
poly[1] = s_inductor_pattern.m_End + pt;
|
|
||||||
pt.x = 0; pt.y = -len / 4;
|
|
||||||
RotatePoint( &pt, angle );
|
|
||||||
poly[2] = s_inductor_pattern.m_End + pt;
|
|
||||||
poly[3] = s_inductor_pattern.m_Start + pt;
|
|
||||||
poly[4] = poly[0];
|
|
||||||
|
|
||||||
GRPoly( aPanel->GetClipBox(), aDC, 5, poly, false, 0, YELLOW, YELLOW );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Exit_Self( EDA_DRAW_PANEL* aPanel, wxDC* aDC )
|
|
||||||
{
|
|
||||||
if( aPanel->IsMouseCaptured() )
|
|
||||||
aPanel->CallMouseCapture( aDC, wxDefaultPosition, false );
|
|
||||||
|
|
||||||
s_inductorInProgress = false;
|
|
||||||
aPanel->SetMouseCapture( NULL, NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Begin_Self( wxDC* DC )
|
|
||||||
{
|
|
||||||
if( s_inductorInProgress )
|
|
||||||
{
|
|
||||||
m_canvas->CallMouseCapture( DC, wxDefaultPosition, false );
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
|
|
||||||
wxString errorMessage;
|
|
||||||
|
|
||||||
// Prepare parameters for inductor
|
|
||||||
// s_inductor_pattern.m_Start is already initialized,
|
|
||||||
// when s_inductor_pattern.m_Flag == false
|
|
||||||
s_inductor_pattern.m_Width = GetDesignSettings().GetCurrentTrackWidth();
|
|
||||||
s_inductor_pattern.m_End = GetCrossHairPosition();
|
|
||||||
|
|
||||||
wxASSERT( s_inductorInProgress );
|
|
||||||
s_inductorInProgress = false;
|
|
||||||
|
|
||||||
MODULE* footprint = MWAVE::CreateMicrowaveInductor( s_inductor_pattern, this, errorMessage );
|
|
||||||
|
|
||||||
if( footprint )
|
|
||||||
{
|
|
||||||
SetMsgPanel( footprint );
|
|
||||||
footprint->Draw( m_canvas, DC, GR_OR );
|
|
||||||
}
|
|
||||||
|
|
||||||
else if( !errorMessage.IsEmpty() )
|
|
||||||
DisplayError( this, errorMessage );
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
s_inductor_pattern.m_Start = GetCrossHairPosition();
|
|
||||||
s_inductor_pattern.m_End = s_inductor_pattern.m_Start;
|
|
||||||
|
|
||||||
s_inductorInProgress = true;
|
|
||||||
|
|
||||||
// Update the initial coordinates.
|
|
||||||
GetScreen()->m_O_Curseur = GetCrossHairPosition();
|
|
||||||
UpdateStatusBar();
|
|
||||||
|
|
||||||
m_canvas->SetMouseCapture( ShowBoundingBoxMicroWaveInductor, Exit_Self );
|
|
||||||
m_canvas->CallMouseCapture( DC, wxDefaultPosition, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MODULE* PCB_EDIT_FRAME::CreateMuWaveBaseFootprint( const wxString& aValue,
|
MODULE* PCB_EDIT_FRAME::CreateMuWaveBaseFootprint( const wxString& aValue,
|
||||||
int aTextSize, int aPadCount )
|
int aTextSize, int aPadCount )
|
||||||
{
|
{
|
||||||
|
@ -683,81 +562,3 @@ MODULE* PCB_EDIT_FRAME::Create_MuWavePolygonShape()
|
||||||
OnModify();
|
OnModify();
|
||||||
return module;
|
return module;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Edit_Gap( wxDC* DC, MODULE* aModule )
|
|
||||||
{
|
|
||||||
int gap_size, oX;
|
|
||||||
D_PAD* pad, * next_pad;
|
|
||||||
wxString msg;
|
|
||||||
|
|
||||||
if( aModule == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Test if module is a gap type (name begins with GAP, and has 2 pads).
|
|
||||||
msg = aModule->GetReference().Left( 3 );
|
|
||||||
|
|
||||||
if( msg != wxT( "GAP" ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
pad = aModule->PadsList();
|
|
||||||
|
|
||||||
if( pad == NULL )
|
|
||||||
{
|
|
||||||
DisplayError( this, _( "No pad for this footprint." ) );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
next_pad = pad->Next();
|
|
||||||
|
|
||||||
if( next_pad == NULL )
|
|
||||||
{
|
|
||||||
DisplayError( this, _( "Only one pad for this footprint." ) );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
aModule->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
|
|
||||||
// Calculate the current dimension.
|
|
||||||
gap_size = next_pad->GetPos0().x - pad->GetPos0().x - pad->GetSize().x;
|
|
||||||
|
|
||||||
// Entrer the desired length of the gap.
|
|
||||||
msg = StringFromValue( GetUserUnits(), gap_size );
|
|
||||||
WX_TEXT_ENTRY_DIALOG dlg( this, _( "Gap:" ), _( "Create Microwave Gap" ), msg );
|
|
||||||
|
|
||||||
if( dlg.ShowModal() != wxID_OK )
|
|
||||||
return; // cancelled by user
|
|
||||||
|
|
||||||
msg = dlg.GetValue();
|
|
||||||
gap_size = ValueFromString( GetUserUnits(), msg );
|
|
||||||
|
|
||||||
// Updating sizes of pads forming the gap.
|
|
||||||
int tw = GetDesignSettings().GetCurrentTrackWidth();
|
|
||||||
pad->SetSize( wxSize( tw, tw ) );
|
|
||||||
|
|
||||||
pad->SetY0( 0 );
|
|
||||||
oX = -( gap_size + pad->GetSize().x ) / 2;
|
|
||||||
pad->SetX0( oX );
|
|
||||||
|
|
||||||
wxPoint padpos = pad->GetPos0() + aModule->GetPosition();
|
|
||||||
|
|
||||||
RotatePoint( &padpos.x, &padpos.y,
|
|
||||||
aModule->GetPosition().x, aModule->GetPosition().y, aModule->GetOrientation() );
|
|
||||||
|
|
||||||
pad->SetPosition( padpos );
|
|
||||||
|
|
||||||
tw = GetDesignSettings().GetCurrentTrackWidth();
|
|
||||||
next_pad->SetSize( wxSize( tw, tw ) );
|
|
||||||
|
|
||||||
next_pad->SetY0( 0 );
|
|
||||||
next_pad->SetX0( oX + gap_size + next_pad->GetSize().x );
|
|
||||||
|
|
||||||
padpos = next_pad->GetPos0() + aModule->GetPosition();
|
|
||||||
|
|
||||||
RotatePoint( &padpos.x, &padpos.y,
|
|
||||||
aModule->GetPosition().x, aModule->GetPosition().y, aModule->GetOrientation() );
|
|
||||||
|
|
||||||
next_pad->SetPosition( padpos );
|
|
||||||
|
|
||||||
aModule->Draw( m_canvas, DC, GR_OR );
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,114 +0,0 @@
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file move-drag_pads.cpp
|
|
||||||
* @brief Edit footprint pads.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <gr_basic.h>
|
|
||||||
#include <common.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <trigo.h>
|
|
||||||
#include <pcb_base_frame.h>
|
|
||||||
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_module.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <drag.h>
|
|
||||||
|
|
||||||
|
|
||||||
static wxPoint Pad_OldPos;
|
|
||||||
|
|
||||||
|
|
||||||
// Routine to place a moved pad.
|
|
||||||
void PCB_BASE_FRAME::PlacePad( D_PAD* aPad, wxDC* DC )
|
|
||||||
{
|
|
||||||
int dX, dY;
|
|
||||||
TRACK* track;
|
|
||||||
|
|
||||||
if( aPad == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
MODULE* module = aPad->GetParent();
|
|
||||||
|
|
||||||
ITEM_PICKER picker( NULL, UR_CHANGED );
|
|
||||||
PICKED_ITEMS_LIST pickList;
|
|
||||||
|
|
||||||
// Save dragged track segments in undo list
|
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
|
||||||
{
|
|
||||||
track = g_DragSegmentList[ii].m_Track;
|
|
||||||
|
|
||||||
// Set the old state
|
|
||||||
if( g_DragSegmentList[ii].m_Pad_Start )
|
|
||||||
track->SetStart( Pad_OldPos );
|
|
||||||
|
|
||||||
if( g_DragSegmentList[ii].m_Pad_End )
|
|
||||||
track->SetEnd( Pad_OldPos );
|
|
||||||
|
|
||||||
picker.SetItem( track );
|
|
||||||
pickList.PushItem( picker );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save old module and old items values
|
|
||||||
aPad->ClearFlags();
|
|
||||||
wxPoint pad_curr_position = aPad->GetPosition();
|
|
||||||
|
|
||||||
aPad->SetPosition( Pad_OldPos );
|
|
||||||
|
|
||||||
if( g_DragSegmentList.size() == 0 )
|
|
||||||
SaveCopyInUndoList( module, UR_CHANGED );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
picker.SetItem( module );
|
|
||||||
pickList.PushItem( picker );
|
|
||||||
SaveCopyInUndoList( pickList, UR_CHANGED );
|
|
||||||
}
|
|
||||||
|
|
||||||
aPad->SetPosition( pad_curr_position );
|
|
||||||
aPad->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
|
|
||||||
// Redraw dragged track segments
|
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
|
||||||
{
|
|
||||||
track = g_DragSegmentList[ii].m_Track;
|
|
||||||
|
|
||||||
// Set the new state
|
|
||||||
if( g_DragSegmentList[ii].m_Pad_Start )
|
|
||||||
track->SetStart( aPad->GetPosition() );
|
|
||||||
|
|
||||||
if( g_DragSegmentList[ii].m_Pad_End )
|
|
||||||
track->SetEnd( aPad->GetPosition() );
|
|
||||||
|
|
||||||
if( DC )
|
|
||||||
track->Draw( m_canvas, DC, GR_XOR );
|
|
||||||
|
|
||||||
track->SetState( IN_EDIT, false );
|
|
||||||
track->ClearFlags();
|
|
||||||
|
|
||||||
if( DC )
|
|
||||||
track->Draw( m_canvas, DC, GR_OR );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute local coordinates (i.e refer to module position and for module orient = 0)
|
|
||||||
dX = aPad->GetPosition().x - Pad_OldPos.x;
|
|
||||||
dY = aPad->GetPosition().y - Pad_OldPos.y;
|
|
||||||
|
|
||||||
RotatePoint( &dX, &dY, -module->GetOrientation() );
|
|
||||||
|
|
||||||
aPad->SetX0( dX + aPad->GetPos0().x );
|
|
||||||
aPad->SetY0( dY + aPad->GetPos0().y );
|
|
||||||
|
|
||||||
if( DC )
|
|
||||||
aPad->Draw( m_canvas, DC, GR_OR );
|
|
||||||
|
|
||||||
module->CalculateBoundingBox();
|
|
||||||
module->SetLastEditTime();
|
|
||||||
|
|
||||||
EraseDragList();
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
}
|
|
|
@ -1,126 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
|
|
||||||
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
|
||||||
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@verizon.net>
|
|
||||||
* Copyright (C) 1992-2012 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file move_or_drag_track.cpp
|
|
||||||
* @brief Track editing routines to move and drag track segments or node.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <confirm.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <trigo.h>
|
|
||||||
#include <macros.h>
|
|
||||||
#include <gr_basic.h>
|
|
||||||
|
|
||||||
#include <class_board.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <drc.h>
|
|
||||||
#include <drag.h>
|
|
||||||
#include <pcbnew_id.h>
|
|
||||||
|
|
||||||
|
|
||||||
static PICKED_ITEMS_LIST s_ItemsListPicker;
|
|
||||||
|
|
||||||
|
|
||||||
// Place a dragged (or moved) track segment or via
|
|
||||||
bool PCB_EDIT_FRAME::PlaceDraggedOrMovedTrackSegment( TRACK* Track, wxDC* DC )
|
|
||||||
{
|
|
||||||
int errdrc;
|
|
||||||
|
|
||||||
if( Track == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
int current_net_code = Track->GetNetCode();
|
|
||||||
|
|
||||||
// DRC control:
|
|
||||||
if( Settings().m_legacyDrcOn )
|
|
||||||
{
|
|
||||||
errdrc = m_drc->DrcOnCreatingTrack( Track, GetBoard()->m_Track );
|
|
||||||
|
|
||||||
if( errdrc == BAD_DRC )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Test the dragged segments
|
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
|
||||||
{
|
|
||||||
errdrc = m_drc->DrcOnCreatingTrack( g_DragSegmentList[ii].m_Track, GetBoard()->m_Track );
|
|
||||||
|
|
||||||
if( errdrc == BAD_DRC )
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DRC Ok: place track segments
|
|
||||||
Track->ClearFlags();
|
|
||||||
Track->SetState( IN_EDIT, false );
|
|
||||||
|
|
||||||
// Draw dragged tracks
|
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
|
||||||
{
|
|
||||||
Track = g_DragSegmentList[ii].m_Track;
|
|
||||||
Track->SetState( IN_EDIT, false );
|
|
||||||
Track->ClearFlags();
|
|
||||||
|
|
||||||
/* Test the connections modified by the move
|
|
||||||
* (only pad connection must be tested, track connection will be
|
|
||||||
* tested by TestNetConnection() ) */
|
|
||||||
LSET layerMask( Track->GetLayer() );
|
|
||||||
|
|
||||||
Track->start = GetBoard()->GetPadFast( Track->GetStart(), layerMask );
|
|
||||||
|
|
||||||
if( Track->start )
|
|
||||||
Track->SetState( BEGIN_ONPAD, true );
|
|
||||||
else
|
|
||||||
Track->SetState( BEGIN_ONPAD, false );
|
|
||||||
|
|
||||||
Track->end = GetBoard()->GetPadFast( Track->GetEnd(), layerMask );
|
|
||||||
|
|
||||||
if( Track->end )
|
|
||||||
Track->SetState( END_ONPAD, true );
|
|
||||||
else
|
|
||||||
Track->SetState( END_ONPAD, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
EraseDragList();
|
|
||||||
|
|
||||||
SaveCopyInUndoList( s_ItemsListPicker, UR_UNSPECIFIED );
|
|
||||||
s_ItemsListPicker.ClearItemsList(); // s_ItemsListPicker is no more owner of picked items
|
|
||||||
|
|
||||||
GetBoard()->PopHighLight();
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
|
|
||||||
if( current_net_code > 0 )
|
|
||||||
TestNetConnection( DC, current_net_code );
|
|
||||||
|
|
||||||
m_canvas->Refresh();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
|
@ -1,578 +0,0 @@
|
||||||
/*
|
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2007 Jean-Pierre Charras, jean-pierre.charras@gipsa-lab.inpg.fr
|
|
||||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
|
|
||||||
* Copyright (C) 1992-2017 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file pcbnew/onleftclick.cpp
|
|
||||||
* @brief Functions called when the left button is clicked or double clicked.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
|
||||||
#include <class_drawpanel.h>
|
|
||||||
#include <confirm.h>
|
|
||||||
#include <pcb_edit_frame.h>
|
|
||||||
#include <msgpanel.h>
|
|
||||||
|
|
||||||
#include <class_board.h>
|
|
||||||
#include <class_drawsegment.h>
|
|
||||||
#include <class_dimension.h>
|
|
||||||
#include <class_zone.h>
|
|
||||||
#include <class_pcb_text.h>
|
|
||||||
#include <class_text_mod.h>
|
|
||||||
#include <class_module.h>
|
|
||||||
#include <class_pcb_target.h>
|
|
||||||
#include <origin_viewitem.h>
|
|
||||||
#include <project.h>
|
|
||||||
|
|
||||||
#include <pcbnew.h>
|
|
||||||
#include <pcbnew_id.h>
|
|
||||||
#include <menus_helpers.h>
|
|
||||||
#include <tools/pcb_editor_control.h>
|
|
||||||
#include <tools/pcbnew_control.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* Handle the left button mouse click, when a tool is active
|
|
||||||
*/
|
|
||||||
void PCB_EDIT_FRAME::OnLeftClick( wxDC* aDC, const wxPoint& aPosition )
|
|
||||||
{
|
|
||||||
BOARD_ITEM* curr_item = GetCurItem();
|
|
||||||
bool exit = false;
|
|
||||||
bool no_tool = GetToolId() == ID_NO_TOOL_SELECTED;
|
|
||||||
|
|
||||||
if( no_tool || ( curr_item && curr_item->GetEditFlags() ) )
|
|
||||||
{
|
|
||||||
m_canvas->SetAutoPanRequest( false );
|
|
||||||
|
|
||||||
if( curr_item && curr_item->GetEditFlags() ) // Command in progress
|
|
||||||
{
|
|
||||||
m_canvas->SetIgnoreMouseEvents( true );
|
|
||||||
m_canvas->CrossHairOff( aDC );
|
|
||||||
|
|
||||||
switch( curr_item->Type() )
|
|
||||||
{
|
|
||||||
case PCB_ZONE_AREA_T:
|
|
||||||
if( curr_item->IsNew() )
|
|
||||||
{
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
Begin_Zone( aDC );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
End_Move_Zone_Corner_Or_Outlines( aDC, static_cast<ZONE_CONTAINER*>( curr_item ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
exit = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TRACE_T:
|
|
||||||
case PCB_VIA_T:
|
|
||||||
if( curr_item->IsDragging() )
|
|
||||||
{
|
|
||||||
PlaceDraggedOrMovedTrackSegment( static_cast<TRACK*>( curr_item ), aDC );
|
|
||||||
exit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TEXT_T:
|
|
||||||
Place_Texte_Pcb( static_cast<TEXTE_PCB*>( curr_item ), aDC );
|
|
||||||
exit = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MODULE_TEXT_T:
|
|
||||||
PlaceTexteModule( static_cast<TEXTE_MODULE*>( curr_item ), aDC );
|
|
||||||
exit = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_PAD_T:
|
|
||||||
PlacePad( static_cast<D_PAD*>( curr_item ), aDC );
|
|
||||||
exit = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MODULE_T:
|
|
||||||
PlaceModule( static_cast<MODULE*>( curr_item ), aDC );
|
|
||||||
exit = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TARGET_T:
|
|
||||||
PlaceTarget( static_cast<PCB_TARGET*>( curr_item ), aDC );
|
|
||||||
exit = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_LINE_T:
|
|
||||||
if( no_tool ) // when no tools: existing item moving.
|
|
||||||
{
|
|
||||||
Place_DrawItem( static_cast<DRAWSEGMENT*>( curr_item ), aDC );
|
|
||||||
exit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_DIMENSION_T:
|
|
||||||
if( ! curr_item->IsNew() )
|
|
||||||
{ // We are moving the text of an existing dimension. Place it
|
|
||||||
PlaceDimensionText( static_cast<DIMENSION*>( curr_item ), aDC );
|
|
||||||
exit = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MARKER_T: // MARKER_PCB, a marker used to show something
|
|
||||||
curr_item->ClearFlags(); // Not reason to have flags set
|
|
||||||
exit = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DisplayError( this,
|
|
||||||
wxString::Format(
|
|
||||||
"PCB_EDIT_FRAME::OnLeftClick() err: curr_item type %d m_Flags != 0 (%X)",
|
|
||||||
curr_item->Type(), curr_item->GetEditFlags() ) );
|
|
||||||
exit = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->SetIgnoreMouseEvents( false );
|
|
||||||
m_canvas->CrossHairOn( aDC );
|
|
||||||
|
|
||||||
if( exit )
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if( !wxGetKeyState( WXK_SHIFT ) && !wxGetKeyState( WXK_ALT )
|
|
||||||
&& !wxGetKeyState( WXK_CONTROL ) )
|
|
||||||
{
|
|
||||||
curr_item = PcbGeneralLocateAndDisplay();
|
|
||||||
|
|
||||||
if( curr_item )
|
|
||||||
SendMessageToEESCHEMA( curr_item );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( curr_item ) // display netclass info for zones, tracks and pads
|
|
||||||
{
|
|
||||||
switch( curr_item->Type() )
|
|
||||||
{
|
|
||||||
case PCB_ZONE_AREA_T:
|
|
||||||
case PCB_TRACE_T:
|
|
||||||
case PCB_VIA_T:
|
|
||||||
case PCB_PAD_T:
|
|
||||||
SetCurrentNetClass(
|
|
||||||
((BOARD_CONNECTED_ITEM*)curr_item)->GetNetClassName() );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch( GetToolId() )
|
|
||||||
{
|
|
||||||
case ID_MAIN_MENUBAR:
|
|
||||||
case ID_NO_TOOL_SELECTED:
|
|
||||||
case ID_ZOOM_SELECTION:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_HIGHLIGHT_BUTT:
|
|
||||||
{
|
|
||||||
int netcode = SelectHighLight( aDC );
|
|
||||||
|
|
||||||
if( netcode < 0 )
|
|
||||||
SetMsgPanel( GetBoard() );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NETINFO_ITEM* net = GetBoard()->FindNet( netcode );
|
|
||||||
|
|
||||||
if( net )
|
|
||||||
{
|
|
||||||
MSG_PANEL_ITEMS items;
|
|
||||||
net->GetMsgPanelInfo( m_UserUnits, items );
|
|
||||||
SetMsgPanel( items );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_LOCAL_RATSNEST_BUTT:
|
|
||||||
curr_item = PcbGeneralLocateAndDisplay();
|
|
||||||
Show_1_Ratsnest( curr_item, aDC );
|
|
||||||
|
|
||||||
if( curr_item )
|
|
||||||
SendMessageToEESCHEMA( curr_item );
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_TARGET_BUTT:
|
|
||||||
if( curr_item == NULL || curr_item->GetEditFlags() == 0 )
|
|
||||||
{
|
|
||||||
SetCurItem( (BOARD_ITEM*) CreateTarget( aDC ) );
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
}
|
|
||||||
else if( curr_item->Type() == PCB_TARGET_T )
|
|
||||||
{
|
|
||||||
PlaceTarget( (PCB_TARGET*) curr_item, aDC );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxLogDebug( wxT( "OnLeftClick err: not a PCB_TARGET_T" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_CIRCLE_BUTT:
|
|
||||||
case ID_PCB_ARC_BUTT:
|
|
||||||
case ID_PCB_ADD_LINE_BUTT:
|
|
||||||
{
|
|
||||||
STROKE_T shape = S_SEGMENT;
|
|
||||||
|
|
||||||
if( GetToolId() == ID_PCB_CIRCLE_BUTT )
|
|
||||||
shape = S_CIRCLE;
|
|
||||||
|
|
||||||
if( GetToolId() == ID_PCB_ARC_BUTT )
|
|
||||||
shape = S_ARC;
|
|
||||||
|
|
||||||
if( curr_item == NULL || curr_item->GetEditFlags() == 0 )
|
|
||||||
{
|
|
||||||
curr_item = (BOARD_ITEM*) Begin_DrawSegment( NULL, shape, aDC );
|
|
||||||
SetCurItem( curr_item );
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
}
|
|
||||||
else if( curr_item
|
|
||||||
&& (curr_item->Type() == PCB_LINE_T)
|
|
||||||
&& curr_item->IsNew() )
|
|
||||||
{
|
|
||||||
curr_item = (BOARD_ITEM*) Begin_DrawSegment( (DRAWSEGMENT*) curr_item, shape, aDC );
|
|
||||||
SetCurItem( curr_item );
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_TRACK_BUTT:
|
|
||||||
if( !IsCopperLayer( GetActiveLayer() ) )
|
|
||||||
{
|
|
||||||
DisplayError( this, _( "Tracks on Copper layers only" ) );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( curr_item == NULL || curr_item->GetEditFlags() == 0 )
|
|
||||||
{
|
|
||||||
curr_item = (BOARD_ITEM*) Begin_Route( NULL, aDC );
|
|
||||||
SetCurItem( curr_item );
|
|
||||||
|
|
||||||
if( curr_item )
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
}
|
|
||||||
else if( curr_item && curr_item->IsNew() )
|
|
||||||
{
|
|
||||||
TRACK* track = Begin_Route( (TRACK*) curr_item, aDC );
|
|
||||||
|
|
||||||
// SetCurItem() must not write to the msg panel
|
|
||||||
// because a track info is displayed while moving the mouse cursor
|
|
||||||
if( track ) // A new segment was created
|
|
||||||
SetCurItem( curr_item = (BOARD_ITEM*) track, false );
|
|
||||||
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_ZONES_BUTT:
|
|
||||||
case ID_PCB_KEEPOUT_BUTT:
|
|
||||||
/* ZONE or KEEPOUT Tool is selected. Determine action for a left click:
|
|
||||||
* this can be start a new zone or select and move an existing zone outline corner
|
|
||||||
* if found near the mouse cursor
|
|
||||||
*/
|
|
||||||
if( curr_item == NULL || curr_item->GetEditFlags() == 0 )
|
|
||||||
{
|
|
||||||
if( Begin_Zone( aDC ) )
|
|
||||||
{
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
curr_item = GetBoard()->m_CurrentZoneContour;
|
|
||||||
GetScreen()->SetCurItem( curr_item );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( curr_item && (curr_item->Type() == PCB_ZONE_AREA_T) && curr_item->IsNew() )
|
|
||||||
{ // Add a new corner to the current outline being created:
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
Begin_Zone( aDC );
|
|
||||||
curr_item = GetBoard()->m_CurrentZoneContour;
|
|
||||||
GetScreen()->SetCurItem( curr_item );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxLogDebug( wxT( "PCB_EDIT_FRAME::OnLeftClick() zone internal error" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_ADD_TEXT_BUTT:
|
|
||||||
if( Edge_Cuts == GetActiveLayer() )
|
|
||||||
{
|
|
||||||
DisplayError( this,
|
|
||||||
_( "Texts not allowed on Edge Cut layer" ) );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( curr_item == NULL || curr_item->GetEditFlags() == 0 )
|
|
||||||
{
|
|
||||||
SetCurItem( CreateTextePcb( aDC ) );
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
}
|
|
||||||
else if( curr_item->Type() == PCB_TEXT_T )
|
|
||||||
{
|
|
||||||
Place_Texte_Pcb( (TEXTE_PCB*) curr_item, aDC );
|
|
||||||
m_canvas->SetAutoPanRequest( false );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxLogDebug( wxT( "OnLeftClick err: not a PCB_TEXT_T" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_DIMENSION_BUTT:
|
|
||||||
if( IsCopperLayer( GetActiveLayer() ) || GetActiveLayer() == Edge_Cuts )
|
|
||||||
{
|
|
||||||
DisplayError( this, _( "Dimension not allowed on Copper or Edge Cut layers" ) );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !curr_item || !curr_item->GetEditFlags() )
|
|
||||||
{
|
|
||||||
curr_item = (BOARD_ITEM*) EditDimension( NULL, aDC );
|
|
||||||
SetCurItem( curr_item );
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
}
|
|
||||||
else if( curr_item && (curr_item->Type() == PCB_DIMENSION_T) && curr_item->IsNew() )
|
|
||||||
{
|
|
||||||
curr_item = (BOARD_ITEM*) EditDimension( (DIMENSION*) curr_item, aDC );
|
|
||||||
SetCurItem( curr_item );
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxLogDebug( wxT( "PCB_EDIT_FRAME::OnLeftClick() error item is not a DIMENSION" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_DELETE_ITEM_BUTT:
|
|
||||||
if( !curr_item || !curr_item->GetEditFlags() )
|
|
||||||
{
|
|
||||||
curr_item = PcbGeneralLocateAndDisplay();
|
|
||||||
|
|
||||||
if( curr_item && curr_item->GetEditFlags() == 0 )
|
|
||||||
{
|
|
||||||
RemoveStruct( curr_item, aDC );
|
|
||||||
SetCurItem( curr_item = NULL );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_PLACE_OFFSET_COORD_BUTT:
|
|
||||||
PCB_EDITOR_CONTROL::SetDrillOrigin( GetGalCanvas()->GetView(), this,
|
|
||||||
new KIGFX::ORIGIN_VIEWITEM( GetAuxOrigin(), UR_TRANSIENT ),
|
|
||||||
GetCrossHairPosition() );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_PLACE_GRID_COORD_BUTT:
|
|
||||||
PCBNEW_CONTROL::SetGridOrigin( GetGalCanvas()->GetView(), this,
|
|
||||||
new KIGFX::ORIGIN_VIEWITEM( GetBoard()->GetGridOrigin(), UR_TRANSIENT ),
|
|
||||||
GetCrossHairPosition() );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_DRAW_VIA_BUTT:
|
|
||||||
DisplayError( this, _( "Via Tool not available in Legacy Toolset" ) );
|
|
||||||
SetNoToolSelected();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_MEASUREMENT_TOOL:
|
|
||||||
DisplayError( this, _( "Measurement Tool not available in Legacy Toolset" ) );
|
|
||||||
SetNoToolSelected();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
wxLogDebug( wxT( "PCB_EDIT_FRAME::OnLeftClick() id error" ) );
|
|
||||||
SetNoToolSelected();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* handle the double click on the mouse left button
|
|
||||||
*/
|
|
||||||
void PCB_EDIT_FRAME::OnLeftDClick( wxDC* aDC, const wxPoint& aPosition )
|
|
||||||
{
|
|
||||||
BOARD_ITEM* curr_item = GetCurItem();
|
|
||||||
|
|
||||||
switch( GetToolId() )
|
|
||||||
{
|
|
||||||
case ID_NO_TOOL_SELECTED:
|
|
||||||
if( curr_item == NULL || curr_item->GetEditFlags() == 0 )
|
|
||||||
curr_item = PcbGeneralLocateAndDisplay();
|
|
||||||
|
|
||||||
if( curr_item == NULL || curr_item->GetEditFlags() != 0 )
|
|
||||||
break;
|
|
||||||
|
|
||||||
SendMessageToEESCHEMA( curr_item );
|
|
||||||
|
|
||||||
// An item is found
|
|
||||||
SetCurItem( curr_item );
|
|
||||||
|
|
||||||
switch( curr_item->Type() )
|
|
||||||
{
|
|
||||||
case PCB_TRACE_T:
|
|
||||||
case PCB_VIA_T:
|
|
||||||
if( curr_item->IsNew() )
|
|
||||||
{
|
|
||||||
if( End_Route( (TRACK*) curr_item, aDC ) )
|
|
||||||
m_canvas->SetAutoPanRequest( false );
|
|
||||||
}
|
|
||||||
else if( curr_item->GetEditFlags() == 0 )
|
|
||||||
{
|
|
||||||
Edit_TrackSegm_Width( aDC, (TRACK*) curr_item );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TEXT_T:
|
|
||||||
case PCB_PAD_T:
|
|
||||||
case PCB_MODULE_T:
|
|
||||||
case PCB_TARGET_T:
|
|
||||||
case PCB_DIMENSION_T:
|
|
||||||
case PCB_MODULE_TEXT_T:
|
|
||||||
OnEditItemRequest( aDC, curr_item );
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_LINE_T:
|
|
||||||
OnEditItemRequest( aDC, curr_item );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_ZONE_AREA_T:
|
|
||||||
if( curr_item->GetEditFlags() )
|
|
||||||
break;
|
|
||||||
|
|
||||||
OnEditItemRequest( aDC, curr_item );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break; // end case 0
|
|
||||||
|
|
||||||
case ID_TRACK_BUTT:
|
|
||||||
if( curr_item && curr_item->IsNew() )
|
|
||||||
{
|
|
||||||
if( End_Route( (TRACK*) curr_item, aDC ) )
|
|
||||||
m_canvas->SetAutoPanRequest( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_ZONES_BUTT:
|
|
||||||
case ID_PCB_KEEPOUT_BUTT:
|
|
||||||
if( End_Zone( aDC ) )
|
|
||||||
{
|
|
||||||
m_canvas->SetAutoPanRequest( false );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ID_PCB_ADD_LINE_BUTT:
|
|
||||||
case ID_PCB_ARC_BUTT:
|
|
||||||
case ID_PCB_CIRCLE_BUTT:
|
|
||||||
if( curr_item == NULL )
|
|
||||||
break;
|
|
||||||
|
|
||||||
if( curr_item->Type() != PCB_LINE_T )
|
|
||||||
{
|
|
||||||
DisplayErrorMessage( this, "Item type is incorrect",
|
|
||||||
wxString::Format( "Selected item type is %d\n"
|
|
||||||
"Expected: %d", curr_item->Type(), PCB_LINE_T ) );
|
|
||||||
m_canvas->SetAutoPanRequest( false );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( curr_item->IsNew() )
|
|
||||||
{
|
|
||||||
End_Edge( (DRAWSEGMENT*) curr_item, aDC );
|
|
||||||
m_canvas->SetAutoPanRequest( false );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::OnEditItemRequest( wxDC* aDC, BOARD_ITEM* aItem )
|
|
||||||
{
|
|
||||||
switch( aItem->Type() )
|
|
||||||
{
|
|
||||||
case PCB_TRACE_T:
|
|
||||||
case PCB_VIA_T:
|
|
||||||
Edit_TrackSegm_Width( aDC, static_cast<TRACK*>( aItem ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TEXT_T:
|
|
||||||
InstallTextOptionsFrame( aItem, aDC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_PAD_T:
|
|
||||||
InstallPadOptionsFrame( static_cast<D_PAD*>( aItem ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MODULE_T:
|
|
||||||
InstallFootprintPropertiesDialog( static_cast<MODULE*>( aItem ), aDC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_TARGET_T:
|
|
||||||
ShowTargetOptionsDialog( static_cast<PCB_TARGET*>( aItem ), aDC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_DIMENSION_T:
|
|
||||||
ShowDimensionPropertyDialog( static_cast<DIMENSION*>( aItem ), aDC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_MODULE_TEXT_T:
|
|
||||||
InstallTextOptionsFrame( aItem, aDC );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_LINE_T:
|
|
||||||
InstallGraphicItemPropertiesDialog( aItem );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PCB_ZONE_AREA_T:
|
|
||||||
Edit_Zone_Params( aDC, static_cast<ZONE_CONTAINER*>( aItem ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -217,14 +217,6 @@ protected:
|
||||||
*/
|
*/
|
||||||
virtual bool isAutoSaveRequired() const override;
|
virtual bool isAutoSaveRequired() const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Function duplicateZone
|
|
||||||
* duplicates the given zone.
|
|
||||||
* @param aDC is the current Device Context.
|
|
||||||
* @param aZone is the zone to duplicate
|
|
||||||
*/
|
|
||||||
void duplicateZone( wxDC* aDC, ZONE_CONTAINER* aZone );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function moveExact
|
* Function moveExact
|
||||||
* Move the selected item exactly
|
* Move the selected item exactly
|
||||||
|
@ -469,38 +461,6 @@ public:
|
||||||
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
///> @copydoc EDA_DRAW_FRAME::GetHotKeyDescription()
|
||||||
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
EDA_HOTKEY* GetHotKeyDescription( int aCommand ) const override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Function OnHotKey.
|
|
||||||
* ** Commands are case insensitive **
|
|
||||||
* Some commands are relatives to the item under the mouse cursor
|
|
||||||
* @param aDC = current device context
|
|
||||||
* @param aHotkeyCode = hotkey code (ascii or wxWidget code for special keys)
|
|
||||||
* @param aPosition The cursor position in logical (drawing) units.
|
|
||||||
* @param aItem = NULL or pointer on a EDA_ITEM under the mouse cursor
|
|
||||||
*/
|
|
||||||
bool OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosition, EDA_ITEM* aItem = NULL ) override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function OnHotkeyDuplicateOrArrayItem
|
|
||||||
* Duplicate an item (optionally incrementing if necessary and possible)
|
|
||||||
* or invoke array dialog and create an array
|
|
||||||
* @param aIdCommand = the hotkey command id
|
|
||||||
* @return true if item duplicated or arrayed
|
|
||||||
*/
|
|
||||||
bool OnHotkeyDuplicateOrArrayItem( int aIdCommand );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function OnHotkeyBeginRoute
|
|
||||||
* If the current active layer is a copper layer,
|
|
||||||
* and if no item currently edited, start a new track segmenton
|
|
||||||
* the current copper layer.
|
|
||||||
* If a new track is in progress, terminate the current segment and
|
|
||||||
* start a new one.
|
|
||||||
* @param aDC = current device context
|
|
||||||
* @return a reference to the track if a track is created, or NULL
|
|
||||||
*/
|
|
||||||
TRACK * OnHotkeyBeginRoute( wxDC* aDC );
|
|
||||||
|
|
||||||
void OnCloseWindow( wxCloseEvent& Event ) override;
|
void OnCloseWindow( wxCloseEvent& Event ) override;
|
||||||
void Process_Special_Functions( wxCommandEvent& event );
|
void Process_Special_Functions( wxCommandEvent& event );
|
||||||
void Tracks_and_Vias_Size_Event( wxCommandEvent& event );
|
void Tracks_and_Vias_Size_Event( wxCommandEvent& event );
|
||||||
|
@ -615,8 +575,6 @@ public:
|
||||||
///> @copydoc EDA_DRAW_FRAME::UseGalCanvas()
|
///> @copydoc EDA_DRAW_FRAME::UseGalCanvas()
|
||||||
void UseGalCanvas( bool aEnable ) override;
|
void UseGalCanvas( bool aEnable ) override;
|
||||||
|
|
||||||
bool GeneralControl( wxDC* aDC, const wxPoint& aPosition, EDA_KEY aHotKey = 0 ) override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function ShowBoardSetupDialog
|
* Function ShowBoardSetupDialog
|
||||||
*/
|
*/
|
||||||
|
@ -628,10 +586,6 @@ public:
|
||||||
|
|
||||||
void PrepareLayerIndicator();
|
void PrepareLayerIndicator();
|
||||||
|
|
||||||
/* mouse functions events: */
|
|
||||||
void OnLeftClick( wxDC* DC, const wxPoint& MousePos ) override;
|
|
||||||
void OnLeftDClick( wxDC* DC, const wxPoint& MousePos ) override;
|
|
||||||
|
|
||||||
void OnSelectOptionToolbar( wxCommandEvent& event );
|
void OnSelectOptionToolbar( wxCommandEvent& event );
|
||||||
void OnFlipPcbView( wxCommandEvent& event );
|
void OnFlipPcbView( wxCommandEvent& event );
|
||||||
void ToolOnRightClick( wxCommandEvent& event ) override;
|
void ToolOnRightClick( wxCommandEvent& event ) override;
|
||||||
|
@ -952,51 +906,12 @@ public:
|
||||||
|
|
||||||
void Swap_Layers( wxCommandEvent& event );
|
void Swap_Layers( wxCommandEvent& event );
|
||||||
|
|
||||||
// Handling texts on the board
|
|
||||||
void Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC );
|
|
||||||
void FlipTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC );
|
|
||||||
TEXTE_PCB* CreateTextePcb( wxDC* aDC, TEXTE_PCB* aText = NULL );
|
|
||||||
void Delete_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC );
|
|
||||||
void StartMoveTextePcb( TEXTE_PCB* aTextePcb, wxDC* aDC, bool aErase = true );
|
|
||||||
void Place_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC );
|
|
||||||
|
|
||||||
// Graphic Segments type DRAWSEGMENT
|
// Graphic Segments type DRAWSEGMENT
|
||||||
void Start_Move_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC );
|
void Start_Move_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC );
|
||||||
void Place_DrawItem( DRAWSEGMENT* drawitem, wxDC* DC );
|
|
||||||
|
|
||||||
// Footprint editing (see also PCB_BASE_FRAME)
|
// Footprint editing (see also PCB_BASE_FRAME)
|
||||||
void InstallFootprintPropertiesDialog( MODULE* Module, wxDC* DC );
|
void InstallFootprintPropertiesDialog( MODULE* Module, wxDC* DC );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function StartMoveModule
|
|
||||||
* Initialize a drag or move pad command
|
|
||||||
* @param aModule = the module to move or drag
|
|
||||||
* @param aDC = the current device context
|
|
||||||
* @param aDragConnectedTracks = true to drag connected tracks,
|
|
||||||
* false to just move the module
|
|
||||||
*/
|
|
||||||
void StartMoveModule( MODULE* aModule, wxDC* aDC, bool aDragConnectedTracks );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Delete Module
|
|
||||||
* Remove a footprint from m_Modules linked list and put it in undelete buffer
|
|
||||||
* The ratsnest and pad list are recalculated
|
|
||||||
* @param aModule = footprint to delete
|
|
||||||
* @param aDC = currentDevice Context. if NULL: do not redraw new ratsnest
|
|
||||||
*/
|
|
||||||
bool Delete_Module( MODULE* aModule, wxDC* aDC );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Change_Side_Module
|
|
||||||
* Flip a footprint (switch layer from component or component to copper)
|
|
||||||
* The mirroring is made from X axis
|
|
||||||
* if a footprint is not on copper or component layer it is not flipped
|
|
||||||
* (it could be on an adhesive layer, not supported at this time)
|
|
||||||
* @param Module the footprint to flip
|
|
||||||
* @param DC Current Device Context. if NULL, no redraw
|
|
||||||
*/
|
|
||||||
void Change_Side_Module( MODULE* Module, wxDC* DC );
|
|
||||||
|
|
||||||
int InstallExchangeModuleFrame( MODULE* aModule, bool updateMode, bool selectedMode );
|
int InstallExchangeModuleFrame( MODULE* aModule, bool updateMode, bool selectedMode );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1014,9 +929,6 @@ public:
|
||||||
|
|
||||||
// loading modules: see PCB_BASE_FRAME
|
// loading modules: see PCB_BASE_FRAME
|
||||||
|
|
||||||
// Board handling
|
|
||||||
void RemoveStruct( BOARD_ITEM* Item, wxDC* DC );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function OnEditItemRequest
|
* Function OnEditItemRequest
|
||||||
* Install the corresponding dialog editor for the given item
|
* Install the corresponding dialog editor for the given item
|
||||||
|
@ -1025,12 +937,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void OnEditItemRequest( wxDC* aDC, BOARD_ITEM* aItem ) override;
|
void OnEditItemRequest( wxDC* aDC, BOARD_ITEM* aItem ) override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Locate track or pad and highlight the corresponding net.
|
|
||||||
* @return The Netcode, or -1 if no net located.
|
|
||||||
*/
|
|
||||||
int SelectHighLight( wxDC* DC );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function HighLight.
|
* Function HighLight.
|
||||||
* highlights the net at the current cursor position.
|
* highlights the net at the current cursor position.
|
||||||
|
@ -1117,21 +1023,6 @@ public:
|
||||||
*/
|
*/
|
||||||
TRACK* Begin_Route( TRACK* aTrack, wxDC* aDC );
|
TRACK* Begin_Route( TRACK* aTrack, wxDC* aDC );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function End_Route
|
|
||||||
* Terminates a track currently being created
|
|
||||||
* @param aTrack = the current track segment in progress
|
|
||||||
* @param aDC = the current device context
|
|
||||||
* @return true if the track was created, false if not (due to a DRC error)
|
|
||||||
*/
|
|
||||||
bool End_Route( TRACK* aTrack, wxDC* aDC );
|
|
||||||
|
|
||||||
void Attribut_Segment( TRACK* track, wxDC* DC, bool Flag_On );
|
|
||||||
void Attribut_Track( TRACK* track, wxDC* DC, bool Flag_On );
|
|
||||||
void Attribut_net( wxDC* DC, int net_code, bool Flag_On );
|
|
||||||
|
|
||||||
bool PlaceDraggedOrMovedTrackSegment( TRACK* Track, wxDC* DC );
|
|
||||||
|
|
||||||
void SwitchLayer( wxDC* DC, PCB_LAYER_ID layer ) override;
|
void SwitchLayer( wxDC* DC, PCB_LAYER_ID layer ) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1185,34 +1076,6 @@ public:
|
||||||
|
|
||||||
// zone handling
|
// zone handling
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Delete_LastCreatedCorner
|
|
||||||
* Used only while creating a new zone outline
|
|
||||||
* Remove and delete the current outline segment in progress
|
|
||||||
* @return 0 if no corner in list, or corner number
|
|
||||||
*/
|
|
||||||
int Delete_LastCreatedCorner( wxDC* DC );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Begin_Zone
|
|
||||||
* either initializes the first segment of a new zone, or adds an
|
|
||||||
* intermediate segment.
|
|
||||||
* A new zone can be:
|
|
||||||
* created from scratch: the user will be prompted to define parameters (layer, clearence ...)
|
|
||||||
* created from a similar zone (s_CurrentZone is used): parameters are copied from
|
|
||||||
* s_CurrentZone
|
|
||||||
* created as a cutout (an hole) inside s_CurrentZone
|
|
||||||
*/
|
|
||||||
int Begin_Zone( wxDC* DC );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function End_Zone
|
|
||||||
* terminates (if no DRC error ) the zone edge creation process
|
|
||||||
* @param DC = current Device Context
|
|
||||||
* @return true if Ok, false if DRC error
|
|
||||||
*/
|
|
||||||
bool End_Zone( wxDC* DC );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function Fill_Zone
|
* Function Fill_Zone
|
||||||
* Calculate the zone filling for the outline zone_container
|
* Calculate the zone filling for the outline zone_container
|
||||||
|
@ -1236,63 +1099,12 @@ public:
|
||||||
void Check_All_Zones( wxWindow* aActiveWindow );
|
void Check_All_Zones( wxWindow* aActiveWindow );
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Add_Zone_Cutout
|
|
||||||
* Add a cutout zone to a given zone outline
|
|
||||||
* @param DC = current Device Context
|
|
||||||
* @param zone_container = parent zone outline
|
|
||||||
*/
|
|
||||||
void Add_Zone_Cutout( wxDC* DC, ZONE_CONTAINER* zone_container );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Add_Similar_Zone
|
|
||||||
* Add a zone to a given zone outline.
|
|
||||||
* if the zones are overlapping they will be merged
|
|
||||||
* @param DC = current Device Context
|
|
||||||
* @param zone_container = parent zone outline
|
|
||||||
*/
|
|
||||||
void Add_Similar_Zone( wxDC* DC, ZONE_CONTAINER* zone_container );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function Edit_Zone_Params
|
* Function Edit_Zone_Params
|
||||||
* Edit params (layer, clearance, ...) for a zone outline
|
* Edit params (layer, clearance, ...) for a zone outline
|
||||||
*/
|
*/
|
||||||
void Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* zone_container );
|
void Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* zone_container );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Start_Move_Zone_Corner
|
|
||||||
* Prepares a move corner in a zone outline,
|
|
||||||
* called from a move corner command (IsNewCorner = false),
|
|
||||||
* or a create new cornet command (IsNewCorner = true )
|
|
||||||
*/
|
|
||||||
void Start_Move_Zone_Corner( wxDC* DC,
|
|
||||||
ZONE_CONTAINER* zone_container,
|
|
||||||
int corner_id,
|
|
||||||
bool IsNewCorner );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Start_Move_Zone_Corner
|
|
||||||
* Prepares a drag edge in an existing zone outline,
|
|
||||||
*/
|
|
||||||
void Start_Move_Zone_Drag_Outline_Edge( wxDC* DC,
|
|
||||||
ZONE_CONTAINER* zone_container,
|
|
||||||
int corner_id );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function End_Move_Zone_Corner_Or_Outlines
|
|
||||||
* Terminates a move corner in a zone outline, or a move zone outlines
|
|
||||||
* @param DC = current Device Context (can be NULL)
|
|
||||||
* @param zone_container: the given zone
|
|
||||||
*/
|
|
||||||
void End_Move_Zone_Corner_Or_Outlines( wxDC* DC, ZONE_CONTAINER* zone_container );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function End_Move_Zone_Corner_Or_Outlines
|
|
||||||
* Remove the currently selected corner in a zone outline
|
|
||||||
* the .m_CornerSelection is used as corner selection
|
|
||||||
*/
|
|
||||||
void Remove_Zone_Corner( wxDC* DC, ZONE_CONTAINER* zone_container );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function Delete_Zone
|
* Function Delete_Zone
|
||||||
* Remove the zone which include the segment aZone, or the zone which have
|
* Remove the zone which include the segment aZone, or the zone which have
|
||||||
|
@ -1306,24 +1118,12 @@ public:
|
||||||
*/
|
*/
|
||||||
void Delete_Zone_Contour( wxDC* DC, ZONE_CONTAINER* zone_container );
|
void Delete_Zone_Contour( wxDC* DC, ZONE_CONTAINER* zone_container );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Start_Move_Zone_Outlines
|
|
||||||
* Initialize parameters to move an existing zone outlines.
|
|
||||||
* @param DC = current Device Context (can be NULL)
|
|
||||||
* @param zone_container: the given zone to move
|
|
||||||
*/
|
|
||||||
void Start_Move_Zone_Outlines( wxDC* DC, ZONE_CONTAINER* zone_container );
|
|
||||||
|
|
||||||
// Target handling
|
// Target handling
|
||||||
PCB_TARGET* CreateTarget( wxDC* DC );
|
PCB_TARGET* CreateTarget( wxDC* DC );
|
||||||
void DeleteTarget( PCB_TARGET* aTarget, wxDC* DC );
|
void DeleteTarget( PCB_TARGET* aTarget, wxDC* DC );
|
||||||
void PlaceTarget( PCB_TARGET* aTarget, wxDC* DC );
|
void PlaceTarget( PCB_TARGET* aTarget, wxDC* DC );
|
||||||
void ShowTargetOptionsDialog( PCB_TARGET* aTarget, wxDC* DC );
|
void ShowTargetOptionsDialog( PCB_TARGET* aTarget, wxDC* DC );
|
||||||
|
|
||||||
// Graphic segments type DRAWSEGMENT handling:
|
|
||||||
DRAWSEGMENT* Begin_DrawSegment( DRAWSEGMENT* Segment, STROKE_T shape, wxDC* DC );
|
|
||||||
void End_Edge( DRAWSEGMENT* Segment, wxDC* DC );
|
|
||||||
void Delete_Segment_Edge( DRAWSEGMENT* Segment, wxDC* DC );
|
|
||||||
|
|
||||||
// Dimension handling:
|
// Dimension handling:
|
||||||
void ShowDimensionPropertyDialog( DIMENSION* aDimension, wxDC* aDC );
|
void ShowDimensionPropertyDialog( DIMENSION* aDimension, wxDC* aDC );
|
||||||
|
@ -1461,13 +1261,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void SendCrossProbeNetName( const wxString& aNetName );
|
void SendCrossProbeNetName( const wxString& aNetName );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Edit_Gap
|
|
||||||
* edits the GAP module if it has changed the position and/or size of the pads that
|
|
||||||
* form the gap get a new value.
|
|
||||||
*/
|
|
||||||
void Edit_Gap( wxDC* DC, MODULE* Module );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function CreateMuWaveBaseFootprint
|
* Function CreateMuWaveBaseFootprint
|
||||||
* create a basic footprint for micro wave applications.
|
* create a basic footprint for micro wave applications.
|
||||||
|
@ -1490,8 +1283,6 @@ public:
|
||||||
|
|
||||||
MODULE* Create_MuWavePolygonShape();
|
MODULE* Create_MuWavePolygonShape();
|
||||||
|
|
||||||
void Begin_Self( wxDC* DC );
|
|
||||||
|
|
||||||
void ShowChangedLanguage() override;
|
void ShowChangedLanguage() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,10 +24,6 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* @file modules.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
#include <fctsys.h>
|
||||||
#include <gr_basic.h>
|
#include <gr_basic.h>
|
||||||
#include <class_drawpanel.h>
|
#include <class_drawpanel.h>
|
||||||
|
@ -35,28 +31,18 @@
|
||||||
#include <pcb_edit_frame.h>
|
#include <pcb_edit_frame.h>
|
||||||
#include <trigo.h>
|
#include <trigo.h>
|
||||||
#include <macros.h>
|
#include <macros.h>
|
||||||
|
|
||||||
#include <class_board.h>
|
#include <class_board.h>
|
||||||
#include <class_module.h>
|
#include <class_module.h>
|
||||||
|
|
||||||
#include <pcbnew.h>
|
#include <pcbnew.h>
|
||||||
#include <drag.h>
|
#include <drag.h>
|
||||||
#include <dialog_get_footprint_by_name.h>
|
#include <dialog_get_footprint_by_name.h>
|
||||||
|
|
||||||
#include <connectivity/connectivity_data.h>
|
#include <connectivity/connectivity_data.h>
|
||||||
|
|
||||||
static void MoveFootprint( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
static MODULE* s_ModuleInitialCopy = NULL; // Copy of module for abort/undo command
|
||||||
const wxPoint& aPosition, bool aErase );
|
|
||||||
static void Abort_MoveOrCopyModule( EDA_DRAW_PANEL* Panel, wxDC* DC );
|
|
||||||
|
|
||||||
|
static PICKED_ITEMS_LIST s_PickedList; // a pick-list to save initial module
|
||||||
static MODULE* s_ModuleInitialCopy = NULL; /* Copy of module for
|
// and dragged tracks
|
||||||
* abort/undo command
|
|
||||||
*/
|
|
||||||
static PICKED_ITEMS_LIST s_PickedList; /* a picked list to
|
|
||||||
* save initial module
|
|
||||||
* and dragged tracks
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
MODULE* PCB_BASE_FRAME::GetFootprintFromBoardByReference()
|
MODULE* PCB_BASE_FRAME::GetFootprintFromBoardByReference()
|
||||||
|
@ -97,258 +83,6 @@ MODULE* PCB_BASE_FRAME::GetFootprintFromBoardByReference()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::StartMoveModule( MODULE* aModule, wxDC* aDC,
|
|
||||||
bool aDragConnectedTracks )
|
|
||||||
{
|
|
||||||
if( aModule == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( s_ModuleInitialCopy )
|
|
||||||
delete s_ModuleInitialCopy;
|
|
||||||
|
|
||||||
s_PickedList.ClearItemsList(); // Should be empty, but...
|
|
||||||
|
|
||||||
// Creates a copy of the current module, for abort and undo commands
|
|
||||||
s_ModuleInitialCopy = (MODULE*)aModule->Clone();
|
|
||||||
s_ModuleInitialCopy->SetParent( GetBoard() );
|
|
||||||
s_ModuleInitialCopy->ClearFlags();
|
|
||||||
|
|
||||||
SetCurItem( aModule );
|
|
||||||
GetBoard()->m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
|
|
||||||
aModule->SetFlags( IS_MOVED );
|
|
||||||
|
|
||||||
/* Show ratsnest. */
|
|
||||||
if( GetBoard()->IsElementVisible( LAYER_RATSNEST ) )
|
|
||||||
DrawGeneralRatsnest( aDC );
|
|
||||||
|
|
||||||
EraseDragList();
|
|
||||||
|
|
||||||
if( aDragConnectedTracks )
|
|
||||||
{
|
|
||||||
DRAG_LIST drglist( GetBoard() );
|
|
||||||
drglist.BuildDragListe( aModule );
|
|
||||||
|
|
||||||
ITEM_PICKER itemWrapper( NULL, UR_CHANGED );
|
|
||||||
|
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
|
||||||
{
|
|
||||||
TRACK* segm = g_DragSegmentList[ii].m_Track;
|
|
||||||
itemWrapper.SetItem( segm );
|
|
||||||
itemWrapper.SetLink( segm->Clone() );
|
|
||||||
itemWrapper.GetLink()->SetState( IN_EDIT, false );
|
|
||||||
s_PickedList.PushItem( itemWrapper );
|
|
||||||
}
|
|
||||||
|
|
||||||
UndrawAndMarkSegmentsToDrag( m_canvas, aDC );
|
|
||||||
}
|
|
||||||
|
|
||||||
GetBoard()->m_Status_Pcb |= DO_NOT_SHOW_GENERAL_RASTNEST;
|
|
||||||
m_canvas->SetMouseCapture( MoveFootprint, Abort_MoveOrCopyModule );
|
|
||||||
m_canvas->SetAutoPanRequest( true );
|
|
||||||
|
|
||||||
// Erase the module.
|
|
||||||
if( aDC )
|
|
||||||
{
|
|
||||||
aModule->SetFlags( DO_NOT_DRAW );
|
|
||||||
m_canvas->RefreshDrawingRect( aModule->GetBoundingBox() );
|
|
||||||
aModule->ClearFlags( DO_NOT_DRAW );
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->CallMouseCapture( aDC, wxDefaultPosition, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Called on a move or copy module command abort
|
|
||||||
*/
|
|
||||||
void Abort_MoveOrCopyModule( EDA_DRAW_PANEL* Panel, wxDC* DC )
|
|
||||||
{
|
|
||||||
TRACK* pt_segm;
|
|
||||||
MODULE* module;
|
|
||||||
PCB_EDIT_FRAME* pcbframe = (PCB_EDIT_FRAME*) Panel->GetParent();
|
|
||||||
|
|
||||||
module = (MODULE*) pcbframe->GetScreen()->GetCurItem();
|
|
||||||
pcbframe->GetBoard()->m_Status_Pcb &= ~RATSNEST_ITEM_LOCAL_OK;
|
|
||||||
Panel->SetMouseCapture( NULL, NULL );
|
|
||||||
|
|
||||||
if( module )
|
|
||||||
{
|
|
||||||
// Erase the current footprint on screen
|
|
||||||
module->DrawOutlinesWhenMoving( Panel, DC, g_Offset_Module );
|
|
||||||
|
|
||||||
/* If a move command: return to old position
|
|
||||||
* If a copy command, delete the new footprint
|
|
||||||
*/
|
|
||||||
if( module->IsMoving() )
|
|
||||||
{
|
|
||||||
/* Restore old position for dragged tracks */
|
|
||||||
for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ )
|
|
||||||
{
|
|
||||||
pt_segm = g_DragSegmentList[ii].m_Track;
|
|
||||||
pt_segm->Draw( Panel, DC, GR_XOR );
|
|
||||||
pt_segm->SetState( IN_EDIT, false );
|
|
||||||
pt_segm->ClearFlags();
|
|
||||||
g_DragSegmentList[ii].RestoreInitialValues();
|
|
||||||
pt_segm->Draw( Panel, DC, GR_OR );
|
|
||||||
}
|
|
||||||
|
|
||||||
EraseDragList();
|
|
||||||
module->ClearFlags( IS_MOVED );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( module->IsNew() ) // Copy command: delete new footprint
|
|
||||||
{
|
|
||||||
module->DeleteStructure();
|
|
||||||
module = NULL;
|
|
||||||
pcbframe->GetBoard()->m_Status_Pcb = 0;
|
|
||||||
pcbframe->GetBoard()->BuildListOfNets();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Redraw the module. */
|
|
||||||
if( module && s_ModuleInitialCopy )
|
|
||||||
{
|
|
||||||
if( s_ModuleInitialCopy->GetOrientation() != module->GetOrientation() )
|
|
||||||
pcbframe->Rotate_Module( NULL, module, s_ModuleInitialCopy->GetOrientation(), false );
|
|
||||||
|
|
||||||
if( s_ModuleInitialCopy->GetLayer() != module->GetLayer() )
|
|
||||||
pcbframe->Change_Side_Module( module, NULL );
|
|
||||||
|
|
||||||
module->Draw( Panel, DC, GR_OR );
|
|
||||||
}
|
|
||||||
|
|
||||||
pcbframe->SetCurItem( NULL );
|
|
||||||
|
|
||||||
delete s_ModuleInitialCopy;
|
|
||||||
s_ModuleInitialCopy = NULL;
|
|
||||||
s_PickedList.ClearListAndDeleteItems();
|
|
||||||
|
|
||||||
// Display ratsnest is allowed
|
|
||||||
pcbframe->GetBoard()->m_Status_Pcb &= ~DO_NOT_SHOW_GENERAL_RASTNEST;
|
|
||||||
|
|
||||||
if( pcbframe->GetBoard()->IsElementVisible( LAYER_RATSNEST ) )
|
|
||||||
pcbframe->DrawGeneralRatsnest( DC );
|
|
||||||
|
|
||||||
#ifdef __WXMAC__
|
|
||||||
Panel->Refresh();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Redraw the footprint when moving the mouse.
|
|
||||||
*/
|
|
||||||
void MoveFootprint( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition, bool aErase )
|
|
||||||
{
|
|
||||||
MODULE* module = (MODULE*) aPanel->GetScreen()->GetCurItem();
|
|
||||||
|
|
||||||
if( module == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Erase current footprint. */
|
|
||||||
if( aErase )
|
|
||||||
{
|
|
||||||
module->DrawOutlinesWhenMoving( aPanel, aDC, g_Offset_Module );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Redraw the module at the new position. */
|
|
||||||
g_Offset_Module = module->GetPosition() - aPanel->GetParent()->GetCrossHairPosition();
|
|
||||||
module->DrawOutlinesWhenMoving( aPanel, aDC, g_Offset_Module );
|
|
||||||
|
|
||||||
DrawSegmentWhileMovingFootprint( aPanel, aDC );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PCB_EDIT_FRAME::Delete_Module( MODULE* aModule, wxDC* aDC )
|
|
||||||
{
|
|
||||||
wxString msg;
|
|
||||||
|
|
||||||
if( aModule == NULL )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
SetMsgPanel( aModule );
|
|
||||||
|
|
||||||
/* Remove module from list, and put it in undo command list */
|
|
||||||
m_Pcb->Remove( aModule );
|
|
||||||
aModule->SetState( IS_DELETED, true );
|
|
||||||
SaveCopyInUndoList( aModule, UR_DELETED );
|
|
||||||
|
|
||||||
if( aDC && GetBoard()->IsElementVisible( LAYER_RATSNEST ) )
|
|
||||||
Compile_Ratsnest( aDC, true );
|
|
||||||
|
|
||||||
// Redraw the full screen to ensure perfect display of board and ratsnest.
|
|
||||||
if( aDC )
|
|
||||||
m_canvas->Refresh();
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Change_Side_Module( MODULE* Module, wxDC* DC )
|
|
||||||
{
|
|
||||||
if( Module == NULL )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( ( Module->GetLayer() != F_Cu ) && ( Module->GetLayer() != B_Cu ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
|
|
||||||
if( !Module->IsMoving() ) // This is a simple flip, no other edit in progress
|
|
||||||
{
|
|
||||||
|
|
||||||
if( DC )
|
|
||||||
{
|
|
||||||
Module->SetFlags( DO_NOT_DRAW );
|
|
||||||
m_canvas->RefreshDrawingRect( Module->GetBoundingBox() );
|
|
||||||
Module->ClearFlags( DO_NOT_DRAW );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Show ratsnest if necessary. */
|
|
||||||
if( DC && GetBoard()->IsElementVisible( LAYER_RATSNEST ) )
|
|
||||||
DrawGeneralRatsnest( DC );
|
|
||||||
|
|
||||||
g_Offset_Module.x = 0;
|
|
||||||
g_Offset_Module.y = 0;
|
|
||||||
}
|
|
||||||
else // Module is being moved.
|
|
||||||
{
|
|
||||||
/* Erase footprint and draw outline if it has been already drawn. */
|
|
||||||
if( DC )
|
|
||||||
{
|
|
||||||
Module->DrawOutlinesWhenMoving( m_canvas, DC, g_Offset_Module );
|
|
||||||
DrawSegmentWhileMovingFootprint( m_canvas, DC );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Flip the module */
|
|
||||||
Module->Flip( Module->GetPosition() );
|
|
||||||
m_Pcb->GetConnectivity()->Update( Module );
|
|
||||||
SetMsgPanel( Module );
|
|
||||||
|
|
||||||
if( !Module->IsMoving() ) /* Inversion simple */
|
|
||||||
{
|
|
||||||
if( DC )
|
|
||||||
{
|
|
||||||
Module->Draw( m_canvas, DC, GR_OR );
|
|
||||||
|
|
||||||
if( GetBoard()->IsElementVisible( LAYER_RATSNEST ) )
|
|
||||||
Compile_Ratsnest( DC, true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( DC )
|
|
||||||
{
|
|
||||||
Module->DrawOutlinesWhenMoving( m_canvas, DC, g_Offset_Module );
|
|
||||||
DrawSegmentWhileMovingFootprint( m_canvas, DC );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
m_Pcb->GetConnectivity()->Update( Module );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_BASE_FRAME::PlaceModule( MODULE* aModule, wxDC* aDC, bool aRecreateRatsnest )
|
void PCB_BASE_FRAME::PlaceModule( MODULE* aModule, wxDC* aDC, bool aRecreateRatsnest )
|
||||||
{
|
{
|
||||||
wxPoint newpos;
|
wxPoint newpos;
|
||||||
|
|
|
@ -57,26 +57,7 @@ enum pcbnew_ids
|
||||||
ID_MENU_PCB_FLIP_VIEW,
|
ID_MENU_PCB_FLIP_VIEW,
|
||||||
|
|
||||||
ID_POPUP_PCB_START_RANGE,
|
ID_POPUP_PCB_START_RANGE,
|
||||||
|
|
||||||
ID_POPUP_PCB_MOVE_EXACT,
|
|
||||||
ID_POPUP_PCB_CREATE_ARRAY,
|
|
||||||
|
|
||||||
ID_POPUP_PCB_END_LINE,
|
|
||||||
|
|
||||||
ID_POPUP_PCB_FILL_ALL_ZONES,
|
|
||||||
ID_POPUP_PCB_FILL_ZONE,
|
|
||||||
ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES,
|
|
||||||
ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_CURRENT_ZONE,
|
|
||||||
|
|
||||||
ID_POPUP_PCB_PLACE_THROUGH_VIA,
|
|
||||||
ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_THROUGH_VIA,
|
|
||||||
ID_POPUP_PCB_PLACE_BLIND_BURIED_VIA,
|
|
||||||
ID_POPUP_PCB_SELECT_CU_LAYER_AND_PLACE_BLIND_BURIED_VIA,
|
|
||||||
ID_POPUP_PCB_PLACE_MICROVIA,
|
|
||||||
ID_POPUP_PCB_SWITCH_TRACK_POSTURE,
|
|
||||||
|
|
||||||
ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST,
|
ID_POPUP_PCB_GET_AND_MOVE_MODULE_REQUEST,
|
||||||
|
|
||||||
ID_POPUP_PCB_END_RANGE,
|
ID_POPUP_PCB_END_RANGE,
|
||||||
|
|
||||||
// Tracks and vias sizes general options
|
// Tracks and vias sizes general options
|
||||||
|
@ -203,7 +184,6 @@ enum pcbnew_ids
|
||||||
|
|
||||||
ID_DRC_CONTROL,
|
ID_DRC_CONTROL,
|
||||||
ID_PCB_GLOBAL_DELETE,
|
ID_PCB_GLOBAL_DELETE,
|
||||||
ID_POPUP_PCB_DELETE_TRACKSEG,
|
|
||||||
ID_TOOLBARH_PCB_SELECT_LAYER,
|
ID_TOOLBARH_PCB_SELECT_LAYER,
|
||||||
|
|
||||||
// Module editor right vertical tool bar commands.
|
// Module editor right vertical tool bar commands.
|
||||||
|
@ -237,14 +217,9 @@ enum pcbnew_ids
|
||||||
ID_MODEDIT_PAD_SETTINGS,
|
ID_MODEDIT_PAD_SETTINGS,
|
||||||
ID_MODEDIT_LOAD_MODULE_FROM_BOARD,
|
ID_MODEDIT_LOAD_MODULE_FROM_BOARD,
|
||||||
ID_MODEDIT_EDIT_MODULE_PROPERTIES,
|
ID_MODEDIT_EDIT_MODULE_PROPERTIES,
|
||||||
ID_MODEDIT_TRANSFORM_MODULE,
|
|
||||||
ID_MODEDIT_MODULE_ROTATE,
|
|
||||||
ID_MODEDIT_MODULE_MIRROR,
|
|
||||||
ID_MODEDIT_MODULE_MOVE_EXACT,
|
|
||||||
ID_MODEDIT_IMPORT_PART,
|
ID_MODEDIT_IMPORT_PART,
|
||||||
ID_MODEDIT_EXPORT_PART,
|
ID_MODEDIT_EXPORT_PART,
|
||||||
ID_MODEDIT_SHOW_HIDE_SEARCH_TREE,
|
ID_MODEDIT_SHOW_HIDE_SEARCH_TREE,
|
||||||
ID_POPUP_MODEDIT_EDIT_BODY_ITEM,
|
|
||||||
|
|
||||||
ID_MODVIEW_LIB_LIST,
|
ID_MODVIEW_LIB_LIST,
|
||||||
ID_MODVIEW_FOOTPRINT_LIST,
|
ID_MODVIEW_FOOTPRINT_LIST,
|
||||||
|
|
|
@ -24,10 +24,6 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
|
||||||
* @file zones_by_polygon.cpp
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
#include <fctsys.h>
|
||||||
#include <kiface_i.h>
|
#include <kiface_i.h>
|
||||||
#include <class_drawpanel.h>
|
#include <class_drawpanel.h>
|
||||||
|
@ -51,817 +47,11 @@
|
||||||
|
|
||||||
#include <zone_filler.h>
|
#include <zone_filler.h>
|
||||||
|
|
||||||
// Outline creation:
|
|
||||||
static void Abort_Zone_Create_Outline( EDA_DRAW_PANEL* Panel, wxDC* DC );
|
|
||||||
static void Show_New_Edge_While_Move_Mouse( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|
||||||
const wxPoint& aPosition, bool aErase );
|
|
||||||
|
|
||||||
// Corner moving
|
|
||||||
static void Abort_Zone_Move_Corner_Or_Outlines( EDA_DRAW_PANEL* Panel, wxDC* DC );
|
|
||||||
static void Show_Zone_Corner_Or_Outline_While_Move_Mouse( EDA_DRAW_PANEL* aPanel,
|
|
||||||
wxDC* aDC,
|
|
||||||
const wxPoint& aPosition,
|
|
||||||
bool aErase );
|
|
||||||
|
|
||||||
// Local variables
|
// Local variables
|
||||||
static wxPoint s_CornerInitialPosition; // Used to abort a move corner command
|
static PICKED_ITEMS_LIST s_PickedList; // a picked list to save zones for undo/redo command
|
||||||
static bool s_CornerIsNew; // Used to abort a move corner command (if it is a new corner, it must be deleted)
|
static PICKED_ITEMS_LIST s_AuxiliaryList; // a picked list to store zones that are deleted or added when combined
|
||||||
static bool s_AddCutoutToCurrentZone; // if true, the next outline will be added to s_CurrentZone
|
|
||||||
static ZONE_CONTAINER* s_CurrentZone; // if != NULL, these ZONE_CONTAINER params will be used for the next zone
|
|
||||||
static wxPoint s_CursorLastPosition; // in move zone outline, last cursor position. Used to calculate the move vector
|
|
||||||
static PICKED_ITEMS_LIST s_PickedList; // a picked list to save zones for undo/redo command
|
|
||||||
static PICKED_ITEMS_LIST s_AuxiliaryList; // a picked list to store zones that are deleted or added when combined
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Add_Similar_Zone( wxDC* DC, ZONE_CONTAINER* aZone )
|
|
||||||
{
|
|
||||||
if( !aZone )
|
|
||||||
return;
|
|
||||||
|
|
||||||
s_AddCutoutToCurrentZone = false;
|
|
||||||
s_CurrentZone = aZone;
|
|
||||||
|
|
||||||
// set zone settings to the current zone
|
|
||||||
ZONE_SETTINGS zoneInfo = GetZoneSettings();
|
|
||||||
zoneInfo << *aZone;
|
|
||||||
SetZoneSettings( zoneInfo );
|
|
||||||
|
|
||||||
// Use the general event handler to set others params (like toolbar)
|
|
||||||
wxCommandEvent evt;
|
|
||||||
evt.SetId( aZone->GetIsKeepout() ? ID_PCB_KEEPOUT_BUTT : ID_PCB_ZONES_BUTT );
|
|
||||||
OnSelectTool( evt );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Add_Zone_Cutout( wxDC* DC, ZONE_CONTAINER* aZone )
|
|
||||||
{
|
|
||||||
if( !aZone )
|
|
||||||
return;
|
|
||||||
|
|
||||||
s_AddCutoutToCurrentZone = true;
|
|
||||||
s_CurrentZone = aZone;
|
|
||||||
|
|
||||||
// set zones setup to the current zone
|
|
||||||
ZONE_SETTINGS zoneInfo = GetZoneSettings();
|
|
||||||
zoneInfo << *aZone;
|
|
||||||
SetZoneSettings( zoneInfo );
|
|
||||||
|
|
||||||
// Use the general event handle to set others params (like toolbar)
|
|
||||||
wxCommandEvent evt;
|
|
||||||
evt.SetId( aZone->GetIsKeepout() ? ID_PCB_KEEPOUT_BUTT : ID_PCB_ZONES_BUTT );
|
|
||||||
OnSelectTool( evt );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::duplicateZone( wxDC* aDC, ZONE_CONTAINER* aZone )
|
|
||||||
{
|
|
||||||
ZONE_SETTINGS zoneSettings;
|
|
||||||
zoneSettings << *aZone;
|
|
||||||
int dialogResult;
|
|
||||||
|
|
||||||
if( aZone->GetIsKeepout() )
|
|
||||||
dialogResult = InvokeKeepoutAreaEditor( this, &zoneSettings );
|
|
||||||
else if( aZone->IsOnCopperLayer() )
|
|
||||||
dialogResult = InvokeCopperZonesEditor( this, &zoneSettings );
|
|
||||||
else
|
|
||||||
dialogResult = InvokeNonCopperZonesEditor( this, &zoneSettings );
|
|
||||||
|
|
||||||
if( dialogResult != wxID_OK )
|
|
||||||
return;
|
|
||||||
|
|
||||||
// If the new zone is on the same layer as the the initial zone we'll end up combining
|
|
||||||
// them which will result in a no-op. Might as well exit here.
|
|
||||||
if( aZone->GetIsKeepout() && ( aZone->GetLayerSet() == zoneSettings.m_Layers ) )
|
|
||||||
{
|
|
||||||
DisplayErrorMessage( this, _( "The duplicated zone cannot be on the same layers as the original zone." ) );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if( !aZone->GetIsKeepout() && ( aZone->GetLayer() == zoneSettings.m_CurrentZone_Layer ) )
|
|
||||||
{
|
|
||||||
DisplayErrorMessage( this, _( "The duplicated zone cannot be on the same layer as the original zone." ) );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ZONE_CONTAINER* newZone = new ZONE_CONTAINER( *aZone );
|
|
||||||
newZone->UnFill();
|
|
||||||
zoneSettings.ExportSetting( *newZone );
|
|
||||||
newZone->Hatch();
|
|
||||||
|
|
||||||
s_AuxiliaryList.ClearListAndDeleteItems();
|
|
||||||
s_PickedList.ClearListAndDeleteItems();
|
|
||||||
SaveCopyOfZones( s_PickedList, GetBoard(), newZone->GetNetCode(), newZone->GetLayer() );
|
|
||||||
GetBoard()->Add( newZone );
|
|
||||||
|
|
||||||
ITEM_PICKER picker( newZone, UR_NEW );
|
|
||||||
s_PickedList.PushItem( picker );
|
|
||||||
|
|
||||||
GetScreen()->SetCurItem( NULL ); // This outline may be deleted when merging outlines
|
|
||||||
|
|
||||||
// Combine zones if possible
|
|
||||||
GetBoard()->OnAreaPolygonModified( &s_AuxiliaryList, newZone );
|
|
||||||
|
|
||||||
// Redraw zones
|
|
||||||
GetBoard()->RedrawAreasOutlines( m_canvas, aDC, GR_OR, newZone->GetLayer() );
|
|
||||||
GetBoard()->RedrawFilledAreas( m_canvas, aDC, GR_OR, newZone->GetLayer() );
|
|
||||||
|
|
||||||
DRC drc( this );
|
|
||||||
|
|
||||||
if( GetBoard()->GetAreaIndex( newZone ) >= 0 && drc.TestZoneToZoneOutline( newZone, true ) )
|
|
||||||
DisplayInfoMessage( this, _( "Warning: The new zone fails DRC" ) );
|
|
||||||
|
|
||||||
UpdateCopyOfZonesList( s_PickedList, s_AuxiliaryList, GetBoard() );
|
|
||||||
SaveCopyInUndoList( s_PickedList, UR_UNSPECIFIED );
|
|
||||||
s_PickedList.ClearItemsList();
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int PCB_EDIT_FRAME::Delete_LastCreatedCorner( wxDC* DC )
|
|
||||||
{
|
|
||||||
ZONE_CONTAINER* zone = GetBoard()->m_CurrentZoneContour;
|
|
||||||
|
|
||||||
if( !zone )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if( !zone->GetNumCorners() )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
zone->DrawWhileCreateOutline( m_canvas, DC, GR_XOR );
|
|
||||||
|
|
||||||
if( zone->GetNumCorners() > 2 )
|
|
||||||
{
|
|
||||||
zone->Outline()->RemoveVertex( zone->GetNumCorners() - 1 );
|
|
||||||
|
|
||||||
if( m_canvas->IsMouseCaptured() )
|
|
||||||
m_canvas->CallMouseCapture( DC, wxDefaultPosition, false );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
SetCurItem( NULL );
|
|
||||||
zone->RemoveAllContours();
|
|
||||||
zone->ClearFlags();
|
|
||||||
}
|
|
||||||
|
|
||||||
return zone->GetNumCorners();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Abort_Zone_Create_Outline
|
|
||||||
* cancels the Begin_Zone command if at least one EDGE_ZONE was created.
|
|
||||||
*/
|
|
||||||
static void Abort_Zone_Create_Outline( EDA_DRAW_PANEL* Panel, wxDC* DC )
|
|
||||||
{
|
|
||||||
PCB_EDIT_FRAME* pcbframe = (PCB_EDIT_FRAME*) Panel->GetParent();
|
|
||||||
ZONE_CONTAINER* zone = pcbframe->GetBoard()->m_CurrentZoneContour;
|
|
||||||
|
|
||||||
if( zone )
|
|
||||||
{
|
|
||||||
zone->DrawWhileCreateOutline( Panel, DC, GR_XOR );
|
|
||||||
zone->RemoveAllContours();
|
|
||||||
if( zone->IsNew() )
|
|
||||||
{
|
|
||||||
delete zone;
|
|
||||||
pcbframe->GetBoard()->m_CurrentZoneContour = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
zone->ClearFlags();
|
|
||||||
}
|
|
||||||
|
|
||||||
pcbframe->SetCurItem( NULL );
|
|
||||||
s_AddCutoutToCurrentZone = false;
|
|
||||||
s_CurrentZone = NULL;
|
|
||||||
Panel->SetMouseCapture( NULL, NULL );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Start_Move_Zone_Corner( wxDC* DC, ZONE_CONTAINER* aZone,
|
|
||||||
int corner_id, bool IsNewCorner )
|
|
||||||
{
|
|
||||||
if( aZone->IsOnCopperLayer() ) // Show the Net
|
|
||||||
{
|
|
||||||
if( GetBoard()->IsHighLightNetON() && DC )
|
|
||||||
{
|
|
||||||
HighLight( DC ); // Remove old highlight selection
|
|
||||||
}
|
|
||||||
|
|
||||||
ZONE_SETTINGS zoneInfo = GetZoneSettings();
|
|
||||||
zoneInfo.m_NetcodeSelection = aZone->GetNetCode();
|
|
||||||
SetZoneSettings( zoneInfo );
|
|
||||||
|
|
||||||
GetBoard()->SetHighLightNet( aZone->GetNetCode() );
|
|
||||||
|
|
||||||
if( DC )
|
|
||||||
HighLight( DC );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Prepare copy of old zones, for undo/redo.
|
|
||||||
// if the corner is new, remove it from list, save and insert it in list
|
|
||||||
VECTOR2I corner = aZone->Outline()->Vertex( corner_id );
|
|
||||||
|
|
||||||
if ( IsNewCorner )
|
|
||||||
aZone->Outline()->RemoveVertex( corner_id );
|
|
||||||
|
|
||||||
s_AuxiliaryList.ClearListAndDeleteItems();
|
|
||||||
s_PickedList.ClearListAndDeleteItems();
|
|
||||||
|
|
||||||
SaveCopyOfZones( s_PickedList, GetBoard(), aZone->GetNetCode(), aZone->GetLayer() );
|
|
||||||
|
|
||||||
if ( IsNewCorner )
|
|
||||||
aZone->Outline()->InsertVertex(corner_id-1, corner );
|
|
||||||
|
|
||||||
aZone->SetFlags( IN_EDIT );
|
|
||||||
m_canvas->SetMouseCapture( Show_Zone_Corner_Or_Outline_While_Move_Mouse,
|
|
||||||
Abort_Zone_Move_Corner_Or_Outlines );
|
|
||||||
s_CornerInitialPosition = static_cast<wxPoint>( aZone->GetCornerPosition( corner_id ) );
|
|
||||||
s_CornerIsNew = IsNewCorner;
|
|
||||||
s_AddCutoutToCurrentZone = false;
|
|
||||||
s_CurrentZone = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Start_Move_Zone_Drag_Outline_Edge( wxDC* DC,
|
|
||||||
ZONE_CONTAINER* aZone,
|
|
||||||
int corner_id )
|
|
||||||
{
|
|
||||||
aZone->SetFlags( IS_DRAGGED );
|
|
||||||
aZone->SetSelectedCorner( corner_id );
|
|
||||||
m_canvas->SetMouseCapture( Show_Zone_Corner_Or_Outline_While_Move_Mouse,
|
|
||||||
Abort_Zone_Move_Corner_Or_Outlines );
|
|
||||||
s_CursorLastPosition = s_CornerInitialPosition = GetCrossHairPosition();
|
|
||||||
s_AddCutoutToCurrentZone = false;
|
|
||||||
s_CurrentZone = NULL;
|
|
||||||
|
|
||||||
s_PickedList.ClearListAndDeleteItems();
|
|
||||||
s_AuxiliaryList.ClearListAndDeleteItems();
|
|
||||||
SaveCopyOfZones( s_PickedList, GetBoard(), aZone->GetNetCode(), aZone->GetLayer() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Start_Move_Zone_Outlines( wxDC* DC, ZONE_CONTAINER* aZone )
|
|
||||||
{
|
|
||||||
// Show the Net
|
|
||||||
if( aZone->IsOnCopperLayer() ) // Show the Net
|
|
||||||
{
|
|
||||||
if( GetBoard()->IsHighLightNetON() )
|
|
||||||
{
|
|
||||||
HighLight( DC ); // Remove old highlight selection
|
|
||||||
}
|
|
||||||
|
|
||||||
ZONE_SETTINGS zoneInfo = GetZoneSettings();
|
|
||||||
zoneInfo.m_NetcodeSelection = aZone->GetNetCode();
|
|
||||||
SetZoneSettings( zoneInfo );
|
|
||||||
|
|
||||||
GetBoard()->SetHighLightNet( aZone->GetNetCode() );
|
|
||||||
HighLight( DC );
|
|
||||||
}
|
|
||||||
|
|
||||||
s_PickedList.ClearListAndDeleteItems();
|
|
||||||
s_AuxiliaryList.ClearListAndDeleteItems();
|
|
||||||
SaveCopyOfZones( s_PickedList, GetBoard(), aZone->GetNetCode(), aZone->GetLayer() );
|
|
||||||
|
|
||||||
aZone->SetFlags( IS_MOVED );
|
|
||||||
m_canvas->SetMouseCapture( Show_Zone_Corner_Or_Outline_While_Move_Mouse,
|
|
||||||
Abort_Zone_Move_Corner_Or_Outlines );
|
|
||||||
s_CursorLastPosition = s_CornerInitialPosition = GetCrossHairPosition();
|
|
||||||
s_CornerIsNew = false;
|
|
||||||
s_AddCutoutToCurrentZone = false;
|
|
||||||
s_CurrentZone = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::End_Move_Zone_Corner_Or_Outlines( wxDC* DC, ZONE_CONTAINER* aZone )
|
|
||||||
{
|
|
||||||
aZone->ClearFlags();
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
|
|
||||||
if( DC )
|
|
||||||
aZone->Draw( m_canvas, DC, GR_OR );
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
s_AddCutoutToCurrentZone = false;
|
|
||||||
s_CurrentZone = NULL;
|
|
||||||
|
|
||||||
SetCurItem( NULL ); // This outline can be deleted when merging outlines
|
|
||||||
|
|
||||||
// Combine zones if possible
|
|
||||||
GetBoard()->OnAreaPolygonModified( &s_AuxiliaryList, aZone );
|
|
||||||
m_canvas->Refresh();
|
|
||||||
|
|
||||||
int ii = GetBoard()->GetAreaIndex( aZone ); // test if aZone exists
|
|
||||||
|
|
||||||
if( ii < 0 )
|
|
||||||
aZone = NULL; // was removed by combining zones
|
|
||||||
|
|
||||||
UpdateCopyOfZonesList( s_PickedList, s_AuxiliaryList, GetBoard() );
|
|
||||||
SaveCopyInUndoList(s_PickedList, UR_UNSPECIFIED);
|
|
||||||
s_PickedList.ClearItemsList(); // s_ItemsListPicker is no more owner of picked items
|
|
||||||
|
|
||||||
DRC drc( this );
|
|
||||||
int error_count = drc.TestZoneToZoneOutline( aZone, true );
|
|
||||||
|
|
||||||
if( error_count )
|
|
||||||
{
|
|
||||||
DisplayErrorMessage( this, _( "Area: DRC outline error" ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Remove_Zone_Corner( wxDC* DC, ZONE_CONTAINER* aZone )
|
|
||||||
{
|
|
||||||
OnModify();
|
|
||||||
|
|
||||||
if( aZone->Outline()->TotalVertices() <= 3 )
|
|
||||||
{
|
|
||||||
m_canvas->RefreshDrawingRect( aZone->GetBoundingBox() );
|
|
||||||
|
|
||||||
if( DC )
|
|
||||||
{ // Remove the full zone because this is no more an area
|
|
||||||
aZone->UnFill();
|
|
||||||
aZone->DrawFilledArea( m_canvas, DC, GR_XOR );
|
|
||||||
}
|
|
||||||
|
|
||||||
GetBoard()->Delete( aZone );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PCB_LAYER_ID layer = aZone->GetLayer();
|
|
||||||
|
|
||||||
if( DC )
|
|
||||||
{
|
|
||||||
GetBoard()->RedrawAreasOutlines( m_canvas, DC, GR_XOR, layer );
|
|
||||||
GetBoard()->RedrawFilledAreas( m_canvas, DC, GR_XOR, layer );
|
|
||||||
}
|
|
||||||
|
|
||||||
s_AuxiliaryList.ClearListAndDeleteItems();
|
|
||||||
s_PickedList. ClearListAndDeleteItems();
|
|
||||||
SaveCopyOfZones( s_PickedList, GetBoard(), aZone->GetNetCode(), aZone->GetLayer() );
|
|
||||||
aZone->Outline()->RemoveVertex( aZone->GetSelectedCorner() );
|
|
||||||
|
|
||||||
// modify zones outlines according to the new aZone shape
|
|
||||||
GetBoard()->OnAreaPolygonModified( &s_AuxiliaryList, aZone );
|
|
||||||
|
|
||||||
if( DC )
|
|
||||||
{
|
|
||||||
GetBoard()->RedrawAreasOutlines( m_canvas, DC, GR_OR, layer );
|
|
||||||
GetBoard()->RedrawFilledAreas( m_canvas, DC, GR_OR, layer );
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateCopyOfZonesList( s_PickedList, s_AuxiliaryList, GetBoard() );
|
|
||||||
SaveCopyInUndoList(s_PickedList, UR_UNSPECIFIED);
|
|
||||||
s_PickedList.ClearItemsList(); // s_ItemsListPicker is no more owner of picked items
|
|
||||||
|
|
||||||
int ii = GetBoard()->GetAreaIndex( aZone ); // test if aZone exists
|
|
||||||
|
|
||||||
if( ii < 0 )
|
|
||||||
aZone = NULL; // aZone does not exist anymore, after combining zones
|
|
||||||
|
|
||||||
DRC drc( this );
|
|
||||||
int error_count = drc.TestZoneToZoneOutline( aZone, true );
|
|
||||||
|
|
||||||
if( error_count )
|
|
||||||
{
|
|
||||||
DisplayErrorMessage( this, _( "Area: DRC outline error" ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function Abort_Zone_Move_Corner_Or_Outlines
|
|
||||||
* cancels the Begin_Zone state if at least one EDGE_ZONE has been created.
|
|
||||||
*/
|
|
||||||
void Abort_Zone_Move_Corner_Or_Outlines( EDA_DRAW_PANEL* Panel, wxDC* DC )
|
|
||||||
{
|
|
||||||
PCB_EDIT_FRAME* pcbframe = (PCB_EDIT_FRAME*) Panel->GetParent();
|
|
||||||
ZONE_CONTAINER* zone = (ZONE_CONTAINER*) pcbframe->GetCurItem();
|
|
||||||
|
|
||||||
if( zone->IsMoving() )
|
|
||||||
{
|
|
||||||
wxPoint offset;
|
|
||||||
offset = s_CornerInitialPosition - s_CursorLastPosition;
|
|
||||||
zone->Move( offset );
|
|
||||||
}
|
|
||||||
else if( zone->IsDragging() )
|
|
||||||
{
|
|
||||||
wxPoint offset = s_CornerInitialPosition - s_CursorLastPosition;
|
|
||||||
int selection = zone->GetSelectedCorner();
|
|
||||||
zone->MoveEdge( offset, selection );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( s_CornerIsNew )
|
|
||||||
{
|
|
||||||
zone->Outline()->RemoveVertex( zone->GetSelectedCorner() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxPoint pos = s_CornerInitialPosition;
|
|
||||||
zone->Outline()->Vertex( zone->GetSelectedCorner() ) = pos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Panel->SetMouseCapture( NULL, NULL );
|
|
||||||
s_AuxiliaryList.ClearListAndDeleteItems();
|
|
||||||
s_PickedList. ClearListAndDeleteItems();
|
|
||||||
Panel->Refresh();
|
|
||||||
|
|
||||||
pcbframe->SetCurItem( NULL );
|
|
||||||
zone->ClearFlags();
|
|
||||||
s_AddCutoutToCurrentZone = false;
|
|
||||||
s_CurrentZone = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Redraws the zone outline when moving a corner according to the cursor position
|
|
||||||
void Show_Zone_Corner_Or_Outline_While_Move_Mouse( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|
||||||
const wxPoint& aPosition, bool aErase )
|
|
||||||
{
|
|
||||||
PCB_EDIT_FRAME* pcbframe = (PCB_EDIT_FRAME*) aPanel->GetParent();
|
|
||||||
ZONE_CONTAINER* zone = (ZONE_CONTAINER*) pcbframe->GetCurItem();
|
|
||||||
|
|
||||||
if( aErase ) // Undraw edge in old position
|
|
||||||
{
|
|
||||||
zone->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
}
|
|
||||||
|
|
||||||
wxPoint pos = pcbframe->GetCrossHairPosition();
|
|
||||||
|
|
||||||
if( zone->IsMoving() )
|
|
||||||
{
|
|
||||||
wxPoint offset;
|
|
||||||
offset = pos - s_CursorLastPosition;
|
|
||||||
zone->Move( offset );
|
|
||||||
s_CursorLastPosition = pos;
|
|
||||||
}
|
|
||||||
else if( zone->IsDragging() )
|
|
||||||
{
|
|
||||||
wxPoint offset = pos - s_CursorLastPosition;
|
|
||||||
int selection = zone->GetSelectedCorner();
|
|
||||||
zone->MoveEdge( offset, selection );
|
|
||||||
s_CursorLastPosition = pos;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
zone->Outline()->Vertex( zone->GetSelectedCorner() ) = pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
zone->Draw( aPanel, aDC, GR_XOR );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int PCB_EDIT_FRAME::Begin_Zone( wxDC* DC )
|
|
||||||
{
|
|
||||||
ZONE_SETTINGS zoneInfo = GetZoneSettings();
|
|
||||||
|
|
||||||
// verify if s_CurrentZone exists (could be deleted since last selection) :
|
|
||||||
int ii;
|
|
||||||
for( ii = 0; ii < GetBoard()->GetAreaCount(); ii++ )
|
|
||||||
{
|
|
||||||
if( s_CurrentZone == GetBoard()->GetArea( ii ) )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ii >= GetBoard()->GetAreaCount() ) // Not found: could be deleted since last selection
|
|
||||||
{
|
|
||||||
s_AddCutoutToCurrentZone = false;
|
|
||||||
s_CurrentZone = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ZONE_CONTAINER* zone = GetBoard()->m_CurrentZoneContour;
|
|
||||||
|
|
||||||
// Verify if a new zone is allowed on this layer:
|
|
||||||
if( zone == NULL )
|
|
||||||
{
|
|
||||||
if( GetToolId() == ID_PCB_KEEPOUT_BUTT && !IsCopperLayer( GetActiveLayer() ) )
|
|
||||||
{
|
|
||||||
DisplayErrorMessage( this,
|
|
||||||
_( "Error: a keepout area is allowed only on copper layers" ) );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no zone contour in progress, a new zone is being created,
|
|
||||||
if( zone == NULL )
|
|
||||||
{
|
|
||||||
zone = GetBoard()->m_CurrentZoneContour = new ZONE_CONTAINER( GetBoard() );
|
|
||||||
zone->SetFlags( IS_NEW );
|
|
||||||
zone->SetTimeStamp( GetNewTimeStamp() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( zone->GetNumCorners() == 0 ) // Start a new contour: init zone params (net, layer ...)
|
|
||||||
{
|
|
||||||
if( !s_CurrentZone ) // A new outline is created, from scratch
|
|
||||||
{
|
|
||||||
int dialogResult;
|
|
||||||
|
|
||||||
// Prompt user for parameters:
|
|
||||||
m_canvas->SetIgnoreMouseEvents( true );
|
|
||||||
|
|
||||||
if( IsCopperLayer( GetActiveLayer() ) )
|
|
||||||
{
|
|
||||||
// Put a zone on a copper layer
|
|
||||||
if( GetBoard()->GetHighLightNetCode() > 0 )
|
|
||||||
{
|
|
||||||
zoneInfo.m_NetcodeSelection = GetBoard()->GetHighLightNetCode();
|
|
||||||
zone->SetNetCode( zoneInfo.m_NetcodeSelection );
|
|
||||||
}
|
|
||||||
|
|
||||||
double tmp = ZONE_THERMAL_RELIEF_GAP_MIL;
|
|
||||||
|
|
||||||
wxConfigBase* cfg = Kiface().KifaceSettings();
|
|
||||||
cfg->Read( ZONE_THERMAL_RELIEF_GAP_STRING_KEY, &tmp );
|
|
||||||
zoneInfo.m_ThermalReliefGap = KiROUND( tmp * IU_PER_MILS);
|
|
||||||
|
|
||||||
tmp = ZONE_THERMAL_RELIEF_COPPER_WIDTH_MIL;
|
|
||||||
cfg->Read( ZONE_THERMAL_RELIEF_COPPER_WIDTH_STRING_KEY, &tmp );
|
|
||||||
zoneInfo.m_ThermalReliefCopperBridge = KiROUND( tmp * IU_PER_MILS );
|
|
||||||
|
|
||||||
tmp = ZONE_CLEARANCE_MIL;
|
|
||||||
cfg->Read( ZONE_CLEARANCE_WIDTH_STRING_KEY, &tmp );
|
|
||||||
zoneInfo.m_ZoneClearance = KiROUND( tmp * IU_PER_MILS );
|
|
||||||
|
|
||||||
tmp = ZONE_THICKNESS_MIL;
|
|
||||||
cfg->Read( ZONE_MIN_THICKNESS_WIDTH_STRING_KEY, &tmp );
|
|
||||||
zoneInfo.m_ZoneMinThickness = KiROUND( tmp * IU_PER_MILS );
|
|
||||||
|
|
||||||
if( GetToolId() == ID_PCB_KEEPOUT_BUTT )
|
|
||||||
{
|
|
||||||
zoneInfo.SetIsKeepout( true );
|
|
||||||
// Netcode, netname and some other settings are irrelevant,
|
|
||||||
// so ensure they are cleared
|
|
||||||
zone->SetNetCode( NETINFO_LIST::UNCONNECTED );
|
|
||||||
zoneInfo.SetCornerSmoothingType( ZONE_SETTINGS::SMOOTHING_NONE );
|
|
||||||
zoneInfo.SetCornerRadius( 0 );
|
|
||||||
|
|
||||||
dialogResult = InvokeKeepoutAreaEditor( this, &zoneInfo );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
zoneInfo.m_CurrentZone_Layer = GetActiveLayer(); // Preselect a layer
|
|
||||||
zoneInfo.SetIsKeepout( false );
|
|
||||||
dialogResult = InvokeCopperZonesEditor( this, &zoneInfo );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // Put a zone on a non copper layer (technical layer)
|
|
||||||
{
|
|
||||||
zoneInfo.m_CurrentZone_Layer = GetActiveLayer(); // Preselect a layer
|
|
||||||
zoneInfo.SetIsKeepout( false );
|
|
||||||
zoneInfo.m_NetcodeSelection = 0; // No net for non copper zones
|
|
||||||
dialogResult = InvokeNonCopperZonesEditor( this, &zoneInfo );
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
m_canvas->SetIgnoreMouseEvents( false );
|
|
||||||
|
|
||||||
if( dialogResult == wxID_CANCEL )
|
|
||||||
{
|
|
||||||
GetBoard()->m_CurrentZoneContour = NULL;
|
|
||||||
delete zone;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Switch active layer to the selected zone layer
|
|
||||||
SetActiveLayer( zoneInfo.m_CurrentZone_Layer );
|
|
||||||
SetZoneSettings( zoneInfo );
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Start a new contour: init zone params (net and layer) from an existing
|
|
||||||
// zone (add cutout or similar zone)
|
|
||||||
|
|
||||||
zoneInfo.m_CurrentZone_Layer = s_CurrentZone->GetLayer();
|
|
||||||
SetActiveLayer( s_CurrentZone->GetLayer() );
|
|
||||||
|
|
||||||
zoneInfo << *s_CurrentZone;
|
|
||||||
|
|
||||||
SetZoneSettings( zoneInfo );
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show the Net for zones on copper layers
|
|
||||||
if( IsCopperLayer( zoneInfo.m_CurrentZone_Layer ) &&
|
|
||||||
!zoneInfo.GetIsKeepout() )
|
|
||||||
{
|
|
||||||
if( s_CurrentZone )
|
|
||||||
{
|
|
||||||
zoneInfo.m_NetcodeSelection = s_CurrentZone->GetNetCode();
|
|
||||||
GetBoard()->SetZoneSettings( zoneInfo );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( GetBoard()->IsHighLightNetON() )
|
|
||||||
{
|
|
||||||
HighLight( DC ); // Remove old highlight selection
|
|
||||||
}
|
|
||||||
|
|
||||||
GetBoard()->SetHighLightNet( zoneInfo.m_NetcodeSelection );
|
|
||||||
HighLight( DC );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !s_AddCutoutToCurrentZone )
|
|
||||||
s_CurrentZone = NULL; // the zone is used only once ("add similar zone" command)
|
|
||||||
}
|
|
||||||
|
|
||||||
// if first segment
|
|
||||||
if( zone->GetNumCorners() == 0 )
|
|
||||||
{
|
|
||||||
zoneInfo.ExportSetting( *zone );
|
|
||||||
|
|
||||||
// A duplicated corner is needed; null segments are removed when the zone is finished.
|
|
||||||
zone->AppendCorner( GetCrossHairPosition(), -1 );
|
|
||||||
// Add the duplicate corner:
|
|
||||||
zone->AppendCorner( GetCrossHairPosition(), -1, true );
|
|
||||||
|
|
||||||
if( Settings().m_legacyDrcOn && (m_drc->DrcOnCreatingZone( zone, 0 ) == BAD_DRC)
|
|
||||||
&& zone->IsOnCopperLayer() )
|
|
||||||
{
|
|
||||||
zone->ClearFlags();
|
|
||||||
zone->RemoveAllContours();
|
|
||||||
|
|
||||||
// use the form of SetCurItem() which does not write to the msg panel,
|
|
||||||
// SCREEN::SetCurItem(), so the DRC error remains on screen.
|
|
||||||
// PCB_EDIT_FRAME::SetCurItem() calls DisplayInfo().
|
|
||||||
GetScreen()->SetCurItem( NULL );
|
|
||||||
DisplayErrorMessage( this, _( "DRC error: this start point is inside or too close another area" ) );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetCurItem( zone );
|
|
||||||
m_canvas->SetMouseCapture( Show_New_Edge_While_Move_Mouse, Abort_Zone_Create_Outline );
|
|
||||||
}
|
|
||||||
else // edge in progress:
|
|
||||||
{
|
|
||||||
ii = zone->GetNumCorners() - 1;
|
|
||||||
|
|
||||||
// edge in progress : the current corner coordinate was set
|
|
||||||
// by Show_New_Edge_While_Move_Mouse
|
|
||||||
if( zone->GetCornerPosition( ii - 1 ) != zone->GetCornerPosition( ii ) )
|
|
||||||
{
|
|
||||||
if( !Settings().m_legacyDrcOn || !zone->IsOnCopperLayer()
|
|
||||||
|| ( m_drc->DrcOnCreatingZone( zone, ii - 1 ) == OK_DRC ) )
|
|
||||||
{
|
|
||||||
// Ok, we can add a new corner
|
|
||||||
if( m_canvas->IsMouseCaptured() )
|
|
||||||
m_canvas->CallMouseCapture( DC, wxPoint(0,0), false );
|
|
||||||
|
|
||||||
// It is necessary to allow duplication of the points, as we have to handle the
|
|
||||||
// continuous drawing while creating the zone at the same time as we build it. Null
|
|
||||||
// segments are removed when the zone is finished, in End_Zone.
|
|
||||||
zone->AppendCorner( GetCrossHairPosition(), -1, true );
|
|
||||||
|
|
||||||
SetCurItem( zone ); // calls DisplayInfo().
|
|
||||||
|
|
||||||
if( m_canvas->IsMouseCaptured() )
|
|
||||||
m_canvas->CallMouseCapture( DC, wxPoint(0,0), false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return zone->GetNumCorners();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool PCB_EDIT_FRAME::End_Zone( wxDC* DC )
|
|
||||||
{
|
|
||||||
ZONE_CONTAINER* zone = GetBoard()->m_CurrentZoneContour;
|
|
||||||
|
|
||||||
if( !zone )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
// Validate the current outline:
|
|
||||||
if( zone->GetNumCorners() <= 2 ) // An outline must have 3 corners or more
|
|
||||||
{
|
|
||||||
Abort_Zone_Create_Outline( m_canvas, DC );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the last corner if is is at the same location as the prevoius corner
|
|
||||||
zone->Outline()->RemoveNullSegments();
|
|
||||||
|
|
||||||
// Validate the current edge:
|
|
||||||
int icorner = zone->GetNumCorners() - 1;
|
|
||||||
if( zone->IsOnCopperLayer() )
|
|
||||||
{
|
|
||||||
if( Settings().m_legacyDrcOn &&
|
|
||||||
m_drc->DrcOnCreatingZone( zone, icorner - 1 ) == BAD_DRC ) // we can't validate last edge
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if( Settings().m_legacyDrcOn &&
|
|
||||||
m_drc->DrcOnCreatingZone( zone, icorner ) == BAD_DRC ) // we can't validate the closing edge
|
|
||||||
{
|
|
||||||
DisplayErrorMessage( this, _( "DRC error: closing this area creates a DRC error with another area" ) );
|
|
||||||
m_canvas->MoveCursorToCrossHair();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
zone->ClearFlags();
|
|
||||||
|
|
||||||
zone->DrawWhileCreateOutline( m_canvas, DC, GR_XOR );
|
|
||||||
|
|
||||||
m_canvas->SetMouseCapture( NULL, NULL );
|
|
||||||
|
|
||||||
// Undraw old drawings, because they can have important changes
|
|
||||||
PCB_LAYER_ID layer = zone->GetLayer();
|
|
||||||
GetBoard()->RedrawAreasOutlines( m_canvas, DC, GR_XOR, layer );
|
|
||||||
GetBoard()->RedrawFilledAreas( m_canvas, DC, GR_XOR, layer );
|
|
||||||
|
|
||||||
// Save initial zones configuration, for undo/redo, before adding new zone
|
|
||||||
s_AuxiliaryList.ClearListAndDeleteItems();
|
|
||||||
s_PickedList.ClearListAndDeleteItems();
|
|
||||||
SaveCopyOfZones(s_PickedList, GetBoard(), zone->GetNetCode(), zone->GetLayer() );
|
|
||||||
|
|
||||||
// Put new zone in list
|
|
||||||
if( !s_CurrentZone )
|
|
||||||
{
|
|
||||||
GetBoard()->Add( zone );
|
|
||||||
|
|
||||||
// Add this zone in picked list, as new item
|
|
||||||
ITEM_PICKER picker( zone, UR_NEW );
|
|
||||||
s_PickedList.PushItem( picker );
|
|
||||||
}
|
|
||||||
else // Append this outline as a cutout to an existing zone
|
|
||||||
{
|
|
||||||
s_CurrentZone->Outline()->AddHole( zone->Outline()->Outline( 0 ) );
|
|
||||||
|
|
||||||
zone->RemoveAllContours(); // All corners are copied in s_CurrentZone. Free corner list.
|
|
||||||
zone = s_CurrentZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
s_AddCutoutToCurrentZone = false;
|
|
||||||
s_CurrentZone = NULL;
|
|
||||||
GetBoard()->m_CurrentZoneContour = NULL;
|
|
||||||
|
|
||||||
GetScreen()->SetCurItem( NULL ); // This outline can be deleted when merging outlines
|
|
||||||
|
|
||||||
// Combine zones if possible :
|
|
||||||
GetBoard()->OnAreaPolygonModified( &s_AuxiliaryList, zone );
|
|
||||||
|
|
||||||
// Redraw the real edge zone :
|
|
||||||
GetBoard()->RedrawAreasOutlines( m_canvas, DC, GR_OR, layer );
|
|
||||||
GetBoard()->RedrawFilledAreas( m_canvas, DC, GR_OR, layer );
|
|
||||||
|
|
||||||
int ii = GetBoard()->GetAreaIndex( zone ); // test if zone exists
|
|
||||||
|
|
||||||
if( ii < 0 )
|
|
||||||
zone = NULL; // was removed by combining zones
|
|
||||||
|
|
||||||
DRC drc( this );
|
|
||||||
int error_count = drc.TestZoneToZoneOutline( zone, true );
|
|
||||||
|
|
||||||
if( error_count )
|
|
||||||
{
|
|
||||||
DisplayErrorMessage( this, _( "Area: DRC outline error" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateCopyOfZonesList( s_PickedList, s_AuxiliaryList, GetBoard() );
|
|
||||||
SaveCopyInUndoList(s_PickedList, UR_UNSPECIFIED);
|
|
||||||
s_PickedList.ClearItemsList(); // s_ItemsListPicker is no more owner of picked items
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Redraws the zone outlines when moving mouse
|
|
||||||
*/
|
|
||||||
static void Show_New_Edge_While_Move_Mouse( EDA_DRAW_PANEL* aPanel, wxDC* aDC,
|
|
||||||
const wxPoint& aPosition, bool aErase )
|
|
||||||
{
|
|
||||||
PCB_EDIT_FRAME* pcbframe = (PCB_EDIT_FRAME*) aPanel->GetParent();
|
|
||||||
wxPoint c_pos = pcbframe->GetCrossHairPosition();
|
|
||||||
ZONE_CONTAINER* zone = pcbframe->GetBoard()->m_CurrentZoneContour;
|
|
||||||
|
|
||||||
if( !zone )
|
|
||||||
return;
|
|
||||||
|
|
||||||
int icorner = zone->GetNumCorners() - 1;
|
|
||||||
|
|
||||||
if( icorner < 1 )
|
|
||||||
return; // We must have 2 (or more) corners
|
|
||||||
|
|
||||||
if( aErase ) // Undraw edge in old position
|
|
||||||
{
|
|
||||||
zone->DrawWhileCreateOutline( aPanel, aDC );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Redraw the current edge in its new position
|
|
||||||
if( pcbframe->GetZoneSettings().m_Zone_45_Only )
|
|
||||||
{
|
|
||||||
// calculate the new position as allowed
|
|
||||||
wxPoint StartPoint = static_cast<wxPoint>( zone->GetCornerPosition( icorner - 1 ) );
|
|
||||||
c_pos = CalculateSegmentEndPoint( c_pos, StartPoint );
|
|
||||||
}
|
|
||||||
|
|
||||||
zone->SetCornerPosition( icorner, c_pos );
|
|
||||||
|
|
||||||
zone->DrawWhileCreateOutline( aPanel, aDC );
|
|
||||||
}
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* aZone )
|
void PCB_EDIT_FRAME::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* aZone )
|
||||||
{
|
{
|
||||||
int dialogResult;
|
int dialogResult;
|
||||||
|
@ -977,35 +167,3 @@ void PCB_EDIT_FRAME::Edit_Zone_Params( wxDC* DC, ZONE_CONTAINER* aZone )
|
||||||
|
|
||||||
s_PickedList.ClearItemsList(); // s_ItemsListPicker is no longer owner of picked items
|
s_PickedList.ClearItemsList(); // s_ItemsListPicker is no longer owner of picked items
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PCB_EDIT_FRAME::Delete_Zone_Contour( wxDC* DC, ZONE_CONTAINER* aZone )
|
|
||||||
{
|
|
||||||
// Get contour in which the selected corner is
|
|
||||||
SHAPE_POLY_SET::VERTEX_INDEX indices;
|
|
||||||
|
|
||||||
// If the selected corner does not exist, abort
|
|
||||||
if( !aZone->Outline()->GetRelativeIndices( aZone->GetSelectedCorner(), &indices ) )
|
|
||||||
throw( std::out_of_range( "Zone selected corner does not exist" ) );
|
|
||||||
|
|
||||||
EDA_RECT dirty = aZone->GetBoundingBox();
|
|
||||||
|
|
||||||
// Remove current filling:
|
|
||||||
aZone->UnFill();
|
|
||||||
|
|
||||||
if( indices.m_contour == 0 ) // This is the main outline: remove all
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( aZone, UR_DELETED );
|
|
||||||
GetBoard()->Remove( aZone );
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SaveCopyInUndoList( aZone, UR_CHANGED );
|
|
||||||
aZone->Outline()->RemoveContour( indices.m_contour, indices.m_polygon );
|
|
||||||
}
|
|
||||||
|
|
||||||
m_canvas->RefreshDrawingRect( dirty );
|
|
||||||
|
|
||||||
OnModify();
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue