From 6d930edec3b0b26107ed8835f0483f4abbf0615d Mon Sep 17 00:00:00 2001 From: charras Date: Tue, 7 Jul 2009 17:50:02 +0000 Subject: [PATCH] work in progress about ERC and markers in eeschema --- common/class_marker_base.cpp | 159 ++++---- eeschema/CMakeLists.txt | 3 +- eeschema/block.cpp | 1 + eeschema/class_marker_sch.cpp | 127 +++++++ eeschema/class_marker_sch.h | 84 +++++ eeschema/class_schematic_items.cpp | 99 ----- eeschema/class_schematic_items.h | 72 ---- eeschema/controle.cpp | 2 + eeschema/delete.cpp | 1 + eeschema/dialog_erc.cpp | 100 ++++- eeschema/dialog_erc.h | 6 - eeschema/eecreate.cpp | 546 --------------------------- eeschema/erc.cpp | 307 +++++++-------- eeschema/erc.h | 50 +++ eeschema/find.cpp | 1 + eeschema/load_one_schematic_file.cpp | 5 +- eeschema/locate.cpp | 1 + eeschema/schematic_undo_redo.cpp | 1 + include/class_marker_base.h | 22 +- pcbnew/class_marker.cpp | 8 +- 20 files changed, 594 insertions(+), 1001 deletions(-) create mode 100644 eeschema/class_marker_sch.cpp create mode 100644 eeschema/class_marker_sch.h delete mode 100644 eeschema/eecreate.cpp create mode 100644 eeschema/erc.h diff --git a/common/class_marker_base.cpp b/common/class_marker_base.cpp index 0ff1ad9923..8e27b9a0f4 100644 --- a/common/class_marker_base.cpp +++ b/common/class_marker_base.cpp @@ -4,71 +4,76 @@ **********************************************************************************/ /* file class_marker_base.cpp -*/ + */ #include "fctsys.h" #include "gr_basic.h" #include "class_base_screen.h" #include "common.h" +#include "macros.h" #include "class_drawpanel.h" #include "class_marker_base.h" -/* Default bitmap shape for markers */ -static char Default_MarkerBitmap[] = +// Default marquer shape: +#define M_SHAPE_SCALE 6 // default scaling factor for MarkerShapeCorners coordinates +#define CORNERS_COUNT 8 +// corners of the default shape +static wxPoint MarkerShapeCorners[CORNERS_COUNT] = { - 12, 12, /* x and y size of the bitmap */ - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, /* bitmap: 1 = color, 0 = notrace */ - 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, - 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 + wxPoint( 0, 0 ), + wxPoint( 8, 1 ), + wxPoint( 4, 3 ), + wxPoint( 13, 8 ), + wxPoint( 9, 9 ), + wxPoint( 8, 13 ), + wxPoint( 3, 4 ), + wxPoint( 1, 8 ) }; - /*******************/ /* Classe MARKER_BASE */ /*******************/ void MARKER_BASE::init() { - m_Bitmap = NULL; - m_MarkerType = 0; - m_Color = RED; - m_Bitmap = Default_MarkerBitmap; - m_Size.x = Default_MarkerBitmap[0]; - m_Size.y = Default_MarkerBitmap[1]; + m_MarkerType = 0; + m_Color = RED; + for( unsigned ii = 0; ii < CORNERS_COUNT; ii++ ) + { + wxPoint corner = MarkerShapeCorners[ii]; + m_Corners.push_back( corner ); + m_Size.x = MAX( m_Size.x, corner.x); + m_Size.y = MAX( m_Size.y, corner.y); + } } -MARKER_BASE::MARKER_BASE( ) + +MARKER_BASE::MARKER_BASE() { + m_ScalingFactor = M_SHAPE_SCALE; init(); } MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos, - const wxString& aText, const wxPoint& aPos, - const wxString& bText, const wxPoint& bPos ) + const wxString& aText, const wxPoint& aPos, + const wxString& bText, const wxPoint& bPos ) { + m_ScalingFactor = M_SHAPE_SCALE; init(); - SetData( aErrorCode,aMarkerPos, - aText, aPos, - bText, bPos ); + SetData( aErrorCode, aMarkerPos, + aText, aPos, + bText, bPos ); } -MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos, - const wxString& aText, const wxPoint& aPos ) -{ - init(); +MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos, + const wxString& aText, const wxPoint& aPos ) +{ + m_ScalingFactor = M_SHAPE_SCALE; + init(); SetData( aErrorCode, aMarkerPos, aText, aPos ); } @@ -80,96 +85,70 @@ MARKER_BASE::~MARKER_BASE() void MARKER_BASE::SetData( int aErrorCode, const wxPoint& aMarkerPos, - const wxString& aText, const wxPoint& aPos, - const wxString& bText, const wxPoint& bPos ) + const wxString& aText, const wxPoint& aPos, + const wxString& bText, const wxPoint& bPos ) { m_Pos = aMarkerPos; m_drc.SetData( aErrorCode, - aText, bText, aPos, bPos ); - - // @todo: switch on error code to set error code specific color, and possibly bitmap. - m_Color = WHITE; + aText, bText, aPos, bPos ); } void MARKER_BASE::SetData( int aErrorCode, const wxPoint& aMarkerPos, - const wxString& aText, const wxPoint& aPos ) + const wxString& aText, const wxPoint& aPos ) { m_Pos = aMarkerPos; m_drc.SetData( aErrorCode, - aText, aPos ); - - // @todo: switch on error code to set error code specific color, and possibly bitmap. - m_Color = WHITE; + aText, aPos ); } - /**********************************************/ bool MARKER_BASE::HitTestMarker( const wxPoint& refPos ) /**********************************************/ { - // the MARKER_BASE is 12 pixels by 12 pixels, but is not resized with zoom, so - // as zoom changes, the effective real size (in user units) of the MARKER_BASE changes. + int dx = refPos.x - m_Pos.x; + int dy = refPos.y - m_Pos.y; - wxSize TrueSize = m_Size; - if ( ActiveScreen ) - { - ActiveScreen->Unscale( TrueSize ); - } - - wxPoint pos = m_Pos; - - int dx = refPos.x - pos.x; - int dy = refPos.y - pos.y; + wxSize Realsize = m_Size; + Realsize.x *= m_ScalingFactor; + Realsize.y *= m_ScalingFactor; /* is refPos in the box: Marker size to right an bottom, - or size/2 to left or top */ - if( dx <= TrueSize.x && dy <= TrueSize.y && - dx >= -TrueSize.x/2 && dy >= -TrueSize.y/2 ) + * or size/2 to left or top */ + if( dx <= Realsize.x && dy <= Realsize.y + && dx >= -Realsize.x / 2 && dy >= -Realsize.y / 2 ) return true; else return false; } - /**********************************************************************/ -void MARKER_BASE::DrawMarker( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode, - const wxPoint& offset ) +void MARKER_BASE::DrawMarker( WinEDA_DrawPanel* aPanel, wxDC* aDC, int aDrawMode, + const wxPoint& aOffset ) /**********************************************************************/ -/* - * Trace un repere sur l'ecran au point de coordonnees PCB pos - * Le marqueur est defini par un tableau de 2 + (lig*col) elements: - * 1er element: dim nbre ligne - * 2er element: dim nbre col - * suite: lig * col elements a 0 ou 1 : si 1 mise a color du pixel +/** Function DrawMarker + * The shape is the polygon defined in m_Corners (array of wxPoints) */ { - int ii, jj; - char* pt_bitmap = m_Bitmap; + wxPoint corners[CORNERS_COUNT]; - if( pt_bitmap == NULL ) return; + GRSetDrawMode( aDC, aDrawMode ); - GRSetDrawMode( DC, DrawMode ); - - wxPoint pos = m_Pos; - pos.x = GRMapX( pos.x ); - pos.y = GRMapY( pos.y ); - - /* Get the bitmap size */ - m_Size.x = *(pt_bitmap++); - m_Size.y = *(pt_bitmap++); - - /* Draw the bitmap */ - for( ii = 0; ii < m_Size.x; ii++ ) + for( unsigned ii = 0; ii < m_Corners.size(); ii++ ) { - for( jj = 0; jj < m_Size.y; jj++, pt_bitmap++ ) - { - if( *pt_bitmap ) - GRSPutPixel( &panel->m_ClipBox, DC, - pos.x + ii, pos.y + jj, m_Color ); - } + corners[ii] = m_Corners[ii]; + corners[ii].x *= m_ScalingFactor; + corners[ii].y *= m_ScalingFactor; + corners[ii] += m_Pos + aOffset; } + + GRClosedPoly( &aPanel->m_ClipBox, aDC, CORNERS_COUNT, corners, + true, // = Filled + 0, // outline width + m_Color, // outline color + m_Color // fill collor + ); } diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index 51561fbb39..501bb5350d 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -5,7 +5,6 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} ) set(EESCHEMA_SRCS -# affiche.cpp annotate.cpp annotate_dialog.cpp backanno.cpp @@ -21,6 +20,7 @@ set(EESCHEMA_SRCS class_libentry.cpp class_libentry_fields.cpp class_library.cpp + class_marker_sch.cpp class_pin.cpp class_sch_cmp_field.cpp class_schematic_items.cpp @@ -62,7 +62,6 @@ set(EESCHEMA_SRCS edit_component_in_schematic.cpp edit_label.cpp eeconfig.cpp -# eecreate.cpp eelayer.cpp eelibs_draw_components.cpp eelibs_read_libraryfiles.cpp diff --git a/eeschema/block.cpp b/eeschema/block.cpp index a6ae0860b8..0036af2f0a 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -16,6 +16,7 @@ #include "libcmp.h" #include "general.h" #include "protos.h" +#include "class_marker_sch.h" /* Variables Locales */ diff --git a/eeschema/class_marker_sch.cpp b/eeschema/class_marker_sch.cpp new file mode 100644 index 0000000000..216f8fabb3 --- /dev/null +++ b/eeschema/class_marker_sch.cpp @@ -0,0 +1,127 @@ +/***********************************************************************/ +/* Methodes de base de gestion des classes des elements de schematique */ +/***********************************************************************/ + +#include "fctsys.h" +#include "class_drawpanel.h" + +#include "common.h" +#include "program.h" +#include "general.h" + +#include "class_marker_sch.h" +#include "erc.h" + + +/* Marker are mainly used to show an ERC error + * but they could be used to give a specifi info +*/ + + +const wxChar* NameMarqueurType[] = +{ + wxT( "" ), + wxT( "ERC" ), + wxT( "PCB" ), + wxT( "SIMUL" ), + wxT( "?????" ) +}; + + +/**************************/ +/* class MARKER_SCH */ +/**************************/ + +MARKER_SCH::MARKER_SCH( ) : + SCH_ITEM( NULL, DRAW_MARKER_STRUCT_TYPE ), + MARKER_BASE( ) +{ +} + +MARKER_SCH::MARKER_SCH( const wxPoint& pos, const wxString& text ) : + SCH_ITEM( NULL, DRAW_MARKER_STRUCT_TYPE ), + MARKER_BASE(0, pos, text, pos) +{ +} + + +MARKER_SCH::~MARKER_SCH() +{ +} + + +MARKER_SCH* MARKER_SCH::GenCopy() +{ + MARKER_SCH* newitem = new MARKER_SCH( GetPos(), GetErrorText() ); + + newitem->SetMarkerType( GetMarkerType()); + newitem->SetErrorLevel( GetErrorLevel()); + + return newitem; +} + + + +#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 + * of nesting of this object within the overall tree. + * @param os The ostream& to output to. + */ +void MARKER_SCH::Show( int nestLevel, std::ostream& os ) +{ + // for now, make it look like XML: + NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << GetPos() + << "/>\n"; +} + + +#endif + +/** + * Function Save + * writes the data structures for this object out to a FILE in "*.brd" format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ +bool MARKER_SCH::Save( FILE* aFile ) const +{ + bool success = true; + wxString msg = GetErrorText(); + if( fprintf( aFile, "Kmarq %c %-4d %-4d \"%s\" F=%X\n", + GetMarkerType() + 'A', GetPos().x, GetPos().y, + CONV_TO_UTF8( msg ), GetErrorLevel() ) == EOF ) + { + success = false; + } + + return success; +} + + +/****************************************************************************/ +void MARKER_SCH::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, + const wxPoint& aOffset, int aDrawMode, int aColor ) +/****************************************************************************/ +{ + EDA_Colors color = (EDA_Colors) m_Color; + EDA_Colors tmp = color; + if( GetMarkerType() == MARK_ERC ) + { + color = (GetErrorLevel() == WAR ) ? + (EDA_Colors)g_LayerDescr.LayerColor[LAYER_ERC_WARN] : + (EDA_Colors)g_LayerDescr.LayerColor[LAYER_ERC_ERR]; + } + + if ( aColor < 0 ) + m_Color = color; + else + m_Color = (EDA_Colors) aColor; + + DrawMarker( aPanel, aDC, aDrawMode, aOffset ); + m_Color = tmp; +} + diff --git a/eeschema/class_marker_sch.h b/eeschema/class_marker_sch.h new file mode 100644 index 0000000000..96d1676c27 --- /dev/null +++ b/eeschema/class_marker_sch.h @@ -0,0 +1,84 @@ +/***************************************************/ +/* classes to handle markers used in schematic ... */ +/***************************************************/ + +#ifndef _CLASS_MARKER_SCH_H_ +#define _CLASS_MARKER_SCH_H_ + +#include "class_marker_base.h" + +/* Marker are mainly used to show an ERC error +*/ + +enum TypeMarker { /* Markers type */ + MARK_UNSPEC, + MARK_ERC, + MARK_PCB, + MARK_SIMUL, + MARK_NMAX /* Lats value: end of list */ +}; + + +/* Names for corresponding types of markers: */ +extern const wxChar* NameMarqueurType[]; + + +class MARKER_SCH : public SCH_ITEM , public MARKER_BASE +{ +public: + MARKER_SCH( ); + MARKER_SCH( const wxPoint& aPos, const wxString& aText ); + ~MARKER_SCH(); + virtual wxString GetClass() const + { + return wxT( "MARKER_SCH" ); + } + + + MARKER_SCH* GenCopy(); + + virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, + const wxPoint& aOffset, int aDraw_mode, + int aColor = -1 ); + + + wxString GetErrorText( ) const + { + wxString text = m_drc.GetMainText(); + return text; + } + + void SetErrorText( wxString aText) + { + SetData( m_drc.GetErrorCode(), GetPos(), aText, GetPos() ); + } + + /** + * Function Save + * writes the data structures for this object out to a FILE in "*.sch" + * format. + * @param aFile The FILE to write to. + * @return bool - true if success writing else false. + */ + bool Save( FILE* aFile ) const; + + /** Function GetPenSize + * @return the size of the "pen" that be used to draw or plot this item + * for a marker, has no meaning, but it is necessary to satisfy the SCH_ITEM class requirements + */ + virtual int GetPenSize( ) { return 0; }; + + /** Function HitTest + * @return true if the point aPosRef is within item area + * @param aPosRef = a wxPoint to test + */ + bool HitTest( const wxPoint& aPosRef ) + { + return HitTestMarker( aPosRef ); + } +#if defined(DEBUG) + void Show( int nestLevel, std::ostream& os ); +#endif +}; + +#endif /* _CLASS_MARKER_SCH_H_ */ diff --git a/eeschema/class_schematic_items.cpp b/eeschema/class_schematic_items.cpp index 4cc69f74a6..740016edf9 100644 --- a/eeschema/class_schematic_items.cpp +++ b/eeschema/class_schematic_items.cpp @@ -10,7 +10,6 @@ #include "program.h" #include "libcmp.h" #include "general.h" -#include "id.h" #include "protos.h" @@ -23,16 +22,6 @@ /* class DrawBusEntryStruct */ /***************************/ -const wxChar* NameMarqueurType[] = -{ - wxT( "" ), - wxT( "ERC" ), - wxT( "PCB" ), - wxT( "SIMUL" ), - wxT( "?????" ) -}; - - DrawBusEntryStruct::DrawBusEntryStruct( const wxPoint& pos, int shape, int id ) : SCH_ITEM( NULL, DRAW_BUSENTRY_STRUCT_TYPE ) { @@ -362,94 +351,6 @@ void DrawNoConnectStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, } -/**************************/ -/* class MARKER_SCH */ -/**************************/ - - -MARKER_SCH::MARKER_SCH( const wxPoint& pos, const wxString& text ) : - SCH_ITEM( NULL, DRAW_MARKER_STRUCT_TYPE ), - MARKER_BASE(0, pos, text, pos) -{ -} - - -MARKER_SCH::~MARKER_SCH() -{ -} - - -MARKER_SCH* MARKER_SCH::GenCopy() -{ - MARKER_SCH* newitem = new MARKER_SCH( GetPos(), GetErrorText() ); - - newitem->SetMarkerType( GetMarkerType()); - newitem->SetErrorLevel( GetErrorLevel()); - - return newitem; -} - - - -#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 - * of nesting of this object within the overall tree. - * @param os The ostream& to output to. - */ -void MARKER_SCH::Show( int nestLevel, std::ostream& os ) -{ - // for now, make it look like XML: - NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << GetPos() - << "/>\n"; -} - - -#endif - -/** - * Function Save - * writes the data structures for this object out to a FILE in "*.brd" format. - * @param aFile The FILE to write to. - * @return bool - true if success writing else false. - */ -bool MARKER_SCH::Save( FILE* aFile ) const -{ - bool success = true; - wxString msg = GetErrorText(); - if( fprintf( aFile, "Kmarq %c %-4d %-4d \"%s\" F=%X\n", - GetMarkerType() + 'A', GetPos().x, GetPos().y, - CONV_TO_UTF8( msg ), GetErrorLevel() ) == EOF ) - { - success = false; - } - - return success; -} - - -void MARKER_SCH::Draw( WinEDA_DrawPanel* panel, wxDC* DC, - const wxPoint& offset, int DrawMode, int Color ) -{ -#define WAR 1 // see erc.cpp - - if( GetMarkerType() == MARQ_ERC ) - { - if( Color <= 0 ) - { - Color = (GetErrorLevel() == WAR ) ? - g_LayerDescr.LayerColor[LAYER_ERC_WARN] : - g_LayerDescr.LayerColor[LAYER_ERC_ERR]; - } - } - m_Color = Color; - DrawMarker( panel, DC, DrawMode, offset ); -} - - /***************************/ /* Class EDA_DrawLineStruct */ /***************************/ diff --git a/eeschema/class_schematic_items.h b/eeschema/class_schematic_items.h index 56ce15dfd4..7373a31859 100644 --- a/eeschema/class_schematic_items.h +++ b/eeschema/class_schematic_items.h @@ -5,8 +5,6 @@ #ifndef CLASS_SCHEMATIC_ITEMS_H #define CLASS_SCHEMATIC_ITEMS_H -#include "class_marker_base.h" - #define DRAWJUNCTION_DIAMETER 32 /* Size (diameter) of junctions between wires */ #define DRAWNOCONNECT_SIZE 48 /* Rayon du symbole No Connexion */ @@ -15,19 +13,6 @@ #define BUS_TO_BUS 1 -enum TypeMarker { /* Type des Marqueurs */ - MARQ_UNSPEC, - MARQ_ERC, - MARQ_PCB, - MARQ_SIMUL, - MARQ_NMAX /* Derniere valeur: fin de tableau */ -}; - - -/* Messages correspondants aux types des marqueurs */ -extern const wxChar* NameMarqueurType[]; - - /** * Class EDA_DrawLineStruct * is a segment decription base class to describe items which have 2 end @@ -90,63 +75,6 @@ public: }; -class MARKER_SCH : public SCH_ITEM , public MARKER_BASE -{ -public: - MARKER_SCH( const wxPoint& aPos, const wxString& aText ); - ~MARKER_SCH(); - virtual wxString GetClass() const - { - return wxT( "MARKER_SCH" ); - } - - - MARKER_SCH* GenCopy(); - virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, - const wxPoint& offset, int draw_mode, - int Color = -1 ); - - - wxString GetErrorText( ) const - { - wxString text = m_drc.GetMainText(); - return text; - } - - void SetErrorText( wxString aText) - { - SetData( m_drc.GetErrorCode(), GetPos(), aText, GetPos() ); - } - - /** - * Function Save - * writes the data structures for this object out to a FILE in "*.sch" - * format. - * @param aFile The FILE to write to. - * @return bool - true if success writing else false. - */ - bool Save( FILE* aFile ) const; - - /** Function GetPenSize - * @return the size of the "pen" that be used to draw or plot this item - * for a marker, has no meaning, but it is necessary to satisfy the SCH_ITEM class requirements - */ - virtual int GetPenSize( ) { return 0; }; - - /** Function HitTest - * @return true if the point aPosRef is within item area - * @param aPosRef = a wxPoint to test - */ - bool HitTest( const wxPoint& aPosRef ) - { - return HitTestMarker( aPosRef ); - } -#if defined(DEBUG) - void Show( int nestLevel, std::ostream& os ); -#endif -}; - - class DrawNoConnectStruct : public SCH_ITEM /* Symboles de non connexion */ { public: diff --git a/eeschema/controle.cpp b/eeschema/controle.cpp index 351794d3cd..4856848d6c 100644 --- a/eeschema/controle.cpp +++ b/eeschema/controle.cpp @@ -14,6 +14,8 @@ #include "general.h" #include "protos.h" +#include "class_marker_sch.h" + /**************************************************************************************/ SCH_ITEM* WinEDA_SchematicFrame:: SchematicGeneralLocateAndDisplay( bool IncludePin ) /**************************************************************************************/ diff --git a/eeschema/delete.cpp b/eeschema/delete.cpp index e4c73aa36e..ad5aedf8d6 100644 --- a/eeschema/delete.cpp +++ b/eeschema/delete.cpp @@ -11,6 +11,7 @@ #include "libcmp.h" #include "general.h" #include "protos.h" +#include "class_marker_sch.h" /********************************************************************************/ diff --git a/eeschema/dialog_erc.cpp b/eeschema/dialog_erc.cpp index a1d258501e..38fee15fd8 100644 --- a/eeschema/dialog_erc.cpp +++ b/eeschema/dialog_erc.cpp @@ -15,10 +15,12 @@ #include "general.h" #include "netlist.h" #include "bitmaps.h" +#include "class_marker_sch.h" #include "protos.h" #include "dialog_erc.h" +#include "erc.h" BEGIN_EVENT_TABLE( DIALOG_ERC, DIALOG_ERC_BASE ) @@ -71,7 +73,7 @@ void DIALOG_ERC::OnEraseDrcMarkersClick( wxCommandEvent& event ) /* Delete the old ERC markers, over the whole hierarchy */ { - DeleteAllMarkers( MARQ_ERC ); + DeleteAllMarkers( MARK_ERC ); m_MessagesList->Clear(); m_Parent->DrawPanel->Refresh(); } @@ -216,3 +218,99 @@ void DIALOG_ERC::ReBuildMatrixPanel() m_Initialized = TRUE; } + + +/** Function DisplayERC_MarkersList + * read the schematic and display the list of ERC markers + */ +void DIALOG_ERC::DisplayERC_MarkersList() +{ + EDA_SheetList SheetList; + + for( DrawSheetPath* Sheet = SheetList.GetFirst(); Sheet != NULL; Sheet = SheetList.GetNext() ) + { + SCH_ITEM* DrawStruct = Sheet->LastDrawList(); + for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Next() ) + { + if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) + continue; + + /* Marqueur trouve */ + MARKER_SCH* Marker = (MARKER_SCH*) DrawStruct; + if( Marker->GetMarkerType() != MARK_ERC ) + continue; + + /* Display diag */ + wxString msg; + msg.Printf( _( "sheet %s (loc X=%f" ", Y=%f" "): %s\n" ), + Sheet->PathHumanReadable().GetData(), + (float) Marker->m_Pos.x / 1000, (float) Marker->m_Pos.y / 1000, + Marker->GetErrorText().GetData() ); + m_MessagesList->AppendText( msg ); + } + } +} + + +/**************************************************************/ +void DIALOG_ERC::ResetDefaultERCDiag( wxCommandEvent& event ) +/**************************************************************/ + +/* Remet aux valeurs par defaut la matrice de diagnostic + */ +{ + memcpy( DiagErc, DefaultDiagErc, sizeof(DiagErc) ); + ReBuildMatrixPanel(); +} + + +/************************************************************/ +void DIALOG_ERC::ChangeErrorLevel( wxCommandEvent& event ) +/************************************************************/ + +/* Change the error level for the pressed button, on the matrix table + */ +{ + int id, level, ii, x, y; + wxBitmapButton* Butt; + const char** new_bitmap_xpm = NULL; + wxPoint pos; + + id = event.GetId(); + ii = id - ID_MATRIX_0; + Butt = (wxBitmapButton*) event.GetEventObject(); + pos = Butt->GetPosition(); + + x = ii / PIN_NMAX; y = ii % PIN_NMAX; + + level = DiagErc[y][x]; + + switch( level ) + { + case OK: + level = WAR; + new_bitmap_xpm = warning_xpm; + break; + + case WAR: + level = ERR; + new_bitmap_xpm = error_xpm; + break; + + case ERR: + level = OK; + new_bitmap_xpm = erc_green_xpm; + break; + } + + if( new_bitmap_xpm ) + { + delete Butt; + Butt = new wxBitmapButton( m_PanelERCOptions, id, + wxBitmap( new_bitmap_xpm ), pos ); + + m_ButtonList[y][x] = Butt; + DiagErc[y][x] = DiagErc[x][y] = level; + } +} + diff --git a/eeschema/dialog_erc.h b/eeschema/dialog_erc.h index 8df2ea316a..5af6e8514d 100644 --- a/eeschema/dialog_erc.h +++ b/eeschema/dialog_erc.h @@ -20,12 +20,6 @@ extern const wxChar* CommentERC_V[]; /* Control identifiers */ #define ID_MATRIX_0 1800 -#define OK 0 -#define WAR 1 -#define ERR 2 -#define UNC 3 - - /*! * DIALOG_ERC class declaration */ diff --git a/eeschema/eecreate.cpp b/eeschema/eecreate.cpp deleted file mode 100644 index c9b8b2520c..0000000000 --- a/eeschema/eecreate.cpp +++ /dev/null @@ -1,546 +0,0 @@ -/*********************************************************/ -/* Modules de creations de Traits, Wires, Bus, Junctions */ -/*********************************************************/ - -#include "fctsys.h" -#include "gr_basic.h" -#include "common.h" -#include "confirm.h" - -#include "program.h" -#include "libcmp.h" -#include "general.h" -#include "protos.h" - -/* Routines Locales */ -static void Polyline_in_Ghost( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ); -static void Segment_in_Ghost( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ); -static void ExitTrace( WinEDA_DrawFrame* frame, wxDC* DC ); -static bool IsTerminalPoint( SCH_SCREEN* screen, const wxPoint& pos, int layer ); - - -/*************************************************************/ -void WinEDA_SchematicFrame::BeginSegment( wxDC* DC, int type ) -/*************************************************************/ - -/* Routine de Trace de segments ( WIRES, BUS ) pour lesquels chaque segment - * est une structure. - */ -// NOT USED!!!@!@! -{ - DrawSegmentStruct* oldsegment, * newsegment; - wxPoint pos = GetScreen()->m_Curseur; - - if( GetScreen()->GetCurItem() - && (GetScreen()->GetCurItem()->m_Flags == 0) ) - GetScreen()->SetCurItem( NULL ); - - if( GetScreen()->GetCurItem() ) - { - switch( GetScreen()->GetCurItem()->Type() ) - { - case DRAW_SEGMENT_STRUCT_TYPE: - case DRAW_POLYLINE_STRUCT_TYPE: - break; - - default: - return; - } - } - - oldsegment = newsegment = - (DrawSegmentStruct*) GetScreen()->GetCurItem(); - - if( !newsegment ) /* 1er point : creation de la 1ere structure */ - { - switch( type ) - { - default: - newsegment = new DrawSegmentStruct( pos, LAYER_NOTES ); - break; - - case LAYER_WIRE: - newsegment = new DrawSegmentStruct( pos, LAYER_WIRE ); - if( LocatePinEnd( GetScreen()->EEDrawList, pos ) ) - newsegment->m_StartIsDangling = FALSE; - break; - - case LAYER_BUS: - newsegment = new DrawSegmentStruct( pos, LAYER_BUS ); - break; - } - - newsegment->m_Flags = IS_NEW; - GetScreen()->SetCurItem( newsegment ); - GetScreen()->ManageCurseur = Segment_in_Ghost; - GetScreen()->ForceCloseManageCurseur = ExitTrace; - g_ItemToRepeat = NULL; - } - else /* Trace en cours: Placement d'un point supplementaire */ - { - if( (oldsegment->m_Start.x == oldsegment->m_End.x) - && (oldsegment->m_Start.y == oldsegment->m_End.y) ) /* Structure inutile */ - return; - GetScreen()->ManageCurseur( DrawPanel, DC, FALSE ); - oldsegment->m_EndIsDangling = FALSE; - - /* Creation du segment suivant ou fin de trac� si point sur pin, jonction ...*/ - if( IsTerminalPoint( GetScreen(), oldsegment->m_End, oldsegment->m_Layer ) ) - { - EndSegment( DC ); return; - } - - /* Placement en liste generale */ - oldsegment->Pnext = GetScreen()->EEDrawList; - g_ItemToRepeat = GetScreen()->EEDrawList = oldsegment; - GetScreen()->CursorOff( DrawPanel, DC ); // Erase schematic cursor - RedrawOneStruct( DrawPanel, DC, oldsegment, GR_DEFAULT_DRAWMODE ); - GetScreen()->CursorOn( DrawPanel, DC ); // Display schematic cursor - - /* Creation du segment suivant */ - newsegment = oldsegment->GenCopy(); - newsegment->m_Start = oldsegment->m_End; - newsegment->m_End = pos; - oldsegment->m_Flags = 0; - newsegment->m_Flags = IS_NEW; - GetScreen()->SetCurItem( newsegment ); - GetScreen()->ManageCurseur( DrawPanel, DC, FALSE ); - newsegment->m_StartIsDangling = FALSE; - newsegment->m_EndIsDangling = TRUE; - } -} - - -/*************************************************************/ -/* Routine de fin de trace d'une struct segment (Wire, Bus */ -/*************************************************************/ -void WinEDA_SchematicFrame::EndSegment( wxDC* DC ) -{ - DrawSegmentStruct* segment = (DrawSegmentStruct*) GetScreen()->GetCurItem(); - - if( GetScreen()->ManageCurseur == NULL ) - return; - if( segment == NULL ) - return; - if( (segment->m_Flags & IS_NEW) == 0 ) - return; - - if( (segment->m_Start.x == segment->m_End.x) - && (segment->m_Start.y == segment->m_End.y) )/* Structure inutile */ - { - EraseStruct( segment, (SCH_SCREEN*) GetScreen() ); - segment = NULL; - } - else - { - /* Placement en liste generale */ - GetScreen()->ManageCurseur( DrawPanel, DC, FALSE ); - segment->Pnext = GetScreen()->EEDrawList; - g_ItemToRepeat = GetScreen()->EEDrawList = segment; - segment->m_Flags = 0; - } - - /* Fin de trace */ - GetScreen()->ManageCurseur = NULL; - GetScreen()->ForceCloseManageCurseur = NULL; - GetScreen()->SetCurItem( NULL ); - - TestDanglingEnds( GetScreen()->EEDrawList, DC ); - SetFlagModify( GetScreen() ); - if( segment ) - { - GetScreen()->CursorOff( DrawPanel, DC ); // Erase schematic cursor - RedrawOneStruct( DrawPanel, DC, segment, GR_DEFAULT_DRAWMODE ); - GetScreen()->CursorOn( DrawPanel, DC ); // Display schematic cursor - } -} - - -/****************************************************************************/ -static void Segment_in_Ghost( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) -/****************************************************************************/ - -/* Dessin du Segment Fantome lors des deplacements du curseur - */ -{ - DrawSegmentStruct* segment = - (DrawSegmentStruct*) panel->m_Parent->GetScreen()->GetCurItem(); - wxPoint endpos; - int color; - - if( segment == NULL ) - return; - - color = ReturnLayerColor( segment->m_Layer ) ^ HIGHT_LIGHT_FLAG; - - endpos = panel->m_Parent->GetScreen()->m_Curseur; - - if( g_HVLines ) /* Coerce the line to vertical or horizontal one: */ - { - if( ABS( endpos.x - segment->m_Start.x ) < ABS( endpos.y - segment->m_Start.y ) ) - endpos.x = segment->m_Start.x; - else - endpos.y = segment->m_Start.y; - } - - if( erase ) // Redraw if segment lengtht != 0 - { - if( (segment->m_Start.x != segment->m_End.x) - || (segment->m_Start.y != segment->m_End.y) ) - RedrawOneStruct( panel, DC, segment, XOR_MODE, color ); - } - segment->m_End = endpos; - - // Redraw if segment lengtht != 0 - - if( (segment->m_Start.x != segment->m_End.x) - || (segment->m_Start.y != segment->m_End.y) ) - RedrawOneStruct( panel, DC, segment, XOR_MODE, color ); -} - - -/*****************************************************************************/ -static void Polyline_in_Ghost( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) -/*****************************************************************************/ - -/* Dessin du du Polyline Fantome lors des deplacements du curseur - */ -{ - DrawPolylineStruct* NewPoly = - (DrawPolylineStruct*) panel->m_Parent->GetScreen()->GetCurItem(); - int color; - wxPoint endpos; - - endpos = panel->m_Parent->GetScreen()->m_Curseur; - color = ReturnLayerColor( NewPoly->m_Layer ); - - GRSetDrawMode( DC, XOR_MODE ); - - if( g_HVLines ) - { - /* Coerce the line to vertical or horizontal one: */ - if( ABS( endpos.x - NewPoly->m_Points[NewPoly->m_NumOfPoints * 2 - 2] ) < - ABS( endpos.y - NewPoly->m_Points[NewPoly->m_NumOfPoints * 2 - 1] ) ) - endpos.x = NewPoly->m_Points[NewPoly->m_NumOfPoints * 2 - 2]; - else - endpos.y = NewPoly->m_Points[NewPoly->m_NumOfPoints * 2 - 1]; - } - - NewPoly->m_NumOfPoints++; - if( erase ) - RedrawOneStruct( panel, DC, NewPoly, XOR_MODE, color ); - - NewPoly->m_Points[NewPoly->m_NumOfPoints * 2 - 2] = endpos.x; - NewPoly->m_Points[NewPoly->m_NumOfPoints * 2 - 1] = endpos.y; - RedrawOneStruct( panel, DC, NewPoly, XOR_MODE, color ); - NewPoly->m_NumOfPoints--; -} - - -/**********************************************************/ -void WinEDA_SchematicFrame::DeleteCurrentSegment( wxDC* DC ) -/**********************************************************/ - -/* - * Routine effacant le dernier trait trace, ou l'element pointe par la souris - */ -{ - g_ItemToRepeat = NULL; - - if( (GetScreen()->GetCurItem() == NULL) - || ( (GetScreen()->GetCurItem()->m_Flags & IS_NEW) == 0 ) ) - { - return; - } - - /* Trace en cours: annulation */ - if( GetScreen()->GetCurItem()->Type() == DRAW_POLYLINE_STRUCT_TYPE ) - { - Polyline_in_Ghost( DrawPanel, DC, FALSE ); /* Effacement du trace en cours */ - } - else - { - Segment_in_Ghost( DrawPanel, DC, FALSE ); /* Effacement du trace en cours */ - } - - EraseStruct( GetScreen()->GetCurItem(), GetScreen() ); - GetScreen()->ManageCurseur = NULL; - GetScreen()->SetCurItem( NULL ); -} - - -/***************************************************************************/ -EDA_BaseStruct* WinEDA_SchematicFrame::CreateNewJunctionStruct( wxDC* DC ) -/***************************************************************************/ - -/* Routine to create new connection struct. - */ -{ - DrawJunctionStruct* NewConnect; - - NewConnect = new DrawJunctionStruct( GetScreen()->m_Curseur ); - - g_ItemToRepeat = NewConnect; - - GetScreen()->CursorOff( DrawPanel, DC ); // Erase schematic cursor - RedrawOneStruct( DrawPanel, DC, NewConnect, GR_DEFAULT_DRAWMODE ); - GetScreen()->CursorOn( DrawPanel, DC ); // Display schematic cursor - - NewConnect->Pnext = GetScreen()->EEDrawList; - GetScreen()->EEDrawList = NewConnect; - SetFlagModify( GetScreen() ); - return NewConnect; -} - - -/*********************************************************************************/ -DrawNoConnectStruct * WinEDA_SchematicFrame::CreateNewNoConnectStruct( wxDC* DC ) -/*********************************************************************************/ - -/*Routine to create new NoConnect struct. ( Symbole de Non Connexion) - */ -{ - DrawNoConnectStruct* NewNoConnect; - - NewNoConnect = new DrawNoConnectStruct( GetScreen()->m_Curseur ); - g_ItemToRepeat = NewNoConnect; - - GetScreen()->CursorOff( DrawPanel, DC ); // Erase schematic cursor - RedrawOneStruct( DrawPanel, DC, NewNoConnect, GR_DEFAULT_DRAWMODE ); - GetScreen()->CursorOn( DrawPanel, DC ); // Display schematic cursor - - NewNoConnect->Pnext = GetScreen()->EEDrawList; - GetScreen()->EEDrawList = NewNoConnect; - SetFlagModify( GetScreen() ); - return NewNoConnect; -} - - -/**********************************************************/ -static void ExitTrace( WinEDA_DrawFrame* frame, wxDC* DC ) -/**********************************************************/ -/* Routine de sortie des menus de trace */ -{ - BASE_SCREEN* Screen = frame->GetScreen(); - - if( Screen->GetCurItem() ) /* trace en cours */ - { - Screen->ManageCurseur( frame->DrawPanel, DC, FALSE ); - Screen->ManageCurseur = NULL; - Screen->ForceCloseManageCurseur = NULL; - EraseStruct( Screen->GetCurItem(), (SCH_SCREEN*) Screen ); - Screen->SetCurItem( NULL ); - return; - } - else - g_ItemToRepeat = NULL; // Fin de commande generale -} - - -/***************************************************/ -void WinEDA_SchematicFrame::RepeatDrawItem( wxDC* DC ) -/***************************************************/ - -/* Routine de recopie du dernier element dessine - * Les elements duplicables sont - * fils, bus, traits, textes, labels - * Les labels termines par un nombre seront incrementes - */ -{ - char Line[256]; - int ox = 0, oy = 0; - - if( g_ItemToRepeat == NULL ) - return; - - switch( g_ItemToRepeat->Type() ) - { - case DRAW_JUNCTION_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ( (DrawJunctionStruct*) g_ItemToRepeat ) - g_ItemToRepeat = STRUCT->GenCopy(); - STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x; - STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y; - break; - - case DRAW_NOCONNECT_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ( (DrawNoConnectStruct*) g_ItemToRepeat ) - g_ItemToRepeat = STRUCT->GenCopy(); - STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x; - STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y; - break; - - case TYPE_SCH_TEXT: - #undef STRUCT - #define STRUCT ( (SCH_TEXT*) g_ItemToRepeat ) - g_ItemToRepeat = STRUCT->GenCopy(); - STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x; - STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y; - /*** Increment du numero de label ***/ - strcpy( Line, STRUCT->GetText() ); - IncrementLabelMember( Line ); - STRUCT->m_Text = Line; - break; - - - case TYPE_SCH_LABEL: - case TYPE_SCH_GLOBALLABEL: - case TYPE_SCH_HIERLABEL: - #undef STRUCT - #define STRUCT ( (SCH_LABEL*) g_ItemToRepeat ) - g_ItemToRepeat = STRUCT->GenCopy(); - STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x; - STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y; - /*** Increment du numero de label ***/ - strcpy( Line, STRUCT->GetText() ); - IncrementLabelMember( Line ); - STRUCT->m_Text = Line; - break; - - case DRAW_SEGMENT_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ( (DrawSegmentStruct*) g_ItemToRepeat ) - g_ItemToRepeat = STRUCT->GenCopy(); - STRUCT->m_Start.x += g_RepeatStep.x; ox = STRUCT->m_Start.x; - STRUCT->m_Start.y += g_RepeatStep.y; oy = STRUCT->m_Start.y; - STRUCT->m_End.x += g_RepeatStep.x; - STRUCT->m_End.y += g_RepeatStep.y; - break; - - case DRAW_RACCORD_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ( (DrawRaccordStruct*) g_ItemToRepeat ) - g_ItemToRepeat = STRUCT->GenCopy(); - STRUCT->m_Pos.x += g_RepeatStep.x; ox = STRUCT->m_Pos.x; - STRUCT->m_Pos.y += g_RepeatStep.y; oy = STRUCT->m_Pos.y; - break; - - default: - g_ItemToRepeat = NULL; - DisplayError( this, "Repeat Type Error", 10 ); - break; - } - - if( g_ItemToRepeat ) - { - g_ItemToRepeat->Pnext = GetScreen()->EEDrawList; - GetScreen()->EEDrawList = g_ItemToRepeat; - TestDanglingEnds( GetScreen()->EEDrawList, NULL ); - RedrawOneStruct( DrawPanel, DC, g_ItemToRepeat, GR_DEFAULT_DRAWMODE ); - -// GetScreen()->Curseur.x = ox; GetScreen()->Curseur.x = oy; -// DrawPanel->MouseTo( DrawPanel->CursorScreenPosition() ); - } -} - - -/******************************************/ -void IncrementLabelMember( char* Line ) -/******************************************/ - -/* Routine incrementant les labels, c'est a dire pour les textes finissant - * par un nombre, ajoutant a ce nombre - */ -{ - char* strnum; - int ii; - - strnum = Line + strlen( Line ) - 1; - if( !isdigit( *strnum ) ) - return; - - while( (strnum >= Line) && isdigit( *strnum ) ) - strnum--; - - strnum++; /* pointe le debut de la chaine des digits */ - ii = atoi( strnum ) + g_RepeatDeltaLabel; - sprintf( strnum, "%d", ii ); -} - - -/***************************************************************************/ -static bool IsTerminalPoint( SCH_SCREEN* screen, const wxPoint& pos, int layer ) -/***************************************************************************/ - -/* Returne TRUE si pos est un point possible pour terminer automatiquement un - * segment, c'est a dire pour - * - type WIRE, si il y a - * - une jonction - * - ou une pin - * - ou une extr�mit� unique de fil - * - * - type BUS, si il y a - * - ou une extr�mit� unique de BUS - */ -{ - EDA_BaseStruct* item; - LibDrawPin* pin; - DrawLibItemStruct* LibItem = NULL; - Hierarchical_PIN_Sheet_Struct* pinsheet; - wxPoint itempos; - - switch( layer ) - { - case LAYER_BUS: - item = PickStruct( screen, BUSITEM ); - if( item ) - return TRUE; - pinsheet = LocateAnyPinSheet( pos, screen->EEDrawList ); - if( pinsheet && IsBusLabel( pinsheet->GetText() ) ) - { - itempos = pinsheet->m_Pos; - if( (itempos.x == pos.x) && (itempos.y == pos.y) ) - return TRUE; - } - break; - - case LAYER_NOTES: - item = PickStruct( screen, DRAWITEM ); - if( item ) - return TRUE; - break; - - case LAYER_WIRE: - item = PickStruct( screen, RACCORDITEM | JUNCTIONITEM ); - if( item ) - return TRUE; - - pin = LocateAnyPin( screen->EEDrawList, pos, &LibItem ); - if( pin && LibItem ) - { - // calcul de la position exacte du point de connexion de la pin, - // selon orientation du composant: - itempos = LibItem->GetScreenCoord( pin->m_Pos ); - itempos.x += LibItem->m_Pos.x; - itempos.y += LibItem->m_Pos.y; - if( (itempos.x == pos.x) && (itempos.y == pos.y) ) - return TRUE; - } - - item = PickStruct( screen, WIREITEM ); - if( item ) - return TRUE; - - item = PickStruct( screen, LABELITEM ); - if( item && (item->Type() != TYPE_SCH_TEXT) - && ( ( (SCH_GLOBALLABEL*) item )->m_Pos.x == pos.x ) - && ( ( (SCH_GLOBALLABEL*) item )->m_Pos.y == pos.y ) ) - return TRUE; - - pinsheet = LocateAnyPinSheet( pos, screen->EEDrawList ); - if( pinsheet && !IsBusLabel( pinsheet->GetText() ) ) - { - itempos = pinsheet->m_Pos; - if( (itempos.x == pos.x) && (itempos.y == pos.y) ) - return TRUE; - } - - break; - - default: - break; - } - - return FALSE; -} diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp index e053844a82..153234b5d4 100644 --- a/eeschema/erc.cpp +++ b/eeschema/erc.cpp @@ -3,10 +3,8 @@ /**************************************************/ #include "fctsys.h" -#include "gr_basic.h" #include "common.h" #include "class_drawpanel.h" -#include "confirm.h" #include "kicad_string.h" #include "gestfich.h" #include "appl_wxstruct.h" @@ -15,14 +13,17 @@ #include "libcmp.h" #include "general.h" #include "netlist.h" -#include "protos.h" #include "bitmaps.h" +#include "class_marker_sch.h" #include "dialog_erc.h" +#include "erc.h" -/* On teste - * 1 - conflits entre pins connectees ( ex: 2 sorties connectees ) - * 2 - les imperatifs minimaux ( 1 entree doit etre connectee a une sortie ) +#include "protos.h" + +/* ERC tests : + * 1 - conflicts between connected pins ( example: 2 connected outputs ) + * 2 - minimal connections requirements ( 1 input *must* be connected to an output, or a passive pin ) */ @@ -35,19 +36,41 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, ObjetNetListStruct* NetItemRef, ObjetNetListStruct* NetStart, int* NetNbItems, int* MinConnexion ); -static void TestLabel( WinEDA_DrawPanel* panel, +static void TestLabel( WinEDA_DrawPanel* panel, ObjetNetListStruct* NetItemRef, ObjetNetListStruct* StartNet ); -/* Variable locales */ +/* Local variables */ int WriteFichierERC = FALSE; -/* Tableau des types de conflit : +/* + * Electrical type of pins: + * PIN_INPUT = usual pin input: must be connected + * PIN_OUTPUT = usual output + * PIN_BIDI = input or output (like port for a microprocessor) + * PIN_TRISTATE = tris state bus pin + * PIN_PASSIVE = pin for passive components: must be connected, and can be connected to any pin + * PIN_UNSPECIFIED = unkown electrical properties: creates alway a warning when connected + * PIN_POWER_IN = power input (GND, VCC for ICs). Must be connected to a power output. + * PIN_POWER_OUT = output of a regulator: intended to be connected to power input pins + * PIN_OPENCOLLECTOR = pin type open collector + * PIN_OPENEMITTER = pin type open emitter + * PIN_NC = not connected (must be left open) + * + * Minimal requirements: + * All pins *must* be connected (except PIN_NC). + * When a pin is not connected in schematic, the user must place a "non connected" symbol to this pin. + * This ensures a forgotten connection will be detected. + */ + +/* Messages for conflicts : * PIN_INPUT, PIN_OUTPUT, PIN_BIDI, PIN_TRISTATE, PIN_PASSIVE, * PIN_UNSPECIFIED, PIN_POWER_IN, PIN_POWER_OUT, PIN_OPENCOLLECTOR, * PIN_OPENEMITTER, PIN_NC + * These messages are used to show the ERC matrix in ERC dialog */ +// Messages for matrix rows: const wxChar* CommentERC_H[] = { wxT( "Input Pin...." ), @@ -63,6 +86,8 @@ const wxChar* CommentERC_H[] = wxT( "No Conn......" ), NULL }; + +// Messages for matrix columns const wxChar* CommentERC_V[] = { wxT( "Input Pin" ), @@ -84,26 +109,27 @@ const wxChar* CommentERC_V[] = * Can be modified by ERC options. * at start up: must be loaded by DefaultDiagErc */ -int DiagErc[PIN_NMAX][PIN_NMAX]; -bool DiagErcTableInit; // go to TRUE after DiagErc init +int DiagErc[PIN_NMAX][PIN_NMAX]; +bool DiagErcTableInit; // go to TRUE after DiagErc init /* Default Look up table which gives the diag for a pair of connected pins * Same as DiagErc, but cannot be modified * Used to init or reset DiagErc */ 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 }, -/*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 }, -/* NC */ { WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR } +{ + /* 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 }, +/*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 }, +/* NC */ { WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR, WAR } }; @@ -123,7 +149,8 @@ int DefaultDiagErc[PIN_NMAX][PIN_NMAX] = * 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, 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 }, @@ -161,16 +188,16 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList ) ReAnnotatePowerSymbolsOnly(); if( m_Parent->CheckAnnotate( aMessagesList, false ) ) { - if ( aMessagesList ) + if( aMessagesList ) { - aMessagesList->AppendText( _( "Annotation Required!" ) ); - aMessagesList->AppendText( wxT("\n") ); + aMessagesList->AppendText( _( "Annotation Required!" ) ); + aMessagesList->AppendText( wxT( "\n" ) ); } return; } /* Erase all DRC markers */ - DeleteAllMarkers( MARQ_ERC ); + DeleteAllMarkers( MARK_ERC ); g_EESchemaVar.NbErrorErc = 0; g_EESchemaVar.NbWarningErc = 0; @@ -183,7 +210,7 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList ) bool ModifyWires; ModifyWires = Screen->SchematicCleanUp( NULL ); - /* if wire list has changed, delete Udo Redo list to avoid + /* if wire list has changed, delete Undo Redo list to avoid * pointers on deleted data problems */ if( ModifyWires ) Screen->ClearUndoRedoList(); @@ -213,11 +240,12 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList ) m_SheetName ) == 0 ) { /* Create a new marker type ERC error*/ - MARKER_SCH* Marker = - new MARKER_SCH( ( (DrawSheetStruct*) item_to_test )->m_Pos, - _( "Duplicate Sheet name" ) ); - - Marker->SetMarkerType( MARQ_ERC ); + MARKER_SCH* Marker = new MARKER_SCH(); + Marker->SetData( ERCE_DUPLICATE_SHEET_NAME, + ( (DrawSheetStruct*) item_to_test )->m_Pos, + _( "Duplicate Sheet name" ), + ( (DrawSheetStruct*) item_to_test )->m_Pos ); + Marker->SetMarkerType( MARK_ERC ); Marker->SetErrorLevel( ERR ); Marker->SetNext( Screen->EEDrawList ); Screen->EEDrawList = Marker; @@ -262,6 +290,7 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList ) case NET_PINLABEL: case NET_GLOBLABEL: case NET_GLOBBUSLABELMEMBER: + // These items do not create erc problems break; @@ -269,6 +298,7 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList ) case NET_HIERBUSLABELMEMBER: case NET_SHEETLABEL: case NET_SHEETBUSLABELMEMBER: + // ERC problems when pin sheets do not match hierachical labels. // Each pin sheet must match a hierachical label // Each hierachicallabel must match a pin sheet @@ -276,13 +306,15 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList ) break; case NET_NOCONNECT: + // ERC problems when a noconnect symbol is connected to more than one pin. MinConn = NET_NC; if( NetNbItems != 0 ) - Diagnose( m_Parent->DrawPanel,NetItemRef, NULL, MinConn, UNC ); + Diagnose( m_Parent->DrawPanel, NetItemRef, NULL, MinConn, UNC ); break; case NET_PIN: + // Look for ERC problems between pins: TestOthersItems( m_Parent->DrawPanel, NetItemRef, StartNet, &NetNbItems, &MinConn ); @@ -306,10 +338,10 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList ) m_LastWarningCount->SetLabel( num ); // Display diags: - DisplayERC_MarkersList( ); + DisplayERC_MarkersList(); - if ( m_TotalErrCount == 0 ) - m_MessagesList->AppendText( _("ERC finished, no error\n")); + if( m_TotalErrCount == 0 ) + m_MessagesList->AppendText( _( "ERC finished, no error\n" ) ); // Display new markers: m_Parent->DrawPanel->Refresh(); @@ -337,98 +369,6 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList ) } -/** Function DisplayERC_MarkersList - * read the schematic and display the list of ERC markers - */ -void DIALOG_ERC::DisplayERC_MarkersList( ) -{ - EDA_SheetList SheetList; - for( DrawSheetPath * Sheet = SheetList.GetFirst(); Sheet != NULL; Sheet = SheetList.GetNext() ) - { - SCH_ITEM * DrawStruct = Sheet->LastDrawList(); - for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Next() ) - { - if( DrawStruct->Type() != DRAW_MARKER_STRUCT_TYPE ) - continue; - - /* Marqueur trouve */ - MARKER_SCH* Marker = (MARKER_SCH*) DrawStruct; - if( Marker->GetMarkerType() != MARQ_ERC ) - continue; - - /* Display diag */ - wxString msg; - msg.Printf(_("sheet %s: %s\n"), - Sheet->PathHumanReadable().GetData(), - Marker->GetErrorText().GetData() ); - m_MessagesList->AppendText( msg ); - } - } -} - -/**************************************************************/ -void DIALOG_ERC::ResetDefaultERCDiag( wxCommandEvent& event ) -/**************************************************************/ - -/* Remet aux valeurs par defaut la matrice de diagnostic - */ -{ - memcpy( DiagErc, DefaultDiagErc, sizeof(DiagErc) ); - ReBuildMatrixPanel(); -} - - -/************************************************************/ -void DIALOG_ERC::ChangeErrorLevel( wxCommandEvent& event ) -/************************************************************/ - -/* Change the error level for the pressed button, on the matrix table - */ -{ - int id, level, ii, x, y; - wxBitmapButton* Butt; - const char** new_bitmap_xpm = NULL; - wxPoint pos; - - id = event.GetId(); - ii = id - ID_MATRIX_0; - Butt = (wxBitmapButton*) event.GetEventObject(); - pos = Butt->GetPosition(); - - x = ii / PIN_NMAX; y = ii % PIN_NMAX; - - level = DiagErc[y][x]; - - switch( level ) - { - case OK: - level = WAR; - new_bitmap_xpm = warning_xpm; - break; - - case WAR: - level = ERR; - new_bitmap_xpm = error_xpm; - break; - - case ERR: - level = OK; - new_bitmap_xpm = erc_green_xpm; - break; - } - - if( new_bitmap_xpm ) - { - delete Butt; - Butt = new wxBitmapButton( m_PanelERCOptions, id, - wxBitmap( new_bitmap_xpm ), pos ); - - m_ButtonList[y][x] = Butt; - DiagErc[y][x] = DiagErc[x][y] = level; - } -} - - /********************************************************/ static void Diagnose( WinEDA_DrawPanel* aPanel, ObjetNetListStruct* aNetItemRef, @@ -442,17 +382,17 @@ static void Diagnose( WinEDA_DrawPanel* aPanel, */ { MARKER_SCH* Marker = NULL; - wxString DiagLevel; - SCH_SCREEN* screen; - int ii, jj; + wxString DiagLevel; + SCH_SCREEN* screen; + int ii, jj; if( aDiag == OK ) return; /* Creation du nouveau marqueur type Erreur ERC */ - Marker = new MARKER_SCH( aNetItemRef->m_Start, wxEmptyString ); + Marker = new MARKER_SCH(); - Marker->SetMarkerType( MARQ_ERC ); + Marker->SetMarkerType( MARK_ERC ); Marker->SetErrorLevel( WAR ); screen = aNetItemRef->m_SheetList.LastScreen(); Marker->SetNext( screen->EEDrawList ); @@ -466,56 +406,65 @@ static void Diagnose( WinEDA_DrawPanel* aPanel, if( (aNetItemRef->m_Type == NET_HIERLABEL) || (aNetItemRef->m_Type == NET_HIERBUSLABELMEMBER) ) { - msg.Printf( _( "Warning HLabel %s not connected to SheetLabel" ), - aNetItemRef->m_Label->GetData() ); + msg.Printf( _( "HLabel %s not connected to SheetLabel" ), + aNetItemRef->m_Label->GetData() ); } else - msg.Printf( _( "Warning SheetLabel %s not connected to HLabel" ), - aNetItemRef->m_Label->GetData() ); + msg.Printf( _( "SheetLabel %s not connected to HLabel" ), + aNetItemRef->m_Label->GetData() ); - Marker->SetErrorText(msg); + Marker->SetData( ERCE_HIERACHICAL_LABEL, aNetItemRef->m_Start, msg, aNetItemRef->m_Start ); return; } ii = aNetItemRef->m_ElectricalType; wxString string_pinnum, cmp_ref; - char ascii_buf[5]; + char ascii_buf[5]; ascii_buf[4] = 0; memcpy( ascii_buf, &aNetItemRef->m_PinNum, 4 ); string_pinnum = CONV_FROM_UTF8( ascii_buf ); - cmp_ref = wxT("?"); - if ( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link ) - cmp_ref = ((SCH_COMPONENT*)aNetItemRef->m_Link)->GetRef( &aNetItemRef->m_SheetList ); + cmp_ref = wxT( "?" ); + if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link ) + cmp_ref = ( (SCH_COMPONENT*) aNetItemRef->m_Link )->GetRef( &aNetItemRef->m_SheetList ); if( aNetItemTst == NULL ) { if( aMinConn == NOC ) /* 1 seul element dans le net */ { - msg.Printf( _( "Warning Cmp %s, Pin %s (%s) Unconnected" ), - cmp_ref.GetData(), string_pinnum.GetData(), MsgPinElectricType[ii] ); - Marker->SetErrorText(msg); + msg.Printf( _( "Cmp %s, Pin %s (%s) Unconnected" ), + cmp_ref.GetData(), string_pinnum.GetData(), MsgPinElectricType[ii] ); + Marker->SetData( ERCE_PIN_NOT_CONNECTED, + aNetItemRef->m_Start, + msg, + aNetItemRef->m_Start ); return; } if( aMinConn == NOD ) /* pas de pilotage du net */ { - if ( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link ) - cmp_ref = ((SCH_COMPONENT*)aNetItemRef->m_Link)->GetRef( &aNetItemRef->m_SheetList ); + if( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link ) + cmp_ref = ( (SCH_COMPONENT*) aNetItemRef->m_Link )->GetRef( + &aNetItemRef->m_SheetList ); msg.Printf( - _( "Warning Cmp %s, Pin %s (%s) not driven (Net %d)" ), + _( "Cmp %s, Pin %s (%s) not driven (Net %d)" ), cmp_ref.GetData(), string_pinnum.GetData(), MsgPinElectricType[ii], aNetItemRef->GetNet() ); - Marker->SetErrorText(msg); + Marker->SetData( ERCE_PIN_NOT_DRIVEN, + aNetItemRef->m_Start, + msg, + aNetItemRef->m_Start ); return; } if( aDiag == UNC ) { msg.Printf( - _( "Warning More than 1 Pin connected to UnConnect symbol @X=%f"", Y=%f""" ), - (float)Marker->GetPos().x/1000, (float)Marker->GetPos().y/1000); - Marker->SetErrorText(msg); + _( "More than 1 Pin connected to UnConnect symbol" ) ); + Marker->SetData( ERCE_NOCONNECT_CONNECTED, + aNetItemRef->m_Start, + msg, + aNetItemRef->m_Start ); return; } } @@ -524,25 +473,30 @@ static void Diagnose( WinEDA_DrawPanel* aPanel, { jj = aNetItemTst->m_ElectricalType; DiagLevel = _( "Warning" ); + int severity = ERCE_PIN_TO_PIN_WARNING; if( aDiag == ERR ) { DiagLevel = _( "Error" ); Marker->SetErrorLevel( ERR ); g_EESchemaVar.NbWarningErc--; + severity = ERCE_PIN_TO_PIN_ERROR; } wxString alt_string_pinnum, alt_cmp; memcpy( ascii_buf, &aNetItemTst->m_PinNum, 4 ); alt_string_pinnum = CONV_FROM_UTF8( ascii_buf ); - alt_cmp = wxT("?"); - if ( aNetItemTst->m_Type == NET_PIN && aNetItemTst->m_Link ) - alt_cmp = ((SCH_COMPONENT*)aNetItemTst->m_Link)->GetRef( &aNetItemTst->m_SheetList ); - msg.Printf( _("%s: Cmp %s, Pin %s (%s) connected to Cmp %s, Pin %s (%s) (net %d)" ), - DiagLevel.GetData(), - cmp_ref.GetData(), string_pinnum.GetData(), MsgPinElectricType[ii], - alt_cmp.GetData(), alt_string_pinnum.GetData(),MsgPinElectricType[jj], - aNetItemRef->GetNet() ); - Marker->SetErrorText(msg); + alt_cmp = wxT( "?" ); + if( aNetItemTst->m_Type == NET_PIN && aNetItemTst->m_Link ) + alt_cmp = ( (SCH_COMPONENT*) aNetItemTst->m_Link )->GetRef( &aNetItemTst->m_SheetList ); + msg.Printf( _( "%s: Cmp %s, Pin %s (%s) connected to Cmp %s, Pin %s (%s) (net %d)" ), + DiagLevel.GetData(), + cmp_ref.GetData(), string_pinnum.GetData(), MsgPinElectricType[ii], + alt_cmp.GetData(), alt_string_pinnum.GetData(), MsgPinElectricType[jj], + aNetItemRef->GetNet() ); + Marker->SetData( severity, + aNetItemRef->m_Start, + msg, + aNetItemRef->m_Start ); } } @@ -581,7 +535,8 @@ static void TestOthersItems( WinEDA_DrawPanel* panel, /* Est - on toujours dans le meme net ? */ if( (NetItemTst >= Lim) // fin de liste (donc fin de net) || ( NetItemRef->GetNet() != NetItemTst->GetNet() ) ) // fin de net - { /* Fin de netcode trouve: Tst connexion minimum */ + { + /* Fin de netcode trouve: Tst connexion minimum */ if( (*MinConnexion < NET_NC ) && (local_minconn < NET_NC ) ) /* Not connected or not driven pin */ { @@ -644,12 +599,12 @@ static bool WriteDiagnosticERC( const wxString& FullFileName ) /* Create the Diagnostic file (.erc file) */ { - SCH_ITEM* DrawStruct; - MARKER_SCH* Marker; - char Line[256]; - static FILE* OutErc; - DrawSheetPath* Sheet; - wxString msg; + SCH_ITEM* DrawStruct; + MARKER_SCH* Marker; + char Line[1024]; + static FILE* OutErc; + DrawSheetPath* Sheet; + wxString msg; if( ( OutErc = wxFopen( FullFileName, wxT( "wt" ) ) ) == NULL ) return FALSE; @@ -683,7 +638,7 @@ static bool WriteDiagnosticERC( const wxString& FullFileName ) /* Marqueur trouve */ Marker = (MARKER_SCH*) DrawStruct; - if( Marker->GetMarkerType() != MARQ_ERC ) + if( Marker->GetMarkerType() != MARK_ERC ) continue; /* Write diag marqueur */ @@ -704,7 +659,7 @@ static bool WriteDiagnosticERC( const wxString& FullFileName ) } -bool TestLabel_( ObjetNetListStruct* a, ObjetNetListStruct* b ) +static bool IsLabelsConnected( ObjetNetListStruct* a, ObjetNetListStruct* b ) { int at = a->m_Type; int bt = b->m_Type; @@ -722,7 +677,9 @@ bool TestLabel_( ObjetNetListStruct* a, ObjetNetListStruct* b ) /***********************************************************************/ -void TestLabel( WinEDA_DrawPanel* panel, ObjetNetListStruct* NetItemRef, ObjetNetListStruct* StartNet ) +void TestLabel( WinEDA_DrawPanel* panel, + ObjetNetListStruct* NetItemRef, + ObjetNetListStruct* StartNet ) /***********************************************************************/ /* Routine controlant qu'un sheetLabel est bien connecte a un Glabel de la @@ -755,11 +712,11 @@ void TestLabel( WinEDA_DrawPanel* panel, ObjetNetListStruct* NetItemRef, ObjetNe } return; } - if( TestLabel_( NetItemRef, NetItemTst ) ) + if( IsLabelsConnected( NetItemRef, NetItemTst ) ) erc = 0; //same thing, different order. - if( TestLabel_( NetItemTst, NetItemRef ) ) + if( IsLabelsConnected( NetItemTst, NetItemRef ) ) erc = 0; } } diff --git a/eeschema/erc.h b/eeschema/erc.h new file mode 100644 index 0000000000..c5bc64d4a8 --- /dev/null +++ b/eeschema/erc.h @@ -0,0 +1,50 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2009 Jea-Pierre.Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 2009 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 _ERC_H +#define _ERC_H + +/* For ERC markers: error types (used in diags, and to set the color): +*/ +enum errortype +{ + OK = 0, + WAR, // Error: severity = warning + ERR, // Error: severity = error + UNC // Error: unconnected pin +}; + + +/// DRC error codes: +#define ERCE_UNSPECIFIED 0 +#define ERCE_DUPLICATE_SHEET_NAME 1 //duplicate sheet names within a given sheet +#define ERCE_PIN_NOT_CONNECTED 2 //pin not connected and not no connect symbol +#define ERCE_PIN_NOT_DRIVEN 3 //pin connected to some others pins but no pin to drive it +#define ERCE_PIN_TO_PIN_WARNING 4 //pin connected to an other pin: warning level +#define ERCE_PIN_TO_PIN_ERROR 5 //pin connected to an other pin: error level +#define ERCE_HIERACHICAL_LABEL 6 //mismatch between hierarchical labels and pins sheets +#define ERCE_NOCONNECT_CONNECTED 7 //a no connect symbol is connected to more than 1 pin + + +#endif // _ERC_H diff --git a/eeschema/find.cpp b/eeschema/find.cpp index c5e5a2a38e..b18d023afa 100644 --- a/eeschema/find.cpp +++ b/eeschema/find.cpp @@ -19,6 +19,7 @@ #include "program.h" #include "libcmp.h" #include "general.h" +#include "class_marker_sch.h" /* Variables Locales */ static int s_ItemsCount, s_MarkerCount; diff --git a/eeschema/load_one_schematic_file.cpp b/eeschema/load_one_schematic_file.cpp index 1a33239b98..5814899151 100644 --- a/eeschema/load_one_schematic_file.cpp +++ b/eeschema/load_one_schematic_file.cpp @@ -9,6 +9,7 @@ #include "libcmp.h" #include "general.h" #include "protos.h" +#include "class_marker_sch.h" /* in read_from_file_schematic_items_description.cpp */ SCH_ITEM* ReadTextDescr( FILE* aFile, wxString& aMsgDiag, char* aLine, @@ -339,8 +340,8 @@ at line %d, aborted" ), ii = ReadDelimitedText( BufLine, Line, 256 ); int type = (TypeMarker) ( (Name1[0] & 255) - 'A' ); - if( type < 0 ) - type = MARQ_UNSPEC; + if( type < 0 || type >= MARK_NMAX) + type = MARK_UNSPEC; Marker->SetMarkerType( type ); if( ii ) Marker->SetErrorText( CONV_FROM_UTF8( BufLine ) ); diff --git a/eeschema/locate.cpp b/eeschema/locate.cpp index aaca166f53..a26ef7ca33 100644 --- a/eeschema/locate.cpp +++ b/eeschema/locate.cpp @@ -12,6 +12,7 @@ #include "trigo.h" #include "macros.h" #include "class_drawpickedstruct.h" +#include "class_marker_sch.h" #include "protos.h" diff --git a/eeschema/schematic_undo_redo.cpp b/eeschema/schematic_undo_redo.cpp index 4892bbf875..52577f3133 100644 --- a/eeschema/schematic_undo_redo.cpp +++ b/eeschema/schematic_undo_redo.cpp @@ -13,6 +13,7 @@ #include "general.h" #include "id.h" #include "protos.h" +#include "class_marker_sch.h" /* Functions to undo and redo edit commands. * commmands to undo are in CurrentScreen->m_UndoList diff --git a/include/class_marker_base.h b/include/class_marker_base.h index 2891fefd3d..e2c3715d63 100644 --- a/include/class_marker_base.h +++ b/include/class_marker_base.h @@ -12,11 +12,11 @@ class MARKER_BASE public: wxPoint m_Pos; ///< position of the marker protected: - char* m_Bitmap; ///< Shape (bitmap) + std::vector m_Corners; ///< Corner list for shape definition (a polygon) int m_MarkerType; ///< Can be used as a flag - int m_Color; ///< color - wxSize m_Size; ///< Size of the graphic symbol - + EDA_Colors m_Color; ///< color + wxSize m_Size; ///< Size of the graphic symbol, used for Hit Tests + int m_ScalingFactor; ///< Scaling factor for m_Size and m_Corners (can set the physical size DRC_ITEM m_drc; void init(); @@ -65,13 +65,21 @@ public: } + /** Function SetColor + * Set the color of this marker + */ + void SetColor(EDA_Colors aColor ) + { + m_Color = aColor; + } + /** Function to set/get error levels (warning, fatal ..) * this value is stored in m_MarkerType */ void SetErrorLevel(int aErrorLevel ) { - m_MarkerType &= 0xFF00; - m_MarkerType &= 0xFF; + m_MarkerType &= ~0xFF00; + aErrorLevel &= 0xFF; m_MarkerType |= aErrorLevel << 8; } @@ -86,7 +94,7 @@ public: */ void SetMarkerType(int aMarkerType ) { - m_MarkerType &= 0xFF; + m_MarkerType &= ~0xFF; aMarkerType &= 0xFF; m_MarkerType |= aMarkerType; } diff --git a/pcbnew/class_marker.cpp b/pcbnew/class_marker.cpp index 1d44d873a2..b365220dab 100644 --- a/pcbnew/class_marker.cpp +++ b/pcbnew/class_marker.cpp @@ -12,7 +12,7 @@ #include "pcbnew.h" #include "class_marker.h" - +#define SCALING_FACTOR 30 // Adjust the actual size of markers, when using default shape /*******************/ /* Classe MARKER */ @@ -22,6 +22,8 @@ MARKER::MARKER( BOARD_ITEM* aParent ) : BOARD_ITEM( aParent, TYPE_MARKER ), MARKER_BASE( ) { + m_Color = WHITE; + m_ScalingFactor = SCALING_FACTOR; } @@ -32,6 +34,8 @@ MARKER::MARKER( int aErrorCode, const wxPoint& aMarkerPos, MARKER_BASE( aErrorCode, aMarkerPos, aText, aPos, bText, bPos ) { + m_Color = WHITE; + m_ScalingFactor = SCALING_FACTOR; } MARKER::MARKER( int aErrorCode, const wxPoint& aMarkerPos, @@ -39,6 +43,8 @@ MARKER::MARKER( int aErrorCode, const wxPoint& aMarkerPos, BOARD_ITEM( NULL, TYPE_MARKER ), // parent set during BOARD::Add() MARKER_BASE( aErrorCode, aMarkerPos, aText, aPos ) { + m_Color = WHITE; + m_ScalingFactor = SCALING_FACTOR; }