KiCad PCB EDA Suite
dialog_edit_component_in_schematic.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) 2004-2017 KiCad Developers, see AUTHORS.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 
25 #include <wx/tooltip.h>
26 #include <wx/hyperlink.h>
27 #include <wx/url.h>
28 
29 #include <fctsys.h>
30 #include <pgm_base.h>
31 #include <kiway.h>
32 #include <gr_basic.h>
33 #include <class_drawpanel.h>
34 #include <confirm.h>
35 #include <class_sch_screen.h>
36 #include <schframe.h>
37 #include <base_units.h>
38 
39 #include <general.h>
40 #include <sch_base_frame.h>
41 #include <class_library.h>
42 #include <sch_component.h>
43 #include <dialog_helpers.h>
44 #include <sch_validators.h>
45 #include <kicad_device_context.h>
46 #include <symbol_lib_table.h>
47 
48 #include <bitmaps.h>
49 
51 #include <invoke_sch_dialog.h>
52 
53 #ifdef KICAD_SPICE
54 #include <dialog_spice_model.h>
56 #endif /* KICAD_SPICE */
57 
58 #include "common.h"
59 #include "eda_doc.h"
60 #include <list>
61 
62 
70 {
71 public:
72  DIALOG_EDIT_COMPONENT_IN_SCHEMATIC( wxWindow* aParent );
73 
79  void InitBuffers( SCH_COMPONENT* aComponent );
80 
81  SCH_EDIT_FRAME* GetParent() { return dynamic_cast< SCH_EDIT_FRAME* >( wxDialog::GetParent() ); }
82 
83 private:
84 
85  friend class SCH_EDIT_FRAME;
86 
90 
91  static int s_SelectedRow;
92 
95 
96  void setSelectedFieldNdx( int aFieldNdx );
97 
98  int getSelectedFieldNdx();
99 
104 
112 
113  void copyOptionsToPanel();
114 
115  void copyPanelToOptions();
116 
117  void setRowItem( int aFieldNdx, const wxString& aName, const wxString& aValue );
118 
119  void setRowItem( int aFieldNdx, const SCH_FIELD& aField )
120  {
121  setRowItem( aFieldNdx, aField.GetName( false ), aField.GetText() );
122  }
123 
124  // event handlers
125  void OnCloseDialog( wxCloseEvent& event ) override;
126  void OnListItemDeselected( wxListEvent& event ) override;
127  void OnListItemSelected( wxListEvent& event ) override;
128  void OnCancelButtonClick( wxCommandEvent& event ) override;
129  void OnOKButtonClick( wxCommandEvent& event ) override;
130  void SetInitCmp( wxCommandEvent& event ) override;
131  void UpdateFields( wxCommandEvent& event ) override;
132  void addFieldButtonHandler( wxCommandEvent& event ) override;
133  void deleteFieldButtonHandler( wxCommandEvent& event ) override;
134  void moveUpButtonHandler( wxCommandEvent& event ) override;
135  void moveDownButtonHandler( wxCommandEvent& event ) override;
136  void showButtonHandler( wxCommandEvent& event ) override;
137  void OnTestChipName( wxCommandEvent& event ) override;
138  void OnSelectChipName( wxCommandEvent& event ) override;
139  void OnInitDlg( wxInitDialogEvent& event ) override
140  {
141  TransferDataToWindow();
142 
143  // Now all widgets have the size fixed, call FinishDialogSettings
145  }
146 
147  void EditSpiceModel( wxCommandEvent& event ) override;
148 
149  SCH_FIELD* findField( const wxString& aFieldName );
150 
157  {
158  fieldListCtrl->DeleteAllItems();
159 
160  for( unsigned ii = 0; ii < m_FieldsBuf.size(); ii++ )
161  setRowItem( ii, m_FieldsBuf[ii] );
162  }
163 };
164 
165 
167 
168 
170 {
171  wxCHECK_RET( aComponent != NULL && aComponent->Type() == SCH_COMPONENT_T,
172  wxT( "Invalid component object pointer. Bad Programmer!" ) );
173 
175 
177 
178  dlg->InitBuffers( aComponent );
179 
180  // make sure the chipnameTextCtrl is wide enough to hold any unusually long chip names:
182 
183  // This dialog itself subsequently can invoke a KIWAY_PLAYER as a quasimodal
184  // frame. Therefore this dialog as a modal frame parent, MUST be run under
185  // quasimodal mode for the quasimodal frame support to work. So don't use
186  // the QUASIMODAL macros here.
187  int ret = dlg->ShowQuasiModal();
188 
189  if( m_autoplaceFields )
190  aComponent->AutoAutoplaceFields( GetScreen() );
191 
192  m_canvas->SetIgnoreMouseEvents( false );
194  dlg->Destroy();
195 
196  if( ret == wxID_OK )
197  GetCanvas()->Refresh();
198 }
199 
200 
203 {
204  wxASSERT( dynamic_cast< SCH_EDIT_FRAME* >( aParent ) );
205 
206 #ifndef KICAD_SPICE
207  spiceFieldsButton->Hide();
208 #endif /* not KICAD_SPICE */
209 
210  m_cmp = NULL;
211  m_part = NULL;
212  m_skipCopyFromPanel = false;
213 
214  wxListItem columnLabel;
215 
216  columnLabel.SetImage( -1 );
217 
218  columnLabel.SetText( _( "Name" ) );
219  fieldListCtrl->InsertColumn( 0, columnLabel );
220 
221  columnLabel.SetText( _( "Value" ) );
222  fieldListCtrl->InsertColumn( 1, columnLabel );
223 
227 
228  wxToolTip::Enable( true );
229  stdDialogButtonSizerOK->SetDefault();
230 
231  // Configure button logos
232  addFieldButton->SetBitmap( KiBitmap( plus_xpm ) );
233  deleteFieldButton->SetBitmap( KiBitmap( minus_xpm ) );
234  moveUpButton->SetBitmap( KiBitmap( go_up_xpm ) );
235  moveDownButton->SetBitmap( KiBitmap( go_down_xpm ) );
236 
237  Fit();
238 }
239 
240 
242 {
243  if( !m_skipCopyFromPanel )
244  {
245  if( !copyPanelToSelectedField() )
246  event.Skip(); // do not go to the next row
247  }
248 }
249 
251 {
252  LIB_ID id;
253  wxString msg;
254  wxString partname = chipnameTextCtrl->GetValue();
255 
256  if( id.Parse( partname ) != -1 || !id.IsValid() )
257  {
258  msg.Printf( _( "'%s' is not a valid library symbol indentifier." ), partname );
259  DisplayError( this, msg );
260  return;
261  }
262 
263  LIB_ALIAS* alias = NULL;
264 
265  try
266  {
267  alias = Prj().SchSymbolLibTable()->LoadSymbol( id );
268  }
269  catch( ... )
270  {
271  }
272 
273  if( !alias )
274  {
275  msg.Printf( _( "Symbol '%s' not found in library '%s'" ),
276  id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() );
277  DisplayError( this, msg );
278  return;
279  }
280 
281  msg.Printf( _( "Symbol '%s' found in library '%s'" ),
282  id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() );
283 
284  DisplayInfoMessage( this, msg );
285 }
286 
287 
289 {
291 
292  auto sel = GetParent()->SelectComponentFromLibrary( NULL, dummy, true, 0, 0 );
293 
294  if( !sel.LibId.IsValid() )
295  return;
296 
297  chipnameTextCtrl->SetValue( sel.LibId.Format() );
298 }
299 
300 
302 {
303 #ifdef KICAD_SPICE
304  setSelectedFieldNdx( 0 );
305  DIALOG_SPICE_MODEL dialog( this, *m_cmp, m_FieldsBuf );
306 
307  if( dialog.ShowModal() == wxID_OK )
308  updateDisplay();
309 #endif /* KICAD_SPICE */
310 }
311 
312 
314 {
315  // remember the selected row, statically
316  s_SelectedRow = event.GetIndex();
317 
319 }
320 
321 
323 {
324  // On wxWidgets 2.8, and on Linux, calling EndQuasiModal here is mandatory
325  // Otherwise, the main event loop is never restored, and Eeschema does not
326  // respond to any event, because the DIALOG_SHIM destructor is never called.
327  // On wxWidgets 3.0, or on Windows, the DIALOG_SHIM destructor is called,
328  // and calls EndQuasiModal.
329  // therefore calling EndQuasiModal here is not always mandatory but it creates no issues
330  EndQuasiModal( wxID_CANCEL );
331 }
332 
333 
335 {
336  EndQuasiModal( wxID_CANCEL );
337 }
338 
339 
341 {
342  LIB_ID id;
343  wxString msg;
344  wxString tmp = chipnameTextCtrl->GetValue();
345 
346  tmp.Replace( wxT( " " ), wxT( "_" ) );
347 
348  id.Parse( tmp );
349 
350  // Save current flags which could be modified by next change settings
351  STATUS_FLAGS flags = m_cmp->GetFlags();
352 
353  if( !id.IsValid() )
354  {
355  msg.Printf( _( "Symbol library identifier '%s' is not valid!" ), tmp );
356  DisplayError( this, msg );
357  }
358  else if( id != m_cmp->GetLibId() )
359  {
360  LIB_ALIAS* alias = NULL;
361 
362  try
363  {
364  alias = Prj().SchSymbolLibTable()->LoadSymbol( id );
365  }
366  catch( ... )
367  {
368  }
369 
370  if( !alias )
371  {
372  msg.Printf( _( "Symbol '%s' not found in library '%s'!" ),
373  id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() );
374  DisplayError( this, msg );
375  }
376  else // Change symbol from lib!
377  {
378  m_cmp->SetLibId( id, Prj().SchSymbolLibTable(), Prj().SchLibs()->GetCacheLibrary() );
379  }
380  }
381 
382  // For symbols with multiple shapes (De Morgan representation) Set the selected shape:
383  if( convertCheckBox->IsEnabled() )
384  {
385  m_cmp->SetConvert( convertCheckBox->GetValue() ? 2 : 1 );
386  }
387 
388  //Set the part selection in multiple part per package
389  if( m_cmp->GetUnit() )
390  {
391  int unit_selection = unitChoice->GetCurrentSelection() + 1;
392 
393  m_cmp->SetUnitSelection( &GetParent()->GetCurrentSheet(), unit_selection );
394  m_cmp->SetUnit( unit_selection );
395  }
396 
397  switch( orientationRadioBox->GetSelection() )
398  {
399  case 0:
401  break;
402 
403  case 1:
405  break;
406 
407  case 2:
409  break;
410 
411  case 3:
413  break;
414  }
415 
416  int mirror = mirrorRadioBox->GetSelection();
417 
418  switch( mirror )
419  {
420  case 0:
421  break;
422 
423  case 1:
425  break;
426 
427  case 2:
429  break;
430  }
431 
432  // Restore m_Flag modified by SetUnit() and other change settings
433  m_cmp->ClearFlags();
434  m_cmp->SetFlags( flags );
435 }
436 
437 
439 {
440  bool removeRemainingFields = false;
441 
442  if( !copyPanelToSelectedField() )
443  return;
444 
446  {
447  DisplayError( NULL, _( "Illegal reference. A reference must start with a letter" ) );
448  return;
449  }
450 
451  // save old cmp in undo list if not already in edit, or moving ...
452  // or the component to be edited is part of a block
453  if( m_cmp->GetFlags() == 0
456 
458 
459  // Delete any fields with no name before we copy all of m_FieldsBuf back into the component.
460  for( unsigned i = MANDATORY_FIELDS; i<m_FieldsBuf.size(); )
461  {
462  if( m_FieldsBuf[i].GetName( false ).IsEmpty() || m_FieldsBuf[i].GetText().IsEmpty() )
463  {
464  // If a field has no value and is not it the field template list, warn the user
465  // that it will be remove from the component. This gives the user a chance to
466  // correct the problem before removing the undefined fields. It should also
467  // resolve most of the bug reports and questions regarding missing fields.
468  if( !m_FieldsBuf[i].GetName( false ).IsEmpty() && m_FieldsBuf[i].GetText().IsEmpty()
469  && !GetParent()->GetTemplates().HasFieldName( m_FieldsBuf[i].GetName( false ) )
470  && !removeRemainingFields )
471  {
472  wxString msg = wxString::Format(
473  _( "The field name <%s> does not have a value and is not defined in "
474  "the field template list. Empty field values are invalid an will "
475  "be removed from the component. Do you wish to remove this and "
476  "all remaining undefined fields?" ),
477  GetChars( m_FieldsBuf[i].GetName( false ) )
478  );
479 
480  wxMessageDialog dlg( this, msg, _( "Remove Fields" ), wxYES_NO | wxNO_DEFAULT );
481 
482  if( dlg.ShowModal() == wxID_NO )
483  return;
484 
485  removeRemainingFields = true;
486  }
487 
488  m_FieldsBuf.erase( m_FieldsBuf.begin() + i );
489  continue;
490  }
491 
492  ++i;
493  }
494 
495  // change all field positions from relative to absolute
496  for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
497  {
498  m_FieldsBuf[i].Offset( m_cmp->m_Pos );
499  }
500 
501  LIB_PART* entry = GetParent()->GetLibPart( m_cmp->GetLibId() );
502 
503  if( entry && entry->IsPower() )
504  m_FieldsBuf[VALUE].SetText( m_cmp->GetLibId().GetLibItemName() );
505 
506  // copy all the fields back, and change the length of m_Fields.
508 
509  // Reference has a specific initialization, depending on the current active sheet
510  // because for a given component, in a complex hierarchy, there are more than one
511  // reference.
513 
514  GetParent()->OnModify();
516 
517  EndQuasiModal( wxID_OK );
518 }
519 
520 
522 {
523  // in case m_FieldsBuf[REFERENCE].m_Orient has changed on screen only, grab
524  // screen contents.
525  if( !copyPanelToSelectedField() )
526  return;
527 
528  unsigned fieldNdx = m_FieldsBuf.size();
529 
530  SCH_FIELD blank( wxPoint(), fieldNdx, m_cmp );
531 
532  blank.SetTextAngle( m_FieldsBuf[REFERENCE].GetTextAngle() );
533 
534  m_FieldsBuf.push_back( blank );
535  m_FieldsBuf[fieldNdx].SetName( TEMPLATE_FIELDNAME::GetDefaultFieldName( fieldNdx ) );
536 
537  m_skipCopyFromPanel = true;
538  setRowItem( fieldNdx, m_FieldsBuf[fieldNdx] );
539 
540  setSelectedFieldNdx( fieldNdx );
541  m_skipCopyFromPanel = false;
542 }
543 
544 
546 {
547  unsigned fieldNdx = getSelectedFieldNdx();
548 
549  if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
550  return;
551 
552  if( fieldNdx < MANDATORY_FIELDS )
553  {
554  wxBell();
555  return;
556  }
557 
558  m_skipCopyFromPanel = true;
559  m_FieldsBuf.erase( m_FieldsBuf.begin() + fieldNdx );
560  fieldListCtrl->DeleteItem( fieldNdx );
561 
562  if( fieldNdx >= m_FieldsBuf.size() )
563  --fieldNdx;
564 
565  updateDisplay();
566 
567  setSelectedFieldNdx( fieldNdx );
568  m_skipCopyFromPanel = false;
569 }
570 
571 static wxString resolveUriByEnvVars( const wxString& aUri )
572 {
573  // URL-like URI: return as is.
574  wxURL url( aUri );
575  if( url.GetError() == wxURL_NOERR )
576  {
577  return aUri;
578  }
579  // Otherwise, the path points to a local file. Resolve environment
580  // variables if any.
581  return ExpandEnvVarSubstitutions( aUri );
582 }
583 
585 {
586  unsigned fieldNdx = getSelectedFieldNdx();
587 
588  if( fieldNdx == DATASHEET )
589  {
590  wxString datasheet_uri = fieldValueTextCtrl->GetValue();
591  datasheet_uri = resolveUriByEnvVars( datasheet_uri );
592  GetAssociatedDocument( this, datasheet_uri );
593  }
594  else if( fieldNdx == FOOTPRINT )
595  {
596  // pick a footprint using the footprint picker.
597  wxString fpid;
598 
600 
601  if( frame->ShowModal( &fpid, this ) )
602  {
603  // DBG( printf( "%s: %s\n", __func__, TO_UTF8( fpid ) ); )
604  fieldValueTextCtrl->SetValue( fpid );
605 
606  setRowItem( fieldNdx, m_FieldsBuf[fieldNdx].GetName( false ), fpid );
607  }
608 
609  frame->Destroy();
610  }
611 }
612 
613 
615 {
616  unsigned fieldNdx = getSelectedFieldNdx();
617 
618  if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
619  return;
620 
621  if( fieldNdx <= MANDATORY_FIELDS )
622  {
623  wxBell();
624  return;
625  }
626 
627  if( !copyPanelToSelectedField() )
628  return;
629 
630  // swap the fieldNdx field with the one before it, in both the vector
631  // and in the fieldListCtrl
632  SCH_FIELD tmp = m_FieldsBuf[fieldNdx - 1];
633 
634  DBG( printf( "tmp.m_Text=\"%s\" tmp.m_Name=\"%s\"\n",
635  TO_UTF8( tmp.GetText() ), TO_UTF8( tmp.GetName( false ) ) ); )
636 
637  m_FieldsBuf[fieldNdx - 1] = m_FieldsBuf[fieldNdx];
638  setRowItem( fieldNdx - 1, m_FieldsBuf[fieldNdx] );
639 
640  m_FieldsBuf[fieldNdx] = tmp;
641  setRowItem( fieldNdx, tmp );
642 
643  updateDisplay();
644 
645  m_skipCopyFromPanel = true;
646  setSelectedFieldNdx( fieldNdx - 1 );
647  m_skipCopyFromPanel = false;
648 }
649 
650 
652 {
653  unsigned fieldNdx = getSelectedFieldNdx();
654 
655  // Ensure there is at least one field after this one
656  if( fieldNdx >= ( m_FieldsBuf.size() - 1 ) )
657  {
658  return;
659  }
660 
661  // The first field which can be moved up is the second user field
662  // so any field which id < MANDATORY_FIELDS cannot be moved down
663  if( fieldNdx < MANDATORY_FIELDS )
664  return;
665 
666  if( !copyPanelToSelectedField() )
667  return;
668 
669  // swap the fieldNdx field with the one before it, in both the vector
670  // and in the fieldListCtrl
671  SCH_FIELD tmp = m_FieldsBuf[fieldNdx + 1];
672 
673  m_FieldsBuf[fieldNdx + 1] = m_FieldsBuf[fieldNdx];
674  setRowItem( fieldNdx + 1, m_FieldsBuf[fieldNdx] );
675  m_FieldsBuf[fieldNdx + 1].SetId( fieldNdx + 1 );
676 
677  m_FieldsBuf[fieldNdx] = tmp;
678  setRowItem( fieldNdx, tmp );
679  m_FieldsBuf[fieldNdx].SetId( fieldNdx );
680 
681  updateDisplay( );
682 
683  m_skipCopyFromPanel = true;
684  setSelectedFieldNdx( fieldNdx + 1 );
685  m_skipCopyFromPanel = false;
686 }
687 
688 
690 {
691  /* deselect old selection, but I think this is done by single selection
692  * flag within fieldListCtrl.
693  * fieldListCtrl->SetItemState( s_SelectedRow, 0,
694  * wxLIST_STATE_SELECTED|wxLIST_STATE_FOCUSED);
695  */
696 
697  if( aFieldNdx >= (int) m_FieldsBuf.size() )
698  aFieldNdx = m_FieldsBuf.size() - 1;
699 
700  if( aFieldNdx < 0 )
701  aFieldNdx = 0;
702 
703  fieldListCtrl->SetItemState( aFieldNdx, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED );
704  fieldListCtrl->EnsureVisible( aFieldNdx );
705 
706  s_SelectedRow = aFieldNdx;
707 }
708 
709 
711 {
712  return s_SelectedRow;
713 }
714 
715 
717 {
718  for( unsigned i=0; i<m_FieldsBuf.size(); ++i )
719  {
720  if( aFieldName == m_FieldsBuf[i].GetName( false ) )
721  return &m_FieldsBuf[i];
722  }
723 
724  return NULL;
725 }
726 
727 
729 {
730  m_cmp = aComponent;
731 
732  /* We have 3 component related field lists to be aware of: 1) UI
733  presentation, 2) fields in component ram copy, and 3) fields recorded
734  with component on disk. m_FieldsBuf is the list of UI fields, and this
735  list is not the same as the list which is in the component, which is
736  also not the same as the list on disk. All 3 lists are potentially
737  different. In the UI we choose to preserve the order of the first
738  MANDATORY_FIELDS which are sometimes called fixed fields. Then we append
739  the template fieldnames in the exact same order as the template
740  fieldname editor shows them. Then we append any user defined fieldnames
741  which came from the component.
742  */
743 
745 
746 #if 0 && defined(DEBUG)
747  for( int i = 0; i<aComponent->GetFieldCount(); ++i )
748  {
749  printf( "Orig[%d] (x=%d, y=%d)\n", i,
750  aComponent->m_Fields[i].GetTextPos().x,
751  aComponent->m_Fields[i].GetTextPos().y );
752  }
753 
754 #endif
755 
756  // When this code was written, all field constructors ensure that the fixed fields
757  // are all present within a component. So we can knowingly copy them over
758  // in the normal order. Copy only the fixed fields at first.
759  // Please do not break the field constructors.
760 
761  m_FieldsBuf.clear();
762 
763  for( int i=0; i<MANDATORY_FIELDS; ++i )
764  {
765  m_FieldsBuf.push_back( aComponent->m_Fields[i] );
766 
767  // make the editable field position relative to the component
768  m_FieldsBuf[i].Offset( -m_cmp->m_Pos );
769  }
770 
771  // Add template fieldnames:
772  // Now copy in the template fields, in the order that they are present in the
773  // template field editor UI.
775 
776  for( TEMPLATE_FIELDNAMES::const_iterator it = tfnames.begin(); it!=tfnames.end(); ++it )
777  {
778  // add a new field unconditionally to the UI only
779  SCH_FIELD fld( wxPoint(0,0), -1 /* id is a relic */, m_cmp, it->m_Name );
780 
781  // See if field by same name already exists in component.
782  SCH_FIELD* schField = aComponent->FindField( it->m_Name );
783 
784  // If the field does not already exist in the component, then we
785  // use defaults from the template fieldname, otherwise the original
786  // values from the component will be set.
787  if( !schField )
788  {
789  if( !it->m_Visible )
790  fld.SetVisible( false );
791  else
792  fld.SetVisible( true );
793 
794  fld.SetText( it->m_Value ); // empty? ok too.
795  }
796  else
797  {
798  fld = *schField;
799 
800  // make the editable field position relative to the component
801  fld.Offset( -m_cmp->m_Pos );
802  }
803 
804  m_FieldsBuf.push_back( fld );
805  }
806 
807  // Lastly, append any original fields from the component which were not added
808  // from the set of fixed fields nor from the set of template fields.
809  for( unsigned i=MANDATORY_FIELDS; i<aComponent->m_Fields.size(); ++i )
810  {
811  SCH_FIELD* cmp = &aComponent->m_Fields[i];
812  SCH_FIELD* buf = findField( cmp->GetName( false ) );
813 
814  if( !buf )
815  {
816  int newNdx = m_FieldsBuf.size();
817  m_FieldsBuf.push_back( *cmp );
818 
819  // make the editable field position relative to the component
820  m_FieldsBuf[newNdx].Offset( -m_cmp->m_Pos );
821  }
822  }
823 
824 
825 #if 0 && defined(DEBUG)
826  for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
827  {
828  printf( "m_FieldsBuf[%d] (x=%-3d, y=%-3d) name:%s\n", i, m_FieldsBuf[i].m_Pos.x,
829  m_FieldsBuf[i].m_Pos.y, TO_UTF8(m_FieldsBuf[i].GetName( false ) ) );
830  }
831 #endif
832 
834 
835  for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
836  {
837  setRowItem( i, m_FieldsBuf[i] );
838  }
839 
840 #if 0 && defined(DEBUG)
841  for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
842  {
843  printf( "after[%d] (x=%d, y=%d)\n", i, m_FieldsBuf[i].m_Pos.x,
844  m_FieldsBuf[i].m_Pos.y );
845  }
846 
847 #endif
848 
850 
851  // disable some options inside the edit dialog
852  // which can cause problems while dragging
853  if( m_cmp->IsDragging() )
854  {
855  orientationRadioBox->Disable();
856  mirrorRadioBox->Disable();
857  chipnameTextCtrl->Disable();
858  }
859 
860  // put focus on the list ctrl
861  fieldListCtrl->SetFocus();
862 
863  // resume editing at the last row edited, last time dialog was up.
865 
867 }
868 
869 
870 void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::setRowItem( int aFieldNdx, const wxString& aName, const wxString& aValue )
871 {
872  wxASSERT( aFieldNdx >= 0 );
873 
874  // insert blanks if aFieldNdx is referencing a "yet to be defined" row
875  while( aFieldNdx >= fieldListCtrl->GetItemCount() )
876  {
877  long ndx = fieldListCtrl->InsertItem( fieldListCtrl->GetItemCount(), wxEmptyString );
878 
879  wxASSERT( ndx >= 0 );
880 
881  fieldListCtrl->SetItem( ndx, 1, wxEmptyString );
882  }
883 
884  fieldListCtrl->SetItem( aFieldNdx, 0, aName );
885  fieldListCtrl->SetItem( aFieldNdx, 1, aValue );
886 
887  // recompute the column widths here, after setting texts
888  fieldListCtrl->SetColumnWidth( 0, wxLIST_AUTOSIZE );
889  fieldListCtrl->SetColumnWidth( 1, wxLIST_AUTOSIZE );
890 }
891 
892 
894 {
895  wxCHECK_RET( m_cmp != NULL, wxT( "Component pointer not initialized." ) );
896 
897  unsigned fieldNdx = getSelectedFieldNdx();
898 
899  if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
900  return;
901 
902  SCH_FIELD& field = m_FieldsBuf[fieldNdx];
903 
904  showCheckBox->SetValue( field.IsVisible() );
905 
906  rotateCheckBox->SetValue( field.GetTextAngle() == TEXT_ANGLE_VERT );
907 
908  int style = 0;
909 
910  if( field.IsItalic() )
911  style = 1;
912 
913  if( field.IsBold() )
914  style |= 2;
915 
916  m_StyleRadioBox->SetSelection( style );
917 
918  // Select the right text justification
919  if( field.GetHorizJustify() == GR_TEXT_HJUSTIFY_LEFT )
920  m_FieldHJustifyCtrl->SetSelection( 0 );
921  else if( field.GetHorizJustify() == GR_TEXT_HJUSTIFY_RIGHT )
922  m_FieldHJustifyCtrl->SetSelection( 2 );
923  else
924  m_FieldHJustifyCtrl->SetSelection( 1 );
925 
926  if( field.GetVertJustify() == GR_TEXT_VJUSTIFY_TOP )
927  m_FieldVJustifyCtrl->SetSelection( 0 );
928  else if( field.GetVertJustify() == GR_TEXT_VJUSTIFY_BOTTOM )
929  m_FieldVJustifyCtrl->SetSelection( 2 );
930  else
931  m_FieldVJustifyCtrl->SetSelection( 1 );
932 
933 
934  fieldNameTextCtrl->SetValue( field.GetName( false ) );
935 
936  // the names of the fixed fields are not editable, others are.
937  fieldNameTextCtrl->Enable( fieldNdx >= MANDATORY_FIELDS );
938  fieldNameTextCtrl->SetEditable( fieldNdx >= MANDATORY_FIELDS );
939 
940  // only user defined fields may be moved, and not the top most user defined
941  // field since it would be moving up into the fixed fields, > not >=
942  moveUpButton->Enable( fieldNdx > MANDATORY_FIELDS );
943 
944  // may only delete user defined fields
945  deleteFieldButton->Enable( fieldNdx >= MANDATORY_FIELDS );
946 
947  fieldValueTextCtrl->SetValidator( SCH_FIELD_VALIDATOR( false, field.GetId() ) );
948  fieldValueTextCtrl->SetValue( field.GetText() );
949 
950  m_show_datasheet_button->Enable( fieldNdx == DATASHEET || fieldNdx == FOOTPRINT );
951 
952  if( fieldNdx == DATASHEET )
953  {
954  m_show_datasheet_button->SetLabel( _( "Show Datasheet" ) );
955  m_show_datasheet_button->SetToolTip(
956  _("If your datasheet is given as an http:// link,"
957  " then pressing this button should bring it up in your webbrowser.") );
958  }
959  else if( fieldNdx == FOOTPRINT )
960  {
961  m_show_datasheet_button->SetLabel( _( "Browse Footprints" ) );
962  m_show_datasheet_button->SetToolTip(
963  _("Open the footprint browser to choose a footprint and assign it.") );
964  }
965  else
966  {
967  m_show_datasheet_button->SetLabel( wxEmptyString );
968  m_show_datasheet_button->SetToolTip(
969  _("Used only for fields Footprint and Datasheet.") );
970  }
971 
972  // For power symbols, the value is NOR editable, because value and pin
973  // name must be same and can be edited only in library editor
974  if( fieldNdx == VALUE && m_part && m_part->IsPower() )
975  fieldValueTextCtrl->Enable( false );
976  else
977  fieldValueTextCtrl->Enable( true );
978 
980 
981  wxPoint coord = field.GetTextPos();
982  wxPoint zero = -m_cmp->m_Pos; // relative zero
983 
984  // If the field value is empty and the position is at relative zero, we
985  // set the initial position as a small offset from the ref field, and
986  // orient it the same as the ref field. That is likely to put it at least
987  // close to the desired position.
988  if( coord == zero && field.GetText().IsEmpty() )
989  {
990  rotateCheckBox->SetValue( m_FieldsBuf[REFERENCE].GetTextAngle() == TEXT_ANGLE_VERT );
991 
992  coord.x = m_FieldsBuf[REFERENCE].GetTextPos().x
993  + ( fieldNdx - MANDATORY_FIELDS + 1 ) * 100;
994 
995  coord.y = m_FieldsBuf[REFERENCE].GetTextPos().y
996  + ( fieldNdx - MANDATORY_FIELDS + 1 ) * 100;
997 
998  // coord can compute negative if field is < MANDATORY_FIELDS, e.g. FOOTPRINT.
999  // That is ok, we basically don't want all the new empty fields on
1000  // top of each other.
1001  }
1002 
1003  wxString coordText = StringFromValue( g_UserUnit, coord.x );
1004  posXTextCtrl->SetValue( coordText );
1005 
1006  coordText = StringFromValue( g_UserUnit, coord.y );
1007  posYTextCtrl->SetValue( coordText );
1008 }
1009 
1010 
1012 {
1013  unsigned fieldNdx = getSelectedFieldNdx();
1014 
1015  if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
1016  return true;
1017 
1018  // Check for illegal field text.
1019  if( fieldValueTextCtrl->GetValidator()
1020  && !fieldValueTextCtrl->GetValidator()->Validate( this ) )
1021  return false;
1022 
1023  SCH_FIELD& field = m_FieldsBuf[fieldNdx];
1024 
1025  field.SetVisible( showCheckBox->GetValue() );
1026 
1027  if( rotateCheckBox->GetValue() )
1028  field.SetTextAngle( TEXT_ANGLE_VERT );
1029  else
1030  field.SetTextAngle( TEXT_ANGLE_HORIZ );
1031 
1032  rotateCheckBox->SetValue( field.GetTextAngle() == TEXT_ANGLE_VERT );
1033 
1034  // Copy the text justification
1035  static const EDA_TEXT_HJUSTIFY_T hjustify[] = {
1039  };
1040 
1041  static const EDA_TEXT_VJUSTIFY_T vjustify[] = {
1045  };
1046 
1047  field.SetHorizJustify( hjustify[m_FieldHJustifyCtrl->GetSelection()] );
1048  field.SetVertJustify( vjustify[m_FieldVJustifyCtrl->GetSelection()] );
1049 
1050  field.SetName( fieldNameTextCtrl->GetValue() );
1051 
1052  /* Void fields texts for REFERENCE and VALUE (value is the name of the
1053  * component in lib ! ) are not allowed
1054  * change them only for a new non void value
1055  * When void, usually netlists are broken
1056  */
1057  if( !fieldValueTextCtrl->GetValue().IsEmpty() || fieldNdx > VALUE )
1058  field.SetText( fieldValueTextCtrl->GetValue() );
1059 
1060  setRowItem( fieldNdx, field ); // update fieldListCtrl
1061 
1063  field.SetTextSize( wxSize( tmp, tmp ) );
1064  int style = m_StyleRadioBox->GetSelection();
1065 
1066  field.SetItalic( (style & 1 ) != 0 );
1067  field.SetBold( (style & 2 ) != 0 );
1068 
1069  wxPoint pos;
1070  pos.x = ValueFromString( g_UserUnit, posXTextCtrl->GetValue() );
1071  pos.y = ValueFromString( g_UserUnit, posYTextCtrl->GetValue() );
1072  field.SetTextPos( pos );
1073 
1074  return true;
1075 }
1076 
1077 
1079 {
1080  // Remove non existing choices (choiceCount must be <= number for parts)
1081  int unitcount = m_part ? m_part->GetUnitCount() : 1;
1082 
1083  if( unitcount < 1 )
1084  unitcount = 1;
1085 
1086  unitChoice->Clear();
1087 
1088  for( int ii = 1; ii <= unitcount; ii++ )
1089  {
1090  unitChoice->Append( LIB_PART::SubReference( ii, false ) );
1091  }
1092 
1093  // For symbols with multiple parts per package, set the unit selection
1094  if( m_cmp->GetUnit() <= (int)unitChoice->GetCount() )
1095  unitChoice->SetSelection( m_cmp->GetUnit() - 1 );
1096 
1097  // Disable unit selection if only one unit exists:
1098  if( m_cmp->GetUnitCount() <= 1 )
1099  {
1100  unitChoice->Enable( false );
1101  unitsInterchageableLabel->Show( false );
1102  unitsInterchageableText->Show( false );
1103  }
1104  else
1105  {
1106  // Show the "Units are not interchangeable" message option?
1107  if( !m_part || !m_part->UnitsLocked() )
1108  unitsInterchageableLabel->SetLabel( _( "Yes" ) );
1109  else
1110  unitsInterchageableLabel->SetLabel( _( "No" ) );
1111  }
1112 
1113  int orientation = m_cmp->GetOrientation() & ~( CMP_MIRROR_X | CMP_MIRROR_Y );
1114 
1115  if( orientation == CMP_ORIENT_90 )
1116  orientationRadioBox->SetSelection( 1 );
1117  else if( orientation == CMP_ORIENT_180 )
1118  orientationRadioBox->SetSelection( 2 );
1119  else if( orientation == CMP_ORIENT_270 )
1120  orientationRadioBox->SetSelection( 3 );
1121  else
1122  orientationRadioBox->SetSelection( 0 );
1123 
1124  int mirror = m_cmp->GetOrientation() & ( CMP_MIRROR_X | CMP_MIRROR_Y );
1125 
1126  if( mirror == CMP_MIRROR_X )
1127  {
1128  mirrorRadioBox->SetSelection( 1 );
1129  DBG( printf( "mirror=X,1\n" ); )
1130  }
1131  else if( mirror == CMP_MIRROR_Y )
1132  {
1133  mirrorRadioBox->SetSelection( 2 );
1134  DBG( printf( "mirror=Y,2\n" ); )
1135  }
1136  else
1137  mirrorRadioBox->SetSelection( 0 );
1138 
1139  // Activate/Desactivate the normal/convert option ? (activated only if
1140  // the component has more than one shape)
1141  if( m_cmp->GetConvert() > 1 )
1142  convertCheckBox->SetValue( true );
1143 
1144  if( m_part == NULL || !m_part->HasConversion() )
1145  convertCheckBox->Enable( false );
1146 
1147  // Set the component's library name.
1148  chipnameTextCtrl->SetValue( m_cmp->GetLibId().Format() );
1149 
1150  // Set the component's unique ID time stamp.
1151  m_textCtrlTimeStamp->SetValue( wxString::Format( wxT( "%8.8lX" ),
1152  (unsigned long) m_cmp->GetTimeStamp() ) );
1153 }
1154 
1155 
1157 {
1158  if( !m_cmp )
1159  return;
1160 
1161  if( LIB_PART* part = GetParent()->GetLibPart( m_cmp->GetLibId() ) )
1162  {
1163  // save old cmp in undo list if not already in edit, or moving ...
1164  if( m_cmp->GetFlags() == 0 )
1166 
1168  m_cmp->Draw( GetParent()->GetCanvas(), &dc, wxPoint( 0, 0 ), g_XorMode );
1169 
1170  // Initialize fixed field values to default values found in library
1171  // Note: the field texts are not modified because they are set in schematic,
1172  // the text from libraries is most of time a dummy text
1173  // Only VALUE, REFERENCE , FOOTPRINT and DATASHEET are re-initialized
1174  LIB_FIELD& refField = part->GetReferenceField();
1175 
1176  m_cmp->GetField( REFERENCE )->ImportValues( refField );
1177  m_cmp->GetField( REFERENCE )->SetTextPos( refField.GetTextPos() + m_cmp->m_Pos );
1178 
1179  LIB_FIELD& valField = part->GetValueField();
1180 
1181  m_cmp->GetField( VALUE )->ImportValues( valField );
1182  m_cmp->GetField( VALUE )->SetTextPos( valField.GetTextPos() + m_cmp->m_Pos );
1183 
1184  LIB_FIELD* field = part->GetField(FOOTPRINT);
1185 
1186  if( field && m_cmp->GetField( FOOTPRINT ) )
1187  {
1188  m_cmp->GetField( FOOTPRINT )->ImportValues( *field );
1189  m_cmp->GetField( FOOTPRINT )->SetTextPos( field->GetTextPos() + m_cmp->m_Pos );
1190  }
1191 
1192  field = part->GetField(DATASHEET);
1193 
1194  if( field && m_cmp->GetField( DATASHEET ) )
1195  {
1196  m_cmp->GetField( DATASHEET )->ImportValues( *field );
1197  m_cmp->GetField( DATASHEET )->SetTextPos( field->GetTextPos() + m_cmp->m_Pos );
1198  }
1199 
1201 
1202  GetParent()->OnModify();
1203 
1204  m_cmp->Draw( GetParent()->GetCanvas(), &dc, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE );
1205 
1206  EndQuasiModal( wxID_OK );
1207  }
1208 }
1209 
1210 
1212 {
1213  SCH_COMPONENT copy( *m_cmp );
1214  std::list<SCH_COMPONENT*> components;
1215  components.push_back( &copy );
1216  InvokeDialogUpdateFields( GetParent(), components, false );
1217 
1218  // Copy fields from the modified component copy to the dialog buffer
1219  m_FieldsBuf.clear();
1220 
1221  for( int i = 0; i < copy.GetFieldCount(); ++i )
1222  {
1223  copy.m_Fields[i].SetParent( m_cmp );
1224  m_FieldsBuf.push_back( copy.m_Fields[i] );
1225  m_FieldsBuf[i].Offset( -m_cmp->m_Pos );
1226  }
1227 
1228  // Update the selected field as well
1230  updateDisplay();
1231 }
void SetTextAngle(double aAngle)
Definition: eda_text.h:156
GR_DRAWMODE g_XorMode
Definition: gr_basic.cpp:51
KICAD_T Type() const
Function Type()
Definition: base_struct.h:212
#define TEXT_ANGLE_HORIZ
Frequent text rotations, used with {Set,Get}TextAngle(), in 0.1 degrees for now, hoping to migrate to...
Definition: common.h:90
Class SCH_FIELD instances are attached to a component and provide a place for the component's value...
Definition: sch_field.h:56
void Offset(const wxPoint &aOffset)
Definition: eda_text.h:229
bool UnitsLocked() const
void EditComponent(SCH_COMPONENT *aComponent)
Display the edit component dialog to edit the parameters of aComponent.
void AutoAutoplaceFields(SCH_SCREEN *aScreen)
Autoplace fields only if correct to do so automatically.
STATUS_FLAGS GetFlags() const
Definition: base_struct.h:269
Class KIWAY_PLAYER is a wxFrame capable of the OpenProjectFiles function, meaning it can load a porti...
Definition: kiway_player.h:111
bool copyPanelToSelectedField()
Copy the values displayed on the panel fields to the currently selected field.
Part library alias object definition.
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true)
Search for a SCH_FIELD with aFieldName.
wxString GetName(bool aUseDefaultName=true) const
Function GetName returns the field name.
Definition: sch_field.cpp:425
const TEMPLATES & GetTemplates()
Return the field names template for read only access.
Definition: schframe.h:323
BLOCK_SELECTOR m_BlockLocate
Block description for block commands.
EDA_TEXT_HJUSTIFY_T
Definition: eda_text.h:47
KIWAY & Kiway() const
Function Kiway returns a reference to the KIWAY that this object has an opportunity to participate in...
Definition: kiway_player.h:60
name of datasheet
bool HasConversion() const
Test if part has more than one body conversion type (DeMorgan).
const wxPoint & GetTextPos() const
Definition: eda_text.h:224
void moveDownButtonHandler(wxCommandEvent &event) override
int GetOrientation()
Get the display symbol orientation.
SCH_FIELDS m_FieldsBuf
a copy of the edited symbol's SCH_FIELDs
SCH_FIELD * findField(const wxString &aFieldName)
bool IsItalic() const
Definition: eda_text.h:170
bool IsPower() const
void SaveCopyInUndoList(SCH_ITEM *aItemToCopy, UNDO_REDO_T aTypeCommand, const wxPoint &aTransformPoint=wxPoint(0, 0))
Create a copy of the current schematic item, and put it in the undo list.
virtual void Refresh(bool eraseBackground=true, const wxRect *rect=NULL) override
Update the board display after modifying it bu a python script (note: it is automatically called by a...
Definition: draw_panel.cpp:325
Implementation of conversion functions that require both schematic and board internal units...
This file is part of the common library.
void OnOKButtonClick(wxCommandEvent &event) override
EDA_DRAW_PANEL * GetCanvas()
Definition: draw_frame.h:337
void OnModify()
Must be called after a schematic change in order to set the "modify" flag of the current screen* and ...
Definition: schframe.cpp:773
SCH_FIELDS m_Fields
Variable length list of fields.
Definition: sch_component.h:91
int GetId() const
Definition: sch_field.h:87
This file is part of the common library.
void ImportValues(const LIB_FIELD &aSource)
Function ImportValues copy parameters from a LIB_FIELD source.
Definition: sch_field.cpp:221
void addFieldButtonHandler(wxCommandEvent &event) override
wxString StringFromValue(EDA_UNITS_T aUnit, int aValue, bool aAddUnitSymbol)
Function StringFromValue returns the string from aValue according to units (inch, mm ...
Definition: base_units.cpp:203
wxPoint m_Pos
Name and library where symbol was loaded from, i.e. "74xx:74LS00".
Definition: sch_component.h:77
void SetItalic(bool isItalic)
Definition: eda_text.h:169
The first 4 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors...
void OnInitDlg(wxInitDialogEvent &event) override
Class LIB_FIELD is used in symbol libraries.
Definition: lib_field.h:60
int GetTextWidth() const
Definition: eda_text.h:218
void FinishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
void SetTextPos(const wxPoint &aPoint)
Definition: eda_text.h:223
void SetVisible(bool aVisible)
Definition: eda_text.h:175
void OnCancelButtonClick(wxCommandEvent &event) override
static int ParseSize(const wxString &sizeText, EDA_UNITS_T user_unit)
Definition: wxwineda.cpp:123
bool GetAssociatedDocument(wxWindow *aParent, const wxString &aDocName, const wxPathList *aPaths)
Function GetAssociatedDocument open a document (file) with the suitable browser.
Definition: eda_doc.cpp:86
std::vector< COMPONENT_SELECTION > HISTORY_LIST
static const wxString GetDefaultFieldName(int aFieldNdx)
Function GetDefaultFieldName returns a default symbol field name for field aFieldNdx for all componen...
Schematic editor (Eeschema) main window.
Definition: schframe.h:118
LIB_PART * GetLibPart(const LIB_ID &aLibId, bool aUseCacheLib=false, bool aShowErrorMsg=false)
void SetUnitSelection(SCH_SHEET_PATH *aSheet, int aUnitSelection)
void SetTextSize(const wxSize &aNewSize)
Definition: eda_text.h:214
int GetUnitCount() const
Return the number of units per package of the symbol.
void deleteFieldButtonHandler(wxCommandEvent &event) override
Class LIB_ID.
Definition: lib_id.h:56
void MoveCursorToCrossHair()
Function MoveCursorToCrossHair warps the cursor to the current cross hair position.
Definition: draw_panel.cpp:347
EDA_TEXT_HJUSTIFY_T GetHorizJustify() const
Definition: eda_text.h:190
#define TEXT_ANGLE_VERT
Definition: common.h:91
Field Name Module PCB, i.e. "16DIP300".
Field Reference of part, i.e. "IC21".
bool IsBold() const
Definition: eda_text.h:173
double GetTextAngle() const
Definition: eda_text.h:164
void SetConvert(int aConvert)
SCH_SCREEN * GetScreen() const override
Function GetScreen returns a pointer to a BASE_SCREEN or one of its derivatives.
Definition: schframe.cpp:532
#define TO_UTF8(wxstring)
Macro TO_UTF8 converts a wxString to a UTF8 encoded C string for all wxWidgets build modes...
Definition: macros.h:47
void setRowItem(int aFieldNdx, const wxString &aName, const wxString &aValue)
int GetConvert() const
PROJECT & Prj() const
Function Prj returns a reference to the PROJECT "associated with" this KIWAY.
wxBitmap KiBitmap(BITMAP_DEF aBitmap)
Function KiBitmap constructs a wxBitmap from a memory record, held in a BITMAP_DEF.
Definition: bitmap.cpp:36
void SetLibId(const LIB_ID &aName, PART_LIBS *aLibs=NULL)
void OnTestChipName(wxCommandEvent &event) override
VTBL_ENTRY KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, KIWAY_PLAYER *aParent=NULL)
Function Player returns the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:302
a helper to handle the real device context used in KiCad
bool EnsureTextCtrlWidth(wxTextCtrl *aCtrl, const wxString *aString)
Function EnsureTextCtrlWidth sets the minimum pixel width on a text control in order to make a text s...
Definition: common.cpp:108
std::vector< TEMPLATE_FIELDNAME > TEMPLATE_FIELDNAMES
void SetFlags(STATUS_FLAGS aMask)
Definition: base_struct.h:267
void SetFields(const SCH_FIELDS &aFields)
Set multiple schematic fields.
SCH_FIELD * GetField(int aFieldNdx) const
Returns a field in this symbol.
const wxString ExpandEnvVarSubstitutions(const wxString &aString)
Function ExpandEnvVarSubstitutions replaces any environment variable references with their values...
Definition: common.cpp:254
Definitions for the Eeschema program SCH_SCREEN class.
const UTF8 & GetLibItemName() const
Function GetLibItemName.
Definition: lib_id.h:129
int ShowQuasiModal()
const wxString & GetText() const
Function GetText returns the string associated with the text object.
Definition: eda_text.h:130
std::vector< SCH_FIELD > SCH_FIELDS
A container for several SCH_FIELD items.
Definition: sch_component.h:53
void SetVertJustify(EDA_TEXT_VJUSTIFY_T aType)
Definition: eda_text.h:194
wxString GetAbbreviatedUnitsLabel(EDA_UNITS_T aUnit)
Definition: base_units.cpp:479
Defintions of control validators for schematic dialogs.
SCH_SHEET_PATH & GetCurrentSheet()
Definition: schframe.cpp:577
int ValueFromString(EDA_UNITS_T aUnits, const wxString &aTextValue)
Function ValueFromString converts aTextValue in aUnits to internal units used by the application...
Definition: base_units.cpp:368
Class LIB_PART defines a library part object.
void OnListItemDeselected(wxListEvent &event) override
Helper dialog and control classes.
unsigned STATUS_FLAGS
Definition: base_struct.h:158
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString aExtraInfo)
Function DisplayInfoMessage displays an informational message box with aMessage.
Definition: confirm.cpp:104
wxString GetText(GRAPHIC_PINSHAPE shape)
Definition: pin_shape.cpp:33
void SetUnit(int aUnit)
Change the unit number to aUnit.
int GetUnit() const
void OnListItemSelected(wxListEvent &event) override
const wxString GetRef(const SCH_SHEET_PATH *aSheet)
Return the reference for the given sheet path.
void UpdateFields(wxCommandEvent &event) override
int InvokeDialogUpdateFields(SCH_EDIT_FRAME *aCaller, const list< SCH_COMPONENT * > aComponents, bool aCreateUndoEntry)
bool m_autoplaceFields
automatically place component fields
Definition: schframe.h:155
time_t GetTimeStamp() const
Definition: base_struct.h:218
static wxString resolveUriByEnvVars(const wxString &aUri)
EDA_TEXT_VJUSTIFY_T
Definition: eda_text.h:54
int GetUnitCount() const
EDA_UNITS_T g_UserUnit
Global variables definitions.
Definition: common.cpp:56
void OnSelectChipName(wxCommandEvent &event) override
Field Value of part, i.e. "3.3K".
void moveUpButtonHandler(wxCommandEvent &event) override
EDA_TEXT_VJUSTIFY_T GetVertJustify() const
Definition: eda_text.h:191
EDA_DRAW_PANEL * m_canvas
The area to draw on.
Definition: draw_frame.h:93
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
void EndQuasiModal(int retCode)
#define GR_DEFAULT_DRAWMODE
Definition: general.h:70
Definition the SCH_COMPONENT class for Eeschema.
Class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC_FBP.
bool HasFieldName(const wxString &aName) const
Function HasFieldName checks for aName in the the template field name list.
static const wxChar * GetChars(const wxString &s)
Function GetChars returns a wxChar* to the actual wxChar* data within a wxString, and is helpful for ...
Definition: macros.h:92
const TEMPLATE_FIELDNAMES & GetTemplateFieldNames()
Return a template field names list for read only access.
Definition: schframe.h:314
see class PGM_BASE
void updateDisplay()
Update the listbox showing fields according to the field's text.
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
int GetFieldCount() const
Return the number of fields in this symbol.
BLOCK_STATE_T GetState() const
static LIB_PART * dummy()
Used when a LIB_PART is not found in library to draw a dummy shape This component is a 400 mils squar...
void SetHorizJustify(EDA_TEXT_HJUSTIFY_T aType)
Definition: eda_text.h:193
#define INSTALL_UNBUFFERED_DC(name, parent)
bool IsVisible() const
Definition: eda_text.h:176
bool TestDanglingEnds()
Test all of the connectable objects in the schematic for unused connection points.
Definition: sch_screen.cpp:876
void Draw(EDA_DRAW_PANEL *aPanel, wxDC *aDC, const wxPoint &aOffset, GR_DRAWMODE aDrawMode, COLOR4D aColor=COLOR4D::UNSPECIFIED) override
Function Draw Draw a schematic item.
Dialog used to edit SCH_COMPONENT objects in a schematic.
void SetIgnoreMouseEvents(bool aIgnore)
void SetName(const wxString &aName)
Definition: sch_field.h:85
static wxString SubReference(int aUnit, bool aAddSeparator=true)
Function SubReference.
Class SCH_COMPONENT describes a real schematic component.
Definition: sch_component.h:69
void EditSpiceModel(wxCommandEvent &event) override
const LIB_ID & GetLibId() const
The common library.
void copySelectedFieldToPanel()
Sets the values displayed on the panel according to the currently selected field row.
UTF8 Format() const
Function Format.
Definition: lib_id.cpp:263
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
void ClearFlags(STATUS_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
Definition: base_struct.h:268
#define DBG(x)
Definition: fctsys.h:33
void InitBuffers(SCH_COMPONENT *aComponent)
Initialize controls with aComponent.
class SCH_FILED_VALIDATOR
Definition for part library class.
void showButtonHandler(wxCommandEvent &event) override
static bool IsReferenceStringValid(const wxString &aReferenceString)
Tests for an acceptable reference string.
void setRowItem(int aFieldNdx, const SCH_FIELD &aField)
void SetBold(bool aBold)
Definition: eda_text.h:172
COMPONENT_SELECTION SelectComponentFromLibrary(const SCHLIB_FILTER *aFilter, std::vector< COMPONENT_SELECTION > &aHistoryList, bool aUseLibBrowser, int aUnit, int aConvert, const LIB_ID *aHighlight=nullptr, bool aAllowFields=true)
Function SelectComponentFromLib Calls the library viewer to select component to import into schematic...
Definition: getpart.cpp:102
static wxString FormatSize(EDA_UNITS_T user_unit, int textSize)
Function FormatSize formats a string containing the size in the desired units.
Definition: wxwineda.cpp:84
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:73
VTBL_ENTRY bool ShowModal(wxString *aResult=NULL, wxWindow *aResultantFocusWindow=NULL)
Function ShowModal puts up this wxFrame as if it were a modal dialog, with all other instantiated wxF...
virtual void SetText(const wxString &aText)
Definition: eda_text.h:141
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
bool IsDragging() const
Definition: base_struct.h:233