Commit 1fec58e8 authored by charras's avatar charras

eeschema: fixed bugs in netlist generation and drag components

parent ee918d7d
...@@ -36,8 +36,9 @@ void DuplicateItemsInList( SCH_SCREEN* screen, ...@@ -36,8 +36,9 @@ void DuplicateItemsInList( SCH_SCREEN* screen,
/* Fonctions Locales */ /* Fonctions Locales */
static void CollectStructsToDrag( SCH_SCREEN* screen ); static void CollectStructsToDrag( SCH_SCREEN* screen );
static void AddPickedItem( SCH_SCREEN* screen, wxPoint aPosition ); static void AddPickedItem( SCH_SCREEN* screen, wxPoint aPosition );
static LIB_DRAW_ITEM* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem, static LIB_PIN* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem,
wxPoint& aPosition ); wxPoint& aPosition,
bool aSearchFirst );
static void DrawMovingBlockOutlines( WinEDA_DrawPanel* panel, static void DrawMovingBlockOutlines( WinEDA_DrawPanel* panel,
wxDC* DC, wxDC* DC,
bool erase ); bool erase );
...@@ -650,10 +651,10 @@ static void CollectStructsToDrag( SCH_SCREEN* screen ) ...@@ -650,10 +651,10 @@ static void CollectStructsToDrag( SCH_SCREEN* screen )
if( Struct->Type() == TYPE_SCH_COMPONENT ) if( Struct->Type() == TYPE_SCH_COMPONENT )
{ {
// Add all pins of the selected component to list // Add all pins of the selected component to list
LIB_DRAW_ITEM* DrawItem; LIB_PIN* pin;
wxPoint pos; wxPoint pos;
DrawItem = GetNextPinPosition( (SCH_COMPONENT*) Struct, pos ); pin = GetNextPinPosition( (SCH_COMPONENT*) Struct, pos, true );
while( DrawItem ) while( pin )
{ {
if( ! screen->m_BlockLocate.Inside(pos) ) if( ! screen->m_BlockLocate.Inside(pos) )
{ {
...@@ -663,7 +664,7 @@ static void CollectStructsToDrag( SCH_SCREEN* screen ) ...@@ -663,7 +664,7 @@ static void CollectStructsToDrag( SCH_SCREEN* screen )
AddPickedItem( screen, pos ); AddPickedItem( screen, pos );
} }
DrawItem = GetNextPinPosition( NULL, pos ); pin = GetNextPinPosition( (SCH_COMPONENT*) Struct, pos, false );
} }
} }
...@@ -845,31 +846,26 @@ static void AddPickedItem( SCH_SCREEN* screen, wxPoint position ) ...@@ -845,31 +846,26 @@ static void AddPickedItem( SCH_SCREEN* screen, wxPoint position )
/*********************************************************************************/ /*********************************************************************************/
static LIB_DRAW_ITEM* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem, static LIB_PIN* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem,
wxPoint& aPosition ) wxPoint& aPosition,
bool aSearchFirst)
/*********************************************************************************/ /*********************************************************************************/
/** GetNextPinPosition() /** GetNextPinPosition()
* calculate position of the "next" pin of the aDrawLibItem component * calculate position of the "next" pin of the aDrawLibItem component
* if aDrawLibItem is non null : search for the first pin * @param aDrawLibItem = component to test.
* if aDrawLibItem == NULL, search the next pin
* returns its position
* @param aDrawLibItem = component test. search for the first pin
* if NULL, serach for the next pin for each call
* @param aPosition = the calculated pin position, according to the component orientation and position * @param aPosition = the calculated pin position, according to the component orientation and position
* @param aSearchFirst = if true, search for the first pin
* @return a pointer to the pin * @return a pointer to the pin
*/ */
{ {
static LIB_COMPONENT* Entry; static LIB_COMPONENT* Entry;
static LIB_PIN* NextPin;
static int Multi, convert, TransMat[2][2]; static int Multi, convert, TransMat[2][2];
int orient;
LIB_PIN* Pin;
static wxPoint CmpPosition; static wxPoint CmpPosition;
static LIB_PIN* Pin;
if( aDrawLibItem ) if( aSearchFirst )
{ {
NextPin = NULL;
Entry = CMP_LIBRARY::FindLibraryComponent( aDrawLibItem->m_ChipName ); Entry = CMP_LIBRARY::FindLibraryComponent( aDrawLibItem->m_ChipName );
if( Entry == NULL ) if( Entry == NULL )
...@@ -882,9 +878,9 @@ static LIB_DRAW_ITEM* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem, ...@@ -882,9 +878,9 @@ static LIB_DRAW_ITEM* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem,
memcpy( TransMat, aDrawLibItem->m_Transform, sizeof(TransMat) ); memcpy( TransMat, aDrawLibItem->m_Transform, sizeof(TransMat) );
} }
else else
Pin = NextPin; Pin = Entry->GetNextPin( Pin );
for( ; Pin != NULL; NextPin = Entry->GetNextPin( Pin ) ) for( ; Pin != NULL; Pin = Entry->GetNextPin( Pin ) )
{ {
wxASSERT( Pin->Type() == COMPONENT_PIN_DRAW_TYPE ); wxASSERT( Pin->Type() == COMPONENT_PIN_DRAW_TYPE );
...@@ -894,14 +890,9 @@ static LIB_DRAW_ITEM* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem, ...@@ -894,14 +890,9 @@ static LIB_DRAW_ITEM* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem,
if( convert && Pin->m_Convert && ( Pin->m_Convert != convert ) ) if( convert && Pin->m_Convert && ( Pin->m_Convert != convert ) )
continue; continue;
/* Calculate the pin orient (according to the component orientation) */
orient = Pin->ReturnPinDrawOrient( TransMat );
/* Calculate the pin position (according to the component orientation) */ /* Calculate the pin position (according to the component orientation) */
aPosition = TransformCoordinate( TransMat, Pin->m_Pos ) + CmpPosition; aPosition = TransformCoordinate( TransMat, Pin->m_Pos ) + CmpPosition;
return Pin; return Pin;
} }
NextPin = NULL;
return NULL; return NULL;
} }
...@@ -397,19 +397,34 @@ void LIB_COMPONENT::AddDrawItem( LIB_DRAW_ITEM* item ) ...@@ -397,19 +397,34 @@ void LIB_COMPONENT::AddDrawItem( LIB_DRAW_ITEM* item )
LIB_DRAW_ITEM* LIB_COMPONENT::GetNextDrawItem( LIB_DRAW_ITEM* item, LIB_DRAW_ITEM* LIB_COMPONENT::GetNextDrawItem( LIB_DRAW_ITEM* item,
KICAD_T type ) KICAD_T type )
{ {
/* Return the next draw object pointer.
* If item is NULL return the first item of type in the list.
*/
if( m_Drawings.empty() ) if( m_Drawings.empty() )
return NULL; return NULL;
if( item == NULL && type == TYPE_NOT_INIT ) if( item == NULL && type == TYPE_NOT_INIT ) // type is unspecified
return &m_Drawings[0]; return &m_Drawings[0];
for( size_t i = 0; i < m_Drawings.size() - 1; i++ ) // Search for last item
size_t idx = 0;
if( item )
{ {
if( item != &m_Drawings[i] ) for( ; idx < m_Drawings.size(); idx++ )
continue; {
if( item == &m_Drawings[idx] )
{
idx++; // Prepare the next item search
break;
}
}
}
if( type == TYPE_NOT_INIT || m_Drawings[ i + 1 ].Type() == type ) // Search the next item
return &m_Drawings[ i + 1 ]; for( ; idx < m_Drawings.size(); idx++ )
{
if( type == TYPE_NOT_INIT || m_Drawings[ idx ].Type() == type )
return &m_Drawings[ idx ];
} }
return NULL; return NULL;
......
...@@ -233,11 +233,13 @@ public: ...@@ -233,11 +233,13 @@ public:
WinEDA_DrawPanel* panel = NULL, WinEDA_DrawPanel* panel = NULL,
wxDC* dc = NULL ); wxDC* dc = NULL );
/** /** GetNextDrawItem()
* Return the next draw object pointer. * Return the next draw object pointer.
* *
* @param item - Pointer to the current draw item. Setting item NULL * @param item - Pointer to the current draw item. Setting item NULL
* with return the first item of type in the list. * with return the first item of type in the list.
* @param type - type of searched item (filter).
* if TYPE_NOT_INIT search for all items types
* *
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment