From f27208a11be5e7601f25e69a94880f9cb49d964e Mon Sep 17 00:00:00 2001 From: CHARRAS Date: Wed, 25 Jul 2007 09:02:05 +0000 Subject: [PATCH] pcbnew: better messages in drc control and some other enhancements --- change_log.txt | 10 + cvpcb/cvpcb.h | 2 +- cvpcb/options.cpp | 225 --------- cvpcb/rdorcad.cpp | 320 ------------ cvpcb/readschematicnetlist.cpp | 38 +- include/build_version.h | 2 +- include/id.h | 12 +- internat/fr/kicad.mo | Bin 128712 -> 128968 bytes internat/fr/kicad.po | 897 ++++++++++++++++----------------- kicad/treeprj_datas.cpp | 4 - kicad/treeprj_frame.cpp | 70 ++- libs.win | 2 +- nsis_win_installer/install.nsi | 2 +- pcbnew/class_pad.cpp | 2 +- pcbnew/class_pad.h | 2 +- pcbnew/dialog_drc.h | 1 + pcbnew/drc.cpp | 135 ++--- pcbnew/modedit.cpp | 168 ++---- pcbnew/moduleframe.cpp | 31 +- pcbnew/move-drag_pads.cpp | 25 +- pcbnew/router.cpp | 3 +- pcbnew/tool_modedit.cpp | 4 +- share/infospgm.cpp | 10 +- 23 files changed, 712 insertions(+), 1253 deletions(-) delete mode 100644 cvpcb/options.cpp delete mode 100644 cvpcb/rdorcad.cpp diff --git a/change_log.txt b/change_log.txt index 7ded6d4ef7..e8894f513b 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,6 +4,16 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2007-Jul-25 UPDATE Jean-Pierre Charras +================================================================================ + ** 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 ================================================================================ + pcbnew diff --git a/cvpcb/cvpcb.h b/cvpcb/cvpcb.h index af2ef9c4aa..72a18405ea 100644 --- a/cvpcb/cvpcb.h +++ b/cvpcb/cvpcb.h @@ -15,7 +15,7 @@ #include "colors.h" // 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" diff --git a/cvpcb/options.cpp b/cvpcb/options.cpp deleted file mode 100644 index 8035fb373a..0000000000 --- a/cvpcb/options.cpp +++ /dev/null @@ -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); -} - diff --git a/cvpcb/rdorcad.cpp b/cvpcb/rdorcad.cpp deleted file mode 100644 index 3664cbde90..0000000000 --- a/cvpcb/rdorcad.cpp +++ /dev/null @@ -1,320 +0,0 @@ - /************/ - /* rdorcad()*/ - /************/ - -/* convertit la netliste ORCADPCB en netliste ORCADPCB (fichier temporaire) -assure la r‚affectation 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 d‚but 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 trouv‚e */ - 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 alpab‚tique : */ - 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 d‚but 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 forc‚e 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); -} - - - diff --git a/cvpcb/readschematicnetlist.cpp b/cvpcb/readschematicnetlist.cpp index 3f500cf5e9..fb7958e404 100644 --- a/cvpcb/readschematicnetlist.cpp +++ b/cvpcb/readschematicnetlist.cpp @@ -29,10 +29,10 @@ int WinEDA_CvpcbFrame::ReadSchematicNetlist(void) int i , j , k ,l ; char * LibName; char Line[1024]; -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 component_reference[80] ; /* buffer des references composants */ +char ref_schema[80] ; /* buffer de la ref schematique */ +char footprint_name[80] ; /* buffer des ref.lib */ +char component_value[80] ; /* buffer des valeurs */ char *ptchar ; /* pointeur de service */ STORECMP * Cmp; @@ -111,9 +111,9 @@ STORECMP * Cmp; 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(component_reference, 0, sizeof(component_reference)); + memset(footprint_name, 0, sizeof(footprint_name) ) ; + memset(component_value, 0, sizeof(component_value) ) ; memset(alim, 0, sizeof(alim) ) ; /* lecture valeur du composant */ @@ -131,8 +131,9 @@ STORECMP * Cmp; for (j = 0 ; i < k ; i++) { - if ( Line[i] == SEPARATEUR ) break ; - if ( j < 8 ) val[j++] = Line[i] ; + if ( Line[i] == SEPARATEUR ) break ; + if ( j < (int)(sizeof(footprint_name)-1) ) + footprint_name[j++] = Line[i] ; } if ( (Line[++i] == '(') && (Line[k-1] == ')' ) ) @@ -147,21 +148,20 @@ STORECMP * Cmp; while(Line[i] == ' ') i++ ; /* recherche debut reference */ /* 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 ; - label[k] = Line[i] ; + component_reference[k] = Line[i] ; } - /* recherche vraie valeur du composant */ - while(Line[i] != ' ') i++ ; /* elimination fin reference */ - while(Line[i] == ' ') i++ ; /* recherche debut vraie valeur */ + /* recherche valeur du composant */ + while(Line[i] == ' ') i++ ; /* recherche debut valeur */ - /* debut vraie valeur trouv‚e */ - for ( k = 0 ; k < 16 ; i++ , k++ ) + /* debut vraie valeur trouvee */ + for ( k = 0 ; k < (int)(sizeof(component_value)-1) ; i++ , k++ ) { if ( Line[i] <= ' ' ) break ; - postval[k] = Line[i] ; + component_value[k] = Line[i] ; } @@ -169,8 +169,8 @@ STORECMP * Cmp; Cmp = new STORECMP(); Cmp->Pnext = g_BaseListeCmp; g_BaseListeCmp = Cmp; - Cmp->m_Reference = CONV_FROM_UTF8(label); - Cmp->m_Valeur = CONV_FROM_UTF8(postval) ; + Cmp->m_Reference = CONV_FROM_UTF8(component_reference); + Cmp->m_Valeur = CONV_FROM_UTF8(component_value) ; if( g_FlagEESchema ) /* Copie du nom module: */ { diff --git a/include/build_version.h b/include/build_version.h index 6999641478..33d0a00ea6 100644 --- a/include/build_version.h +++ b/include/build_version.h @@ -5,7 +5,7 @@ COMMON_GLOBL wxString g_BuildVersion #ifdef EDA_BASE - (wxT("(2007-07-09)")) + (wxT("(2007-07-24)")) #endif ; diff --git a/include/id.h b/include/id.h index f260fa25dd..0bf1146f01 100644 --- a/include/id.h +++ b/include/id.h @@ -12,17 +12,17 @@ enum main_id { ID_PROJECT_TREE_REFRESH, ID_PROJECT_RUNPY, ID_PROJECT_NEWFILE, - ID_PROJECT_NEWSCH, - ID_PROJECT_NEWBRD, + ID_PROJECT_UNUSED0, + ID_PROJECT_UNUSED1, ID_PROJECT_NEWPY, - ID_PROJECT_NEWGERBER, + ID_PROJECT_UNUSED2, ID_PROJECT_NEWTXT, - ID_PROJECT_NEWNET, + ID_PROJECT_UNUSED3, ID_PROJECT_NEWDIR, ID_PROJECT_DELETE, ID_PROJECT_RENAME, - ID_PROJECT_UNUSED0, - ID_PROJECT_UNUSED1, + ID_PROJECT_OPEN_FILE_WITH_TEXT_EDITOR, + ID_PROJECT_UNUSED4, ID_MAIN_COMMAND, ID_TO_EDITOR, diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index 5fdb36b91611b7463116497d73cba78b570bcb49..c55b68ddfe6789243e5176ac2dd7eb891229f928 100644 GIT binary patch delta 47565 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

Yr{wf$p8DfgQ=FF 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 D$~)Uu diff --git a/internat/fr/kicad.po b/internat/fr/kicad.po index 208611c9e2..8057a44c63 100644 --- a/internat/fr/kicad.po +++ b/internat/fr/kicad.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: kicad\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2007-07-09 11:49+0100\n" -"Last-Translator: jp charras \n" +"PO-Revision-Date: 2007-07-25 10:24+0100\n" +"Last-Translator: \n" "Language-Team: kicad team \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" @@ -66,7 +66,6 @@ msgstr "Fichiers C.I.:" #: pcbnew/files.cpp:181 #: pcbnew/librairi.cpp:62 #: cvpcb/readschematicnetlist.cpp:51 -#: cvpcb/rdorcad.cpp:53 #: cvpcb/rdpcad.cpp:45 #, c-format msgid "File <%s> not found" @@ -141,256 +140,6 @@ msgstr "It msgid "Ok to abort ?" msgstr "Ok pour arrêter ?" -#: pcbnew/dialog_edit_module.cpp:41 -msgid "Module properties" -msgstr "Propriétés du Module" - -#: pcbnew/dialog_edit_module.cpp:94 -msgid "Properties" -msgstr "Propriétés" - -#: pcbnew/dialog_edit_module.cpp:98 -#: pcbnew/dialog_edit_module.cpp:107 -#: pcbnew/dialog_edit_module.cpp:138 -msgid "3D settings" -msgstr "3D Caract" - -#: pcbnew/dialog_edit_module.cpp:119 -#: pcbnew/pcbtexte.cpp:113 -#: pcbnew/muonde.cpp:341 -#: pcbnew/block.cpp:117 -#: pcbnew/cotation.cpp:109 -#: pcbnew/zones.cpp:873 -#: pcbnew/mirepcb.cpp:102 -#: eeschema/fieldedi.cpp:208 -#: eeschema/sheetlab.cpp:99 -#: eeschema/libedpart.cpp:230 -#: eeschema/editpart.cpp:193 -#: common/displlst.cpp:102 -msgid "Ok" -msgstr "Ok" - -#: pcbnew/dialog_edit_module.cpp:124 -#: pcbnew/pcbtexte.cpp:118 -#: pcbnew/muonde.cpp:345 -#: pcbnew/modedit_onclick.cpp:195 -#: pcbnew/modedit_onclick.cpp:228 -#: pcbnew/onrightclick.cpp:153 -#: pcbnew/onrightclick.cpp:172 -#: pcbnew/block.cpp:122 -#: pcbnew/globaleditpad.cpp:111 -#: pcbnew/cotation.cpp:114 -#: pcbnew/swap_layers.cpp:86 -#: pcbnew/pcbpiste.cpp:87 -#: pcbnew/mirepcb.cpp:106 -#: pcbnew/sel_layer.cpp:123 -#: pcbnew/sel_layer.cpp:250 -#: eeschema/libedit_onrightclick.cpp:68 -#: eeschema/libedit_onrightclick.cpp:83 -#: eeschema/optionsframe.cpp:155 -#: eeschema/onrightclick.cpp:111 -#: eeschema/onrightclick.cpp:125 -#: eeschema/sheetlab.cpp:104 -#: eeschema/options.cpp:114 -#: eeschema/libedpart.cpp:219 -#: gerbview/onrightclick.cpp:39 -#: gerbview/onrightclick.cpp:57 -#: gerbview/options.cpp:175 -#: gerbview/options.cpp:305 -#: gerbview/select_layers_to_pcb.cpp:127 -#: common/get_component_dialog.cpp:121 -#: common/displlst.cpp:106 -msgid "Cancel" -msgstr "Annuler" - -#: pcbnew/dialog_edit_module.cpp:179 -msgid "Change module(s)" -msgstr "Change module(s)" - -#: pcbnew/dialog_edit_module.cpp:183 -msgid "Goto Module Editor" -msgstr "Ouvrir Editeur de modules" - -#: pcbnew/dialog_edit_module.cpp:189 -#: eeschema/fieldedi.cpp:283 -#: eeschema/onrightclick.cpp:315 -#: eeschema/dialog_edit_component_in_lib.cpp:203 -#: eeschema/libedpart.cpp:246 -msgid "Doc" -msgstr "Doc" - -#: pcbnew/dialog_edit_module.cpp:195 -msgid "Keywords" -msgstr "Mots Cles" - -#: pcbnew/dialog_edit_module.cpp:202 -msgid "Fields:" -msgstr "Champs:" - -#: pcbnew/dialog_edit_module.cpp:212 -msgid "Add Field" -msgstr "Ajouter Champ" - -#: pcbnew/dialog_edit_module.cpp:217 -#: eeschema/onrightclick.cpp:253 -msgid "Edit Field" -msgstr "Editer Champ" - -#: pcbnew/dialog_edit_module.cpp:222 -msgid "Delete Field" -msgstr "Supprimer Champ" - -#: pcbnew/dialog_edit_module.cpp:229 -#: common/common.cpp:242 -msgid "Component" -msgstr "Composant" - -#: pcbnew/dialog_edit_module.cpp:229 -msgid "Copper" -msgstr "Cuivre" - -#: pcbnew/dialog_edit_module.cpp:230 -#: pcbnew/class_pad.cpp:769 -#: pcbnew/affiche.cpp:36 -#: pcbnew/affiche.cpp:91 -#: pcbnew/affiche.cpp:95 -#: pcbnew/affiche.cpp:195 -#: pcbnew/affiche.cpp:244 -#: pcbnew/class_module.cpp:1040 -#: pcbnew/sel_layer.cpp:109 -#: gerbview/affiche.cpp:102 -msgid "Layer" -msgstr "Couche" - -#: pcbnew/dialog_edit_module.cpp:237 -#: pcbnew/dialog_edit_module.cpp:279 -#: pcbnew/pcbtexte.cpp:177 -#: pcbnew/muonde.cpp:353 -#: pcbnew/cotation.cpp:118 -#: eeschema/dialog_options.cpp:229 -#: eeschema/options.cpp:177 -#: eeschema/dialog_edit_component_in_schematic.cpp:182 -#: eeschema/editpart.cpp:312 -msgid "Normal" -msgstr "Normal" - -#: pcbnew/dialog_edit_module.cpp:237 -#: pcbnew/dialog_pad_edit.cpp:191 -msgid "User" -msgstr "User" - -#: pcbnew/dialog_edit_module.cpp:238 -#: pcbnew/class_pad.cpp:810 -#: pcbnew/affiche.cpp:47 -#: pcbnew/affiche.cpp:103 -#: pcbnew/class_module.cpp:1057 -#: eeschema/affiche.cpp:101 -#: gerbview/affiche.cpp:43 -msgid "Orient" -msgstr "Orient" - -#: pcbnew/dialog_edit_module.cpp:270 -msgid "Orient (0.1 deg)" -msgstr "Orient (0.1 deg)" - -#: pcbnew/dialog_edit_module.cpp:279 -msgid "Normal+Insert" -msgstr "Normal+Insert" - -#: pcbnew/dialog_edit_module.cpp:279 -msgid "Virtual" -msgstr "Virtuel" - -#: pcbnew/dialog_edit_module.cpp:280 -msgid "Attributs" -msgstr "Attributs" - -#: pcbnew/dialog_edit_module.cpp:282 -msgid "Use this attribute for most non smd components" -msgstr "Utiliser cet attribut pour la plupart des composants" - -#: pcbnew/dialog_edit_module.cpp:284 -msgid "" -"Use this attribute for smd components.\n" -"Only components with this option are put in the footprint position list file" -msgstr "" -"Uiliser cet attribut pour les composants CMS.\n" -"Seuls les composantsavec cette option sont mis dans le fichier de position des composants" - -#: pcbnew/dialog_edit_module.cpp:286 -msgid "Use this attribute for \"virtual\" components drawn on board (like a old ISA PC bus connector)" -msgstr "Uiliser cet attribut pour les composants \"virtuels\" directement dessinés sur le PCB (tel que les vieux connecteurs ISA de PC)" - -#: pcbnew/dialog_edit_module.cpp:309 -msgid "Free" -msgstr "Libre" - -#: pcbnew/dialog_edit_module.cpp:309 -msgid "Locked" -msgstr "Verrouillé" - -#: pcbnew/dialog_edit_module.cpp:310 -msgid "Move and Auto Place" -msgstr "Move et Placement Automatique" - -#: pcbnew/dialog_edit_module.cpp:314 -msgid "Enable hotkey move commands and Auto Placement" -msgstr "Autoriser les commandes clavier de déplacement et l'auto placement" - -#: pcbnew/dialog_edit_module.cpp:315 -msgid "Disable hotkey move commands and Auto Placement" -msgstr "Interdire les commandes clavier de déplacement et l'auto placement" - -#: pcbnew/dialog_edit_module.cpp:318 -msgid "Rot 90" -msgstr "Rot 90" - -#: pcbnew/dialog_edit_module.cpp:325 -msgid "Rot 180" -msgstr "Rot 180" - -#: pcbnew/dialog_edit_module.cpp:355 -msgid "3D Shape Name" -msgstr "3D forme" - -#: pcbnew/dialog_edit_module.cpp:371 -#: eeschema/dialog_eeschema_config.cpp:227 -msgid "Browse" -msgstr "Examiner" - -#: pcbnew/dialog_edit_module.cpp:375 -msgid "Add 3D Shape" -msgstr "Ajout Forme 3D" - -#: pcbnew/dialog_edit_module.cpp:381 -msgid "Remove 3D Shape" -msgstr "Suppr. Forme 3D:" - -#: pcbnew/dialog_edit_module.cpp:387 -msgid "Shape Scale:" -msgstr "Echelle de la forme:" - -#: pcbnew/dialog_edit_module.cpp:393 -msgid "Shape Offset:" -msgstr "Offset forme:" - -#: pcbnew/dialog_edit_module.cpp:400 -msgid "Shape Rotation:" -msgstr "Rot de la forme" - -#: pcbnew/dialog_edit_module.cpp:437 -msgid "3D Shape:" -msgstr "Forme 3D:" - -#: pcbnew/dialog_edit_module.cpp:726 -msgid "Reference or Value cannot be deleted" -msgstr "Référence ou Valeur ne peut etre effacée" - -#: pcbnew/dialog_edit_module.cpp:730 -#, c-format -msgid "Delete [%s]" -msgstr "Supprimer [%s]" - #: pcbnew/loadcmp.cpp:94 msgid "Module name:" msgstr "Nom module:" @@ -461,7 +210,6 @@ msgstr "De " #: eeschema/dialog_eeschema_config.cpp:161 #: eeschema/eestatus.cpp:116 #: cvpcb/dialog_display_options.cpp:145 -#: cvpcb/options.cpp:148 #: cvpcb/dialog_cvpcb_config.cpp:127 #: gerbview/reglage.cpp:110 msgid "Save Cfg" @@ -966,6 +714,54 @@ msgstr "Nb Modules" msgid "TextPCB properties" msgstr "Propriétés des textes PCB" +#: pcbnew/pcbtexte.cpp:113 +#: pcbnew/muonde.cpp:341 +#: pcbnew/block.cpp:117 +#: pcbnew/cotation.cpp:109 +#: pcbnew/zones.cpp:873 +#: pcbnew/mirepcb.cpp:102 +#: pcbnew/dialog_edit_module.cpp:119 +#: eeschema/fieldedi.cpp:208 +#: eeschema/sheetlab.cpp:99 +#: eeschema/libedpart.cpp:230 +#: eeschema/editpart.cpp:193 +#: common/displlst.cpp:102 +msgid "Ok" +msgstr "Ok" + +#: pcbnew/pcbtexte.cpp:118 +#: pcbnew/muonde.cpp:345 +#: pcbnew/modedit_onclick.cpp:195 +#: pcbnew/modedit_onclick.cpp:228 +#: pcbnew/onrightclick.cpp:153 +#: pcbnew/onrightclick.cpp:172 +#: pcbnew/block.cpp:122 +#: pcbnew/globaleditpad.cpp:111 +#: pcbnew/cotation.cpp:114 +#: pcbnew/swap_layers.cpp:86 +#: pcbnew/pcbpiste.cpp:87 +#: pcbnew/mirepcb.cpp:106 +#: pcbnew/dialog_edit_module.cpp:124 +#: pcbnew/sel_layer.cpp:123 +#: pcbnew/sel_layer.cpp:250 +#: eeschema/libedit_onrightclick.cpp:68 +#: eeschema/libedit_onrightclick.cpp:83 +#: eeschema/optionsframe.cpp:155 +#: eeschema/onrightclick.cpp:111 +#: eeschema/onrightclick.cpp:125 +#: eeschema/sheetlab.cpp:104 +#: eeschema/options.cpp:114 +#: eeschema/libedpart.cpp:219 +#: gerbview/onrightclick.cpp:39 +#: gerbview/onrightclick.cpp:57 +#: gerbview/options.cpp:175 +#: gerbview/options.cpp:305 +#: gerbview/select_layers_to_pcb.cpp:127 +#: common/get_component_dialog.cpp:121 +#: common/displlst.cpp:106 +msgid "Cancel" +msgstr "Annuler" + #: pcbnew/pcbtexte.cpp:122 #: pcbnew/dialog_edit_mod_text.cpp:314 #: eeschema/sheetlab.cpp:108 @@ -1010,6 +806,18 @@ msgstr "Position" msgid "Orientation" msgstr "Orientation" +#: pcbnew/pcbtexte.cpp:177 +#: pcbnew/muonde.cpp:353 +#: pcbnew/cotation.cpp:118 +#: pcbnew/dialog_edit_module.cpp:237 +#: pcbnew/dialog_edit_module.cpp:279 +#: eeschema/dialog_options.cpp:229 +#: eeschema/options.cpp:177 +#: eeschema/dialog_edit_component_in_schematic.cpp:182 +#: eeschema/editpart.cpp:312 +msgid "Normal" +msgstr "Normal" + #: pcbnew/pcbtexte.cpp:177 #: pcbnew/modedit_onclick.cpp:246 #: pcbnew/cotation.cpp:118 @@ -1794,75 +1602,78 @@ msgstr "Inclure pistes autorout msgid "Include Locked Tracks" msgstr "Inclure pistes verrouillées" -#: pcbnew/drc.cpp:72 -#, c-format -msgid "" -"Unconnected:\n" -"Pad @ %.4f,%.4f and\n" -"Pad @ %.4f,%.4f\n" -msgstr "" -"Non connecté:\n" -"Pad @ %.4f,%.4f et\n" -"Pad @ %.4f,%.4f\n" +#: pcbnew/drc.cpp:65 +msgid "Look for active routes\n" +msgstr "Recherche des chevelus actifs\n" -#: pcbnew/drc.cpp:78 +#: pcbnew/drc.cpp:71 +msgid "Unconnected found:\n" +msgstr "Non connecté trouvé:\n" + +#: pcbnew/drc.cpp:76 +#, c-format +msgid "%d > Pad %s (%s) @ %.4f,%.4f and " +msgstr "%d > Pad %s (%s) @ %.4f,%.4f et " + +#: pcbnew/drc.cpp:84 +#, c-format +msgid "Pad %s (%s) @ %.4f,%.4f\n" +msgstr "Pad %s (%s) @ %.4f,%.4f\n" + +#: pcbnew/drc.cpp:89 #, c-format msgid "Active routes: %d\n" msgstr "Active routes: %d\n" -#: pcbnew/drc.cpp:79 -msgid "OK! (No unconnect)\n" -msgstr "OK! (Pas de non connecté)\n" +#: pcbnew/drc.cpp:90 +msgid "OK! (No active routes)\n" +msgstr "OK! (Pas de chevelu actif)\n" -#: pcbnew/drc.cpp:81 -msgid "End tst" -msgstr "Fin tst" - -#: pcbnew/drc.cpp:99 +#: pcbnew/drc.cpp:112 #, c-format msgid "** End Drc: %d errors **\n" msgstr "** FinDrc: %d erreurs **\n" -#: pcbnew/drc.cpp:100 +#: pcbnew/drc.cpp:114 msgid "** End Drc: No Error **\n" msgstr "** Fin Drc: Aucune Erreur **\n" -#: pcbnew/drc.cpp:215 +#: pcbnew/drc.cpp:229 msgid "SegmNb" msgstr "SegmNb" -#: pcbnew/drc.cpp:216 +#: pcbnew/drc.cpp:230 msgid "Track Err" msgstr "Err Pistes" -#: pcbnew/drc.cpp:219 +#: pcbnew/drc.cpp:233 msgid "Tst Tracks\n" msgstr "Tst Pistes\n" -#: pcbnew/drc.cpp:238 +#: pcbnew/drc.cpp:252 #: eeschema/eelayer.cpp:141 msgid "Netname" msgstr "NetName" -#: pcbnew/drc.cpp:934 +#: pcbnew/drc.cpp:950 #, c-format -msgid "%d Err type %d sur PAD @ %d,%d\n" -msgstr "%d Err type %d sur PAD @ %d,%d\n" +msgid "%d Drc Err %d PAD %s (%s) @ %d,%d\n" +msgstr "%d Err Drc %d PAD %s (%s) @ %d,%d\n" -#: pcbnew/drc.cpp:943 +#: pcbnew/drc.cpp:961 #, c-format msgid "%d Err type %d: sur VIA @ %d,%d\n" msgstr "%d Err type %d: sur VIA @ %d,%d\n" -#: pcbnew/drc.cpp:954 +#: pcbnew/drc.cpp:972 #, c-format msgid "%d Err type %d: sur SEGMENT @ %d,%d\n" msgstr "%d Err type %d: sur SEGMENT @ %d,%d\n" -#: pcbnew/drc.cpp:986 +#: pcbnew/drc.cpp:1007 #, c-format -msgid "%d Err pad to pad (PAD @ %d,%d and PAD @ %d,%d\n" -msgstr "%d Err pad to pad (PAD @ %d,%d and PAD @ %d,%d\n" +msgid "%d Drc Err: PAD %s (%s) @ %d,%d and PAD %s (%s) @ %d,%d\n" +msgstr "%d Err Drc: PAD %s (%s) @ %d,%d et PAD %s (%s) @ %d,%d\n" #: pcbnew/editrack-part2.cpp:31 #, c-format @@ -2066,6 +1877,19 @@ msgstr "RefP" msgid "Net" msgstr "Net" +#: pcbnew/class_pad.cpp:769 +#: pcbnew/affiche.cpp:36 +#: pcbnew/affiche.cpp:91 +#: pcbnew/affiche.cpp:95 +#: pcbnew/affiche.cpp:195 +#: pcbnew/affiche.cpp:244 +#: pcbnew/class_module.cpp:1040 +#: pcbnew/dialog_edit_module.cpp:230 +#: pcbnew/sel_layer.cpp:109 +#: gerbview/affiche.cpp:102 +msgid "Layer" +msgstr "Couche" + #: pcbnew/class_pad.cpp:781 #: pcbnew/affiche.cpp:53 #: pcbnew/affiche.cpp:109 @@ -2092,6 +1916,16 @@ msgstr "Per msgid "Drill X / Y" msgstr "Perçage X/Y" +#: pcbnew/class_pad.cpp:810 +#: pcbnew/affiche.cpp:47 +#: pcbnew/affiche.cpp:103 +#: pcbnew/class_module.cpp:1057 +#: pcbnew/dialog_edit_module.cpp:238 +#: eeschema/affiche.cpp:101 +#: gerbview/affiche.cpp:43 +msgid "Orient" +msgstr "Orient" + #: pcbnew/class_pad.cpp:814 msgid "X Pos" msgstr "X Pos" @@ -3360,6 +3194,11 @@ msgstr "-90" msgid "180" msgstr "180" +#: pcbnew/dialog_pad_edit.cpp:191 +#: pcbnew/dialog_edit_module.cpp:237 +msgid "User" +msgstr "User" + #: pcbnew/dialog_pad_edit.cpp:193 msgid "Pad Orient:" msgstr "Orient pad:" @@ -4058,6 +3897,168 @@ msgstr "&3D Visu" msgid "&Help" msgstr "&Aide" +#: pcbnew/dialog_edit_module.cpp:41 +msgid "Module properties" +msgstr "Propriétés du Module" + +#: pcbnew/dialog_edit_module.cpp:94 +msgid "Properties" +msgstr "Propriétés" + +#: pcbnew/dialog_edit_module.cpp:98 +#: pcbnew/dialog_edit_module.cpp:107 +#: pcbnew/dialog_edit_module.cpp:138 +msgid "3D settings" +msgstr "3D Caract" + +#: pcbnew/dialog_edit_module.cpp:179 +msgid "Change module(s)" +msgstr "Change module(s)" + +#: pcbnew/dialog_edit_module.cpp:183 +msgid "Goto Module Editor" +msgstr "Ouvrir Editeur de modules" + +#: pcbnew/dialog_edit_module.cpp:189 +#: eeschema/fieldedi.cpp:283 +#: eeschema/onrightclick.cpp:315 +#: eeschema/dialog_edit_component_in_lib.cpp:203 +#: eeschema/libedpart.cpp:246 +msgid "Doc" +msgstr "Doc" + +#: pcbnew/dialog_edit_module.cpp:195 +msgid "Keywords" +msgstr "Mots Cles" + +#: pcbnew/dialog_edit_module.cpp:202 +msgid "Fields:" +msgstr "Champs:" + +#: pcbnew/dialog_edit_module.cpp:212 +msgid "Add Field" +msgstr "Ajouter Champ" + +#: pcbnew/dialog_edit_module.cpp:217 +#: eeschema/onrightclick.cpp:253 +msgid "Edit Field" +msgstr "Editer Champ" + +#: pcbnew/dialog_edit_module.cpp:222 +msgid "Delete Field" +msgstr "Supprimer Champ" + +#: pcbnew/dialog_edit_module.cpp:229 +#: common/common.cpp:242 +msgid "Component" +msgstr "Composant" + +#: pcbnew/dialog_edit_module.cpp:229 +msgid "Copper" +msgstr "Cuivre" + +#: pcbnew/dialog_edit_module.cpp:270 +msgid "Orient (0.1 deg)" +msgstr "Orient (0.1 deg)" + +#: pcbnew/dialog_edit_module.cpp:279 +msgid "Normal+Insert" +msgstr "Normal+Insert" + +#: pcbnew/dialog_edit_module.cpp:279 +msgid "Virtual" +msgstr "Virtuel" + +#: pcbnew/dialog_edit_module.cpp:280 +msgid "Attributs" +msgstr "Attributs" + +#: pcbnew/dialog_edit_module.cpp:283 +msgid "Use this attribute for most non smd components" +msgstr "Utiliser cet attribut pour la plupart des composants" + +#: pcbnew/dialog_edit_module.cpp:285 +msgid "" +"Use this attribute for smd components.\n" +"Only components with this option are put in the footprint position list file" +msgstr "" +"Uiliser cet attribut pour les composants CMS.\n" +"Seuls les composantsavec cette option sont mis dans le fichier de position des composants" + +#: pcbnew/dialog_edit_module.cpp:287 +msgid "Use this attribute for \"virtual\" components drawn on board (like a old ISA PC bus connector)" +msgstr "Uiliser cet attribut pour les composants \"virtuels\" directement dessinés sur le PCB (tel que les vieux connecteurs ISA de PC)" + +#: pcbnew/dialog_edit_module.cpp:311 +msgid "Free" +msgstr "Libre" + +#: pcbnew/dialog_edit_module.cpp:311 +msgid "Locked" +msgstr "Verrouillé" + +#: pcbnew/dialog_edit_module.cpp:312 +msgid "Move and Auto Place" +msgstr "Move et Placement Automatique" + +#: pcbnew/dialog_edit_module.cpp:317 +msgid "Enable hotkey move commands and Auto Placement" +msgstr "Autoriser les commandes clavier de déplacement et l'auto placement" + +#: pcbnew/dialog_edit_module.cpp:318 +msgid "Disable hotkey move commands and Auto Placement" +msgstr "Interdire les commandes clavier de déplacement et l'auto placement" + +#: pcbnew/dialog_edit_module.cpp:322 +msgid "Rot 90" +msgstr "Rot 90" + +#: pcbnew/dialog_edit_module.cpp:329 +msgid "Rot 180" +msgstr "Rot 180" + +#: pcbnew/dialog_edit_module.cpp:359 +msgid "3D Shape Name" +msgstr "3D forme" + +#: pcbnew/dialog_edit_module.cpp:375 +#: eeschema/dialog_eeschema_config.cpp:227 +msgid "Browse" +msgstr "Examiner" + +#: pcbnew/dialog_edit_module.cpp:379 +msgid "Add 3D Shape" +msgstr "Ajout Forme 3D" + +#: pcbnew/dialog_edit_module.cpp:385 +msgid "Remove 3D Shape" +msgstr "Suppr. Forme 3D:" + +#: pcbnew/dialog_edit_module.cpp:391 +msgid "Shape Scale:" +msgstr "Echelle de la forme:" + +#: pcbnew/dialog_edit_module.cpp:397 +msgid "Shape Offset:" +msgstr "Offset forme:" + +#: pcbnew/dialog_edit_module.cpp:404 +msgid "Shape Rotation:" +msgstr "Rot de la forme" + +#: pcbnew/dialog_edit_module.cpp:441 +msgid "3D Shape:" +msgstr "Forme 3D:" + +#: pcbnew/dialog_edit_module.cpp:730 +msgid "Reference or Value cannot be deleted" +msgstr "Référence ou Valeur ne peut etre effacée" + +#: pcbnew/dialog_edit_module.cpp:734 +#, c-format +msgid "Delete [%s]" +msgstr "Supprimer [%s]" + #: pcbnew/edit.cpp:154 msgid "Graphic not autorized on Copper layers" msgstr "Graphique non autorisé sur couches cuivre" @@ -4725,7 +4726,6 @@ msgstr "Propri #: eeschema/dialog_edit_component_in_schematic.cpp:204 #: eeschema/editpart.cpp:204 #: eeschema/dialog_build_BOM.cpp:279 -#: cvpcb/options.cpp:138 #: cvpcb/dialog_display_options.h:43 msgid "Options" msgstr "Options" @@ -7943,58 +7943,48 @@ msgid "&Del Annotate" msgstr "&Dénumérotation" #: cvpcb/dialog_display_options.cpp:141 -#: cvpcb/options.cpp:159 msgid "Pad &Num" msgstr "Pad &Num" #: cvpcb/dialog_display_options.cpp:148 -#: cvpcb/options.cpp:153 msgid "&Pad Fill" msgstr "&Pad plein" #: cvpcb/dialog_display_options.cpp:155 #: cvpcb/dialog_display_options.cpp:163 -#: cvpcb/options.cpp:163 msgid "&Filaire" msgstr "&Filaire" #: cvpcb/dialog_display_options.cpp:156 #: cvpcb/dialog_display_options.cpp:164 -#: cvpcb/options.cpp:163 msgid "&Filled" msgstr "&Plein" #: cvpcb/dialog_display_options.cpp:157 #: cvpcb/dialog_display_options.cpp:165 -#: cvpcb/options.cpp:163 msgid "&Sketch" msgstr "&Contour" #: cvpcb/dialog_display_options.cpp:159 -#: cvpcb/options.cpp:165 msgid "Edges:" msgstr "Contours:" #: cvpcb/dialog_display_options.cpp:167 -#: cvpcb/options.cpp:173 msgid "Texts:" msgstr "Textes:" #: cvpcb/readschematicnetlist.cpp:71 #: cvpcb/viewlogi.cpp:72 -#: cvpcb/rdorcad.cpp:73 #: cvpcb/rdpcad.cpp:56 #, c-format msgid "Unknown file format <%s>" msgstr " Format fichier inconnu <%s>" #: cvpcb/readschematicnetlist.cpp:76 -#: cvpcb/rdorcad.cpp:78 msgid "Netlist Format: EESchema" msgstr " Formats NetListe: EESchema" #: cvpcb/readschematicnetlist.cpp:126 -#: cvpcb/rdorcad.cpp:122 #, c-format msgid "Netlist error: %s" msgstr "Erreur Netliste: %s" @@ -8427,112 +8417,117 @@ msgstr "Executer le Script Python:" msgid "Load file:" msgstr "Charger Fichiers:" -#: kicad/treeprj_frame.cpp:63 +#: kicad/treeprj_frame.cpp:65 msgid "&Run" msgstr "Exécute&r" -#: kicad/treeprj_frame.cpp:64 +#: kicad/treeprj_frame.cpp:66 msgid "Run the Python Script" msgstr "Exécuter le Script Python" -#: kicad/treeprj_frame.cpp:70 +#: kicad/treeprj_frame.cpp:72 +#: kicad/treeprj_frame.cpp:118 msgid "&Edit in a text editor" msgstr "Editer avec un éditeur de Texte" -#: kicad/treeprj_frame.cpp:71 -msgid "Edit the Python Script in a Text Editor" -msgstr "Editer le script python" +#: kicad/treeprj_frame.cpp:73 +msgid "&Open the file in a Text Editor" +msgstr "&Ouvrir le fichier avec un Editeur de texte" -#: kicad/treeprj_frame.cpp:84 +#: kicad/treeprj_frame.cpp:86 msgid "New D&irectory" msgstr "&Nouveau Répertoire" -#: kicad/treeprj_frame.cpp:84 +#: kicad/treeprj_frame.cpp:86 msgid "Create a New Directory" msgstr "Créer un nouveau Répertoire" -#: kicad/treeprj_frame.cpp:89 +#: kicad/treeprj_frame.cpp:91 msgid "New P&ython Script" msgstr "Nouveau Script P&ython" -#: kicad/treeprj_frame.cpp:89 +#: kicad/treeprj_frame.cpp:91 msgid "Create a New Python Script" msgstr "Créer un nouveau script Python" -#: kicad/treeprj_frame.cpp:94 +#: kicad/treeprj_frame.cpp:96 msgid "New &Text File" msgstr "Nouveau Fichier &Texte" -#: kicad/treeprj_frame.cpp:94 +#: kicad/treeprj_frame.cpp:96 msgid "Create a New Txt File" msgstr "Créer un nouveau Fichier texte" -#: kicad/treeprj_frame.cpp:98 +#: kicad/treeprj_frame.cpp:100 msgid "New &File" msgstr "Nouveau &Fichier" -#: kicad/treeprj_frame.cpp:98 +#: kicad/treeprj_frame.cpp:100 msgid "Create a New File" msgstr "Créer un nouveau Fichier" -#: kicad/treeprj_frame.cpp:109 +#: kicad/treeprj_frame.cpp:111 msgid "&Rename File" msgstr "&Renommer Fichier" -#: kicad/treeprj_frame.cpp:109 +#: kicad/treeprj_frame.cpp:111 msgid "&Rename Directory" msgstr "&Renommer Répertoire" -#: kicad/treeprj_frame.cpp:110 +#: kicad/treeprj_frame.cpp:112 msgid "Rename the File" msgstr "Renommer le Fichier" -#: kicad/treeprj_frame.cpp:110 +#: kicad/treeprj_frame.cpp:112 msgid "&Rename the Directory" msgstr "&Renommer le Répertoire" -#: kicad/treeprj_frame.cpp:114 +#: kicad/treeprj_frame.cpp:119 +msgid "Open the file in a Text Editor" +msgstr "Ouvrir le fichier avec un Editeur de texte" + +#: kicad/treeprj_frame.cpp:124 msgid "&Delete File" msgstr "&Supprimer Fichier" -#: kicad/treeprj_frame.cpp:114 +#: kicad/treeprj_frame.cpp:124 msgid "&Delete Directory" msgstr "&Supprimer le Répertoire" -#: kicad/treeprj_frame.cpp:115 +#: kicad/treeprj_frame.cpp:125 msgid "Delete the File" msgstr "Supprimer le fichier" -#: kicad/treeprj_frame.cpp:115 +#: kicad/treeprj_frame.cpp:125 msgid "&Delete the Directory and its content" msgstr "Effacer le Répertoire et son contenu" -#: kicad/treeprj_frame.cpp:342 +#: kicad/treeprj_frame.cpp:344 msgid "Create New File:" msgstr "Créer un nouveau Fichier" -#: kicad/treeprj_frame.cpp:342 +#: kicad/treeprj_frame.cpp:344 msgid "Create New Directory" msgstr "Créer un nouveau Répertoire" -#: kicad/treeprj_frame.cpp:344 +#: kicad/treeprj_frame.cpp:346 msgid "noname" msgstr "noname" -#: kicad/treeprj_frame.cpp:643 +#: kicad/treeprj_frame.cpp:663 msgid "Change File Name: " msgstr "ChangerNom Fichier: " -#: kicad/treeprj_datas.cpp:186 +#: kicad/treeprj_datas.cpp:182 msgid "Unable to move file ... " msgstr "Impossible de déplacer le fichier " -#: kicad/treeprj_datas.cpp:186 -#: kicad/treeprj_datas.cpp:257 +#: kicad/treeprj_datas.cpp:182 +#: kicad/treeprj_datas.cpp:253 msgid "Permission error ?" msgstr "" -#: kicad/treeprj_datas.cpp:244 +#: kicad/treeprj_datas.cpp:240 msgid "" "Changing file extension will change file type.\n" " Do you want to continue ?" @@ -8540,19 +8535,19 @@ msgstr "" "Changer l'extension changera le type de fichier.\n" "Voulez vous continuer ?" -#: kicad/treeprj_datas.cpp:245 +#: kicad/treeprj_datas.cpp:241 msgid "Rename File" msgstr "Renommer Fichier" -#: kicad/treeprj_datas.cpp:257 +#: kicad/treeprj_datas.cpp:253 msgid "Unable to rename file ... " msgstr "Impossible de renommer le fichier... " -#: kicad/treeprj_datas.cpp:275 +#: kicad/treeprj_datas.cpp:271 msgid "Do you really want to delete " msgstr "Voulez vous réellemant effacer" -#: kicad/treeprj_datas.cpp:275 +#: kicad/treeprj_datas.cpp:271 msgid "Delete File" msgstr "Supprimer Fichier" @@ -9077,126 +9072,6 @@ msgstr "X" msgid "Y" msgstr "Y" -#: common/common.cpp:44 -msgid " (\"):" -msgstr " (\"):" - -#: common/common.cpp:239 -msgid "Copper " -msgstr "Cuivre " - -#: common/common.cpp:239 -msgid "Inner L1 " -msgstr "Interne 1" - -#: common/common.cpp:239 -msgid "Inner L2 " -msgstr "Interne 2" - -#: common/common.cpp:239 -msgid "Inner L3 " -msgstr "Interne 3" - -#: common/common.cpp:240 -msgid "Inner L4 " -msgstr "Interne 4" - -#: common/common.cpp:240 -msgid "Inner L5 " -msgstr "Interne 5" - -#: common/common.cpp:240 -msgid "Inner L6 " -msgstr "Interne 6" - -#: common/common.cpp:240 -msgid "Inner L7 " -msgstr "Interne 7" - -#: common/common.cpp:241 -msgid "Inner L8 " -msgstr "Interne 8" - -#: common/common.cpp:241 -msgid "Inner L9 " -msgstr "Interne 9" - -#: common/common.cpp:241 -msgid "Inner L10" -msgstr "Interne 10" - -#: common/common.cpp:241 -msgid "Inner L11" -msgstr "Interne 11" - -#: common/common.cpp:242 -msgid "Inner L12" -msgstr "Interne 12" - -#: common/common.cpp:242 -msgid "Inner L13" -msgstr "Interne 13" - -#: common/common.cpp:242 -msgid "Inner L14" -msgstr "Interne 14" - -#: common/common.cpp:243 -msgid "Adhes Cop" -msgstr "Adhes Cu " - -#: common/common.cpp:243 -msgid "Adhes Cmp" -msgstr "Adhe Cmp" - -#: common/common.cpp:243 -msgid "SoldP Cop" -msgstr "SoldP Cu " - -#: common/common.cpp:243 -msgid "SoldP Cmp" -msgstr "SoldP Cmp" - -#: common/common.cpp:244 -msgid "SilkS Cop" -msgstr "Sérigr Cu " - -#: common/common.cpp:244 -msgid "SilkS Cmp" -msgstr "Sérigr Cmp" - -#: common/common.cpp:244 -msgid "Mask Copp" -msgstr "Masque Cu " - -#: common/common.cpp:244 -msgid "Mask Cmp " -msgstr "Masque Cmp" - -#: common/common.cpp:245 -msgid "Drawings " -msgstr "Drawings " - -#: common/common.cpp:245 -msgid "Comments " -msgstr "Comments " - -#: common/common.cpp:245 -msgid "Eco1 " -msgstr "Eco1 " - -#: common/common.cpp:245 -msgid "Eco2 " -msgstr "Eco2 " - -#: common/common.cpp:246 -msgid "Edges Pcb" -msgstr "Contour Pcb" - -#: common/common.cpp:246 -msgid "--- " -msgstr "--- " - #: common/basicframe.cpp:217 #, c-format msgid "Help file %s not found" @@ -9365,6 +9240,126 @@ msgstr "Langage" msgid "No default editor found, you must choose it" msgstr "Pas d'éditeur par défaut trouvé, vous devez en choisir un" +#: common/common.cpp:44 +msgid " (\"):" +msgstr " (\"):" + +#: common/common.cpp:239 +msgid "Copper " +msgstr "Cuivre " + +#: common/common.cpp:239 +msgid "Inner L1 " +msgstr "Interne 1" + +#: common/common.cpp:239 +msgid "Inner L2 " +msgstr "Interne 2" + +#: common/common.cpp:239 +msgid "Inner L3 " +msgstr "Interne 3" + +#: common/common.cpp:240 +msgid "Inner L4 " +msgstr "Interne 4" + +#: common/common.cpp:240 +msgid "Inner L5 " +msgstr "Interne 5" + +#: common/common.cpp:240 +msgid "Inner L6 " +msgstr "Interne 6" + +#: common/common.cpp:240 +msgid "Inner L7 " +msgstr "Interne 7" + +#: common/common.cpp:241 +msgid "Inner L8 " +msgstr "Interne 8" + +#: common/common.cpp:241 +msgid "Inner L9 " +msgstr "Interne 9" + +#: common/common.cpp:241 +msgid "Inner L10" +msgstr "Interne 10" + +#: common/common.cpp:241 +msgid "Inner L11" +msgstr "Interne 11" + +#: common/common.cpp:242 +msgid "Inner L12" +msgstr "Interne 12" + +#: common/common.cpp:242 +msgid "Inner L13" +msgstr "Interne 13" + +#: common/common.cpp:242 +msgid "Inner L14" +msgstr "Interne 14" + +#: common/common.cpp:243 +msgid "Adhes Cop" +msgstr "Adhes Cu " + +#: common/common.cpp:243 +msgid "Adhes Cmp" +msgstr "Adhe Cmp" + +#: common/common.cpp:243 +msgid "SoldP Cop" +msgstr "SoldP Cu " + +#: common/common.cpp:243 +msgid "SoldP Cmp" +msgstr "SoldP Cmp" + +#: common/common.cpp:244 +msgid "SilkS Cop" +msgstr "Sérigr Cu " + +#: common/common.cpp:244 +msgid "SilkS Cmp" +msgstr "Sérigr Cmp" + +#: common/common.cpp:244 +msgid "Mask Cop " +msgstr "Masque Cu " + +#: common/common.cpp:244 +msgid "Mask Cmp " +msgstr "Masque Cmp" + +#: common/common.cpp:245 +msgid "Drawings " +msgstr "Drawings " + +#: common/common.cpp:245 +msgid "Comments " +msgstr "Comments " + +#: common/common.cpp:245 +msgid "Eco1 " +msgstr "Eco1 " + +#: common/common.cpp:245 +msgid "Eco2 " +msgstr "Eco2 " + +#: common/common.cpp:246 +msgid "Edges Pcb" +msgstr "Contour Pcb" + +#: common/common.cpp:246 +msgid "--- " +msgstr "--- " + #: 3d-viewer/3d_canvas.cpp:290 #: share/zoom.cpp:346 msgid "Zoom +" diff --git a/kicad/treeprj_datas.cpp b/kicad/treeprj_datas.cpp index 9a6a78f151..7a8fc84623 100644 --- a/kicad/treeprj_datas.cpp +++ b/kicad/treeprj_datas.cpp @@ -23,10 +23,6 @@ #include "bitmaps/icon_gerbview_small.xpm" #include "bitmaps/icon_cvpcb_small.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" diff --git a/kicad/treeprj_frame.cpp b/kicad/treeprj_frame.cpp index e0a9582cad..bca8a901a2 100644 --- a/kicad/treeprj_frame.cpp +++ b/kicad/treeprj_frame.cpp @@ -20,7 +20,9 @@ #include "wx/dir.h" #include "bitmaps.h" +#ifdef KICAD_PYTHON #include "bitmaps/new_python.xpm" +#endif #include "id.h" @@ -68,7 +70,7 @@ WinEDA_PrjFrame::WinEDA_PrjFrame(WinEDA_MainFrame * parent, item = new wxMenuItem(menu, ID_PROJECT_TXTEDIT, _("&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 ); menu->Append( item ); @@ -110,6 +112,14 @@ WinEDA_PrjFrame::WinEDA_PrjFrame(WinEDA_MainFrame * parent, , TREE_DIRECTORY != i ? _("Rename the File") : _("&Rename the Directory") ); item->SetBitmap( right_xpm ); 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 , TREE_DIRECTORY != i ? _("&Delete File") : _("&Delete Directory") , 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_NEWFILE, WinEDA_PrjFrame::OnNewFile) 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_NEWGERBER, WinEDA_PrjFrame::OnNewGerberFile) 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_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::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::OnNewGerberFile(wxCommandEvent & event) { NewFile( TREE_GERBER ); } 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 ) @@ -393,30 +395,48 @@ void WinEDA_PrjFrame::NewFile( const wxString & name, wxString WinEDA_PrjFrame::GetFileExt( enum TreeFileType type ) /******************************************************************/ { -wxString extensions[] = -{ - wxT( "" ), // 0 is not used - wxT( ".pro" ), // TREE_PROJECT - g_SchExtBuffer, // TREE_SCHEMA - g_BoardExtBuffer, // TREE_PCB - wxT( ".py" ), // TREE_PY - g_GerberExtBuffer, // TREE_GERBER - wxT( ".pdf" ), // TREE_PDF - wxT( ".txt" ), // TREE_TXT - wxT( ".net" ), // TREE_NET - wxT( "" ), // TREE_UNKNOWN - wxT( "" ), // TREE_DIRECTORY +wxString ext; + + switch ( type ) + { + case 0 : + break; // 0 is not used + case TREE_PROJECT: + ext = wxT( ".pro" ); + break; + case TREE_SCHEMA: + ext = g_SchExtBuffer; + break; + 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 wxEmptyString; + return ext; } /**************************************************************************/ void WinEDA_PrjFrame::AddFile( const wxString & name, wxTreeItemId & root ) /**************************************************************************/ /* 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; diff --git a/libs.win b/libs.win index c70c06ae9b..a596284328 100644 --- a/libs.win +++ b/libs.win @@ -17,7 +17,7 @@ KICAD_BIN = /f/kicad/winexe #Define the wxWidget path (if not found in environment variables): ifndef WXWIN -WXWIN=/f/wxMSW-2.8.4 +WXWIN=f:/wxMSW-2.8.4 endif LIBVERSION = 2.8 diff --git a/nsis_win_installer/install.nsi b/nsis_win_installer/install.nsi index ee0b047596..bb6ff821ba 100644 --- a/nsis_win_installer/install.nsi +++ b/nsis_win_installer/install.nsi @@ -17,7 +17,7 @@ ; General Product Description Definitions !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 COMPANY_NAME "" !define TRADE_MARKS "" diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 0a748fd6d0..7863f1123d 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -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) { diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index 81a2746398..7ccb718fa3 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -76,7 +76,7 @@ public: wxString ReturnStringPadName(void); // Return pad name as string in a wxString void ReturnStringPadName(wxString & text); // Return pad name as string in a buffer 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) void Display_Infos(WinEDA_BasePcbFrame * frame); }; diff --git a/pcbnew/dialog_drc.h b/pcbnew/dialog_drc.h index 76929c30f1..ed2e8c7659 100644 --- a/pcbnew/dialog_drc.h +++ b/pcbnew/dialog_drc.h @@ -125,6 +125,7 @@ public: ////@end WinEDA_DrcFrame member variables WinEDA_PcbFrame * m_Parent; wxDC * m_DC; + int m_UnconnectedCount; }; #endif diff --git a/pcbnew/drc.cpp b/pcbnew/drc.cpp index 24c83db4e1..eb336bc2e4 100644 --- a/pcbnew/drc.cpp +++ b/pcbnew/drc.cpp @@ -1,7 +1,6 @@ - /*******************************/ - /* Edition des pistes */ - /* Routines DRC */ - /*******************************/ + /****************************/ + /* DRC control */ + /****************************/ #include "fctsys.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 */ /* 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, 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); @@ -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, TRACK * pt_ref, void * pt_item, int errnumber); 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 ) - { + { m_Parent->Compile_Ratsnest( m_DC, TRUE); - } + } if( m_Parent->m_Pcb->m_Ratsnest == NULL ) return; CHEVELU* Ratsnest = m_Parent->m_Pcb->m_Ratsnest; @@ -62,23 +61,34 @@ WinEDA_DrawPanel * panel = m_Parent->DrawPanel; int ii; wxString msg; 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); - else msg = _("OK! (No unconnect)\n"); + m_logWindow->AppendText(_("Look for active routes\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(_("End tst")); } @@ -94,10 +104,14 @@ wxString msg; m_logWindow->Clear(); g_DesignSettings.m_TrackClearence = ReturnValueFromTextCtrl(*m_SetClearance, m_Parent->m_InternalUnits); + /* Test DRC errors (clearance errors, bad connections .. */ errors = m_Parent->Test_DRC(m_DC); + /* Serach for active routes (unconnected pads) */ + ListUnconnectedPads(event); if ( 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); } 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 et BAD_DRC sinon */ @@ -922,45 +936,49 @@ static void Affiche_Erreur_DRC(WinEDA_DrawPanel * panel, wxDC * DC, BOARD * Pcb, number = numero d'identification */ { -int ercx, ercy; -D_PAD * pt_pad; +wxPoint erc_pos; +D_PAD * pad; TRACK * pt_segm; wxString msg; if( ((EDA_BaseStruct*)pt_item)->m_StructType == TYPEPAD ) - { - pt_pad = (D_PAD*) pt_item; - ercx = pt_pad->m_Pos.x; ercy = pt_pad->m_Pos.y; - msg.Printf(_("%d Err type %d sur PAD @ %d,%d\n"), - NumberOfErrors, errnumber, ercx,ercy); - } + { + pad = (D_PAD*) pt_item; + erc_pos = pad->m_Pos; + wxString pad_name = pad->ReturnStringPadName(); + 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 */ - { + { 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) - { + { msg.Printf(_("%d Err type %d: sur VIA @ %d,%d\n"), - NumberOfErrors, errnumber,ercx,ercy); - } - 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); - } + NumberOfErrors, errnumber,erc_pos.x,erc_pos.y); } + 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); else panel->m_Parent->Affiche_Message(msg); 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_Diag = msg; 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, - const D_PAD * pad1, const D_PAD * pad2) + D_PAD * pad1, D_PAD * pad2) /******************************************************************************/ /* 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 */ { -int ercx, ercy; wxString msg; - ercx = pad1->m_Pos.x; ercy = pad1->m_Pos.y; - msg.Printf( _("%d Err pad to pad (PAD @ %d,%d and PAD @ %d,%d\n"), - NumberOfErrors, ercx,ercy, - pad2->m_Pos.x, pad2->m_Pos.y); + wxString pad_name1 = pad1->ReturnStringPadName(); + wxString module_name1 = ((MODULE*)(pad1->m_Parent))->m_Reference->m_Text; + wxString pad_name2 = pad2->ReturnStringPadName(); + 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); else panel->m_Parent->Affiche_Message(msg); 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_Diag = msg; current_marqueur->Draw(panel, DC, GR_OR); diff --git a/pcbnew/modedit.cpp b/pcbnew/modedit.cpp index 1be3071c38..5f97d8da67 100644 --- a/pcbnew/modedit.cpp +++ b/pcbnew/modedit.cpp @@ -149,143 +149,77 @@ wxClientDC dc(DrawPanel); if ( m_Draw3DFrame ) m_Draw3DFrame->NewDisplay(); 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_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; BOARD * mainpcb = pcbframe->m_Pcb; - MODULE * oldmodule = NULL; + MODULE * source_module = NULL; MODULE * module_in_edit = m_Pcb->m_Modules; - // creation du nouveau module sur le PCB en cours - // create a new unit on the PCB, of course. + // Search the old module (source) if exists + // 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); 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; - // Recherche de l'ancien module correspondant - //(qui a pu changer ou disparaitre a la suite d'�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. + // Put the footprint in the main pcb linked list. newmodule->Pnext = mainpcb->m_Modules; mainpcb->m_Modules = newmodule; newmodule->Pback = mainpcb; if ( newmodule->Pnext ) newmodule->Pnext->Pback = newmodule; - if ( oldmodule ) - { - newmodule = pcbframe->Exchange_Module(this, - oldmodule, newmodule); + if ( source_module ) // this is an update command + { + // The new module replace the old module (pos, orient, ref, value and connexions are kept) + // and the source_module (old module) is deleted + newmodule = pcbframe->Exchange_Module(this, source_module, newmodule); 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->GetScreen()->m_Curseur = cursor_pos; newmodule->m_TimeStamp = GetTimeStamp(); - } + } newmodule->m_Flags = 0; GetScreen()->ClrModify(); pcbframe->GetScreen()->m_CurrentItem = NULL; mainpcb->m_Status_Pcb = 0; - } - break; - + } + break; + case ID_LIBEDIT_IMPORT_PART: GetScreen()->ClearUndoRedoList(); GetScreen()->m_CurrentItem = NULL; diff --git a/pcbnew/moduleframe.cpp b/pcbnew/moduleframe.cpp index 744103aa17..22a3fbc35d 100644 --- a/pcbnew/moduleframe.cpp +++ b/pcbnew/moduleframe.cpp @@ -209,8 +209,35 @@ bool active, islib = TRUE; 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_MODEDIT_SAVE_LIBMODULE,active && islib); - m_HToolBar->EnableTool(ID_MODEDIT_INSERT_MODULE_IN_BOARD,active); - m_HToolBar->EnableTool(ID_MODEDIT_UPDATE_MODULE_IN_BOARD,active); + MODULE * module_in_edit = m_Pcb->m_Modules; + 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() ) { m_HToolBar->EnableTool(ID_MODEDIT_UNDO,GetScreen()->m_UndoList && active); diff --git a/pcbnew/move-drag_pads.cpp b/pcbnew/move-drag_pads.cpp index 5e2983d633..f880c3f3d6 100644 --- a/pcbnew/move-drag_pads.cpp +++ b/pcbnew/move-drag_pads.cpp @@ -16,7 +16,7 @@ /* Routines 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; @@ -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 */ { -D_PAD * pad = pt_pad_selecte; +D_PAD * pad = s_CurrentSelectedPad; Panel->ManageCurseur = NULL; Panel->ForceCloseManageCurseur = NULL; @@ -55,7 +55,7 @@ D_PAD * pad = pt_pad_selecte; } EraseDragListe(); - pt_pad_selecte = NULL; + s_CurrentSelectedPad = NULL; g_Drag_Pistes_On = FALSE; } @@ -68,7 +68,7 @@ static void Show_Pad_Move(WinEDA_DrawPanel * panel, wxDC * DC, bool erase) TRACK * Track; DRAG_SEGM * pt_drag; 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); pad->m_Pos = screen->m_Curseur; @@ -238,7 +238,7 @@ int rX, rY; /*********************************************************/ 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; wxString line; @@ -268,27 +268,26 @@ wxString line; /*************************************************************/ void WinEDA_BasePcbFrame::StartMovePad(D_PAD * Pad, wxDC * DC) /*************************************************************/ -/* Routine de deplacement d'une pastille */ +/* Function to initialise the "move pad" command */ { MODULE * Module; - /* localisation d'une pastille ? */ if(Pad == NULL ) return; Module = (MODULE*) Pad->m_Parent; - pt_pad_selecte = Pad ; + s_CurrentSelectedPad = Pad ; Pad_OldPos = Pad->m_Pos; Pad->Display_Infos(this); DrawPanel->ManageCurseur = Show_Pad_Move; 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->m_Flags |= IS_MOVED; 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); } @@ -318,7 +317,7 @@ MODULE * Module; dX = Pad->m_Pos.x - Pad_OldPos.x; dY = Pad->m_Pos.y - Pad_OldPos.y; 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; @@ -330,11 +329,11 @@ MODULE * Module; /* Tracage des segments dragges */ pt_drag = g_DragSegmentList; for( ; pt_drag; pt_drag = pt_drag->Pnext) - { + { Track = pt_drag->m_Segm; Track->SetState(EDIT,OFF); Track->Draw(DrawPanel, DC, GR_OR); - } + } EraseDragListe(); GetScreen()->SetModify(); diff --git a/pcbnew/router.cpp b/pcbnew/router.cpp index 9c5891e80b..cc7d49f70f 100644 --- a/pcbnew/router.cpp +++ b/pcbnew/router.cpp @@ -568,7 +568,8 @@ int max_layer = m_Pcb->m_BoardSettings->m_CopperLayerCount; case 'T': // Track list start: fmt = T image layer t_count sscanf(Line+2, "%d %d %d", & image, & track_layer, & track_count); 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 for ( int ii = 0; ii < track_count; ii++ ) { diff --git a/pcbnew/tool_modedit.cpp b/pcbnew/tool_modedit.cpp index ab0935b3c6..14cdcb24f4 100644 --- a/pcbnew/tool_modedit.cpp +++ b/pcbnew/tool_modedit.cpp @@ -26,9 +26,9 @@ #include "Update_Module_Board.xpm" #ifdef __UNIX__ -#define LISTBOX_WIDTH 120 +#define LISTBOX_WIDTH 140 #else -#define LISTBOX_WIDTH 100 +#define LISTBOX_WIDTH 120 #endif /***************************************************/ diff --git a/share/infospgm.cpp b/share/infospgm.cpp index ce01bf5b88..5663f2008a 100644 --- a/share/infospgm.cpp +++ b/share/infospgm.cpp @@ -16,23 +16,23 @@ extern wxString g_Main_Title; wxString MsgInfos( #ifdef GERBVIEW -wxT("** GERBVIEW (jul 2001 .. 2006) **") +wxT("** GERBVIEW (jul 2001 .. 2007) **") #else #ifdef PCBNEW -wxT("** PCBNEW (sept 1992 .. 2006) **") +wxT("** PCBNEW (sept 1992 .. 2007) **") #endif #endif #ifdef CVPCB -wxT("** CVPCB (sept 1992 .. 2006) **") +wxT("** CVPCB (sept 1992 .. 2007) **") #endif #ifdef KICAD -wxT("** KICAD (jul 2000 .. 2006) **") +wxT("** KICAD (jul 2000 .. 2007) **") #endif #ifdef EESCHEMA -wxT("** EESCHEMA (sept 1994 .. 2006) **") +wxT("** EESCHEMA (sept 1994 .. 2007) **") #endif );