Commit 0d2ee0c0 authored by charras's avatar charras

See changelog. work in progress about ERC and markers in eeschema

parent f467074c
...@@ -4,6 +4,22 @@ KiCad ChangeLog 2009 ...@@ -4,6 +4,22 @@ KiCad ChangeLog 2009
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2009-july-06 UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
================================================================================
++All:
Use a common class for markers in pcbnew and eeschema:
created a basic class called MARKER_BASE
class DRC_ITEM is also common to pcbnew and eeschema
class MARKER (in pcbnew) and class MARKER_SCH (eeschema) are derived
from this basic class.
The main goal is to use a common class for pcbnew and eeschema to handle
errors and to have similar dialogs
and have more comprehensive ERC messages errors in eeschema
This is a work in progress
2009-july-05 UPDATE Jerry Jacobs <jerkejacobs@gmail.com 2009-july-05 UPDATE Jerry Jacobs <jerkejacobs@gmail.com
================================================================================ ================================================================================
+ Closing bug 2802441, No single error messages any more, 2009-06-07 over2there. + Closing bug 2802441, No single error messages any more, 2009-06-07 over2there.
......
...@@ -13,6 +13,7 @@ set(COMMON_SRCS ...@@ -13,6 +13,7 @@ set(COMMON_SRCS
bezier_curves.cpp bezier_curves.cpp
block_commande.cpp block_commande.cpp
class_drawpickedstruct.cpp class_drawpickedstruct.cpp
class_marker_base.cpp
common.cpp common.cpp
common_plot_functions.cpp common_plot_functions.cpp
common_plotHPGL_functions.cpp common_plotHPGL_functions.cpp
......
/**********************************************************************************
* class MARKER_BASE; markers are used to show something (usually a drc/erc problem)
* Markers in pcbnew and eeschema are derived from this basic class
**********************************************************************************/
/* file class_marker_base.cpp
*/
#include "fctsys.h"
#include "gr_basic.h"
#include "class_base_screen.h"
#include "common.h"
#include "class_drawpanel.h"
#include "class_marker_base.h"
/* Default bitmap shape for markers */
static char Default_MarkerBitmap[] =
{
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
};
/*******************/
/* 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];
}
MARKER_BASE::MARKER_BASE( )
{
init();
}
MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos,
const wxString& bText, const wxPoint& bPos )
{
init();
SetData( aErrorCode,aMarkerPos,
aText, aPos,
bText, bPos );
}
MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos )
{
init();
SetData( aErrorCode, aMarkerPos, aText, aPos );
}
/* Effacement memoire de la structure */
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 )
{
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;
}
void MARKER_BASE::SetData( int aErrorCode, const wxPoint& aMarkerPos,
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;
}
/**********************************************/
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.
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;
/* 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 )
return true;
else
return false;
}
/**********************************************************************/
void MARKER_BASE::DrawMarker( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode,
const wxPoint& offset )
/**********************************************************************/
/*
* 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
*/
{
int ii, jj;
char* pt_bitmap = m_Bitmap;
if( pt_bitmap == NULL ) return;
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( 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 );
}
}
}
...@@ -640,7 +640,7 @@ void MirrorOneStruct( SCH_ITEM* DrawStruct, wxPoint& Center ) ...@@ -640,7 +640,7 @@ void MirrorOneStruct( SCH_ITEM* DrawStruct, wxPoint& Center )
SCH_COMPONENT* DrawLibItem; SCH_COMPONENT* DrawLibItem;
DrawSheetStruct* DrawSheet; DrawSheetStruct* DrawSheet;
Hierarchical_PIN_Sheet_Struct* DrawSheetLabel; Hierarchical_PIN_Sheet_Struct* DrawSheetLabel;
DrawMarkerStruct* DrawMarker; MARKER_SCH* DrawMarker;
DrawNoConnectStruct* DrawNoConnect; DrawNoConnectStruct* DrawNoConnect;
SCH_TEXT* DrawText; SCH_TEXT* DrawText;
wxPoint px; wxPoint px;
...@@ -692,7 +692,7 @@ void MirrorOneStruct( SCH_ITEM* DrawStruct, wxPoint& Center ) ...@@ -692,7 +692,7 @@ void MirrorOneStruct( SCH_ITEM* DrawStruct, wxPoint& Center )
break; break;
case DRAW_MARKER_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE:
DrawMarker = (DrawMarkerStruct*) DrawStruct; DrawMarker = (MARKER_SCH*) DrawStruct;
MirrorYPoint( DrawMarker->m_Pos, Center ); MirrorYPoint( DrawMarker->m_Pos, Center );
break; break;
...@@ -1198,7 +1198,7 @@ void MoveOneStruct( SCH_ITEM* DrawStruct, const wxPoint& move_vector ) ...@@ -1198,7 +1198,7 @@ void MoveOneStruct( SCH_ITEM* DrawStruct, const wxPoint& move_vector )
SCH_COMPONENT* DrawLibItem; SCH_COMPONENT* DrawLibItem;
DrawSheetStruct* DrawSheet; DrawSheetStruct* DrawSheet;
Hierarchical_PIN_Sheet_Struct* DrawSheetLabel; Hierarchical_PIN_Sheet_Struct* DrawSheetLabel;
DrawMarkerStruct* DrawMarker; MARKER_SCH* DrawMarker;
DrawNoConnectStruct* DrawNoConnect; DrawNoConnectStruct* DrawNoConnect;
if( !DrawStruct ) if( !DrawStruct )
...@@ -1241,7 +1241,7 @@ void MoveOneStruct( SCH_ITEM* DrawStruct, const wxPoint& move_vector ) ...@@ -1241,7 +1241,7 @@ void MoveOneStruct( SCH_ITEM* DrawStruct, const wxPoint& move_vector )
break; break;
case DRAW_MARKER_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE:
DrawMarker = (DrawMarkerStruct*) DrawStruct; DrawMarker = (MARKER_SCH*) DrawStruct;
DrawMarker->m_Pos += move_vector; DrawMarker->m_Pos += move_vector;
break; break;
...@@ -1337,7 +1337,7 @@ SCH_ITEM* DuplicateStruct( SCH_ITEM* DrawStruct ) ...@@ -1337,7 +1337,7 @@ SCH_ITEM* DuplicateStruct( SCH_ITEM* DrawStruct )
break; break;
case DRAW_MARKER_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE:
NewDrawStruct = ( (DrawMarkerStruct*) DrawStruct )->GenCopy(); NewDrawStruct = ( (MARKER_SCH*) DrawStruct )->GenCopy();
break; break;
case DRAW_NOCONNECT_STRUCT_TYPE: case DRAW_NOCONNECT_STRUCT_TYPE:
...@@ -1672,7 +1672,7 @@ static void AddPickedItem( SCH_SCREEN* screen, wxPoint position ) ...@@ -1672,7 +1672,7 @@ static void AddPickedItem( SCH_SCREEN* screen, wxPoint position )
case DRAW_MARKER_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE:
#undef STRUCT #undef STRUCT
#define STRUCT ( (DrawMarkerStruct*) Struct ) #define STRUCT ( (MARKER_SCH*) Struct )
if( Struct->m_Flags & SELECTED ) if( Struct->m_Flags & SELECTED )
break; /* Already in list */ break; /* Already in list */
if( STRUCT->m_Pos != position ) if( STRUCT->m_Pos != position )
......
...@@ -363,73 +363,33 @@ void DrawNoConnectStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, ...@@ -363,73 +363,33 @@ void DrawNoConnectStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
/**************************/ /**************************/
/* class DrawMarkerStruct */ /* class MARKER_SCH */
/**************************/ /**************************/
char marq_bitmap[] =
{
12, 12, 0, 0, /* Dimensions x et y, offsets x et y du bitmap de marqueurs*/
YELLOW, /* Couleur */
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, /* bitmap: >= 1 : color, */
1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, /* 0 = notrace */
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
};
char marqERC_bitmap[] =
{
8, 8, 0, 0, /* Dimensions x et y , offsets x et y du bitmap de marqueurs*/
-1, /* Color: -1 = couleur non pr�cis�e */
1, 1, 1, 1, 1, 0, 0, 0,
1, 1, 1, 0, 1, 0, 0, 0,
1, 1, 1, 1, 0, 0, 0, 0,
1, 0, 1, 1, 1, 0, 0, 0,
1, 1, 0, 1, 1, 1, 0, 0,
0, 0, 0, 0, 1, 1, 1, 0,
0, 0, 0, 0, 0, 1, 1, 1,
0, 0, 0, 0, 0, 0, 1, 0,
};
MARKER_SCH::MARKER_SCH( const wxPoint& pos, const wxString& text ) :
DrawMarkerStruct::DrawMarkerStruct( const wxPoint& pos, const wxString& text ) : SCH_ITEM( NULL, DRAW_MARKER_STRUCT_TYPE ),
SCH_ITEM( NULL, DRAW_MARKER_STRUCT_TYPE ) MARKER_BASE(0, pos, text, pos)
{ {
m_Pos = pos; /* XY coordinates of marker. */
m_Type = MARQ_UNSPEC;
m_MarkFlags = 0; // complements d'information
m_Comment = text;
} }
DrawMarkerStruct::~DrawMarkerStruct() MARKER_SCH::~MARKER_SCH()
{ {
} }
DrawMarkerStruct* DrawMarkerStruct::GenCopy() MARKER_SCH* MARKER_SCH::GenCopy()
{ {
DrawMarkerStruct* newitem = new DrawMarkerStruct( m_Pos, m_Comment ); MARKER_SCH* newitem = new MARKER_SCH( GetPos(), GetErrorText() );
newitem->m_Type = m_Type; newitem->SetMarkerType( GetMarkerType());
newitem->m_MarkFlags = m_MarkFlags; newitem->SetErrorLevel( GetErrorLevel());
return newitem; return newitem;
} }
wxString DrawMarkerStruct::GetComment()
{
return m_Comment;
}
#if defined(DEBUG) #if defined(DEBUG)
...@@ -440,10 +400,10 @@ wxString DrawMarkerStruct::GetComment() ...@@ -440,10 +400,10 @@ wxString DrawMarkerStruct::GetComment()
* of nesting of this object within the overall tree. * of nesting of this object within the overall tree.
* @param os The ostream& to output to. * @param os The ostream& to output to.
*/ */
void DrawMarkerStruct::Show( int nestLevel, std::ostream& os ) void MARKER_SCH::Show( int nestLevel, std::ostream& os )
{ {
// for now, make it look like XML: // for now, make it look like XML:
NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << m_Pos NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << GetPos()
<< "/>\n"; << "/>\n";
} }
...@@ -456,13 +416,13 @@ void DrawMarkerStruct::Show( int nestLevel, std::ostream& os ) ...@@ -456,13 +416,13 @@ void DrawMarkerStruct::Show( int nestLevel, std::ostream& os )
* @param aFile The FILE to write to. * @param aFile The FILE to write to.
* @return bool - true if success writing else false. * @return bool - true if success writing else false.
*/ */
bool DrawMarkerStruct::Save( FILE* aFile ) const bool MARKER_SCH::Save( FILE* aFile ) const
{ {
bool success = true; bool success = true;
wxString msg = GetErrorText();
if( fprintf( aFile, "Kmarq %c %-4d %-4d \"%s\" F=%X\n", if( fprintf( aFile, "Kmarq %c %-4d %-4d \"%s\" F=%X\n",
int(m_Type) + 'A', m_Pos.x, m_Pos.y, GetMarkerType() + 'A', GetPos().x, GetPos().y,
CONV_TO_UTF8( m_Comment ), m_MarkFlags ) == EOF ) CONV_TO_UTF8( msg ), GetErrorLevel() ) == EOF )
{ {
success = false; success = false;
} }
...@@ -471,26 +431,22 @@ bool DrawMarkerStruct::Save( FILE* aFile ) const ...@@ -471,26 +431,22 @@ bool DrawMarkerStruct::Save( FILE* aFile ) const
} }
void DrawMarkerStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, void MARKER_SCH::Draw( WinEDA_DrawPanel* panel, wxDC* DC,
const wxPoint& offset, int DrawMode, int Color ) const wxPoint& offset, int DrawMode, int Color )
{ {
#define WAR 1 // utilis� aussi dans erc.cpp #define WAR 1 // see erc.cpp
if( m_Type == MARQ_ERC ) if( GetMarkerType() == MARQ_ERC )
{ {
int color = Color;
if( Color <= 0 ) if( Color <= 0 )
{ {
color = (m_MarkFlags == WAR ) ? Color = (GetErrorLevel() == WAR ) ?
g_LayerDescr.LayerColor[LAYER_ERC_WARN] : g_LayerDescr.LayerColor[LAYER_ERC_WARN] :
g_LayerDescr.LayerColor[LAYER_ERC_ERR]; g_LayerDescr.LayerColor[LAYER_ERC_ERR];
} }
Draw_Marqueur( panel, DC, m_Pos + offset, marqERC_bitmap, DrawMode,
color );
} }
else m_Color = Color;
Draw_Marqueur( panel, DC, m_Pos + offset, marq_bitmap, DrawMode, Color ); DrawMarker( panel, DC, DrawMode, offset );
} }
......
...@@ -5,8 +5,9 @@ ...@@ -5,8 +5,9 @@
#ifndef CLASS_SCHEMATIC_ITEMS_H #ifndef CLASS_SCHEMATIC_ITEMS_H
#define 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 DRAWJUNCTION_DIAMETER 32 /* Size (diameter) of junctions between wires */
#define DRAWMARKER_SIZE 16 /* Rayon du symbole marqueur */
#define DRAWNOCONNECT_SIZE 48 /* Rayon du symbole No Connexion */ #define DRAWNOCONNECT_SIZE 48 /* Rayon du symbole No Connexion */
/* flags pour BUS ENTRY (bus to bus ou wire to bus */ /* flags pour BUS ENTRY (bus to bus ou wire to bus */
...@@ -89,32 +90,37 @@ public: ...@@ -89,32 +90,37 @@ public:
}; };
class DrawMarkerStruct : public SCH_ITEM /* marqueurs */ class MARKER_SCH : public SCH_ITEM , public MARKER_BASE
{ {
public: public:
wxPoint m_Pos; /* XY coordinates of marker. */ MARKER_SCH( const wxPoint& aPos, const wxString& aText );
TypeMarker m_Type; ~MARKER_SCH();
int m_MarkFlags; // complements d'information
wxString m_Comment; /* Texte (commentaireassocie eventuel */
public:
DrawMarkerStruct( const wxPoint& pos, const wxString& text );
~DrawMarkerStruct();
virtual wxString GetClass() const virtual wxString GetClass() const
{ {
return wxT( "DrawMarker" ); return wxT( "MARKER_SCH" );
} }
DrawMarkerStruct* GenCopy(); MARKER_SCH* GenCopy();
wxString GetComment();
virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC,
const wxPoint& offset, int draw_mode, const wxPoint& offset, int draw_mode,
int Color = -1 ); 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 * Function Save
* writes the data structures for this object out to a FILE in "*.brd" * writes the data structures for this object out to a FILE in "*.sch"
* format. * format.
* @param aFile The FILE to write to. * @param aFile The FILE to write to.
* @return bool - true if success writing else false. * @return bool - true if success writing else false.
...@@ -127,6 +133,14 @@ public: ...@@ -127,6 +133,14 @@ public:
*/ */
virtual int GetPenSize( ) { return 0; }; 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) #if defined(DEBUG)
void Show( int nestLevel, std::ostream& os ); void Show( int nestLevel, std::ostream& os );
#endif #endif
......
...@@ -125,11 +125,11 @@ SCH_ITEM* WinEDA_SchematicFrame:: SchematicGeneralLocateAndDisplay( const wxPoin ...@@ -125,11 +125,11 @@ SCH_ITEM* WinEDA_SchematicFrame:: SchematicGeneralLocateAndDisplay( const wxPoin
DrawStruct = (SCH_ITEM*) PickStruct( refpoint, GetScreen(), MARKERITEM ); DrawStruct = (SCH_ITEM*) PickStruct( refpoint, GetScreen(), MARKERITEM );
if( DrawStruct ) if( DrawStruct )
{ {
DrawMarkerStruct* Marker = (DrawMarkerStruct*) DrawStruct; MARKER_SCH* Marker = (MARKER_SCH*) DrawStruct;
ii = Marker->m_Type; Text = Marker->GetErrorText();
Text = Marker->GetComment();
if( Text.IsEmpty() ) if( Text.IsEmpty() )
Text = wxT( "NoComment" ); Text = wxT( "???" );
ii = Marker->GetMarkerType();
msg = NameMarqueurType[ii]; msg << wxT( " << " ) << Text; msg = NameMarqueurType[ii]; msg << wxT( " << " ) << Text;
Affiche_Message( msg ); Affiche_Message( msg );
return DrawStruct; return DrawStruct;
......
...@@ -493,7 +493,7 @@ void DeleteAllMarkers( int type ) ...@@ -493,7 +493,7 @@ void DeleteAllMarkers( int type )
{ {
SCH_SCREEN* screen; SCH_SCREEN* screen;
SCH_ITEM * DrawStruct, * NextStruct; SCH_ITEM * DrawStruct, * NextStruct;
DrawMarkerStruct* Marker; MARKER_SCH* Marker;
EDA_ScreenList ScreenList; EDA_ScreenList ScreenList;
...@@ -506,8 +506,8 @@ void DeleteAllMarkers( int type ) ...@@ -506,8 +506,8 @@ void DeleteAllMarkers( int type )
continue; continue;
/* Marqueur trouve */ /* Marqueur trouve */
Marker = (DrawMarkerStruct*) DrawStruct; Marker = (MARKER_SCH*) DrawStruct;
if( Marker->m_Type != type ) if( Marker->GetMarkerType() != type )
continue; continue;
/* Suppression du marqueur */ /* Suppression du marqueur */
......
...@@ -15,10 +15,6 @@ ...@@ -15,10 +15,6 @@
#include "general.h" #include "general.h"
#include "protos.h" #include "protos.h"
extern char marq_bitmap[];
static EDA_BaseStruct* HighLightStruct = NULL; static EDA_BaseStruct* HighLightStruct = NULL;
...@@ -309,51 +305,3 @@ void DrawStructsInGhost( WinEDA_DrawPanel* panel, wxDC* DC, ...@@ -309,51 +305,3 @@ void DrawStructsInGhost( WinEDA_DrawPanel* panel, wxDC* DC,
} }
} }
/*
* Place un repere sur l'ecran au point de coordonnees PCB pos_X, pos_Y
* 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
*
* copie la description du marqueur en current_marqueur (global)
*/
void Draw_Marqueur( WinEDA_DrawPanel* panel, wxDC* DC,
wxPoint pos, char* pt_bitmap, int DrawMode, int Color )
{
int px, py, color;
char ii, ii_max, jj, jj_max;
if( pt_bitmap == NULL )
pt_bitmap = marq_bitmap;
px = GRMapX( pos.x );
py = GRMapY( pos.y );
/* Lecture des dimensions */
ii_max = *(pt_bitmap++);
jj_max = *(pt_bitmap++);
/* lecture des offsets */
px += *(pt_bitmap++);
py += *(pt_bitmap++);
color = *(pt_bitmap++);
if( (Color > 0) )
color = Color;
if( color < 0 )
color = 0;
GRSetDrawMode( DC, DrawMode );
/* Trace du bitmap */
for( ii = 0; ii < ii_max; ii++ )
{
for( jj = 0; jj < jj_max; jj++, pt_bitmap++ )
{
if( *pt_bitmap )
GRSPutPixel( &panel->m_ClipBox, DC, px + ii, py + jj, color );
}
}
}
...@@ -26,10 +26,6 @@ ...@@ -26,10 +26,6 @@
*/ */
/* fonctions exportees */
/* fonctions importees */
/* fonctions locales */ /* fonctions locales */
static bool WriteDiagnosticERC( const wxString& FullFileName ); static bool WriteDiagnosticERC( const wxString& FullFileName );
static void Diagnose( WinEDA_DrawPanel* panel, static void Diagnose( WinEDA_DrawPanel* panel,
...@@ -217,12 +213,12 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList ) ...@@ -217,12 +213,12 @@ void DIALOG_ERC::TestErc( wxTextCtrl* aMessagesList )
m_SheetName ) == 0 ) m_SheetName ) == 0 )
{ {
/* Create a new marker type ERC error*/ /* Create a new marker type ERC error*/
DrawMarkerStruct* Marker = MARKER_SCH* Marker =
new DrawMarkerStruct( ( (DrawSheetStruct*) item_to_test )->m_Pos, new MARKER_SCH( ( (DrawSheetStruct*) item_to_test )->m_Pos,
_( "Duplicate Sheet name" ) ); _( "Duplicate Sheet name" ) );
Marker->m_Type = MARQ_ERC; Marker->SetMarkerType( MARQ_ERC );
Marker->m_MarkFlags = ERR; Marker->SetErrorLevel( ERR );
Marker->SetNext( Screen->EEDrawList ); Marker->SetNext( Screen->EEDrawList );
Screen->EEDrawList = Marker; Screen->EEDrawList = Marker;
g_EESchemaVar.NbErrorErc++; g_EESchemaVar.NbErrorErc++;
...@@ -356,15 +352,15 @@ void DIALOG_ERC::DisplayERC_MarkersList( ) ...@@ -356,15 +352,15 @@ void DIALOG_ERC::DisplayERC_MarkersList( )
continue; continue;
/* Marqueur trouve */ /* Marqueur trouve */
DrawMarkerStruct* Marker = (DrawMarkerStruct*) DrawStruct; MARKER_SCH* Marker = (MARKER_SCH*) DrawStruct;
if( Marker->m_Type != MARQ_ERC ) if( Marker->GetMarkerType() != MARQ_ERC )
continue; continue;
/* Display diag */ /* Display diag */
wxString msg; wxString msg;
msg.Printf(_("sheet %s: %s\n"), msg.Printf(_("sheet %s: %s\n"),
Sheet->PathHumanReadable().GetData(), Sheet->PathHumanReadable().GetData(),
Marker->GetComment().GetData() ); Marker->GetErrorText().GetData() );
m_MessagesList->AppendText( msg ); m_MessagesList->AppendText( msg );
} }
} }
...@@ -445,7 +441,7 @@ static void Diagnose( WinEDA_DrawPanel* aPanel, ...@@ -445,7 +441,7 @@ static void Diagnose( WinEDA_DrawPanel* aPanel,
* if MinConn < 0: this is an error on labels * if MinConn < 0: this is an error on labels
*/ */
{ {
DrawMarkerStruct* Marker = NULL; MARKER_SCH* Marker = NULL;
wxString DiagLevel; wxString DiagLevel;
SCH_SCREEN* screen; SCH_SCREEN* screen;
int ii, jj; int ii, jj;
...@@ -454,27 +450,30 @@ static void Diagnose( WinEDA_DrawPanel* aPanel, ...@@ -454,27 +450,30 @@ static void Diagnose( WinEDA_DrawPanel* aPanel,
return; return;
/* Creation du nouveau marqueur type Erreur ERC */ /* Creation du nouveau marqueur type Erreur ERC */
Marker = new DrawMarkerStruct( aNetItemRef->m_Start, wxEmptyString ); Marker = new MARKER_SCH( aNetItemRef->m_Start, wxEmptyString );
Marker->m_Type = MARQ_ERC; Marker->SetMarkerType( MARQ_ERC );
Marker->m_MarkFlags = WAR; Marker->SetErrorLevel( WAR );
screen = aNetItemRef->m_SheetList.LastScreen(); screen = aNetItemRef->m_SheetList.LastScreen();
Marker->SetNext( screen->EEDrawList ); Marker->SetNext( screen->EEDrawList );
screen->EEDrawList = Marker; screen->EEDrawList = Marker;
g_EESchemaVar.NbErrorErc++; g_EESchemaVar.NbErrorErc++;
g_EESchemaVar.NbWarningErc++; g_EESchemaVar.NbWarningErc++;
wxString msg;
if( aMinConn < 0 ) // Traitement des erreurs sur labels if( aMinConn < 0 ) // Traitement des erreurs sur labels
{ {
if( (aNetItemRef->m_Type == NET_HIERLABEL) if( (aNetItemRef->m_Type == NET_HIERLABEL)
|| (aNetItemRef->m_Type == NET_HIERBUSLABELMEMBER) ) || (aNetItemRef->m_Type == NET_HIERBUSLABELMEMBER) )
{ {
Marker->m_Comment.Printf( _( "Warning HLabel %s not connected to SheetLabel" ), msg.Printf( _( "Warning HLabel %s not connected to SheetLabel" ),
aNetItemRef->m_Label->GetData() ); aNetItemRef->m_Label->GetData() );
} }
else else
Marker->m_Comment.Printf( _( "Warning SheetLabel %s not connected to HLabel" ), msg.Printf( _( "Warning SheetLabel %s not connected to HLabel" ),
aNetItemRef->m_Label->GetData() ); aNetItemRef->m_Label->GetData() );
Marker->SetErrorText(msg);
return; return;
} }
...@@ -493,8 +492,9 @@ static void Diagnose( WinEDA_DrawPanel* aPanel, ...@@ -493,8 +492,9 @@ static void Diagnose( WinEDA_DrawPanel* aPanel,
{ {
if( aMinConn == NOC ) /* 1 seul element dans le net */ if( aMinConn == NOC ) /* 1 seul element dans le net */
{ {
Marker->m_Comment.Printf( _( "Warning Cmp %s, Pin %s (%s) Unconnected" ), msg.Printf( _( "Warning Cmp %s, Pin %s (%s) Unconnected" ),
cmp_ref.GetData(), string_pinnum.GetData(), MsgPinElectricType[ii] ); cmp_ref.GetData(), string_pinnum.GetData(), MsgPinElectricType[ii] );
Marker->SetErrorText(msg);
return; return;
} }
...@@ -502,18 +502,20 @@ static void Diagnose( WinEDA_DrawPanel* aPanel, ...@@ -502,18 +502,20 @@ static void Diagnose( WinEDA_DrawPanel* aPanel,
{ {
if ( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link ) if ( aNetItemRef->m_Type == NET_PIN && aNetItemRef->m_Link )
cmp_ref = ((SCH_COMPONENT*)aNetItemRef->m_Link)->GetRef( &aNetItemRef->m_SheetList ); cmp_ref = ((SCH_COMPONENT*)aNetItemRef->m_Link)->GetRef( &aNetItemRef->m_SheetList );
Marker->m_Comment.Printf( msg.Printf(
_( "Warning Cmp %s, Pin %s (%s) not driven (Net %d)" ), _( "Warning Cmp %s, Pin %s (%s) not driven (Net %d)" ),
cmp_ref.GetData(), string_pinnum.GetData(), cmp_ref.GetData(), string_pinnum.GetData(),
MsgPinElectricType[ii], aNetItemRef->GetNet() ); MsgPinElectricType[ii], aNetItemRef->GetNet() );
Marker->SetErrorText(msg);
return; return;
} }
if( aDiag == UNC ) if( aDiag == UNC )
{ {
Marker->m_Comment.Printf( msg.Printf(
_( "Warning More than 1 Pin connected to UnConnect symbol @X=%f"", Y=%f""" ), _( "Warning More than 1 Pin connected to UnConnect symbol @X=%f"", Y=%f""" ),
(float)Marker->m_Pos.x/1000, (float)Marker->m_Pos.y/1000); (float)Marker->GetPos().x/1000, (float)Marker->GetPos().y/1000);
Marker->SetErrorText(msg);
return; return;
} }
} }
...@@ -525,7 +527,7 @@ static void Diagnose( WinEDA_DrawPanel* aPanel, ...@@ -525,7 +527,7 @@ static void Diagnose( WinEDA_DrawPanel* aPanel,
if( aDiag == ERR ) if( aDiag == ERR )
{ {
DiagLevel = _( "Error" ); DiagLevel = _( "Error" );
Marker->m_MarkFlags = ERR; Marker->SetErrorLevel( ERR );
g_EESchemaVar.NbWarningErc--; g_EESchemaVar.NbWarningErc--;
} }
...@@ -535,11 +537,12 @@ static void Diagnose( WinEDA_DrawPanel* aPanel, ...@@ -535,11 +537,12 @@ static void Diagnose( WinEDA_DrawPanel* aPanel,
alt_cmp = wxT("?"); alt_cmp = wxT("?");
if ( aNetItemTst->m_Type == NET_PIN && aNetItemTst->m_Link ) if ( aNetItemTst->m_Type == NET_PIN && aNetItemTst->m_Link )
alt_cmp = ((SCH_COMPONENT*)aNetItemTst->m_Link)->GetRef( &aNetItemTst->m_SheetList ); alt_cmp = ((SCH_COMPONENT*)aNetItemTst->m_Link)->GetRef( &aNetItemTst->m_SheetList );
Marker->m_Comment.Printf( _("%s: Cmp %s, Pin %s (%s) connected to Cmp %s, Pin %s (%s) (net %d)" ), msg.Printf( _("%s: Cmp %s, Pin %s (%s) connected to Cmp %s, Pin %s (%s) (net %d)" ),
DiagLevel.GetData(), DiagLevel.GetData(),
cmp_ref.GetData(), string_pinnum.GetData(), MsgPinElectricType[ii], cmp_ref.GetData(), string_pinnum.GetData(), MsgPinElectricType[ii],
alt_cmp.GetData(), alt_string_pinnum.GetData(),MsgPinElectricType[jj], alt_cmp.GetData(), alt_string_pinnum.GetData(),MsgPinElectricType[jj],
aNetItemRef->GetNet() ); aNetItemRef->GetNet() );
Marker->SetErrorText(msg);
} }
} }
...@@ -641,8 +644,8 @@ static bool WriteDiagnosticERC( const wxString& FullFileName ) ...@@ -641,8 +644,8 @@ static bool WriteDiagnosticERC( const wxString& FullFileName )
/* Create the Diagnostic file (<xxx>.erc file) /* Create the Diagnostic file (<xxx>.erc file)
*/ */
{ {
EDA_BaseStruct* DrawStruct; SCH_ITEM* DrawStruct;
DrawMarkerStruct* Marker; MARKER_SCH* Marker;
char Line[256]; char Line[256];
static FILE* OutErc; static FILE* OutErc;
DrawSheetPath* Sheet; DrawSheetPath* Sheet;
...@@ -679,15 +682,15 @@ static bool WriteDiagnosticERC( const wxString& FullFileName ) ...@@ -679,15 +682,15 @@ static bool WriteDiagnosticERC( const wxString& FullFileName )
continue; continue;
/* Marqueur trouve */ /* Marqueur trouve */
Marker = (DrawMarkerStruct*) DrawStruct; Marker = (MARKER_SCH*) DrawStruct;
if( Marker->m_Type != MARQ_ERC ) if( Marker->GetMarkerType() != MARQ_ERC )
continue; continue;
/* Write diag marqueur */ /* Write diag marqueur */
msg.Printf( _( "ERC: %s (X= %2.3f inches, Y= %2.3f inches\n" ), msg.Printf( _( "ERC: %s (X= %2.3f inches, Y= %2.3f inches\n" ),
Marker->GetComment().GetData(), Marker->GetErrorText().GetData(),
(float) Marker->m_Pos.x / 1000, (float) Marker->GetPos().x / 1000,
(float) Marker->m_Pos.y / 1000 ); (float) Marker->GetPos().y / 1000 );
fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) ); fprintf( OutErc, "%s", CONV_TO_UTF8( msg ) );
} }
......
...@@ -267,7 +267,7 @@ SCH_ITEM* WinEDA_SchematicFrame::FindMarker( int SearchType ) ...@@ -267,7 +267,7 @@ SCH_ITEM* WinEDA_SchematicFrame::FindMarker( int SearchType )
{ {
DrawSheetPath* sheet, * FirstSheet = NULL; DrawSheetPath* sheet, * FirstSheet = NULL;
SCH_ITEM* DrawList, * FirstStruct = NULL, * Struct = NULL; SCH_ITEM* DrawList, * FirstStruct = NULL, * Struct = NULL;
DrawMarkerStruct* Marker = NULL; MARKER_SCH* Marker = NULL;
int StartCount; int StartCount;
bool NotFound; bool NotFound;
wxPoint firstpos, pos; wxPoint firstpos, pos;
...@@ -292,7 +292,7 @@ SCH_ITEM* WinEDA_SchematicFrame::FindMarker( int SearchType ) ...@@ -292,7 +292,7 @@ SCH_ITEM* WinEDA_SchematicFrame::FindMarker( int SearchType )
{ {
if( DrawList->Type() == DRAW_MARKER_STRUCT_TYPE ) if( DrawList->Type() == DRAW_MARKER_STRUCT_TYPE )
{ {
Marker = (DrawMarkerStruct*) DrawList; Marker = (MARKER_SCH*) DrawList;
NotFound = FALSE; NotFound = FALSE;
pos = Marker->m_Pos; pos = Marker->m_Pos;
if( FirstSheet == NULL ) /* First item found */ if( FirstSheet == NULL ) /* First item found */
......
...@@ -49,7 +49,7 @@ bool WinEDA_SchematicFrame::LoadOneEEFile( SCH_SCREEN* screen, ...@@ -49,7 +49,7 @@ bool WinEDA_SchematicFrame::LoadOneEEFile( SCH_SCREEN* screen,
DrawPolylineStruct* PolylineStruct; DrawPolylineStruct* PolylineStruct;
EDA_DrawLineStruct* SegmentStruct; EDA_DrawLineStruct* SegmentStruct;
DrawBusEntryStruct* RaccordStruct; DrawBusEntryStruct* RaccordStruct;
DrawMarkerStruct* MarkerStruct; MARKER_SCH* Marker;
DrawNoConnectStruct* NoConnectStruct; DrawNoConnectStruct* NoConnectStruct;
int LineCount; int LineCount;
wxString MsgDiag; /* Error and log messages */ wxString MsgDiag; /* Error and log messages */
...@@ -335,22 +335,23 @@ at line %d, aborted" ), ...@@ -335,22 +335,23 @@ at line %d, aborted" ),
{ {
char* text; char* text;
char BufLine[1024]; char BufLine[1024];
MarkerStruct = new DrawMarkerStruct( pos, wxEmptyString ); Marker = new MARKER_SCH( pos, wxEmptyString );
ii = ReadDelimitedText( BufLine, Line, 256 ); ii = ReadDelimitedText( BufLine, Line, 256 );
MarkerStruct->m_Type = (TypeMarker) ( (Name1[0] & 255) - 'A' ); int type = (TypeMarker) ( (Name1[0] & 255) - 'A' );
if( MarkerStruct->m_Type < 0 ) if( type < 0 )
MarkerStruct->m_Type = MARQ_UNSPEC; type = MARQ_UNSPEC;
Marker->SetMarkerType( type );
if( ii ) if( ii )
MarkerStruct->m_Comment = CONV_FROM_UTF8( BufLine ); Marker->SetErrorText( CONV_FROM_UTF8( BufLine ) );
text = strstr( Line, " F=" ); text = strstr( Line, " F=" );
if( text ) if( text )
{ {
sscanf( text + 3, "%X", &ii ); sscanf( text + 3, "%X", &ii );
MarkerStruct->m_MarkFlags = ii; Marker->SetErrorLevel( ii );
} }
MarkerStruct->SetNext( screen->EEDrawList ); Marker->SetNext( screen->EEDrawList );
screen->EEDrawList = MarkerStruct; screen->EEDrawList = Marker;
} }
break; break;
......
...@@ -297,12 +297,10 @@ bool SnapPoint2( const wxPoint& aPosRef, int SearchMask, ...@@ -297,12 +297,10 @@ bool SnapPoint2( const wxPoint& aPosRef, int SearchMask,
case DRAW_MARKER_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE:
{ {
#undef STRUCT #undef STRUCT
#define STRUCT ( (DrawMarkerStruct*) DrawList ) #define STRUCT ( (MARKER_SCH*) DrawList )
if( !(SearchMask & MARKERITEM) ) if( !(SearchMask & MARKERITEM) )
break; break;
int size = (int) ( (DRAWMARKER_SIZE / aScaleFactor) / 2 ); if( STRUCT->HitTest(aPosRef) )
wxPoint dist = aPosRef - STRUCT->m_Pos;
if( (abs( dist.x ) <= size) && (abs( dist.y ) <= size) )
{ {
LastSnappedStruct = DrawList; LastSnappedStruct = DrawList;
return TRUE; return TRUE;
...@@ -472,7 +470,7 @@ bool DrawStructInBox( int x1, int y1, int x2, int y2, SCH_ITEM* DrawStruct ) ...@@ -472,7 +470,7 @@ bool DrawStructInBox( int x1, int y1, int x2, int y2, SCH_ITEM* DrawStruct )
case DRAW_MARKER_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE:
#undef STRUCT #undef STRUCT
#define STRUCT ( (DrawMarkerStruct*) DrawStruct ) #define STRUCT ( (MARKER_SCH*) DrawStruct )
if( (STRUCT->m_Pos.x >= x1) && (STRUCT->m_Pos.x <= x2) if( (STRUCT->m_Pos.x >= x1) && (STRUCT->m_Pos.x <= x2)
&& (STRUCT->m_Pos.y >= y1) && (STRUCT->m_Pos.y <= y2) ) && (STRUCT->m_Pos.y >= y1) && (STRUCT->m_Pos.y <= y2) )
return TRUE; return TRUE;
......
...@@ -167,9 +167,6 @@ Hierarchical_PIN_Sheet_Struct * LocateAnyPinSheet(const wxPoint & RefPos, ...@@ -167,9 +167,6 @@ Hierarchical_PIN_Sheet_Struct * LocateAnyPinSheet(const wxPoint & RefPos,
void DrawDanglingSymbol(WinEDA_DrawPanel * panel,wxDC * DC, void DrawDanglingSymbol(WinEDA_DrawPanel * panel,wxDC * DC,
const wxPoint & pos, int Color); const wxPoint & pos, int Color);
void Draw_Marqueur(WinEDA_DrawPanel * panel, wxDC * DC,
wxPoint pos, char* pt_bitmap, int DrawMode, int Color);
void DrawStructsInGhost(WinEDA_DrawPanel * panel, wxDC * DC, void DrawStructsInGhost(WinEDA_DrawPanel * panel, wxDC * DC,
SCH_ITEM * DrawStruct, int dx, int dy ); SCH_ITEM * DrawStruct, int dx, int dy );
void SetHighLightStruct(SCH_ITEM *HighLight); void SetHighLightStruct(SCH_ITEM *HighLight);
......
...@@ -137,8 +137,8 @@ void SwapData( EDA_BaseStruct* Item ) ...@@ -137,8 +137,8 @@ void SwapData( EDA_BaseStruct* Item )
case DRAW_MARKER_STRUCT_TYPE: case DRAW_MARKER_STRUCT_TYPE:
#undef SOURCE #undef SOURCE
#undef DEST #undef DEST
#define SOURCE ( (DrawMarkerStruct*) Item ) #define SOURCE ( (MARKER_SCH*) Item )
#define DEST ( (DrawMarkerStruct*) image ) #define DEST ( (MARKER_SCH*) image )
EXCHG( SOURCE->m_Pos, DEST->m_Pos ); EXCHG( SOURCE->m_Pos, DEST->m_Pos );
break; break;
......
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2007 Dick Hollenbeck, dick@softplc.com
* Copyright (C) 2007 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 _CLASS_DRC_ITEM_H
#define _CLASS_DRC_ITEM_H
/**
* Class DRC_ITEM
* is a holder for a DRC (in Pcbnew) or ERC (in Eeschema) error item.
* It is generated when two objects are too close (DRC)
* or two connected objects (pins) have incompatibleelectrical type (ERC).
* There are holders for information on two items. The
* information held is the board coordinate and the MenuText for each item.
* Also held is the type of error by number and the location of the MARKER.
* A function is provided to translate that number into text.
* Some errors involve only one item (item with an incorrect param) so
* m_hasSecondItem is set to false in this case.
*/
class DRC_ITEM
{
protected:
int m_ErrorCode; ///< the error code's numeric value
wxString m_MainText; ///< text for the first BOARD_ITEM or SCH_ITEM
wxString m_AuxiliaryText; ///< text for the second BOARD_ITEM or SCH_ITEM
wxPoint m_MainPosition; ///< the location of the first (or main ) BOARD_ITEM or SCH_ITEM. This is also the position of the marker
wxPoint m_AuxiliaryPosition; ///< the location of the second BOARD_ITEM or SCH_ITEM
bool m_hasSecondItem; ///< true when 2 items create a DRC/ERC error, false if only one item
public:
DRC_ITEM()
{
m_ErrorCode = 0;
m_hasSecondItem = false;
}
DRC_ITEM( int aErrorCode,
const wxString& aMainText, const wxString& bAuxiliaryText,
const wxPoint& aMainPos, const wxPoint& bAuxiliaryPos )
{
SetData( aErrorCode,
aMainText, bAuxiliaryText,
aMainPos, bAuxiliaryPos );
}
DRC_ITEM( int aErrorCode,
const wxString& aText, const wxPoint& aPos )
{
SetData( aErrorCode, aText, aPos );
}
void SetData( int aErrorCode,
const wxString& aMainText, const wxPoint& aMainPos )
{
SetData( aErrorCode,
aMainText, aMainText,
aMainPos, aMainPos );
m_hasSecondItem = false;
}
void SetData( int aErrorCode,
const wxString& aMainText, const wxString& bAuxiliaryText,
const wxPoint& aMainPos, const wxPoint& bAuxiliaryPos )
{
m_ErrorCode = aErrorCode;
m_MainText = aMainText;
m_AuxiliaryText = bAuxiliaryText;
m_MainPosition = aMainPos;
m_AuxiliaryPosition = bAuxiliaryPos;
m_hasSecondItem = true;
}
bool HasSecondItem() const { return m_hasSecondItem; }
/** acces to A and B texts
*/
wxString GetMainText() const { return m_MainText; }
wxString GetAuxiliaryText() const { return m_AuxiliaryText; }
/**
* Function ShowHtml
* translates this object into a fragment of HTML suitable for the
* wxWidget's wxHtmlListBox class.
* @return wxString - the html text.
*/
wxString ShowHtml() const
{
wxString ret;
if( m_hasSecondItem )
{
// an html fragment for the entire message in the listbox. feel free
// to add color if you want:
ret.Printf( _( "ErrType(%d): <b>%s</b><ul><li> %s: %s </li><li> %s: %s </li></ul>" ),
m_ErrorCode,
GetErrorText().GetData(),
ShowCoord( m_MainPosition ).GetData(), m_MainText.GetData(),
ShowCoord( m_AuxiliaryPosition ).GetData(), m_AuxiliaryText.GetData() );
}
else
{
ret.Printf( _( "ErrType(%d): <b>%s</b><ul><li> %s: %s </li></ul>" ),
m_ErrorCode,
GetErrorText().GetData(),
ShowCoord( m_MainPosition ).GetData(), m_MainText.GetData() );
}
return ret;
}
/**
* Function ShowReport
* translates this object into a text string suitable for saving
* to disk in a report.
* @return wxString - the simple multi-line report text.
*/
wxString ShowReport() const
{
wxString ret;
if( m_hasSecondItem )
{
ret.Printf( wxT( "ErrType(%d): %s\n %s: %s\n %s: %s\n" ),
m_ErrorCode,
GetErrorText().GetData(),
ShowCoord( m_MainPosition ).GetData(), m_MainText.GetData(),
ShowCoord( m_AuxiliaryPosition ).GetData(), m_AuxiliaryText.GetData() );
}
else
{
ret.Printf( wxT( "ErrType(%d): %s\n %s: %s\n" ),
m_ErrorCode,
GetErrorText().GetData(),
ShowCoord( m_MainPosition ).GetData(), m_MainText.GetData() );
}
return ret;
}
/**
* Function GetErrorCode
* returns the error code.
*/
int GetErrorCode() const
{
return m_ErrorCode;
}
/**
* Function GetErrorText
* returns the string form of a drc error code.
*/
wxString GetErrorText() const;
const wxString& GetTextA() const
{
return m_MainText;
}
const wxString& GetTextB() const
{
return m_AuxiliaryText;
}
const wxPoint& GetPointA() const
{
return m_MainPosition;
}
const wxPoint& GetPointB() const
{
return m_AuxiliaryPosition;
}
/**
* Function ShowCoord
* formats a coordinate or position to text.
* @param aPos The position to format
* @return wxString - The formated string
*/
static wxString ShowCoord( const wxPoint& aPos );
};
#endif // _CLASS_DRC_ITEM_H
/***************************************/
/* Markers: used to show a drc problem */
/***************************************/
#ifndef _CLASS_MARKER_BASE_H
#define _CLASS_MARKER_BASE_H
#include "class_drc_item.h"
class MARKER_BASE
{
public:
wxPoint m_Pos; ///< position of the marker
protected:
char* m_Bitmap; ///< Shape (bitmap)
int m_MarkerType; ///< Can be used as a flag
int m_Color; ///< color
wxSize m_Size; ///< Size of the graphic symbol
DRC_ITEM m_drc;
void init();
public:
MARKER_BASE( );
/**
* Constructor
* @param aErrorCode The categorizing identifier for an error
* @param aMarkerPos The position of the MARKER on the BOARD
* @param aText Text describing the first of two objects
* @param aPos The position of the first of two objects
* @param bText Text describing the second of the two conflicting objects
* @param bPos The position of the second of two objects
*/
MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos,
const wxString& bText, const wxPoint& bPos );
/**
* Constructor
* @param aErrorCode The categorizing identifier for an error
* @param aMarkerPos The position of the MARKER on the BOARD
* @param aText Text describing the object
* @param aPos The position of the object
*/
MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos );
~MARKER_BASE();
/** Function DrawMarker
*/
void DrawMarker( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode, const wxPoint& offset );
/**
* Function GetPos
* returns the position of this MARKER, const.
*/
const wxPoint& GetPos() const
{
return m_Pos;
}
/** 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 |= aErrorLevel << 8;
}
int GetErrorLevel( ) const
{
return (m_MarkerType >> 8) & 0xFF;
}
/** Functions to set/get marker type (DRC, ERC, or other)
* this value is stored in m_MarkerType
*/
void SetMarkerType(int aMarkerType )
{
m_MarkerType &= 0xFF;
aMarkerType &= 0xFF;
m_MarkerType |= aMarkerType;
}
int GetMarkerType( ) const
{
return m_MarkerType & 0xFF;
}
/**
* Function SetData
* fills in all the reportable data associated with a MARKER.
* @param aErrorCode The categorizing identifier for an error
* @param aMarkerPos The position of the MARKER on the BOARD
* @param aText Text describing the first of two objects
* @param aPos The position of the first of two objects
* @param bText Text describing the second of the two conflicting objects
* @param bPos The position of the second of two objects
*/
void SetData( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos,
const wxString& bText, const wxPoint& bPos );
/**
* Function SetData
* fills in all the reportable data associated with a MARKER.
* @param aErrorCode The categorizing identifier for an error
* @param aMarkerPos The position of the MARKER on the BOARD
* @param aText Text describing the object
* @param aPos The position of the object
*/
void SetData( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos );
/**
* Function GetReporter
* returns the DRC_ITEM held within this MARKER so that its
* interface may be used.
* @return const& DRC_ITEM
*/
const DRC_ITEM& GetReporter() const
{
return m_drc;
}
/**
* Function HitTestMarker
* tests if the given wxPoint is within the bounds of this object.
* @param ref_pos A wxPoint to test
* @return bool - true if a hit, else false
*/
bool HitTestMarker( const wxPoint& ref_pos );
};
#endif // _CLASS_MARKER_BASE_H
...@@ -13,106 +13,40 @@ ...@@ -13,106 +13,40 @@
#include "class_marker.h" #include "class_marker.h"
/* Routines Locales : */
/* Default bitmap shape for markers */
static char Default_MarkerBitmap[] =
{
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
};
/*******************/ /*******************/
/* Classe MARKER */ /* Classe MARKER */
/*******************/ /*******************/
void MARKER::init()
{
m_Bitmap = NULL;
m_Type = 0;
m_Color = RED;
m_Bitmap = Default_MarkerBitmap;
m_Size.x = Default_MarkerBitmap[0];
m_Size.y = Default_MarkerBitmap[1];
}
MARKER::MARKER( BOARD_ITEM* aParent ) : MARKER::MARKER( BOARD_ITEM* aParent ) :
BOARD_ITEM( aParent, TYPE_MARKER ), BOARD_ITEM( aParent, TYPE_MARKER ),
m_drc() MARKER_BASE( )
{ {
init();
} }
MARKER::MARKER( int aErrorCode, const wxPoint& aMarkerPos, MARKER::MARKER( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos, const wxString& aText, const wxPoint& aPos,
const wxString& bText, const wxPoint& bPos ) : const wxString& bText, const wxPoint& bPos ) :
BOARD_ITEM( NULL, TYPE_MARKER ) // parent set during BOARD::Add() BOARD_ITEM( NULL, TYPE_MARKER ), // parent set during BOARD::Add()
{ MARKER_BASE( aErrorCode, aMarkerPos, aText, aPos, bText, bPos )
init();
SetData( aErrorCode, aMarkerPos, {
aText, aPos,
bText, bPos );
} }
MARKER::MARKER( int aErrorCode, const wxPoint& aMarkerPos, MARKER::MARKER( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos ) : const wxString& aText, const wxPoint& aPos ) :
BOARD_ITEM( NULL, TYPE_MARKER ) // parent set during BOARD::Add() BOARD_ITEM( NULL, TYPE_MARKER ), // parent set during BOARD::Add()
MARKER_BASE( aErrorCode, aMarkerPos, aText, aPos )
{ {
init();
SetData( aErrorCode, aMarkerPos,
aText, aPos );
} }
/* Effacement memoire de la structure */ /* Effacement memoire de la structure */
MARKER::~MARKER() MARKER::~MARKER()
{ {
#if defined(DEBUG)
printf("MARKER %p deleted\n", this );
#endif
}
void MARKER::SetData( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos,
const wxString& bText, const wxPoint& bPos )
{
m_drc.SetData( aErrorCode, aMarkerPos,
aText, bText,
aPos, bPos );
// @todo: switch on error code to set error code specific color, and possibly bitmap.
m_Color = WHITE;
} }
void MARKER::SetData( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos )
{
m_drc.SetData( aErrorCode, aMarkerPos,
aText, aPos );
// @todo: switch on error code to set error code specific color, and possibly bitmap.
m_Color = WHITE;
}
/* supprime du chainage la structure Struct /* supprime du chainage la structure Struct
* les structures arrieres et avant sont chainees directement * les structures arrieres et avant sont chainees directement
*/ */
...@@ -150,72 +84,3 @@ void MARKER::DisplayInfo( WinEDA_DrawFrame* frame ) ...@@ -150,72 +84,3 @@ void MARKER::DisplayInfo( WinEDA_DrawFrame* frame )
text_pos = 25; text_pos = 25;
Affiche_1_Parametre( frame, text_pos, txtA, txtB, DARKBROWN ); Affiche_1_Parametre( frame, text_pos, txtA, txtB, DARKBROWN );
} }
/**********************************************/
bool MARKER::HitTest( const wxPoint& refPos )
/**********************************************/
{
// the MARKER 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 changes.
wxSize TrueSize = m_Size;
if ( ActiveScreen )
{
ActiveScreen->Unscale( TrueSize );
}
wxPoint pos = GetPosition();
int dx = refPos.x - pos.x;
int dy = refPos.y - pos.y;
/* 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 )
return true;
else
return false;
}
/**********************************************************************/
void MARKER::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode, const wxPoint& offset )
/**********************************************************************/
/*
* 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
*/
{
int px, py;
int ii, jj;
char* pt_bitmap = m_Bitmap;
if( pt_bitmap == NULL ) return;
GRSetDrawMode( DC, DrawMode );
px = GRMapX( GetPosition().x );
py = GRMapY( GetPosition().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( jj = 0; jj < m_Size.y; jj++, pt_bitmap++ )
{
if( *pt_bitmap )
GRSPutPixel( &panel->m_ClipBox, DC,
px + ii, py + jj, m_Color );
}
}
}
...@@ -9,17 +9,8 @@ ...@@ -9,17 +9,8 @@
#include "drc_stuff.h" #include "drc_stuff.h"
class MARKER : public BOARD_ITEM class MARKER : public BOARD_ITEM, public MARKER_BASE
{ {
protected:
char* m_Bitmap; ///< Shape (bitmap)
int m_Type;
int m_Color; ///< color
wxSize m_Size; ///< Size of the graphic symbol
DRC_ITEM m_drc;
void init();
public: public:
...@@ -50,68 +41,35 @@ public: ...@@ -50,68 +41,35 @@ public:
~MARKER(); ~MARKER();
void UnLink(); void UnLink(); // Deprecated
void Draw( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode, const wxPoint& offset = ZeroOffset );
/** /** Function Draw
* Function GetPosition
* returns the position of this MARKER.
*/ */
wxPoint& GetPosition() void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, int aDrawMode, const wxPoint& aOffset = ZeroOffset )
{ {
return (wxPoint&) m_drc.GetPosition(); DrawMarker( aPanel, aDC, aDrawMode, aOffset );
} }
/** /**
* Function GetPos * Function GetPosition
* returns the position of this MARKER, const. * returns the position of this MARKER.
*/ */
const wxPoint& GetPos() const wxPoint& GetPosition()
{ {
return m_drc.GetPosition(); return (wxPoint&) m_Pos;
} }
/** /** Function HitTest
* Function SetData * @return true if the point aPosRef is within item area
* fills in all the reportable data associated with a MARKER. * @param aPosRef = a wxPoint to test
* @param aErrorCode The categorizing identifier for an error
* @param aMarkerPos The position of the MARKER on the BOARD
* @param aText Text describing the first of two objects
* @param aPos The position of the first of two objects
* @param bText Text describing the second of the two conflicting objects
* @param bPos The position of the second of two objects
*/
void SetData( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos,
const wxString& bText, const wxPoint& bPos );
/**
* Function SetData
* fills in all the reportable data associated with a MARKER.
* @param aErrorCode The categorizing identifier for an error
* @param aMarkerPos The position of the MARKER on the BOARD
* @param aText Text describing the object
* @param aPos The position of the object
*/
void SetData( int aErrorCode, const wxPoint& aMarkerPos,
const wxString& aText, const wxPoint& aPos );
/**
* Function GetReporter
* returns the DRC_ITEM held within this MARKER so that its
* interface may be used.
* @return const& DRC_ITEM
*/ */
const DRC_ITEM& GetReporter() const bool HitTest( const wxPoint& aPosRef )
{ {
return m_drc; return HitTestMarker( aPosRef );
} }
/** /**
* Function DisplayInfo * Function DisplayInfo
* has knowledge about the frame and how and where to put status information * has knowledge about the frame and how and where to put status information
...@@ -133,15 +91,6 @@ public: ...@@ -133,15 +91,6 @@ public:
// "pure" virtual-ness // "pure" virtual-ness
return true; return true;
} }
/**
* Function HitTest
* tests if the given wxPoint is within the bounds of this object.
* @param ref_pos A wxPoint to test
* @return bool - true if a hit, else false
*/
bool HitTest( const wxPoint& ref_pos );
}; };
......
...@@ -313,7 +313,7 @@ void DIALOG_DRC_CONTROL::OnLeftDClickClearance( wxMouseEvent& event ) ...@@ -313,7 +313,7 @@ void DIALOG_DRC_CONTROL::OnLeftDClickClearance( wxMouseEvent& event )
* ::wxPostEvent( GetEventHandler(), cmd ); * ::wxPostEvent( GetEventHandler(), cmd );
*/ */
m_Parent->CursorGoto( item->GetPosition() ); m_Parent->CursorGoto( item->GetPointA() );
// turn control over to m_Parent, hide this DIALOG_DRC_CONTROL window, // turn control over to m_Parent, hide this DIALOG_DRC_CONTROL window,
// no destruction so we can preserve listbox cursor // no destruction so we can preserve listbox cursor
...@@ -453,7 +453,7 @@ void DIALOG_DRC_CONTROL::OnLeftDClickUnconnected( wxMouseEvent& event ) ...@@ -453,7 +453,7 @@ void DIALOG_DRC_CONTROL::OnLeftDClickUnconnected( wxMouseEvent& event )
const DRC_ITEM* item = m_UnconnectedListBox->GetItem( selection ); const DRC_ITEM* item = m_UnconnectedListBox->GetItem( selection );
if( item ) if( item )
{ {
m_Parent->CursorGoto( item->GetPosition() ); m_Parent->CursorGoto( item->GetPointA() );
Hide(); Hide();
......
...@@ -346,7 +346,7 @@ void DRC::testUnconnected() ...@@ -346,7 +346,7 @@ void DRC::testUnconnected()
D_PAD* padStart = rat->m_PadStart; D_PAD* padStart = rat->m_PadStart;
D_PAD* padEnd = rat->m_PadEnd; D_PAD* padEnd = rat->m_PadEnd;
DRC_ITEM* uncItem = new DRC_ITEM( DRCE_UNCONNECTED_PADS, padStart->GetPosition(), DRC_ITEM* uncItem = new DRC_ITEM( DRCE_UNCONNECTED_PADS,
padStart->MenuText( m_pcb ), padEnd->MenuText( m_pcb ), padStart->MenuText( m_pcb ), padEnd->MenuText( m_pcb ),
padStart->GetPosition(), padEnd->GetPosition() ); padStart->GetPosition(), padEnd->GetPosition() );
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "fctsys.h" #include "fctsys.h"
#include "class_marker_base.h"
#define OK_DRC 0 #define OK_DRC 0
...@@ -64,199 +65,6 @@ ...@@ -64,199 +65,6 @@
#define DRCE_TOO_SMALL_VIA 28 ///< Too small via size #define DRCE_TOO_SMALL_VIA 28 ///< Too small via size
#define DRCE_TOO_SMALL_MICROVIA 29 ///< Too small micro via size #define DRCE_TOO_SMALL_MICROVIA 29 ///< Too small micro via size
/**
* Class DRC_ITEM
* is a holder for a DRC error item. It is generated when two objects are
* too close. There are holders for information on two items. The
* information held is the board coordinate and the MenuText for each item.
* Also held is the type of error by number and the location of the MARKER.
* A function is provided to translate that number into text.
* Some errors involve only one item (item with an incorrect param) so
* m_hasSecondItem is set to false in this case.
*/
class DRC_ITEM
{
protected:
int m_ErrorCode; ///< the error code's numeric value
wxPoint m_Pos; ///< position of the issue
wxString m_AText; ///< text for the first BOARD_ITEM
wxString m_BText; ///< text for the second BOARD_ITEM
wxPoint m_APos; ///< the location of the first (or main ) BOARD_ITEM
wxPoint m_BPos; ///< the location of the second BOARD_ITEM
bool m_hasSecondItem; ///< true when 2 items create a DRC error, false if only one item
public:
DRC_ITEM() :
m_ErrorCode( 0 )
{
}
DRC_ITEM( int aErrorCode, const wxPoint& aIssuePos,
const wxString& aText, const wxString& bText,
const wxPoint& aPos, const wxPoint& bPos )
{
SetData( aErrorCode, aIssuePos,
aText, bText,
aPos, bPos );
}
DRC_ITEM( int aErrorCode, const wxPoint& aIssuePos,
const wxString& aText, const wxPoint& aPos )
{
SetData( aErrorCode, aIssuePos, aText, aPos );
}
void SetData( int aErrorCode, const wxPoint& aIssuePos,
const wxString& aText, const wxPoint& aPos )
{
SetData( aErrorCode, aIssuePos,
aText, aText,
aPos, aPos );
m_hasSecondItem = false;
}
void SetData( int aErrorCode, const wxPoint& aIssuePos,
const wxString& aText, const wxString& bText,
const wxPoint& aPos, const wxPoint& bPos )
{
m_ErrorCode = aErrorCode;
m_Pos = aIssuePos;
m_AText = aText;
m_BText = bText;
m_APos = aPos;
m_BPos = bPos;
m_hasSecondItem = true;
}
bool HasSecondItem() const { return m_hasSecondItem; }
/**
* Function ShowHtml
* translates this object into a fragment of HTML suitable for the
* wxWidget's wxHtmlListBox class.
* @return wxString - the html text.
*/
wxString ShowHtml() const
{
wxString ret;
if( m_hasSecondItem )
{
// an html fragment for the entire message in the listbox. feel free
// to add color if you want:
ret.Printf( _( "ErrType(%d): <b>%s</b><ul><li> %s: %s </li><li> %s: %s </li></ul>" ),
m_ErrorCode,
GetErrorText().GetData(),
ShowCoord( m_APos ).GetData(), m_AText.GetData(),
ShowCoord( m_BPos ).GetData(), m_BText.GetData() );
}
else
{
ret.Printf( _( "ErrType(%d): <b>%s</b><ul><li> %s: %s </li></ul>" ),
m_ErrorCode,
GetErrorText().GetData(),
ShowCoord( m_APos ).GetData(), m_AText.GetData() );
}
return ret;
}
/**
* Function ShowReport
* translates this object into a text string suitable for saving
* to disk in a report.
* @return wxString - the simple multi-line report text.
*/
wxString ShowReport() const
{
wxString ret;
if( m_hasSecondItem )
{
ret.Printf( wxT( "ErrType(%d): %s\n %s: %s\n %s: %s\n" ),
m_ErrorCode,
GetErrorText().GetData(),
ShowCoord( m_APos ).GetData(), m_AText.GetData(),
ShowCoord( m_BPos ).GetData(), m_BText.GetData() );
}
else
{
ret.Printf( wxT( "ErrType(%d): %s\n %s: %s\n" ),
m_ErrorCode,
GetErrorText().GetData(),
ShowCoord( m_APos ).GetData(), m_AText.GetData() );
}
return ret;
}
/**
* Function GetErrorCode
* returns the error code.
*/
int GetErrorCode() const
{
return m_ErrorCode;
}
/**
* Function GetErrorText
* returns the string form of a drc error code.
*/
wxString GetErrorText() const;
const wxString& GetTextA() const
{
return m_AText;
}
const wxString& GetTextB() const
{
return m_BText;
}
const wxPoint& GetPointA() const
{
return m_APos;
}
const wxPoint& GetPointB() const
{
return m_BPos;
}
/**
* Function GetPosition
* @return wxPoint& - the position of this report item within
* the drawing.
*/
const wxPoint& GetPosition() const
{
return m_Pos;
}
/**
* Function ShowCoord
* formats a coordinate or position to text.
* @param aPos The position to format
* @return wxString - The formated string
*/
static wxString ShowCoord( const wxPoint& aPos );
};
class WinEDA_DrawPanel; class WinEDA_DrawPanel;
class MARKER; class MARKER;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment