KiCad PCB EDA Suite
sch_edit_tool.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2019 CERN
5  * Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
25 #include <tool/picker_tool.h>
26 #include <tools/sch_edit_tool.h>
29 #include <tools/sch_move_tool.h>
30 #include <ee_actions.h>
31 #include <bitmaps.h>
32 #include <confirm.h>
33 #include <base_struct.h>
34 #include <sch_item.h>
35 #include <sch_component.h>
36 #include <sch_sheet.h>
37 #include <sch_text.h>
38 #include <sch_bitmap.h>
39 #include <sch_view.h>
40 #include <sch_line.h>
41 #include <sch_bus_entry.h>
42 #include <sch_edit_frame.h>
43 #include <eeschema_id.h>
44 #include <status_popup.h>
45 #include <wx/gdicmn.h>
46 #include <invoke_sch_dialog.h>
52 #include "sch_drawing_tools.h"
53 
54 
56 
57 
59 {
60 public:
62  ACTION_MENU( true )
63  {
64  SetIcon( component_select_unit_xpm );
65  SetTitle( _( "Symbol Unit" ) );
66  }
67 
68 protected:
69  ACTION_MENU* create() const override
70  {
71  return new SYMBOL_UNIT_MENU();
72  }
73 
74 private:
75  void update() override
76  {
78  EE_SELECTION& selection = selTool->GetSelection();
79  SCH_COMPONENT* component = dynamic_cast<SCH_COMPONENT*>( selection.Front() );
80 
81  Clear();
82 
83  if( !component )
84  {
85  Append( ID_POPUP_SCH_UNFOLD_BUS, _( "no symbol selected" ), wxEmptyString );
86  Enable( ID_POPUP_SCH_UNFOLD_BUS, false );
87  return;
88  }
89 
90  int unit = component->GetUnit();
91  auto partRef = component->GetPartRef().lock();
92 
93  if( !partRef || partRef->GetUnitCount() < 2 )
94  {
95  Append( ID_POPUP_SCH_UNFOLD_BUS, _( "symbol is not multi-unit" ), wxEmptyString );
96  Enable( ID_POPUP_SCH_UNFOLD_BUS, false );
97  return;
98  }
99 
100  for( int ii = 0; ii < partRef->GetUnitCount(); ii++ )
101  {
102  wxString num_unit;
103  num_unit.Printf( _( "Unit %s" ), LIB_PART::SubReference( ii + 1, false ) );
104 
105  wxMenuItem * item = Append( ID_POPUP_SCH_SELECT_UNIT1 + ii, num_unit, wxEmptyString,
106  wxITEM_CHECK );
107  if( unit == ii + 1 )
108  item->Check(true);
109 
110  // The ID max for these submenus is ID_POPUP_SCH_SELECT_UNIT_CMP_MAX
111  // See eeschema_id to modify this value.
113  break; // We have used all IDs for these submenus
114  }
115  }
116 };
117 
118 
120  EE_TOOL_BASE<SCH_EDIT_FRAME>( "eeschema.InteractiveEdit" )
121 {
122 }
123 
124 
126 
128 {
130 
133 
134  wxASSERT_MSG( drawingTools, "eeshema.InteractiveDrawing tool is not available" );
135 
136  auto sheetTool = [ this ] ( const SELECTION& aSel ) {
138  };
139 
140  auto anyTextTool = [ this ] ( const SELECTION& aSel ) {
145  };
146 
147  auto duplicateCondition = [] ( const SELECTION& aSel ) {
149  return false;
150 
151  return true;
152  };
153 
154  auto orientCondition = [] ( const SELECTION& aSel ) {
155  if( aSel.Empty() )
156  return false;
157 
159  return false;
160 
161  SCH_ITEM* item = (SCH_ITEM*) aSel.Front();
162 
163  if( aSel.GetSize() > 1 )
164  return true;
165 
166  switch( item->Type() )
167  {
168  case SCH_MARKER_T:
169  case SCH_JUNCTION_T:
170  case SCH_NO_CONNECT_T:
171  case SCH_LINE_T:
172  case SCH_PIN_T:
173  return false;
174  default:
175  return true;
176  }
177  };
178 
179  auto propertiesCondition = [] ( const SELECTION& aSel ) {
180  if( aSel.GetSize() != 1 )
181  return false;
182 
183  switch( static_cast<EDA_ITEM*>( aSel.Front() )->Type() )
184  {
185  case SCH_MARKER_T:
186  case SCH_JUNCTION_T:
187  case SCH_NO_CONNECT_T:
189  case SCH_BUS_BUS_ENTRY_T:
190  case SCH_LINE_T:
191  case SCH_SHEET_PIN_T:
192  case SCH_PIN_T:
193  return false;
194  default:
195  return true;
196  }
197  };
198 
199  static KICAD_T toLabelTypes[] = { SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T, SCH_TEXT_T, EOT };
200  auto toLabelCondition = E_C::Count( 1 ) && E_C::OnlyTypes( toLabelTypes );
201 
202  static KICAD_T toHLableTypes[] = { SCH_LABEL_T, SCH_GLOBAL_LABEL_T, SCH_TEXT_T, EOT };
203  auto toHLabelCondition = E_C::Count( 1 ) && E_C::OnlyTypes( toHLableTypes );
204 
205  static KICAD_T toGLableTypes[] = { SCH_LABEL_T, SCH_HIER_LABEL_T, SCH_TEXT_T, EOT };
206  auto toGLabelCondition = E_C::Count( 1 ) && E_C::OnlyTypes( toGLableTypes );
207 
208  static KICAD_T toTextTypes[] = { SCH_LABEL_T, SCH_GLOBAL_LABEL_T, SCH_HIER_LABEL_T, EOT };
209  auto toTextlCondition = E_C::Count( 1 ) && E_C::OnlyTypes( toTextTypes );
210 
211  static KICAD_T entryTypes[] = { SCH_BUS_WIRE_ENTRY_T, SCH_BUS_BUS_ENTRY_T, EOT };
212  auto entryCondition = E_C::MoreThan( 0 ) && E_C::OnlyTypes( entryTypes );
213 
214  auto singleComponentCondition = E_C::Count( 1 ) && E_C::OnlyType( SCH_COMPONENT_T );
215  auto wireSelectionCondition = E_C::MoreThan( 0 ) && E_C::OnlyType( SCH_LINE_LOCATE_WIRE_T );
216  auto busSelectionCondition = E_C::MoreThan( 0 ) && E_C::OnlyType( SCH_LINE_LOCATE_BUS_T );
217  auto singleSheetCondition = E_C::Count( 1 ) && E_C::OnlyType( SCH_SHEET_T );
218 
219  //
220  // Add edit actions to the move tool menu
221  //
222  if( moveTool )
223  {
224  CONDITIONAL_MENU& moveMenu = moveTool->GetToolMenu().GetMenu();
225 
226  moveMenu.AddSeparator();
227  moveMenu.AddItem( EE_ACTIONS::rotateCCW, orientCondition );
228  moveMenu.AddItem( EE_ACTIONS::rotateCW, orientCondition );
229  moveMenu.AddItem( EE_ACTIONS::mirrorX, orientCondition );
230  moveMenu.AddItem( EE_ACTIONS::mirrorY, orientCondition );
232 
233  moveMenu.AddItem( EE_ACTIONS::properties, propertiesCondition );
234  moveMenu.AddItem( EE_ACTIONS::editReference, singleComponentCondition );
235  moveMenu.AddItem( EE_ACTIONS::editValue, singleComponentCondition );
236  moveMenu.AddItem( EE_ACTIONS::editFootprint, singleComponentCondition );
238 
239  std::shared_ptr<SYMBOL_UNIT_MENU> symUnitMenu = std::make_shared<SYMBOL_UNIT_MENU>();
240  symUnitMenu->SetTool( this );
241  m_menu.AddSubMenu( symUnitMenu );
242  moveMenu.AddMenu( symUnitMenu.get(), E_C::SingleMultiUnitSymbol, 1 );
243 
244  moveMenu.AddSeparator();
247  moveMenu.AddItem( ACTIONS::duplicate, duplicateCondition );
248  }
249 
250  //
251  // Add editing actions to the drawing tool menu
252  //
253  CONDITIONAL_MENU& drawMenu = drawingTools->GetToolMenu().GetMenu();
254 
255  drawMenu.AddItem( EE_ACTIONS::rotateCCW, orientCondition, 200 );
256  drawMenu.AddItem( EE_ACTIONS::rotateCW, orientCondition, 200 );
257  drawMenu.AddItem( EE_ACTIONS::mirrorX, orientCondition, 200 );
258  drawMenu.AddItem( EE_ACTIONS::mirrorY, orientCondition, 200 );
259 
260  drawMenu.AddItem( EE_ACTIONS::properties, propertiesCondition, 200 );
261  drawMenu.AddItem( EE_ACTIONS::editReference, singleComponentCondition, 200 );
262  drawMenu.AddItem( EE_ACTIONS::editValue, singleComponentCondition, 200 );
263  drawMenu.AddItem( EE_ACTIONS::editFootprint, singleComponentCondition, 200 );
264  drawMenu.AddItem( EE_ACTIONS::autoplaceFields, singleComponentCondition, 200 );
266 
267  std::shared_ptr<SYMBOL_UNIT_MENU> symUnitMenu2 = std::make_shared<SYMBOL_UNIT_MENU>();
268  symUnitMenu2->SetTool( drawingTools );
269  drawingTools->GetToolMenu().AddSubMenu( symUnitMenu2 );
270  drawMenu.AddMenu( symUnitMenu2.get(), E_C::SingleMultiUnitSymbol, 1 );
271 
272  drawMenu.AddItem( EE_ACTIONS::editWithLibEdit, singleComponentCondition && E_C::Idle, 200 );
273 
274  drawMenu.AddItem( EE_ACTIONS::toShapeSlash, entryCondition, 200 );
275  drawMenu.AddItem( EE_ACTIONS::toShapeBackslash, entryCondition, 200 );
276  drawMenu.AddItem( EE_ACTIONS::toLabel, anyTextTool && E_C::Idle, 200 );
277  drawMenu.AddItem( EE_ACTIONS::toHLabel, anyTextTool && E_C::Idle, 200 );
278  drawMenu.AddItem( EE_ACTIONS::toGLabel, anyTextTool && E_C::Idle, 200 );
279  drawMenu.AddItem( EE_ACTIONS::toText, anyTextTool && E_C::Idle, 200 );
280  drawMenu.AddItem( EE_ACTIONS::cleanupSheetPins, sheetTool && E_C::Idle, 250 );
281 
282  //
283  // Add editing actions to the selection tool menu
284  //
286 
287  selToolMenu.AddItem( EE_ACTIONS::rotateCCW, orientCondition, 200 );
288  selToolMenu.AddItem( EE_ACTIONS::rotateCW, orientCondition, 200 );
289  selToolMenu.AddItem( EE_ACTIONS::mirrorX, orientCondition, 200 );
290  selToolMenu.AddItem( EE_ACTIONS::mirrorY, orientCondition, 200 );
291  selToolMenu.AddItem( ACTIONS::doDelete, E_C::NotEmpty, 200 );
292 
293  selToolMenu.AddItem( EE_ACTIONS::properties, propertiesCondition, 200 );
295  selToolMenu.AddItem( EE_ACTIONS::editValue, E_C::SingleSymbol, 200 );
297  selToolMenu.AddItem( EE_ACTIONS::autoplaceFields, singleComponentCondition, 200 );
299 
300  std::shared_ptr<SYMBOL_UNIT_MENU> symUnitMenu3 = std::make_shared<SYMBOL_UNIT_MENU>();
301  symUnitMenu3->SetTool( m_selectionTool );
302  m_selectionTool->GetToolMenu().AddSubMenu( symUnitMenu3 );
303  selToolMenu.AddMenu( symUnitMenu3.get(), E_C::SingleMultiUnitSymbol, 1 );
304 
305  selToolMenu.AddItem( EE_ACTIONS::editWithLibEdit, singleComponentCondition && E_C::Idle, 200 );
306 
307  selToolMenu.AddItem( EE_ACTIONS::toShapeSlash, entryCondition, 200 );
308  selToolMenu.AddItem( EE_ACTIONS::toShapeBackslash, entryCondition, 200 );
309  selToolMenu.AddItem( EE_ACTIONS::toLabel, toLabelCondition, 200 );
310  selToolMenu.AddItem( EE_ACTIONS::toHLabel, toHLabelCondition, 200 );
311  selToolMenu.AddItem( EE_ACTIONS::toGLabel, toGLabelCondition, 200 );
312  selToolMenu.AddItem( EE_ACTIONS::toText, toTextlCondition, 200 );
313  selToolMenu.AddItem( EE_ACTIONS::cleanupSheetPins, singleSheetCondition, 250 );
314 
315  selToolMenu.AddSeparator( 300 );
316  selToolMenu.AddItem( ACTIONS::cut, E_C::IdleSelection, 300 );
317  selToolMenu.AddItem( ACTIONS::copy, E_C::IdleSelection, 300 );
318  selToolMenu.AddItem( ACTIONS::paste, E_C::Idle, 300 );
319  selToolMenu.AddItem( ACTIONS::duplicate, duplicateCondition, 300 );
320 
321  return true;
322 }
323 
324 
326  SCH_TEXT_T,
327  SCH_LABEL_T,
330  SCH_FIELD_T,
333  SCH_SHEET_T,
334  SCH_BITMAP_T,
337  SCH_LINE_T,
339  EOT
340 };
341 
342 
343 int SCH_EDIT_TOOL::Rotate( const TOOL_EVENT& aEvent )
344 {
346 
347  if( selection.GetSize() == 0 )
348  return 0;
349 
350  wxPoint rotPoint;
351  bool clockwise = ( aEvent.Matches( EE_ACTIONS::rotateCW.MakeEvent() ) );
352  SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.Front() );
353  bool connections = false;
354  bool moving = item->IsMoving();
355 
356  if( selection.GetSize() == 1 )
357  {
358  if( !moving )
360 
361  for( int i = 0; clockwise ? i < 1 : i < 3; ++i )
362  {
363  switch( item->Type() )
364  {
365  case SCH_COMPONENT_T:
366  {
367  SCH_COMPONENT* component = static_cast<SCH_COMPONENT*>( item );
368 
369  if( clockwise )
370  component->SetOrientation( CMP_ROTATE_CLOCKWISE );
371  else
373 
374  if( m_frame->GetAutoplaceFields() )
375  component->AutoAutoplaceFields( m_frame->GetScreen() );
376 
377  break;
378  }
379 
380  case SCH_TEXT_T:
381  case SCH_LABEL_T:
382  case SCH_GLOBAL_LABEL_T:
383  case SCH_HIER_LABEL_T:
384  {
385  SCH_TEXT* textItem = static_cast<SCH_TEXT*>( item );
386  textItem->SetLabelSpinStyle( ( textItem->GetLabelSpinStyle() + 1 ) & 3 );
387  break;
388  }
389 
390  case SCH_SHEET_PIN_T:
391  {
392  // Rotate pin within parent sheet
393  SCH_SHEET_PIN* pin = static_cast<SCH_SHEET_PIN*>( item );
394  SCH_SHEET* sheet = pin->GetParent();
395  pin->Rotate( sheet->GetBoundingBox().GetCenter() );
396  break;
397  }
398 
399  case SCH_BUS_BUS_ENTRY_T:
401  item->Rotate( item->GetPosition() );
402  break;
403 
404  case SCH_FIELD_T:
405  {
406  SCH_FIELD* field = static_cast<SCH_FIELD*>( item );
407 
408  if( field->GetTextAngle() == TEXT_ANGLE_HORIZ )
409  field->SetTextAngle( TEXT_ANGLE_VERT );
410  else
411  field->SetTextAngle( TEXT_ANGLE_HORIZ );
412 
413  // Now that we're moving a field, they're no longer autoplaced.
414  if( item->GetParent()->Type() == SCH_COMPONENT_T )
415  {
416  SCH_COMPONENT *parent = static_cast<SCH_COMPONENT*>( item->GetParent() );
417  parent->ClearFieldsAutoplaced();
418  }
419 
420  break;
421  }
422 
423  case SCH_BITMAP_T:
424  item->Rotate( item->GetPosition() );
425  // The bitmap is cached in Opengl: clear the cache to redraw
427  break;
428 
429  case SCH_SHEET_T:
430  // Rotate the sheet on itself. Sheets do not have an anchor point.
431  rotPoint = m_frame->GetNearestGridPosition( item->GetBoundingBox().Centre() );
432  item->Rotate( rotPoint );
433  break;
434 
435  default:
436  break;
437  }
438  }
439 
440  connections = item->IsConnectable();
441  m_frame->RefreshItem( item );
442  }
443  else if( selection.GetSize() > 1 )
444  {
445  rotPoint = m_frame->GetNearestGridPosition( (wxPoint)selection.GetCenter() );
446 
447  for( unsigned ii = 0; ii < selection.GetSize(); ii++ )
448  {
449  item = static_cast<SCH_ITEM*>( selection.GetItem( ii ) );
450 
451  if( !moving )
452  saveCopyInUndoList( item, UR_CHANGED, ii > 0 );
453 
454  for( int i = 0; clockwise ? i < 1 : i < 3; ++i )
455  {
456  if( item->Type() == SCH_LINE_T )
457  {
458  SCH_LINE* line = (SCH_LINE*) item;
459 
460  if( item->GetFlags() & STARTPOINT )
461  line->RotateStart( rotPoint );
462 
463  if( item->GetFlags() & ENDPOINT )
464  line->RotateEnd( rotPoint );
465  }
466  else if( item->Type() == SCH_SHEET_PIN_T )
467  {
468  if( item->GetParent()->IsSelected() )
469  {
470  // parent will rotate us
471  }
472  else
473  {
474  // rotate within parent
475  SCH_SHEET_PIN* pin = static_cast<SCH_SHEET_PIN*>( item );
476  SCH_SHEET* sheet = pin->GetParent();
477 
478  pin->Rotate( sheet->GetBoundingBox().GetCenter() );
479  }
480  }
481  else
482  {
483  item->Rotate( rotPoint );
484  }
485  }
486 
487  connections |= item->IsConnectable();
488  m_frame->RefreshItem( item );
489  }
490  }
491 
493 
494  if( item->IsMoving() )
495  {
497  }
498  else
499  {
500  if( selection.IsHover() )
502 
503  if( connections )
505 
506  m_frame->OnModify();
507  }
508 
509  return 0;
510 }
511 
512 
513 int SCH_EDIT_TOOL::Mirror( const TOOL_EVENT& aEvent )
514 {
516 
517  if( selection.GetSize() == 0 )
518  return 0;
519 
520  wxPoint mirrorPoint;
521  bool xAxis = ( aEvent.Matches( EE_ACTIONS::mirrorX.MakeEvent() ) );
522  SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.Front() );
523  bool connections = false;
524  bool moving = item->IsMoving();
525 
526  if( selection.GetSize() == 1 )
527  {
528  if( !moving )
530 
531  switch( item->Type() )
532  {
533  case SCH_COMPONENT_T:
534  {
535  SCH_COMPONENT* component = static_cast<SCH_COMPONENT*>( item );
536 
537  if( xAxis )
538  component->SetOrientation( CMP_MIRROR_X );
539  else
540  component->SetOrientation( CMP_MIRROR_Y );
541 
542  if( m_frame->GetAutoplaceFields() )
543  component->AutoAutoplaceFields( m_frame->GetScreen() );
544 
545  break;
546  }
547 
548  case SCH_TEXT_T:
549  case SCH_LABEL_T:
550  case SCH_GLOBAL_LABEL_T:
551  case SCH_HIER_LABEL_T:
552  {
553  SCH_TEXT* textItem = static_cast<SCH_TEXT*>( item );
554  int spin = textItem->GetLabelSpinStyle();
555 
556  if( xAxis && spin % 2 )
557  textItem->SetLabelSpinStyle( ( spin + 2 ) % 4 );
558  else if ( !xAxis && !( spin % 2 ) )
559  textItem->SetLabelSpinStyle( ( spin + 2 ) % 4 );
560  break;
561  }
562 
563  case SCH_SHEET_PIN_T:
564  {
565  // mirror within parent sheet
566  SCH_SHEET_PIN* pin = static_cast<SCH_SHEET_PIN*>( item );
567  SCH_SHEET* sheet = pin->GetParent();
568 
569  if( xAxis )
570  pin->MirrorX( sheet->GetBoundingBox().GetCenter().y );
571  else
572  pin->MirrorY( sheet->GetBoundingBox().GetCenter().x );
573 
574  break;
575  }
576 
577  case SCH_BUS_BUS_ENTRY_T:
579  if( xAxis )
580  item->MirrorX( item->GetPosition().y );
581  else
582  item->MirrorY( item->GetPosition().x );
583  break;
584 
585  case SCH_FIELD_T:
586  {
587  SCH_FIELD* field = static_cast<SCH_FIELD*>( item );
588 
589  if( xAxis )
591  else
593 
594  // Now that we're re-justifying a field, they're no longer autoplaced.
595  if( item->GetParent()->Type() == SCH_COMPONENT_T )
596  {
597  SCH_COMPONENT *parent = static_cast<SCH_COMPONENT*>( item->GetParent() );
598  parent->ClearFieldsAutoplaced();
599  }
600 
601  break;
602  }
603 
604  case SCH_BITMAP_T:
605  if( xAxis )
606  item->MirrorX( item->GetPosition().y );
607  else
608  item->MirrorY( item->GetPosition().x );
609 
610  // The bitmap is cached in Opengl: clear the cache to redraw
612  break;
613 
614  case SCH_SHEET_T:
615  // Mirror the sheet on itself. Sheets do not have a anchor point.
616  mirrorPoint = m_frame->GetNearestGridPosition( item->GetBoundingBox().Centre() );
617 
618  if( xAxis )
619  item->MirrorX( mirrorPoint.y );
620  else
621  item->MirrorY( mirrorPoint.x );
622 
623  break;
624 
625  default:
626  break;
627  }
628 
629  connections = item->IsConnectable();
630  m_frame->RefreshItem( item );
631  }
632  else if( selection.GetSize() > 1 )
633  {
634  mirrorPoint = (wxPoint)selection.GetReferencePoint();
635 
636  for( unsigned ii = 0; ii < selection.GetSize(); ii++ )
637  {
638  item = static_cast<SCH_ITEM*>( selection.GetItem( ii ) );
639 
640  if( !moving )
641  saveCopyInUndoList( item, UR_CHANGED, ii > 0 );
642 
643  if( item->Type() == SCH_SHEET_PIN_T )
644  {
645  if( item->GetParent()->IsSelected() )
646  {
647  // parent will mirror us
648  }
649  else
650  {
651  // mirror within parent sheet
652  SCH_SHEET_PIN* pin = static_cast<SCH_SHEET_PIN*>( item );
653  SCH_SHEET* sheet = pin->GetParent();
654 
655  if( xAxis )
656  pin->MirrorX( sheet->GetBoundingBox().GetCenter().y );
657  else
658  pin->MirrorY( sheet->GetBoundingBox().GetCenter().x );
659  }
660  }
661  else
662  {
663  if( xAxis )
664  item->MirrorX( mirrorPoint.y );
665  else
666  item->MirrorY( mirrorPoint.x );
667  }
668 
669  connections |= item->IsConnectable();
670  m_frame->RefreshItem( item );
671  }
672  }
673 
675 
676  if( item->IsMoving() )
677  {
679  }
680  else
681  {
682  if( selection.IsHover() )
684 
685  if( connections )
687 
688  m_frame->OnModify();
689  }
690 
691  return 0;
692 }
693 
694 
696 {
698  SCH_LINE_T,
701  SCH_TEXT_T,
702  SCH_LABEL_T,
706  SCH_SHEET_T,
708  EOT
709 };
710 
711 
713 {
715 
716  if( selection.GetSize() == 0 )
717  return 0;
718 
719  // Doing a duplicate of a new object doesn't really make any sense; we'd just end
720  // up dragging around a stack of objects...
721  if( selection.Front()->IsNew() )
722  return 0;
723 
724  EDA_ITEMS newItems;
725 
726  // Keep track of existing sheet paths. Duplicating a selection can modify this list
727  bool copiedSheets = false;
728  SCH_SHEET_LIST initial_sheetpathList( g_RootSheet );
729 
730  for( unsigned ii = 0; ii < selection.GetSize(); ++ii )
731  {
732  SCH_ITEM* oldItem = static_cast<SCH_ITEM*>( selection.GetItem( ii ) );
733  SCH_ITEM* newItem = oldItem->Duplicate();
734  newItem->SetFlags( IS_NEW );
735  newItems.push_back( newItem );
736  saveCopyInUndoList( newItem, UR_NEW, ii > 0 );
737 
738  switch( newItem->Type() )
739  {
740  case SCH_JUNCTION_T:
741  case SCH_LINE_T:
742  case SCH_BUS_BUS_ENTRY_T:
744  case SCH_TEXT_T:
745  case SCH_LABEL_T:
746  case SCH_GLOBAL_LABEL_T:
747  case SCH_HIER_LABEL_T:
748  case SCH_NO_CONNECT_T:
749  newItem->SetParent( m_frame->GetScreen() );
750  m_frame->AddToScreen( newItem );
751  break;
752 
753  case SCH_SHEET_T:
754  {
755  SCH_SHEET* sheet = (SCH_SHEET*) newItem;
756  // Duplicate sheet names and sheet time stamps are not valid. Use a time stamp
757  // based sheet name and update the time stamp for each sheet in the block.
758  timestamp_t timeStamp = GetNewTimeStamp();
759 
760  sheet->SetName( wxString::Format( wxT( "sheet%8.8lX" ), (unsigned long)timeStamp ) );
761  sheet->SetTimeStamp( timeStamp );
762 
763  sheet->SetParent( m_frame->GetScreen() );
764  m_frame->AddToScreen( sheet );
765 
766  copiedSheets = true;
767  break;
768  }
769 
770  case SCH_COMPONENT_T:
771  {
772  SCH_COMPONENT* component = (SCH_COMPONENT*) newItem;
773 
774  component->SetTimeStamp( GetNewTimeStamp() );
775  component->ClearAnnotation( NULL );
776 
777  component->SetParent( m_frame->GetScreen() );
778  m_frame->AddToScreen( component );
779  break;
780  }
781 
782  default:
783  break;
784  }
785  }
786 
787  if( copiedSheets )
788  {
789  // We clear annotation of new sheet paths.
790  // Annotation of new components added in current sheet is already cleared.
791  SCH_SCREENS screensList( g_RootSheet );
792  screensList.ClearAnnotationOfNewSheetPaths( initial_sheetpathList );
794  }
795 
797  m_toolMgr->RunAction( EE_ACTIONS::addItemsToSel, true, &newItems );
799 
800  return 0;
801 }
802 
803 
805 {
806  SCH_ITEM* sourceItem = m_frame->GetRepeatItem();
807 
808  if( !sourceItem )
809  return 0;
810 
812 
813  SCH_ITEM* newItem = (SCH_ITEM*) sourceItem->Clone();
814  bool performDrag = false;
815 
816  // If cloning a component then put into 'move' mode.
817  if( newItem->Type() == SCH_COMPONENT_T )
818  {
819  ( (SCH_COMPONENT*) newItem )->SetTimeStamp( GetNewTimeStamp() );
820 
821  wxPoint cursorPos = (wxPoint) getViewControls()->GetCursorPosition( true );
822  newItem->Move( cursorPos - newItem->GetPosition() );
823  performDrag = true;
824  }
825  else
826  {
827  if( newItem->CanIncrementLabel() )
828  ( (SCH_TEXT*) newItem )->IncrementLabel( m_frame->GetRepeatDeltaLabel() );
829 
830  newItem->Move( m_frame->GetRepeatStep() );
831  }
832 
833  newItem->SetFlags( IS_NEW );
834  m_frame->AddToScreen( newItem );
835  m_frame->SaveCopyInUndoList( newItem, UR_NEW );
836 
837  m_selectionTool->AddItemToSel( newItem );
838 
839  if( performDrag )
841 
842  newItem->ClearFlags();
843 
844  if( newItem->IsConnectable() )
845  {
846  auto selection = m_selectionTool->GetSelection();
847 
848  m_toolMgr->RunAction( EE_ACTIONS::addNeededJunctions, true, &selection );
851  }
852 
853  // newItem newItem, now that it has been moved, thus saving new position.
854  m_frame->SaveCopyForRepeatItem( newItem );
855 
856  return 0;
857 }
858 
859 
861 {
862  SCH_MARKER_T,
864  SCH_LINE_T,
867  SCH_TEXT_T,
868  SCH_LABEL_T,
872  SCH_SHEET_T,
875  SCH_BITMAP_T,
876  EOT
877 };
878 
879 
881 {
882  SCH_SCREEN* screen = m_frame->GetScreen();
884  bool appendToUndo = false;
885  std::vector<wxPoint> pts;
886 
887  if( items.empty() )
888  return 0;
889 
890  // Don't leave a freed pointer in the selection
892 
893  for( EDA_ITEM* item : items )
894  item->ClearFlags( STRUCT_DELETED );
895 
896  for( EDA_ITEM* item : items )
897  {
898  if( item->Type() == SCH_JUNCTION_T )
899  {
900  // clean up junctions at the end
901  }
902  else
903  {
904  item->SetFlags( STRUCT_DELETED );
905  saveCopyInUndoList( item, UR_DELETED, appendToUndo );
906  appendToUndo = true;
907 
908  SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( item );
909 
910  if( sch_item && sch_item->IsConnectable() )
911  sch_item->GetConnectionPoints( pts );
912 
913  updateView( item );
914 
915  if( item->Type() == SCH_SHEET_PIN_T )
916  static_cast<SCH_SHEET*>( item->GetParent() )->RemovePin( (SCH_SHEET_PIN*) item );
917  else
918  m_frame->RemoveFromScreen( item );
919  }
920  }
921 
922  for( auto point : pts )
923  {
924  SCH_ITEM* junction = screen->GetItem( point, 0, SCH_JUNCTION_T );
925  if( junction && !screen->IsJunctionNeeded( point ) )
926  m_frame->DeleteJunction( junction, appendToUndo );
927  }
928 
930 
931  m_frame->GetCanvas()->Refresh();
932  m_frame->OnModify();
933 
934  return 0;
935 }
936 
937 
938 #define HITTEST_THRESHOLD_PIXELS 5
939 
940 
942 {
943  std::string tool = aEvent.GetCommandStr().get();
945 
947  m_pickerItem = nullptr;
948 
949  // Deactivate other tools; particularly important if another PICKER is currently running
950  Activate();
951 
952  picker->SetCursor( wxStockCursor( wxCURSOR_BULLSEYE ) );
953 
954  picker->SetClickHandler(
955  [this] ( const VECTOR2D& aPosition ) -> bool
956  {
957  if( m_pickerItem )
958  {
959  SCH_ITEM* sch_item = dynamic_cast<SCH_ITEM*>( m_pickerItem );
960 
961  if( sch_item && sch_item->IsLocked() )
962  {
963  STATUS_TEXT_POPUP statusPopup( m_frame );
964  statusPopup.SetText( _( "Item locked." ) );
965  statusPopup.PopupFor( 2000 );
966  statusPopup.Move( wxGetMousePosition() + wxPoint( 20, 20 ) );
967  return true;
968  }
969 
971  selectionTool->UnbrightenItem( m_pickerItem );
972  selectionTool->AddItemToSel( m_pickerItem, true );
974  m_pickerItem = nullptr;
975  }
976 
977  return true;
978  } );
979 
980  picker->SetMotionHandler(
981  [this] ( const VECTOR2D& aPos )
982  {
983  EE_COLLECTOR collector;
984  collector.m_Threshold = KiROUND( getView()->ToWorld( HITTEST_THRESHOLD_PIXELS ) );
985  collector.Collect( m_frame->GetScreen()->GetDrawItems(), deletableItems, (wxPoint) aPos );
986 
988  selectionTool->GuessSelectionCandidates( collector, aPos );
989 
990  EDA_ITEM* item = collector.GetCount() == 1 ? collector[ 0 ] : nullptr;
991 
992  if( m_pickerItem != item )
993  {
994  if( m_pickerItem )
995  selectionTool->UnbrightenItem( m_pickerItem );
996 
997  m_pickerItem = item;
998 
999  if( m_pickerItem )
1000  selectionTool->BrightenItem( m_pickerItem );
1001  }
1002  } );
1003 
1004  picker->SetFinalizeHandler(
1005  [this] ( const int& aFinalState )
1006  {
1007  if( m_pickerItem )
1009  } );
1010 
1011  m_toolMgr->RunAction( ACTIONS::pickerTool, true, &tool );
1012 
1013  return 0;
1014 }
1015 
1016 
1018 {
1019  SCH_COMPONENT* component = (SCH_COMPONENT*) aField->GetParent();
1020 
1021  // Save old component in undo list if not already in edit, or moving.
1022  if( aField->GetEditFlags() == 0 ) // i.e. not edited, or moved
1023  m_frame->SaveCopyInUndoList( component, UR_CHANGED );
1024 
1025  wxString title = wxString::Format( _( "Edit %s Field" ), aField->GetName() );
1026 
1027  DIALOG_SCH_EDIT_ONE_FIELD dlg( m_frame, title, aField );
1028 
1029  // The footprint field dialog can invoke a KIWAY_PLAYER so we must use a quasi-modal
1030  if( dlg.ShowQuasiModal() != wxID_OK )
1031  return;
1032 
1033  dlg.UpdateField( aField, g_CurrentSheet );
1034 
1035  if( m_frame->GetAutoplaceFields() )
1036  component->AutoAutoplaceFields( m_frame->GetScreen() );
1037 
1039  m_frame->RefreshItem( aField );
1040  m_frame->OnModify();
1041 }
1042 
1043 
1045 {
1046  static KICAD_T Nothing[] = { EOT };
1047  static KICAD_T CmpOrReference[] = { SCH_FIELD_LOCATE_REFERENCE_T, SCH_COMPONENT_T, EOT };
1048  static KICAD_T CmpOrValue[] = { SCH_FIELD_LOCATE_VALUE_T, SCH_COMPONENT_T, EOT };
1049  static KICAD_T CmpOrFootprint[] = { SCH_FIELD_LOCATE_FOOTPRINT_T, SCH_COMPONENT_T, EOT };
1050 
1051  KICAD_T* filter = Nothing;
1052 
1053  if( aEvent.IsAction( &EE_ACTIONS::editReference ) )
1054  filter = CmpOrReference;
1055  else if( aEvent.IsAction( &EE_ACTIONS::editValue ) )
1056  filter = CmpOrValue;
1057  else if( aEvent.IsAction( &EE_ACTIONS::editFootprint ) )
1058  filter = CmpOrFootprint;
1059 
1060  EE_SELECTION& selection = m_selectionTool->RequestSelection( filter );
1061 
1062  if( selection.Empty() )
1063  return 0;
1064 
1065  SCH_ITEM* item = (SCH_ITEM*) selection.Front();
1066 
1067  if( item->Type() == SCH_COMPONENT_T )
1068  {
1069  SCH_COMPONENT* component = (SCH_COMPONENT*) item;
1070 
1071  if( aEvent.IsAction( &EE_ACTIONS::editReference ) )
1072  editComponentFieldText( component->GetField( REFERENCE ) );
1073  else if( aEvent.IsAction( &EE_ACTIONS::editValue ) )
1074  editComponentFieldText( component->GetField( VALUE ) );
1075  else if( aEvent.IsAction( &EE_ACTIONS::editFootprint ) )
1076  editComponentFieldText( component->GetField( FOOTPRINT ) );
1077  }
1078  else if( item->Type() == SCH_FIELD_T )
1079  {
1080  editComponentFieldText( (SCH_FIELD*) item );
1081  }
1082 
1083  return 0;
1084 }
1085 
1086 
1088 {
1090 
1091  if( selection.Empty() )
1092  return 0;
1093 
1094  SCH_COMPONENT* component = (SCH_COMPONENT*) selection.Front();
1095 
1096  if( !component->IsNew() )
1097  m_frame->SaveCopyInUndoList( component, UR_CHANGED );
1098 
1099  component->AutoplaceFields( m_frame->GetScreen(), /* aManual */ true );
1100 
1101  updateView( component );
1102  m_frame->OnModify();
1103 
1104  return 0;
1105 }
1106 
1107 
1109 {
1110  std::list<SCH_COMPONENT*> components;
1111 
1112  for( SCH_ITEM* item = m_frame->GetScreen()->GetDrawItems(); item; item = item->Next() )
1113  {
1114  if( item->Type() == SCH_COMPONENT_T )
1115  components.push_back( static_cast<SCH_COMPONENT*>( item ) );
1116  }
1117 
1118  if( InvokeDialogUpdateFields( m_frame, components, true ) == wxID_OK )
1119  m_frame->GetCanvas()->Refresh();
1120 
1121  return 0;
1122 }
1123 
1124 
1126 {
1128 
1129  if( selection.Empty() )
1130  return 0;
1131 
1132  SCH_COMPONENT* component = (SCH_COMPONENT*) selection.Front();
1133 
1135  && component->GetConvert() == LIB_ITEM::LIB_CONVERT::BASE )
1136  return 0;
1137 
1139  && component->GetConvert() != LIB_ITEM::LIB_CONVERT::DEMORGAN )
1140  return 0;
1141 
1142  if( !component->IsNew() )
1143  m_frame->SaveCopyInUndoList( component, UR_CHANGED );
1144 
1145  m_frame->ConvertPart( component );
1146 
1147  if( component->IsNew() )
1149 
1150  return 0;
1151 }
1152 
1153 
1155 {
1157 
1158  if( selection.Empty() )
1159  return 0;
1160 
1161  SCH_ITEM* item = (SCH_ITEM*) selection.Front();
1162 
1163  switch( item->Type() )
1164  {
1165  case SCH_COMPONENT_T:
1166  {
1167  SCH_COMPONENT* component = (SCH_COMPONENT*) item;
1168  DIALOG_EDIT_COMPONENT_IN_SCHEMATIC dlg( m_frame, component );
1169 
1170  // This dialog itself subsequently can invoke a KIWAY_PLAYER as a quasimodal
1171  // frame. Therefore this dialog as a modal frame parent, MUST be run under
1172  // quasimodal mode for the quasimodal frame support to work. So don't use
1173  // the QUASIMODAL macros here.
1174  if( dlg.ShowQuasiModal() == wxID_OK )
1175  {
1176  if( m_frame->GetAutoplaceFields() )
1177  component->AutoAutoplaceFields( m_frame->GetScreen() );
1178 
1180  m_frame->OnModify();
1181  }
1182  }
1183  break;
1184 
1185  case SCH_SHEET_T:
1186  {
1187  bool doClearAnnotation;
1188  bool doRefresh = false;
1189  // Keep track of existing sheet paths. EditSheet() can modify this list
1190  SCH_SHEET_LIST initial_sheetpathList( g_RootSheet );
1191 
1192  doRefresh = m_frame->EditSheet( (SCH_SHEET*) item, g_CurrentSheet, &doClearAnnotation );
1193 
1194  if( doClearAnnotation ) // happens when the current sheet load a existing file
1195  { // we must clear "new" components annotation
1196  SCH_SCREENS screensList( g_RootSheet );
1197  // We clear annotation of new sheet paths here:
1198  screensList.ClearAnnotationOfNewSheetPaths( initial_sheetpathList );
1199  // Clear annotation of g_CurrentSheet itself, because its sheetpath
1200  // is not a new path, but components managed by its sheet path must have
1201  // their annotation cleared, becuase they are new:
1202  ((SCH_SHEET*) item)->GetScreen()->ClearAnnotation( g_CurrentSheet );
1203  }
1204 
1205  if( doRefresh )
1206  {
1208  m_frame->GetCanvas()->Refresh();
1209  }
1210 
1211  break;
1212  }
1213 
1214  case SCH_SHEET_PIN_T:
1215  {
1216  SCH_SHEET_PIN* pin = (SCH_SHEET_PIN*) item;
1217  DIALOG_SCH_EDIT_SHEET_PIN dlg( m_frame, pin );
1218 
1219  if( dlg.ShowModal() == wxID_OK )
1220  {
1222  m_frame->OnModify();
1223  }
1224  }
1225  break;
1226 
1227  case SCH_TEXT_T:
1228  case SCH_LABEL_T:
1229  case SCH_GLOBAL_LABEL_T:
1230  case SCH_HIER_LABEL_T:
1231  if( InvokeDialogLabelEditor( m_frame, (SCH_TEXT*) item ) == wxID_OK )
1232  {
1234  m_frame->OnModify();
1235  }
1236 
1237  break;
1238 
1239  case SCH_FIELD_T:
1240  editComponentFieldText( (SCH_FIELD*) item );
1241  break;
1242 
1243  case SCH_BITMAP_T:
1244  {
1245  SCH_BITMAP* bitmap = (SCH_BITMAP*) item;
1246  DIALOG_IMAGE_EDITOR dlg( m_frame, bitmap->GetImage() );
1247 
1248  if( dlg.ShowModal() == wxID_OK )
1249  {
1250  // save old image in undo list if not already in edit
1251  if( bitmap->GetEditFlags() == 0 )
1253 
1254  dlg.TransferToImage( bitmap->GetImage() );
1255 
1256  // The bitmap is cached in Opengl: clear the cache in case it has become invalid
1257  getView()->RecacheAllItems();
1259  m_frame->OnModify();
1260  }
1261  }
1262  break;
1263 
1264  case SCH_LINE_T:
1265  {
1266  SCH_LINE* line = (SCH_LINE*) item;
1267 
1268  // We purposely disallow editing everything except graphic lines
1269  if( line->GetLayer() != LAYER_NOTES )
1270  break;
1271 
1272  DIALOG_EDIT_LINE_STYLE dlg( m_frame, line );
1273 
1274  if( dlg.ShowModal() == wxID_OK )
1275  {
1277  m_frame->OnModify();
1278  }
1279  }
1280  break;
1281 
1282  case SCH_MARKER_T: // These items have no properties to edit
1283  case SCH_JUNCTION_T:
1284  case SCH_NO_CONNECT_T:
1285  break;
1286 
1287  default: // Unexpected item
1288  wxFAIL_MSG( wxString( "Cannot edit schematic item type " ) + item->GetClass() );
1289  }
1290 
1291  updateView( item );
1292 
1293  if( selection.IsHover() )
1294  {
1296  }
1297 
1298  return 0;
1299 }
1300 
1301 
1303 {
1304  EE_SELECTION& selection = m_selectionTool->GetSelection();
1305  char shape = aEvent.Parameter<char>();
1306 
1307  for( unsigned int i = 0; i < selection.GetSize(); ++i )
1308  {
1309  SCH_BUS_ENTRY_BASE* entry = dynamic_cast<SCH_BUS_ENTRY_BASE*>( selection.GetItem( i ) );
1310 
1311  if( entry )
1312  {
1313  if( entry->GetEditFlags() == 0 )
1315 
1316  entry->SetBusEntryShape( shape );
1318 
1319  updateView( entry );
1320  m_frame->OnModify( );
1321  }
1322  }
1323 
1324  g_lastBusEntryShape = shape;
1325 
1326  return 0;
1327 }
1328 
1329 
1331 {
1332  KICAD_T convertTo = aEvent.Parameter<KICAD_T>();
1334  EE_SELECTION& selection = m_selectionTool->RequestSelection( allTextTypes );
1335 
1336  for( unsigned int i = 0; i < selection.GetSize(); ++i )
1337  {
1338  SCH_TEXT* text = dynamic_cast<SCH_TEXT*>( selection.GetItem( i ) );
1339 
1340  if( text )
1341  m_frame->ConvertTextType( text, convertTo );
1342  }
1343 
1344  return 0;
1345 }
1346 
1347 
1349 {
1350  VECTOR2I cursorPos = getViewControls()->GetCursorPosition( !aEvent.Modifier( MD_ALT ) );
1351 
1352  if( m_frame->BreakSegments( (wxPoint) cursorPos ) )
1353  {
1355 
1356  m_frame->OnModify();
1357  m_frame->GetCanvas()->Refresh();
1358  }
1359 
1360  return 0;
1361 }
1362 
1363 
1365 {
1367  SCH_SHEET* sheet = (SCH_SHEET*) selection.Front();
1368 
1369  if( !sheet )
1370  return 0;
1371 
1372  if( !sheet->HasUndefinedPins() )
1373  {
1374  DisplayInfoMessage( m_frame, _( "There are no unreferenced pins in this sheet to remove." ) );
1375  return 0;
1376  }
1377 
1378  if( !IsOK( m_frame, _( "Do you wish to delete the unreferenced pins from this sheet?" ) ) )
1379  return 0;
1380 
1382 
1383  sheet->CleanupSheet();
1384 
1385  updateView( sheet );
1386  m_frame->OnModify();
1387 
1388  return 0;
1389 }
1390 
1391 
1393 {
1398  Go( &SCH_EDIT_TOOL::Mirror, EE_ACTIONS::mirrorX.MakeEvent() );
1399  Go( &SCH_EDIT_TOOL::Mirror, EE_ACTIONS::mirrorY.MakeEvent() );
1400  Go( &SCH_EDIT_TOOL::DoDelete, ACTIONS::doDelete.MakeEvent() );
1402 
1412 
1419 
1422 
1425 }
void SetTextAngle(double aAngle)
Definition: eda_text.h:150
#define TEXT_ANGLE_HORIZ
VECTOR2I GetReferencePoint() const
Definition: selection.h:238
Class SCH_SHEET_LIST.
void AddMenu(ACTION_MENU *aMenu, const SELECTION_CONDITION &aCondition=SELECTION_CONDITIONS::ShowAlways, int aOrder=ANY_ORDER)
Function AddMenu()
void SetTimeStamp(timestamp_t aNewTimeStamp)
Change the time stamp to aNewTimeStamp and updates the reference path.
static TOOL_ACTION properties
Definition: ee_actions.h:122
Class SCH_FIELD instances are attached to a component and provide a place for the component's value,...
Definition: sch_field.h:52
void SetCursor(const wxCursor &aCursor)
Definition: picker_tool.h:65
bool SchematicCleanUp(SCH_SCREEN *aScreen=nullptr)
Performs routine schematic cleaning including breaking wire and buses and deleting identical objects ...
void AutoAutoplaceFields(SCH_SCREEN *aScreen)
Autoplace fields only if correct to do so automatically.
#define HITTEST_THRESHOLD_PIXELS
TOOL_MENU m_menu
functions below are not yet implemented - their interface may change
int m_Threshold
Definition: collector.h:68
virtual bool IsConnectable() const
Function IsConnectable returns true if the schematic item can connect to another schematic item.
Definition: sch_item.h:298
EDA_TEXT_HJUSTIFY_T
Definition: eda_text.h:44
PART_REF & GetPartRef()
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:185
bool IsHover() const
Definition: selection.h:69
SCH_SHEET * GetParent() const
Get the parent sheet object of this sheet pin.
Definition: sch_sheet.h:153
SCH_ITEM * Duplicate(bool doClone=false)
Routine to create a new copy of given item.
Definition: sch_item.cpp:75
static TOOL_ACTION toggleDeMorgan
Definition: ee_actions.h:127
void SetMotionHandler(MOTION_HANDLER aHandler)
Function SetMotionHandler() Sets a handler for mouse motion.
Definition: picker_tool.h:82
static TOOL_ACTION breakBus
Definition: ee_actions.h:138
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:115
static SELECTION_CONDITION SingleSymbol
static KICAD_T duplicatableItems[]
bool IsSelected() const
Definition: base_struct.h:233
#define TEXT_ANGLE_VERT
void AddToScreen(EDA_ITEM *aItem, SCH_SCREEN *aScreen=nullptr)
Add an item to the screen (and view) aScreen is the screen the item is located on,...
Class ACTION_MENU.
Definition: action_menu.h:43
This file is part of the common library.
static TOOL_ACTION doDelete
Definition: actions.h:73
bool IsJunctionNeeded(const wxPoint &aPosition, bool aNew=false)
Test if a junction is required for the items at aPosition on the screen.
Definition: sch_screen.cpp:347
SCH_ITEM * Next() const
Definition: sch_item.h:153
Class SCH_DRAWING_TOOLS.
void SetClickHandler(CLICK_HANDLER aHandler)
Function SetClickHandler() Sets a handler for mouse click event.
Definition: picker_tool.h:72
static TOOL_ACTION toShapeBackslash
Definition: ee_actions.h:132
void MirrorY(int aYaxis_position) override
Function MirrorY mirrors item relative to the Y axis about aYaxis_position.
bool BreakSegments(const wxPoint &aPoint, SCH_SCREEN *aScreen=nullptr)
Checks every wire and bus for a intersection at aPoint and break into two segments at aPoint if an in...
static SELECTION_CONDITION MoreThan(int aNumber)
Function MoreThan Creates a functor that tests if the number of selected items is greater than the va...
static TOOL_ACTION addItemsToSel
Selects a list of items (specified as the event parameter)
Definition: ee_actions.h:65
static SELECTION_CONDITION OnlyTypes(const KICAD_T aTypes[])
Function OnlyTypes Creates a functor that tests if the selected items are only of given types.
void RotateEnd(wxPoint aPosition)
Definition: sch_line.cpp:366
Class STATUS_TEXT_POPUP.
Definition: status_popup.h:79
virtual VECTOR2I GetCenter() const
Returns the center point of the selection area bounding box.
Definition: selection.h:136
virtual void SetLabelSpinStyle(int aSpinStyle)
Set a spin or rotation angle, along with specific horizontal and vertical justification styles with e...
Definition: sch_text.cpp:232
bool IsMoving() const
Definition: base_struct.h:230
CONDITIONAL_MENU & GetMenu()
Function GetMenu.
Definition: tool_menu.cpp:46
int Rotate(const TOOL_EVENT &aEvent)
static TOOL_ACTION mirrorY
Definition: ee_actions.h:121
static TOOL_ACTION placeHierLabel
Definition: ee_actions.h:90
TOOL_MANAGER * m_toolMgr
Definition: tool_base.h:219
void RecacheAllItems()
Function RecacheAllItems() Rebuilds GAL display lists.
Definition: view.cpp:1402
int BreakWire(const TOOL_EVENT &aEvent)
static SELECTION_CONDITION IdleSelection
virtual void GetConnectionPoints(std::vector< wxPoint > &aPoints) const
Function GetConnectionPoints add all the connection points for this item to aPoints.
Definition: sch_item.h:308
virtual bool CanIncrementLabel() const
Definition: sch_item.h:359
TOOL_MENU & GetToolMenu()
double GetTextAngle() const
Definition: eda_text.h:158
char g_lastBusEntryShape
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Function RunAction() Runs the specified action.
Definition: tool_manager.h:109
Class EE_COLLECTOR.
Definition: ee_collectors.h:39
static TOOL_ACTION toText
Definition: ee_actions.h:136
static TOOL_ACTION autoplaceFields
Definition: ee_actions.h:126
Schematic editor (Eeschema) main window.
int Properties(const TOOL_EVENT &aEvent)
bool TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
void RemoveFromScreen(EDA_ITEM *aItem, SCH_SCREEN *aScreen=nullptr)
Remove an item from the screen (and view) aScreen is the screen the item is located on,...
int UpdateFields(const TOOL_EVENT &aEvent)
static const KICAD_T ComponentsOnly[]
Definition: ee_collectors.h:44
static SELECTION_CONDITION Idle
static const KICAD_T SheetsOnly[]
Definition: ee_collectors.h:45
wxPoint GetNearestGridPosition(const wxPoint &aPosition) const
Return the nearest aGridSize location to aPosition.
static SELECTION_CONDITION Count(int aNumber)
Function Count Creates a functor that tests if the number of selected items is equal to the value giv...
void setTransitions() override
Sets up handlers for various events.
void update() override
Update menu state stub.
void MirrorX(int aXaxis_position) override
Function MirrorX mirrors item relative to the X axis about aXaxis_position.
bool GetAutoplaceFields() const
static TOOL_ACTION showDeMorganAlternate
Definition: ee_actions.h:129
static bool NotEmpty(const SELECTION &aSelection)
Function NotEmpty Tests if there are any items selected.
void editComponentFieldText(SCH_FIELD *aField)
void Go(int(T::*aStateFunc)(const TOOL_EVENT &), const TOOL_EVENT_LIST &aConditions=TOOL_EVENT(TC_ANY, TA_ANY))
Function Go()
Field Name Module PCB, i.e. "16DIP300".
Field Reference of part, i.e. "IC21".
bool EditSheet(SCH_SHEET *aSheet, SCH_SHEET_PATH *aHierarchy, bool *aClearAnnotationNewItems)
Edit an existing sheet or add a new sheet to the schematic.
Definition: sheet.cpp:518
search types array terminator (End Of Types)
Definition: typeinfo.h:82
KICAD_T
Enum KICAD_T is the set of class identification values, stored in EDA_ITEM::m_StructType.
Definition: typeinfo.h:78
static const TOOL_EVENT SelectedItemsModified
Definition: actions.h:200
void GuessSelectionCandidates(EE_COLLECTOR &collector, const VECTOR2I &aPos)
Apply heuristics to try and determine a single object when multiple are found under the cursor.
void RotateStart(wxPoint aPosition)
Definition: sch_line.cpp:360
virtual EDA_ITEM * Clone() const
Function Clone creates a duplicate of this item with linked list members set to NULL.
static TOOL_ACTION breakWire
Definition: ee_actions.h:137
static TOOL_ACTION rotateCW
Definition: ee_actions.h:118
bool IsAction(const TOOL_ACTION *aAction) const
Function IsAction() Tests if the event contains an action issued upon activation of the given TOOL_AC...
Definition: tool_event.cpp:63
bool IsNew() const
Definition: base_struct.h:228
void ClearFieldsAutoplaced()
Set fields automatically placed flag false.
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
Subclass of DIALOG_SCH_EDIT_SHEET_PIN_BASE, which is generated by wxFormBuilder.
static TOOL_ACTION pickerTool
Definition: actions.h:144
Base class for a bus or wire entry.
Definition: sch_bus_entry.h:41
bool Init() override
Function Init() Init() is called once upon a registration of the tool.
Definition: ee_tool_base.h:69
int InvokeDialogLabelEditor(SCH_EDIT_FRAME *aCaller, SCH_TEXT *aTextItem)
Launches the "Edit Text/Label" dialog.
void SetFinalizeHandler(FINALIZE_HANDLER aHandler)
Function SetFinalizeHandler() Sets a handler for the finalize event.
Definition: picker_tool.h:102
virtual void Rotate(wxPoint aPosition)=0
Function Rotate rotates the item around aPosition 90 degrees in the clockwise direction.
EE_SELECTION & GetSelection()
Function GetSelection()
#define IS_NEW
New item, just created.
Definition: base_struct.h:120
EE_SELECTION & RequestSelection(const KICAD_T *aFilterList=EE_COLLECTOR::AllItems)
Function RequestSelection()
int Duplicate(const TOOL_EVENT &aEvent)
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
int GetLabelSpinStyle() const
Definition: sch_text.h:119
static TOOL_ACTION drawSheet
Definition: ee_actions.h:91
static SELECTION_CONDITION SingleDeMorganSymbol
int GetCount() const
Function GetCount returns the number of objects in the list.
Definition: collector.h:113
static TOOL_ACTION copy
Definition: actions.h:70
timestamp_t GetNewTimeStamp()
Definition: common.cpp:217
static TOOL_ACTION cleanupSheetPins
Definition: ee_actions.h:181
#define VALUE
static TOOL_ACTION rotateCCW
Definition: ee_actions.h:119
int GetUnit() const
void BrightenItem(EDA_ITEM *aItem)
virtual wxPoint GetPosition() const =0
Function GetPosition.
static TOOL_ACTION editFootprint
Definition: ee_actions.h:125
void SetFlags(STATUS_FLAGS aMask)
Definition: base_struct.h:265
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:184
SCH_SHEET * g_RootSheet
Definition: eeschema.cpp:47
EDA_RECT const GetBoundingBox() const override
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes.
Definition: sch_sheet.cpp:478
SCH_SHEET_PATH * g_CurrentSheet
With the new connectivity algorithm, many more places than before want to know what the current sheet...
BITMAP_BASE * GetImage()
Definition: sch_bitmap.h:59
void SetName(const wxString &aName)
Definition: sch_sheet.h:263
int ChangeShape(const TOOL_EVENT &aEvent)
void SetParent(EDA_ITEM *aParent)
Definition: base_struct.h:225
STATUS_FLAGS GetEditFlags() const
Definition: base_struct.h:269
int ShowQuasiModal()
std::vector< EDA_ITEM * > EDA_ITEMS
Define list of drawing items for screens.
Definition: base_struct.h:622
T Parameter() const
Function Parameter() Returns a non-standard parameter assigned to the event.
Definition: tool_event.h:427
void SetVertJustify(EDA_TEXT_VJUSTIFY_T aType)
Definition: eda_text.h:188
static TOOL_ACTION placeSchematicText
Definition: ee_actions.h:94
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void SetIcon(const BITMAP_OPAQUE *aIcon)
Function SetIcon() Assigns an icon for the entry.
Definition: action_menu.cpp:68
Class TOOL_EVENT.
Definition: tool_event.h:168
void SaveCopyInUndoList(SCH_ITEM *aItemToCopy, UNDO_REDO_T aTypeCommand, bool aAppend=false, const wxPoint &aTransformPoint=wxPoint(0, 0))
Create a copy of the current schematic item, and put it in the undo list.
void Collect(EDA_ITEM *aItem, const KICAD_T aFilterList[], const wxPoint &aPos, int aUnit=0, int aConvert=0)
Function Collect scans a EDA_ITEM using this class's Inspector method, which does the collection.
int AutoplaceFields(const TOOL_EVENT &aEvent)
ACTION_MENU * create() const override
Returns an instance of this class. It has to be overridden in inheriting classes.
static TOOL_ACTION repeatDrawItem
Definition: ee_actions.h:117
SCH_ITEM * GetItem(const wxPoint &aPosition, int aAccuracy=0, KICAD_T aType=SCH_LOCATE_ANY_T) const
Check aPosition within a distance of aAccuracy for items of type aFilter.
Definition: sch_screen.cpp:234
const std::deque< EDA_ITEM * > GetItems() const
Definition: selection.h:130
static TOOL_ACTION cut
Definition: actions.h:69
void SaveCopyForRepeatItem(SCH_ITEM *aItem)
Clone aItem and owns that clone in this container.
const wxPoint GetRepeatStep() const
#define STRUCT_DELETED
flag indication structures to be erased
Definition: base_struct.h:129
EDA_ITEM * GetParent() const
Definition: base_struct.h:220
const KICAD_T rotatableItems[]
static TOOL_ACTION mirrorX
Definition: ee_actions.h:120
EE_SELECTION_TOOL * m_selectionTool
Definition: ee_tool_base.h:140
bool Matches(const TOOL_EVENT &aEvent) const
Function Matches() Tests whether two events match in terms of category & action or command.
Definition: tool_event.h:356
Define a sheet pin (label) used in sheets to create hierarchical schematics.
Definition: sch_sheet.h:75
virtual void MirrorX(int aXaxis_position)=0
Function MirrorX mirrors item relative to the X axis about aXaxis_position.
static TOOL_ACTION clearSelection
Clears the current selection.
Definition: ee_actions.h:58
void SetBusEntryShape(char aShape)
function SetBusEntryShape
virtual void Move(const wxPoint &aWhere)
bool Init() override
Function Init() Init() is called once upon a registration of the tool.
static TOOL_ACTION addNeededJunctions
Definition: ee_actions.h:77
int CleanupSheetPins(const TOOL_EVENT &aEvent)
static SELECTION_CONDITION SingleMultiUnitSymbol
virtual void MirrorY(int aYaxis_position)=0
Function MirrorY mirrors item relative to the Y axis about aYaxis_position.
static TOOL_ACTION editTextAndGraphics
Definition: ee_actions.h:182
void ClearAnnotation(SCH_SHEET_PATH *aSheetPath)
Clear exiting component annotation.
void CleanupSheet()
Delete sheet label which do not have a corresponding hierarchical label.
Definition: sch_sheet.cpp:340
virtual KIGFX::VIEW_ITEM * GetItem(unsigned int aIdx) const override
Definition: selection.h:103
virtual void PopupFor(int aMsecs)
#define _(s)
int DeleteItemCursor(const TOOL_EVENT &aEvent)
Runs the deletion tool.
void UnbrightenItem(EDA_ITEM *aItem)
static TOOL_ACTION showDeMorganStandard
Definition: ee_actions.h:128
Class DIALOG_SCH_EDIT_ONE_FIELD is a the class to handle editing a single component field in the sche...
Object to handle a bitmap image that can be inserted in a schematic.
Definition: sch_bitmap.h:42
int InvokeDialogUpdateFields(SCH_EDIT_FRAME *aCaller, const list< SCH_COMPONENT * > aComponents, bool aCreateUndoEntry)
KIGFX::VIEW * getView() const
Function getView()
Definition: tool_base.cpp:36
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=NULL) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
bool Empty() const
Checks if there is anything selected.
Definition: selection.h:119
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition: sch_sheet.h:204
int Mirror(const TOOL_EVENT &aEvent)
void AddSeparator(int aOrder=ANY_ORDER)
Function AddSeparator()
EDA_TEXT_VJUSTIFY_T
Definition: eda_text.h:51
EDA_ITEM * m_pickerItem
Definition: sch_edit_tool.h:78
virtual unsigned int GetSize() const override
Function GetSize() Returns the number of stored items.
Definition: selection.h:98
SCH_LAYER_ID GetLayer() const
Function GetLayer returns the layer this item is on.
Definition: sch_item.h:193
virtual bool IsLocked() const
Function IsLocked.
Definition: sch_item.h:181
int RepeatDrawItem(const TOOL_EVENT &aEvent)
int Modifier(int aMask=MD_MODIFIER_MASK) const
Returns information about key modifiers state (Ctrl, Alt, etc.)
Definition: tool_event.h:334
static TOOL_ACTION updateFieldsFromLibrary
Definition: ee_actions.h:151
static TOOL_ACTION placeLabel
Definition: ee_actions.h:88
OPT< std::string > GetCommandStr() const
Definition: tool_event.h:455
static bool IsDrawingLineWireOrBus(const SELECTION &aSelection)
bool HasUndefinedPins()
Check all sheet labels against schematic for undefined hierarchical labels.
Definition: sch_sheet.cpp:232
static TOOL_ACTION editValue
Definition: ee_actions.h:124
static KICAD_T deletableItems[]
SCH_ITEM * GetRepeatItem() const
Return the item which is to be repeated with the insert key.
void updateView(EDA_ITEM *aItem) const
Similar to getView()->Update(), but handles items that are redrawn by their parents.
Definition: ee_tool_base.h:104
void SetTitle(const wxString &aTitle) override
Function SetTitle() Sets title for the menu.
Definition: action_menu.cpp:86
void ConvertTextType(SCH_TEXT *aText, KICAD_T aNewType)
Change a text type to another one.
Definition: edit_label.cpp:130
void AutoplaceFields(SCH_SCREEN *aScreen, bool aManual)
Automatically orient all the fields in the component.
int AddItemToSel(const TOOL_EVENT &aEvent)
Segment description base class to describe items which have 2 end points (track, wire,...
Definition: sch_line.h:37
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, CPTREE &aTree)
Function Format outputs a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:205
void SetSheetNumberAndCount()
Set the m_ScreenNumber and m_NumberOfScreens members for screens.
void RefreshItem(EDA_ITEM *aItem, bool isAddOrDelete=false)
Mark an item for refresh.
void SetHorizJustify(EDA_TEXT_HJUSTIFY_T aType)
Definition: eda_text.h:187
TOOL_MANAGER * getToolManager() const
Returns an instance of TOOL_MANAGER class.
void DeleteJunction(SCH_ITEM *aItem, bool aAppend=false)
Removes a given junction and heals any wire segments under the junction.
void AddSubMenu(std::shared_ptr< ACTION_MENU > aSubMenu)
Function CreateSubMenu.
Definition: tool_menu.cpp:52
Dialog used to edit SCH_COMPONENT objects in a schematic.
wxString GetName(bool aUseDefaultName=true) const
Function GetName returns the field name.
Definition: sch_field.cpp:370
size_t i
Definition: json11.cpp:597
#define ENDPOINT
ends. (Used to support dragging.)
Definition: base_struct.h:126
static SELECTION_CONDITION OnlyType(KICAD_T aType)
Function OnlyType Creates a functor that tests if the selected items are only of given type.
static wxString SubReference(int aUnit, bool aAddSeparator=true)
int EditField(const TOOL_EVENT &aEvent)
void Clear()
Function Clear() Removes all the entries from the menu (as well as its title).
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:73
int GetRepeatDeltaLabel() const
void saveCopyInUndoList(EDA_ITEM *aItem, UNDO_REDO_T aType, bool aAppend=false)
Similar to m_frame->SaveCopyInUndoList(), but handles items that are owned by their parents.
Definition: ee_tool_base.h:117
Class EDA_ITEM is a base class for most all the KiCad significant classes, used in schematics and boa...
Definition: base_struct.h:163
wxString GetClass() const override
Function GetClass returns the class name.
Definition: sch_field.h:66
wxPoint Centre() const
Definition: eda_rect.h:60
void ClearFlags(STATUS_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: base_struct.h:266
void Activate()
Function Activate() Runs the tool.
void Rotate(wxPoint aPosition) override
Function Rotate rotates the item around aPosition 90 degrees in the clockwise direction.
static TOOL_ACTION deleteTool
Definition: actions.h:74
static TOOL_ACTION editWithLibEdit
Definition: ee_actions.h:156
static TOOL_ACTION move
Definition: ee_actions.h:115
Class EE_TOOL_BASE.
Definition: ee_tool_base.h:50
static TOOL_ACTION toLabel
Definition: ee_actions.h:133
int GetConvert() const
uint32_t timestamp_t
timestamp_t is our type to represent unique IDs for all kinds of elements; historically simply the ti...
Definition: common.h:50
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag of the current screen and u...
static TOOL_ACTION toHLabel
Definition: ee_actions.h:134
virtual const EDA_RECT GetBoundingBox() const
Function GetBoundingBox returns the orthogonal, bounding box of this object for display purposes.
KIGFX::VIEW_CONTROLS * getViewControls() const
Function getViewControls()
Definition: tool_base.cpp:42
static TOOL_ACTION editReference
Definition: ee_actions.h:123
void ClearAnnotationOfNewSheetPaths(SCH_SHEET_LIST &aInitialSheetPathList)
Clear the annotation for the components inside new sheetpaths when a complex hierarchy is modified an...
const wxPoint GetCenter() const
Definition: eda_rect.h:115
static TOOL_ACTION placeGlobalLabel
Definition: ee_actions.h:89
int DoDelete(const TOOL_EVENT &aEvent)
Deletes the selected items, or the item under the cursor.
STATUS_FLAGS GetFlags() const
Definition: base_struct.h:267
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:276
void PostEvent(const TOOL_EVENT &aEvent)
Puts an event to the event queue to be processed at the end of event processing cycle.
Definition: tool_manager.h:228
void ConvertPart(SCH_COMPONENT *aComponent)
Definition: getpart.cpp:245
void AddItem(const TOOL_ACTION &aAction, const SELECTION_CONDITION &aCondition, int aOrder=ANY_ORDER)
Function AddItem()
bool IsCurrentTool(const TOOL_ACTION &aAction) const
Class SCH_ITEM is a base class for any item which can be embedded within the SCHEMATIC container clas...
Definition: sch_item.h:114
static TOOL_ACTION toGLabel
Definition: ee_actions.h:135
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition: confirm.cpp:294
Definitions of the SCH_TEXT class and derivatives for Eeschema.
int ConvertDeMorgan(const TOOL_EVENT &aEvent)
static TOOL_ACTION paste
Definition: actions.h:71
static const KICAD_T EditableItems[]
Definition: ee_collectors.h:43
static TOOL_ACTION duplicate
Definition: actions.h:72
int ChangeTextType(const TOOL_EVENT &aEvent)
void SetText(const wxString &aText)
Display a text.
static TOOL_ACTION toShapeSlash
Definition: ee_actions.h:131
Container class that holds multiple SCH_SCREEN objects in a hierarchy.
Definition: sch_screen.h:486
static TOOL_ACTION refreshPreview
Definition: actions.h:100
VECTOR2D GetCursorPosition() const
Returns the current cursor position in world coordinates.
EDA_ITEM * Front() const
Definition: selection.h:182
KICAD_T Type() const
Function Type()
Definition: base_struct.h:210
void SetTimeStamp(timestamp_t aNewTimeStamp)
Definition: base_struct.h:215
#define STARTPOINT
When a line is selected, these flags indicate which.
Definition: base_struct.h:125
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
SCH_ITEM * GetDrawItems() const
Definition: sch_screen.h:147
virtual void Move(const wxPoint &aMoveVector)=0
Function Move moves the item by aMoveVector to a new position.