Add hit testing clarification to schematic library editor.

* Create library collector class.
* Add clarification menu to library editor when multiple items are found
  at the current position.
* Add get clarification menu text to all objects derived from LIB_ITEM.
* Add get menu bitmap for all objects derived from LIB_ITEM.
* Improve LIB_PIN bounding box calculation.
* Rename LIB_ITEM::DoGenCopy to doClone to match behavior defined in base
  class EDA_ITEM.
* Minor class renaming for improved code consistency.
* Added less than operator to EDA_ITEM.
This commit is contained in:
Wayne Stambaugh 2011-04-27 15:44:32 -04:00
parent 585655e207
commit 86bf955db7
42 changed files with 848 additions and 459 deletions

View File

@ -81,7 +81,6 @@ EDA_ITEM* EDA_ITEM::doClone() const
}
// see base_struct.h
SEARCH_RESULT EDA_ITEM::IterateForward( EDA_ITEM* listStart,
INSPECTOR* inspector,
const void* testData,
@ -135,6 +134,15 @@ wxString EDA_ITEM::GetSelectMenuText() const
}
bool EDA_ITEM::operator<( const EDA_ITEM& aItem ) const
{
wxFAIL_MSG( wxString::Format( wxT( "Less than operator not defined for item type %s." ),
GetChars( GetClass() ) ) );
return false;
}
#if defined(DEBUG)

View File

@ -94,6 +94,7 @@ set(EESCHEMA_SRCS
lib_arc.cpp
lib_bezier.cpp
lib_circle.cpp
lib_collectors.cpp
lib_draw_item.cpp
lib_export.cpp
lib_field.cpp

View File

@ -189,7 +189,7 @@ LIB_COMPONENT::LIB_COMPONENT( const wxString& aName, CMP_LIBRARY* aLibrary ) :
LIB_COMPONENT::LIB_COMPONENT( LIB_COMPONENT& aComponent, CMP_LIBRARY* aLibrary ) :
EDA_ITEM( aComponent )
{
LIB_DRAW_ITEM* newItem;
LIB_ITEM* newItem;
m_library = aLibrary;
m_name = aComponent.m_name;
@ -202,12 +202,12 @@ LIB_COMPONENT::LIB_COMPONENT( LIB_COMPONENT& aComponent, CMP_LIBRARY* aLibrary )
m_dateModified = aComponent.m_dateModified;
m_options = aComponent.m_options;
BOOST_FOREACH( LIB_DRAW_ITEM& oldItem, aComponent.GetDrawItemList() )
BOOST_FOREACH( LIB_ITEM& oldItem, aComponent.GetDrawItemList() )
{
if( oldItem.IsNew() )
continue;
newItem = oldItem.GenCopy();
newItem = (LIB_ITEM*) oldItem.Clone();
newItem->SetParent( this );
drawings.push_back( newItem );
}
@ -294,7 +294,7 @@ void LIB_COMPONENT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDc, const wxPoint& aOff
*/
if( ! (screen->m_IsPrinting && GetGRForceBlackPenState()) && (aColor == -1) )
{
BOOST_FOREACH( LIB_DRAW_ITEM& drawItem, drawings )
BOOST_FOREACH( LIB_ITEM& drawItem, drawings )
{
if( drawItem.m_Fill != FILLED_WITH_BG_BODYCOLOR )
continue;
@ -327,7 +327,7 @@ void LIB_COMPONENT::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDc, const wxPoint& aOff
}
}
BOOST_FOREACH( LIB_DRAW_ITEM& drawItem, drawings )
BOOST_FOREACH( LIB_ITEM& drawItem, drawings )
{
if( aOnlySelected && drawItem.m_Selected == 0 )
continue;
@ -389,7 +389,7 @@ void LIB_COMPONENT::Plot( PLOTTER* aPlotter, int aUnit, int aConvert,
{
wxASSERT( aPlotter != NULL );
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
if( aUnit && item.m_Unit && ( item.m_Unit != aUnit ) )
continue;
@ -404,7 +404,7 @@ void LIB_COMPONENT::Plot( PLOTTER* aPlotter, int aUnit, int aConvert,
}
void LIB_COMPONENT::RemoveDrawItem( LIB_DRAW_ITEM* aItem, EDA_DRAW_PANEL* aPanel, wxDC* aDc )
void LIB_COMPONENT::RemoveDrawItem( LIB_ITEM* aItem, EDA_DRAW_PANEL* aPanel, wxDC* aDc )
{
wxASSERT( aItem != NULL );
@ -424,7 +424,7 @@ from component %s in library %s." ),
}
}
LIB_DRAW_ITEM_LIST::iterator i;
LIB_ITEMS::iterator i;
for( i = drawings.begin(); i < drawings.end(); i++ )
{
@ -441,7 +441,7 @@ from component %s in library %s." ),
}
void LIB_COMPONENT::AddDrawItem( LIB_DRAW_ITEM* aItem )
void LIB_COMPONENT::AddDrawItem( LIB_ITEM* aItem )
{
wxASSERT( aItem != NULL );
@ -450,7 +450,7 @@ void LIB_COMPONENT::AddDrawItem( LIB_DRAW_ITEM* aItem )
}
LIB_DRAW_ITEM* LIB_COMPONENT::GetNextDrawItem( LIB_DRAW_ITEM* aItem, KICAD_T aType )
LIB_ITEM* LIB_COMPONENT::GetNextDrawItem( LIB_ITEM* aItem, KICAD_T aType )
{
/* Return the next draw object pointer.
* If item is NULL return the first item of type in the list.
@ -486,7 +486,7 @@ LIB_DRAW_ITEM* LIB_COMPONENT::GetNextDrawItem( LIB_DRAW_ITEM* aItem, KICAD_T aTy
}
void LIB_COMPONENT::GetPins( LIB_PIN_LIST& aList, int aUnit, int aConvert )
void LIB_COMPONENT::GetPins( LIB_PINS& aList, int aUnit, int aConvert )
{
/* Notes:
* when aUnit == 0: no unit filtering
@ -494,7 +494,7 @@ void LIB_COMPONENT::GetPins( LIB_PIN_LIST& aList, int aUnit, int aConvert )
* when .m_Unit == 0, the body item is common to units
* when .m_Convert == 0, the body item is common to shapes
*/
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
if( item.Type() != LIB_PIN_T ) // we search pins only
continue;
@ -515,7 +515,7 @@ void LIB_COMPONENT::GetPins( LIB_PIN_LIST& aList, int aUnit, int aConvert )
LIB_PIN* LIB_COMPONENT::GetPin( const wxString& aNumber, int aUnit, int aConvert )
{
wxString pNumber;
LIB_PIN_LIST pinList;
LIB_PINS pinList;
GetPins( pinList, aUnit, aConvert );
@ -581,7 +581,7 @@ bool LIB_COMPONENT::Save( FILE* aFile )
if( !SaveDateAndTime( aFile ) )
return false;
LIB_FIELD_LIST fields;
LIB_FIELDS fields;
GetFields( fields );
// Fixed fields:
@ -657,7 +657,7 @@ bool LIB_COMPONENT::Save( FILE* aFile )
if( fprintf( aFile, "DRAW\n" ) < 0 )
return false;
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
if( item.Type() == LIB_FIELD_T )
continue;
@ -811,7 +811,7 @@ bool LIB_COMPONENT::Load( FILE* aFile, char* aLine, int* aLineNum, wxString& aEr
bool LIB_COMPONENT::LoadDrawEntries( FILE* aFile, char* aLine,
int* aLineNum, wxString& aErrorMsg )
{
LIB_DRAW_ITEM* newEntry = NULL;
LIB_ITEM* newEntry = NULL;
while( true )
{
@ -829,31 +829,31 @@ bool LIB_COMPONENT::LoadDrawEntries( FILE* aFile, char* aLine,
switch( aLine[0] )
{
case 'A': /* Arc */
newEntry = ( LIB_DRAW_ITEM* ) new LIB_ARC(this);
newEntry = ( LIB_ITEM* ) new LIB_ARC( this );
break;
case 'C': /* Circle */
newEntry = ( LIB_DRAW_ITEM* ) new LIB_CIRCLE(this);
newEntry = ( LIB_ITEM* ) new LIB_CIRCLE( this );
break;
case 'T': /* Text */
newEntry = ( LIB_DRAW_ITEM* ) new LIB_TEXT(this);
newEntry = ( LIB_ITEM* ) new LIB_TEXT( this );
break;
case 'S': /* Square */
newEntry = ( LIB_DRAW_ITEM* ) new LIB_RECTANGLE(this);
newEntry = ( LIB_ITEM* ) new LIB_RECTANGLE( this );
break;
case 'X': /* Pin Description */
newEntry = ( LIB_DRAW_ITEM* ) new LIB_PIN(this);
newEntry = ( LIB_ITEM* ) new LIB_PIN( this );
break;
case 'P': /* Polyline */
newEntry = ( LIB_DRAW_ITEM* ) new LIB_POLYLINE(this);
newEntry = ( LIB_ITEM* ) new LIB_POLYLINE( this );
break;
case 'B': /* Bezier Curves */
newEntry = ( LIB_DRAW_ITEM* ) new LIB_BEZIER(this);
newEntry = ( LIB_ITEM* ) new LIB_BEZIER( this );
break;
default:
@ -970,7 +970,7 @@ EDA_RECT LIB_COMPONENT::GetBoundingBox( int aUnit, int aConvert ) const
{
EDA_RECT bBox( wxPoint( 0, 0 ), wxSize( 0, 0 ) );
BOOST_FOREACH( const LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( const LIB_ITEM& item, drawings )
{
if( ( item.m_Unit > 0 ) && ( ( m_unitCount > 1 ) && ( aUnit > 0 )
&& ( aUnit != item.m_Unit ) ) )
@ -1000,7 +1000,7 @@ EDA_RECT LIB_COMPONENT::GetBodyBoundingBox( int aUnit, int aConvert ) const
{
EDA_RECT bBox( wxPoint( 0, 0 ), wxSize( 0, 0 ) );
BOOST_FOREACH( const LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( const LIB_ITEM& item, drawings )
{
if( ( item.m_Unit > 0 ) && ( ( m_unitCount > 1 ) && ( aUnit > 0 )
&& ( aUnit != item.m_Unit ) ) )
@ -1021,7 +1021,7 @@ EDA_RECT LIB_COMPONENT::GetBodyBoundingBox( int aUnit, int aConvert ) const
void LIB_COMPONENT::deleteAllFields()
{
LIB_DRAW_ITEM_LIST::iterator it;
LIB_ITEMS::iterator it;
for( it = drawings.begin(); it!=drawings.end(); /* deleting */ )
{
@ -1055,7 +1055,7 @@ void LIB_COMPONENT::SetFields( const std::vector <LIB_FIELD>& aFields )
}
void LIB_COMPONENT::GetFields( LIB_FIELD_LIST& aList )
void LIB_COMPONENT::GetFields( LIB_FIELDS& aList )
{
LIB_FIELD* field;
@ -1075,7 +1075,7 @@ void LIB_COMPONENT::GetFields( LIB_FIELD_LIST& aList )
}
// Now grab all the rest of fields.
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
if( item.Type() != LIB_FIELD_T )
continue;
@ -1091,7 +1091,7 @@ void LIB_COMPONENT::GetFields( LIB_FIELD_LIST& aList )
LIB_FIELD* LIB_COMPONENT::GetField( int aId )
{
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
if( item.Type() != LIB_FIELD_T )
continue;
@ -1108,7 +1108,7 @@ LIB_FIELD* LIB_COMPONENT::GetField( int aId )
LIB_FIELD* LIB_COMPONENT::FindField( const wxString& aFieldName )
{
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
if( item.Type() != LIB_FIELD_T )
continue;
@ -1188,7 +1188,7 @@ bool LIB_COMPONENT::LoadDateAndTime( char* aLine )
void LIB_COMPONENT::SetOffset( const wxPoint& aOffset )
{
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
item.SetOffset( aOffset );
}
@ -1203,7 +1203,7 @@ void LIB_COMPONENT::RemoveDuplicateDrawItems()
bool LIB_COMPONENT::HasConversion() const
{
BOOST_FOREACH( const LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( const LIB_ITEM& item, drawings )
{
if( item.m_Convert > 1 )
return true;
@ -1215,7 +1215,7 @@ bool LIB_COMPONENT::HasConversion() const
void LIB_COMPONENT::ClearStatus()
{
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
item.m_Flags = 0;
}
@ -1224,7 +1224,7 @@ int LIB_COMPONENT::SelectItems( EDA_RECT& aRect, int aUnit, int aConvert, bool a
{
int itemCount = 0;
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
item.m_Selected = 0;
@ -1253,7 +1253,7 @@ int LIB_COMPONENT::SelectItems( EDA_RECT& aRect, int aUnit, int aConvert, bool a
void LIB_COMPONENT::MoveSelectedItems( const wxPoint& aOffset )
{
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
if( item.m_Selected == 0 )
continue;
@ -1268,14 +1268,14 @@ void LIB_COMPONENT::MoveSelectedItems( const wxPoint& aOffset )
void LIB_COMPONENT::ClearSelectedItems()
{
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
item.m_Flags = item.m_Selected = 0;
}
void LIB_COMPONENT::DeleteSelectedItems()
{
LIB_DRAW_ITEM_LIST::iterator item = drawings.begin();
LIB_ITEMS::iterator item = drawings.begin();
// We *do not* remove the 2 mandatory fields: reference and value
// so skip them (do not remove) if they are flagged selected.
@ -1312,7 +1312,7 @@ void LIB_COMPONENT::CopySelectedItems( const wxPoint& aOffset )
unsigned icnt = drawings.size();
for( unsigned ii = 0; ii < icnt; ii++ )
{
LIB_DRAW_ITEM& item = drawings[ii];
LIB_ITEM& item = drawings[ii];
// We *do not* copy fields because they are unique for the whole component
// so skip them (do not duplicate) if they are flagged selected.
if( item.Type() == LIB_FIELD_T )
@ -1322,7 +1322,7 @@ void LIB_COMPONENT::CopySelectedItems( const wxPoint& aOffset )
continue;
item.m_Selected = 0;
LIB_DRAW_ITEM* newItem = item.GenCopy();
LIB_ITEM* newItem = (LIB_ITEM*) item.Clone();
newItem->m_Selected = IS_SELECTED;
drawings.push_back( newItem );
}
@ -1335,7 +1335,7 @@ void LIB_COMPONENT::CopySelectedItems( const wxPoint& aOffset )
void LIB_COMPONENT::MirrorSelectedItemsH( const wxPoint& aCenter )
{
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
if( item.m_Selected == 0 )
continue;
@ -1348,22 +1348,10 @@ void LIB_COMPONENT::MirrorSelectedItemsH( const wxPoint& aCenter )
}
/**
* Locate a draw object.
*
* @param aUnit - Unit number of draw item.
* @param aConvert - Body style of draw item.
* @param aType - Draw object type, set to 0 to search for any type.
* @param aPoint - Coordinate for hit testing.
*
* @return LIB_DRAW_ITEM - Pointer the the draw object if found.
* Otherwise NULL.
*/
LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int aUnit, int aConvert,
LIB_ITEM* LIB_COMPONENT::LocateDrawItem( int aUnit, int aConvert,
KICAD_T aType, const wxPoint& aPoint )
{
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
if( ( aUnit && item.m_Unit && ( aUnit != item.m_Unit) )
|| ( aConvert && item.m_Convert && ( aConvert != item.m_Convert ) )
@ -1378,7 +1366,7 @@ LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int aUnit, int aConvert,
}
LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int aUnit, int aConvert, KICAD_T aType,
LIB_ITEM* LIB_COMPONENT::LocateDrawItem( int aUnit, int aConvert, KICAD_T aType,
const wxPoint& aPoint, const TRANSFORM& aTransform )
{
/* we use LocateDrawItem( int aUnit, int convert, KICAD_T type, const
@ -1386,7 +1374,7 @@ LIB_DRAW_ITEM* LIB_COMPONENT::LocateDrawItem( int aUnit, int aConvert, KICAD_T a
* because this function uses DefaultTransformMatrix as orient/mirror matrix
* we temporary copy aTransMat in DefaultTransformMatrix
*/
LIB_DRAW_ITEM* item;
LIB_ITEM* item;
TRANSFORM transform = DefaultTransform;
DefaultTransform = aTransform;
@ -1406,7 +1394,7 @@ void LIB_COMPONENT::SetPartCount( int aCount )
if( aCount < m_unitCount )
{
LIB_DRAW_ITEM_LIST::iterator i;
LIB_ITEMS::iterator i;
i = drawings.begin();
while( i != drawings.end() )
@ -1432,7 +1420,7 @@ void LIB_COMPONENT::SetPartCount( int aCount )
for( int j = prevCount + 1; j <= aCount; j++ )
{
LIB_DRAW_ITEM* newItem = drawings[ii].GenCopy();
LIB_ITEM* newItem = (LIB_ITEM*) drawings[ii].Clone();
newItem->m_Unit = j;
drawings.push_back( newItem );
}
@ -1454,14 +1442,14 @@ void LIB_COMPONENT::SetConversion( bool aSetConvert )
if( aSetConvert )
{
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
BOOST_FOREACH( LIB_ITEM& item, drawings )
{
/* Only pins are duplicated. */
if( item.Type() != LIB_PIN_T )
continue;
if( item.m_Convert == 1 )
{
LIB_DRAW_ITEM* newItem = item.GenCopy();
LIB_ITEM* newItem = (LIB_ITEM*) item.Clone();
newItem->m_Convert = 2;
drawings.push_back( newItem );
}
@ -1471,7 +1459,7 @@ void LIB_COMPONENT::SetConversion( bool aSetConvert )
{
// Delete converted shape items because the converted shape does
// not exist
LIB_DRAW_ITEM_LIST::iterator i = drawings.begin();
LIB_ITEMS::iterator i = drawings.begin();
while( i != drawings.end() )
{
@ -1488,7 +1476,7 @@ wxArrayString LIB_COMPONENT::GetAliasNames( bool aIncludeRoot ) const
{
wxArrayString names;
LIB_ALIAS_LIST::const_iterator it;
LIB_ALIASES::const_iterator it;
for( it=m_aliases.begin(); it<m_aliases.end(); ++it )
{
@ -1535,7 +1523,7 @@ void LIB_COMPONENT::SetAliases( const wxArrayString& aAliasList )
}
/* Remove names in the current component that are not in the new alias list. */
LIB_ALIAS_LIST::iterator it;
LIB_ALIASES::iterator it;
for( it = m_aliases.begin(); it < m_aliases.end(); it++ )
{
@ -1555,7 +1543,7 @@ void LIB_COMPONENT::RemoveAlias( const wxString& aName )
wxT( "Component aliases cannot be changed when they are owned by a library." ) );
wxCHECK_RET( !aName.IsEmpty(), wxT( "Cannot get alias with an empty name." ) );
LIB_ALIAS_LIST::iterator it;
LIB_ALIASES::iterator it;
for( it = m_aliases.begin(); it < m_aliases.end(); it++ )
{
@ -1573,7 +1561,7 @@ LIB_ALIAS* LIB_COMPONENT::RemoveAlias( LIB_ALIAS* aAlias )
wxCHECK_MSG( aAlias != NULL, NULL, wxT( "Cannot remove alias by NULL pointer." ) );
LIB_ALIAS* nextAlias = NULL;
LIB_ALIAS_LIST::iterator it = find( m_aliases.begin(), m_aliases.end(), aAlias );
LIB_ALIASES::iterator it = find( m_aliases.begin(), m_aliases.end(), aAlias );
if( it != m_aliases.end() )
{

View File

@ -32,7 +32,7 @@ struct AliasMapSort
*/
typedef std::map< wxString, LIB_ALIAS*, AliasMapSort > LIB_ALIAS_MAP;
typedef std::vector< LIB_ALIAS* > LIB_ALIAS_LIST;
typedef std::vector< LIB_ALIAS* > LIB_ALIASES;
/* values for member .m_options */
enum LibrEntryOptions
@ -161,10 +161,10 @@ class LIB_COMPONENT : public EDA_ITEM
long m_dateModified; ///< Date the component was last modified.
LibrEntryOptions m_options; ///< Special component features such as POWER or NORMAL.)
int m_unitCount; ///< Number of units (parts) per package.
LIB_DRAW_ITEM_LIST drawings; ///< How to draw this part.
LIB_ITEMS drawings; ///< How to draw this part.
wxArrayString m_FootprintList; /**< List of suitable footprint names for the
component (wild card names accepted). */
LIB_ALIAS_LIST m_aliases; ///< List of alias object pointers associated with the
LIB_ALIASES m_aliases; ///< List of alias object pointers associated with the
///< component.
CMP_LIBRARY* m_library; ///< Library the component belongs to if any.
@ -308,7 +308,7 @@ public:
*
* @param aList - List to add fields to
*/
void GetFields( LIB_FIELD_LIST& aList );
void GetFields( LIB_FIELDS& aList );
/**
* Function FindField
@ -373,7 +373,7 @@ public:
*
* @param aItem - New draw object to add to component.
*/
void AddDrawItem( LIB_DRAW_ITEM* aItem );
void AddDrawItem( LIB_ITEM* aItem );
/**
* Remove draw \a aItem from list.
@ -382,7 +382,7 @@ public:
* @param aPanel - Panel to remove part from.
* @param aDc - Device context to remove part from.
*/
void RemoveDrawItem( LIB_DRAW_ITEM* aItem, EDA_DRAW_PANEL* aPanel = NULL, wxDC* aDc = NULL );
void RemoveDrawItem( LIB_ITEM* aItem, EDA_DRAW_PANEL* aPanel = NULL, wxDC* aDc = NULL );
/**
* Return the next draw object pointer.
@ -393,7 +393,7 @@ public:
* if TYPE_NOT_INIT search for all items types
* @return - The next drawing object in the list if found, otherwise NULL.
*/
LIB_DRAW_ITEM* GetNextDrawItem( LIB_DRAW_ITEM* aItem = NULL, KICAD_T aType = TYPE_NOT_INIT );
LIB_ITEM* GetNextDrawItem( LIB_ITEM* aItem = NULL, KICAD_T aType = TYPE_NOT_INIT );
/**
* Return the next pin object from the draw list.
@ -406,7 +406,7 @@ public:
*/
LIB_PIN* GetNextPin( LIB_PIN* aItem = NULL )
{
return (LIB_PIN*) GetNextDrawItem( (LIB_DRAW_ITEM*) aItem, LIB_PIN_T );
return (LIB_PIN*) GetNextDrawItem( (LIB_ITEM*) aItem, LIB_PIN_T );
}
@ -423,7 +423,7 @@ public:
* @param aConvert - Convert number of pin to add to list. Set to 0 to
* get pins from any convert of component.
*/
void GetPins( LIB_PIN_LIST& aList, int aUnit = 0, int aConvert = 0 );
void GetPins( LIB_PINS& aList, int aUnit = 0, int aConvert = 0 );
/**
* Return pin object with the requested pin \a aNumber.
@ -521,7 +521,7 @@ public:
* @param aPoint - Coordinate for hit testing.
* @return The draw object if found. Otherwise NULL.
*/
LIB_DRAW_ITEM* LocateDrawItem( int aUnit, int aConvert, KICAD_T aType, const wxPoint& aPoint );
LIB_ITEM* LocateDrawItem( int aUnit, int aConvert, KICAD_T aType, const wxPoint& aPoint );
/**
* Locate a draw object (overlaid)
@ -533,15 +533,15 @@ public:
* @param aTransform = the transform matrix
* @return The draw object if found. Otherwise NULL.
*/
LIB_DRAW_ITEM* LocateDrawItem( int aUnit, int aConvert, KICAD_T aType,
LIB_ITEM* LocateDrawItem( int aUnit, int aConvert, KICAD_T aType,
const wxPoint& aPoint, const TRANSFORM& aTransform );
/**
* Return a reference to the draw item list.
*
* @return LIB_DRAW_ITEM_LIST& - Reference to the draw item object list.
* @return LIB_ITEMS& - Reference to the draw item object list.
*/
LIB_DRAW_ITEM_LIST& GetDrawItemList() { return drawings; }
LIB_ITEMS& GetDrawItemList() { return drawings; }
/**
* Set the part per package count.

View File

@ -142,7 +142,7 @@ SCH_ITEM* SCH_EDIT_FRAME::LocateItem( const wxPoint& aPosition, const KICAD_T aF
{
wxString text = m_collectedItems[i]->GetSelectMenuText();
const char** xpm = m_collectedItems[i]->GetMenuImage();
ADD_MENUITEM( &selectMenu, ID_SCH_SELECT_ITEM_START + i, text, xpm );
ADD_MENUITEM( &selectMenu, ID_SELECT_ITEM_START + i, text, xpm );
}
// Set to NULL in case user aborts the clarification context menu.
@ -220,7 +220,7 @@ void SCH_EDIT_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aH
if( DrawPanel->IsMouseCaptured() )
{
DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, aPosition, TRUE );
DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, aPosition, true );
}
}
@ -293,15 +293,12 @@ void LIB_EDIT_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aH
if( DrawPanel->IsMouseCaptured() )
{
DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, aPosition, TRUE );
DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, aPosition, true );
}
}
if( aHotKey )
{
if( screen->GetCurItem() && screen->GetCurItem()->GetFlags() )
OnHotKey( aDC, aHotKey, aPosition, screen->GetCurItem() );
else
OnHotKey( aDC, aHotKey, aPosition, NULL );
}
@ -366,7 +363,7 @@ void LIB_VIEW_FRAME::GeneralControl( wxDC* aDC, const wxPoint& aPosition, int aH
if( DrawPanel->IsMouseCaptured() )
{
DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, aPosition, TRUE );
DrawPanel->m_mouseCaptureCallback( DrawPanel, aDC, aPosition, true );
}
}

View File

@ -416,7 +416,7 @@ int DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::getSelectedFieldNdx()
* Function findfield
* searches a LIB_FIELD_LIST for aFieldName.
*/
static LIB_FIELD* findfield( const LIB_FIELD_LIST& aList, const wxString& aFieldName )
static LIB_FIELD* findfield( const LIB_FIELDS& aList, const wxString& aFieldName )
{
const LIB_FIELD* field = NULL;
@ -447,7 +447,7 @@ LIB_FIELD* DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::findField( const wxString& aField
void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers()
/***********************************************************/
{
LIB_FIELD_LIST cmpFields;
LIB_FIELDS cmpFields;
m_LibEntry->GetFields( cmpFields );

View File

@ -145,8 +145,8 @@ enum id_eeschema_frm
ID_POPUP_SCH_ROTATE_CMP_COUNTERCLOCKWISE,
ID_POPUP_SCH_ORIENT_NORMAL_CMP,
ID_SCH_SELECT_ITEM_START,
ID_SCH_SELECT_ITEM_END = ID_SCH_SELECT_ITEM_START + MAX_SELECT_ITEM_IDS,
ID_SELECT_ITEM_START,
ID_SELECT_ITEM_END = ID_SELECT_ITEM_START + MAX_SELECT_ITEM_IDS,
ID_POPUP_SCH_MOVE_ITEM,

View File

@ -844,11 +844,10 @@ void LIB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
return;
wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED );
wxCommandEvent toolCmd( wxEVT_COMMAND_TOOL_CLICKED );
cmd.SetEventObject( this );
bool itemInEdit = GetScreen()->GetCurItem() && GetScreen()->GetCurItem()->GetFlags();
bool itemInEdit = m_drawItem && m_drawItem->GetFlags();
/* Convert lower to upper case (the usual toupper function has problem
* with non ascii codes like function keys */
@ -905,16 +904,16 @@ void LIB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
case HK_UNDO:
if( !itemInEdit )
{
toolCmd.SetId( wxID_UNDO );
GetEventHandler()->ProcessEvent( toolCmd );
cmd.SetId( wxID_UNDO );
GetEventHandler()->ProcessEvent( cmd );
}
break;
case HK_REDO:
if( !itemInEdit )
{
toolCmd.SetId( wxID_REDO );
GetEventHandler()->ProcessEvent( toolCmd );
cmd.SetId( wxID_REDO );
GetEventHandler()->ProcessEvent( cmd );
}
break;
@ -979,9 +978,8 @@ void LIB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
if( m_drawItem && !m_drawItem->InEditMode() )
{
wxCommandEvent evt;
evt.SetId( ID_POPUP_LIBEDIT_DELETE_ITEM );
Process_Special_Functions( evt );
cmd.SetId( ID_POPUP_LIBEDIT_DELETE_ITEM );
Process_Special_Functions( cmd );
}
break;
@ -992,9 +990,8 @@ void LIB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
if( m_drawItem )
{
wxCommandEvent evt;
evt.SetId( ID_POPUP_LIBEDIT_MOVE_ITEM_REQUEST );
Process_Special_Functions( evt );
cmd.SetId( ID_POPUP_LIBEDIT_MOVE_ITEM_REQUEST );
Process_Special_Functions( cmd );
}
}
break;
@ -1004,9 +1001,8 @@ void LIB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotKey, const wxPoint& aPosition,
if( m_drawItem && !m_drawItem->InEditMode() )
{
wxCommandEvent evt;
evt.SetId( ID_POPUP_LIBEDIT_MODIFY_ITEM );
Process_Special_Functions( evt );
cmd.SetId( ID_POPUP_LIBEDIT_MODIFY_ITEM );
Process_Special_Functions( cmd );
}
break;
}

View File

@ -53,7 +53,7 @@ static wxPoint calcCenter( const wxPoint& A, const wxPoint& B, const wxPoint& C
}
LIB_ARC::LIB_ARC( LIB_COMPONENT* aParent ) : LIB_DRAW_ITEM( LIB_ARC_T, aParent )
LIB_ARC::LIB_ARC( LIB_COMPONENT* aParent ) : LIB_ITEM( LIB_ARC_T, aParent )
{
m_Radius = 0;
m_t1 = 0;
@ -67,7 +67,7 @@ LIB_ARC::LIB_ARC( LIB_COMPONENT* aParent ) : LIB_DRAW_ITEM( LIB_ARC_T, aParent )
}
LIB_ARC::LIB_ARC( const LIB_ARC& aArc ) : LIB_DRAW_ITEM( aArc )
LIB_ARC::LIB_ARC( const LIB_ARC& aArc ) : LIB_ITEM( aArc )
{
m_Radius = aArc.m_Radius;
m_t1 = aArc.m_t1;
@ -211,27 +211,13 @@ bool LIB_ARC::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTran
}
LIB_DRAW_ITEM* LIB_ARC::DoGenCopy()
EDA_ITEM* LIB_ARC::doClone() const
{
LIB_ARC* newitem = new LIB_ARC( GetParent() );
newitem->m_Pos = m_Pos;
newitem->m_ArcStart = m_ArcStart;
newitem->m_ArcEnd = m_ArcEnd;
newitem->m_Radius = m_Radius;
newitem->m_t1 = m_t1;
newitem->m_t2 = m_t2;
newitem->m_Width = m_Width;
newitem->m_Unit = m_Unit;
newitem->m_Convert = m_Convert;
newitem->m_Flags = m_Flags;
newitem->m_Fill = m_Fill;
return (LIB_DRAW_ITEM*) newitem;
return new LIB_ARC( *this );
}
int LIB_ARC::DoCompare( const LIB_DRAW_ITEM& aOther ) const
int LIB_ARC::DoCompare( const LIB_ITEM& aOther ) const
{
wxASSERT( aOther.Type() == LIB_ARC_T );
@ -479,7 +465,7 @@ void LIB_ARC::DisplayInfo( EDA_DRAW_FRAME* aFrame )
wxString msg;
EDA_RECT bBox = GetBoundingBox();
LIB_DRAW_ITEM::DisplayInfo( aFrame );
LIB_ITEM::DisplayInfo( aFrame );
msg = ReturnStringFromValue( g_UserUnit, m_Width, EESCHEMA_INTERNAL_UNIT, true );
@ -492,6 +478,15 @@ void LIB_ARC::DisplayInfo( EDA_DRAW_FRAME* aFrame )
}
wxString LIB_ARC::GetSelectMenuText() const
{
return wxString::Format( _( "Arc center (%s, %s), radius %s" ),
GetChars( CoordinateToString( m_Pos.x, EESCHEMA_INTERNAL_UNIT ) ),
GetChars( CoordinateToString( m_Pos.y, EESCHEMA_INTERNAL_UNIT ) ),
GetChars( CoordinateToString( m_Radius, EESCHEMA_INTERNAL_UNIT ) ) );
}
void LIB_ARC::BeginEdit( int aEditMode, const wxPoint aPosition )
{
wxCHECK_RET( ( aEditMode & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0,

View File

@ -12,7 +12,7 @@
class TRANSFORM;
class LIB_ARC : public LIB_DRAW_ITEM
class LIB_ARC : public LIB_ITEM
{
enum SELECT_T
{
@ -105,22 +105,26 @@ public:
virtual int GetPenSize( ) const;
/**
* See LIB_DRAW_ITEM::BeginEdit().
* See LIB_ITEM::BeginEdit().
*/
void BeginEdit( int aEditMode, const wxPoint aStartPoint = wxPoint( 0, 0 ) );
/**
* See LIB_DRAW_ITEM::ContinueEdit().
* See LIB_ITEM::ContinueEdit().
*/
bool ContinueEdit( const wxPoint aNextPoint );
/**
* See LIB_DRAW_ITEM::AbortEdit().
* See LIB_ITEM::AbortEdit().
*/
void EndEdit( const wxPoint& aPosition, bool aAbort = false );
virtual wxString GetSelectMenuText() const;
virtual const char** GetMenuImage() const { return (const char**) add_arc_xpm; }
protected:
virtual LIB_DRAW_ITEM* DoGenCopy();
virtual EDA_ITEM* doClone() const;
/**
* Provide the arc draw object specific comparison.
@ -131,7 +135,7 @@ protected:
* - Arc start angle.
* - Arc end angle.
*/
virtual int DoCompare( const LIB_DRAW_ITEM& aOther ) const;
virtual int DoCompare( const LIB_ITEM& aOther ) const;
virtual void DoOffset( const wxPoint& aOffset );
virtual bool DoTestInside( EDA_RECT& aRect ) const;
virtual void DoMove( const wxPoint& aPosition );

View File

@ -19,7 +19,7 @@
LIB_BEZIER::LIB_BEZIER( LIB_COMPONENT* aParent ) :
LIB_DRAW_ITEM( LIB_BEZIER_T, aParent )
LIB_ITEM( LIB_BEZIER_T, aParent )
{
m_Fill = NO_FILL;
m_Width = 0;
@ -28,7 +28,7 @@ LIB_BEZIER::LIB_BEZIER( LIB_COMPONENT* aParent ) :
}
LIB_BEZIER::LIB_BEZIER( const LIB_BEZIER& aBezier ) : LIB_DRAW_ITEM( aBezier )
LIB_BEZIER::LIB_BEZIER( const LIB_BEZIER& aBezier ) : LIB_ITEM( aBezier )
{
m_PolyPoints = aBezier.m_PolyPoints;
m_BezierPoints = aBezier.m_BezierPoints; // Vector copy
@ -113,21 +113,13 @@ bool LIB_BEZIER::Load( char* aLine, wxString& aErrorMsg )
}
LIB_DRAW_ITEM* LIB_BEZIER::DoGenCopy()
EDA_ITEM* LIB_BEZIER::doClone() const
{
LIB_BEZIER* newitem = new LIB_BEZIER(GetParent());
newitem->m_BezierPoints = m_BezierPoints; // Vector copy
newitem->m_Width = m_Width;
newitem->m_Unit = m_Unit;
newitem->m_Convert = m_Convert;
newitem->m_Flags = m_Flags;
newitem->m_Fill = m_Fill;
return (LIB_DRAW_ITEM*) newitem;
return new LIB_BEZIER( *this );
}
int LIB_BEZIER::DoCompare( const LIB_DRAW_ITEM& aOther ) const
int LIB_BEZIER::DoCompare( const LIB_ITEM& aOther ) const
{
wxASSERT( aOther.Type() == LIB_BEZIER_T );
@ -366,7 +358,7 @@ void LIB_BEZIER::DisplayInfo( EDA_DRAW_FRAME* aFrame )
wxString msg;
EDA_RECT bBox = GetBoundingBox();
LIB_DRAW_ITEM::DisplayInfo( aFrame );
LIB_ITEM::DisplayInfo( aFrame );
msg = ReturnStringFromValue( g_UserUnit, m_Width, EESCHEMA_INTERNAL_UNIT, true );

View File

@ -9,7 +9,7 @@
/**************************************************/
/* Graphic Body Item: Bezier Curve (set of lines) */
/**************************************************/
class LIB_BEZIER : public LIB_DRAW_ITEM
class LIB_BEZIER : public LIB_ITEM
{
int m_Width; // Line width
std::vector<wxPoint> m_BezierPoints; // list of parameter (3|4)
@ -77,7 +77,7 @@ public:
virtual void DisplayInfo( EDA_DRAW_FRAME* aFrame );
protected:
virtual LIB_DRAW_ITEM* DoGenCopy();
virtual EDA_ITEM* doClone() const;
/**
* Provide the bezier curve draw object specific comparison.
@ -86,7 +86,7 @@ protected:
* - Bezier point horizontal (X) point position.
* - Bezier point vertical (Y) point position.
*/
virtual int DoCompare( const LIB_DRAW_ITEM& aOther ) const;
virtual int DoCompare( const LIB_ITEM& aOther ) const;
virtual void DoOffset( const wxPoint& aOffset );
virtual bool DoTestInside( EDA_RECT& aRect ) const;

View File

@ -5,6 +5,7 @@
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "macros.h"
#include "class_drawpanel.h"
#include "plot_common.h"
#include "trigo.h"
@ -17,7 +18,7 @@
LIB_CIRCLE::LIB_CIRCLE( LIB_COMPONENT* aParent ) :
LIB_DRAW_ITEM( LIB_CIRCLE_T, aParent )
LIB_ITEM( LIB_CIRCLE_T, aParent )
{
m_Radius = 0;
m_Fill = NO_FILL;
@ -27,7 +28,7 @@ LIB_CIRCLE::LIB_CIRCLE( LIB_COMPONENT* aParent ) :
LIB_CIRCLE::LIB_CIRCLE( const LIB_CIRCLE& aCircle ) :
LIB_DRAW_ITEM( aCircle )
LIB_ITEM( aCircle )
{
m_Pos = aCircle.m_Pos;
m_Radius = aCircle.m_Radius;
@ -105,23 +106,13 @@ bool LIB_CIRCLE::HitTest( wxPoint aPosRef, int aThreshold, const TRANSFORM& aTra
}
LIB_DRAW_ITEM* LIB_CIRCLE::DoGenCopy()
EDA_ITEM* LIB_CIRCLE::doClone() const
{
LIB_CIRCLE* newitem = new LIB_CIRCLE( GetParent() );
newitem->m_Pos = m_Pos;
newitem->m_Radius = m_Radius;
newitem->m_Width = m_Width;
newitem->m_Unit = m_Unit;
newitem->m_Convert = m_Convert;
newitem->m_Flags = m_Flags;
newitem->m_Fill = m_Fill;
return (LIB_DRAW_ITEM*) newitem;
return new LIB_CIRCLE( *this );
}
int LIB_CIRCLE::DoCompare( const LIB_DRAW_ITEM& aOther ) const
int LIB_CIRCLE::DoCompare( const LIB_ITEM& aOther ) const
{
wxASSERT( aOther.Type() == LIB_CIRCLE_T );
@ -255,7 +246,7 @@ void LIB_CIRCLE::DisplayInfo( EDA_DRAW_FRAME* aFrame )
wxString msg;
EDA_RECT bBox = GetBoundingBox();
LIB_DRAW_ITEM::DisplayInfo( aFrame );
LIB_ITEM::DisplayInfo( aFrame );
msg = ReturnStringFromValue( g_UserUnit, m_Width, EESCHEMA_INTERNAL_UNIT, true );
@ -271,6 +262,15 @@ void LIB_CIRCLE::DisplayInfo( EDA_DRAW_FRAME* aFrame )
}
wxString LIB_CIRCLE::GetSelectMenuText() const
{
return wxString::Format( _( "Circle center (%s, %s), radius %s" ),
GetChars( CoordinateToString( m_Pos.x, EESCHEMA_INTERNAL_UNIT ) ),
GetChars( CoordinateToString( m_Pos.y, EESCHEMA_INTERNAL_UNIT ) ),
GetChars( CoordinateToString( m_Radius, EESCHEMA_INTERNAL_UNIT ) ) );
}
void LIB_CIRCLE::BeginEdit( int aEditMode, const wxPoint aPosition )
{
wxCHECK_RET( ( aEditMode & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0,

View File

@ -9,7 +9,7 @@
#include "lib_draw_item.h"
class LIB_CIRCLE : public LIB_DRAW_ITEM
class LIB_CIRCLE : public LIB_ITEM
{
int m_Radius;
wxPoint m_Pos; // Position or centre (Arc and Circle) or start point (segments).
@ -73,22 +73,26 @@ public:
virtual void DisplayInfo( EDA_DRAW_FRAME* aFrame );
/**
* See LIB_DRAW_ITEM::BeginEdit().
* See LIB_ITEM::BeginEdit().
*/
void BeginEdit( int aEditMode, const wxPoint aStartPoint = wxPoint( 0, 0 ) );
/**
* See LIB_DRAW_ITEM::ContinueEdit().
* See LIB_ITEM::ContinueEdit().
*/
bool ContinueEdit( const wxPoint aNextPoint );
/**
* See LIB_DRAW_ITEM::AbortEdit().
* See LIB_ITEM::AbortEdit().
*/
void EndEdit( const wxPoint& aPosition, bool aAbort = false );
virtual wxString GetSelectMenuText() const;
virtual const char** GetMenuImage() const { return (const char**) add_circle_xpm; }
protected:
virtual LIB_DRAW_ITEM* DoGenCopy();
virtual EDA_ITEM* doClone() const;
/**
* Provide the circle draw object specific comparison.
@ -98,7 +102,7 @@ protected:
* - Circle vertical (Y) position.
* - Circle radius.
*/
virtual int DoCompare( const LIB_DRAW_ITEM& aOther ) const;
virtual int DoCompare( const LIB_ITEM& aOther ) const;
virtual void DoOffset( const wxPoint& aOffset );
virtual bool DoTestInside( EDA_RECT& aRect ) const;

131
eeschema/lib_collectors.cpp Normal file
View File

@ -0,0 +1,131 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-2011 Kicad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "macros.h"
#include "general.h"
#include "transform.h"
#include "lib_collectors.h"
const KICAD_T LIB_COLLECTOR::AllItems[] = {
LIB_ARC_T,
LIB_CIRCLE_T,
LIB_TEXT_T,
LIB_RECTANGLE_T,
LIB_POLYLINE_T,
LIB_BEZIER_T,
LIB_PIN_T,
LIB_FIELD_T,
EOT
};
const KICAD_T LIB_COLLECTOR::AllItemsButPins[] = {
LIB_ARC_T,
LIB_CIRCLE_T,
LIB_TEXT_T,
LIB_RECTANGLE_T,
LIB_POLYLINE_T,
LIB_BEZIER_T,
LIB_FIELD_T,
EOT
};
const KICAD_T LIB_COLLECTOR::EditableItems[] = {
LIB_ARC_T,
LIB_CIRCLE_T,
LIB_TEXT_T,
LIB_RECTANGLE_T,
LIB_POLYLINE_T,
LIB_BEZIER_T,
LIB_PIN_T,
LIB_FIELD_T,
EOT
};
const KICAD_T LIB_COLLECTOR::MovableItems[] = {
LIB_ARC_T,
LIB_CIRCLE_T,
LIB_TEXT_T,
LIB_RECTANGLE_T,
LIB_POLYLINE_T,
LIB_BEZIER_T,
LIB_PIN_T,
LIB_FIELD_T,
EOT
};
const KICAD_T LIB_COLLECTOR::RotatableItems[] = {
LIB_ARC_T,
LIB_CIRCLE_T,
LIB_TEXT_T,
LIB_RECTANGLE_T,
LIB_POLYLINE_T,
LIB_BEZIER_T,
LIB_PIN_T,
LIB_FIELD_T,
EOT
};
SEARCH_RESULT LIB_COLLECTOR::Inspect( EDA_ITEM* aItem, const void* aTestData )
{
LIB_ITEM* item = (LIB_ITEM*) aItem;
wxLogDebug( wxT( "Inspecting item %s, unit %d, convert %d" ),
GetChars( item->GetSelectMenuText() ), item->GetUnit(), item->GetConvert() );
if( ( m_data.m_unit && item->GetUnit() && ( m_data.m_unit != item->GetUnit() ) )
|| ( m_data.m_convert && item->GetConvert() && ( m_data.m_convert != item->GetConvert() ) )
|| !item->HitTest( m_RefPos, 2, DefaultTransform ) )
return SEARCH_CONTINUE;
Append( aItem );
return SEARCH_CONTINUE;
}
void LIB_COLLECTOR::Collect( LIB_ITEMS& aItems, const KICAD_T aFilterList[],
const wxPoint& aPosition, int aUnit, int aConvert )
{
Empty(); // empty the collection just in case
SetScanTypes( aFilterList );
// remember where the snapshot was taken from and pass refPos to the Inspect() function.
SetRefPos( aPosition );
m_data.m_unit = aUnit;
m_data.m_convert = aConvert;
for( size_t i = 0; i < aItems.size(); i++ )
{
if( SEARCH_QUIT == aItems[i].Visit( this, NULL, m_ScanTypes ) )
break;
}
}

135
eeschema/lib_collectors.h Normal file
View File

@ -0,0 +1,135 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@verizon.net>
* Copyright (C) 2004-20011 Kicad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef _LIB_COLLECTORS_H_
#define _LIB_COLLECTORS_H_
#include "class_collector.h"
#include "lib_draw_item.h"
class LIB_COLLECTOR;
class LIB_COLLECTOR_DATA
{
int m_unit;
int m_convert;
friend class LIB_COLLECTOR;
public:
LIB_COLLECTOR_DATA() :
m_unit( 0 ),
m_convert( 0 ) {}
};
/**
* Class LIB_COLLECTOR
*/
class LIB_COLLECTOR : public COLLECTOR
{
LIB_COLLECTOR_DATA m_data;
public:
/**
* A scan list for all schematic items.
*/
static const KICAD_T AllItems[];
/**
* A scan list for all editable schematic items.
*/
static const KICAD_T EditableItems[];
/**
* A scan list for all movable schematic items.
*/
static const KICAD_T MovableItems[];
/**
* A scan list for all rotatable schematic items.
*/
static const KICAD_T RotatableItems[];
/**
* A scan list for all schematic items except pins.
*/
static const KICAD_T AllItemsButPins[];
/**
* Constructor LIB_COLLECTOR
*/
LIB_COLLECTOR( const KICAD_T* aScanTypes = LIB_COLLECTOR::AllItems )
{
SetScanTypes( aScanTypes );
}
/**
* Operator []
* overloads COLLECTOR::operator[](int) to return a LIB_ITEM* instead of
* an EDA_ITEM* type.
* @param aIndex The index into the list.
* @return LIB_ITEM* at \a aIndex or NULL.
*/
LIB_ITEM* operator[]( int aIndex ) const
{
if( (unsigned)aIndex < (unsigned)GetCount() )
return (LIB_ITEM*) m_List[ aIndex ];
return NULL;
}
/**
* Function Inspect
* is the examining function within the INSPECTOR which is passed to the
* Iterate function.
*
* @param aItem An EDA_ITEM to examine.
* @param aTestData is not used in this class.
* @return SEARCH_RESULT #SEARCH_QUIT if the iterator is to stop the scan,
* else #SEARCH_CONTINUE;
*/
SEARCH_RESULT Inspect( EDA_ITEM* aItem, const void* aTestData = NULL );
/**
* Function Collect
* scans a SCH_ITEM using this class's Inspector method, which does the collection.
* @param aItem A SCH_ITEM to scan.
* @param aFilterList A list of #KICAD_T types with a terminating #EOT, that determines
* what is to be collected and the priority order of the resulting
* collection.
* @param aPosition A wxPoint to use in hit-testing.
* @param aUnit The unit of the items to collect or zero if all units.
* @param aConvert The convert of the items to collect or zero if all conversions.
*/
void Collect( LIB_ITEMS& aItem, const KICAD_T aFilterList[], const wxPoint& aPosition,
int aUnit = 0, int aConvert = 0 );
};
#endif // _LIB_COLLECTORS_H_

View File

@ -17,7 +17,7 @@ const int fill_tab[3] = { 'N', 'F', 'f' };
/* Base class (abstract) for components bodies items */
LIB_DRAW_ITEM::LIB_DRAW_ITEM( KICAD_T aType,
LIB_ITEM::LIB_ITEM( KICAD_T aType,
LIB_COMPONENT* aComponent,
int aUnit,
int aConvert,
@ -34,15 +34,15 @@ LIB_DRAW_ITEM::LIB_DRAW_ITEM( KICAD_T aType,
}
LIB_DRAW_ITEM::LIB_DRAW_ITEM( const LIB_DRAW_ITEM& aItem ) :
LIB_ITEM::LIB_ITEM( const LIB_ITEM& aItem ) :
EDA_ITEM( aItem )
{
m_Unit = aItem.m_Unit;
m_Convert = aItem.m_Convert;
m_Fill = aItem.m_Fill;
m_Parent = aItem.m_Parent;
m_typeName = aItem.m_typeName;
m_isFillable = aItem.m_isFillable;
m_eraseLastDrawItem = false;
}
@ -53,7 +53,7 @@ LIB_DRAW_ITEM::LIB_DRAW_ITEM( const LIB_DRAW_ITEM& aItem ) :
* all library items. Call the base class from the derived class or the
* common information will not be updated in the message panel.
*/
void LIB_DRAW_ITEM::DisplayInfo( EDA_DRAW_FRAME* aFrame )
void LIB_ITEM::DisplayInfo( EDA_DRAW_FRAME* aFrame )
{
wxString msg;
@ -78,7 +78,7 @@ void LIB_DRAW_ITEM::DisplayInfo( EDA_DRAW_FRAME* aFrame )
}
bool LIB_DRAW_ITEM::operator==( const LIB_DRAW_ITEM& aOther ) const
bool LIB_ITEM::operator==( const LIB_ITEM& aOther ) const
{
return ( ( Type() == aOther.Type() )
&& ( m_Unit == aOther.m_Unit )
@ -87,7 +87,7 @@ bool LIB_DRAW_ITEM::operator==( const LIB_DRAW_ITEM& aOther ) const
}
bool LIB_DRAW_ITEM::operator<( const LIB_DRAW_ITEM& aOther ) const
bool LIB_ITEM::operator<( const LIB_ITEM& aOther ) const
{
int result = m_Convert - aOther.m_Convert;
@ -108,7 +108,7 @@ bool LIB_DRAW_ITEM::operator<( const LIB_DRAW_ITEM& aOther ) const
}
void LIB_DRAW_ITEM::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, int aColor,
void LIB_ITEM::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOffset, int aColor,
int aDrawMode, void* aData, const TRANSFORM& aTransform )
{
if( InEditMode() )
@ -143,7 +143,7 @@ void LIB_DRAW_ITEM::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aOff
}
int LIB_DRAW_ITEM::GetDefaultColor()
int LIB_ITEM::GetDefaultColor()
{
return ReturnLayerColor( LAYER_DEVICE );
}

View File

@ -4,8 +4,8 @@
/* Definitions of graphic items used to create shapes in component libraries.
*/
#ifndef _LIB_DRAW_ITEM_H_
#define _LIB_DRAW_ITEM_H_
#ifndef _LIB_ITEM_H_
#define _LIB_ITEM_H_
#include "base_struct.h"
#include "transform.h"
@ -15,7 +15,7 @@
class LIB_COMPONENT;
class PLOTTER;
class LIB_DRAW_ITEM;
class LIB_ITEM;
class LIB_PIN;
@ -31,14 +31,14 @@ extern const int fill_tab[];
* in them. If you access a object pointer from the list, do not delete
* it directly.
*/
typedef boost::ptr_vector< LIB_DRAW_ITEM > LIB_DRAW_ITEM_LIST;
typedef boost::ptr_vector< LIB_ITEM > LIB_ITEMS;
/**
* Helper for defining a list of pin object pointers. The list does not
* use a Boost pointer class so the object pointers do not accidently get
* deleted when the container is deleted.
*/
typedef std::vector< LIB_PIN* > LIB_PIN_LIST;
typedef std::vector< LIB_PIN* > LIB_PINS;
/****************************************************************************/
@ -50,7 +50,7 @@ typedef std::vector< LIB_PIN* > LIB_PIN_LIST;
* Base class for drawable items used in library components.
* (graphic shapes, texts, fields, pins)
*/
class LIB_DRAW_ITEM : public EDA_ITEM
class LIB_ITEM : public EDA_ITEM
{
/**
* Draws the item.
@ -111,15 +111,15 @@ protected:
public:
LIB_DRAW_ITEM( KICAD_T aType,
LIB_ITEM( KICAD_T aType,
LIB_COMPONENT* aComponent = NULL,
int aUnit = 0,
int aConvert = 0,
FILL_T aFillType = NO_FILL );
LIB_DRAW_ITEM( const LIB_DRAW_ITEM& aItem );
LIB_ITEM( const LIB_ITEM& aItem );
virtual ~LIB_DRAW_ITEM() { }
virtual ~LIB_ITEM() { }
wxString GetTypeName() { return m_typeName; }
@ -236,23 +236,13 @@ public:
virtual void DisplayInfo( EDA_DRAW_FRAME* aFrame );
/**
* Make a copy of this draw item.
*
* Classes derived from LIB_DRAW_ITEM must implement DoGenCopy().
* This is just a placeholder for the derived class.
*
* @return Copy of this draw item.
*/
LIB_DRAW_ITEM* GenCopy() { return DoGenCopy(); }
/**
* Test LIB_DRAW_ITEM objects for equivalence.
* Test LIB_ITEM objects for equivalence.
*
* @param aOther - Object to test against.
* @return - True if object is identical to this object.
*/
bool operator==( const LIB_DRAW_ITEM& aOther ) const;
bool operator==( const LIB_DRAW_ITEM* aOther ) const
bool operator==( const LIB_ITEM& aOther ) const;
bool operator==( const LIB_ITEM* aOther ) const
{
return *this == *aOther;
}
@ -263,7 +253,7 @@ public:
* @param aOther - Draw item to compare against.
* @return - True if object is less than this object.
*/
bool operator<( const LIB_DRAW_ITEM& aOther) const;
bool operator<( const LIB_ITEM& aOther) const;
/**
* Set drawing object offset from the current position.
@ -369,7 +359,6 @@ public:
FILL_T GetFillMode() const { return m_Fill; }
protected:
virtual LIB_DRAW_ITEM* DoGenCopy() = 0;
/**
* Provide the draw object specific comparison.
@ -382,7 +371,7 @@ protected:
* - KICAD_T enum value.
* - Result of derived classes comparison.
*/
virtual int DoCompare( const LIB_DRAW_ITEM& aOther ) const = 0;
virtual int DoCompare( const LIB_ITEM& aOther ) const = 0;
virtual void DoOffset( const wxPoint& aOffset ) = 0;
virtual bool DoTestInside( EDA_RECT& aRect ) const = 0;
virtual void DoMove( const wxPoint& aPosition ) = 0;
@ -398,4 +387,4 @@ protected:
};
#endif // _LIB_DRAW_ITEM_H_
#endif // _LIB_ITEM_H_

View File

@ -41,19 +41,19 @@
* others = free fields
*/
LIB_FIELD::LIB_FIELD(LIB_COMPONENT * aParent, int idfield ) :
LIB_DRAW_ITEM( LIB_FIELD_T, aParent )
LIB_ITEM( LIB_FIELD_T, aParent )
{
Init( idfield );
}
LIB_FIELD::LIB_FIELD( int idfield ) : LIB_DRAW_ITEM( LIB_FIELD_T, NULL )
LIB_FIELD::LIB_FIELD( int idfield ) : LIB_ITEM( LIB_FIELD_T, NULL )
{
Init( idfield );
}
LIB_FIELD::LIB_FIELD( const LIB_FIELD& field ) : LIB_DRAW_ITEM( field )
LIB_FIELD::LIB_FIELD( const LIB_FIELD& field ) : LIB_ITEM( field )
{
m_id = field.m_id;
m_Pos = field.m_Pos;
@ -390,13 +390,13 @@ bool LIB_FIELD::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTr
}
LIB_DRAW_ITEM* LIB_FIELD::DoGenCopy()
EDA_ITEM* LIB_FIELD::doClone() const
{
LIB_FIELD* newfield = new LIB_FIELD( m_id );
Copy( newfield );
return (LIB_DRAW_ITEM*) newfield;
return (EDA_ITEM*) newfield;
}
@ -417,7 +417,7 @@ void LIB_FIELD::Copy( LIB_FIELD* aTarget ) const
}
int LIB_FIELD::DoCompare( const LIB_DRAW_ITEM& other ) const
int LIB_FIELD::DoCompare( const LIB_ITEM& other ) const
{
wxASSERT( other.Type() == LIB_FIELD_T );
@ -654,6 +654,14 @@ void LIB_FIELD::SetText( const wxString& aText )
}
wxString LIB_FIELD::GetSelectMenuText() const
{
return wxString::Format( _( "Field %s %s" ),
GetChars( GetName() ),
GetChars( GetText() ) );
}
void LIB_FIELD::BeginEdit( int aEditMode, const wxPoint aPosition )
{
wxCHECK_RET( ( aEditMode & ( IS_NEW | IS_MOVED ) ) != 0,
@ -723,7 +731,7 @@ void LIB_FIELD::DisplayInfo( EDA_DRAW_FRAME* aFrame )
{
wxString msg;
LIB_DRAW_ITEM::DisplayInfo( aFrame );
LIB_ITEM::DisplayInfo( aFrame );
// Display style:
msg = GetTextStyleName();

View File

@ -15,7 +15,7 @@
* the component property editor assumes it.
* @see enum NumFieldType
*/
class LIB_FIELD : public LIB_DRAW_ITEM, public EDA_TEXT
class LIB_FIELD : public LIB_ITEM, public EDA_TEXT
{
int m_id; ///< @see enum NumFieldType
wxString m_name; ///< Name (not the field text value itself, that is .m_Text)
@ -190,17 +190,17 @@ public:
int GetDefaultColor();
/**
* See LIB_DRAW_ITEM::BeginEdit().
* See LIB_ITEM::BeginEdit().
*/
void BeginEdit( int aEditMode, const wxPoint aStartPoint = wxPoint( 0, 0 ) );
/**
* See LIB_DRAW_ITEM::ContinueEdit().
* See LIB_ITEM::ContinueEdit().
*/
bool ContinueEdit( const wxPoint aNextPoint );
/**
* See LIB_DRAW_ITEM::AbortEdit().
* See LIB_ITEM::AbortEdit().
*/
void EndEdit( const wxPoint& aPosition, bool aAbort = false );
@ -219,8 +219,12 @@ public:
*/
void SetText( const wxString& aText );
virtual wxString GetSelectMenuText() const;
virtual const char** GetMenuImage() const { return (const char**) move_field_xpm; }
protected:
virtual LIB_DRAW_ITEM* DoGenCopy();
virtual EDA_ITEM* doClone() const;
/**
* Provide the field draw object specific comparison.
@ -234,7 +238,7 @@ protected:
* - Field width.
* - Field height.
*/
virtual int DoCompare( const LIB_DRAW_ITEM& other ) const;
virtual int DoCompare( const LIB_ITEM& other ) const;
virtual void DoOffset( const wxPoint& offset );
virtual bool DoTestInside( EDA_RECT& rect ) const;
@ -247,6 +251,6 @@ protected:
virtual void DoSetWidth( int width ) { m_Thickness = width; }
};
typedef std::vector< LIB_FIELD > LIB_FIELD_LIST;
typedef std::vector< LIB_FIELD > LIB_FIELDS;
#endif // CLASS_LIBENTRY_FIELDS_H

View File

@ -162,7 +162,7 @@ extern void PlotPinSymbol( PLOTTER* plotter, const wxPoint& pos,
LIB_PIN::LIB_PIN( LIB_COMPONENT* aParent ) :
LIB_DRAW_ITEM( LIB_PIN_T, aParent )
LIB_ITEM( LIB_PIN_T, aParent )
{
m_length = 300; /* default Pin len */
m_orientation = PIN_RIGHT; /* Pin orient: Up, Down, Left, Right */
@ -181,7 +181,7 @@ LIB_PIN::LIB_PIN( LIB_COMPONENT* aParent ) :
}
LIB_PIN::LIB_PIN( const LIB_PIN& pin ) : LIB_DRAW_ITEM( pin )
LIB_PIN::LIB_PIN( const LIB_PIN& pin ) : LIB_ITEM( pin )
{
m_position = pin.m_position;
m_length = pin.m_length;
@ -216,7 +216,7 @@ void LIB_PIN::SetName( const wxString& aName )
if( GetParent() == NULL )
return;
LIB_PIN_LIST pinList;
LIB_PINS pinList;
GetParent()->GetPins( pinList );
for( size_t i = 0; i < pinList.size(); i++ )
@ -241,7 +241,7 @@ void LIB_PIN::SetNameTextSize( int size )
if( GetParent() == NULL )
return;
LIB_PIN_LIST pinList;
LIB_PINS pinList;
GetParent()->GetPins( pinList );
for( size_t i = 0; i < pinList.size(); i++ )
@ -285,7 +285,7 @@ void LIB_PIN::SetNumberTextSize( int size )
if( GetParent() == NULL )
return;
LIB_PIN_LIST pinList;
LIB_PINS pinList;
GetParent()->GetPins( pinList );
for( size_t i = 0; i < pinList.size(); i++ )
@ -310,7 +310,7 @@ void LIB_PIN::SetOrientation( int orientation )
if( GetParent() == NULL )
return;
LIB_PIN_LIST pinList;
LIB_PINS pinList;
GetParent()->GetPins( pinList );
for( size_t i = 0; i < pinList.size(); i++ )
@ -335,7 +335,7 @@ void LIB_PIN::SetShape( int aShape )
if( GetParent() == NULL )
return;
LIB_PIN_LIST pinList;
LIB_PINS pinList;
GetParent()->GetPins( pinList );
for( size_t i = 0; i < pinList.size(); i++ )
@ -362,7 +362,7 @@ void LIB_PIN::SetType( int aType )
if( GetParent() == NULL )
return;
LIB_PIN_LIST pinList;
LIB_PINS pinList;
GetParent()->GetPins( pinList );
for( size_t i = 0; i < pinList.size(); i++ )
@ -387,7 +387,7 @@ void LIB_PIN::SetLength( int length )
if( GetParent() == NULL )
return;
LIB_PIN_LIST pinList;
LIB_PINS pinList;
GetParent()->GetPins( pinList );
for( size_t i = 0; i < pinList.size(); i++ )
@ -427,7 +427,7 @@ void LIB_PIN::SetPartNumber( int part )
|| ( pin->m_orientation != m_orientation ) )
continue;
GetParent()->RemoveDrawItem( (LIB_DRAW_ITEM*) pin );
GetParent()->RemoveDrawItem( (LIB_ITEM*) pin );
}
}
}
@ -458,7 +458,7 @@ void LIB_PIN::SetConversion( int style )
|| ( pin->m_orientation != m_orientation ) )
continue;
GetParent()->RemoveDrawItem( (LIB_DRAW_ITEM*) pin );
GetParent()->RemoveDrawItem( (LIB_ITEM*) pin );
}
}
}
@ -479,7 +479,7 @@ void LIB_PIN::SetVisible( bool visible )
if( GetParent() == NULL )
return;
LIB_PIN_LIST pinList;
LIB_PINS pinList;
GetParent()->GetPins( pinList );
for( size_t i = 0; i < pinList.size(); i++ )
@ -499,7 +499,7 @@ void LIB_PIN::SetVisible( bool visible )
void LIB_PIN::EnableEditMode( bool enable, bool editPinByPin )
{
LIB_PIN_LIST pinList;
LIB_PINS pinList;
if( GetParent() == NULL )
return;
@ -525,22 +525,16 @@ void LIB_PIN::EnableEditMode( bool enable, bool editPinByPin )
bool LIB_PIN::HitTest( const wxPoint& aPosition )
{
int mindist = m_width ? m_width / 2 : g_DrawDefaultLineThickness / 2;
// Have a minimal tolerance for hit test
if( mindist < 3 )
mindist = 3; // = 3 mils
return HitTest( aPosition, mindist, DefaultTransform );
return HitTest( aPosition, 0, DefaultTransform );
}
bool LIB_PIN::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTransform )
{
wxPoint pinPos = aTransform.TransformCoordinate( m_position );
wxPoint pinEnd = aTransform.TransformCoordinate( ReturnPinEndPoint() );
EDA_RECT rect = GetBoundingBox();
rect.Inflate( aThreshold );
return TestSegmentHit( aPosition, pinPos, pinEnd, aThreshold );
return rect.Contains( aPosition );
}
@ -1599,34 +1593,13 @@ void LIB_PIN::SetPinNumFromString( wxString& buffer )
}
LIB_DRAW_ITEM* LIB_PIN::DoGenCopy()
EDA_ITEM* LIB_PIN::doClone() const
{
LIB_PIN* newpin = new LIB_PIN( GetParent() );
newpin->m_position = m_position;
newpin->m_length = m_length;
newpin->m_orientation = m_orientation;
newpin->m_shape = m_shape;
newpin->m_type = m_type;
newpin->m_attributes = m_attributes;
newpin->m_number = m_number;
newpin->m_PinNumSize = m_PinNumSize;
newpin->m_PinNameSize = m_PinNameSize;
newpin->m_PinNumShapeOpt = m_PinNumShapeOpt;
newpin->m_PinNameShapeOpt = m_PinNameShapeOpt;
newpin->m_PinNumPositionOpt = m_PinNumPositionOpt;
newpin->m_PinNamePositionOpt = m_PinNamePositionOpt;
newpin->m_Unit = m_Unit;
newpin->m_Convert = m_Convert;
newpin->m_Flags = m_Flags;
newpin->m_width = m_width;
newpin->m_name = m_name;
return (LIB_DRAW_ITEM*) newpin;
return new LIB_PIN( *this );
}
int LIB_PIN::DoCompare( const LIB_DRAW_ITEM& other ) const
int LIB_PIN::DoCompare( const LIB_ITEM& other ) const
{
wxASSERT( other.Type() == LIB_PIN_T );
@ -1724,7 +1697,7 @@ void LIB_PIN::DisplayInfo( EDA_DRAW_FRAME* frame )
{
wxString Text;
LIB_DRAW_ITEM::DisplayInfo( frame );
LIB_ITEM::DisplayInfo( frame );
frame->AppendMsgPanel( _( "Name" ), m_name, DARKCYAN );
@ -1766,35 +1739,57 @@ EDA_RECT LIB_PIN::GetBoundingBox() const
EDA_RECT bbox;
wxPoint begin;
wxPoint end;
int pinname_offset = 0;
int nameTextOffset = 0;
bool showName = !m_name.IsEmpty() && (m_name != wxT( "~" ));
int symbolX = TARGET_PIN_DIAM / 2;
int symbolY = TARGET_PIN_DIAM / 2;
if( entry )
pinname_offset = entry->GetPinNameOffset();
{
if( entry->ShowPinNames() )
nameTextOffset = entry->GetPinNameOffset();
else
showName = false;
}
// First, calculate boundary box corners position
int pinnum_len = m_PinNumSize * GetNumberString().Len();
int numberTextLength = m_PinNumSize * GetNumberString().Len();
// Actual text height are bigger than text size
int pinname_hight = wxRound( m_PinNameSize * 1.3 );
int pinnum_hight = wxRound( m_PinNumSize * 1.3 );
int nameTextHeight = wxRound( m_PinNameSize * 1.1 );
int numberTextHeight = wxRound( m_PinNumSize * 1.1 );
if( m_shape & INVERT )
symbolX = symbolY = INVERT_PIN_RADIUS;
// calculate top left corner position
// for the default pin orientation (PIN_RIGHT)
begin.y = pinnum_hight + TXTMARGE;
begin.x = MIN( -TARGET_PIN_DIAM, m_length - pinnum_len / 2 );
begin.y = numberTextHeight + TXTMARGE;
begin.x = MIN( -TARGET_PIN_DIAM / 2, m_length - (numberTextLength / 2) );
// calculate bottom right corner position and adjust top left corner position
int pinname_len = m_PinNameSize * m_name.Len();
if( pinname_offset )
int nameTextLength = 0;
if( showName )
{
end.y = -pinname_hight / 2;
end.x = m_length + pinname_offset + pinname_len;
int length = m_name.Len();
// Don't count the line over text symbol.
if( m_name.Left( 1 ) == wxT( "~" ) )
length -= 1;
nameTextLength = ( m_PinNameSize * length ) + nameTextOffset;
}
if( showName )
{
end.y = -nameTextHeight / 2;
end.x = m_length + nameTextLength;
}
else
{
end.y = -pinname_hight - TXTMARGE;
end.x = MAX( m_length, pinname_len / 2 );
begin.x = MIN( begin.x, m_length - pinname_len / 2 );
end.y = -symbolY;
end.x = m_length;
}
// Now, calculate boundary box corners position for the actual pin orientation

View File

@ -80,7 +80,7 @@ enum DrawPinOrient {
};
class LIB_PIN : public LIB_DRAW_ITEM
class LIB_PIN : public LIB_ITEM
{
wxPoint m_position; ///< Position of the pin.
int m_length; ///< Length of the pin.
@ -455,7 +455,7 @@ public:
virtual wxString GetSelectMenuText() const;
protected:
virtual LIB_DRAW_ITEM* DoGenCopy();
virtual EDA_ITEM* doClone() const;
/**
* Provide the pin draw object specific comparison.
@ -466,7 +466,7 @@ protected:
* - Pin horizontal (X) position.
* - Pin vertical (Y) position.
*/
virtual int DoCompare( const LIB_DRAW_ITEM& aOther ) const;
virtual int DoCompare( const LIB_ITEM& aOther ) const;
virtual void DoOffset( const wxPoint& aOffset );
virtual bool DoTestInside( EDA_RECT& aRect ) const;
virtual void DoMove( const wxPoint& aPosition );

View File

@ -20,7 +20,7 @@
LIB_POLYLINE::LIB_POLYLINE( LIB_COMPONENT* aParent ) :
LIB_DRAW_ITEM( LIB_POLYLINE_T, aParent )
LIB_ITEM( LIB_POLYLINE_T, aParent )
{
m_Fill = NO_FILL;
m_Width = 0;
@ -30,11 +30,10 @@ LIB_POLYLINE::LIB_POLYLINE( LIB_COMPONENT* aParent ) :
LIB_POLYLINE::LIB_POLYLINE( const LIB_POLYLINE& polyline ) :
LIB_DRAW_ITEM( polyline )
LIB_ITEM( polyline )
{
m_PolyPoints = polyline.m_PolyPoints; // Vector copy
m_Width = polyline.m_Width;
m_Fill = polyline.m_Fill;
}
@ -64,8 +63,7 @@ bool LIB_POLYLINE::Load( char* aLine, wxString& aErrorMsg )
int i, ccount = 0;
wxPoint pt;
i = sscanf( &aLine[2], "%d %d %d %d", &ccount, &m_Unit, &m_Convert,
&m_Width );
i = sscanf( &aLine[2], "%d %d %d %d", &ccount, &m_Unit, &m_Convert, &m_Width );
m_Fill = NO_FILL;
@ -115,22 +113,13 @@ bool LIB_POLYLINE::Load( char* aLine, wxString& aErrorMsg )
}
LIB_DRAW_ITEM* LIB_POLYLINE::DoGenCopy()
EDA_ITEM* LIB_POLYLINE::doClone() const
{
LIB_POLYLINE* newitem = new LIB_POLYLINE( GetParent() );
newitem->m_PolyPoints = m_PolyPoints; // Vector copy
newitem->m_Width = m_Width;
newitem->m_Unit = m_Unit;
newitem->m_Convert = m_Convert;
newitem->m_Flags = m_Flags;
newitem->m_Fill = m_Fill;
return (LIB_DRAW_ITEM*) newitem;
return new LIB_POLYLINE( *this );
}
int LIB_POLYLINE::DoCompare( const LIB_DRAW_ITEM& aOther ) const
int LIB_POLYLINE::DoCompare( const LIB_ITEM& aOther ) const
{
wxASSERT( aOther.Type() == LIB_POLYLINE_T );
@ -383,7 +372,7 @@ void LIB_POLYLINE::DisplayInfo( EDA_DRAW_FRAME* aFrame )
wxString msg;
EDA_RECT bBox = GetBoundingBox();
LIB_DRAW_ITEM::DisplayInfo( aFrame );
LIB_ITEM::DisplayInfo( aFrame );
msg = ReturnStringFromValue( g_UserUnit, m_Width, EESCHEMA_INTERNAL_UNIT, true );
@ -396,6 +385,17 @@ void LIB_POLYLINE::DisplayInfo( EDA_DRAW_FRAME* aFrame )
}
wxString LIB_POLYLINE::GetSelectMenuText() const
{
return wxString::Format( _( "Polyline at (%s, %s) with %u points" ),
GetChars( CoordinateToString( m_PolyPoints[0].x,
EESCHEMA_INTERNAL_UNIT ) ),
GetChars( CoordinateToString( m_PolyPoints[0].y,
EESCHEMA_INTERNAL_UNIT ) ),
m_PolyPoints.size() );
}
void LIB_POLYLINE::BeginEdit( int aEditMode, const wxPoint aPosition )
{
wxCHECK_RET( ( aEditMode & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0,

View File

@ -9,7 +9,7 @@
#include "lib_draw_item.h"
class LIB_POLYLINE : public LIB_DRAW_ITEM
class LIB_POLYLINE : public LIB_ITEM
{
int m_Width; // Line width
std::vector<wxPoint> m_PolyPoints; // list of points (>= 2)
@ -91,22 +91,26 @@ public:
virtual void DisplayInfo( EDA_DRAW_FRAME* aFrame );
/**
* See LIB_DRAW_ITEM::BeginEdit().
* See LIB_ITEM::BeginEdit().
*/
void BeginEdit( int aEditMode, const wxPoint aStartPoint = wxPoint( 0, 0 ) );
/**
* See LIB_DRAW_ITEM::ContinueEdit().
* See LIB_ITEM::ContinueEdit().
*/
bool ContinueEdit( const wxPoint aNextPoint );
/**
* See LIB_DRAW_ITEM::AbortEdit().
* See LIB_ITEM::AbortEdit().
*/
void EndEdit( const wxPoint& aPosition, bool aAbort = false );
virtual wxString GetSelectMenuText() const;
virtual const char** GetMenuImage() const { return (const char**) add_polygon_xpm; }
protected:
virtual LIB_DRAW_ITEM* DoGenCopy();
virtual EDA_ITEM* doClone() const;
/**
* Provide the polyline segment draw object specific comparison.
@ -115,7 +119,7 @@ protected:
* - Line segment point horizontal (X) position.
* - Line segment point vertical (Y) position.
*/
virtual int DoCompare( const LIB_DRAW_ITEM& aOther ) const;
virtual int DoCompare( const LIB_ITEM& aOther ) const;
virtual void DoOffset( const wxPoint& aOffset );
virtual bool DoTestInside( EDA_RECT& aRect ) const;

View File

@ -5,6 +5,7 @@
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "macros.h"
#include "class_drawpanel.h"
#include "plot_common.h"
#include "trigo.h"
@ -17,7 +18,7 @@
LIB_RECTANGLE::LIB_RECTANGLE( LIB_COMPONENT* aParent ) :
LIB_DRAW_ITEM( LIB_RECTANGLE_T, aParent )
LIB_ITEM( LIB_RECTANGLE_T, aParent )
{
m_Width = 0;
m_Fill = NO_FILL;
@ -30,7 +31,7 @@ LIB_RECTANGLE::LIB_RECTANGLE( LIB_COMPONENT* aParent ) :
LIB_RECTANGLE::LIB_RECTANGLE( const LIB_RECTANGLE& aRect ) :
LIB_DRAW_ITEM( aRect )
LIB_ITEM( aRect )
{
m_Pos = aRect.m_Pos;
m_End = aRect.m_End;
@ -72,23 +73,13 @@ bool LIB_RECTANGLE::Load( char* aLine, wxString& aErrorMsg )
}
LIB_DRAW_ITEM* LIB_RECTANGLE::DoGenCopy()
EDA_ITEM* LIB_RECTANGLE::doClone() const
{
LIB_RECTANGLE* newitem = new LIB_RECTANGLE( GetParent() );
newitem->m_Pos = m_Pos;
newitem->m_End = m_End;
newitem->m_Width = m_Width;
newitem->m_Unit = m_Unit;
newitem->m_Convert = m_Convert;
newitem->m_Flags = m_Flags;
newitem->m_Fill = m_Fill;
return (LIB_DRAW_ITEM*) newitem;
return new LIB_RECTANGLE( *this );
}
int LIB_RECTANGLE::DoCompare( const LIB_DRAW_ITEM& aOther ) const
int LIB_RECTANGLE::DoCompare( const LIB_ITEM& aOther ) const
{
wxASSERT( aOther.Type() == LIB_RECTANGLE_T );
@ -221,7 +212,7 @@ void LIB_RECTANGLE::DisplayInfo( EDA_DRAW_FRAME* aFrame )
{
wxString msg;
LIB_DRAW_ITEM::DisplayInfo( aFrame );
LIB_ITEM::DisplayInfo( aFrame );
msg = ReturnStringFromValue( g_UserUnit, m_Width, EESCHEMA_INTERNAL_UNIT, true );
@ -289,6 +280,16 @@ bool LIB_RECTANGLE::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM&
}
wxString LIB_RECTANGLE::GetSelectMenuText() const
{
return wxString::Format( _( "Rectangle from (%s, %s) to (%s, %s)" ),
GetChars( CoordinateToString( m_Pos.x, EESCHEMA_INTERNAL_UNIT ) ),
GetChars( CoordinateToString( m_Pos.y, EESCHEMA_INTERNAL_UNIT ) ),
GetChars( CoordinateToString( m_End.x, EESCHEMA_INTERNAL_UNIT ) ),
GetChars( CoordinateToString( m_End.y, EESCHEMA_INTERNAL_UNIT ) ) );
}
void LIB_RECTANGLE::BeginEdit( int aEditMode, const wxPoint aPosition )
{
wxCHECK_RET( ( aEditMode & ( IS_NEW | IS_MOVED | IS_RESIZED ) ) != 0,

View File

@ -9,7 +9,7 @@
#include "lib_draw_item.h"
class LIB_RECTANGLE : public LIB_DRAW_ITEM
class LIB_RECTANGLE : public LIB_ITEM
{
wxPoint m_End; // Rectangle end point.
wxPoint m_Pos; // Rectangle start point.
@ -79,22 +79,26 @@ public:
virtual void DisplayInfo( EDA_DRAW_FRAME* aFrame );
/**
* See LIB_DRAW_ITEM::BeginEdit().
* See LIB_ITEM::BeginEdit().
*/
void BeginEdit( int aEditMode, const wxPoint aStartPoint = wxPoint( 0, 0 ) );
/**
* See LIB_DRAW_ITEM::ContinueEdit().
* See LIB_ITEM::ContinueEdit().
*/
bool ContinueEdit( const wxPoint aNextPoint );
/**
* See LIB_DRAW_ITEM::AbortEdit().
* See LIB_ITEM::AbortEdit().
*/
void EndEdit( const wxPoint& aPosition, bool aAbort = false );
virtual wxString GetSelectMenuText() const;
virtual const char** GetMenuImage() const { return (const char**) add_rectangle_xpm; }
protected:
virtual LIB_DRAW_ITEM* DoGenCopy();
virtual EDA_ITEM* doClone() const;
/**
* Provide the rectangle draw object specific comparison.
@ -105,7 +109,7 @@ protected:
* - Rectangle horizontal (X) end position.
* - Rectangle vertical (Y) end position.
*/
virtual int DoCompare( const LIB_DRAW_ITEM& aOther ) const;
virtual int DoCompare( const LIB_ITEM& aOther ) const;
virtual void DoOffset( const wxPoint& aOffset );
virtual bool DoTestInside( EDA_RECT& aRect ) const;

View File

@ -25,7 +25,7 @@
LIB_TEXT::LIB_TEXT(LIB_COMPONENT * aParent) :
LIB_DRAW_ITEM( LIB_TEXT_T, aParent ),
LIB_ITEM( LIB_TEXT_T, aParent ),
EDA_TEXT()
{
m_Size = wxSize( 50, 50 );
@ -187,7 +187,7 @@ bool LIB_TEXT::HitTest( wxPoint aPosition, int aThreshold, const TRANSFORM& aTra
}
LIB_DRAW_ITEM* LIB_TEXT::DoGenCopy()
EDA_ITEM* LIB_TEXT::doClone() const
{
LIB_TEXT* newitem = new LIB_TEXT(NULL);
@ -204,11 +204,11 @@ LIB_DRAW_ITEM* LIB_TEXT::DoGenCopy()
newitem->m_Bold = m_Bold;
newitem->m_HJustify = m_HJustify;
newitem->m_VJustify = m_VJustify;
return (LIB_DRAW_ITEM*) newitem;
return (EDA_ITEM*) newitem;
}
int LIB_TEXT::DoCompare( const LIB_DRAW_ITEM& other ) const
int LIB_TEXT::DoCompare( const LIB_ITEM& other ) const
{
wxASSERT( other.Type() == LIB_TEXT_T );
@ -379,7 +379,7 @@ void LIB_TEXT::DisplayInfo( EDA_DRAW_FRAME* frame )
{
wxString msg;
LIB_DRAW_ITEM::DisplayInfo( frame );
LIB_ITEM::DisplayInfo( frame );
msg = ReturnStringFromValue( g_UserUnit, m_Thickness, EESCHEMA_INTERNAL_UNIT, true );
@ -440,6 +440,20 @@ void LIB_TEXT::SetText( const wxString& aText )
}
wxString LIB_TEXT::GetSelectMenuText() const
{
wxString tmp = GetText();
tmp.Replace( wxT( "\n" ), wxT( " " ) );
tmp.Replace( wxT( "\r" ), wxT( " " ) );
tmp.Replace( wxT( "\t" ), wxT( " " ) );
tmp =( tmp.Length() > 15 ) ? tmp.Left( 12 ) + wxT( "..." ) : tmp;
wxString msg;
msg.Printf( _( "Graphic Text %s" ), GetChars( tmp ) );
return msg;
}
void LIB_TEXT::BeginEdit( int aEditMode, const wxPoint aPosition )
{
wxCHECK_RET( ( aEditMode & ( IS_NEW | IS_MOVED ) ) != 0,

View File

@ -12,7 +12,7 @@
/* Fields like Ref , value... are not Text, */
/* they are a separate class */
/*********************************************/
class LIB_TEXT : public LIB_DRAW_ITEM, public EDA_TEXT
class LIB_TEXT : public LIB_ITEM, public EDA_TEXT
{
wxString m_savedText; ///< Temporary storage for the string when edition.
bool m_rotate; ///< Flag to indicate a rotation occurred while editing.
@ -103,22 +103,26 @@ public:
void Rotate();
/**
* See LIB_DRAW_ITEM::BeginEdit().
* See LIB_ITEM::BeginEdit().
*/
void BeginEdit( int aEditMode, const wxPoint aStartPoint = wxPoint( 0, 0 ) );
/**
* See LIB_DRAW_ITEM::ContinueEdit().
* See LIB_ITEM::ContinueEdit().
*/
bool ContinueEdit( const wxPoint aNextPoint );
/**
* See LIB_DRAW_ITEM::AbortEdit().
* See LIB_ITEM::AbortEdit().
*/
void EndEdit( const wxPoint& aPosition, bool aAbort = false );
virtual wxString GetSelectMenuText() const;
virtual const char** GetMenuImage() const { return (const char**) add_text_xpm; }
protected:
virtual LIB_DRAW_ITEM* DoGenCopy();
virtual EDA_ITEM* doClone() const;
/**
* Provide the text draw object specific comparison.
@ -130,7 +134,7 @@ protected:
* - Text width.
* - Text height.
*/
virtual int DoCompare( const LIB_DRAW_ITEM& aOther ) const;
virtual int DoCompare( const LIB_ITEM& aOther ) const;
virtual void DoOffset( const wxPoint& aOffset );
virtual bool DoTestInside( EDA_RECT& aRect ) const;

View File

@ -20,27 +20,32 @@
void LIB_EDIT_FRAME::OnLeftClick( wxDC* DC, const wxPoint& aPosition )
{
LIB_DRAW_ITEM* DrawEntry = m_drawItem;
LIB_ITEM* item = m_drawItem;
if( m_component == NULL ) // No component loaded !
return;
if( DrawEntry == NULL || DrawEntry->m_Flags == 0 )
if( item == NULL || item->m_Flags == 0 )
{
DrawEntry = LocateItemUsingCursor( aPosition );
item = LocateItemUsingCursor( aPosition );
if( DrawEntry )
DrawEntry->DisplayInfo( this );
if( item )
item->DisplayInfo( this );
else
{
DisplayCmpDoc();
if( DrawPanel->m_AbortRequest )
DrawPanel->m_AbortRequest = false;
}
}
switch( GetToolId() )
{
case ID_NO_TOOL_SELECTED:
if( DrawEntry && DrawEntry->m_Flags ) // moved object
if( item && item->m_Flags ) // moved object
{
switch( DrawEntry->Type() )
switch( item->Type() )
{
case LIB_PIN_T:
PlacePin( DC );

View File

@ -13,6 +13,7 @@
#include "bitmaps.h"
#include "eeschema_id.h"
#include "hotkeys.h"
#include "class_drawpanel.h"
#include "class_sch_screen.h"
#include "general.h"
@ -30,7 +31,7 @@ static void AddMenusForPin( wxMenu* PopMenu, LIB_PIN* Pin, LIB_EDIT_FRAME* frame
bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
{
LIB_DRAW_ITEM* DrawEntry = GetDrawItem();
LIB_ITEM* item = GetDrawItem();
bool BlockActive = GetScreen()->IsBlockActive();
if( BlockActive )
@ -44,38 +45,47 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
return true;
// If Command in progress, put menu "cancel"
if( DrawEntry && DrawEntry->GetFlags() )
if( item && item->GetFlags() )
{
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_CANCEL_EDITING, _( "Cancel" ), cancel_xpm );
PopMenu->AppendSeparator();
}
else
{
DrawEntry = LocateItemUsingCursor( aPosition );
item = LocateItemUsingCursor( aPosition );
// If the clarify item selection context menu is aborted, don't show the context menu.
if( item == NULL && DrawPanel->m_AbortRequest )
{
DrawPanel->m_AbortRequest = false;
return false;
}
if( GetToolId() != ID_NO_TOOL_SELECTED )
{
// If a tool is active, put menu "end tool"
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_CANCEL_EDITING, _( "End Tool" ), cancel_tool_xpm );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_CANCEL_EDITING, _( "End Tool" ),
cancel_tool_xpm );
PopMenu->AppendSeparator();
}
}
if( DrawEntry )
DrawEntry->DisplayInfo( this );
if( item )
item->DisplayInfo( this );
else
return true;
m_drawItem = DrawEntry;
m_drawItem = item;
wxString msg;
switch( DrawEntry->Type() )
switch( item->Type() )
{
case LIB_PIN_T:
AddMenusForPin( PopMenu, (LIB_PIN*) DrawEntry, this );
AddMenusForPin( PopMenu, (LIB_PIN*) item, this );
break;
case LIB_ARC_T:
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Move Arc" ), s_Libedit_Hokeys_Descr,
HK_LIBEDIT_MOVE_GRAPHIC_ITEM );
@ -87,7 +97,7 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
msg = AddHotkeyName( _( "Edit Arc Options" ), s_Libedit_Hokeys_Descr, HK_EDIT );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_BODY_EDIT_ITEM, msg, options_arc_xpm );
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Delete Arc" ), s_Libedit_Hokeys_Descr, HK_DELETE );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_DELETE_ITEM, msg, delete_arc_xpm );
@ -95,14 +105,14 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
break;
case LIB_CIRCLE_T:
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Move Circle" ), s_Libedit_Hokeys_Descr,
HK_LIBEDIT_MOVE_GRAPHIC_ITEM );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_MOVE_ITEM_REQUEST, msg, move_circle_xpm );
}
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Drag Circle Outline" ), s_Libedit_Hokeys_Descr, HK_DRAG );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_MODIFY_ITEM, msg, move_rectangle_xpm );
@ -111,7 +121,7 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
msg = AddHotkeyName( _( "Edit Circle Options" ), s_Libedit_Hokeys_Descr, HK_EDIT );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_BODY_EDIT_ITEM, msg, options_circle_xpm );
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Delete Circle" ), s_Libedit_Hokeys_Descr, HK_DELETE );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_DELETE_ITEM, msg, delete_circle_xpm );
@ -119,7 +129,7 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
break;
case LIB_RECTANGLE_T:
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Move Rectangle" ), s_Libedit_Hokeys_Descr,
HK_LIBEDIT_MOVE_GRAPHIC_ITEM );
@ -129,13 +139,13 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
msg = AddHotkeyName( _( "Edit Rectangle Options" ), s_Libedit_Hokeys_Descr, HK_EDIT );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_BODY_EDIT_ITEM, msg, options_rectangle_xpm );
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Drag Rectangle Edge" ), s_Libedit_Hokeys_Descr, HK_DRAG );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_MODIFY_ITEM, msg, move_rectangle_xpm );
}
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Delete Rectangle" ), s_Libedit_Hokeys_Descr, HK_DELETE );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_DELETE_ITEM, msg, delete_rectangle_xpm );
@ -144,7 +154,7 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
break;
case LIB_TEXT_T:
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Move Text" ), s_Libedit_Hokeys_Descr,
HK_LIBEDIT_MOVE_GRAPHIC_ITEM );
@ -157,7 +167,7 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
msg = AddHotkeyName( _( "Rotate Text" ), s_Libedit_Hokeys_Descr, HK_ROTATE );
ADD_MENUITEM( PopMenu, ID_LIBEDIT_ROTATE_ITEM, msg, edit_text_xpm );
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Delete Text" ), s_Libedit_Hokeys_Descr, HK_DELETE );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_DELETE_ITEM, msg, delete_text_xpm );
@ -165,7 +175,7 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
break;
case LIB_POLYLINE_T:
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Move Line" ), s_Libedit_Hokeys_Descr,
HK_LIBEDIT_MOVE_GRAPHIC_ITEM );
@ -174,7 +184,7 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_MODIFY_ITEM, msg, move_line_xpm );
}
if( DrawEntry->m_Flags & IS_NEW )
if( item->IsNew() )
{
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_END_CREATE_ITEM, _( "Line End" ), apply_xpm );
}
@ -182,14 +192,14 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
msg = AddHotkeyName( _( "Edit Line Options" ), s_Libedit_Hokeys_Descr, HK_EDIT );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_BODY_EDIT_ITEM, msg, options_segment_xpm );
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Delete Line " ), s_Libedit_Hokeys_Descr, HK_DELETE );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_DELETE_ITEM, msg, delete_segment_xpm );
}
else if( (DrawEntry->m_Flags & IS_NEW) )
else if( item->IsNew() )
{
if( ( (LIB_POLYLINE*) DrawEntry )->GetCornerCount() > 2 )
if( ( (LIB_POLYLINE*) item )->GetCornerCount() > 2 )
{
msg = AddHotkeyName( _( "Delete Segment" ), s_Libedit_Hokeys_Descr, HK_DELETE );
ADD_MENUITEM( PopMenu, ID_POPUP_LIBEDIT_DELETE_CURRENT_POLY_SEGMENT,
@ -200,7 +210,7 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
break;
case LIB_FIELD_T:
if( DrawEntry->m_Flags == 0 )
if( item->GetFlags() == 0 )
{
msg = AddHotkeyName( _( "Move Field" ), s_Libedit_Hokeys_Descr,
HK_LIBEDIT_MOVE_GRAPHIC_ITEM );
@ -214,10 +224,8 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
default:
wxString msg;
msg.Printf( wxT( "LIB_EDIT_FRAME::OnRightClick Error: unknown StructType %d" ),
DrawEntry->Type() );
DisplayError( this, msg );
wxFAIL_MSG( wxString::Format( wxT( "Unknown library item type %d" ),
item->Type() ) );
m_drawItem = NULL;
break;
}
@ -230,7 +238,7 @@ bool LIB_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu )
void AddMenusForPin( wxMenu* PopMenu, LIB_PIN* Pin, LIB_EDIT_FRAME* frame )
{
bool selected = (Pin->m_Selected & IS_SELECTED) != 0;
bool not_in_move = (Pin->m_Flags == 0);
bool not_in_move = (Pin->GetFlags() == 0);
wxString msg;
if( not_in_move )

View File

@ -61,8 +61,8 @@ CMP_LIBRARY* LIB_EDIT_FRAME:: m_library = NULL;
wxString LIB_EDIT_FRAME:: m_aliasName;
int LIB_EDIT_FRAME:: m_unit = 1;
int LIB_EDIT_FRAME:: m_convert = 1;
LIB_DRAW_ITEM* LIB_EDIT_FRAME::m_lastDrawItem = NULL;
LIB_DRAW_ITEM* LIB_EDIT_FRAME::m_drawItem = NULL;
LIB_ITEM* LIB_EDIT_FRAME::m_lastDrawItem = NULL;
LIB_ITEM* LIB_EDIT_FRAME::m_drawItem = NULL;
bool LIB_EDIT_FRAME:: m_showDeMorgan = false;
wxSize LIB_EDIT_FRAME:: m_clientSize = wxSize( -1, -1 );
int LIB_EDIT_FRAME:: m_textSize = DEFAULT_SIZE_TEXT;
@ -123,6 +123,9 @@ BEGIN_EVENT_TABLE( LIB_EDIT_FRAME, EDA_DRAW_FRAME )
EVT_MENU( ID_COLORS_SETUP, LIB_EDIT_FRAME::Process_Config )
EVT_MENU( ID_LIBEDIT_DIMENSIONS, LIB_EDIT_FRAME::InstallDimensionsDialog )
// Multple item selection context menu commands.
EVT_MENU_RANGE( ID_SELECT_ITEM_START, ID_SELECT_ITEM_END, LIB_EDIT_FRAME::OnSelectItem )
EVT_MENU_RANGE( ID_PREFERENCES_HOTKEY_START, ID_PREFERENCES_HOTKEY_END,
LIB_EDIT_FRAME::Process_Config )
@ -282,7 +285,7 @@ void LIB_EDIT_FRAME::LoadSettings()
}
void LIB_EDIT_FRAME::SetDrawItem( LIB_DRAW_ITEM* drawItem )
void LIB_EDIT_FRAME::SetDrawItem( LIB_ITEM* drawItem )
{
m_drawItem = drawItem;
}
@ -722,7 +725,7 @@ void LIB_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_LIBEDIT_MOVE_ITEM_REQUEST:
if( m_drawItem == NULL )
break;
DrawPanel->MoveCursorToCrossHair();
if( m_drawItem->Type() == LIB_PIN_T )
StartMovePin( &dc );
else
@ -906,7 +909,7 @@ void LIB_EDIT_FRAME::SVG_Print_Component( const wxString& FullFileName )
}
void LIB_EDIT_FRAME::EditSymbolText( wxDC* DC, LIB_DRAW_ITEM* DrawItem )
void LIB_EDIT_FRAME::EditSymbolText( wxDC* DC, LIB_ITEM* DrawItem )
{
if ( ( DrawItem == NULL ) || ( DrawItem->Type() != LIB_TEXT_T ) )
return;
@ -1075,18 +1078,77 @@ void LIB_EDIT_FRAME::OnRotateItem( wxCommandEvent& aEvent )
}
LIB_DRAW_ITEM* LIB_EDIT_FRAME::LocateItemUsingCursor( const wxPoint& aPosition )
LIB_ITEM* LIB_EDIT_FRAME::LocateItemUsingCursor( const wxPoint& aPosition,
const KICAD_T aFilterList[] )
{
if( m_component == NULL )
return NULL;
LIB_DRAW_ITEM* item = m_component->LocateDrawItem( m_unit, m_convert, TYPE_NOT_INIT,
aPosition );
LIB_ITEM* item = locateItem( aPosition, aFilterList );
if( item == NULL )
return NULL;
wxPoint pos = GetScreen()->GetNearestGridPosition( aPosition );
if( item == NULL && aPosition != pos )
item = m_component->LocateDrawItem( m_unit, m_convert, TYPE_NOT_INIT, pos );
item = locateItem( pos, aFilterList );
return item;
}
LIB_ITEM* LIB_EDIT_FRAME::locateItem( const wxPoint& aPosition, const KICAD_T aFilterList[] )
{
if( m_component == NULL )
return NULL;
LIB_ITEM* item = NULL;
m_collectedItems.Collect( m_component->GetDrawItemList(), aFilterList, aPosition,
m_unit, m_convert );
if( m_collectedItems.GetCount() == 0 )
{
ClearMsgPanel();
}
else if( m_collectedItems.GetCount() == 1 )
{
item = m_collectedItems[0];
}
else
{
if( item == NULL )
{
wxASSERT_MSG( m_collectedItems.GetCount() <= MAX_SELECT_ITEM_IDS,
wxT( "Select item clarification context menu size limit exceeded." ) );
wxMenu selectMenu;
wxMenuItem* title = new wxMenuItem( &selectMenu, wxID_NONE, _( "Clarify Selection" ) );
selectMenu.Append( title );
selectMenu.AppendSeparator();
for( int i = 0; i < m_collectedItems.GetCount() && i < MAX_SELECT_ITEM_IDS; i++ )
{
wxString text = m_collectedItems[i]->GetSelectMenuText();
const char** xpm = m_collectedItems[i]->GetMenuImage();
ADD_MENUITEM( &selectMenu, ID_SELECT_ITEM_START + i, text, xpm );
}
// Set to NULL in case user aborts the clarification context menu.
m_drawItem = NULL;
DrawPanel->m_AbortRequest = true; // Changed to false if an item is selected
PopupMenu( &selectMenu );
DrawPanel->MoveCursorToCrossHair();
item = m_drawItem;
}
}
if( item )
item->DisplayInfo( this );
else
ClearMsgPanel();
return item;
}
@ -1104,7 +1166,7 @@ void LIB_EDIT_FRAME::deleteItem( wxDC* aDC )
LIB_PIN* pin = (LIB_PIN*) m_drawItem;
wxPoint pos = pin->GetPosition();
m_component->RemoveDrawItem( (LIB_DRAW_ITEM*) pin, DrawPanel, aDC );
m_component->RemoveDrawItem( (LIB_ITEM*) pin, DrawPanel, aDC );
if( g_EditPinByPinIsOn == false )
{
@ -1118,7 +1180,7 @@ void LIB_EDIT_FRAME::deleteItem( wxDC* aDC )
if( pin->GetPosition() != pos )
continue;
m_component->RemoveDrawItem( (LIB_DRAW_ITEM*) pin );
m_component->RemoveDrawItem( (LIB_ITEM*) pin );
}
}
}
@ -1134,3 +1196,18 @@ void LIB_EDIT_FRAME::deleteItem( wxDC* aDC )
OnModify();
DrawPanel->CrossHairOn( aDC );
}
void LIB_EDIT_FRAME::OnSelectItem( wxCommandEvent& aEvent )
{
int id = aEvent.GetId();
int index = id - ID_SELECT_ITEM_START;
if( (id >= ID_SELECT_ITEM_START && id <= ID_SELECT_ITEM_END)
&& (index >= 0 && index < m_collectedItems.GetCount()) )
{
LIB_ITEM* item = m_collectedItems[index];
DrawPanel->m_AbortRequest = false;
m_drawItem = item;
}
}

View File

@ -10,6 +10,7 @@
#include "class_sch_screen.h"
#include "lib_draw_item.h"
#include "lib_collectors.h"
class SCH_EDIT_FRAME;
@ -26,6 +27,9 @@ class DIALOG_LIB_EDIT_TEXT;
class LIB_EDIT_FRAME : public EDA_DRAW_FRAME
{
LIB_COMPONENT* m_tempCopyComponent; ///< Temporary copy of current component during edit.
LIB_COLLECTOR m_collectedItems; // Used for hit testing.
LIB_ITEM* locateItem( const wxPoint& aPosition, const KICAD_T aFilterList[] );
public:
wxComboBox* m_SelpartBox; // a Box to select a part to edit (if any)
@ -74,6 +78,7 @@ public:
void OnCheckComponent( wxCommandEvent& event );
void OnSelectBodyStyle( wxCommandEvent& event );
void OnEditPin( wxCommandEvent& event );
void OnSelectItem( wxCommandEvent& aEvent );
void OnUpdateSelectTool( wxUpdateUIEvent& aEvent );
void OnUpdateEditingPart( wxUpdateUIEvent& event );
@ -159,17 +164,17 @@ public:
}
LIB_DRAW_ITEM* GetLastDrawItem( void ) { return m_lastDrawItem; }
LIB_ITEM* GetLastDrawItem( void ) { return m_lastDrawItem; }
void SetLastDrawItem( LIB_DRAW_ITEM* drawItem )
void SetLastDrawItem( LIB_ITEM* drawItem )
{
m_lastDrawItem = drawItem;
}
LIB_DRAW_ITEM* GetDrawItem( void ) { return m_drawItem; }
LIB_ITEM* GetDrawItem( void ) { return m_drawItem; }
void SetDrawItem( LIB_DRAW_ITEM* drawItem );
void SetDrawItem( LIB_ITEM* drawItem );
bool GetShowDeMorgan( void ) { return m_showDeMorgan; }
@ -253,16 +258,17 @@ private:
void PlaceAncre();
// Editing graphic items
LIB_DRAW_ITEM* CreateGraphicItem( LIB_COMPONENT* LibEntry, wxDC* DC );
LIB_ITEM* CreateGraphicItem( LIB_COMPONENT* LibEntry, wxDC* DC );
void GraphicItemBeginDraw( wxDC* DC );
void StartMoveDrawSymbol( wxDC* DC );
void StartModifyDrawSymbol( wxDC* DC ); //<! Modify the item, adjust size etc.
void EndDrawGraphicItem( wxDC* DC );
void LoadOneSymbol();
void SaveOneSymbol();
void EditGraphicSymbol( wxDC* DC, LIB_DRAW_ITEM* DrawItem );
void EditSymbolText( wxDC* DC, LIB_DRAW_ITEM* DrawItem );
LIB_DRAW_ITEM* LocateItemUsingCursor( const wxPoint& aPosition );
void EditGraphicSymbol( wxDC* DC, LIB_ITEM* DrawItem );
void EditSymbolText( wxDC* DC, LIB_ITEM* DrawItem );
LIB_ITEM* LocateItemUsingCursor( const wxPoint& aPosition,
const KICAD_T aFilterList[] = LIB_COLLECTOR::AllItems );
void EditField( wxDC* DC, LIB_FIELD* Field );
public:
@ -304,8 +310,8 @@ protected:
/** The current component being edited. NULL if no component is selected. */
static LIB_COMPONENT* m_component;
static LIB_DRAW_ITEM* m_lastDrawItem;
static LIB_DRAW_ITEM* m_drawItem;
static LIB_ITEM* m_lastDrawItem;
static LIB_ITEM* m_drawItem;
static wxString m_aliasName;
// The unit number to edit and show

View File

@ -136,7 +136,7 @@ this component?" ),
if( !aField->InEditMode() )
{
SaveCopyInUndoList( parent );
( (LIB_DRAW_ITEM*) aField )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), -1, g_XorMode,
( (LIB_ITEM*) aField )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), -1, g_XorMode,
&fieldText, DefaultTransform );
}
@ -144,7 +144,7 @@ this component?" ),
if( !aField->InEditMode() )
{
fieldText = aField->GetFullText( m_unit );
( (LIB_DRAW_ITEM*) aField )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), -1, g_XorMode,
( (LIB_ITEM*) aField )->Draw( DrawPanel, DC, wxPoint( 0, 0 ), -1, g_XorMode,
&fieldText, DefaultTransform );
}

View File

@ -596,7 +596,7 @@ SCH_COMPONENT* EXPORT_HELP::findNextComponentAndCreatePinList( EDA_ITEM* a
else // entry->GetPartCount() <= 1 means one part per package
{
LIB_PIN_LIST pins; // constructed once here
LIB_PINS pins; // constructed once here
entry->GetPins( pins, comp->GetUnitSelection( aSheetPath ), comp->GetConvert() );
@ -727,8 +727,8 @@ XNODE* EXPORT_HELP::makeGenericLibParts()
wxString sFprints = wxT( "footprints" );
wxString sFp = wxT( "fp" );
LIB_PIN_LIST pinList;
LIB_FIELD_LIST fieldList;
LIB_PINS pinList;
LIB_FIELDS fieldList;
m_Libraries.clear();

View File

@ -144,13 +144,15 @@ static void AbortPinMove( EDA_DRAW_PANEL* Panel, wxDC* DC )
if( parent == NULL )
return;
LIB_PIN* CurrentPin = (LIB_PIN*) parent->GetDrawItem();
LIB_PIN* pin = (LIB_PIN*) parent->GetDrawItem();
if( CurrentPin == NULL || CurrentPin->Type() != LIB_PIN_T )
if( pin == NULL || pin->Type() != LIB_PIN_T )
return;
if( CurrentPin->IsNew() )
delete CurrentPin;
pin->ClearFlags();
if( pin->IsNew() )
delete pin;
else
parent->RestoreComponent();
@ -408,7 +410,7 @@ static void CreateImagePins( LIB_PIN* Pin, int unit, int convert, bool asDeMorga
/* Create "convert" pin at the current position. */
if( CreateConv == true )
{
NewPin = (LIB_PIN*) Pin->GenCopy();
NewPin = (LIB_PIN*) Pin->Clone();
if( Pin->GetConvert() > 1 )
NewPin->SetConvert( 1 );
@ -423,7 +425,7 @@ static void CreateImagePins( LIB_PIN* Pin, int unit, int convert, bool asDeMorga
if( ii == unit || Pin->GetUnit() == 0 )
continue; /* Pin common to all units. */
NewPin = (LIB_PIN*) Pin->GenCopy();
NewPin = (LIB_PIN*) Pin->Clone();
if( convert != 0 )
NewPin->SetConvert( 1 );
@ -434,7 +436,7 @@ static void CreateImagePins( LIB_PIN* Pin, int unit, int convert, bool asDeMorga
if( CreateConv == false )
continue;
NewPin = (LIB_PIN*) Pin->GenCopy();
NewPin = (LIB_PIN*) Pin->Clone();
NewPin->SetConvert( 2 );
if( Pin->GetUnit() != 0 )
@ -510,7 +512,7 @@ void LIB_EDIT_FRAME::RepeatPinItem( wxDC* DC, LIB_PIN* SourcePin )
if( m_component == NULL || SourcePin == NULL || SourcePin->Type() != LIB_PIN_T )
return;
Pin = (LIB_PIN*) SourcePin->GenCopy();
Pin = (LIB_PIN*) SourcePin->Clone();
Pin->m_Flags = IS_NEW;
Pin->SetPosition( Pin->GetPosition() + wxPoint( g_RepeatStep.x, -g_RepeatStep.y ) );
wxString nextName = Pin->GetName();
@ -573,7 +575,7 @@ void LIB_EDIT_FRAME::OnCheckComponent( wxCommandEvent& event )
int dup_error;
int offgrid_error;
LIB_PIN* Pin;
LIB_PIN_LIST PinList;
LIB_PINS PinList;
wxString msg;
wxString aux_msg;

View File

@ -85,11 +85,11 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_COMPONENT& libComponent, SCH_SHEET_PATH* sheet
m_Flags = IS_NEW | IS_MOVED;
// Import user defined fields from the library component:
LIB_FIELD_LIST libFields;
LIB_FIELDS libFields;
libComponent.GetFields( libFields );
for( LIB_FIELD_LIST::iterator it = libFields.begin(); it!=libFields.end(); ++it )
for( LIB_FIELDS::iterator it = libFields.begin(); it!=libFields.end(); ++it )
{
// Can no longer insert an empty name, since names are now keys. The
// field index is not used beyond the first MANDATORY_FIELDS
@ -1506,7 +1506,7 @@ bool SCH_COMPONENT::Matches( wxFindReplaceData& aSearchData, void* aAuxData,
if( Entry )
{
LIB_PIN_LIST pinList;
LIB_PINS pinList;
Entry->GetPins( pinList, m_unit, m_convert );
// Search for a match in pinList
@ -1611,7 +1611,7 @@ void SCH_COMPONENT::GetConnectionPoints( vector< wxPoint >& aPoints ) const
}
LIB_DRAW_ITEM* SCH_COMPONENT::GetDrawItem( const wxPoint& aPosition, KICAD_T aType )
LIB_ITEM* SCH_COMPONENT::GetDrawItem( const wxPoint& aPosition, KICAD_T aType )
{
LIB_COMPONENT* component = CMP_LIBRARY::FindLibraryComponent( m_ChipName );
@ -1663,7 +1663,7 @@ SEARCH_RESULT SCH_COMPONENT::Visit( INSPECTOR* aInspector, const void* aTestData
if( component != NULL )
{
LIB_PIN_LIST pins;
LIB_PINS pins;
component->GetPins( pins, m_unit, m_convert );

View File

@ -12,7 +12,7 @@
class SCH_SHEET_PATH;
class LIB_DRAW_ITEM;
class LIB_ITEM;
class LIB_PIN;
class LIB_COMPONENT;
@ -357,7 +357,7 @@ public:
* @param aType - Type of component library object to find or any if set to TYPE_NOT_INIT.
* @return A pointer to the component library object if found, otherwise NULL.
*/
LIB_DRAW_ITEM* GetDrawItem( const wxPoint& aPosition, KICAD_T aType = TYPE_NOT_INIT );
LIB_ITEM* GetDrawItem( const wxPoint& aPosition, KICAD_T aType = TYPE_NOT_INIT );
virtual wxString GetSelectMenuText() const;

View File

@ -631,7 +631,7 @@ wxString SCH_TEXT::GetSelectMenuText() const
tmp =( tmp.Length() > 15 ) ? tmp.Left( 12 ) + wxT( "..." ) : tmp;
wxString msg;
msg.Printf(_( "Graphic Text %s" ), GetChars(tmp));
msg.Printf( _( "Graphic Text %s" ), GetChars( tmp ) );
return msg;
}

View File

@ -129,8 +129,7 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME )
SCH_EDIT_FRAME::OnChangeComponentOrientation )
// Multple item selection context menu commands.
EVT_MENU_RANGE( ID_SCH_SELECT_ITEM_START, ID_SCH_SELECT_ITEM_END,
SCH_EDIT_FRAME::OnSelectItem )
EVT_MENU_RANGE( ID_SELECT_ITEM_START, ID_SELECT_ITEM_END, SCH_EDIT_FRAME::OnSelectItem )
/* Handle user interface update events. */
EVT_UPDATE_UI( wxID_CUT, SCH_EDIT_FRAME::OnUpdateBlockSelected )
@ -769,19 +768,19 @@ void SCH_EDIT_FRAME::SVG_Print( wxCommandEvent& event )
* @param aPrintMirrorMode = not used here (Set when printing in mirror mode)
* @param aData = a pointer on an auxiliary data (not used here)
*/
void SCH_EDIT_FRAME::PrintPage( wxDC* aDC, int aPrintMask,
bool aPrintMirrorMode, void* aData)
void SCH_EDIT_FRAME::PrintPage( wxDC* aDC, int aPrintMask, bool aPrintMirrorMode, void* aData )
{
GetScreen()->Draw( DrawPanel, aDC, GR_DEFAULT_DRAWMODE );
TraceWorkSheet( aDC, GetScreen(), g_DrawDefaultLineThickness );
}
void SCH_EDIT_FRAME::OnSelectItem( wxCommandEvent& aEvent )
{
int id = aEvent.GetId();
int index = id - ID_SCH_SELECT_ITEM_START;
int index = id - ID_SELECT_ITEM_START;
if( (id >= ID_SCH_SELECT_ITEM_START && id <= ID_SCH_SELECT_ITEM_END)
if( (id >= ID_SELECT_ITEM_START && id <= ID_SELECT_ITEM_END)
&& (index >= 0 && index < m_collectedItems.GetCount()) )
{
SCH_ITEM* item = m_collectedItems[index];

View File

@ -32,7 +32,7 @@ static void RedrawWhileMovingCursor( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wx
/*
* Show the dialog box for editing a graphical item properties
*/
void LIB_EDIT_FRAME::EditGraphicSymbol( wxDC* DC, LIB_DRAW_ITEM* DrawItem )
void LIB_EDIT_FRAME::EditGraphicSymbol( wxDC* DC, LIB_ITEM* DrawItem )
{
if( DrawItem == NULL )
return;
@ -102,7 +102,7 @@ void LIB_EDIT_FRAME::EditGraphicSymbol( wxDC* DC, LIB_DRAW_ITEM* DrawItem )
static void AbortSymbolTraceOn( EDA_DRAW_PANEL* Panel, wxDC* DC )
{
LIB_EDIT_FRAME* parent = (LIB_EDIT_FRAME*) Panel->GetParent();
LIB_DRAW_ITEM* item = parent->GetDrawItem();
LIB_ITEM* item = parent->GetDrawItem();
if( item == NULL )
return;
@ -122,7 +122,7 @@ static void AbortSymbolTraceOn( EDA_DRAW_PANEL* Panel, wxDC* DC )
}
LIB_DRAW_ITEM* LIB_EDIT_FRAME::CreateGraphicItem( LIB_COMPONENT* LibEntry, wxDC* DC )
LIB_ITEM* LIB_EDIT_FRAME::CreateGraphicItem( LIB_COMPONENT* LibEntry, wxDC* DC )
{
DrawPanel->SetMouseCapture( SymbolDisplayDraw, AbortSymbolTraceOn );
wxPoint drawPos = GetScreen()->GetCrossHairPosition( true );
@ -229,7 +229,7 @@ void LIB_EDIT_FRAME::GraphicItemBeginDraw( wxDC* DC )
static void RedrawWhileMovingCursor( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint& aPosition,
bool aErase )
{
LIB_DRAW_ITEM* item;
LIB_ITEM* item;
item = ( (LIB_EDIT_FRAME*) aPanel->GetParent() )->GetDrawItem();
@ -286,7 +286,7 @@ static void SymbolDisplayDraw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wxPoint&
bool aErase )
{
BASE_SCREEN* Screen = aPanel->GetScreen();
LIB_DRAW_ITEM* item = ( (LIB_EDIT_FRAME*) aPanel->GetParent() )->GetDrawItem();
LIB_ITEM* item = ( (LIB_EDIT_FRAME*) aPanel->GetParent() )->GetDrawItem();
if( item == NULL )
return;

View File

@ -86,9 +86,9 @@ void LIB_EDIT_FRAME::LoadOneSymbol( void )
}
Component = Lib->GetFirstEntry()->GetComponent();
LIB_DRAW_ITEM_LIST& drawList = Component->GetDrawItemList();
LIB_ITEMS& drawList = Component->GetDrawItemList();
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawList )
BOOST_FOREACH( LIB_ITEM& item, drawList )
{
if( item.Type() == LIB_FIELD_T )
continue;
@ -99,7 +99,7 @@ void LIB_EDIT_FRAME::LoadOneSymbol( void )
item.m_Flags = IS_NEW;
item.m_Selected = IS_SELECTED;
LIB_DRAW_ITEM* newItem = item.GenCopy();
LIB_ITEM* newItem = (LIB_ITEM*) item.Clone();
newItem->SetParent( m_component );
m_component->AddDrawItem( newItem );
}
@ -196,9 +196,9 @@ void LIB_EDIT_FRAME::SaveOneSymbol()
|| !file.Write( wxT( "DRAW\n" ) ) )
return;
LIB_DRAW_ITEM_LIST& drawList = m_component->GetDrawItemList();
LIB_ITEMS& drawList = m_component->GetDrawItemList();
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawList )
BOOST_FOREACH( LIB_ITEM& item, drawList )
{
if( item.Type() == LIB_FIELD_T )
continue;

View File

@ -576,6 +576,24 @@ public:
*/
virtual const char** GetMenuImage() const { return (const char**) right_xpm; }
/**
* Test if another item is less than this object.
*
* @param aItem - Item to compare against.
* @return - True if \a aItem is less than the item.
*/
bool operator<( const EDA_ITEM& aItem ) const;
/**
* Function Sort
* is a helper function to be used by the C++ STL sort algorithm for sorting a STL
* container of EDA_ITEM pointers.
*
* @param aLeft The left hand item to compare.
* @param aRight The right hand item to compare.
* @return True if \a aLeft is less than \a aRight.
*/
static bool Sort( const EDA_ITEM* aLeft, const EDA_ITEM* aRight ) { return *aLeft < *aRight; }
#if defined(DEBUG)