Commit f27208a1 authored by CHARRAS's avatar CHARRAS
Browse files

pcbnew: better messages in drc control and some other enhancements

parent d84960f3
Loading
Loading
Loading
Loading
+10 −0
Original line number Original line Diff line number Diff line
@@ -4,6 +4,16 @@ Started 2007-June-11
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.


2007-Jul-25 UPDATE   Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
	** Some minor enhancements
+ pcbnew
	In Drc diags, better (more explicit) messages
	Change (and simplify) code in  'update' as well as 'insert' modules into main PCB from within the module editor,
	because it had a bug (crashes when there was no footprint in pcb)
	


2007-June-21 UPDATE Tim Hanson <tim@hardcarve.com>
2007-June-21 UPDATE Tim Hanson <tim@hardcarve.com>
================================================================================
================================================================================
+ pcbnew
+ pcbnew
+1 −1
Original line number Original line Diff line number Diff line
@@ -15,7 +15,7 @@
#include "colors.h"
#include "colors.h"


// Define print format d to display a schematic component line
// Define print format d to display a schematic component line
#define CMP_FORMAT wxT("%3d %8.8s - %16.16s : %-.32s")
#define CMP_FORMAT wxT("%3d %+8s - %+16s : %-.32s")


#define FILTERFOOTPRINTKEY "FilterFootprint"
#define FILTERFOOTPRINTKEY "FilterFootprint"


cvpcb/options.cpp

deleted100644 → 0
+0 −225
Original line number Original line Diff line number Diff line
	/*****************************************************************/
	/** options.cpp: options pour la visualisation des composants  **/
	/****************************************************************/

#include "fctsys.h"

#include "wxstruct.h"
#include "common.h"
#include "cvpcb.h"
#include "protos.h"

enum {
	SET_OPTION = 8000,
	SET_EDGE_FORMAT,
	SET_TEXTE_FORMAT,
	PADFILL_OPT,
	PADNUM_OPT,
	EDGE_SELECT,
	TEXT_SELECT,
	ID_SAVE_CONFIG
	};


/********************************************/
/* Classes derivees pour la fenetre Options */
/********************************************/

class wxMyCheckBox: public wxCheckBox
{
private:
protected:
public:
	bool * BoolVar;

	// Constructor and destructor
	wxMyCheckBox(wxWindow *parent, int id, const wxString & Title,
				bool * RefVar, wxPoint& pos);
	~wxMyCheckBox(void) { };
};


	/************************************************************/
	/* classe derivee pour la fenetre de selection des options  */
	/*	   d'affichage du module                                */
	/************************************************************/

class wxOptionsBox: public wxDialog
{
private:
protected:
public:

	WinEDA_BasePcbFrame * m_Parent;
	wxMyCheckBox * IsShowPadFill;
	wxMyCheckBox * IsShowPadNum;
	wxRadioBox * EdgeRadioBox;
	wxRadioBox *TextRadioBox;

	// Constructor and destructor
	wxOptionsBox(WinEDA_BasePcbFrame * parent, wxPoint& pos);
	~wxOptionsBox(void);

	bool OnClose(void);
	void SetOptPadFill( wxCommandEvent& event);
	void SetOptPadNum( wxCommandEvent& event);
	void ReturnDisplayEdgeFormat(wxCommandEvent& event);
	void ReturnDisplayTexteFormat(wxCommandEvent& event);
	void SaveConfig(wxCommandEvent& event);

	DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(wxOptionsBox, wxDialog )
	EVT_CHECKBOX(PADFILL_OPT, wxOptionsBox::SetOptPadFill)
	EVT_CHECKBOX(PADNUM_OPT,  wxOptionsBox::SetOptPadNum)
	EVT_RADIOBOX(EDGE_SELECT, wxOptionsBox::ReturnDisplayEdgeFormat)
	EVT_RADIOBOX(TEXT_SELECT, wxOptionsBox::ReturnDisplayTexteFormat)
	EVT_BUTTON(ID_SAVE_CONFIG, wxOptionsBox::SaveConfig)
END_EVENT_TABLE()


/*********************************************************************/
void WinEDA_DisplayFrame::InstallOptionsDisplay(wxCommandEvent& event)
/*********************************************************************/
/* Creation de la fenetre d'options de la fenetre de visu */
{
wxPoint pos;

	GetPosition(&pos.x, &pos.y);
	pos.x += 10; if (pos.x < 0 ) pos.x = 0;
	pos.y += 50; if (pos.y < 0 ) pos.y = 0;

	wxOptionsBox * OptionWindow = new wxOptionsBox(this, pos);
	OptionWindow->ShowModal(); OptionWindow->Destroy();
}



	/********************************/
	/* Constructeur de wxMyCheckBox */
	/********************************/

wxMyCheckBox::wxMyCheckBox(wxWindow *parent, int id, const wxString & Title,
						bool * RefVar, wxPoint& pos):
			wxCheckBox(parent, id, Title, pos)
{
	BoolVar = RefVar;
	if( * BoolVar ) this->SetValue(TRUE);
	else this->SetValue(FALSE);
}


/******************************************************/
void wxOptionsBox::SetOptPadFill(wxCommandEvent& event)
/******************************************************/
{
	*IsShowPadFill->BoolVar == 0 ?
		* IsShowPadFill->BoolVar = 1 : * IsShowPadFill->BoolVar = 0;
	DisplayOpt.DisplayPadFill = m_Parent->m_DisplayPadFill = IsShowPadFill->BoolVar;
	m_Parent->ReDrawPanel();
}

/******************************************************/
void wxOptionsBox::SetOptPadNum(wxCommandEvent& event)
/******************************************************/
{
	*IsShowPadNum->BoolVar == 0 ?
		*IsShowPadNum->BoolVar = TRUE : *IsShowPadNum->BoolVar = FALSE;

    DisplayOpt.DisplayPadNum = m_Parent->m_DisplayPadNum = IsShowPadNum->BoolVar;
	m_Parent->ReDrawPanel();
}

	/********************************/
	/* Constructeur de wxOptionsBox */
	/********************************/

wxOptionsBox::wxOptionsBox(WinEDA_BasePcbFrame * parent, wxPoint& bpos):
			wxDialog(parent, -1,  _("Options"),	bpos, wxSize(220, 195),
					DIALOG_STYLE)
{
wxPoint pos;

	m_Parent = parent;

	SetFont(*g_DialogFont);

	pos.x = 100; pos.y = 15;
	new wxButton(this,	ID_SAVE_CONFIG,	 _("Save Cfg"), pos);

	pos.x = 10; pos.y = 10;
	IsShowPadFill = new wxMyCheckBox(this,
							PADFILL_OPT,
							 _("&Pad Fill"),
							&DisplayOpt.DisplayPadFill, pos);

	pos.y += 20;
	IsShowPadNum = new wxMyCheckBox(this,
							PADNUM_OPT,
							 _("Pad &Num"),
							&DisplayOpt.DisplayPadNum, pos);

	pos.y += 25;
wxString DrawOpt[] = { _("&Filaire"), _("&Filled"), _("&Sketch")};
	EdgeRadioBox = new wxRadioBox(this, EDGE_SELECT,
						 _("Edges:"),
						pos, wxSize(-1,-1),
						3,DrawOpt,1,wxRA_SPECIFY_COLS);

	EdgeRadioBox->SetSelection(DisplayOpt.DisplayModEdge);

	pos.x += 100;
	TextRadioBox = new wxRadioBox(this, TEXT_SELECT,
						 _("Texts:"),
						pos,wxSize(-1,-1),
						3, DrawOpt, 1,wxRA_SPECIFY_COLS);

	TextRadioBox->SetSelection(DisplayOpt.DisplayModText);

}

	/*****************************/
	/* Destructeur de OptionsBox */
	/*****************************/

wxOptionsBox::~wxOptionsBox(void)
{
}


	/**************************************/
	/* Fonctions de base de wxMyDialogBox */
	/**************************************/

/*******************************/
bool wxOptionsBox::OnClose(void)
/*******************************/
{
	Show(FALSE);
	return TRUE;
}

/****************************************************************/
void wxOptionsBox::ReturnDisplayEdgeFormat(wxCommandEvent& event)
/****************************************************************/
{
	DisplayOpt.DisplayModEdge = m_Parent->m_DisplayModEdge = EdgeRadioBox->GetSelection();
	m_Parent->ReDrawPanel();
}

/****************************************************************/
void wxOptionsBox::ReturnDisplayTexteFormat(wxCommandEvent& event)
/****************************************************************/
{
	DisplayOpt.DisplayModText = m_Parent->m_DisplayModText = TextRadioBox->GetSelection();
	m_Parent->ReDrawPanel();
}


/***************************************************/
void wxOptionsBox::SaveConfig(wxCommandEvent& event)
/***************************************************/
{
	Save_Config(this);
}

cvpcb/rdorcad.cpp

deleted100644 → 0
+0 −320
Original line number Original line Diff line number Diff line
	/************/
	/* rdorcad()*/
	/************/

/* convertit la netliste ORCADPCB en netliste ORCADPCB (fichier temporaire)
assure la raffectation des alimentations selon le format :
( XXXXXX VALEUR|(pin1,pin2,...=newalim) ID VALEUR
*/

#include "fctsys.h"

#include "wxstruct.h"
#include "common.h"
#include "cvpcb.h"

#include "protos.h"

#define SEPARATEUR '|'  /* caractere separateur dans netliste */

/* routines locales : */

int pin_orcad(STORECMP * CurrentCmp);


	/****************************************/
	/* int WinEDA_CvpcbFrame::rdorcad(void) */
	/****************************************/

int WinEDA_CvpcbFrame::rdorcad(void)
{
int i , j , k ,l ;
char * LibName;
char Line[1024];
int FlagEESchema = 0;
char label[80] ;		/* buffer des references composants */
char ref_schema[80] ;	/* buffer de la ref schematique */
char val[80] ;		 /* buffer des valeurs/ref.lib */
char postval[80] ;	/* buffer de la valeur de fin de ligne (vraie valeur) */
char *ptchar ;		/* pointeur de service */
STORECMP * Cmp;

	modified = 0;
	Rjustify = 0;

	/* Raz buffer et variable de gestion */
	if( BaseListeCmp ) FreeMemoryComponants();

	/* Ouverture du fichier source */
	source = wxFopen(FFileName, wxT("rt"));
	if (source == 0)
	{
		wxString msg;
		msg.Printf( _("File <%s> not found"),FFileName.GetData());
		DisplayError(this, msg); return(-1);
	}

	/* Read the file header (must be  "( { OrCAD PCB" or "({ OrCAD PCB" ) */
	/* or "# EESchema Netliste"*/
	fgets(Line,255,source) ;
	/* test for netlist type PCB2 */
	i =  strnicmp(Line,"( {",3) ;
	if( i != 0 )
		i =  strnicmp(Line,"({",2) ;
	if( i != 0 )
	{
		i =  strnicmp(Line,"# EESchema",7) ;	/* net type EESchema */
		if( i == 0 ) FlagEESchema = 1;
	}

	if ( i != 0 )
	{
		wxString msg, Lineconv = CONV_FROM_UTF8(Line);
		msg.Printf( _("Unknown file format <%s>"), Lineconv.GetData());
		DisplayError(this, msg);
		fclose(source); return(-3) ;
	}

	SetStatusText( _("Netlist Format: EESchema"), 0);


	/* Lecture de la liste */
	for (;;)
	{
		/* recherche du debut de la description d'un composant */

		if( fgets(Line,80,source)  == 0 ) break;

		/* suppression des blancs en dbut de ligne */
		i = 0 ; while (Line[i] == ' ') i++ ;

		/* elimination des lignes vides : */
		if (Line[i] < ' ') continue ;

		if (strnicmp(&Line[i],"( ",2) != 0) continue ;

		/****************************/
		/* debut description trouve */
		/****************************/
		/* memo ident schema */
		while ( Line[i] != ' ') i++ ;
		while ( Line[i] == ' ') i++ ; /* i pointe 1er caractere de l'ident schema */

		j = 0 ; while ( Line[i] != ' ') ref_schema[j++] = Line[i++] ;
		ref_schema[j] = 0 ;

		/* recherche val/ref.lib */
		while ( Line[i] == ' ') i++ ; /* i pointe la valeur du composant */
		LibName = Line + i;

		memset(label, 0, sizeof(label));
		memset(val, 0, sizeof(val) ) ;
		memset(postval, 0, sizeof(postval) ) ;
		memset(alim, 0, sizeof(alim) ) ;

		/* lecture valeur du composant */

		/* recherche fin de valeur (' ') */
		ptchar = strstr(&Line[i]," ") ;
		if (ptchar == 0)
		{
		wxString msg;
		msg.Printf( _("Netlist error: %s"),Line) ;
			DisplayError(NULL, msg);
			k = 0 ;
		}
		else k = ptchar - Line ;

		for (j = 0 ; i < k ;  i++)
		{
			 if ( Line[i] == SEPARATEUR ) break ;
			 if ( j < 8 ) val[j++] = Line[i] ;
		}

		if ( (Line[++i] == '(') && (Line[k-1] == ')' ) )
		{
			i++ ; l = 0 ; while ( k-1 > i ) alim[l++] = Line[i++] ;
		}

		else	i = k ;

		/* recherche reference du composant */
		while(Line[i] != ' ') i++ ; /* elimination fin valeur */
		while(Line[i] == ' ') i++ ; /* recherche debut reference */

		/* debut reference trouv */
		for ( k = 0 ; k < 8 ; i++ , k++ )
		{
			if ( Line[i] <= ' ' ) break ;
			label[k] = Line[i] ;
		}

		/* recherche vraie valeur du composant */
		while(Line[i] != ' ') i++ ; /* elimination fin reference */
		while(Line[i] == ' ') i++ ; /* recherche debut vraie valeur */

		/* debut vraie valeur trouve */
		for ( k = 0 ; k < 16 ; i++ , k++ )
		{
			if ( Line[i] <= ' ' ) break ;
			postval[k] = Line[i] ;
		}


		/* classement du composant ,suivi de sa valeur */
		Cmp = new STORECMP();
		Cmp->Pnext = BaseListeCmp;
		BaseListeCmp = Cmp;
		Cmp->m_Reference = CONV_FROM_UTF8(label);
		Cmp->m_Valeur = CONV_FROM_UTF8(postval) ;

		if( FlagEESchema )	/* Copie du nom module: */
		{
			if( strnicmp(LibName, "$noname", 7 ) != 0 )
			{
				while( *LibName > ' ' )
				{
					Cmp->m_Module.Append(*LibName);
					LibName++;
				}
			}
		}
		/* classement du TimeStamp */
		Cmp->m_TimeStamp = CONV_FROM_UTF8(ref_schema);

		pin_orcad( Cmp) ;

		nbcomp++ ;
	}
	fclose(source);

	/* reclassement alpabtique : */
	BaseListeCmp = TriListeComposantss( BaseListeCmp, nbcomp);

	return(0);
}

/***********************************/
int pin_orcad(STORECMP * Cmp)
/***********************************/
{
int i , jj;
char numpin[9] , net[1024] ;
char Line[1024];
STOREPIN * Pin = NULL;
STOREPIN ** LastPin = & Cmp->m_Pins;

for ( ;; )
	{
	/* debut description trouv */
	for ( ;; )
		{
		if ( fgets(Line,80,source) == 0 ) return(-1) ;

		/* suppression des blancs en dbut de ligne */
		i = 0 ; while (Line[i] == ' ') i++ ;
		while (Line[i] == '(') i++ ;
		while (Line[i] == ' ') i++ ;

		/* elimination des lignes vides : */
		if (Line[i] < ' ') continue ;

		/* fin de description ? */
		if (Line[i] == ')' ) return(0) ;

		memset( net, 0, sizeof(net) );
		memset( numpin, 0, sizeof(numpin) );

		/* lecture name pin , 4 lettres */
		for (jj = 0 ; jj < 4 ; jj++ , i++)
			{
			if ( Line[i] == ' ' ) break ;
			numpin[jj] = Line[i] ;
			}

		/* recherche affectation force de net  */
		if ( reaffect(numpin,net) != 0)
		{
			Pin = new STOREPIN();
			*LastPin = Pin; LastPin = &Pin->Pnext;
			Pin->m_PinNum = CONV_FROM_UTF8(numpin);
			Pin->m_PinNet = CONV_FROM_UTF8(net);
			continue ;
		}

		/* recherche netname */
		while(Line[i] == ' ') i++ ; /* recherche debut reference */

		/* debut netname trouv */
		for ( jj = 0 ; jj < (int)sizeof(net)-1 ; i++ , jj++ )
			{
			if ( Line[i] <= ' ' ) break ;
			net[jj] = Line[i] ;
			}

		Pin =  new STOREPIN();
		*LastPin = Pin; LastPin = &Pin->Pnext;
		Pin->m_PinNum = CONV_FROM_UTF8(numpin);
		Pin->m_PinNet = CONV_FROM_UTF8(net);
		}
	}
}


/****************************************************************/
STORECMP * TriListeComposantss(STORECMP * BaseListe, int nbitems)
/****************************************************************/
/* Tri la liste des composants par ordre alphabetique et me a jour
le nouveau chainage avant/arriere
	retourne un pointeur sur le 1er element de la liste
*/
{
STORECMP ** bufferptr, * Item;
int ii;

	if (nbitems <= 0 ) return(NULL);
	bufferptr = (STORECMP**)MyZMalloc( (nbitems+2) * sizeof(STORECMP*) );

	for( ii= 1, Item = BaseListe; Item != NULL; Item = Item->Pnext, ii++)
	{
		bufferptr[ii] = Item;
	}

	/* ici bufferptr[0] = NULL et bufferptr[nbitem+1] = NULL et ces 2 valeurs
	representent le chainage arriere du 1er element, et le chainage avant
	du dernier element */

	qsort(bufferptr+1,nbitems,sizeof(STORECMP*),
							(int(*)(const void*,const void*))CmpCompare) ;
	/* Mise a jour du chainage */
	for( ii = 1; ii <= nbitems; ii++ )
	{
		Item = bufferptr[ii];
		Item->m_Num = ii;
		Item->Pnext = bufferptr[ii+1];
		Item->Pback = bufferptr[ii-1];
	}
	return(bufferptr[1]);
}


/****************************************/
int CmpCompare(void * mod1, void * mod2)
/****************************************/
/*
routine compare() pour qsort() en classement alphabetique des composants
*/
{
int ii;
STORECMP *pt1 , *pt2 ;

	pt1 = * ((STORECMP**)mod1);
	pt2 = * ((STORECMP**)mod2);

	//FIXME:
	ii = StrNumICmp( (const wxChar*) pt1->m_Reference, (const wxChar*) pt2->m_Reference );
	return(ii);
}


+19 −19
Original line number Original line Diff line number Diff line
@@ -29,10 +29,10 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist(void)
int i , j , k ,l ;
int i , j , k ,l ;
char * LibName;
char * LibName;
char Line[1024];
char Line[1024];
char label[80] ;		/* buffer des references composants */
char component_reference[80] ;		/* buffer des references composants */
char ref_schema[80] ;				/* buffer de la ref schematique */
char ref_schema[80] ;				/* buffer de la ref schematique */
char val[80] ;		 /* buffer des valeurs/ref.lib */
char footprint_name[80] ;			/* buffer des ref.lib */
char postval[80] ;	/* buffer de la valeur de fin de ligne (vraie valeur) */
char component_value[80] ;			/* buffer des valeurs  */
char *ptchar ;		/* pointeur de service */
char *ptchar ;		/* pointeur de service */
STORECMP * Cmp;
STORECMP * Cmp;


@@ -111,9 +111,9 @@ STORECMP * Cmp;
		while ( Line[i] == ' ') i++ ; /* i pointe la valeur du composant */
		while ( Line[i] == ' ') i++ ; /* i pointe la valeur du composant */
		LibName = Line + i;
		LibName = Line + i;


		memset(label, 0, sizeof(label));
		memset(component_reference, 0, sizeof(component_reference));
		memset(val, 0, sizeof(val) ) ;
		memset(footprint_name, 0, sizeof(footprint_name) ) ;
		memset(postval, 0, sizeof(postval) ) ;
		memset(component_value, 0, sizeof(component_value) ) ;
		memset(alim, 0, sizeof(alim) ) ;
		memset(alim, 0, sizeof(alim) ) ;


		/* lecture valeur du composant */
		/* lecture valeur du composant */
@@ -132,7 +132,8 @@ STORECMP * Cmp;
		for (j = 0 ; i < k ;  i++)
		for (j = 0 ; i < k ;  i++)
		{
		{
			if ( Line[i] == SEPARATEUR ) break ;
			if ( Line[i] == SEPARATEUR ) break ;
			 if ( j < 8 ) val[j++] = Line[i] ;
			if ( j < (int)(sizeof(footprint_name)-1) )
				footprint_name[j++] = Line[i] ;
		}
		}


		if ( (Line[++i] == '(') && (Line[k-1] == ')' ) )
		if ( (Line[++i] == '(') && (Line[k-1] == ')' ) )
@@ -147,21 +148,20 @@ STORECMP * Cmp;
		while(Line[i] == ' ') i++ ; /* recherche debut reference */
		while(Line[i] == ' ') i++ ; /* recherche debut reference */


		/* debut reference trouv */
		/* debut reference trouv */
		for ( k = 0 ; k < 8 ; i++ , k++ )
		for ( k = 0 ; k < (int)(sizeof(component_reference)-1) ; i++ , k++ )
		{
		{
			if ( Line[i] <= ' ' ) break ;
			if ( Line[i] <= ' ' ) break ;
			label[k] = Line[i] ;
			component_reference[k] = Line[i] ;
		}
		}


		/* recherche vraie valeur du composant */
		/* recherche valeur du composant */
		while(Line[i] != ' ') i++ ; /* elimination fin reference */
		while(Line[i] == ' ') i++ ; /* recherche debut valeur */
		while(Line[i] == ' ') i++ ; /* recherche debut vraie valeur */


		/* debut vraie valeur trouve */
		/* debut vraie valeur trouvee */
		for ( k = 0 ; k < 16 ; i++ , k++ )
		for ( k = 0 ; k < (int)(sizeof(component_value)-1) ; i++ , k++ )
		{
		{
			if ( Line[i] <= ' ' ) break ;
			if ( Line[i] <= ' ' ) break ;
			postval[k] = Line[i] ;
			component_value[k] = Line[i] ;
		}
		}




@@ -169,8 +169,8 @@ STORECMP * Cmp;
		Cmp = new STORECMP();
		Cmp = new STORECMP();
		Cmp->Pnext = g_BaseListeCmp;
		Cmp->Pnext = g_BaseListeCmp;
		g_BaseListeCmp = Cmp;
		g_BaseListeCmp = Cmp;
		Cmp->m_Reference = CONV_FROM_UTF8(label);
		Cmp->m_Reference = CONV_FROM_UTF8(component_reference);
		Cmp->m_Valeur = CONV_FROM_UTF8(postval) ;
		Cmp->m_Valeur = CONV_FROM_UTF8(component_value) ;


		if(  g_FlagEESchema )	/* Copie du nom module: */
		if(  g_FlagEESchema )	/* Copie du nom module: */
		{
		{
Loading