Component library object encapsulation work.

This commit is contained in:
Wayne Stambaugh 2010-12-07 11:10:42 -05:00
parent a6a34f3509
commit 3fed7b9dd9
21 changed files with 500 additions and 426 deletions

View File

@ -4,6 +4,16 @@ KiCad ChangeLog 2010
Please add newer entries at the top, list the date and your name with
email address.
2010-dec-07 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
================================================================================
++EESchema
* Finish encapsulating LIB_FIELD object.
* Encapsulated all members currently in use in LIB_PIN object.
++Common
* Add SetModified() helper to EDA_BaseStruct object that checks for a parent
object and sets it's modified status as well.
2010-dec-02 UPDATE Wayne Stambaugh <stambaughw@verizon.net>
================================================================================
++EESchema

View File

@ -20,9 +20,7 @@ enum textbox {
};
/******************************************************************************/
EDA_BaseStruct::EDA_BaseStruct( EDA_BaseStruct* parent, KICAD_T idType )
/******************************************************************************/
{
InitVars();
m_StructType = idType;
@ -30,9 +28,7 @@ EDA_BaseStruct::EDA_BaseStruct( EDA_BaseStruct* parent, KICAD_T idType )
}
/********************************************/
EDA_BaseStruct::EDA_BaseStruct( KICAD_T idType )
/********************************************/
{
InitVars();
m_StructType = idType;
@ -51,9 +47,7 @@ EDA_BaseStruct::EDA_BaseStruct( const EDA_BaseStruct& base )
}
/********************************************/
void EDA_BaseStruct::InitVars()
/********************************************/
{
m_StructType = TYPE_NOT_INIT;
Pnext = NULL; // Linked list: Link (next struct)
@ -69,6 +63,16 @@ void EDA_BaseStruct::InitVars()
}
void EDA_BaseStruct::SetModified()
{
m_Flags |= IS_CHANGED;
// If this a child object, then the parent modification state also needs to be set.
if( m_Parent )
m_Parent->SetModified();
}
// see base_struct.h
SEARCH_RESULT EDA_BaseStruct::IterateForward( EDA_BaseStruct* listStart,
INSPECTOR* inspector,

View File

@ -898,7 +898,7 @@ static LIB_PIN* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem,
/* Calculate the pin position (according to the component orientation)
*/
aPosition = DefaultTransform.TransformCoordinate( Pin->m_Pos ) + CmpPosition;
aPosition = DefaultTransform.TransformCoordinate( Pin->GetPosition() ) + CmpPosition;
return Pin;
}

View File

@ -756,7 +756,7 @@ static bool IsTerminalPoint( SCH_SCREEN* screen, const wxPoint& pos, int layer )
{
// Calculate the exact position of the connection point of the pin,
// depending on orientation of the component.
itempos = LibItem->GetScreenCoord( pin->m_Pos );
itempos = LibItem->GetScreenCoord( pin->GetPosition() );
itempos.x += LibItem->m_Pos.x;
itempos.y += LibItem->m_Pos.y;
if( ( itempos.x == pos.x ) && ( itempos.y == pos.y ) )

View File

@ -417,11 +417,11 @@ void LIB_COMPONENT::RemoveDrawItem( LIB_DRAW_ITEM* aItem, WinEDA_DrawPanel* aPan
{
LIB_FIELD* field = (LIB_FIELD*) aItem;
if( field->m_FieldId < MANDATORY_FIELDS )
if( field->GetId() < MANDATORY_FIELDS )
{
wxLogWarning( _( "An attempt was made to remove the %s field \
from component %s in library %s." ),
GetChars( field->m_Name ), GetChars( GetName() ),
GetChars( field->GetName() ), GetChars( GetName() ),
GetChars( GetLibraryName() ) );
return;
}
@ -609,7 +609,7 @@ bool LIB_COMPONENT::Save( FILE* aFile )
// fieldnames.
if( !fields[i].m_Text.IsEmpty() )
{
fields[i].m_FieldId = fieldId++;
fields[i].SetId( fieldId++ );
if( !fields[i].Save( aFile ) )
return false;
}
@ -916,9 +916,9 @@ bool LIB_COMPONENT::LoadField( char* aLine, wxString& aErrorMsg )
return false;
}
if( field->m_FieldId < MANDATORY_FIELDS )
if( field->GetId() < MANDATORY_FIELDS )
{
LIB_FIELD* fixedField = GetField( field->m_FieldId );
LIB_FIELD* fixedField = GetField( field->GetId() );
// this will fire only if somebody broke a constructor or editor.
// MANDATORY_FIELDS are always present in ram resident components, no
@ -927,7 +927,7 @@ bool LIB_COMPONENT::LoadField( char* aLine, wxString& aErrorMsg )
*fixedField = *field;
if( field->m_FieldId == VALUE )
if( field->GetId() == VALUE )
m_name = field->m_Text;
SAFE_DELETE( field );
@ -1055,7 +1055,7 @@ void LIB_COMPONENT::GetFields( LIB_FIELD_LIST& aList )
continue;
field = ( LIB_FIELD* ) &item;
if( (unsigned) field->m_FieldId < MANDATORY_FIELDS )
if( (unsigned) field->GetId() < MANDATORY_FIELDS )
continue; // was added above
aList.push_back( *field );
@ -1072,7 +1072,7 @@ LIB_FIELD* LIB_COMPONENT::GetField( int aId )
LIB_FIELD* field = ( LIB_FIELD* ) &item;
if( field->m_FieldId == aId )
if( field->GetId() == aId )
return field;
}
@ -1089,7 +1089,7 @@ LIB_FIELD* LIB_COMPONENT::FindField( const wxString& aFieldName )
LIB_FIELD* field = ( LIB_FIELD* ) &item;
if( field->m_Name == aFieldName )
if( field->GetName() == aFieldName )
return field;
}
@ -1262,7 +1262,7 @@ void LIB_COMPONENT::DeleteSelectedItems()
{
#if 0 // Set to 1 to allows fields deletion on block delete or other global command
LIB_FIELD& field = ( LIB_FIELD& ) *item;
if( (field.m_FieldId == REFERENCE) || (field.m_FieldId == VALUE) ||
if( (field.GetId() == REFERENCE) || (field.m_FieldId == VALUE) ||
(field.m_Attributs & TEXT_NO_VISIBLE) )
#endif
item->m_Selected = 0;

View File

@ -130,7 +130,8 @@ void WinEDA_SchematicFrame::SendMessageToPCBNEW( EDA_BaseStruct* objectToSync,
break;
Pin = (LIB_PIN*) objectToSync;
if( Pin->m_PinNum )
if( Pin->GetNumber() )
{
wxString pinnum;
Pin->ReturnPinStringNum( pinnum );

View File

@ -64,10 +64,11 @@ LIB_PIN* WinEDA_SchematicFrame::LocatePinEnd( SCH_ITEM* DrawList, const wxPoint&
wxPoint pinpos;
Pin = LocateAnyPin( DrawList, pos, &DrawLibItem );
if( !Pin )
return NULL;
pinpos = Pin->m_Pos;
pinpos = Pin->GetPosition();
if( DrawLibItem == NULL )
NEGATE( pinpos.y ); // In libraries Y axis is bottom to top
@ -78,5 +79,6 @@ LIB_PIN* WinEDA_SchematicFrame::LocatePinEnd( SCH_ITEM* DrawList, const wxPoint&
if( pos == pinpos )
return Pin;
return NULL;
}

View File

@ -249,7 +249,7 @@ An alias %s already exists!\nCannot update this component" ),
// back into the component
for( unsigned i = MANDATORY_FIELDS; i < m_FieldsBuf.size(); )
{
if( m_FieldsBuf[i].m_Name.IsEmpty() || m_FieldsBuf[i].m_Text.IsEmpty() )
if( m_FieldsBuf[i].GetName().IsEmpty() || m_FieldsBuf[i].m_Text.IsEmpty() )
{
m_FieldsBuf.erase( m_FieldsBuf.begin() + i );
continue;
@ -262,7 +262,7 @@ An alias %s already exists!\nCannot update this component" ),
for( unsigned i=0; i<m_FieldsBuf.size(); ++i )
{
printf( "save[%d].name:'%s' value:'%s'\n", i,
CONV_TO_UTF8( m_FieldsBuf[i].m_Name ),
CONV_TO_UTF8( m_FieldsBuf[i].GetName() ),
CONV_TO_UTF8( m_FieldsBuf[i].m_Text ) );
}
#endif
@ -296,7 +296,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::addFieldButtonHandler( wxCommandEvent&
LIB_FIELD blank( fieldNdx );
m_FieldsBuf.push_back( blank );
m_FieldsBuf[fieldNdx].m_Name = TEMPLATE_FIELDNAME::GetDefaultFieldName(fieldNdx);
m_FieldsBuf[fieldNdx].SetName( TEMPLATE_FIELDNAME::GetDefaultFieldName( fieldNdx ) );
setRowItem( fieldNdx, m_FieldsBuf[fieldNdx] );
@ -423,7 +423,7 @@ static LIB_FIELD* findfield( const LIB_FIELD_LIST& aList, const wxString& aField
for( unsigned i=0; i<aList.size(); ++i )
{
if( aFieldName == aList[i].m_Name )
if( aFieldName == aList[i].GetName() )
{
field = &aList[i]; // best to avoid casting here.
break;
@ -437,7 +437,7 @@ LIB_FIELD* DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::findField( const wxString& aField
{
for( unsigned i=0; i<m_FieldsBuf.size(); ++i )
{
if( aFieldName == m_FieldsBuf[i].m_Name )
if( aFieldName == m_FieldsBuf[i].GetName() )
return &m_FieldsBuf[i];
}
return NULL;
@ -455,7 +455,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers()
#if defined(DEBUG)
for( unsigned i=0; i<cmpFields.size(); ++i )
{
printf( "cmpFields[%d].name:%s\n", i, CONV_TO_UTF8( cmpFields[i].m_Name ) );
printf( "cmpFields[%d].name:%s\n", i, CONV_TO_UTF8( cmpFields[i].GetName() ) );
}
#endif
@ -483,7 +483,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers()
// fixed fields:
for( int i=0; i<MANDATORY_FIELDS; ++i )
{
D( printf( "add fixed:%s\n", CONV_TO_UTF8( cmpFields[i].m_Name ) ); )
D( printf( "add fixed:%s\n", CONV_TO_UTF8( cmpFields[i].GetName() ) ); )
m_FieldsBuf.push_back( cmpFields[i] );
}
@ -510,7 +510,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers()
{
D( printf( "add template:%s\n", CONV_TO_UTF8( it->m_Name ) ); )
fld.m_Name = it->m_Name;
fld.SetName( it->m_Name );
fld.m_Text = it->m_Value; // empty? ok too.
if( !it->m_Visible )
@ -520,7 +520,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers()
}
else
{
D( printf( "match template:%s\n", CONV_TO_UTF8( libField->m_Name )); )
D( printf( "match template:%s\n", CONV_TO_UTF8( libField->GetName() ) ); )
fld = *libField; // copy values from component, m_Name too
}
@ -532,11 +532,11 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers()
for( unsigned i=MANDATORY_FIELDS; i<cmpFields.size(); ++i )
{
LIB_FIELD* cmp = &cmpFields[i];
LIB_FIELD* buf = findField( cmp->m_Name );
LIB_FIELD* buf = findField( cmp->GetName() );
if( !buf )
{
D( printf( "add cmp:%s\n", CONV_TO_UTF8( cmp->m_Name )); )
D( printf( "add cmp:%s\n", CONV_TO_UTF8( cmp->GetName() ) ); )
m_FieldsBuf.push_back( *cmp );
}
}
@ -578,7 +578,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::setRowItem( int aFieldNdx, const LIB_FI
fieldListCtrl->SetItem( ndx, COLUMN_TEXT, wxEmptyString );
}
fieldListCtrl->SetItem( aFieldNdx, COLUMN_FIELD_NAME, aField.m_Name );
fieldListCtrl->SetItem( aFieldNdx, COLUMN_FIELD_NAME, aField.GetName() );
fieldListCtrl->SetItem( aFieldNdx, COLUMN_TEXT, aField.m_Text );
// recompute the column widths here, after setting texts
@ -629,17 +629,19 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::copySelectedFieldToPanel()
// Field names have become more important than field ids, so we cannot
// mangle the names in the buffer but we can do so in the panel.
if( field.m_FieldId == VALUE )
{ // This field is the lib name and the default value when loading this component in schematic
// The value is now not editable here (in this dialog) because changing it is equivalent to create
// a new component or alias. This is handles in libedir, not in this dialog.
fieldNameTextCtrl->SetValue( field.m_Name + wxT( " / " ) + _( "Chip Name" ) );
if( field.GetId() == VALUE )
{
// This field is the lib name and the default value when loading this component in
// schematic. The value is now not editable here (in this dialog) because changing
// it is equivalent to create a new component or alias. This is handles in libedir,
// not in this dialog.
fieldNameTextCtrl->SetValue( field.GetName() + wxT( " / " ) + _( "Chip Name" ) );
fieldValueTextCtrl->Enable( false );
}
else
{
fieldValueTextCtrl->Enable( true );
fieldNameTextCtrl->SetValue( field.m_Name );
fieldNameTextCtrl->SetValue( field.GetName() );
}
// if fieldNdx == REFERENCE, VALUE, FOOTPRINT, or DATASHEET, then disable field name editing
@ -731,8 +733,8 @@ bool DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::copyPanelToSelectedField()
// FieldNameTextCtrl has a tricked value in it for VALUE index, do not copy it back.
// It has the "Chip Name" appended.
if( field.m_FieldId >= MANDATORY_FIELDS )
field.m_Name = fieldNameTextCtrl->GetValue();
if( field.GetId() >= MANDATORY_FIELDS )
field.SetName( fieldNameTextCtrl->GetValue() );
setRowItem( fieldNdx, field ); // update fieldListCtrl

View File

@ -100,6 +100,7 @@ void WinEDA_SchematicFrame::EditCmpFieldText( SCH_FIELD* Field, wxDC* DC )
SCH_COMPONENT* Cmp = (SCH_COMPONENT*) Field->GetParent();
fieldNdx = Field->m_FieldId;
if( fieldNdx == VALUE )
{
Entry = CMP_LIBRARY::FindLibraryComponent( Cmp->m_ChipName );

View File

@ -147,10 +147,12 @@ SCH_ITEM* WinEDA_SchematicFrame::FindComponentAndItem( const wxString& component
pos = pSch->m_Pos; /* temporary: will be changed if
* the pin is found */
pin = pSch->GetPin( text_to_find );
if( pin == NULL )
break;
NotFound = FALSE;
pos += pin->m_Pos;
pos += pin->GetPosition();
break;
case 2: // find reference

View File

@ -301,6 +301,8 @@ public:
*/
wxPoint GetPosition() const { return DoGetPosition(); }
void SetPosition( const wxPoint& aPosition ) { DoMove( aPosition ); }
/**
* Mirror the draw object along the horizontal (X) axis about a point.
*

View File

@ -47,8 +47,7 @@ LIB_FIELD::LIB_FIELD(LIB_COMPONENT * aParent, int idfield ) :
}
LIB_FIELD::LIB_FIELD( int idfield ) :
LIB_DRAW_ITEM( COMPONENT_FIELD_DRAW_TYPE, NULL )
LIB_FIELD::LIB_FIELD( int idfield ) : LIB_DRAW_ITEM( COMPONENT_FIELD_DRAW_TYPE, NULL )
{
Init( idfield );
}
@ -56,14 +55,14 @@ LIB_FIELD::LIB_FIELD( int idfield ) :
LIB_FIELD::LIB_FIELD( const LIB_FIELD& field ) : LIB_DRAW_ITEM( field )
{
m_FieldId = field.m_FieldId;
m_id = field.m_id;
m_Pos = field.m_Pos;
m_Size = field.m_Size;
m_Thickness = field.m_Thickness;
m_Orient = field.m_Orient;
m_Attributs = field.m_Attributs;
m_Text = field.m_Text;
m_Name = field.m_Name;
m_name = field.m_name;
m_HJustify = field.m_HJustify;
m_VJustify = field.m_VJustify;
m_Italic = field.m_Italic;
@ -78,7 +77,7 @@ LIB_FIELD::~LIB_FIELD()
void LIB_FIELD::Init( int id )
{
m_FieldId = id;
m_id = id;
m_Size.x = m_Size.y = DEFAULT_SIZE_TEXT;
m_typeName = _( "Field" );
m_Orient = TEXT_ORIENT_HORIZ;
@ -88,7 +87,7 @@ void LIB_FIELD::Init( int id )
// fields in RAM must always have names, because we are trying to get
// less dependent on field ids and more dependent on names.
// Plus assumptions are made in the field editors.
m_Name = TEMPLATE_FIELDNAME::GetDefaultFieldName( id );
m_name = TEMPLATE_FIELDNAME::GetDefaultFieldName( id );
}
@ -98,12 +97,14 @@ bool LIB_FIELD::Save( FILE* ExportFile )
wxString text = m_Text;
hjustify = 'C';
if( m_HJustify == GR_TEXT_HJUSTIFY_LEFT )
hjustify = 'L';
else if( m_HJustify == GR_TEXT_HJUSTIFY_RIGHT )
hjustify = 'R';
vjustify = 'C';
if( m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM )
vjustify = 'B';
else if( m_VJustify == GR_TEXT_VJUSTIFY_TOP )
@ -113,7 +114,7 @@ bool LIB_FIELD::Save( FILE* ExportFile )
text = wxT( "~" );
if( fprintf( ExportFile, "F%d \"%s\" %d %d %d %c %c %c %c%c%c",
m_FieldId, CONV_TO_UTF8( text ), m_Pos.x, m_Pos.y, m_Size.x,
m_id, CONV_TO_UTF8( text ), m_Pos.x, m_Pos.y, m_Size.x,
m_Orient == 0 ? 'H' : 'V',
(m_Attributs & TEXT_NO_VISIBLE ) ? 'I' : 'V',
hjustify, vjustify,
@ -126,11 +127,11 @@ bool LIB_FIELD::Save( FILE* ExportFile )
* Just because default name depends on the language and can change from
* a country to an other
*/
wxString defName = TEMPLATE_FIELDNAME::GetDefaultFieldName( m_FieldId );
wxString defName = TEMPLATE_FIELDNAME::GetDefaultFieldName( m_id );
if( m_FieldId >= FIELD1 && !m_Name.IsEmpty()
&& m_Name != defName
&& fprintf( ExportFile, " \"%s\"", CONV_TO_UTF8( m_Name ) ) < 0 )
if( m_id >= FIELD1 && !m_name.IsEmpty()
&& m_name != defName
&& fprintf( ExportFile, " \"%s\"", CONV_TO_UTF8( m_name ) ) < 0 )
return false;
if( fprintf( ExportFile, "\n" ) < 0 )
@ -150,7 +151,7 @@ bool LIB_FIELD::Load( char* line, wxString& errorMsg )
char fieldUserName[1024];
char* text;
if( sscanf( line + 1, "%d", &m_FieldId ) != 1 || m_FieldId < 0 )
if( sscanf( line + 1, "%d", &m_id ) != 1 || m_id < 0 )
{
errorMsg = wxT( "invalid field header" );
return false;
@ -191,7 +192,7 @@ bool LIB_FIELD::Load( char* line, wxString& errorMsg )
if( cnt < 5 )
{
errorMsg.Printf( wxT( "field %d does not have the correct number of parameters" ),
m_FieldId );
m_id );
return false;
}
@ -260,17 +261,17 @@ bool LIB_FIELD::Load( char* line, wxString& errorMsg )
}
// fields in RAM must always have names.
if( m_FieldId < MANDATORY_FIELDS )
if( m_id < MANDATORY_FIELDS )
{
// Fields in RAM must always have names, because we are trying to get
// less dependent on field ids and more dependent on names.
// Plus assumptions are made in the field editors.
m_Name = TEMPLATE_FIELDNAME::GetDefaultFieldName( m_FieldId );
m_name = TEMPLATE_FIELDNAME::GetDefaultFieldName( m_id );
}
else
{
ReadDelimitedText( fieldUserName, line, sizeof( fieldUserName ) );
m_Name = CONV_FROM_UTF8( fieldUserName );
m_name = CONV_FROM_UTF8( fieldUserName );
}
return true;
@ -369,13 +370,15 @@ bool LIB_FIELD::HitTest( const wxPoint& refPos )
bool LIB_FIELD::HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTransform )
{
int extraCharCount = 0;
// Reference designator text has one or 2 additional character (displays
// U? or U?A)
if( m_FieldId == REFERENCE )
if( m_id == REFERENCE )
{
extraCharCount++;
m_Text.Append('?');
LIB_COMPONENT* parent = (LIB_COMPONENT*)m_Parent;
if ( parent && ( parent->GetPartCount() > 1 ) )
{
m_Text.Append('A');
@ -386,6 +389,7 @@ bool LIB_FIELD::HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTran
wxPoint physicalpos = aTransform.TransformCoordinate( m_Pos );
wxPoint tmp = m_Pos;
m_Pos = physicalpos;
/* The text orientation may need to be flipped if the
* transformation matrix causes xy axes to be flipped.
* this simple algo works only for schematic matrix (rot 90 or/and mirror)
@ -405,9 +409,10 @@ bool LIB_FIELD::HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTran
return hit;
}
LIB_DRAW_ITEM* LIB_FIELD::DoGenCopy()
{
LIB_FIELD* newfield = new LIB_FIELD( m_FieldId );
LIB_FIELD* newfield = new LIB_FIELD( m_id );
Copy( newfield );
@ -429,7 +434,7 @@ void LIB_FIELD::Copy( LIB_FIELD* Target ) const
Target->m_Orient = m_Orient;
Target->m_Attributs = m_Attributs;
Target->m_Text = m_Text;
Target->m_Name = m_Name;
Target->m_name = m_name;
Target->m_HJustify = m_HJustify;
Target->m_VJustify = m_VJustify;
Target->m_Italic = m_Italic;
@ -443,8 +448,8 @@ int LIB_FIELD::DoCompare( const LIB_DRAW_ITEM& other ) const
const LIB_FIELD* tmp = ( LIB_FIELD* ) &other;
if( m_FieldId != tmp->m_FieldId )
return m_FieldId - tmp->m_FieldId;
if( m_id != tmp->m_id )
return m_id - tmp->m_id;
int result = m_Text.CmpNoCase( tmp->m_Text );
@ -511,7 +516,7 @@ void LIB_FIELD::DoPlot( PLOTTER* plotter, const wxPoint& offset, bool fill,
*/
wxString LIB_FIELD::GetFullText( int unit )
{
if( m_FieldId != REFERENCE )
if( m_id != REFERENCE )
return m_Text;
wxString text = m_Text;
@ -547,7 +552,7 @@ int LIB_FIELD::GetDefaultColor()
{
int color;
switch( m_FieldId )
switch( m_id )
{
case REFERENCE:
color = ReturnLayerColor( LAYER_REFERENCEPART );
@ -579,11 +584,11 @@ void LIB_FIELD::Rotate()
}
wxString LIB_FIELD::GetName()
wxString LIB_FIELD::GetName() const
{
wxString name;
switch( m_FieldId )
switch( m_id )
{
case REFERENCE:
name = _( "Reference" );
@ -602,16 +607,30 @@ wxString LIB_FIELD::GetName()
break;
default:
if( m_Name.IsEmpty() )
name.Printf( _( "Field%d" ), m_FieldId );
if( m_name.IsEmpty() )
name.Printf( _( "Field%d" ), m_id );
else
name = m_Name;
name = m_name;
}
return name;
}
void LIB_FIELD::SetName( const wxString& aName )
{
// Mandatory field names are fixed.
if( m_id > MANDATORY_FIELDS )
return;
if( m_name != aName )
{
m_name = aName;
SetModified();
}
}
void LIB_FIELD::SetText( const wxString& aText )
{
if( aText == m_Text )
@ -619,7 +638,7 @@ void LIB_FIELD::SetText( const wxString& aText )
wxString oldName = m_Text;
if( m_FieldId == VALUE && m_Parent != NULL )
if( m_id == VALUE && m_Parent != NULL )
{
LIB_COMPONENT* parent = GetParent();
@ -729,4 +748,3 @@ void LIB_FIELD::DisplayInfo( WinEDA_DrawFrame* aFrame )
// Display field text:
aFrame->AppendMsgPanel( _( "Value" ), m_Text, BROWN );
}

View File

@ -5,7 +5,6 @@
#ifndef CLASS_LIBENTRY_FIELDS_H
#define CLASS_LIBENTRY_FIELDS_H
//#include "general.h"
#include "lib_draw_item.h"
@ -18,6 +17,9 @@
*/
class LIB_FIELD : public LIB_DRAW_ITEM, public EDA_TextStruct
{
int m_id; ///< @see enum NumFieldType
wxString m_name; ///< Name (not the field text value itself, that is .m_Text)
wxString m_savedText; ///< Temporary storage for the string when edition.
bool m_rotate; ///< Flag to indicate a rotation occurred while editing.
bool m_updateText; ///< Flag to indicate text change occurred while editing.
@ -35,11 +37,6 @@ class LIB_FIELD : public LIB_DRAW_ITEM, public EDA_TextStruct
*/
void calcEdit( const wxPoint& aPosition );
public:
int m_FieldId; ///< @see enum NumFieldType
wxString m_Name; ///< Name (not the field text value itself, that is .m_Text)
public:
LIB_FIELD( int idfield = 2 );
@ -62,11 +59,28 @@ public:
*
* The first four field IDs are reserved and therefore always return their respective
* names. The user definable fields will return FieldN where N is the ID of the field
* when the m_Name member is empty.
* when the m_name member is empty.
*
* @return Name of the field.
*/
wxString GetName();
wxString GetName() const;
/**
* Function SetName
*
* Sets a user definable field name to \a aName.
*
* Reserved fields such as value and reference are not renamed. If the field name is
* changed, the field modified flag is set. If the field is the child of a component,
* the parent component's modified flag is also set.
*
* @param aName - User defined field name.
*/
void SetName( const wxString& aName );
int GetId() { return m_id; }
void SetId( int aId ) { m_id = aId; }
/**
* Function GetPenSize virtual pure
@ -133,9 +147,9 @@ public:
void operator=( const LIB_FIELD& field )
{
m_FieldId = field.m_FieldId;
m_id = field.m_id;
m_Text = field.m_Text;
m_Name = field.m_Name;
m_name = field.m_name;
m_Pos = field.m_Pos;
m_Size = field.m_Size;
m_Thickness = field.m_Thickness;

File diff suppressed because it is too large Load Diff

View File

@ -80,6 +80,18 @@ enum DrawPinOrient {
class LIB_PIN : public LIB_DRAW_ITEM
{
wxPoint m_position; ///< Position of the pin.
int m_length; ///< Length of the pin.
int m_orientation; ///< Pin orientation (Up, Down, Left, Right)
int m_shape; ///< Bitwise ORed of pin shapes (see enum DrawPinShape)
int m_width; ///< Line width of the pin.
int m_type; ///< Electrical type of the pin. See enum ElectricPinType.
int m_attributes; ///< Set bit 0 to indicate pin is invisible.
wxString m_name;
long m_number; ///< Pin number defined as 4 ASCII characters like "12", "anod",
///< "G6", or "12". It is stored as "12\0\0" and does not
///< depend on endian type.
/**
* Draw the pin.
*/
@ -87,15 +99,6 @@ class LIB_PIN : public LIB_DRAW_ITEM
int aColor, int aDrawMode, void* aData, const TRANSFORM& aTransform );
public:
int m_PinLen; /* Pin length */
int m_Orient; /* Pin orientation (Up, Down, Left, Right) */
int m_PinShape; /* Bitwise ORed: Pin shape (see enum DrawPinShape) */
int m_PinType; /* Electrical pin properties */
int m_Attributs; /* bit 0 != 0: pin invisible */
long m_PinNum; /* Pin number: 4 ASCII code like "12" or "anod"
* or "G6" "12" is stored as "12\0\0" ans does not
* depend on endian type*/
wxString m_PinName;
int m_PinNumSize;
int m_PinNameSize; /* Pin num and Pin name sizes */
@ -107,10 +110,6 @@ public:
char m_PinNumPositionOpt;
char m_PinNamePositionOpt;
wxPoint m_Pos; /* Position or centre (Arc and Circle) or start
* point (segments) */
int m_Width; /* Line width */
public:
LIB_PIN( LIB_COMPONENT * aParent );
LIB_PIN( const LIB_PIN& aPin );
@ -165,17 +164,13 @@ public:
* Pin numbers are coded as a long or 4 ASCII characters. Used to print
* or draw the pin number.
*
* @param aStringBuffer - the wxString to store the pin num as an unicode
* string
* @param aStringBuffer - the wxString to store the pin num as an unicode string
*/
void ReturnPinStringNum( wxString& aStringBuffer ) const;
long GetNumber() const { return m_number; }
wxString GetNumber()
{
return ReturnPinStringNum( m_PinNum );
}
wxString GetNumberString() const { return ReturnPinStringNum( m_number ); }
/**
* Function ReturnPinStringNum (static function)
@ -188,6 +183,8 @@ public:
void SetPinNumFromString( wxString& aBuffer );
wxString GetName() const { return m_name; }
/**
* Set the pin name.
*
@ -227,25 +224,29 @@ public:
*/
void SetNumberTextSize( int aSize );
int GetOrientation() const { return m_orientation; }
/**
* Set orientation on the pin.
*
* This will also update the orientation of the pins marked by
* EnableEditMode().
* This will also update the orientation of the pins marked by EnableEditMode().
*
* @param aOrientation - The orientation of the pin.
*/
void SetOrientation( int aOrientation );
int GetShape() const { return m_shape; }
/**
* Set the draw style of the pin.
* Set the shape of the pin to \a aShape.
*
* This will also update the draw style of the pins marked by
* EnableEditMode().
* This will also update the draw style of the pins marked by EnableEditMode().
*
* @param aStyle - The draw style of the pin.
* @param aShape - The draw shape of the pin. See enum DrawPinShape.
*/
void SetDrawStyle( int aStyle );
void SetShape( int aShape );
int GetType() const { return m_type; }
/**
* Set the electrical type of the pin.
@ -255,7 +256,7 @@ public:
*
* @param aType - The electrical type of the pin.
*/
void SetElectricalType( int aType );
void SetType( int aType );
/**
* Set the pin length.
@ -266,6 +267,8 @@ public:
*/
void SetLength( int aLength );
int GetLength() { return m_length; }
/**
* Set the pin part number.
*
@ -320,7 +323,7 @@ public:
*
* @return True if draw object is visible otherwise false.
*/
bool IsVisible() { return ( m_Attributs & PINNOTDRAW ) == 0; }
bool IsVisible() { return ( m_attributes & PINNOTDRAW ) == 0; }
/**
* @return the size of the "pen" that be used to draw or plot this item.
@ -436,12 +439,12 @@ protected:
virtual void DoOffset( const wxPoint& aOffset );
virtual bool DoTestInside( EDA_Rect& aRect ) const;
virtual void DoMove( const wxPoint& aPosition );
virtual wxPoint DoGetPosition() const { return m_Pos; }
virtual wxPoint DoGetPosition() const { return m_position; }
virtual void DoMirrorHorizontal( const wxPoint& aCenter );
virtual void DoPlot( PLOTTER* aPlotter, const wxPoint& aOffset, bool aFill,
const TRANSFORM& aTransform );
virtual int DoGetWidth() const { return m_Width; }
virtual void DoSetWidth( int aWidth ) { m_Width = aWidth; }
virtual int DoGetWidth() const { return m_width; }
virtual void DoSetWidth( int aWidth );
};

View File

@ -30,7 +30,7 @@ void LIB_EDIT_FRAME::EditField( wxDC* DC, LIB_FIELD* aField )
// Editing the component value field is equivalent to creating a new component based
// on the current component. Set the dialog message to inform the user.
if( aField->m_FieldId == VALUE )
if( aField->GetId() == VALUE )
{
caption = _( "Component Name" );
title = _( "Enter a name to create a new component based on this one." );
@ -51,7 +51,7 @@ void LIB_EDIT_FRAME::EditField( wxDC* DC, LIB_FIELD* aField )
text.Replace( wxT( " " ), wxT( "_" ) );
if( ( aField->m_FieldId == REFERENCE || aField->m_FieldId == VALUE ) && text.IsEmpty ( ) )
if( ( aField->GetId() == REFERENCE || aField->GetId() == VALUE ) && text.IsEmpty ( ) )
{
title.Printf( _( "A %s field cannot be empty." ), GetChars(aField->GetName().Lower() ) );
DisplayError( this, title );
@ -64,7 +64,7 @@ void LIB_EDIT_FRAME::EditField( wxDC* DC, LIB_FIELD* aField )
* the old one. Rename the component and remove any conflicting aliases to prevent name
* errors when updating the library.
*/
if( aField->m_FieldId == VALUE )
if( aField->GetId() == VALUE )
{
wxString msg;

View File

@ -445,7 +445,7 @@ static bool sortPinsByNum( NETLIST_OBJECT* aPin1, NETLIST_OBJECT* aPin2 )
static bool sortPinsByNumber( LIB_PIN* aPin1, LIB_PIN* aPin2 )
{
// return "lhs < rhs"
return RefDesStringCompare( aPin1->GetNumber(), aPin2->GetNumber() ) < 0;
return RefDesStringCompare( aPin1->GetNumberString(), aPin2->GetNumberString() ) < 0;
}
@ -758,7 +758,7 @@ XNODE* EXPORT_HELP::makeGenericLibParts()
{
XNODE* xfield;
xfields->AddChild( xfield = node( sField, fieldList[i].m_Text ) );
xfield->AddAttribute( sName, fieldList[i].m_Name );
xfield->AddAttribute( sName, fieldList[i].GetName() );
}
}
@ -778,7 +778,7 @@ XNODE* EXPORT_HELP::makeGenericLibParts()
XNODE* pin;
pins->AddChild( pin = node( sPin ) );
pin->AddAttribute( sNum, pinList[i]->GetNumber() );
pin->AddAttribute( sNum, pinList[i]->GetNumberString() );
// caution: construction work site here, drive slowly
}
@ -1489,7 +1489,7 @@ bool EXPORT_HELP::addPinToComponentPinList( SCH_COMPONENT* aComponent,
if( pin->m_Link != aComponent )
continue;
if( pin->m_PinNum != aPin->m_PinNum )
if( pin->m_PinNum != aPin->GetNumber() )
continue;
// most expensive test at the end.

View File

@ -641,7 +641,7 @@ static void AddConnectedObjects( SCH_SHEET_PATH* sheetlist,
if( pin->GetConvert() && ( pin->GetConvert() != DrawLibItem->m_Convert ) )
continue;
wxPoint pos2 = DrawLibItem->m_Transform.TransformCoordinate( pin->m_Pos ) +
wxPoint pos2 = DrawLibItem->m_Transform.TransformCoordinate( pin->GetPosition() ) +
DrawLibItem->m_Pos;
new_item = new NETLIST_OBJECT();
@ -650,15 +650,14 @@ static void AddConnectedObjects( SCH_SHEET_PATH* sheetlist,
new_item->m_SheetList = *sheetlist;
new_item->m_Type = NET_PIN;
new_item->m_Link = DrawLibItem;
new_item->m_ElectricalType = pin->m_PinType;
new_item->m_PinNum = pin->m_PinNum;
new_item->m_Label = pin->m_PinName;
new_item->m_ElectricalType = pin->GetType();
new_item->m_PinNum = pin->GetNumber();
new_item->m_Label = pin->GetName();
new_item->m_Start = new_item->m_End = pos2;
aNetItemBuffer.push_back( new_item );
if( ( (int) pin->m_PinType == (int) PIN_POWER_IN )
&& ( pin->m_Attributs & PINNOTDRAW ) )
if( ( (int) pin->GetType() == (int) PIN_POWER_IN ) && !pin->IsVisible() )
{
/* There is an associated PIN_LABEL. */
new_item = new NETLIST_OBJECT();
@ -666,7 +665,7 @@ static void AddConnectedObjects( SCH_SHEET_PATH* sheetlist,
new_item->m_Comp = NULL;
new_item->m_SheetList = *sheetlist;
new_item->m_Type = NET_PINLABEL;
new_item->m_Label = pin->m_PinName;
new_item->m_Label = pin->GetName();
new_item->m_Start = pos2;
new_item->m_End = new_item->m_Start;

View File

@ -51,12 +51,13 @@ void LIB_EDIT_FRAME::OnRotatePin( wxCommandEvent& event )
LIB_PIN* pin = (LIB_PIN*) m_drawItem;
// Save old pin orientation
LastPinOrient = pin -> m_Orient;
LastPinOrient = pin->GetOrientation();
if( !pin->InEditMode() )
SaveCopyInUndoList( pin->GetParent() );
// Get the actual pin orientation index
int orientationIndex = pin -> GetOrientationCodeIndex(pin -> m_Orient);
int orientationIndex = pin->GetOrientationCodeIndex( pin->GetOrientation() );
// Compute the next orientation, swap lower two bits for the right order
orientationIndex = ((orientationIndex & 2) >> 1) | ((orientationIndex & 1) << 1);
@ -64,7 +65,7 @@ void LIB_EDIT_FRAME::OnRotatePin( wxCommandEvent& event )
orientationIndex = ((orientationIndex & 2) >> 1) | ((orientationIndex & 1) << 1);
// Set the new orientation
pin->SetOrientation(pin->GetOrientationCode(orientationIndex));
pin->SetOrientation( pin->GetOrientationCode( orientationIndex ) );
OnModify( );
pin->DisplayInfo( this );
@ -86,23 +87,23 @@ void LIB_EDIT_FRAME::OnEditPin( wxCommandEvent& event )
wxString units = GetUnitsLabel( g_UserUnit );
dlg.SetOrientationList( LIB_PIN::GetOrientationNames(), LIB_PIN::GetOrientationSymbols() );
dlg.SetOrientation( LIB_PIN::GetOrientationCodeIndex( pin->m_Orient ) );
dlg.SetOrientation( LIB_PIN::GetOrientationCodeIndex( pin->GetOrientation() ) );
dlg.SetStyleList( LIB_PIN::GetStyleNames(), LIB_PIN::GetStyleSymbols() );
dlg.SetStyle( LIB_PIN::GetStyleCodeIndex( pin->m_PinShape ) );
dlg.SetStyle( LIB_PIN::GetStyleCodeIndex( pin->GetShape() ) );
dlg.SetElectricalTypeList( LIB_PIN::GetElectricalTypeNames(),
LIB_PIN::GetElectricalTypeSymbols() );
dlg.SetElectricalType( pin->m_PinType );
dlg.SetName( pin->m_PinName );
dlg.SetElectricalType( pin->GetType() );
dlg.SetName( pin->GetName() );
dlg.SetNameTextSize( ReturnStringFromValue( g_UserUnit,
pin->m_PinNameSize,
m_InternalUnits ) );
dlg.SetNameTextSizeUnits( units );
dlg.SetNumber( pin->GetNumber() );
dlg.SetNumber( pin->GetNumberString() );
dlg.SetNumberTextSize( ReturnStringFromValue( g_UserUnit,
pin->m_PinNumSize,
m_InternalUnits ) );
dlg.SetNumberTextSizeUnits( units );
dlg.SetLength( ReturnStringFromValue( g_UserUnit, pin->m_PinLen, m_InternalUnits ) );
dlg.SetLength( ReturnStringFromValue( g_UserUnit, pin->GetLength(), m_InternalUnits ) );
dlg.SetLengthUnits( units );
dlg.SetAddToAllParts( pin->GetUnit() == 0 );
dlg.SetAddToAllBodyStyles( pin->GetConvert() == 0 );
@ -150,8 +151,8 @@ void LIB_EDIT_FRAME::OnEditPin( wxCommandEvent& event )
pin->SetNumberTextSize( LastPinNumSize );
pin->SetOrientation( LastPinOrient );
pin->SetLength( LastPinLength );
pin->SetElectricalType( LastPinType );
pin->SetDrawStyle( LastPinShape );
pin->SetType( LastPinType );
pin->SetShape( LastPinShape );
pin->SetConversion( ( LastPinCommonConvert ) ? 0 : m_convert );
pin->SetPartNumber( ( LastPinCommonUnit ) ? 0 : m_unit );
pin->SetVisible( LastPinVisible );
@ -224,10 +225,9 @@ void LIB_EDIT_FRAME::PlacePin( wxDC* DC )
newpos.y = -GetScreen()->m_Curseur.y;
// Tst for an other pin in same new position:
for( Pin = m_component->GetNextPin(); Pin != NULL;
Pin = m_component->GetNextPin( Pin ) )
for( Pin = m_component->GetNextPin(); Pin != NULL; Pin = m_component->GetNextPin( Pin ) )
{
if( Pin == CurrentPin || newpos != Pin->m_Pos || Pin->m_Flags )
if( Pin == CurrentPin || newpos != Pin->GetPosition() || Pin->m_Flags )
continue;
if( ask_for_pin && !g_EditPinByPinIsOn )
@ -238,6 +238,7 @@ void LIB_EDIT_FRAME::PlacePin( wxDC* DC )
another pin. Continue?" ) );
DrawPanel->MouseToCursorSchema();
DrawPanel->m_IgnoreMouseEvents = false;
if( !status )
return;
else
@ -254,16 +255,18 @@ another pin. Continue?" ) );
DrawPanel->ManageCurseur = NULL;
DrawPanel->ForceCloseManageCurseur = NULL;
OnModify( );
CurrentPin->m_Pos = newpos;
OnModify();
CurrentPin->SetPosition( newpos );
if( CurrentPin->IsNew() )
{
LastPinOrient = CurrentPin->m_Orient;
LastPinType = CurrentPin->m_PinType;
LastPinShape = CurrentPin->m_PinShape;
LastPinOrient = CurrentPin->GetOrientation();
LastPinType = CurrentPin->GetType();
LastPinShape = CurrentPin->GetShape();
if( !g_EditPinByPinIsOn )
CreateImagePins( CurrentPin, m_unit, m_convert, m_showDeMorgan );
m_lastDrawItem = CurrentPin;
m_component->AddDrawItem( m_drawItem );
}
@ -273,7 +276,8 @@ another pin. Continue?" ) );
{
if( Pin->m_Flags == 0 )
continue;
Pin->m_Pos = CurrentPin->m_Pos;
Pin->SetPosition( CurrentPin->GetPosition() );
Pin->m_Flags = 0;
}
@ -308,14 +312,14 @@ void LIB_EDIT_FRAME::StartMovePin( wxDC* DC )
Pin->m_Flags = 0;
if( Pin == CurrentPin )
continue;
if( ( Pin->m_Pos == CurrentPin->m_Pos )
&& ( Pin->m_Orient == CurrentPin->m_Orient )
if( ( Pin->GetPosition() == CurrentPin->GetPosition() )
&& ( Pin->GetOrientation() == CurrentPin->GetOrientation() )
&& ( g_EditPinByPinIsOn == false ) )
Pin->m_Flags |= IS_LINKED | IS_MOVED;
}
CurrentPin->m_Flags |= IS_LINKED | IS_MOVED;
PinPreviousPos = OldPos = CurrentPin->m_Pos;
PinPreviousPos = OldPos = CurrentPin->GetPosition();
startPos.x = OldPos.x;
startPos.y = -OldPos.y;
@ -345,28 +349,27 @@ static void DrawMovePin( WinEDA_DrawPanel* panel, wxDC* DC, bool erase )
if( CurrentPin == NULL || CurrentPin->Type() != COMPONENT_PIN_DRAW_TYPE )
return;
wxPoint pinpos = CurrentPin->m_Pos;
wxPoint pinpos = CurrentPin->GetPosition();
bool showPinText = true;
/* Erase pin in old position */
if( erase )
{
CurrentPin->m_Pos = PinPreviousPos;
CurrentPin->SetPosition( PinPreviousPos );
CurrentPin->Draw( panel, DC, wxPoint( 0, 0 ), -1, g_XorMode,
&showPinText, DefaultTransform );
}
/* Redraw pin in new position */
CurrentPin->m_Pos.x = panel->GetScreen()->m_Curseur.x;
CurrentPin->m_Pos.y = -panel->GetScreen()->m_Curseur.y;
CurrentPin->SetPosition( panel->GetScreen()->GetCursorDrawPosition() );
CurrentPin->Draw( panel, DC, wxPoint( 0, 0 ), -1, g_XorMode, &showPinText, DefaultTransform );
PinPreviousPos = CurrentPin->m_Pos;
PinPreviousPos = CurrentPin->GetPosition();
/* Keep the original position for existing pin (for Undo command)
* and the current position for a new pin */
if( !CurrentPin->IsNew() )
CurrentPin->m_Pos = pinpos;
CurrentPin->SetPosition( pinpos );
}
@ -384,7 +387,7 @@ void LIB_EDIT_FRAME::DeletePin( wxDC* DC, LIB_COMPONENT* LibEntry, LIB_PIN* Pin
if( LibEntry == NULL || Pin == NULL )
return;
PinPos = Pin->m_Pos;
PinPos = Pin->GetPosition();
LibEntry->RemoveDrawItem( (LIB_DRAW_ITEM*) Pin, DrawPanel, DC );
if( g_EditPinByPinIsOn == false )
@ -396,7 +399,7 @@ void LIB_EDIT_FRAME::DeletePin( wxDC* DC, LIB_COMPONENT* LibEntry, LIB_PIN* Pin
Pin = tmp;
tmp = LibEntry->GetNextPin( Pin );
if( Pin->m_Pos != PinPos )
if( Pin->GetPosition() != PinPos )
continue;
LibEntry->RemoveDrawItem( (LIB_DRAW_ITEM*) Pin );
@ -432,30 +435,18 @@ void LIB_EDIT_FRAME::CreatePin( wxDC* DC )
if( g_EditPinByPinIsOn == false )
pin->m_Flags |= IS_LINKED;
pin->m_Pos = GetScreen()->GetCursorDrawPosition();
pin->m_PinLen = LastPinLength;
pin->m_Orient = LastPinOrient;
pin->m_PinType = LastPinType;
pin->m_PinShape = LastPinShape;
pin->SetPosition( GetScreen()->GetCursorDrawPosition() );
pin->SetLength( LastPinLength );
pin->SetOrientation( LastPinOrient );
pin->SetType( LastPinType );
pin->SetShape( LastPinShape );
pin->m_PinNameSize = LastPinNameSize;
pin->m_PinNumSize = LastPinNumSize;
pin->SetConvert( LastPinCommonConvert ? 0 : m_convert );
pin->SetUnit( LastPinCommonUnit ? 0 : m_unit );
pin->SetVisible( LastPinVisible );
if( LastPinCommonConvert )
pin->SetConvert( 0 );
else
pin->SetConvert( m_convert );
if( LastPinCommonUnit )
pin->SetUnit( 0 );
else
pin->SetUnit( m_unit );
if( LastPinVisible )
pin->m_Attributs &= ~PINNOTDRAW;
else
pin->m_Attributs |= PINNOTDRAW;
PinPreviousPos = pin->m_Pos;
PinPreviousPos = pin->GetPosition();
DrawPanel->m_IgnoreMouseEvents = true;
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
cmd.SetId( ID_LIBEDIT_EDIT_PIN );
@ -463,7 +454,7 @@ void LIB_EDIT_FRAME::CreatePin( wxDC* DC )
DrawPanel->MouseToCursorSchema();
DrawPanel->m_IgnoreMouseEvents = false;
if (pin->m_Flags & IS_CANCELLED)
if( pin->m_Flags & IS_CANCELLED )
{
DeletePin( NULL, m_component, pin );
m_drawItem = NULL;
@ -473,6 +464,7 @@ void LIB_EDIT_FRAME::CreatePin( wxDC* DC )
ClearTempCopyComponent();
DrawPanel->ManageCurseur = DrawMovePin;
DrawPanel->ForceCloseManageCurseur = AbortPinMove;
if( DC )
pin->Draw( DrawPanel, DC, wxPoint( 0, 0 ), -1, wxCOPY, &showPinText,
DefaultTransform );
@ -498,10 +490,12 @@ static void CreateImagePins( LIB_PIN* Pin, int unit, int convert, bool asDeMorga
if( CreateConv == true )
{
NewPin = (LIB_PIN*) Pin->GenCopy();
if( Pin->GetConvert() > 1 )
NewPin->SetConvert( 1 );
else
NewPin->SetConvert( 2 );
Pin->GetParent()->AddDrawItem( NewPin );
}
@ -511,8 +505,10 @@ static void CreateImagePins( LIB_PIN* Pin, int unit, int convert, bool asDeMorga
continue; /* Pin common to all units. */
NewPin = (LIB_PIN*) Pin->GenCopy();
if( convert != 0 )
NewPin->SetConvert( 1 );
NewPin->SetUnit( ii );
Pin->GetParent()->AddDrawItem( NewPin );
@ -521,8 +517,10 @@ static void CreateImagePins( LIB_PIN* Pin, int unit, int convert, bool asDeMorga
NewPin = (LIB_PIN*) Pin->GenCopy();
NewPin->SetConvert( 2 );
if( Pin->GetUnit() != 0 )
NewPin->SetUnit( ii );
Pin->GetParent()->AddDrawItem( NewPin );
}
}
@ -544,12 +542,14 @@ void LIB_EDIT_FRAME::GlobalSetPins( wxDC* DC, LIB_PIN* MasterPin, int id )
if( ( m_component == NULL ) || ( MasterPin == NULL ) )
return;
if( MasterPin->Type() != COMPONENT_PIN_DRAW_TYPE )
return;
OnModify( );
Pin = m_component->GetNextPin();
for( ; Pin != NULL; Pin = m_component->GetNextPin( Pin ) )
{
if( ( Pin->GetConvert() ) && ( Pin->GetConvert() != m_convert ) )
@ -572,7 +572,7 @@ void LIB_EDIT_FRAME::GlobalSetPins( wxDC* DC, LIB_PIN* MasterPin, int id )
break;
case ID_POPUP_LIBEDIT_PIN_GLOBAL_CHANGE_PINSIZE_ITEM:
Pin->m_PinLen = MasterPin->m_PinLen;
Pin->SetLength( MasterPin->GetLength() );
break;
}
@ -588,15 +588,15 @@ void LIB_EDIT_FRAME::RepeatPinItem( wxDC* DC, LIB_PIN* SourcePin )
LIB_PIN* Pin;
wxString msg;
if( m_component == NULL || SourcePin == NULL
|| SourcePin->Type() != COMPONENT_PIN_DRAW_TYPE )
if( m_component == NULL || SourcePin == NULL || SourcePin->Type() != COMPONENT_PIN_DRAW_TYPE )
return;
Pin = (LIB_PIN*) SourcePin->GenCopy();
Pin->m_Flags = IS_NEW;
Pin->m_Pos.x += g_RepeatStep.x;
Pin->m_Pos.y += -g_RepeatStep.y;
IncrementLabelMember( Pin->m_PinName );
Pin->SetPosition( Pin->GetPosition() + wxPoint( g_RepeatStep.x, -g_RepeatStep.y ) );
wxString nextName = Pin->GetName();
IncrementLabelMember( nextName );
Pin->SetName( nextName );
Pin->ReturnPinStringNum( msg );
IncrementLabelMember( msg );
@ -609,8 +609,8 @@ void LIB_EDIT_FRAME::RepeatPinItem( wxDC* DC, LIB_PIN* SourcePin )
wxPoint savepos = GetScreen()->m_Curseur;
DrawPanel->CursorOff( DC );
GetScreen()->m_Curseur.x = Pin->m_Pos.x;
GetScreen()->m_Curseur.y = -Pin->m_Pos.y;
GetScreen()->m_Curseur.x = Pin->GetPosition().x;
GetScreen()->m_Curseur.y = -Pin->GetPosition().y;
// Add this new pin in list, and creates pins for others parts if needed
m_drawItem = Pin;
@ -629,16 +629,18 @@ void LIB_EDIT_FRAME::RepeatPinItem( wxDC* DC, LIB_PIN* SourcePin )
/* helper function to sort pins by pin num */
bool sort_by_pin_number( const LIB_PIN* ref, const LIB_PIN* tst )
{
int test = ref->m_PinNum - tst->m_PinNum;
int test = ref->GetNumber() - tst->GetNumber();
if( test == 0 )
{
test = ref->GetConvert() - tst->GetConvert();
}
if( test == 0 )
{
test = ref->GetUnit() - tst->GetUnit();
}
return test < 0;
}
@ -686,7 +688,7 @@ void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
LIB_PIN* curr_pin = PinList[ii];
Pin = PinList[ii - 1];
if( Pin->m_PinNum != curr_pin->m_PinNum
if( Pin->GetNumber() != curr_pin->GetNumber()
|| Pin->GetConvert() != curr_pin->GetConvert()
|| Pin->GetUnit() != curr_pin->GetUnit() )
continue;
@ -697,13 +699,13 @@ void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
msg.Printf( _( "<b>Duplicate pin %s</b> \"%s\" at location <b>(%.3f, \
%.3f)</b> conflicts with pin %s \"%s\" at location <b>(%.3f, %.3f)</b>" ),
GetChars( stringCurrPinNum ),
GetChars( curr_pin->m_PinName ),
(float) curr_pin->m_Pos.x / 1000.0,
(float) -curr_pin->m_Pos.y / 1000.0,
GetChars( curr_pin->GetName() ),
(float) curr_pin->GetPosition().x / 1000.0,
(float) -curr_pin->GetPosition().y / 1000.0,
GetChars( stringPinNum ),
GetChars( Pin->m_PinName ),
(float) Pin->m_Pos.x / 1000.0,
(float) -Pin->m_Pos.y / 1000.0 );
GetChars( Pin->GetName() ),
(float) Pin->GetPosition().x / 1000.0,
(float) -Pin->GetPosition().y / 1000.0 );
if( m_component->GetPartCount() > 1 )
{
@ -725,24 +727,24 @@ void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
// Test for off grid pins:
offgrid_error = 0;
for( unsigned ii = 0; ii < PinList.size(); ii++ )
{
Pin = PinList[ii];
if( ( (Pin->m_Pos.x % MIN_GRID_SIZE) == 0 ) &&
( (Pin->m_Pos.y % MIN_GRID_SIZE) == 0 ) )
if( ( (Pin->GetPosition().x % MIN_GRID_SIZE) == 0 ) &&
( (Pin->GetPosition().y % MIN_GRID_SIZE) == 0 ) )
continue;
// A pin is foun here off grid
offgrid_error++;
wxString stringPinNum;
Pin->ReturnPinStringNum( stringPinNum );
msg.Printf( _( "<b>Off grid pin %s</b> \"%s\" at location <b>(%.3f, \
%.3f)</b>" ),
msg.Printf( _( "<b>Off grid pin %s</b> \"%s\" at location <b>(%.3f, %.3f)</b>" ),
GetChars( stringPinNum ),
GetChars( Pin->m_PinName ),
(float) Pin->m_Pos.x / 1000.0,
(float) -Pin->m_Pos.y / 1000.0 );
GetChars( Pin->GetName() ),
(float) Pin->GetPosition().x / 1000.0,
(float) -Pin->GetPosition().y / 1000.0 );
if( m_component->GetPartCount() > 1 )
{
@ -763,9 +765,7 @@ void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
}
if( !dup_error && !offgrid_error )
DisplayInfoMessage( this,
_( "No off grid or duplicate pins were found." ) );
DisplayInfoMessage( this, _( "No off grid or duplicate pins were found." ) );
else
error_display.ShowModal();
}

View File

@ -94,15 +94,15 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_COMPONENT& libComponent,
{
// Can no longer insert an empty name, since names are now keys. The
// field index is not used beyond the first MANDATORY_FIELDS
if( it->m_Name.IsEmpty() )
if( it->GetName().IsEmpty() )
continue;
// See if field by same name already exists.
SCH_FIELD* schField = FindField( it->m_Name );
SCH_FIELD* schField = FindField( it->GetName() );
if( !schField )
{
SCH_FIELD fld( wxPoint( 0, 0 ), GetFieldCount(), this, it->m_Name );
SCH_FIELD fld( wxPoint( 0, 0 ), GetFieldCount(), this, it->GetName() );
schField = AddField( fld );
}
@ -1586,21 +1586,24 @@ bool SCH_COMPONENT::Matches( wxFindReplaceData& aSearchData, void* aAuxData, wxP
{
LIB_PIN_LIST pinList;
Entry->GetPins( pinList, m_Multi, m_Convert );
// Search for a match in pinList
for( unsigned ii = 0; ii < pinList.size(); ii ++ )
{
LIB_PIN* pin = pinList[ii];
wxString pinNum;
pin->ReturnPinStringNum( pinNum );
if( SCH_ITEM::Matches(pin->m_PinName, aSearchData ) ||
SCH_ITEM::Matches(pinNum, aSearchData ) )
if( SCH_ITEM::Matches( pin->GetName(), aSearchData ) ||
SCH_ITEM::Matches( pinNum, aSearchData ) )
{
if( aFindLocation )
{
wxPoint pinpos = pin->m_Pos;
wxPoint pinpos = pin->GetPosition();
pinpos = m_Transform.TransformCoordinate( pinpos );
*aFindLocation = pinpos + m_Pos;
}
return true;
}
@ -1640,7 +1643,7 @@ wxPoint SCH_COMPONENT::GetPinPhysicalPosition( LIB_PIN* Pin )
wxCHECK_MSG( Pin != NULL && Pin->Type() == COMPONENT_PIN_DRAW_TYPE, wxPoint( 0, 0 ),
wxT( "Cannot get physical position of pin." ) );
return m_Transform.TransformCoordinate( Pin->m_Pos ) + m_Pos;
return m_Transform.TransformCoordinate( Pin->GetPosition() ) + m_Pos;
}
@ -1680,6 +1683,6 @@ void SCH_COMPONENT::GetConnectionPoints( vector< wxPoint >& aPoints ) const
continue;
// Calculate the pin position relative to the component position and orientation.
aPoints.push_back( m_Transform.TransformCoordinate( pin->m_Pos ) + m_Pos );
aPoints.push_back( m_Transform.TransformCoordinate( pin->GetPosition() ) + m_Pos );
}
}

View File

@ -359,6 +359,8 @@ public:
inline bool IsDragging() const { return m_Flags & IS_DRAGGED; }
inline bool IsSelected() const { return m_Flags & SELECTED; }
void SetModified();
int GetState( int type ) const
{
return m_Status & type;