diff --git a/eeschema/block.cpp b/eeschema/block.cpp index ea0b38c899..9a3875211a 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -932,7 +932,8 @@ void DeleteStruct( WinEDA_DrawPanel* panel, wxDC* DC, EDA_BaseStruct* DrawStruct if( DrawStruct->Type() == DRAW_SHEETLABEL_STRUCT_TYPE ) - { /* Cette stucture est rattachee a une feuille, et n'est pas + { + /* Cette stucture est rattachee a une feuille, et n'est pas * accessible par la liste globale directement */ frame->SaveCopyInUndoList( ( (DrawSheetLabelStruct*) DrawStruct )->m_Parent, IS_CHANGED ); frame->DeleteSheetLabel( DC, (DrawSheetLabelStruct*) DrawStruct ); @@ -961,7 +962,14 @@ void DeleteStruct( WinEDA_DrawPanel* panel, wxDC* DC, EDA_BaseStruct* DrawStruct { screen->RemoveFromDrawList( DrawStruct ); - RedrawOneStruct( panel, DC, DrawStruct, g_XorMode ); + if( DrawStruct->Type() == DRAW_SEGMENT_STRUCT_TYPE ) + { + D( printf("PostDirtyRect()\n"); ) + panel->PostDirtyRect( ((EDA_DrawLineStruct*)DrawStruct)->GetBoundingBox() ); + } + else + RedrawOneStruct( panel, DC, DrawStruct, g_XorMode ); + /* Unlink the structure */ DrawStruct->Pnext = DrawStruct->Pback = NULL; // Only one struct -> no link if( DrawStruct->Type() == DRAW_SHEET_STRUCT_TYPE ) diff --git a/eeschema/cmpclass.cpp b/eeschema/cmpclass.cpp index f7678eb997..5dfc0cc4e6 100644 --- a/eeschema/cmpclass.cpp +++ b/eeschema/cmpclass.cpp @@ -147,14 +147,14 @@ wxString DrawMarkerStruct::GetComment() /** * Function Show * is used to output the object tree, currently for debugging only. - * @param nestLevel An aid to prettier tree indenting, and is the level + * @param nestLevel An aid to prettier tree indenting, and is the level * of nesting of this object within the overall tree. * @param os The ostream& to output to. */ void DrawMarkerStruct::Show( int nestLevel, std::ostream& os ) { // for now, make it look like XML: - NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << m_Pos + NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << m_Pos << "/>\n"; } #endif @@ -222,17 +222,17 @@ bool EDA_DrawLineStruct::IsOneEndPointAt( const wxPoint& pos ) /** * Function Show * is used to output the object tree, currently for debugging only. - * @param nestLevel An aid to prettier tree indenting, and is the level + * @param nestLevel An aid to prettier tree indenting, and is the level * of nesting of this object within the overall tree. * @param os The ostream& to output to. */ void EDA_DrawLineStruct::Show( int nestLevel, std::ostream& os ) { - NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << + NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << " layer=\"" << m_Layer << '"' << " width=\"" << m_Width << '"' << - " startIsDangling=\"" << m_StartIsDangling << '"' << - " endIsDangling=\"" << m_EndIsDangling << '"' << ">" << + " startIsDangling=\"" << m_StartIsDangling << '"' << + " endIsDangling=\"" << m_EndIsDangling << '"' << ">" << " <start" << m_Start << "/>" << " <end" << m_End << "/>" << "</" << GetClass().Lower().mb_str() << ">\n"; @@ -240,6 +240,25 @@ void EDA_DrawLineStruct::Show( int nestLevel, std::ostream& os ) #endif + +EDA_Rect EDA_DrawLineStruct::GetBoundingBox() const +{ + int width = 25; + + int xmin = MIN( m_Start.x, m_End.x ) - width; + int ymin = MIN( m_Start.y, m_End.y ) - width; + + int xmax = MAX( m_Start.x, m_End.x ) + width; + int ymax = MAX( m_Start.y, m_End.y ) + width; + + // return a rectangle which is [pos,dim) in nature. therefore the +1 + EDA_Rect ret( wxPoint( xmin, ymin ), wxSize( xmax-xmin+1, ymax-ymin+1 ) ); + + return ret; +} + + + /****************************/ /* Class DrawPolylineStruct */ /****************************/ diff --git a/eeschema/delete.cpp b/eeschema/delete.cpp index cd49c8e602..4d2e76a1bc 100644 --- a/eeschema/delete.cpp +++ b/eeschema/delete.cpp @@ -1,6 +1,6 @@ - /************************************/ - /* Delete.cpp: routines d'effacement */ - /************************************/ +/************************************/ +/* Delete.cpp: routines d'effacement */ +/************************************/ #include "fctsys.h" #include "gr_basic.h" @@ -17,485 +17,561 @@ /********************************************************************************/ -static int CountConnectedItems(WinEDA_SchematicFrame * frame, - EDA_BaseStruct * ListStruct, wxPoint pos, bool TstJunction) +static int CountConnectedItems( WinEDA_SchematicFrame* frame, + EDA_BaseStruct* ListStruct, wxPoint pos, bool TstJunction ) /********************************************************************************/ + /* Count number of items connected to point pos : - pins, end wire or bus, and junctions if TstJunction == TRUE - Return this count - - Used by WinEDA_SchematicFrame::DeleteConnection() -*/ + * pins, end wire or bus, and junctions if TstJunction == TRUE + * Return this count + * + * Used by WinEDA_SchematicFrame::DeleteConnection() + */ { -EDA_BaseStruct * Struct; -int count = 0; + EDA_BaseStruct* Struct; + int count = 0; - if ( frame->LocatePinEnd(ListStruct, pos) ) count++; + if( frame->LocatePinEnd( ListStruct, pos ) ) + count++; - for ( Struct = ListStruct; Struct != NULL; Struct = Struct->Pnext) - { - if ( Struct->m_Flags & STRUCT_DELETED ) continue; - if ( Struct->m_Flags & SKIP_STRUCT ) continue; + for( Struct = ListStruct; Struct != NULL; Struct = Struct->Pnext ) + { + if( Struct->m_Flags & STRUCT_DELETED ) + continue; + if( Struct->m_Flags & SKIP_STRUCT ) + continue; - - if ( TstJunction && (Struct->Type() == DRAW_JUNCTION_STRUCT_TYPE) ) - { - #define JUNCTION ((DrawJunctionStruct*)Struct) - if ( (JUNCTION->m_Pos.x == pos.x) && (JUNCTION->m_Pos.y == pos.y) ) - count++; - #undef JUNCTION - } - if ( Struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue; - #define SEGM ((EDA_DrawLineStruct*)Struct) - if ( SEGM->IsOneEndPointAt(pos) ) count++; - #undef SEGM - } + if( TstJunction && (Struct->Type() == DRAW_JUNCTION_STRUCT_TYPE) ) + { + #define JUNCTION ( (DrawJunctionStruct*) Struct ) + if( (JUNCTION->m_Pos.x == pos.x) && (JUNCTION->m_Pos.y == pos.y) ) + count++; + #undef JUNCTION + } - return count; + if( Struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) + continue; + + #define SEGM ( (EDA_DrawLineStruct*) Struct ) + if( SEGM->IsOneEndPointAt( pos ) ) + count++; + #undef SEGM + } + + return count; } + /************************************************************************************/ -static bool MarkConnected(WinEDA_SchematicFrame * frame, EDA_BaseStruct * ListStruct, - EDA_DrawLineStruct* segment) +static bool MarkConnected( WinEDA_SchematicFrame* frame, EDA_BaseStruct* ListStruct, + EDA_DrawLineStruct* segment ) /************************************************************************************/ + /* Mark to "CANDIDATE" all wires or junction connected to "segment" in list "ListStruct" - Search wire stop at an any pin - - Used by WinEDA_SchematicFrame::DeleteConnection() -*/ + * Search wire stop at an any pin + * + * Used by WinEDA_SchematicFrame::DeleteConnection() + */ { -EDA_BaseStruct * Struct; + EDA_BaseStruct* Struct; - for ( Struct = ListStruct; Struct != NULL; Struct = Struct->Pnext) - { - if ( Struct->m_Flags ) continue; - if ( Struct->Type() == DRAW_JUNCTION_STRUCT_TYPE ) - { - #define JUNCTION ((DrawJunctionStruct*)Struct) - if ( segment->IsOneEndPointAt(JUNCTION->m_Pos) ) Struct->m_Flags |= CANDIDATE; - continue; - #undef JUNCTION - } + for( Struct = ListStruct; Struct != NULL; Struct = Struct->Pnext ) + { + if( Struct->m_Flags ) + continue; + if( Struct->Type() == DRAW_JUNCTION_STRUCT_TYPE ) + { + #define JUNCTION ( (DrawJunctionStruct*) Struct ) + if( segment->IsOneEndPointAt( JUNCTION->m_Pos ) ) + Struct->m_Flags |= CANDIDATE; + continue; + #undef JUNCTION + } - if ( Struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue; + if( Struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) + continue; - #define SEGM ((EDA_DrawLineStruct*)Struct) - if ( segment->IsOneEndPointAt(SEGM->m_Start) ) - { - if ( ! frame->LocatePinEnd(ListStruct,SEGM->m_Start) ) - { - Struct->m_Flags |= CANDIDATE; - MarkConnected(frame, ListStruct, SEGM); - } - } - if ( segment->IsOneEndPointAt(SEGM->m_End) ) - { - if ( ! frame->LocatePinEnd(ListStruct,SEGM->m_End) ) - { - Struct->m_Flags |= CANDIDATE; - MarkConnected(frame, ListStruct, SEGM); - } - } - #undef SEGM - } + #define SEGM ( (EDA_DrawLineStruct*) Struct ) + if( segment->IsOneEndPointAt( SEGM->m_Start ) ) + { + if( !frame->LocatePinEnd( ListStruct, SEGM->m_Start ) ) + { + Struct->m_Flags |= CANDIDATE; + MarkConnected( frame, ListStruct, SEGM ); + } + } + if( segment->IsOneEndPointAt( SEGM->m_End ) ) + { + if( !frame->LocatePinEnd( ListStruct, SEGM->m_End ) ) + { + Struct->m_Flags |= CANDIDATE; + MarkConnected( frame, ListStruct, SEGM ); + } + } + #undef SEGM + } - return TRUE; + return TRUE; } + /********************************************************************************/ -void WinEDA_SchematicFrame::DeleteConnection(wxDC * DC, bool DeleteFullConnection) +void WinEDA_SchematicFrame::DeleteConnection( wxDC* DC, bool DeleteFullConnection ) /********************************************************************************/ + /* Delete a connection, i.e wires or bus connected - stop on a node (more than 2 wires (bus) connected) -*/ + * stop on a node (more than 2 wires (bus) connected) + */ { -wxPoint refpos = GetScreen()->m_Curseur; -EDA_BaseStruct * DelStruct ; -DrawPickedStruct * PickedItem, *PickedList = NULL; + wxPoint refpos = GetScreen()->m_Curseur; + EDA_BaseStruct* DelStruct; + DrawPickedStruct* PickedItem, * PickedList = NULL; - /* Clear .m_Flags member for all items */ - for(DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct=DelStruct->Pnext) - DelStruct->m_Flags = 0; + /* Clear .m_Flags member for all items */ + for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext ) + DelStruct->m_Flags = 0; - BreakSegmentOnJunction( (SCH_SCREEN*)GetScreen() ); - DelStruct = GetScreen()->EEDrawList; - - /* Locate all the wires, bus or junction under the mouse cursor, and put them in a list - of items to delete - */ - SCH_SCREEN* screen = (SCH_SCREEN*)GetScreen(); - EDA_BaseStruct* savedEEDrawList = screen->EEDrawList; - while ( DelStruct && - (DelStruct = PickStruct(screen->m_Curseur, - screen, JUNCTIONITEM|WIREITEM|BUSITEM)) != NULL ) - { - - DelStruct->m_Flags = SELECTEDNODE|STRUCT_DELETED; - /* Put this structure in the picked list: */ - PickedItem = new DrawPickedStruct(DelStruct); - PickedItem->Pnext = PickedList; - PickedList = PickedItem; - DelStruct=DelStruct->Pnext; - screen->EEDrawList = DelStruct; - } - GetScreen()->EEDrawList = savedEEDrawList; - /* Mark all wires, junctions, .. connected to one of the item to delete - */ - if ( DeleteFullConnection ) - { - for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext) - { - if ( ! (DelStruct->m_Flags & SELECTEDNODE) ) continue; - #define SEGM ((EDA_DrawLineStruct*)DelStruct) - if ( DelStruct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue; - MarkConnected(this, GetScreen()->EEDrawList, SEGM); - #undef SEGM - } + BreakSegmentOnJunction( (SCH_SCREEN*) GetScreen() ); + DelStruct = GetScreen()->EEDrawList; - // Search all removable wires (i.e wire with one new dangling end ) - for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext) - { - bool noconnect = FALSE; + /* Locate all the wires, bus or junction under the mouse cursor, and put them in a list + * of items to delete + */ + SCH_SCREEN* screen = (SCH_SCREEN*) GetScreen(); + EDA_BaseStruct* savedEEDrawList = screen->EEDrawList; + while( DelStruct + && ( DelStruct = PickStruct( screen->m_Curseur, + screen, JUNCTIONITEM | WIREITEM | BUSITEM ) ) != NULL ) + { + DelStruct->m_Flags = SELECTEDNODE | STRUCT_DELETED; - if ( DelStruct->m_Flags & STRUCT_DELETED ) continue; // Already seen - if ( ! (DelStruct->m_Flags & CANDIDATE) ) continue; // Already seen - if ( DelStruct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue; - DelStruct->m_Flags |= SKIP_STRUCT; - #define SEGM ((EDA_DrawLineStruct*)DelStruct) - /* Test the SEGM->m_Start point: if this point was connected to an STRUCT_DELETED wire, - and now is not connected, the wire can be deleted */ - EDA_BaseStruct * removed_struct; - for ( removed_struct = GetScreen()->EEDrawList; removed_struct != NULL; removed_struct = removed_struct->Pnext) - { - if( (removed_struct->m_Flags & STRUCT_DELETED) == 0 ) continue; - if ( removed_struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue; - #define WIRE ((EDA_DrawLineStruct*)removed_struct) - if ( WIRE->IsOneEndPointAt(SEGM->m_Start) ) break; - } - - if ( WIRE && ! CountConnectedItems(this, GetScreen()->EEDrawList, SEGM->m_Start, TRUE) ) - noconnect = TRUE; - /* Test the SEGM->m_End point: if this point was connected to an STRUCT_DELETED wire, - and now is not connected, the wire can be deleted */ - for ( removed_struct = GetScreen()->EEDrawList; removed_struct != NULL; removed_struct = removed_struct->Pnext) - { - if( (removed_struct->m_Flags & STRUCT_DELETED) == 0 ) continue; - if ( removed_struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) continue; - if ( WIRE->IsOneEndPointAt(SEGM->m_End) ) break; - } - if ( removed_struct && ! CountConnectedItems(this, GetScreen()->EEDrawList, SEGM->m_End, TRUE) ) - noconnect = TRUE; - DelStruct->m_Flags &= ~SKIP_STRUCT; + /* Put this structure in the picked list: */ + PickedItem = new DrawPickedStruct( DelStruct ); - if ( noconnect ) - { - DelStruct->m_Flags |= STRUCT_DELETED; - /* Put this structure in the picked list: */ - PickedItem = new DrawPickedStruct(DelStruct); - PickedItem->Pnext = PickedList; - PickedList = PickedItem; - DelStruct = GetScreen()->EEDrawList; - } - #undef SEGM - } + PickedItem->Pnext = PickedList; + PickedList = PickedItem; + DelStruct = DelStruct->Pnext; + screen->EEDrawList = DelStruct; + } - // Delete redundant junctions (junctions which connect < 3 end wires and no pin are removed) - for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext) - { - int count; - if ( DelStruct->m_Flags & STRUCT_DELETED ) continue; - if ( ! (DelStruct->m_Flags & CANDIDATE) ) continue; - if ( DelStruct->Type() == DRAW_JUNCTION_STRUCT_TYPE ) - { - #define JUNCTION ((DrawJunctionStruct*)DelStruct) - count = CountConnectedItems(this, GetScreen()->EEDrawList, JUNCTION->m_Pos, FALSE); - if ( count <= 2 ) - { - DelStruct->m_Flags |= STRUCT_DELETED; - /* Put this structure in the picked list: */ - PickedItem = new DrawPickedStruct(DelStruct); - PickedItem->Pnext = PickedList; - PickedList = PickedItem; - } - #undef JUNCTION - } - } + GetScreen()->EEDrawList = savedEEDrawList; - // Delete labels attached to wires - wxPoint pos = GetScreen()->m_Curseur; - for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext) - { - if ( DelStruct->m_Flags & STRUCT_DELETED ) continue; - if ( DelStruct->Type() != DRAW_LABEL_STRUCT_TYPE ) continue; - GetScreen()->m_Curseur = ((DrawTextStruct*)DelStruct)->m_Pos; - EDA_BaseStruct * TstStruct = - PickStruct(GetScreen()->m_Curseur, GetScreen(),WIREITEM|BUSITEM); - if ( TstStruct && TstStruct->m_Flags & STRUCT_DELETED ) - { - DelStruct->m_Flags |= STRUCT_DELETED; - /* Put this structure in the picked list: */ - PickedItem = new DrawPickedStruct(DelStruct); - PickedItem->Pnext = PickedList; - PickedList = PickedItem; - } - } - GetScreen()->m_Curseur = pos; - } + /* Mark all wires, junctions, .. connected to one of the item to delete + */ + if( DeleteFullConnection ) + { + for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext ) + { + if( !(DelStruct->m_Flags & SELECTEDNODE) ) + continue; - for ( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext) - DelStruct->m_Flags = 0; + #define SEGM ( (EDA_DrawLineStruct*) DelStruct ) + if( DelStruct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) + continue; - if ( PickedList ) - { - DeleteStruct(DrawPanel, DC, PickedList); - GetScreen()->SetModify(); - } + MarkConnected( this, GetScreen()->EEDrawList, SEGM ); + #undef SEGM + } + // Search all removable wires (i.e wire with one new dangling end ) + for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext ) + { + bool noconnect = FALSE; + + if( DelStruct->m_Flags & STRUCT_DELETED ) + continue; // Already seen + + if( !(DelStruct->m_Flags & CANDIDATE) ) + continue; // Already seen + + if( DelStruct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) + continue; + + DelStruct->m_Flags |= SKIP_STRUCT; + #define SEGM ( (EDA_DrawLineStruct*) DelStruct ) + + /* Test the SEGM->m_Start point: if this point was connected to an STRUCT_DELETED wire, + * and now is not connected, the wire can be deleted */ + EDA_BaseStruct* removed_struct; + for( removed_struct = GetScreen()->EEDrawList; + removed_struct != NULL; + removed_struct = removed_struct->Pnext ) + { + if( (removed_struct->m_Flags & STRUCT_DELETED) == 0 ) + continue; + + if( removed_struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) + continue; + + #define WIRE ( (EDA_DrawLineStruct*) removed_struct ) + if( WIRE->IsOneEndPointAt( SEGM->m_Start ) ) + break; + } + + if( WIRE && !CountConnectedItems( this, GetScreen()->EEDrawList, SEGM->m_Start, TRUE ) ) + noconnect = TRUE; + + /* Test the SEGM->m_End point: if this point was connected to an STRUCT_DELETED wire, + * and now is not connected, the wire can be deleted */ + for( removed_struct = GetScreen()->EEDrawList; + removed_struct != NULL; + removed_struct = removed_struct->Pnext ) + { + if( (removed_struct->m_Flags & STRUCT_DELETED) == 0 ) + continue; + if( removed_struct->Type() != DRAW_SEGMENT_STRUCT_TYPE ) + continue; + if( WIRE->IsOneEndPointAt( SEGM->m_End ) ) + break; + } + + if( removed_struct && + !CountConnectedItems( this, GetScreen()->EEDrawList, SEGM->m_End, TRUE ) ) + noconnect = TRUE; + + DelStruct->m_Flags &= ~SKIP_STRUCT; + + if( noconnect ) + { + DelStruct->m_Flags |= STRUCT_DELETED; + /* Put this structure in the picked list: */ + PickedItem = new DrawPickedStruct( DelStruct ); + + PickedItem->Pnext = PickedList; + PickedList = PickedItem; + DelStruct = GetScreen()->EEDrawList; + } + #undef SEGM + } + + // Delete redundant junctions (junctions which connect < 3 end wires and no pin are removed) + for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext ) + { + int count; + if( DelStruct->m_Flags & STRUCT_DELETED ) + continue; + + if( !(DelStruct->m_Flags & CANDIDATE) ) + continue; + + if( DelStruct->Type() == DRAW_JUNCTION_STRUCT_TYPE ) + { + #define JUNCTION ( (DrawJunctionStruct*) DelStruct ) + count = CountConnectedItems( this, GetScreen()->EEDrawList, JUNCTION->m_Pos, FALSE ); + if( count <= 2 ) + { + DelStruct->m_Flags |= STRUCT_DELETED; + + /* Put this structure in the picked list: */ + PickedItem = new DrawPickedStruct( DelStruct ); + + PickedItem->Pnext = PickedList; + PickedList = PickedItem; + } + #undef JUNCTION + } + } + + // Delete labels attached to wires + wxPoint pos = GetScreen()->m_Curseur; + for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext ) + { + if( DelStruct->m_Flags & STRUCT_DELETED ) + continue; + + if( DelStruct->Type() != DRAW_LABEL_STRUCT_TYPE ) + continue; + + GetScreen()->m_Curseur = ( (DrawTextStruct*) DelStruct )->m_Pos; + EDA_BaseStruct* TstStruct = + PickStruct( GetScreen()->m_Curseur, GetScreen(), WIREITEM | BUSITEM ); + + if( TstStruct && TstStruct->m_Flags & STRUCT_DELETED ) + { + DelStruct->m_Flags |= STRUCT_DELETED; + + /* Put this structure in the picked list: */ + PickedItem = new DrawPickedStruct( DelStruct ); + + PickedItem->Pnext = PickedList; + PickedList = PickedItem; + } + } + + GetScreen()->m_Curseur = pos; + } + + for( DelStruct = GetScreen()->EEDrawList; DelStruct != NULL; DelStruct = DelStruct->Pnext ) + DelStruct->m_Flags = 0; + + if( PickedList ) + { + DeleteStruct( DrawPanel, DC, PickedList ); + GetScreen()->SetModify(); + } } /*****************************************************************/ -bool LocateAndDeleteItem(WinEDA_SchematicFrame * frame, wxDC * DC) +bool LocateAndDeleteItem( WinEDA_SchematicFrame* frame, wxDC* DC ) /*****************************************************************/ + /* Locate and delete the item found under the mouse cousor - If more than one item found: the priority order is: - 1 : MARKER - 2 : JUNCTION - 2 : NOCONNECT - 3 : WIRE ou BUS - 4 : DRAWITEM - 5 : TEXT - 6 : COMPOSANT - 7 : SHEET - - return TRUE if an item was deleted -*/ + * If more than one item found: the priority order is: + * 1 : MARKER + * 2 : JUNCTION + * 2 : NOCONNECT + * 3 : WIRE ou BUS + * 4 : DRAWITEM + * 5 : TEXT + * 6 : COMPOSANT + * 7 : SHEET + * + * return TRUE if an item was deleted + */ { -EDA_BaseStruct * DelStruct; -SCH_SCREEN * screen = (SCH_SCREEN*)(frame->GetScreen()); -bool item_deleted = FALSE; - - DelStruct = PickStruct(screen->m_Curseur, - screen, MARKERITEM); - if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur, - screen, JUNCTIONITEM); - if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur, - screen, NOCONNECTITEM); - if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur, - screen, RACCORDITEM); - if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur, - screen, WIREITEM|BUSITEM); - if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur, - screen, DRAWITEM); - if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur, - screen, TEXTITEM|LABELITEM); - if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur, - screen, LIBITEM); - if( DelStruct == NULL ) DelStruct = PickStruct(screen->m_Curseur, - screen, SHEETITEM); + EDA_BaseStruct* DelStruct; + SCH_SCREEN* screen = (SCH_SCREEN*) ( frame->GetScreen() ); + bool item_deleted = FALSE; - if (DelStruct) - { - g_ItemToRepeat = NULL; - DeleteStruct(frame->DrawPanel, DC, DelStruct); - frame->TestDanglingEnds(frame->GetScreen()->EEDrawList, DC); - frame->GetScreen()->SetModify(); - item_deleted = TRUE; - } - - return item_deleted; + DelStruct = PickStruct( screen->m_Curseur, screen, MARKERITEM ); + if( DelStruct == NULL ) + DelStruct = PickStruct( screen->m_Curseur, screen, JUNCTIONITEM ); + if( DelStruct == NULL ) + DelStruct = PickStruct( screen->m_Curseur, screen, NOCONNECTITEM ); + if( DelStruct == NULL ) + DelStruct = PickStruct( screen->m_Curseur, screen, RACCORDITEM ); + if( DelStruct == NULL ) + DelStruct = PickStruct( screen->m_Curseur, screen, WIREITEM | BUSITEM ); + if( DelStruct == NULL ) + DelStruct = PickStruct( screen->m_Curseur, screen, DRAWITEM ); + if( DelStruct == NULL ) + DelStruct = PickStruct( screen->m_Curseur, screen, TEXTITEM | LABELITEM ); + if( DelStruct == NULL ) + DelStruct = PickStruct( screen->m_Curseur, screen, LIBITEM ); + if( DelStruct == NULL ) + DelStruct = PickStruct( screen->m_Curseur, screen, SHEETITEM ); + + if( DelStruct ) + { + g_ItemToRepeat = NULL; + DeleteStruct( frame->DrawPanel, DC, DelStruct ); + frame->TestDanglingEnds( frame->GetScreen()->EEDrawList, DC ); + frame->GetScreen()->SetModify(); + item_deleted = TRUE; + } + + return item_deleted; } - - /***************************************************************/ -void EraseStruct(EDA_BaseStruct *DrawStruct, SCH_SCREEN * Screen) +void EraseStruct( EDA_BaseStruct* DrawStruct, SCH_SCREEN* Screen ) /***************************************************************/ + /* Suppression definitive d'une structure dans une liste chainee - d'elements de dessin - DrawStruct = pointeur sur la structure - Screen = pointeur sur l'ecran d'appartenance - Le chainage de la liste est modifie. - - Remarque: - pour les structures DRAW_SHEET_STRUCT_TYPE, l'ecran et les structures - correspondantes ne sont pas touches. - Ils doivent etre traites separement -*/ + * d'elements de dessin + * DrawStruct = pointeur sur la structure + * Screen = pointeur sur l'ecran d'appartenance + * Le chainage de la liste est modifie. + * + * Remarque: + * pour les structures DRAW_SHEET_STRUCT_TYPE, l'ecran et les structures + * correspondantes ne sont pas touches. + * Ils doivent etre traites separement + */ { -EDA_BaseStruct *DrawList; -DrawPickedStruct *PickedList = NULL; -DrawSheetLabelStruct* SheetLabel, *NextLabel; + EDA_BaseStruct* DrawList; + DrawPickedStruct* PickedList = NULL; + DrawSheetLabelStruct* SheetLabel, * NextLabel; - if( DrawStruct == NULL ) return; - if( Screen == NULL ) return; + if( DrawStruct == NULL ) + return; - Screen->SetModify(); + if( Screen == NULL ) + return; - if (DrawStruct->Type() == DRAW_SHEETLABEL_STRUCT_TYPE) - { /* Cette stucture est rattachee a une feuille, et n'est pas - accessible par la liste globale directement */ - //this structure has a sheet attached, which we must find. - DrawList = Screen->EEDrawList; - for ( ; DrawList != NULL; DrawList = DrawList->Pnext ) - { - if(DrawList->Type() != DRAW_SHEET_STRUCT_TYPE) continue; - /* Examen de la Sheet */ - SheetLabel = ((DrawSheetStruct *) DrawList)->m_Label; - if (SheetLabel == NULL) continue; - if (SheetLabel == (DrawSheetLabelStruct*) DrawStruct) - { - ((DrawSheetStruct *) DrawList)->m_Label = - (DrawSheetLabelStruct *)SheetLabel->Pnext; - SAFE_DELETE( DrawStruct ); - return; - } - else while( SheetLabel->Pnext )/* Examen de la liste dependante */ - { - NextLabel = (DrawSheetLabelStruct *)SheetLabel->Pnext; - if( NextLabel == (DrawSheetLabelStruct*) DrawStruct ) - { - SheetLabel->Pnext = (EDA_BaseStruct *)NextLabel->Pnext; - SAFE_DELETE( DrawStruct ); - return; - } - SheetLabel = NextLabel; - } - } - return; - } + Screen->SetModify(); - if (DrawStruct->Type() == DRAW_PICK_ITEM_STRUCT_TYPE) - { - PickedList = (DrawPickedStruct *) DrawStruct; - while (PickedList) - { - if (PickedList->m_PickedStruct == Screen->EEDrawList) - { - Screen->EEDrawList = Screen->EEDrawList->Pnext; - SAFE_DELETE( DrawStruct ); - } - else - { - DrawList = Screen->EEDrawList; - while ( DrawList && DrawList->Pnext) - { - if (DrawList->Pnext == PickedList->m_PickedStruct) - { - DrawList->Pnext = DrawList->Pnext->Pnext; - SAFE_DELETE( DrawStruct ); - return; - } - DrawList = DrawList->Pnext; - } - } - PickedList = (DrawPickedStruct *)PickedList->Pnext; - } - } - else // structure usuelle */ - { - if (DrawStruct == Screen->EEDrawList) - { - Screen->EEDrawList = DrawStruct->Pnext; - SAFE_DELETE( DrawStruct ); - } - else - { - DrawList = Screen->EEDrawList; - while (DrawList && DrawList->Pnext) - { - if (DrawList->Pnext == DrawStruct) - { - DrawList->Pnext = DrawStruct->Pnext; - SAFE_DELETE( DrawStruct ); - return; - } - DrawList = DrawList->Pnext; - } - } - } + if( DrawStruct->Type() == DRAW_SHEETLABEL_STRUCT_TYPE ) + { + /* Cette stucture est rattachee a une feuille, et n'est pas + * accessible par la liste globale directement */ + //this structure has a sheet attached, which we must find. + DrawList = Screen->EEDrawList; + for( ; DrawList != NULL; DrawList = DrawList->Pnext ) + { + if( DrawList->Type() != DRAW_SHEET_STRUCT_TYPE ) + continue; + + /* Examen de la Sheet */ + SheetLabel = ( (DrawSheetStruct*) DrawList )->m_Label; + if( SheetLabel == NULL ) + continue; + + if( SheetLabel == (DrawSheetLabelStruct*) DrawStruct ) + { + ( (DrawSheetStruct*) DrawList )->m_Label = + (DrawSheetLabelStruct*) SheetLabel->Pnext; + + SAFE_DELETE( DrawStruct ); + return; + } + else + { + while( SheetLabel->Pnext ) /* Examen de la liste dependante */ + { + NextLabel = (DrawSheetLabelStruct*) SheetLabel->Pnext; + if( NextLabel == (DrawSheetLabelStruct*) DrawStruct ) + { + SheetLabel->Pnext = (EDA_BaseStruct*) NextLabel->Pnext; + SAFE_DELETE( DrawStruct ); + return; + } + SheetLabel = NextLabel; + } + } + } + + return; + } + + if( DrawStruct->Type() == DRAW_PICK_ITEM_STRUCT_TYPE ) + { + PickedList = (DrawPickedStruct*) DrawStruct; + while( PickedList ) + { + if( PickedList->m_PickedStruct == Screen->EEDrawList ) + { + Screen->EEDrawList = Screen->EEDrawList->Pnext; + SAFE_DELETE( DrawStruct ); + } + else + { + DrawList = Screen->EEDrawList; + while( DrawList && DrawList->Pnext ) + { + if( DrawList->Pnext == PickedList->m_PickedStruct ) + { + DrawList->Pnext = DrawList->Pnext->Pnext; + SAFE_DELETE( DrawStruct ); + return; + } + DrawList = DrawList->Pnext; + } + } + PickedList = (DrawPickedStruct*) PickedList->Pnext; + } + } + else // structure usuelle */ + { + if( DrawStruct == Screen->EEDrawList ) + { + Screen->EEDrawList = DrawStruct->Pnext; + SAFE_DELETE( DrawStruct ); + } + else + { + DrawList = Screen->EEDrawList; + while( DrawList && DrawList->Pnext ) + { + if( DrawList->Pnext == DrawStruct ) + { + DrawList->Pnext = DrawStruct->Pnext; + SAFE_DELETE( DrawStruct ); + return; + } + DrawList = DrawList->Pnext; + } + } + } } - /********************************/ -void DeleteAllMarkers(int type) +void DeleteAllMarkers( int type ) /********************************/ /* Effacement des marqueurs du type "type" */ { -SCH_SCREEN * screen; -EDA_BaseStruct * DrawStruct, * NextStruct; -DrawMarkerStruct * Marker; + SCH_SCREEN* screen; + EDA_BaseStruct* DrawStruct, * NextStruct; + DrawMarkerStruct* Marker; - EDA_ScreenList ScreenList; - for ( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) - { - for ( DrawStruct = screen->EEDrawList; DrawStruct != NULL; DrawStruct = NextStruct) - { - NextStruct = DrawStruct->Pnext; - if(DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) continue; - /* Marqueur trouve */ - Marker = (DrawMarkerStruct * ) DrawStruct; - if( Marker->m_Type != type ) continue; - /* Suppression du marqueur */ - EraseStruct( DrawStruct, screen); - } - } + EDA_ScreenList ScreenList; + + for( screen = ScreenList.GetFirst(); screen != NULL; screen = ScreenList.GetNext() ) + { + for( DrawStruct = screen->EEDrawList; DrawStruct != NULL; DrawStruct = NextStruct ) + { + NextStruct = DrawStruct->Pnext; + if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) + continue; + + /* Marqueur trouve */ + Marker = (DrawMarkerStruct*) DrawStruct; + if( Marker->m_Type != type ) + continue; + + /* Suppression du marqueur */ + EraseStruct( DrawStruct, screen ); + } + } } + /********************************************************************/ -void DeleteOneLibraryDrawStruct(WinEDA_DrawPanel * panel, wxDC * DC, - EDA_LibComponentStruct * LibEntry, - LibEDA_BaseStruct * DrawItem, int Affiche) +void DeleteOneLibraryDrawStruct( WinEDA_DrawPanel* panel, wxDC* DC, + EDA_LibComponentStruct* LibEntry, + LibEDA_BaseStruct* DrawItem, int Affiche ) /********************************************************************/ + /* Routine d'effacement d'un "LibraryDrawStruct" - (d'un element de dessin d'un composant ) - - Parametres d'entree - Pointeur sur le composant comportant la structure - (Si NULL la structure a effacer est supposee non rattachee - a un composant) - Pointeur sur la structure a effacer - - Efface egalement le graphique correspondant de l'ecran -*/ + * (d'un element de dessin d'un composant ) + * + * Parametres d'entree + * Pointeur sur le composant comportant la structure + * (Si NULL la structure a effacer est supposee non rattachee + * a un composant) + * Pointeur sur la structure a effacer + * + * Efface egalement le graphique correspondant de l'ecran + */ { -LibEDA_BaseStruct *PreviousDrawItem; + LibEDA_BaseStruct* PreviousDrawItem; - /* Effacement du graphique */ - if( Affiche && DC) - DrawLibraryDrawStruct(panel, DC, LibEntry, 0 , 0, DrawItem, CurrentUnit, g_XorMode); + /* Effacement du graphique */ + if( Affiche && DC ) + DrawLibraryDrawStruct( panel, DC, LibEntry, 0, 0, DrawItem, CurrentUnit, g_XorMode ); - /* Effacement de la structure en memoire */ - if( LibEntry ) /* Recherche du predecesseur */ - { - PreviousDrawItem = LibEntry->m_Drawings; + /* Effacement de la structure en memoire */ + if( LibEntry ) /* Recherche du predecesseur */ + { + PreviousDrawItem = LibEntry->m_Drawings; - /* Cas du 1er symbole graphique = struct a supprimer */ - if( LibEntry->m_Drawings == DrawItem ) - { - LibEntry->m_Drawings = DrawItem->Next(); - SAFE_DELETE( DrawItem ); - } + /* Cas du 1er symbole graphique = struct a supprimer */ + if( LibEntry->m_Drawings == DrawItem ) + { + LibEntry->m_Drawings = DrawItem->Next(); + SAFE_DELETE( DrawItem ); + } + else /* Cas des autres items */ + { + while( PreviousDrawItem ) + { + if( PreviousDrawItem->Pnext == DrawItem ) + { + PreviousDrawItem->Pnext = DrawItem->Pnext; + SAFE_DELETE( DrawItem ); + break; + } + PreviousDrawItem = PreviousDrawItem->Next(); + } + } + } - else /* Cas des autres items */ - while(PreviousDrawItem) - { - if(PreviousDrawItem->Pnext == DrawItem) - { - PreviousDrawItem->Pnext = DrawItem->Pnext; - SAFE_DELETE( DrawItem ); break; - } - PreviousDrawItem = PreviousDrawItem->Next(); - } - } - - else /* Structure non reliee a un composant */ - { - SAFE_DELETE( DrawItem ); - } + else /* Structure non reliee a un composant */ + { + SAFE_DELETE( DrawItem ); + } } - - diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp index b0e21d50a2..673df192db 100644 --- a/eeschema/erc.cpp +++ b/eeschema/erc.cpp @@ -101,16 +101,17 @@ bool DiagErcTableInit; // go to TRUE after DiagErc init */ static int DefaultDiagErc[PIN_NMAX][PIN_NMAX] = { /* I, O, Bi, 3S, Pas, UnS,PwrI,PwrO, OC, OE, NC */ -/* I */ { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR }, -/* O */ { OK, ERR, OK, WAR, OK, WAR, OK, ERR, ERR, ERR, WAR }, -/* Bi*/ { OK, OK, OK, OK, OK, WAR, OK, WAR, OK, WAR, WAR }, -/* 3S*/ { OK, WAR, OK, OK, OK, WAR, WAR, ERR, WAR, WAR, WAR }, -/*Pas*/ { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR }, +/* I */ + { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR }, +/* O */ { OK, ERR, OK, WAR, OK, WAR, OK, ERR, ERR, ERR, WAR }, +/* Bi*/ { OK, OK, OK, OK, OK, WAR, OK, WAR, OK, WAR, WAR }, +/* 3S*/ { OK, WAR, OK, OK, OK, WAR, WAR, ERR, WAR, WAR, WAR }, +/*Pas*/ { OK, OK, OK, OK, OK, WAR, OK, OK, OK, OK, WAR }, /*UnS */ { WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR }, -/*PwrI*/ { OK, OK, OK, WAR, OK, WAR, OK, OK, OK, OK, ERR }, -/*PwrO*/ { OK, ERR, WAR, ERR, OK, WAR, OK, ERR, ERR, ERR, WAR }, -/* OC */ { OK, ERR, OK, WAR, OK, WAR, OK, ERR, OK, OK, WAR }, -/* OE */ { OK, ERR, WAR, WAR, OK, WAR, OK, ERR, OK, OK, WAR }, +/*PwrI*/ { OK, OK, OK, WAR, OK, WAR, OK, OK, OK, OK, ERR }, +/*PwrO*/ { OK, ERR, WAR, ERR, OK, WAR, OK, ERR, ERR, ERR, WAR }, +/* OC */ { OK, ERR, OK, WAR, OK, WAR, OK, ERR, OK, OK, WAR }, +/* OE */ { OK, ERR, WAR, WAR, OK, WAR, OK, ERR, OK, OK, WAR }, /* NC */ { WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR } }; @@ -124,29 +125,29 @@ static int DefaultDiagErc[PIN_NMAX][PIN_NMAX] = /* Look up table which gives the minimal drive for a pair of connected pins on a net * Initial state of a net is NOC (No Connection) * Can be updated to NET_NC, or NOD (Not Driven) or DRV (DRIven) - * + * * Can be updated to NET_NC only if the previous state is NOC - * + * * Nets are OK when their final state is NET_NC or DRV * Nets with the state NOD have no source signal */ static int MinimalReq[PIN_NMAX][PIN_NMAX] = { /* In, Out, Bi, 3S, Pas, UnS,PwrI,PwrO, OC, OE, NC */ -/* In*/ { NOD, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/*Out*/ { DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC }, -/* Bi*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/* 3S*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/*Pas*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/*UnS*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/* In*/ + { NOD, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/*Out*/ { DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC }, +/* Bi*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/* 3S*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/*Pas*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/*UnS*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, /*PwrI*/ { NOD, DRV, NOD, NOD, NOD, NOD, NOD, DRV, NOD, NOD, NOC }, /*PwrO*/ { DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, DRV, NOC }, -/* OC*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/* OE*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, -/* NC*/ { NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC } +/* OC*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/* OE*/ { DRV, DRV, DRV, DRV, DRV, DRV, NOD, DRV, DRV, DRV, NOC }, +/* NC*/ { NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC, NOC } }; - /*********************************************/ void WinEDA_ErcFrame::ReBuildMatrixPanel() /*********************************************/ @@ -174,7 +175,7 @@ void WinEDA_ErcFrame::ReBuildMatrixPanel() text_height = text->GetRect().GetHeight(); bitmap_size = MAX( bitmap_size, text_height ); - SAFE_DELETE( text ); + SAFE_DELETE( text ); // compute the Y pos interval: BoxMatrixMinSize.y = ( bitmap_size * (PIN_NMAX + 1) ) + 5; @@ -273,7 +274,7 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event ) ObjetNetListStruct* OldItem; ObjetNetListStruct* StartNet; ObjetNetListStruct* Lim; - + int NetNbItems, MinConn; if( !DiagErcTableInit ) @@ -324,19 +325,19 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event ) for( NetItemRef = g_TabObjNet; NetItemRef < Lim; NetItemRef++ ) NetItemRef->m_FlagOfConnection = (IsConnectType) 0; - NetNbItems = 0; - MinConn = NOC; - + NetNbItems = 0; + MinConn = NOC; + StartNet = OldItem = NetItemRef = g_TabObjNet; - + for( ; NetItemRef < Lim; NetItemRef++ ) { /* Tst changement de net */ if( OldItem->GetNet() != NetItemRef->GetNet() ) { - MinConn = NOC; - NetNbItems = 0; - StartNet = NetItemRef; + MinConn = NOC; + NetNbItems = 0; + StartNet = NetItemRef; } switch( NetItemRef->m_Type ) @@ -347,8 +348,8 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event ) case NET_LABEL: case NET_BUSLABELMEMBER: case NET_PINLABEL: - case NET_GLOBLABEL: //not sure how to handle global labels -- they should be treated like other nets (just global!0 - case NET_GLOBBUSLABELMEMBER: + case NET_GLOBLABEL: //not sure how to handle global labels -- they should be treated like other nets (just global!0 + case NET_GLOBBUSLABELMEMBER: break; case NET_HIERLABEL: @@ -366,7 +367,7 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event ) case NET_PIN: TestOthersItems( m_Parent->DrawPanel, &dc, - NetItemRef, StartNet, &NetNbItems, &MinConn ); + NetItemRef, StartNet, &NetNbItems, &MinConn ); break; } @@ -389,17 +390,18 @@ void WinEDA_ErcFrame::TestErc( wxCommandEvent& event ) if( WriteFichierERC == TRUE ) { wxString ErcFullFileName; - ErcFullFileName = g_RootSheet->m_AssociatedScreen->m_FileName; + ErcFullFileName = g_RootSheet->m_AssociatedScreen->m_FileName; ChangeFileNameExt( ErcFullFileName, wxT( ".erc" ) ); + ErcFullFileName = EDA_FileSelector( _( "ERC file:" ), - wxEmptyString, /* Chemin par defaut */ - ErcFullFileName, /* nom fichier par defaut */ - wxT( ".erc" ), /* extension par defaut */ - wxT( "*.erc" ), /* Masque d'affichage */ - this, - wxFD_SAVE, - TRUE - ); + wxEmptyString, /* Chemin par defaut */ + ErcFullFileName, /* nom fichier par defaut */ + wxT( ".erc" ), /* extension par defaut */ + wxT( "*.erc" ), /* Masque d'affichage */ + this, + wxFD_SAVE, + TRUE + ); if( ErcFullFileName.IsEmpty() ) return; @@ -434,6 +436,7 @@ void WinEDA_ErcFrame::DelERCMarkers( wxCommandEvent& event ) { if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) continue; + /* Marqueur trouve */ Marker = (DrawMarkerStruct*) DrawStruct; if( Marker->m_Type == MARQ_ERC ) @@ -466,7 +469,7 @@ void WinEDA_ErcFrame::ChangeErrorLevel( wxCommandEvent& event ) { int id, level, ii, x, y; wxBitmapButton* Butt; - const char** new_bitmap_xpm = NULL; + const char** new_bitmap_xpm = NULL; wxPoint pos; id = event.GetId(); @@ -545,11 +548,11 @@ static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC, || (NetItemRef->m_Type == NET_HIERBUSLABELMEMBER) ) { Marker->m_Comment.Printf( _( "Warning HLabel %s not connected to SheetLabel" ), - NetItemRef->m_Label->GetData() ); + NetItemRef->m_Label->GetData() ); } else Marker->m_Comment.Printf( _( "Warning SheetLabel %s not connected to HLabel" ), - NetItemRef->m_Label->GetData() ); + NetItemRef->m_Label->GetData() ); if( screen == panel->GetScreen() ) RedrawOneStruct( panel, DC, Marker, GR_COPY ); @@ -573,6 +576,7 @@ static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC, Marker->m_Comment.Printf( _( "Warning Pin %s not driven (Net %d)" ), MsgPinElectricType[ii], NetItemRef->GetNet() ); + if( screen == panel->GetScreen() ) RedrawOneStruct( panel, DC, Marker, GR_COPY ); return; @@ -582,6 +586,7 @@ static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC, { Marker->m_Comment.Printf( _( "Warning More than 1 Pin connected to UnConnect symbol" ) ); + if( screen == panel->GetScreen() ) RedrawOneStruct( panel, DC, Marker, GR_COPY ); return; @@ -600,10 +605,10 @@ static void Diagnose( WinEDA_DrawPanel* panel, wxDC* DC, } Marker->m_Comment.Printf( _( - "%s: Pin %s connected to Pin %s (net %d)" ), - DiagLevel.GetData(), - MsgPinElectricType[ii], - MsgPinElectricType[jj], NetItemRef->GetNet() ); + "%s: Pin %s connected to Pin %s (net %d)" ), + DiagLevel.GetData(), + MsgPinElectricType[ii], + MsgPinElectricType[jj], NetItemRef->GetNet() ); if( screen == panel->GetScreen() ) RedrawOneStruct( panel, DC, Marker, GR_COPY ); @@ -625,12 +630,12 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, wxDC* DC, { ObjetNetListStruct* NetItemTst; ObjetNetListStruct* Lim; - + int ref_elect_type, jj, erc = OK, local_minconn; /* Analyse de la table des connexions : */ Lim = g_TabObjNet + g_NbrObjNet; // pointe la fin de la liste - + ref_elect_type = NetItemRef->m_ElectricalType; NetItemTst = netstart; @@ -644,7 +649,7 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, wxDC* DC, /* Est - on toujours dans le meme net ? */ if( (NetItemTst >= Lim) // fin de liste (donc fin de net) - || (NetItemRef->GetNet() != NetItemTst->GetNet()) ) // fin de net + || ( NetItemRef->GetNet() != NetItemTst->GetNet() ) ) // fin de net { /* Fin de netcode trouve: Tst connexion minimum */ if( (*MinConnexion < NET_NC ) && (local_minconn < NET_NC ) ) /* pin non connect�e ou non pilotee */ @@ -666,8 +671,8 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, wxDC* DC, case NET_HIERBUSLABELMEMBER: case NET_SHEETBUSLABELMEMBER: case NET_SHEETLABEL: - case NET_GLOBLABEL: - case NET_GLOBBUSLABELMEMBER: + case NET_GLOBLABEL: + case NET_GLOBBUSLABELMEMBER: case NET_PINLABEL: break; @@ -681,7 +686,7 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, wxDC* DC, if( NetItemTst <= NetItemRef ) break; - + *NetNbItems += 1; if( erc == OK ) // 1 marqueur par pin maxi { @@ -712,7 +717,7 @@ static bool WriteDiagnosticERC( const wxString& FullFileName ) DrawMarkerStruct* Marker; char Line[256]; static FILE* OutErc; - DrawSheetPath* Sheet; + DrawSheetPath* Sheet; wxString msg; if( ( OutErc = wxFopen( FullFileName, wxT( "wt" ) ) ) == NULL ) @@ -720,23 +725,26 @@ static bool WriteDiagnosticERC( const wxString& FullFileName ) DateAndTime( Line ); msg = _( "ERC control" ); - + fprintf( OutErc, "%s (%s)\n", CONV_TO_UTF8( msg ), Line ); EDA_SheetList SheetList( NULL ); for( Sheet = SheetList.GetFirst(); Sheet != NULL; Sheet = SheetList.GetNext() ) { - if(Sheet->Last() == g_RootSheet){ - msg.Printf( _( "\n***** Sheet / (Root) \n" ) ); - }else{ - wxString str = Sheet->PathHumanReadable(); - msg.Printf( _("\n***** Sheet %s\n"), str.GetData() ); - } - + if( Sheet->Last() == g_RootSheet ) + { + msg.Printf( _( "\n***** Sheet / (Root) \n" ) ); + } + else + { + wxString str = Sheet->PathHumanReadable(); + msg.Printf( _( "\n***** Sheet %s\n" ), str.GetData() ); + } + fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) ); - DrawStruct = Sheet->LastDrawList(); + DrawStruct = Sheet->LastDrawList(); for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Pnext ) { if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) @@ -746,13 +754,13 @@ static bool WriteDiagnosticERC( const wxString& FullFileName ) Marker = (DrawMarkerStruct*) DrawStruct; if( Marker->m_Type != MARQ_ERC ) continue; - + /* Write diag marqueur */ msg.Printf( _( "ERC: %s (X= %2.3f inches, Y= %2.3f inches\n" ), - Marker->GetComment().GetData(), - (float) Marker->m_Pos.x / 1000, - (float) Marker->m_Pos.y / 1000 ); - + Marker->GetComment().GetData(), + (float) Marker->m_Pos.x / 1000, + (float) Marker->m_Pos.y / 1000 ); + fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) ); } } @@ -764,18 +772,24 @@ static bool WriteDiagnosticERC( const wxString& FullFileName ) return TRUE; } + bool TestLabel_( ObjetNetListStruct* a, ObjetNetListStruct* b ) { - int at = a->m_Type; - int bt = b->m_Type; - if( (at == NET_HIERLABEL || at == NET_HIERBUSLABELMEMBER) - &&(bt == NET_SHEETLABEL || bt == NET_SHEETBUSLABELMEMBER) ){ - if( a->m_SheetList == b->m_SheetListInclude ){ - return true; //connected! - } - } - return false; //these two are unconnected + int at = a->m_Type; + int bt = b->m_Type; + + if( (at == NET_HIERLABEL || at == NET_HIERBUSLABELMEMBER) + &&(bt == NET_SHEETLABEL || bt == NET_SHEETBUSLABELMEMBER) ) + { + if( a->m_SheetList == b->m_SheetListInclude ) + { + return true; //connected! + } + } + return false; //these two are unconnected } + + /***********************************************************************/ void TestLabel( WinEDA_DrawPanel* panel, wxDC* DC, ObjetNetListStruct* NetItemRef, ObjetNetListStruct* StartNet ) @@ -802,18 +816,20 @@ void TestLabel( WinEDA_DrawPanel* panel, wxDC* DC, /* Est - on toujours dans le meme net ? */ if( ( NetItemTst == Lim ) || ( NetItemRef->GetNet() != NetItemTst->GetNet() ) ) - { + { /* Fin de netcode trouve */ - if( erc ){ + if( erc ) + { /* GLabel ou SheetLabel orphelin */ Diagnose( panel, DC, NetItemRef, NULL, -1, WAR ); } return; } - if(TestLabel_(NetItemRef, NetItemTst)) - erc = 0; - //same thing, different order. - if(TestLabel_(NetItemTst, NetItemRef)) - erc = 0; + if( TestLabel_( NetItemRef, NetItemTst ) ) + erc = 0; + + //same thing, different order. + if( TestLabel_( NetItemTst, NetItemRef ) ) + erc = 0; } } diff --git a/eeschema/program.h b/eeschema/program.h index 0a3f8fffce..956dd6aa03 100644 --- a/eeschema/program.h +++ b/eeschema/program.h @@ -76,7 +76,7 @@ public: public: EDA_DrawLineStruct( const wxPoint& pos, int layer ); ~EDA_DrawLineStruct() { } - + virtual wxString GetClass() const { return wxT( "EDA_DrawLine" ); @@ -92,19 +92,25 @@ public: } + /** + * Function GetBoundingBox + * returns the bounding box of this TRACK + */ + EDA_Rect GetBoundingBox() const; + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); - -#if defined(DEBUG) + +#if defined(DEBUG) /** * Function Show * is used to output the object tree, currently for debugging only. - * @param nestLevel An aid to prettier tree indenting, and is the level + * @param nestLevel An aid to prettier tree indenting, and is the level * of nesting of this object within the overall tree. * @param os The ostream& to output to. */ void Show( int nestLevel, std::ostream& os ); -#endif +#endif }; @@ -129,16 +135,16 @@ public: wxString GetComment(); virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); -#if defined(DEBUG) +#if defined(DEBUG) /** * Function Show * is used to output the object tree, currently for debugging only. - * @param nestLevel An aid to prettier tree indenting, and is the level + * @param nestLevel An aid to prettier tree indenting, and is the level * of nesting of this object within the overall tree. * @param os The ostream& to output to. */ void Show( int nestLevel, std::ostream& os ); -#endif +#endif }; @@ -177,7 +183,7 @@ public: public: DrawBusEntryStruct( const wxPoint& pos, int shape, int id ); ~DrawBusEntryStruct() { } - + virtual wxString GetClass() const { return wxT( "DrawBusEntry" ); @@ -201,7 +207,7 @@ public: public: DrawPolylineStruct( int layer ); ~DrawPolylineStruct(); - + virtual wxString GetClass() const { return wxT( "DrawPolyline" ); @@ -222,7 +228,7 @@ public: public: DrawJunctionStruct( const wxPoint& pos ); ~DrawJunctionStruct() { } - + virtual wxString GetClass() const { return wxT( "DrawJunction" ); diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index da3e1f868e..1ca3deffc5 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -478,6 +478,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) DrawPanel->MouseToCursorSchema(); if( GetScreen()->GetCurItem()->m_Flags == 0 ) SaveCopyInUndoList( GetScreen()->GetCurItem(), IS_CHANGED ); + CmpRotationMiroir( (EDA_SchComponentStruct*) GetScreen()->GetCurItem(), &dc, option ); @@ -497,6 +498,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) GetScreen() ) ); if( GetScreen()->GetCurItem() == NULL ) break; + EditComponentValue( (EDA_SchComponentStruct*) GetScreen()->GetCurItem(), &dc ); break; @@ -510,6 +512,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) GetScreen() ) ); if( GetScreen()->GetCurItem() == NULL ) break; + EditComponentReference( (EDA_SchComponentStruct*) GetScreen()->GetCurItem(), &dc ); break;