pcbnew: better messages in drc control and some other enhancements

This commit is contained in:
CHARRAS 2007-07-25 09:02:05 +00:00
parent d84960f3b0
commit f27208a11b
23 changed files with 712 additions and 1253 deletions

View File

@ -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

View File

@ -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"

View File

@ -1,225 +0,0 @@
/*****************************************************************/
/** 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);
}

View File

@ -1,320 +0,0 @@
/************/
/* 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);
}

View File

@ -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 */
@ -131,8 +131,9 @@ 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: */
{ {

View File

@ -5,7 +5,7 @@
COMMON_GLOBL wxString g_BuildVersion COMMON_GLOBL wxString g_BuildVersion
#ifdef EDA_BASE #ifdef EDA_BASE
(wxT("(2007-07-09)")) (wxT("(2007-07-24)"))
#endif #endif
; ;

View File

@ -12,17 +12,17 @@ enum main_id {
ID_PROJECT_TREE_REFRESH, ID_PROJECT_TREE_REFRESH,
ID_PROJECT_RUNPY, ID_PROJECT_RUNPY,
ID_PROJECT_NEWFILE, ID_PROJECT_NEWFILE,
ID_PROJECT_NEWSCH, ID_PROJECT_UNUSED0,
ID_PROJECT_NEWBRD, ID_PROJECT_UNUSED1,
ID_PROJECT_NEWPY, ID_PROJECT_NEWPY,
ID_PROJECT_NEWGERBER, ID_PROJECT_UNUSED2,
ID_PROJECT_NEWTXT, ID_PROJECT_NEWTXT,
ID_PROJECT_NEWNET, ID_PROJECT_UNUSED3,
ID_PROJECT_NEWDIR, ID_PROJECT_NEWDIR,
ID_PROJECT_DELETE, ID_PROJECT_DELETE,
ID_PROJECT_RENAME, ID_PROJECT_RENAME,
ID_PROJECT_UNUSED0, ID_PROJECT_OPEN_FILE_WITH_TEXT_EDITOR,
ID_PROJECT_UNUSED1, ID_PROJECT_UNUSED4,
ID_MAIN_COMMAND, ID_MAIN_COMMAND,
ID_TO_EDITOR, ID_TO_EDITOR,

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -23,10 +23,6 @@
#include "bitmaps/icon_gerbview_small.xpm" #include "bitmaps/icon_gerbview_small.xpm"
#include "bitmaps/icon_cvpcb_small.xpm" #include "bitmaps/icon_cvpcb_small.xpm"
#include "bitmaps/unknown.xpm" #include "bitmaps/unknown.xpm"
//#include "bitmaps/new_gerb.xpm"
//#include "bitmaps/new_pcb.xpm"
//#include "bitmaps/new_sch.xpm"
//#include "bitmaps/new_cvpcb.xpm"
#include "id.h" #include "id.h"

View File

@ -20,7 +20,9 @@
#include "wx/dir.h" #include "wx/dir.h"
#include "bitmaps.h" #include "bitmaps.h"
#ifdef KICAD_PYTHON
#include "bitmaps/new_python.xpm" #include "bitmaps/new_python.xpm"
#endif
#include "id.h" #include "id.h"
@ -68,7 +70,7 @@ WinEDA_PrjFrame::WinEDA_PrjFrame(WinEDA_MainFrame * parent,
item = new wxMenuItem(menu, ID_PROJECT_TXTEDIT, item = new wxMenuItem(menu, ID_PROJECT_TXTEDIT,
_("&Edit in a text editor"), _("&Edit in a text editor"),
_("Edit the Python Script in a Text Editor") ); _("&Open the file in a Text Editor") );
item->SetBitmap( icon_txt_xpm ); item->SetBitmap( icon_txt_xpm );
menu->Append( item ); menu->Append( item );
@ -110,6 +112,14 @@ WinEDA_PrjFrame::WinEDA_PrjFrame(WinEDA_MainFrame * parent,
, TREE_DIRECTORY != i ? _("Rename the File") : _("&Rename the Directory") ); , TREE_DIRECTORY != i ? _("Rename the File") : _("&Rename the Directory") );
item->SetBitmap( right_xpm ); item->SetBitmap( right_xpm );
menu->Append( item ); menu->Append( item );
if ( TREE_DIRECTORY != i )
{
item = new wxMenuItem(menu, ID_PROJECT_TXTEDIT
, _("&Edit in a text editor")
, _("Open the file in a Text Editor"));
item->SetBitmap( icon_txt_xpm );
menu->Append( item );
}
item = new wxMenuItem(menu, ID_PROJECT_DELETE item = new wxMenuItem(menu, ID_PROJECT_DELETE
, TREE_DIRECTORY != i ? _("&Delete File") : _("&Delete Directory") , TREE_DIRECTORY != i ? _("&Delete File") : _("&Delete Directory")
, TREE_DIRECTORY != i ? _("Delete the File") : _("&Delete the Directory and its content") ); , TREE_DIRECTORY != i ? _("Delete the File") : _("&Delete the Directory and its content") );
@ -132,12 +142,8 @@ BEGIN_EVENT_TABLE(WinEDA_PrjFrame, wxSashLayoutWindow)
EVT_MENU(ID_PROJECT_TXTEDIT, WinEDA_PrjFrame::OnTxtEdit) EVT_MENU(ID_PROJECT_TXTEDIT, WinEDA_PrjFrame::OnTxtEdit)
EVT_MENU(ID_PROJECT_NEWFILE, WinEDA_PrjFrame::OnNewFile) EVT_MENU(ID_PROJECT_NEWFILE, WinEDA_PrjFrame::OnNewFile)
EVT_MENU(ID_PROJECT_NEWDIR, WinEDA_PrjFrame::OnNewDirectory) EVT_MENU(ID_PROJECT_NEWDIR, WinEDA_PrjFrame::OnNewDirectory)
EVT_MENU(ID_PROJECT_NEWSCH, WinEDA_PrjFrame::OnNewSchFile)
EVT_MENU(ID_PROJECT_NEWBRD, WinEDA_PrjFrame::OnNewBrdFile)
EVT_MENU(ID_PROJECT_NEWPY, WinEDA_PrjFrame::OnNewPyFile) EVT_MENU(ID_PROJECT_NEWPY, WinEDA_PrjFrame::OnNewPyFile)
EVT_MENU(ID_PROJECT_NEWGERBER, WinEDA_PrjFrame::OnNewGerberFile)
EVT_MENU(ID_PROJECT_NEWTXT, WinEDA_PrjFrame::OnNewTxtFile) EVT_MENU(ID_PROJECT_NEWTXT, WinEDA_PrjFrame::OnNewTxtFile)
EVT_MENU(ID_PROJECT_NEWNET, WinEDA_PrjFrame::OnNewNetFile)
EVT_MENU(ID_PROJECT_DELETE, WinEDA_PrjFrame::OnDeleteFile) EVT_MENU(ID_PROJECT_DELETE, WinEDA_PrjFrame::OnDeleteFile)
EVT_MENU(ID_PROJECT_RENAME, WinEDA_PrjFrame::OnRenameFile) EVT_MENU(ID_PROJECT_RENAME, WinEDA_PrjFrame::OnRenameFile)
@ -312,12 +318,8 @@ wxMenu * WinEDA_PrjFrame::GetContextMenu( int type )
void WinEDA_PrjFrame::OnNewDirectory(wxCommandEvent & event) { NewFile( TREE_DIRECTORY ); } void WinEDA_PrjFrame::OnNewDirectory(wxCommandEvent & event) { NewFile( TREE_DIRECTORY ); }
void WinEDA_PrjFrame::OnNewFile(wxCommandEvent & event) { NewFile( TREE_UNKNOWN ); } void WinEDA_PrjFrame::OnNewFile(wxCommandEvent & event) { NewFile( TREE_UNKNOWN ); }
void WinEDA_PrjFrame::OnNewSchFile(wxCommandEvent & event) { NewFile( TREE_SCHEMA ); }
void WinEDA_PrjFrame::OnNewBrdFile(wxCommandEvent & event) { NewFile( TREE_PCB ); }
void WinEDA_PrjFrame::OnNewPyFile(wxCommandEvent & event) { NewFile( TREE_PY ); } void WinEDA_PrjFrame::OnNewPyFile(wxCommandEvent & event) { NewFile( TREE_PY ); }
void WinEDA_PrjFrame::OnNewGerberFile(wxCommandEvent & event) { NewFile( TREE_GERBER ); }
void WinEDA_PrjFrame::OnNewTxtFile(wxCommandEvent & event) { NewFile( TREE_TXT ); } void WinEDA_PrjFrame::OnNewTxtFile(wxCommandEvent & event) { NewFile( TREE_TXT ); }
void WinEDA_PrjFrame::OnNewNetFile(wxCommandEvent & event) { NewFile( TREE_NET ); }
/******************************************************************/ /******************************************************************/
void WinEDA_PrjFrame::NewFile( enum TreeFileType type ) void WinEDA_PrjFrame::NewFile( enum TreeFileType type )
@ -393,30 +395,48 @@ void WinEDA_PrjFrame::NewFile( const wxString & name,
wxString WinEDA_PrjFrame::GetFileExt( enum TreeFileType type ) wxString WinEDA_PrjFrame::GetFileExt( enum TreeFileType type )
/******************************************************************/ /******************************************************************/
{ {
wxString extensions[] = wxString ext;
{
wxT( "" ), // 0 is not used switch ( type )
wxT( ".pro" ), // TREE_PROJECT {
g_SchExtBuffer, // TREE_SCHEMA case 0 :
g_BoardExtBuffer, // TREE_PCB break; // 0 is not used
wxT( ".py" ), // TREE_PY case TREE_PROJECT:
g_GerberExtBuffer, // TREE_GERBER ext = wxT( ".pro" );
wxT( ".pdf" ), // TREE_PDF break;
wxT( ".txt" ), // TREE_TXT case TREE_SCHEMA:
wxT( ".net" ), // TREE_NET ext = g_SchExtBuffer;
wxT( "" ), // TREE_UNKNOWN break;
wxT( "" ), // TREE_DIRECTORY case TREE_PCB:
ext = g_BoardExtBuffer;
break;
case TREE_PY:
ext = wxT( ".py" );
break;
case TREE_GERBER:
ext = g_GerberExtBuffer;
break;
case TREE_PDF:
ext = wxT( ".pdf" );
break;
case TREE_TXT:
ext = wxT( ".txt" );
break;
case TREE_NET:
ext = wxT( ".net" );
break;
default:
break;
}; };
if ( type < TREE_MAX ) return extensions[type]; return ext;
return wxEmptyString;
} }
/**************************************************************************/ /**************************************************************************/
void WinEDA_PrjFrame::AddFile( const wxString & name, wxTreeItemId & root ) void WinEDA_PrjFrame::AddFile( const wxString & name, wxTreeItemId & root )
/**************************************************************************/ /**************************************************************************/
/* add filename "name" to the tree /* add filename "name" to the tree
if name is adirectory, add the sub directory file names if name is a directory, add the sub directory file names
*/ */
{ {
wxTreeItemId cellule; wxTreeItemId cellule;

View File

@ -17,7 +17,7 @@ KICAD_BIN = /f/kicad/winexe
#Define the wxWidget path (if not found in environment variables): #Define the wxWidget path (if not found in environment variables):
ifndef WXWIN ifndef WXWIN
WXWIN=/f/wxMSW-2.8.4 WXWIN=f:/wxMSW-2.8.4
endif endif
LIBVERSION = 2.8 LIBVERSION = 2.8

View File

@ -17,7 +17,7 @@
; General Product Description Definitions ; General Product Description Definitions
!define PRODUCT_NAME "KiCad" !define PRODUCT_NAME "KiCad"
!define PRODUCT_VERSION "2007.05.25" !define PRODUCT_VERSION "2007.07.09"
!define PRODUCT_WEB_SITE "http://www.lis.inpg.fr/realise_au_lis/kicad/" !define PRODUCT_WEB_SITE "http://www.lis.inpg.fr/realise_au_lis/kicad/"
!define COMPANY_NAME "" !define COMPANY_NAME ""
!define TRADE_MARKS "" !define TRADE_MARKS ""

View File

@ -78,7 +78,7 @@ void D_PAD::ComputeRayon(void)
} }
/*********************************************/ /*********************************************/
const wxPoint D_PAD::ReturnShapePos(void) const const wxPoint D_PAD::ReturnShapePos(void)
/*********************************************/ /*********************************************/
// retourne la position de la forme (pastilles excentrees) // retourne la position de la forme (pastilles excentrees)
{ {

View File

@ -76,7 +76,7 @@ public:
wxString ReturnStringPadName(void); // Return pad name as string in a wxString wxString ReturnStringPadName(void); // Return pad name as string in a wxString
void ReturnStringPadName(wxString & text); // Return pad name as string in a buffer void ReturnStringPadName(wxString & text); // Return pad name as string in a buffer
void ComputeRayon(void); // met a jour m_Rayon, rayon du cercle exinscrit void ComputeRayon(void); // met a jour m_Rayon, rayon du cercle exinscrit
const wxPoint ReturnShapePos(void) const; // retourne la position const wxPoint ReturnShapePos(void); // retourne la position
// de la forme (pastilles excentrees) // de la forme (pastilles excentrees)
void Display_Infos(WinEDA_BasePcbFrame * frame); void Display_Infos(WinEDA_BasePcbFrame * frame);
}; };

View File

@ -125,6 +125,7 @@ public:
////@end WinEDA_DrcFrame member variables ////@end WinEDA_DrcFrame member variables
WinEDA_PcbFrame * m_Parent; WinEDA_PcbFrame * m_Parent;
wxDC * m_DC; wxDC * m_DC;
int m_UnconnectedCount;
}; };
#endif #endif

View File

@ -1,7 +1,6 @@
/*******************************/ /****************************/
/* Edition des pistes */ /* DRC control */
/* Routines DRC */ /****************************/
/*******************************/
#include "fctsys.h" #include "fctsys.h"
#include "gr_basic.h" #include "gr_basic.h"
@ -28,7 +27,7 @@ static int segm_long; // longueur du segment de reference
static int xcliplo,ycliplo,xcliphi,ycliphi ; /* coord de la surface de securite du segment a comparer */ static int xcliplo,ycliplo,xcliphi,ycliphi ; /* coord de la surface de securite du segment a comparer */
/* Routines Locales */ /* Routines Locales */
static int Pad_to_Pad_Isol(const D_PAD * pad_ref, const D_PAD * pad, const int dist_min); static int Pad_to_Pad_Isol(D_PAD * pad_ref, D_PAD * pad, const int dist_min);
static bool TestPadDrc(WinEDA_BasePcbFrame *frame, wxDC * DC, D_PAD * pad_ref, static bool TestPadDrc(WinEDA_BasePcbFrame *frame, wxDC * DC, D_PAD * pad_ref,
LISTE_PAD * start_buffer, LISTE_PAD * end_buffer, int max_size, bool show_err); LISTE_PAD * start_buffer, LISTE_PAD * end_buffer, int max_size, bool show_err);
static int distance_a_pad(const D_PAD* pad_to_test, int seg_width, int isol); static int distance_a_pad(const D_PAD* pad_to_test, int seg_width, int isol);
@ -37,7 +36,7 @@ static int Tst_Ligne(int x1,int y1,int x2,int y2);
static void Affiche_Erreur_DRC(WinEDA_DrawPanel * panel, wxDC * DC, BOARD * Pcb, static void Affiche_Erreur_DRC(WinEDA_DrawPanel * panel, wxDC * DC, BOARD * Pcb,
TRACK * pt_ref, void * pt_item, int errnumber); TRACK * pt_ref, void * pt_item, int errnumber);
static void Affiche_Erreur_DRC(WinEDA_DrawPanel * panel, wxDC * DC, static void Affiche_Erreur_DRC(WinEDA_DrawPanel * panel, wxDC * DC,
BOARD * Pcb, const D_PAD * pad1, const D_PAD * pad2); BOARD * Pcb, D_PAD * pad1, D_PAD * pad2);
@ -51,9 +50,9 @@ void WinEDA_DrcFrame::ListUnconnectedPads(wxCommandEvent & event)
/***************************************************************/ /***************************************************************/
{ {
if( (m_Parent->m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 ) if( (m_Parent->m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 )
{ {
m_Parent->Compile_Ratsnest( m_DC, TRUE); m_Parent->Compile_Ratsnest( m_DC, TRUE);
} }
if( m_Parent->m_Pcb->m_Ratsnest == NULL ) return; if( m_Parent->m_Pcb->m_Ratsnest == NULL ) return;
CHEVELU* Ratsnest = m_Parent->m_Pcb->m_Ratsnest; CHEVELU* Ratsnest = m_Parent->m_Pcb->m_Ratsnest;
@ -62,23 +61,34 @@ WinEDA_DrawPanel * panel = m_Parent->DrawPanel;
int ii; int ii;
wxString msg; wxString msg;
float convert = 0.0001; float convert = 0.0001;
int unconnect = 0;
for( ii = m_Parent->m_Pcb->GetNumRatsnests() ;ii > 0; Ratsnest++, ii--)
{
if( (Ratsnest->status & CH_ACTIF) == 0) continue;
unconnect++;
Ratsnest->pad_start->Draw(panel, m_DC, wxPoint(0,0),draw_mode);
Ratsnest->pad_end->Draw(panel, m_DC, wxPoint(0,0),draw_mode);
msg.Printf(_("Unconnected:\nPad @ %.4f,%.4f and\nPad @ %.4f,%.4f\n"),
Ratsnest->pad_start->m_Pos.x * convert, Ratsnest->pad_start->m_Pos.y * convert,
Ratsnest->pad_end->m_Pos.x * convert, Ratsnest->pad_end->m_Pos.y * convert);
m_logWindow->AppendText(msg);
}
if ( unconnect ) msg.Printf(_("Active routes: %d\n"), unconnect); m_logWindow->AppendText(_("Look for active routes\n"));
else msg = _("OK! (No unconnect)\n"); m_UnconnectedCount = 0;
for( ii = m_Parent->m_Pcb->GetNumRatsnests() ;ii > 0; Ratsnest++, ii--)
{
if( (Ratsnest->status & CH_ACTIF) == 0) continue;
m_UnconnectedCount++;
if ( m_UnconnectedCount == 1 ) m_logWindow->AppendText(_("Unconnected found:\n") );
D_PAD * pad = Ratsnest->pad_start;
pad->Draw(panel, m_DC, wxPoint(0,0),draw_mode);
wxString pad_name = pad->ReturnStringPadName();
wxString module_name = ((MODULE*)(pad->m_Parent))->m_Reference->m_Text;
msg.Printf(_("%d > Pad %s (%s) @ %.4f,%.4f and "), m_UnconnectedCount,
pad_name.GetData(), module_name.GetData(), pad->m_Pos.x * convert, pad->m_Pos.y * convert);
m_logWindow->AppendText(msg);
pad = Ratsnest->pad_end;
pad->Draw(panel, m_DC, wxPoint(0,0),draw_mode);
pad_name = pad->ReturnStringPadName();
module_name = ((MODULE*)(pad->m_Parent))->m_Reference->m_Text;
msg.Printf(_("Pad %s (%s) @ %.4f,%.4f\n"),
pad_name.GetData(), module_name.GetData(), pad->m_Pos.x * convert, pad->m_Pos.y * convert);
m_logWindow->AppendText(msg);
}
if ( m_UnconnectedCount ) msg.Printf(_("Active routes: %d\n"), m_UnconnectedCount);
else msg = _("OK! (No active routes)\n");
m_logWindow->AppendText(msg); m_logWindow->AppendText(msg);
m_logWindow->AppendText(_("End tst"));
} }
@ -94,10 +104,14 @@ wxString msg;
m_logWindow->Clear(); m_logWindow->Clear();
g_DesignSettings.m_TrackClearence = g_DesignSettings.m_TrackClearence =
ReturnValueFromTextCtrl(*m_SetClearance, m_Parent->m_InternalUnits); ReturnValueFromTextCtrl(*m_SetClearance, m_Parent->m_InternalUnits);
/* Test DRC errors (clearance errors, bad connections .. */
errors = m_Parent->Test_DRC(m_DC); errors = m_Parent->Test_DRC(m_DC);
/* Serach for active routes (unconnected pads) */
ListUnconnectedPads(event);
if ( errors ) if ( errors )
msg.Printf(_("** End Drc: %d errors **\n"),errors); msg.Printf(_("** End Drc: %d errors **\n"),errors);
else msg = _("** End Drc: No Error **\n"); else if ( m_UnconnectedCount == 0 )
msg = _("** End Drc: No Error **\n");
m_logWindow->AppendText(msg); m_logWindow->AppendText(msg);
} }
else wxBell(); else wxBell();
@ -655,7 +669,7 @@ LISTE_PAD * pad_list = start_buffer;
} }
/**************************************************************************************/ /**************************************************************************************/
static int Pad_to_Pad_Isol(const D_PAD * pad_ref, const D_PAD * pad, const int dist_min) static int Pad_to_Pad_Isol(D_PAD * pad_ref, D_PAD * pad, const int dist_min)
/***************************************************************************************/ /***************************************************************************************/
/* Return OK_DRC si distance entre pad_ref et pas >= dist_min /* Return OK_DRC si distance entre pad_ref et pas >= dist_min
et BAD_DRC sinon */ et BAD_DRC sinon */
@ -922,45 +936,49 @@ static void Affiche_Erreur_DRC(WinEDA_DrawPanel * panel, wxDC * DC, BOARD * Pcb,
number = numero d'identification number = numero d'identification
*/ */
{ {
int ercx, ercy; wxPoint erc_pos;
D_PAD * pt_pad; D_PAD * pad;
TRACK * pt_segm; TRACK * pt_segm;
wxString msg; wxString msg;
if( ((EDA_BaseStruct*)pt_item)->m_StructType == TYPEPAD ) if( ((EDA_BaseStruct*)pt_item)->m_StructType == TYPEPAD )
{ {
pt_pad = (D_PAD*) pt_item; pad = (D_PAD*) pt_item;
ercx = pt_pad->m_Pos.x; ercy = pt_pad->m_Pos.y; erc_pos = pad->m_Pos;
msg.Printf(_("%d Err type %d sur PAD @ %d,%d\n"), wxString pad_name = pad->ReturnStringPadName();
NumberOfErrors, errnumber, ercx,ercy); wxString module_name = ((MODULE*)(pad->m_Parent))->m_Reference->m_Text;
} msg.Printf(_("%d Drc Err %d PAD %s (%s) @ %d,%d\n"),
NumberOfErrors, errnumber,
pad_name.GetData(), module_name.GetData(),
erc_pos.x, erc_pos.y);
}
else /* erreur sur segment de piste */ else /* erreur sur segment de piste */
{ {
pt_segm = (TRACK *) pt_item; pt_segm = (TRACK *) pt_item;
ercx = pt_segm->m_Start.x; ercy = pt_segm->m_Start.y; erc_pos = pt_segm->m_Start;
if(pt_segm->m_StructType == TYPEVIA) if(pt_segm->m_StructType == TYPEVIA)
{ {
msg.Printf(_("%d Err type %d: sur VIA @ %d,%d\n"), msg.Printf(_("%d Err type %d: sur VIA @ %d,%d\n"),
NumberOfErrors, errnumber,ercx,ercy); NumberOfErrors, errnumber,erc_pos.x,erc_pos.y);
}
else
{
int ercfx = pt_segm->m_End.x, ercfy = pt_segm->m_End.y;
if(hypot( (double)(ercfx - pt_ref->m_End.x),(double)(ercfy - pt_ref->m_End.y) )
< hypot( (double)(ercx - pt_ref->m_End.x),(double)(ercy - pt_ref->m_End.y) ) )
{
EXCHG(ercfx, ercx); EXCHG(ercfy, ercy);
}
msg.Printf(_("%d Err type %d: sur SEGMENT @ %d,%d\n"),
NumberOfErrors, errnumber,ercx,ercy);
}
} }
else
{
wxPoint erc_pos_f = pt_segm->m_End;
if(hypot( (double)(erc_pos_f.x - pt_ref->m_End.x),(double)(erc_pos_f.y - pt_ref->m_End.y) )
< hypot( (double)(erc_pos.x - pt_ref->m_End.x),(double)(erc_pos.y - pt_ref->m_End.y) ) )
{
EXCHG(erc_pos_f.x, erc_pos.x); EXCHG(erc_pos_f.y, erc_pos.y);
}
msg.Printf(_("%d Err type %d: sur SEGMENT @ %d,%d\n"),
NumberOfErrors, errnumber,erc_pos.x,erc_pos.y);
}
}
if ( DrcFrame ) DrcFrame->m_logWindow->AppendText(msg); if ( DrcFrame ) DrcFrame->m_logWindow->AppendText(msg);
else panel->m_Parent->Affiche_Message(msg); else panel->m_Parent->Affiche_Message(msg);
if(current_marqueur == NULL) current_marqueur = new MARQUEUR(Pcb); if(current_marqueur == NULL) current_marqueur = new MARQUEUR(Pcb);
current_marqueur->m_Pos = wxPoint(ercx, ercy); current_marqueur->m_Pos = wxPoint(erc_pos.x, erc_pos.y);
current_marqueur->m_Color = WHITE; current_marqueur->m_Color = WHITE;
current_marqueur->m_Diag = msg; current_marqueur->m_Diag = msg;
current_marqueur->Draw(panel, DC, GR_OR); current_marqueur->Draw(panel, DC, GR_OR);
@ -969,7 +987,7 @@ wxString msg;
/******************************************************************************/ /******************************************************************************/
static void Affiche_Erreur_DRC(WinEDA_DrawPanel * panel, wxDC * DC, BOARD * Pcb, static void Affiche_Erreur_DRC(WinEDA_DrawPanel * panel, wxDC * DC, BOARD * Pcb,
const D_PAD * pad1, const D_PAD * pad2) D_PAD * pad1, D_PAD * pad2)
/******************************************************************************/ /******************************************************************************/
/* affiche les erreurs de DRC : /* affiche les erreurs de DRC :
@ -979,18 +997,21 @@ static void Affiche_Erreur_DRC(WinEDA_DrawPanel * panel, wxDC * DC, BOARD * Pcb,
number = numero d'identification number = numero d'identification
*/ */
{ {
int ercx, ercy;
wxString msg; wxString msg;
ercx = pad1->m_Pos.x; ercy = pad1->m_Pos.y; wxString pad_name1 = pad1->ReturnStringPadName();
msg.Printf( _("%d Err pad to pad (PAD @ %d,%d and PAD @ %d,%d\n"), wxString module_name1 = ((MODULE*)(pad1->m_Parent))->m_Reference->m_Text;
NumberOfErrors, ercx,ercy, wxString pad_name2 = pad2->ReturnStringPadName();
pad2->m_Pos.x, pad2->m_Pos.y); wxString module_name2 = ((MODULE*)(pad2->m_Parent))->m_Reference->m_Text;
msg.Printf( _("%d Drc Err: PAD %s (%s) @ %d,%d and PAD %s (%s) @ %d,%d\n"),
NumberOfErrors, pad_name1.GetData(), module_name1.GetData(), pad1->m_Pos.x,pad1->m_Pos.y,
pad_name2.GetData(), module_name2.GetData(), pad2->m_Pos.x, pad2->m_Pos.y);
if ( DrcFrame ) DrcFrame->m_logWindow->AppendText(msg); if ( DrcFrame ) DrcFrame->m_logWindow->AppendText(msg);
else panel->m_Parent->Affiche_Message(msg); else panel->m_Parent->Affiche_Message(msg);
if(current_marqueur == NULL) current_marqueur = new MARQUEUR(Pcb); if(current_marqueur == NULL) current_marqueur = new MARQUEUR(Pcb);
current_marqueur->m_Pos = wxPoint(ercx, ercy); current_marqueur->m_Pos = pad1->m_Pos;
current_marqueur->m_Color = WHITE; current_marqueur->m_Color = WHITE;
current_marqueur->m_Diag = msg; current_marqueur->m_Diag = msg;
current_marqueur->Draw(panel, DC, GR_OR); current_marqueur->Draw(panel, DC, GR_OR);

View File

@ -149,142 +149,76 @@ wxClientDC dc(DrawPanel);
if ( m_Draw3DFrame ) if ( m_Draw3DFrame )
m_Draw3DFrame->NewDisplay(); m_Draw3DFrame->NewDisplay();
break; break;
case ID_MODEDIT_UPDATE_MODULE_IN_BOARD:{
// update modules in the current board,
// not just add it to the board with total disregard for the
// netlist...?
WinEDA_PcbFrame * pcbframe = m_Parent->m_PcbFrame;
BOARD * mainpcb = pcbframe->m_Pcb;
MODULE * presmod = m_Pcb->m_Modules; //the module being edited.
//i guess we need to search through the modules here.. they are in a linked list.
//replace based on m_libref?
MODULE* mod = mainpcb->m_Modules;
do{
//need to be careful in this doubly linked-list to maintain order & link
// also have to maintain netname on all the pads according to m_NumPadName.
if(mod->m_LibRef == presmod->m_LibRef){//have to be careful with this test of similarity?
wprintf(L"replace: mod->m_LibRef = %S @ %d %d orient: %d\n", mod->m_LibRef.c_str(),
mod->m_Pos.x, mod->m_Pos.y, mod->m_Orient);
MODULE* newmod = new MODULE(mainpcb);
newmod->Copy(presmod); //this will copy the padstack layers etc
newmod->m_Parent = mainpcb; //modify after the copy above
if(mod->m_Layer != CMP_N){//just changing m_Layer is insufficient.
Change_Side_Module(newmod, &dc);
}
newmod->m_Pos = mod->m_Pos;
newmod->m_Orient =0; //otherwise the pads will be rotated with respect to the module.
//copy data into the pads...
D_PAD* newpad = newmod->m_Pads;
for(; newpad != NULL; newpad = (D_PAD*)newpad->Pnext){
D_PAD* pad = mod->m_Pads;
for(; pad != NULL; pad = (D_PAD*)pad->Pnext){
if(pad->m_NumPadName == newpad->m_NumPadName){
wprintf(L" pad->NumPadName %d @ %d %d :new %d %d, orient: %d\n", pad->m_NumPadName,
pad->m_Pos.x, pad->m_Pos.y, newpad->m_Pos.x, newpad->m_Pos.y, pad->m_Orient);
wprintf(L" pad->m_Netname %S\n", pad->m_Netname.c_str());
newpad->m_Netname = pad->m_Netname;
newpad->m_NetCode = pad->m_NetCode;
newpad->m_logical_connexion = pad->m_logical_connexion;
newpad->m_physical_connexion = pad->m_physical_connexion;
newpad->m_Pos.x += newmod->m_Pos.x; //the pad positions are apparently in global coordinates.
newpad->m_Pos.y += newmod->m_Pos.y;
newpad->m_Orient = pad->m_Orient;
}
}
}
//not sure what to do about m_Drawings..assume they are ok?
//copy only the text in m_Ref and m_Val;
//leave the size and position as in the module in edit.
newmod->m_Reference->m_Text = mod->m_Reference->m_Text;
newmod->m_Value->m_Text = mod->m_Value->m_Text;
wprintf(L"replace: mod->m_Reference = %S\n", newmod->m_Reference->m_Text.c_str());
wprintf(L"replace: mod->m_Value = %S\n", newmod->m_Value->m_Text.c_str());
newmod->m_Attributs = mod->m_Attributs;
newmod->m_Orient = mod->m_Orient;
newmod->flag = mod->flag;
newmod->m_Flags = 0; //inherited from EDA_BaseStruct.
newmod->m_ModuleStatus = mod->m_ModuleStatus;
//redo the boundary boxes
newmod->Set_Rectangle_Encadrement();
newmod->SetRectangleExinscrit();
newmod->m_CntRot90 = mod->m_CntRot90;
newmod->m_CntRot180 = mod->m_CntRot180;
newmod->m_Surface = mod->m_Surface;
pcbframe->Rotate_Module(NULL, newmod, mod->m_Orient, false);
//now, need to replace 'mod' in the linked list with 'newmod'.
//this does not seem to be working correctly..
MODULE* oldmod = mod;
mod = (MODULE*)mod->Pnext;
oldmod->UnLink();
delete oldmod;
//insert the new one.
newmod->Pnext = mainpcb->m_Modules;
mainpcb->m_Modules->Pback = newmod; // check this!
mainpcb->m_Modules = newmod;
newmod->Pback = mainpcb;
wprintf(L"-----\n");
}else{
mod = (MODULE*)mod->Pnext;
}
}while(mod != NULL);
GetScreen()->ClrModify();
pcbframe->GetScreen()->m_CurrentItem = NULL;
mainpcb->m_Status_Pcb = 0;
}
break;
case ID_MODEDIT_INSERT_MODULE_IN_BOARD: case ID_MODEDIT_INSERT_MODULE_IN_BOARD:
{ case ID_MODEDIT_UPDATE_MODULE_IN_BOARD:{
// update module in the current board,
// not just add it to the board with total disregard for the netlist...
WinEDA_PcbFrame * pcbframe = m_Parent->m_PcbFrame; WinEDA_PcbFrame * pcbframe = m_Parent->m_PcbFrame;
BOARD * mainpcb = pcbframe->m_Pcb; BOARD * mainpcb = pcbframe->m_Pcb;
MODULE * oldmodule = NULL; MODULE * source_module = NULL;
MODULE * module_in_edit = m_Pcb->m_Modules; MODULE * module_in_edit = m_Pcb->m_Modules;
// creation du nouveau module sur le PCB en cours // Search the old module (source) if exists
// create a new unit on the PCB, of course. // Because this source could be deleted when editing the main board...
if ( module_in_edit->m_Link ) // this is not a new module ...
{
source_module = mainpcb->m_Modules;
for( ; source_module != NULL ; source_module = (MODULE *) source_module->Pnext )
{
if( module_in_edit->m_Link == source_module->m_TimeStamp )
break;
}
}
if ( (source_module == NULL) && id == (ID_MODEDIT_UPDATE_MODULE_IN_BOARD) ) // source not found
{
wxString msg;
msg.Printf( _("Unable to find the footprint source on the main board") );
msg << _("\nCannot update the footprint");
DisplayError(this, msg);
break;
}
if ( (source_module != NULL) && id == (ID_MODEDIT_INSERT_MODULE_IN_BOARD) ) // source not found
{
wxString msg;
msg.Printf( _("A footprint source was found on the main board") );
msg << _("\nCannot insert this footprint");
DisplayError(this, msg);
break;
}
// Create the "new" module
MODULE * newmodule = new MODULE(mainpcb); MODULE * newmodule = new MODULE(mainpcb);
newmodule->Copy(module_in_edit); newmodule->Copy(module_in_edit);
newmodule->m_Parent = mainpcb; // modifie par la copie newmodule->m_Parent = mainpcb; // modifie par la copie
newmodule->m_Link = 0; newmodule->m_Link = 0;
// Recherche de l'ancien module correspondant // Put the footprint in the main pcb linked list.
//(qui a pu changer ou disparaitre a la suite d'<27>ditions)
//locate the corresponding former unit, which may have a different revision.
// I've taken this out, as it is superceded by 'update' above.
/*
if ( module_in_edit->m_Link )
{
oldmodule = mainpcb->m_Modules;
for( ; oldmodule != NULL ; oldmodule = (MODULE *) oldmodule->Pnext )
{
if( module_in_edit->m_Link == oldmodule->m_TimeStamp )
break;
}
}
*/
// Placement du module dans la liste des modules du PCB.
newmodule->Pnext = mainpcb->m_Modules; newmodule->Pnext = mainpcb->m_Modules;
mainpcb->m_Modules = newmodule; mainpcb->m_Modules = newmodule;
newmodule->Pback = mainpcb; newmodule->Pback = mainpcb;
if ( newmodule->Pnext ) newmodule->Pnext->Pback = newmodule; if ( newmodule->Pnext ) newmodule->Pnext->Pback = newmodule;
if ( oldmodule ) if ( source_module ) // this is an update command
{ {
newmodule = pcbframe->Exchange_Module(this, // The new module replace the old module (pos, orient, ref, value and connexions are kept)
oldmodule, newmodule); // and the source_module (old module) is deleted
newmodule = pcbframe->Exchange_Module(this, source_module, newmodule);
newmodule->m_TimeStamp = module_in_edit->m_Link; newmodule->m_TimeStamp = module_in_edit->m_Link;
} }
else else // This is an insert command
{ {
wxPoint cursor_pos = pcbframe->GetScreen()->m_Curseur;
pcbframe->GetScreen()->m_Curseur = wxPoint(0,0);
pcbframe->Place_Module(newmodule, NULL); pcbframe->Place_Module(newmodule, NULL);
pcbframe->GetScreen()->m_Curseur = cursor_pos;
newmodule->m_TimeStamp = GetTimeStamp(); newmodule->m_TimeStamp = GetTimeStamp();
} }
newmodule->m_Flags = 0; newmodule->m_Flags = 0;
GetScreen()->ClrModify(); GetScreen()->ClrModify();
pcbframe->GetScreen()->m_CurrentItem = NULL; pcbframe->GetScreen()->m_CurrentItem = NULL;
mainpcb->m_Status_Pcb = 0; mainpcb->m_Status_Pcb = 0;
} }
break; break;
case ID_LIBEDIT_IMPORT_PART: case ID_LIBEDIT_IMPORT_PART:
GetScreen()->ClearUndoRedoList(); GetScreen()->ClearUndoRedoList();

View File

@ -209,8 +209,35 @@ bool active, islib = TRUE;
m_HToolBar->EnableTool(ID_LIBEDIT_EXPORT_PART,active); m_HToolBar->EnableTool(ID_LIBEDIT_EXPORT_PART,active);
m_HToolBar->EnableTool(ID_LIBEDIT_CREATE_NEW_LIB_AND_SAVE_CURRENT_PART,active); m_HToolBar->EnableTool(ID_LIBEDIT_CREATE_NEW_LIB_AND_SAVE_CURRENT_PART,active);
m_HToolBar->EnableTool(ID_MODEDIT_SAVE_LIBMODULE,active && islib); m_HToolBar->EnableTool(ID_MODEDIT_SAVE_LIBMODULE,active && islib);
m_HToolBar->EnableTool(ID_MODEDIT_INSERT_MODULE_IN_BOARD,active); MODULE * module_in_edit = m_Pcb->m_Modules;
m_HToolBar->EnableTool(ID_MODEDIT_UPDATE_MODULE_IN_BOARD,active); if ( module_in_edit && module_in_edit->m_Link ) // this is not a new module ...
{
WinEDA_PcbFrame * pcbframe = m_Parent->m_PcbFrame;
BOARD * mainpcb = pcbframe->m_Pcb;
MODULE * source_module = mainpcb->m_Modules;
// search if the source module was not deleted:
for( ; source_module != NULL ; source_module = (MODULE *) source_module->Pnext )
{
if( module_in_edit->m_Link == source_module->m_TimeStamp )
break;
}
if ( source_module )
{
m_HToolBar->EnableTool(ID_MODEDIT_INSERT_MODULE_IN_BOARD, false);
m_HToolBar->EnableTool(ID_MODEDIT_UPDATE_MODULE_IN_BOARD, true);
}
else // The source was deleted, therefore we can insert but not update the module
{
m_HToolBar->EnableTool(ID_MODEDIT_INSERT_MODULE_IN_BOARD, true);
m_HToolBar->EnableTool(ID_MODEDIT_UPDATE_MODULE_IN_BOARD, false);
}
}
else
{
m_HToolBar->EnableTool(ID_MODEDIT_INSERT_MODULE_IN_BOARD,active);
m_HToolBar->EnableTool(ID_MODEDIT_UPDATE_MODULE_IN_BOARD, false);
}
if ( GetScreen() ) if ( GetScreen() )
{ {
m_HToolBar->EnableTool(ID_MODEDIT_UNDO,GetScreen()->m_UndoList && active); m_HToolBar->EnableTool(ID_MODEDIT_UNDO,GetScreen()->m_UndoList && active);

View File

@ -16,7 +16,7 @@
/* Routines Locales */ /* Routines Locales */
/* Variables locales */ /* Variables locales */
D_PAD* pt_pad_selecte; /* pointeur sur le pad selecte pour edition */ static D_PAD* s_CurrentSelectedPad; /* pointeur sur le pad selecte pour edition */
static wxPoint Pad_OldPos; static wxPoint Pad_OldPos;
@ -29,7 +29,7 @@ static void Exit_Move_Pad(WinEDA_DrawPanel * Panel, wxDC * DC)
Remise en etat des conditions initiales avant move si move en cours Remise en etat des conditions initiales avant move si move en cours
*/ */
{ {
D_PAD * pad = pt_pad_selecte; D_PAD * pad = s_CurrentSelectedPad;
Panel->ManageCurseur = NULL; Panel->ManageCurseur = NULL;
Panel->ForceCloseManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL;
@ -55,7 +55,7 @@ D_PAD * pad = pt_pad_selecte;
} }
EraseDragListe(); EraseDragListe();
pt_pad_selecte = NULL; s_CurrentSelectedPad = NULL;
g_Drag_Pistes_On = FALSE; g_Drag_Pistes_On = FALSE;
} }
@ -68,7 +68,7 @@ static void Show_Pad_Move(WinEDA_DrawPanel * panel, wxDC * DC, bool erase)
TRACK * Track; TRACK * Track;
DRAG_SEGM * pt_drag; DRAG_SEGM * pt_drag;
BASE_SCREEN * screen = panel->GetScreen(); BASE_SCREEN * screen = panel->GetScreen();
D_PAD * pad = pt_pad_selecte; D_PAD * pad = s_CurrentSelectedPad;
if ( erase ) pad->Draw(panel, DC, wxPoint(0,0), GR_XOR); if ( erase ) pad->Draw(panel, DC, wxPoint(0,0), GR_XOR);
pad->m_Pos = screen->m_Curseur; pad->m_Pos = screen->m_Curseur;
@ -238,7 +238,7 @@ int rX, rY;
/*********************************************************/ /*********************************************************/
void WinEDA_BasePcbFrame::DeletePad(D_PAD* Pad, wxDC * DC) void WinEDA_BasePcbFrame::DeletePad(D_PAD* Pad, wxDC * DC)
/*********************************************************/ /*********************************************************/
/* Routine de suppression d'une pastille sur le module selectionne */ /* Function to delete the pad "pad" */
{ {
MODULE * Module; MODULE * Module;
wxString line; wxString line;
@ -268,27 +268,26 @@ wxString line;
/*************************************************************/ /*************************************************************/
void WinEDA_BasePcbFrame::StartMovePad(D_PAD * Pad, wxDC * DC) void WinEDA_BasePcbFrame::StartMovePad(D_PAD * Pad, wxDC * DC)
/*************************************************************/ /*************************************************************/
/* Routine de deplacement d'une pastille */ /* Function to initialise the "move pad" command */
{ {
MODULE * Module; MODULE * Module;
/* localisation d'une pastille ? */
if(Pad == NULL ) return; if(Pad == NULL ) return;
Module = (MODULE*) Pad->m_Parent; Module = (MODULE*) Pad->m_Parent;
pt_pad_selecte = Pad ; s_CurrentSelectedPad = Pad ;
Pad_OldPos = Pad->m_Pos; Pad_OldPos = Pad->m_Pos;
Pad->Display_Infos(this); Pad->Display_Infos(this);
DrawPanel->ManageCurseur = Show_Pad_Move; DrawPanel->ManageCurseur = Show_Pad_Move;
DrawPanel->ForceCloseManageCurseur = Exit_Move_Pad; DrawPanel->ForceCloseManageCurseur = Exit_Move_Pad;
/* Affichage du pad en SKETCH */ /* Draw the pad (SKETCH mode) */
Pad->Draw(DrawPanel, DC, wxPoint(0,0),GR_XOR); Pad->Draw(DrawPanel, DC, wxPoint(0,0),GR_XOR);
Pad->m_Flags |= IS_MOVED; Pad->m_Flags |= IS_MOVED;
Pad->Draw(DrawPanel, DC, wxPoint(0,0),GR_XOR); Pad->Draw(DrawPanel, DC, wxPoint(0,0),GR_XOR);
/* Construction de la liste des segments a "dragger" */ /* Build the list of track segments to drag */
Build_1_Pad_SegmentsToDrag(DrawPanel, DC, Pad); Build_1_Pad_SegmentsToDrag(DrawPanel, DC, Pad);
} }
@ -318,7 +317,7 @@ MODULE * Module;
dX = Pad->m_Pos.x - Pad_OldPos.x; dX = Pad->m_Pos.x - Pad_OldPos.x;
dY = Pad->m_Pos.y - Pad_OldPos.y; dY = Pad->m_Pos.y - Pad_OldPos.y;
RotatePoint(&dX, &dY, - Module->m_Orient ); RotatePoint(&dX, &dY, - Module->m_Orient );
Pad->m_Pos0.x += dX; pt_pad_selecte->m_Pos0.y += dY; Pad->m_Pos0.x += dX; s_CurrentSelectedPad->m_Pos0.y += dY;
Pad->m_Flags = 0; Pad->m_Flags = 0;
@ -330,11 +329,11 @@ MODULE * Module;
/* Tracage des segments dragges */ /* Tracage des segments dragges */
pt_drag = g_DragSegmentList; pt_drag = g_DragSegmentList;
for( ; pt_drag; pt_drag = pt_drag->Pnext) for( ; pt_drag; pt_drag = pt_drag->Pnext)
{ {
Track = pt_drag->m_Segm; Track = pt_drag->m_Segm;
Track->SetState(EDIT,OFF); Track->SetState(EDIT,OFF);
Track->Draw(DrawPanel, DC, GR_OR); Track->Draw(DrawPanel, DC, GR_OR);
} }
EraseDragListe(); EraseDragListe();
GetScreen()->SetModify(); GetScreen()->SetModify();

View File

@ -568,7 +568,8 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount;
case 'T': // Track list start: fmt = T image layer t_count case 'T': // Track list start: fmt = T image layer t_count
sscanf(Line+2, "%d %d %d", & image, & track_layer, & track_count); sscanf(Line+2, "%d %d %d", & image, & track_layer, & track_count);
track_layer--; track_layer--;
if ( track_layer == max_layer-1 ) track_layer = CMP_N; if ( (track_layer != CUIVRE_N) && (track_layer == max_layer-1) )
track_layer = CMP_N;
// Read corners: fmt = C x_pos y_pos // Read corners: fmt = C x_pos y_pos
for ( int ii = 0; ii < track_count; ii++ ) for ( int ii = 0; ii < track_count; ii++ )
{ {

View File

@ -26,9 +26,9 @@
#include "Update_Module_Board.xpm" #include "Update_Module_Board.xpm"
#ifdef __UNIX__ #ifdef __UNIX__
#define LISTBOX_WIDTH 120 #define LISTBOX_WIDTH 140
#else #else
#define LISTBOX_WIDTH 100 #define LISTBOX_WIDTH 120
#endif #endif
/***************************************************/ /***************************************************/

View File

@ -16,23 +16,23 @@ extern wxString g_Main_Title;
wxString MsgInfos( wxString MsgInfos(
#ifdef GERBVIEW #ifdef GERBVIEW
wxT("** GERBVIEW (jul 2001 .. 2006) **") wxT("** GERBVIEW (jul 2001 .. 2007) **")
#else #else
#ifdef PCBNEW #ifdef PCBNEW
wxT("** PCBNEW (sept 1992 .. 2006) **") wxT("** PCBNEW (sept 1992 .. 2007) **")
#endif #endif
#endif #endif
#ifdef CVPCB #ifdef CVPCB
wxT("** CVPCB (sept 1992 .. 2006) **") wxT("** CVPCB (sept 1992 .. 2007) **")
#endif #endif
#ifdef KICAD #ifdef KICAD
wxT("** KICAD (jul 2000 .. 2006) **") wxT("** KICAD (jul 2000 .. 2007) **")
#endif #endif
#ifdef EESCHEMA #ifdef EESCHEMA
wxT("** EESCHEMA (sept 1994 .. 2006) **") wxT("** EESCHEMA (sept 1994 .. 2007) **")
#endif #endif
); );