From 96e0bebd0edcaca0aaedf8d8b047730134828ff8 Mon Sep 17 00:00:00 2001 From: charras Date: Sat, 20 Jun 2009 19:09:43 +0000 Subject: [PATCH] code cleaning --- include/wxPcbStruct.h | 5 +- internat/fr/kicad.mo | Bin 186677 -> 186799 bytes internat/fr/kicad.po | 1283 +++++++++++------------ pcbnew/CMakeLists.txt | 3 +- pcbnew/class_netinfo.h | 17 +- pcbnew/class_netinfo_item.cpp | 4 +- pcbnew/class_netinfolist.cpp | 3 +- pcbnew/dialog_edit_module.cpp | 13 +- pcbnew/dialog_exchange_modules_base.cpp | 97 ++ pcbnew/dialog_exchange_modules_base.fbp | 708 +++++++++++++ pcbnew/dialog_exchange_modules_base.h | 62 ++ pcbnew/editmod.cpp | 6 +- pcbnew/files.cpp | 5 +- pcbnew/modules.cpp | 6 +- pcbnew/ratsnest.cpp | 25 +- pcbnew/xchgmod.cpp | 335 +++--- 16 files changed, 1691 insertions(+), 881 deletions(-) create mode 100644 pcbnew/dialog_exchange_modules_base.cpp create mode 100644 pcbnew/dialog_exchange_modules_base.fbp create mode 100644 pcbnew/dialog_exchange_modules_base.h diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h index 39f516b989..10bf7e695a 100644 --- a/include/wxPcbStruct.h +++ b/include/wxPcbStruct.h @@ -218,9 +218,8 @@ public: MODULE* module, int angle, bool incremental ); - void Place_Module( MODULE* module, wxDC* DC ); - void InstallExchangeModuleFrame( MODULE* ExchangeModuleModule, - wxDC* DC, const wxPoint& pos ); + void Place_Module( MODULE* module, wxDC* DC, bool aDoNotRecreateRatsnest = false ); + void InstallExchangeModuleFrame( MODULE* ExchangeModuleModule ); // Graphic items edition: void InstallGraphicItemPropertiesDialog( DRAWSEGMENT* aItem, wxDC* aDC ); diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index fbae68be7d6ae0ff70db0ac0778c403a718a21ba..1387822f3cda33aac3f1f56bf23eacb8dbaf5098 100644 GIT binary patch delta 56132 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 delta 56028 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\n" "MIME-Version: 1.0\n" @@ -83,28 +83,28 @@ msgstr "Change modules <%s> -> <%s> (val = %s)?" msgid "Change modules <%s> -> <%s> ?" msgstr "Change modules <%s> -> <%s> ?" -#: pcbnew/xchgmod.cpp:418 +#: pcbnew/xchgmod.cpp:411 msgid "Change ALL modules ?" msgstr "Change TOUS les modules ?" -#: pcbnew/xchgmod.cpp:480 +#: pcbnew/xchgmod.cpp:467 #, c-format msgid "Change module %s (%s) " msgstr "Change module %s (%s) " -#: pcbnew/xchgmod.cpp:628 +#: pcbnew/xchgmod.cpp:618 msgid "No Modules!" msgstr "Pas de Modules!" -#: pcbnew/xchgmod.cpp:635 +#: pcbnew/xchgmod.cpp:625 msgid "Component files (." msgstr "Fichiers de composant (." -#: pcbnew/xchgmod.cpp:638 +#: pcbnew/xchgmod.cpp:628 msgid "Save Component Files" msgstr "Sauver Fichier Composant" -#: pcbnew/xchgmod.cpp:650 +#: pcbnew/xchgmod.cpp:640 msgid "Unable to create file " msgstr "Impossible de créer le fichier " @@ -366,6 +366,7 @@ msgid "Layer" msgstr "Couche" #: pcbnew/class_pcb_text.cpp:242 +#: pcbnew/cotation.cpp:109 msgid "Mirror" msgstr "Miroir" @@ -382,6 +383,7 @@ msgid "Orient" msgstr "Orient" #: pcbnew/class_pcb_text.cpp:252 +#: pcbnew/cotation.cpp:125 msgid "Width" msgstr "Epaisseur" @@ -393,7 +395,7 @@ msgstr "Taille H" msgid "V Size" msgstr "Taille V" -#: pcbnew/pcbnew.cpp:108 +#: pcbnew/pcbnew.cpp:107 msgid "Pcbnew is already running, Continue?" msgstr "Pcbnew est en cours d'exécution. Continuer ?" @@ -402,19 +404,14 @@ msgid "Dimension properties" msgstr "Propriétés des Cotes" #: pcbnew/cotation.cpp:103 -#: pcbnew/muonde.cpp:865 -#: pcbnew/dialog_gendrill.cpp:291 msgid "OK" msgstr "OK" #: pcbnew/cotation.cpp:106 -#: pcbnew/muonde.cpp:868 -#: pcbnew/dialog_gendrill.cpp:295 msgid "Cancel" msgstr "Annuler" #: pcbnew/cotation.cpp:109 -#: pcbnew/muonde.cpp:874 msgid "Normal" msgstr "Normal" @@ -423,7 +420,6 @@ msgid "Display" msgstr "Affichage" #: pcbnew/cotation.cpp:121 -#: pcbnew/muonde.cpp:881 msgid "Size" msgstr "Taille " @@ -611,101 +607,14 @@ msgstr "Fichiers rapport de perçage (.rpt)*.rpt" msgid "Save Drill Report File" msgstr "Sauver Fichier Rapport de Perçage" -#: pcbnew/pcbframe.cpp:304 -msgid "Board modified, Save before exit ?" -msgstr "Circuit Imprimé modifié, Sauver avant de quitter ?" +#: pcbnew/hotkeys.cpp:477 +#, c-format +msgid "Footprint %s found, but locked" +msgstr "Module %s trouvé, mais verrouillé" -#: pcbnew/pcbframe.cpp:305 -msgid "Confirmation" -msgstr "Confirmation" - -#: pcbnew/pcbframe.cpp:410 -msgid "DRC Off (Disable !!!), Currently: DRC is active" -msgstr "DRC off (désactivée !!!), actuellement DRC active" - -#: pcbnew/pcbframe.cpp:411 -msgid "DRC On (Currently: DRC is inactive !!!)" -msgstr "DRC On (Actuellement, DRC désactivée !!!)" - -#: pcbnew/pcbframe.cpp:422 -msgid "Polar Coords not show" -msgstr "Coord Polaires non affichées" - -#: pcbnew/pcbframe.cpp:423 -msgid "Display Polar Coords" -msgstr "Affichage coord Polaires" - -#: pcbnew/pcbframe.cpp:428 -msgid "Grid not show" -msgstr "Grille non montrée" - -#: pcbnew/pcbframe.cpp:428 -msgid "Show Grid" -msgstr "Afficher grille" - -#: pcbnew/pcbframe.cpp:437 -msgid "Hide General ratsnest" -msgstr "Ne pas afficher le chevelu général" - -#: pcbnew/pcbframe.cpp:438 -msgid "Show General ratsnest" -msgstr "Afficher le chevelu général" - -#: pcbnew/pcbframe.cpp:444 -msgid "Hide Module ratsnest" -msgstr "Ne pas montrer le chevelu du module" - -#: pcbnew/pcbframe.cpp:445 -msgid "Show Module ratsnest" -msgstr "Montrer le chevelu du module" - -#: pcbnew/pcbframe.cpp:452 -msgid "Disable Auto Delete old Track" -msgstr "Ne pas Autoriser l'effacement automatique des pistes" - -#: pcbnew/pcbframe.cpp:453 -msgid "Enable Auto Delete old Track" -msgstr "Autoriser l'effacement automatique des pistes" - -#: pcbnew/pcbframe.cpp:460 -msgid "Show Pads Sketch mode" -msgstr "Afficher pastilles en contour" - -#: pcbnew/pcbframe.cpp:461 -msgid "Show pads filled mode" -msgstr "Afficher pastilles en mode plein" - -#: pcbnew/pcbframe.cpp:467 -msgid "Show Tracks Sketch mode" -msgstr "Afficher pistes en contour" - -#: pcbnew/pcbframe.cpp:468 -msgid "Show Tracks filled mode" -msgstr "Afficher pistes en mode plein" - -#: pcbnew/pcbframe.cpp:474 -msgid "Normal Contrast Mode Display" -msgstr "Mode d'affichage Contraste normal" - -#: pcbnew/pcbframe.cpp:475 -msgid "Hight Contrast Mode Display" -msgstr "Mode d'affichage Haut Contraste" - -#: pcbnew/pcbframe.cpp:488 -msgid "Track" -msgstr "Piste" - -#: pcbnew/pcbframe.cpp:520 -msgid "Via" -msgstr "Via" - -#: pcbnew/pcbframe.cpp:592 -msgid "3D Frame already opened" -msgstr "Fenêtre 3D déjà ouverte" - -#: pcbnew/pcbframe.cpp:596 -msgid "3D Viewer" -msgstr "Visu 3D" +#: pcbnew/hotkeys.cpp:639 +msgid "Delete module?" +msgstr "Effacer Module?" #: pcbnew/editmod.cpp:43 msgid "Module Editor" @@ -768,9 +677,33 @@ msgstr "Place Ancre" msgid "Delete item" msgstr "Suppression d'éléments" -#: pcbnew/ioascii.cpp:174 -msgid "Error: Unexpected end of file !" -msgstr "Erreur: Fin de fichier inattendue !" +#: pcbnew/initpcb.cpp:133 +msgid "Current Board will be lost ?" +msgstr "Le C.I. courant sera perdu ?" + +#: pcbnew/initpcb.cpp:187 +msgid "Delete Zones ?" +msgstr "Effacer Zones ?" + +#: pcbnew/initpcb.cpp:208 +msgid "Delete Board edges ?" +msgstr "Effacement contour PCB" + +#: pcbnew/initpcb.cpp:213 +msgid "Delete draw items?" +msgstr "Suppression éléments graphiques?" + +#: pcbnew/initpcb.cpp:255 +msgid "Delete Tracks?" +msgstr "Effacer Pistes ?" + +#: pcbnew/initpcb.cpp:278 +msgid "Delete Modules?" +msgstr "Effacement des Modules?" + +#: pcbnew/initpcb.cpp:300 +msgid "Delete Pcb Texts" +msgstr "Effacer Textes Pcb" #: pcbnew/class_drc_item.cpp:39 msgid "Unconnected pads" @@ -1045,14 +978,269 @@ msgstr "Micro Vias:" msgid "Buried Vias:" msgstr "Via Enterrées:" -#: pcbnew/hotkeys.cpp:471 -#, c-format -msgid "Footprint %s found, but locked" -msgstr "Module %s trouvé, mais verrouillé" +#: pcbnew/tool_pcb.cpp:30 +msgid "" +"Show active layer selections\n" +"and select layer pair for route and place via" +msgstr "" +"Affiche sélections couche active\n" +"et sélection paire de couches pour routage et placement via" -#: pcbnew/hotkeys.cpp:643 -msgid "Delete module?" -msgstr "Effacer Module?" +#: pcbnew/tool_pcb.cpp:204 +msgid "New board" +msgstr "Nouveau Circuit Imprimé" + +#: pcbnew/tool_pcb.cpp:206 +msgid "Open existing board" +msgstr "Ouvrir C.I. existant" + +#: pcbnew/tool_pcb.cpp:208 +msgid "Save board" +msgstr "Sauver Circuit Imprimé" + +#: pcbnew/tool_pcb.cpp:212 +msgid "Page settings (size, texts)" +msgstr "Ajustage de la feuille de dessin (dimensions, textes)" + +#: pcbnew/tool_pcb.cpp:217 +msgid "Open module editor" +msgstr "Ouvrir Editeur de modules" + +#: pcbnew/tool_pcb.cpp:221 +msgid "Cut selected item" +msgstr "Suppression des éléments sélectionnés" + +#: pcbnew/tool_pcb.cpp:225 +msgid "Copy selected item" +msgstr "Copie des éléments sélectionnés" + +#: pcbnew/tool_pcb.cpp:228 +msgid "Paste" +msgstr "Copie des éléments sauvegardés" + +#: pcbnew/tool_pcb.cpp:232 +msgid "Undelete" +msgstr "Annulation du dernier effacement" + +#: pcbnew/tool_pcb.cpp:236 +msgid "Print board" +msgstr "Imprimer C.I." + +#: pcbnew/tool_pcb.cpp:238 +msgid "Plot (HPGL, PostScript, or GERBER format)" +msgstr "Tracer en format HPGL, POSTSCRIPT ou GERBER" + +#: pcbnew/tool_pcb.cpp:241 +msgid "Zoom in" +msgstr "Zoom +" + +#: pcbnew/tool_pcb.cpp:246 +msgid "Zoom out" +msgstr "Zoom -" + +#: pcbnew/tool_pcb.cpp:251 +msgid "Redraw view" +msgstr "Redessin de l'écran" + +#: pcbnew/tool_pcb.cpp:258 +msgid "Zoom auto" +msgstr "Zoom Automatique" + +#: pcbnew/tool_pcb.cpp:261 +msgid "Find components and texts" +msgstr "Recherche de composants et textes" + +#: pcbnew/tool_pcb.cpp:269 +msgid "Read netlist" +msgstr "Lire Netliste" + +#: pcbnew/tool_pcb.cpp:271 +msgid "Pcb Design Rules Check" +msgstr "Contrôle des règles de conception" + +#: pcbnew/tool_pcb.cpp:283 +msgid "Mode Module: Manual and Automatic Move or Place for modules" +msgstr "Mode Module: Déplacements ou Placement Manuel ou Automatique des modules" + +#: pcbnew/tool_pcb.cpp:287 +msgid "Mode Track and Autorouting" +msgstr "Mode Pistes et Autoroutage" + +#: pcbnew/tool_pcb.cpp:293 +msgid "Fast access to theWeb Based FreeROUTE advanced router" +msgstr "Acces rapide au routeur avancé FreeROUTE sur le Web" + +#: pcbnew/tool_pcb.cpp:320 +msgid "Drc OFF" +msgstr "Drc DESACTIVEE" + +#: pcbnew/tool_pcb.cpp:323 +msgid "Display Grid OFF" +msgstr "Suppression de l'affichage de la grille" + +#: pcbnew/tool_pcb.cpp:326 +msgid "Display Polar Coord ON" +msgstr "Activer affichage coord Polaires" + +#: pcbnew/tool_pcb.cpp:329 +msgid "Units in inches" +msgstr "Unités en pouces" + +#: pcbnew/tool_pcb.cpp:332 +msgid "Units in millimeters" +msgstr "Unités en millimètres" + +#: pcbnew/tool_pcb.cpp:335 +msgid "Change Cursor Shape" +msgstr "Sélection de la forme du curseur" + +#: pcbnew/tool_pcb.cpp:340 +msgid "Show General Ratsnest" +msgstr "Montrer le chevelu général" + +#: pcbnew/tool_pcb.cpp:343 +msgid "Show Module Ratsnest when moving" +msgstr "Montrer le chevelu du module pendant déplacement" + +#: pcbnew/tool_pcb.cpp:349 +msgid "Enable Auto Del Track" +msgstr "Autoriser l'effacement automatique des pistes" + +#: pcbnew/tool_pcb.cpp:354 +msgid "Show filled areas in zones" +msgstr "Afficher les surfaces remplies dans les zones" + +#: pcbnew/tool_pcb.cpp:357 +msgid "Do not show filled areas in zones" +msgstr "Ne pas afficher les surfaces remplies dans les zones" + +#: pcbnew/tool_pcb.cpp:360 +msgid "Show outlines of filled areas only in zones" +msgstr "Afficher uniquement les contours des surfaces remplies dans les zones" + +#: pcbnew/tool_pcb.cpp:365 +msgid "Show Pads Sketch" +msgstr "Afficher pastilles en contour" + +#: pcbnew/tool_pcb.cpp:369 +msgid "Show Tracks Sketch" +msgstr "Afficher Pistes en Contour" + +#: pcbnew/tool_pcb.cpp:374 +msgid "High Contrast Mode Display" +msgstr "Mode d'affichage Haut Contraste" + +#: pcbnew/tool_pcb.cpp:381 +msgid "Show Invisible Text" +msgstr "Montrer textes invisibles" + +#: pcbnew/tool_pcb.cpp:392 +msgid "" +"Display/remove auxiliary vertical toolbar (tools for micro wave applications)\n" +" This is a experimental feature (under development)" +msgstr "" +"Affiche/supprime le toolbar vertical auxiliaire (outils pour applications micro-ondes)\n" +"C'est un outil expérimental (en cours de développement)" + +#: pcbnew/tool_pcb.cpp:422 +msgid "Net highlight" +msgstr "Surbrillance des équipotentielles" + +#: pcbnew/tool_pcb.cpp:427 +msgid "Display local ratsnest (pad or module)" +msgstr "Afficher le chevelu local (pastilles ou modules)" + +#: pcbnew/tool_pcb.cpp:433 +msgid "Add modules" +msgstr "Addition de Modules" + +#: pcbnew/tool_pcb.cpp:437 +msgid "Add tracks and vias" +msgstr "Ajouter pistes et vias" + +#: pcbnew/tool_pcb.cpp:441 +msgid "Add zones" +msgstr "Addition de Zones" + +#: pcbnew/tool_pcb.cpp:446 +msgid "Add graphic line or polygon" +msgstr "Addition de lignes ou polygones graphiques" + +#: pcbnew/tool_pcb.cpp:450 +msgid "Add graphic circle" +msgstr "Addition de graphiques (Cercle)" + +#: pcbnew/tool_pcb.cpp:454 +msgid "Add graphic arc" +msgstr "Addition de graphiques (Arc de Cercle)" + +#: pcbnew/tool_pcb.cpp:458 +msgid "Add text" +msgstr "Ajout de Texte" + +#: pcbnew/tool_pcb.cpp:463 +msgid "Add dimension" +msgstr "Ajout des cotes" + +#: pcbnew/tool_pcb.cpp:467 +msgid "Add layer alignment target" +msgstr "Ajouter Mire de superposition" + +#: pcbnew/tool_pcb.cpp:472 +msgid "Delete items" +msgstr "Suppression d'éléments" + +#: pcbnew/tool_pcb.cpp:477 +msgid "Offset adjust for drill and place files" +msgstr "Ajuste offset pour fichier de perçage et placement" + +#: pcbnew/tool_pcb.cpp:503 +msgid "Create line of specified length for microwave applications" +msgstr "Création de lignes de longueur spécifiée (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:507 +msgid "Create gap of specified length for microwave applications" +msgstr "Création de gaps de longueur spécifiée (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:513 +msgid "Create stub of specified length for microwave applications" +msgstr "Création de stub de longueur spécifiée (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:517 +msgid "Create stub (arc) of specified length for microwave applications" +msgstr "Création de stub (arc) de longueur spécifiée (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:522 +msgid "Create a polynomial shape for microwave applications" +msgstr "Création de formes polynomiales (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:569 +msgid "" +"Auto track width: when starting on an existing track use its width\n" +"otherwise, use current width setting" +msgstr "" +"Largeur de piste automatique: si on démarre sur une piste existante, utiliser sa largeur\n" +" sinon utiliser la largeur courante" + +#: pcbnew/tool_pcb.cpp:594 +msgid "Auto" +msgstr "Auto" + +#: pcbnew/tool_pcb.cpp:598 +msgid "Zoom " +msgstr "Zoom " + +#: pcbnew/tool_pcb.cpp:618 +msgid "Grid" +msgstr "Grille" + +#: pcbnew/tool_pcb.cpp:636 +msgid "User Grid" +msgstr "Grille perso" + +#: pcbnew/tool_pcb.cpp:751 +msgid "+/- to switch" +msgstr "+/- pour commuter" #: pcbnew/deltrack.cpp:141 msgid "Delete NET ?" @@ -1310,6 +1498,19 @@ msgstr "Déplacer Bloc" msgid "Copy Block" msgstr "Copie Bloc" +#: pcbnew/pcbcfg.cpp:73 +msgid "Read Project File" +msgstr "Lire Fichier Projet" + +#: pcbnew/pcbcfg.cpp:83 +#, c-format +msgid "File %s not found" +msgstr "Fichier %s non trouvé" + +#: pcbnew/pcbcfg.cpp:226 +msgid "Save Project File" +msgstr "Sauver Fichier Projet" + #: pcbnew/loadcmp.cpp:105 msgid "Place module" msgstr "Place module" @@ -1363,68 +1564,6 @@ msgstr " chargé" msgid "Modules [%d items]" msgstr "Modules [%d éléments]" -#: pcbnew/files.cpp:21 -msgid "Printed circuit board" -msgstr "Circuit imprimé" - -#: pcbnew/files.cpp:85 -msgid "Recovery file " -msgstr "Fichier de secours " - -#: pcbnew/files.cpp:85 -msgid " not found" -msgstr " non trouvé" - -#: pcbnew/files.cpp:91 -msgid "Ok to load Recovery file " -msgstr "Ok pour charger le fichier de secours" - -#: pcbnew/files.cpp:152 -msgid "Board Modified: Continue ?" -msgstr "Circuit imprimé modifié, Continuer ?" - -#: pcbnew/files.cpp:172 -msgid "Open Board File:" -msgstr "Ouvrir Fichier C.I.:" - -#: pcbnew/files.cpp:199 -#, c-format -msgid "File <%s> not found" -msgstr " fichier %s non trouvé" - -#: pcbnew/files.cpp:218 -msgid "This file was created by a more recent version of PCBnew and may not load correctly. Please consider updating!" -msgstr "Ce fichier a été créé par une version plus récente de PCBnew et peut être incorrectement chargé. SVP penser à une mise à jour!" - -#: pcbnew/files.cpp:222 -msgid "This file was created by an older version of PCBnew. It will be stored in the new file format when you save this file again." -msgstr "Ce fichier a été créé par une version plus ancienne de Eeschema. Il sera enregistré au nouveau format après la prochaine sauvegarde." - -#: pcbnew/files.cpp:309 -msgid "Save Board File" -msgstr "Sauver Fichier C.I." - -#: pcbnew/files.cpp:343 -msgid "Warning: unable to create backup file " -msgstr "Attention: impossible de créer un fichier backup " - -#: pcbnew/files.cpp:360 -#: pcbnew/plothpgl.cpp:68 -msgid "Unable to create " -msgstr "Impossible de créer " - -#: pcbnew/files.cpp:379 -msgid "Backup file: " -msgstr "Fichier backup: " - -#: pcbnew/files.cpp:383 -msgid "Wrote board file: " -msgstr "Ecriture fichier CI: " - -#: pcbnew/files.cpp:385 -msgid "Failed to create " -msgstr "Impossible de créer fichier " - #: pcbnew/edgemod.cpp:205 msgid "The graphic item will be on a copper layer.It is very dangerous. Are you sure" msgstr "L'élément graphique sera sur une couche cuivre. C'est très dangereux. Etes vous sûr" @@ -1453,6 +1592,10 @@ msgstr "Filtre Equipot" msgid "List Nets" msgstr "Liste équipots" +#: pcbnew/plothpgl.cpp:68 +msgid "Unable to create " +msgstr "Impossible de créer " + #: pcbnew/plothpgl.cpp:75 msgid "File" msgstr "Fichier" @@ -1690,6 +1833,65 @@ msgstr "Segment en cours d'édition" msgid "Delete Layer " msgstr "Effacer Couche" +#: pcbnew/files.cpp:21 +msgid "Printed circuit board" +msgstr "Circuit imprimé" + +#: pcbnew/files.cpp:85 +msgid "Recovery file " +msgstr "Fichier de secours " + +#: pcbnew/files.cpp:85 +#: pcbnew/librairi.cpp:243 +msgid " not found" +msgstr " non trouvé" + +#: pcbnew/files.cpp:91 +msgid "Ok to load Recovery file " +msgstr "Ok pour charger le fichier de secours" + +#: pcbnew/files.cpp:152 +msgid "Board Modified: Continue ?" +msgstr "Circuit imprimé modifié, Continuer ?" + +#: pcbnew/files.cpp:173 +msgid "Open Board File:" +msgstr "Ouvrir Fichier C.I.:" + +#: pcbnew/files.cpp:200 +#: pcbnew/librairi.cpp:79 +#, c-format +msgid "File <%s> not found" +msgstr " fichier %s non trouvé" + +#: pcbnew/files.cpp:219 +msgid "This file was created by a more recent version of PCBnew and may not load correctly. Please consider updating!" +msgstr "Ce fichier a été créé par une version plus récente de PCBnew et peut être incorrectement chargé. SVP penser à une mise à jour!" + +#: pcbnew/files.cpp:223 +msgid "This file was created by an older version of PCBnew. It will be stored in the new file format when you save this file again." +msgstr "Ce fichier a été créé par une version plus ancienne de Eeschema. Il sera enregistré au nouveau format après la prochaine sauvegarde." + +#: pcbnew/files.cpp:313 +msgid "Save Board File" +msgstr "Sauver Fichier C.I." + +#: pcbnew/files.cpp:347 +msgid "Warning: unable to create backup file " +msgstr "Attention: impossible de créer un fichier backup " + +#: pcbnew/files.cpp:383 +msgid "Backup file: " +msgstr "Fichier backup: " + +#: pcbnew/files.cpp:387 +msgid "Wrote board file: " +msgstr "Ecriture fichier CI: " + +#: pcbnew/files.cpp:389 +msgid "Failed to create " +msgstr "Impossible de créer fichier " + #: pcbnew/librairi.cpp:33 msgid "Kicad foot print export files (*.emp)|*.emp" msgstr "Kicad fichiers export modules (*.emp)|*.emp" @@ -2142,10 +2344,6 @@ msgstr "Pistes et Vias" msgid "Adjust size and width for tracks and vias" msgstr "Ajuster largeur des pistes et diamètre de vias" -#: pcbnew/menubarpcb.cpp:219 -msgid "Grid" -msgstr "Grille" - #: pcbnew/menubarpcb.cpp:220 msgid "Adjust User Grid" msgstr "Ajuster Grille utilisateur" @@ -2398,33 +2596,105 @@ msgstr "Valeur incorrecte pour offset du pad" msgid "Unknown netname, no change" msgstr "Net inconnu, pas de changement" -#: pcbnew/initpcb.cpp:133 -msgid "Current Board will be lost ?" -msgstr "Le C.I. courant sera perdu ?" +#: pcbnew/pcbframe.cpp:309 +msgid "Board modified, Save before exit ?" +msgstr "Circuit Imprimé modifié, Sauver avant de quitter ?" -#: pcbnew/initpcb.cpp:185 -msgid "Delete Zones ?" -msgstr "Effacer Zones ?" +#: pcbnew/pcbframe.cpp:310 +msgid "Confirmation" +msgstr "Confirmation" -#: pcbnew/initpcb.cpp:206 -msgid "Delete Board edges ?" -msgstr "Effacement contour PCB" +#: pcbnew/pcbframe.cpp:415 +msgid "DRC Off (Disable !!!), Currently: DRC is active" +msgstr "DRC off (désactivée !!!), actuellement DRC active" -#: pcbnew/initpcb.cpp:211 -msgid "Delete draw items?" -msgstr "Suppression éléments graphiques?" +#: pcbnew/pcbframe.cpp:416 +msgid "DRC On (Currently: DRC is inactive !!!)" +msgstr "DRC On (Actuellement, DRC désactivée !!!)" -#: pcbnew/initpcb.cpp:253 -msgid "Delete Tracks?" -msgstr "Effacer Pistes ?" +#: pcbnew/pcbframe.cpp:427 +msgid "Polar Coords not show" +msgstr "Coord Polaires non affichées" -#: pcbnew/initpcb.cpp:276 -msgid "Delete Modules?" -msgstr "Effacement des Modules?" +#: pcbnew/pcbframe.cpp:428 +msgid "Display Polar Coords" +msgstr "Affichage coord Polaires" -#: pcbnew/initpcb.cpp:298 -msgid "Delete Pcb Texts" -msgstr "Effacer Textes Pcb" +#: pcbnew/pcbframe.cpp:433 +msgid "Grid not show" +msgstr "Grille non montrée" + +#: pcbnew/pcbframe.cpp:433 +msgid "Show Grid" +msgstr "Afficher grille" + +#: pcbnew/pcbframe.cpp:442 +msgid "Hide General ratsnest" +msgstr "Ne pas afficher le chevelu général" + +#: pcbnew/pcbframe.cpp:443 +msgid "Show General ratsnest" +msgstr "Afficher le chevelu général" + +#: pcbnew/pcbframe.cpp:449 +msgid "Hide Module ratsnest" +msgstr "Ne pas montrer le chevelu du module" + +#: pcbnew/pcbframe.cpp:450 +msgid "Show Module ratsnest" +msgstr "Montrer le chevelu du module" + +#: pcbnew/pcbframe.cpp:457 +msgid "Disable Auto Delete old Track" +msgstr "Ne pas Autoriser l'effacement automatique des pistes" + +#: pcbnew/pcbframe.cpp:458 +msgid "Enable Auto Delete old Track" +msgstr "Autoriser l'effacement automatique des pistes" + +#: pcbnew/pcbframe.cpp:465 +msgid "Show Pads Sketch mode" +msgstr "Afficher pastilles en contour" + +#: pcbnew/pcbframe.cpp:466 +msgid "Show pads filled mode" +msgstr "Afficher pastilles en mode plein" + +#: pcbnew/pcbframe.cpp:472 +msgid "Show Tracks Sketch mode" +msgstr "Afficher pistes en contour" + +#: pcbnew/pcbframe.cpp:473 +msgid "Show Tracks filled mode" +msgstr "Afficher pistes en mode plein" + +#: pcbnew/pcbframe.cpp:479 +msgid "Normal Contrast Mode Display" +msgstr "Mode d'affichage Contraste normal" + +#: pcbnew/pcbframe.cpp:486 +msgid "Hide Invisible Text" +msgstr "Cacher textes invisibles" + +#: pcbnew/pcbframe.cpp:499 +msgid "Track" +msgstr "Piste" + +#: pcbnew/pcbframe.cpp:531 +msgid "Clearance" +msgstr "Isolation" + +#: pcbnew/pcbframe.cpp:563 +msgid "Via" +msgstr "Via" + +#: pcbnew/pcbframe.cpp:635 +msgid "3D Frame already opened" +msgstr "Fenêtre 3D déjà ouverte" + +#: pcbnew/pcbframe.cpp:639 +msgid "3D Viewer" +msgstr "Visu 3D" #: pcbnew/clean.cpp:179 msgid "Delete unconnected tracks:" @@ -2549,6 +2819,54 @@ msgstr "" "Plan de perçage: trop de diamètres différents pour tracer 1 symbole par diamètre (max 13)\n" "Le tracé utilise des cercles pour quelques valeurs " +#: pcbnew/ioascii.cpp:174 +msgid "Error: Unexpected end of file !" +msgstr "Erreur: Fin de fichier inattendue !" + +#: pcbnew/edit.cpp:418 +msgid "Add Tracks" +msgstr "Addition de Pistes" + +#: pcbnew/edit.cpp:427 +msgid "Add Zones" +msgstr "Addition de Zones" + +#: pcbnew/edit.cpp:429 +msgid "Warning: Display Zone is OFF!!!" +msgstr "Attention: Affichage zones désactivé !!!" + +#: pcbnew/edit.cpp:435 +msgid "Add Layer Alignment Target" +msgstr "Ajouter Mire de superposition" + +#: pcbnew/edit.cpp:439 +msgid "Adjust Zero" +msgstr "Ajuster Zéro" + +#: pcbnew/edit.cpp:445 +msgid "Add Graphic" +msgstr "Addition éléments graphiques" + +#: pcbnew/edit.cpp:449 +msgid "Add Text" +msgstr "Ajout de Texte" + +#: pcbnew/edit.cpp:453 +msgid "Add Modules" +msgstr "Addition de Modules" + +#: pcbnew/edit.cpp:457 +msgid "Add Dimension" +msgstr "Ajout de cotes" + +#: pcbnew/edit.cpp:465 +msgid "Net Highlight" +msgstr "Surbrillance des équipotentielles" + +#: pcbnew/edit.cpp:469 +msgid "Local Ratsnest" +msgstr "Montrer le chevelu général" + #: pcbnew/class_zone.cpp:871 #: pcbnew/class_board_item.cpp:134 msgid "Zone Outline" @@ -2667,63 +2985,6 @@ msgstr "Créer Fichier " msgid " error" msgstr " erreur" -#: pcbnew/edit.cpp:262 -msgid "Add Tracks" -msgstr "Addition de Pistes" - -#: pcbnew/edit.cpp:271 -msgid "Add Zones" -msgstr "Addition de Zones" - -#: pcbnew/edit.cpp:273 -msgid "Warning: Display Zone is OFF!!!" -msgstr "Attention: Affichage zones désactivé !!!" - -#: pcbnew/edit.cpp:279 -msgid "Add Layer Alignment Target" -msgstr "Ajouter Mire de superposition" - -#: pcbnew/edit.cpp:283 -msgid "Adjust Zero" -msgstr "Ajuster Zéro" - -#: pcbnew/edit.cpp:289 -msgid "Add Graphic" -msgstr "Addition éléments graphiques" - -#: pcbnew/edit.cpp:293 -msgid "Add Text" -msgstr "Ajout de Texte" - -#: pcbnew/edit.cpp:297 -msgid "Add Modules" -msgstr "Addition de Modules" - -#: pcbnew/edit.cpp:301 -msgid "Add Dimension" -msgstr "Ajout de cotes" - -#: pcbnew/edit.cpp:309 -msgid "Net Highlight" -msgstr "Surbrillance des équipotentielles" - -#: pcbnew/edit.cpp:313 -msgid "Local Ratsnest" -msgstr "Montrer le chevelu général" - -#: pcbnew/pcbcfg.cpp:73 -msgid "Read Project File" -msgstr "Lire Fichier Projet" - -#: pcbnew/pcbcfg.cpp:83 -#, c-format -msgid "File %s not found" -msgstr "Fichier %s non trouvé" - -#: pcbnew/pcbcfg.cpp:223 -msgid "Save Project File" -msgstr "Sauver Fichier Projet" - #: pcbnew/class_board_item.cpp:24 msgid "Rect" msgstr "Rect" @@ -2830,11 +3091,6 @@ msgstr "dimension" msgid "Options" msgstr "Options" -#: pcbnew/dialog_drc_base.cpp:35 -#: pcbnew/dialog_track_options_base.cpp:106 -msgid "Clearance" -msgstr "Isolation" - #: pcbnew/dialog_drc_base.cpp:40 #: pcbnew/dialog_drc_base.cpp:49 #: pcbnew/dialog_drc_base.cpp:61 @@ -3145,267 +3401,6 @@ msgstr "Fichier rapport DRC (.rpt)|*.rpt" msgid "Save DRC Report File" msgstr "Sauver Fichier Rapport DRC:" -#: pcbnew/tool_pcb.cpp:30 -msgid "" -"Show active layer selections\n" -"and select layer pair for route and place via" -msgstr "" -"Affiche sélections couche active\n" -"et sélection paire de couches pour routage et placement via" - -#: pcbnew/tool_pcb.cpp:204 -msgid "New board" -msgstr "Nouveau Circuit Imprimé" - -#: pcbnew/tool_pcb.cpp:206 -msgid "Open existing board" -msgstr "Ouvrir C.I. existant" - -#: pcbnew/tool_pcb.cpp:208 -msgid "Save board" -msgstr "Sauver Circuit Imprimé" - -#: pcbnew/tool_pcb.cpp:212 -msgid "Page settings (size, texts)" -msgstr "Ajustage de la feuille de dessin (dimensions, textes)" - -#: pcbnew/tool_pcb.cpp:217 -msgid "Open module editor" -msgstr "Ouvrir Editeur de modules" - -#: pcbnew/tool_pcb.cpp:221 -msgid "Cut selected item" -msgstr "Suppression des éléments sélectionnés" - -#: pcbnew/tool_pcb.cpp:225 -msgid "Copy selected item" -msgstr "Copie des éléments sélectionnés" - -#: pcbnew/tool_pcb.cpp:228 -msgid "Paste" -msgstr "Copie des éléments sauvegardés" - -#: pcbnew/tool_pcb.cpp:232 -msgid "Undelete" -msgstr "Annulation du dernier effacement" - -#: pcbnew/tool_pcb.cpp:236 -msgid "Print board" -msgstr "Imprimer C.I." - -#: pcbnew/tool_pcb.cpp:238 -msgid "Plot (HPGL, PostScript, or GERBER format)" -msgstr "Tracer en format HPGL, POSTSCRIPT ou GERBER" - -#: pcbnew/tool_pcb.cpp:241 -msgid "Zoom in" -msgstr "Zoom +" - -#: pcbnew/tool_pcb.cpp:246 -msgid "Zoom out" -msgstr "Zoom -" - -#: pcbnew/tool_pcb.cpp:251 -msgid "Redraw view" -msgstr "Redessin de l'écran" - -#: pcbnew/tool_pcb.cpp:258 -msgid "Zoom auto" -msgstr "Zoom Automatique" - -#: pcbnew/tool_pcb.cpp:261 -msgid "Find components and texts" -msgstr "Recherche de composants et textes" - -#: pcbnew/tool_pcb.cpp:269 -msgid "Read netlist" -msgstr "Lire Netliste" - -#: pcbnew/tool_pcb.cpp:271 -msgid "Pcb Design Rules Check" -msgstr "Contrôle des règles de conception" - -#: pcbnew/tool_pcb.cpp:283 -msgid "Mode Module: Manual and Automatic Move or Place for modules" -msgstr "Mode Module: Déplacements ou Placement Manuel ou Automatique des modules" - -#: pcbnew/tool_pcb.cpp:287 -msgid "Mode Track and Autorouting" -msgstr "Mode Pistes et Autoroutage" - -#: pcbnew/tool_pcb.cpp:293 -msgid "Fast access to theWeb Based FreeROUTE advanced router" -msgstr "Acces rapide au routeur avancé FreeROUTE sur le Web" - -#: pcbnew/tool_pcb.cpp:320 -msgid "Drc OFF" -msgstr "Drc DESACTIVEE" - -#: pcbnew/tool_pcb.cpp:323 -msgid "Display Grid OFF" -msgstr "Suppression de l'affichage de la grille" - -#: pcbnew/tool_pcb.cpp:326 -msgid "Display Polar Coord ON" -msgstr "Activer affichage coord Polaires" - -#: pcbnew/tool_pcb.cpp:329 -msgid "Units in inches" -msgstr "Unités en pouces" - -#: pcbnew/tool_pcb.cpp:332 -msgid "Units in millimeters" -msgstr "Unités en millimètres" - -#: pcbnew/tool_pcb.cpp:335 -msgid "Change Cursor Shape" -msgstr "Sélection de la forme du curseur" - -#: pcbnew/tool_pcb.cpp:340 -msgid "Show General Ratsnest" -msgstr "Montrer le chevelu général" - -#: pcbnew/tool_pcb.cpp:343 -msgid "Show Module Ratsnest when moving" -msgstr "Montrer le chevelu du module pendant déplacement" - -#: pcbnew/tool_pcb.cpp:349 -msgid "Enable Auto Del Track" -msgstr "Autoriser l'effacement automatique des pistes" - -#: pcbnew/tool_pcb.cpp:354 -msgid "Show filled areas in zones" -msgstr "Afficher les surfaces remplies dans les zones" - -#: pcbnew/tool_pcb.cpp:357 -msgid "Do not show filled areas in zones" -msgstr "Ne pas afficher les surfaces remplies dans les zones" - -#: pcbnew/tool_pcb.cpp:360 -msgid "Show outlines of filled areas only in zones" -msgstr "Afficher uniquement les contours des surfaces remplies dans les zones" - -#: pcbnew/tool_pcb.cpp:365 -msgid "Show Pads Sketch" -msgstr "Afficher pastilles en contour" - -#: pcbnew/tool_pcb.cpp:369 -msgid "Show Tracks Sketch" -msgstr "Afficher Pistes en Contour" - -#: pcbnew/tool_pcb.cpp:384 -msgid "" -"Display/remove auxiliary vertical toolbar (tools for micro wave applications)\n" -" This is a experimental feature (under development)" -msgstr "" -"Affiche/supprime le toolbar vertical auxiliaire (outils pour applications micro-ondes)\n" -"C'est un outil expérimental (en cours de développement)" - -#: pcbnew/tool_pcb.cpp:414 -msgid "Net highlight" -msgstr "Surbrillance des équipotentielles" - -#: pcbnew/tool_pcb.cpp:419 -msgid "Display local ratsnest (pad or module)" -msgstr "Afficher le chevelu local (pastilles ou modules)" - -#: pcbnew/tool_pcb.cpp:425 -msgid "Add modules" -msgstr "Addition de Modules" - -#: pcbnew/tool_pcb.cpp:429 -msgid "Add tracks and vias" -msgstr "Ajouter pistes et vias" - -#: pcbnew/tool_pcb.cpp:433 -msgid "Add zones" -msgstr "Addition de Zones" - -#: pcbnew/tool_pcb.cpp:438 -msgid "Add graphic line or polygon" -msgstr "Addition de lignes ou polygones graphiques" - -#: pcbnew/tool_pcb.cpp:442 -msgid "Add graphic circle" -msgstr "Addition de graphiques (Cercle)" - -#: pcbnew/tool_pcb.cpp:446 -msgid "Add graphic arc" -msgstr "Addition de graphiques (Arc de Cercle)" - -#: pcbnew/tool_pcb.cpp:450 -msgid "Add text" -msgstr "Ajout de Texte" - -#: pcbnew/tool_pcb.cpp:455 -msgid "Add dimension" -msgstr "Ajout des cotes" - -#: pcbnew/tool_pcb.cpp:459 -msgid "Add layer alignment target" -msgstr "Ajouter Mire de superposition" - -#: pcbnew/tool_pcb.cpp:464 -msgid "Delete items" -msgstr "Suppression d'éléments" - -#: pcbnew/tool_pcb.cpp:469 -msgid "Offset adjust for drill and place files" -msgstr "Ajuste offset pour fichier de perçage et placement" - -#: pcbnew/tool_pcb.cpp:495 -msgid "Create line of specified length for microwave applications" -msgstr "Création de lignes de longueur spécifiée (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:499 -msgid "Create gap of specified length for microwave applications" -msgstr "Création de gaps de longueur spécifiée (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:505 -msgid "Create stub of specified length for microwave applications" -msgstr "Création de stub de longueur spécifiée (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:509 -msgid "Create stub (arc) of specified length for microwave applications" -msgstr "Création de stub (arc) de longueur spécifiée (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:514 -msgid "Create a polynomial shape for microwave applications" -msgstr "Création de formes polynomiales (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:555 -msgid "" -"Auto track width: when starting on an existing track use its width\n" -"otherwise, use current width setting" -msgstr "" -"Largeur de piste automatique: si on démarre sur une piste existante, utiliser sa largeur\n" -" sinon utiliser la largeur courante" - -#: pcbnew/tool_pcb.cpp:580 -msgid "Auto" -msgstr "Auto" - -#: pcbnew/tool_pcb.cpp:584 -msgid "Zoom " -msgstr "Zoom " - -#: pcbnew/tool_pcb.cpp:622 -msgid "User Grid" -msgstr "Grille perso" - -#: pcbnew/tool_pcb.cpp:736 -msgid "+/- to switch" -msgstr "+/- pour commuter" - -#: pcbnew/editrack-part2.cpp:32 -#, c-format -msgid "Track Width: %s Vias Size : %s" -msgstr "Larg. piste: %s Diam Vias : %s" - -#: pcbnew/editrack-part2.cpp:134 -msgid "Drc error, cancelled" -msgstr "Erreur DRC, annulation" - #: pcbnew/dialog_print_using_printer.cpp:129 msgid "Error Init Printer info" msgstr "Erreur Init info imprimante" @@ -3459,6 +3454,65 @@ msgstr "Le caractère de délimitation de ligne doit être un seul caractère ' msgid "Un-terminated delimited string" msgstr "Ligne délimitée non terminée" +#: pcbnew/specctra_import.cpp:76 +msgid "Merge Specctra Session file:" +msgstr "Fichier Specctra Session à Fusionner:" + +#: pcbnew/specctra_import.cpp:103 +msgid "BOARD may be corrupted, do not save it." +msgstr "Le PCB peut être corrompu. Ne pas le sauver" + +#: pcbnew/specctra_import.cpp:105 +msgid "Fix problem and try again." +msgstr "Fixer le problème et recommencer." + +#: pcbnew/specctra_import.cpp:129 +msgid "Session file imported and merged OK." +msgstr "Fichier Session importé et fusionné correctement." + +#: pcbnew/specctra_import.cpp:204 +#: pcbnew/specctra_import.cpp:312 +#, c-format +msgid "Session file uses invalid layer id \"%s\"" +msgstr "Le Fichier Session utilise une couche invalide n° \"%s\"" + +#: pcbnew/specctra_import.cpp:254 +msgid "Session via padstack has no shapes" +msgstr "Dans le fichier Session une via n'a pas de forme" + +#: pcbnew/specctra_import.cpp:261 +#: pcbnew/specctra_import.cpp:279 +#: pcbnew/specctra_import.cpp:303 +#, c-format +msgid "Unsupported via shape: \"%s\"" +msgstr "Forme via non supportée: \"%s\"" + +#: pcbnew/specctra_import.cpp:360 +msgid "Session file is missing the \"session\" section" +msgstr "Manque dans le Fichier Session file la section \"session\"" + +#: pcbnew/specctra_import.cpp:363 +msgid "Session file is missing the \"placement\" section" +msgstr "Manque dans le Fichier Session file la section \"placement\"" + +#: pcbnew/specctra_import.cpp:366 +msgid "Session file is missing the \"routes\" section" +msgstr "Manque dans le Fichier Session file la section \"routes\"" + +#: pcbnew/specctra_import.cpp:369 +msgid "Session file is missing the \"library_out\" section" +msgstr "Manque dans le Fichier Session file la section \"library_out\"" + +#: pcbnew/specctra_import.cpp:395 +#, c-format +msgid "Session file has 'reference' to non-existent component \"%s\"" +msgstr "Le fichier Session a une 'reference' à un composant non existant \"%s\"" + +#: pcbnew/specctra_import.cpp:539 +#, c-format +msgid "A wire_via references a missing padstack \"%s\"" +msgstr "Une piste ou via a une référence vers un pad \"%s\" manquant" + #: pcbnew/modedit_onclick.cpp:198 msgid "End Tool" msgstr "Fin Outil" @@ -4228,65 +4282,6 @@ msgstr "Autoroute Pad" msgid "Autoroute Net" msgstr "Autoroute Net" -#: pcbnew/specctra_import.cpp:76 -msgid "Merge Specctra Session file:" -msgstr "Fichier Specctra Session à Fusionner:" - -#: pcbnew/specctra_import.cpp:103 -msgid "BOARD may be corrupted, do not save it." -msgstr "Le PCB peut être corrompu. Ne pas le sauver" - -#: pcbnew/specctra_import.cpp:105 -msgid "Fix problem and try again." -msgstr "Fixer le problème et recommencer." - -#: pcbnew/specctra_import.cpp:128 -msgid "Session file imported and merged OK." -msgstr "Fichier Session importé et fusionné correctement." - -#: pcbnew/specctra_import.cpp:203 -#: pcbnew/specctra_import.cpp:311 -#, c-format -msgid "Session file uses invalid layer id \"%s\"" -msgstr "Le Fichier Session utilise une couche invalide n° \"%s\"" - -#: pcbnew/specctra_import.cpp:253 -msgid "Session via padstack has no shapes" -msgstr "Dans le fichier Session une via n'a pas de forme" - -#: pcbnew/specctra_import.cpp:260 -#: pcbnew/specctra_import.cpp:278 -#: pcbnew/specctra_import.cpp:302 -#, c-format -msgid "Unsupported via shape: \"%s\"" -msgstr "Forme via non supportée: \"%s\"" - -#: pcbnew/specctra_import.cpp:359 -msgid "Session file is missing the \"session\" section" -msgstr "Manque dans le Fichier Session file la section \"session\"" - -#: pcbnew/specctra_import.cpp:362 -msgid "Session file is missing the \"placement\" section" -msgstr "Manque dans le Fichier Session file la section \"placement\"" - -#: pcbnew/specctra_import.cpp:365 -msgid "Session file is missing the \"routes\" section" -msgstr "Manque dans le Fichier Session file la section \"routes\"" - -#: pcbnew/specctra_import.cpp:368 -msgid "Session file is missing the \"library_out\" section" -msgstr "Manque dans le Fichier Session file la section \"library_out\"" - -#: pcbnew/specctra_import.cpp:394 -#, c-format -msgid "Session file has 'reference' to non-existent component \"%s\"" -msgstr "Le fichier Session a une 'reference' à un composant non existant \"%s\"" - -#: pcbnew/specctra_import.cpp:538 -#, c-format -msgid "A wire_via references a missing padstack \"%s\"" -msgstr "Une piste ou via a une référence vers un pad \"%s\" manquant" - #: pcbnew/dialog_copper_zones_base.cpp:32 msgid "Zone Setup:" msgstr "Options Zone:" @@ -5679,6 +5674,15 @@ msgstr "" "Chemins (chemins système et chemins utilisateurs) utilisés pour chercher et charger les fichiers libriries et documentation des composants.\n" "Triés par ordre de priorité décroissante." +#: pcbnew/editrack-part2.cpp:32 +#, c-format +msgid "Track Width: %s Vias Size : %s" +msgstr "Larg. piste: %s Diam Vias : %s" + +#: pcbnew/editrack-part2.cpp:135 +msgid "Drc error, cancelled" +msgstr "Erreur DRC, annulation" + #: eeschema/dialog_erc.cpp:159 #: eeschema/dialog_erc.cpp:186 msgid "Erc File Report:" @@ -6447,10 +6451,6 @@ msgstr "Ancre" msgid "Export" msgstr "Exporter" -#: eeschema/eeconfig.cpp:288 -msgid "Save Project Settings" -msgstr "Sauver Optionsr Projet" - #: eeschema/annotate.cpp:278 #, c-format msgid "%d Duplicate Time stamps replaced" @@ -7377,17 +7377,14 @@ msgid "Right" msgstr "Droite" #: eeschema/plotps.cpp:177 -#: eeschema/plothpgl.cpp:210 msgid "Page Size A4" msgstr "Feuille A4" #: eeschema/plotps.cpp:178 -#: eeschema/plothpgl.cpp:215 msgid "Page Size A" msgstr "Feuille A" #: eeschema/plotps.cpp:179 -#: eeschema/plothpgl.cpp:220 msgid "Plot page size:" msgstr "Format de la feuille:" @@ -7408,12 +7405,10 @@ msgid "Print Sheet Ref" msgstr "Imprimer cartouche" #: eeschema/plotps.cpp:205 -#: eeschema/plothpgl.cpp:270 msgid "&Plot Page" msgstr "&Tracer Page" #: eeschema/plotps.cpp:209 -#: eeschema/plothpgl.cpp:274 msgid "Plot A&LL" msgstr "&Tout Tracer" @@ -8155,6 +8150,10 @@ msgstr "la position Y du point %d de la polyligne n'est pas définie" msgid "text only had %d parameters of the required 8" msgstr "le texte a seulement %d paramètres sur les 8 requis" +#: eeschema/eeconfig.cpp:289 +msgid "Save Project Settings" +msgstr "Sauver Optionsr Projet" + #: eeschema/dialog_options.cpp:140 #: eeschema/dialog_options.cpp:287 msgid "Delta Step X" @@ -10154,14 +10153,6 @@ msgstr "Ext. Fichiers Gerber" msgid "D code File Ext:" msgstr "Ext. Fichiers DCodes:" -#: gerbview/gerbview_config.cpp:26 -msgid "GerbView project files (.cnf)|*.cnf" -msgstr "Fichiers projet GerbView (.cnf)|*.cnf" - -#: gerbview/gerbview_config.cpp:140 -msgid "Save GerbView Project File" -msgstr "Sauver Fichier Projet Gerbview" - #: gerbview/select_layers_to_pcb.cpp:220 #: gerbview/tool_gerber.cpp:244 msgid "Layer " @@ -10392,6 +10383,14 @@ msgstr "Afficher Polygones en Mode Contour" msgid "Show dcode number" msgstr "Afficher le n° de DCode" +#: gerbview/gerbview_config.cpp:26 +msgid "GerbView project files (.cnf)|*.cnf" +msgstr "Fichiers projet GerbView (.cnf)|*.cnf" + +#: gerbview/gerbview_config.cpp:142 +msgid "Save GerbView Project File" +msgstr "Sauver Fichier Projet Gerbview" + #: gerbview/set_color.cpp:271 msgid "Switch on all of the Gerber layers" msgstr "Affiche toutes les couches Gerber" @@ -10600,35 +10599,6 @@ msgstr "Contour Pcb" msgid "BAD INDEX" msgstr "BAD INDEX" -#: common/gestfich.cpp:444 -#, c-format -msgid "Command <%s> could not found" -msgstr "Commande <%s> non trouvée" - -#: common/gestfich.cpp:544 -msgid "No default editor found, you must choose it" -msgstr "Pas d'éditeur par défaut trouvé, vous devez en choisir un" - -#: common/gestfich.cpp:550 -msgid "Prefered Editor:" -msgstr "Editeur préféré:" - -#: common/gestfich.cpp:646 -msgid "Problem while running the PDF viewer" -msgstr "Problème en lançant le Visualisateur PDF" - -#: common/gestfich.cpp:647 -msgid "" -"\n" -" command is " -msgstr "" -"\n" -" la commande est " - -#: common/gestfich.cpp:653 -msgid "Unable to find a PDF viewer for" -msgstr "Impossible de trouver un visualisateur PDF pour" - #: common/edaappl.cpp:95 msgid "Default" msgstr "Défaut" @@ -10750,6 +10720,35 @@ msgstr "Inversion Bloc" msgid "Block Mirror" msgstr "Bloc Miroir" +#: common/gestfich.cpp:445 +#, c-format +msgid "Command <%s> could not found" +msgstr "Commande <%s> non trouvée" + +#: common/gestfich.cpp:545 +msgid "No default editor found, you must choose it" +msgstr "Pas d'éditeur par défaut trouvé, vous devez en choisir un" + +#: common/gestfich.cpp:551 +msgid "Prefered Editor:" +msgstr "Editeur préféré:" + +#: common/gestfich.cpp:647 +msgid "Problem while running the PDF viewer" +msgstr "Problème en lançant le Visualisateur PDF" + +#: common/gestfich.cpp:648 +msgid "" +"\n" +" command is " +msgstr "" +"\n" +" la commande est " + +#: common/gestfich.cpp:654 +msgid "Unable to find a PDF viewer for" +msgstr "Impossible de trouver un visualisateur PDF pour" + #: common/hotkeys_basic.cpp:321 msgid "" "Current hotkey list:\n" @@ -10834,14 +10833,6 @@ msgstr "Emplacement des Fichiers des Hotkeys" msgid "Select hotkey config file location (home directory or kicad tree)" msgstr "Sélection emplacement des fichiers de config. des hotkeys(\"home\" ou répertoire kicad)" -#: common/drawframe.cpp:301 -msgid "Inch" -msgstr "Pouce" - -#: common/drawframe.cpp:309 -msgid "??" -msgstr "??" - #: common/basicframe.cpp:219 msgid " file <" msgstr " Fichier <" @@ -10872,6 +10863,14 @@ msgstr "Via Aveugle/Enterrée" msgid "Kicad footprint library files (*.mod)|*.mod" msgstr "Fichiers Modules Kicad (*.mod)|*.mod" +#: common/drawframe.cpp:302 +msgid "Inch" +msgstr "Pouce" + +#: common/drawframe.cpp:310 +msgid "??" +msgstr "??" + #: 3d-viewer/3d_aux.cpp:206 msgid "Vertex " msgstr "Vertex " diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 2d06707b1c..a2597aeb05 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -38,7 +38,8 @@ set(PCBNEW_SRCS dialog_drc.cpp dialog_edit_module_text.cpp dialog_edit_module_text_base.cpp -# dialog_edit_module.cpp + dialog_edit_module.cpp + dialog_exchange_modules_base.cpp dialog_freeroute_exchange.cpp # dialog_gendrill.cpp dialog_general_options.cpp diff --git a/pcbnew/class_netinfo.h b/pcbnew/class_netinfo.h index 961688c72d..b49adce972 100644 --- a/pcbnew/class_netinfo.h +++ b/pcbnew/class_netinfo.h @@ -68,9 +68,8 @@ class NETINFO_LIST { private: BOARD* m_Parent; - -// boost::ptr_vector m_NetBuffer; // nets buffer list (name, design constraints .. std::vector m_NetBuffer; // nets buffer list (name, design constraints .. + public: std::vector m_PadsFullList; // Entry for a sorted pad list (used in ratsnest calculations) @@ -115,17 +114,19 @@ public: return m_PadsFullList.size(); } + /** Function GetPad * @return the pad idx from m_PadsFullList */ - D_PAD* GetPad( unsigned aIdx) + D_PAD* GetPad( unsigned aIdx ) { - if (aIdx < m_PadsFullList.size() ) + if( aIdx < m_PadsFullList.size() ) return m_PadsFullList[aIdx]; else return NULL; } + private: /** Function Build_Pads_Full_List @@ -156,10 +157,12 @@ public: int m_NbNodes; // Pads count for this net int m_NbLink; // Ratsnets count for this net int m_NbNoconn; // Ratsnets remaining to route count - int m_ForceWidth; // specific width (O = default width) + int m_ForceWidth; // specific width (0 = default width) std::vector m_ListPad; // List of pads connected to this net - unsigned m_RatsnestStart; // debut de liste ratsnests du net (included) - unsigned m_RatsnestEnd; // fin de liste ratsnests du net (excluded) + unsigned m_RatsnestStartIdx; /* Starting point of ratsnests of this net (included) + * in a general buffer of ratsnest (a vector buffer) + */ + unsigned m_RatsnestEndIdx; // Ending point of ratsnests of this net (excluded) in this buffer NETINFO_ITEM( BOARD_ITEM* aParent ); ~NETINFO_ITEM(); diff --git a/pcbnew/class_netinfo_item.cpp b/pcbnew/class_netinfo_item.cpp index 3455f39426..c0b2a99c71 100644 --- a/pcbnew/class_netinfo_item.cpp +++ b/pcbnew/class_netinfo_item.cpp @@ -19,8 +19,8 @@ NETINFO_ITEM::NETINFO_ITEM( BOARD_ITEM* aParent ) SetNet( 0 ); m_NbNodes = m_NbLink = m_NbNoconn = 0; m_ForceWidth = 0; - m_RatsnestStart = 0; // debut de liste ratsnests du net - m_RatsnestEnd = 0; // fin de liste ratsnests du net + m_RatsnestStartIdx = 0; // Starting point of ratsnests of this net in a general buffer of ratsnest + m_RatsnestEndIdx = 0; // Ending point of ratsnests of this net } diff --git a/pcbnew/class_netinfolist.cpp b/pcbnew/class_netinfolist.cpp index 36f3b4b04e..4e1b32cf64 100644 --- a/pcbnew/class_netinfolist.cpp +++ b/pcbnew/class_netinfolist.cpp @@ -86,7 +86,8 @@ void NETINFO_LIST::BuildListOfNets() DeleteData(); // Remove all nets info and free memory - // Create and add the "unconnected net" + // Create and add the "unconnected net", always existing, + // used to handle pads and tracks that are not member of a "real" net net_item = new NETINFO_ITEM( m_Parent ); AppendNet( net_item ); diff --git a/pcbnew/dialog_edit_module.cpp b/pcbnew/dialog_edit_module.cpp index a8874f779d..bf1bdf0651 100644 --- a/pcbnew/dialog_edit_module.cpp +++ b/pcbnew/dialog_edit_module.cpp @@ -4,10 +4,18 @@ /* include in modedit.cpp */ /************************************************/ +#include "fctsys.h" +#include "common.h" +#include "class_drawpanel.h" #include "confirm.h" +#include "pcbnew.h" #include "appl_wxstruct.h" +#include "gestfich.h" +#include "3d_struct.h" +#include "3d_viewer.h" #include "dialog_edit_module.h" -#include + +extern bool GoToEditor; /**************************************/ /* class WinEDA_ModulePropertiesFrame */ @@ -652,8 +660,7 @@ void WinEDA_ModulePropertiesFrame::GotoModuleEditor( wxCommandEvent& event ) void WinEDA_ModulePropertiesFrame::ExchangeModule( wxCommandEvent& event ) /**********************************************************************/ { - m_Parent->InstallExchangeModuleFrame( m_CurrentModule, - m_DC, wxPoint( -1, -1 ) ); + m_Parent->InstallExchangeModuleFrame( m_CurrentModule ); // Attention: si il y a eu echange, m_CurrentModule a été delete! m_Parent->SetCurItem( NULL ); diff --git a/pcbnew/dialog_exchange_modules_base.cpp b/pcbnew/dialog_exchange_modules_base.cpp new file mode 100644 index 0000000000..f2edaf82d9 --- /dev/null +++ b/pcbnew/dialog_exchange_modules_base.cpp @@ -0,0 +1,97 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#include "dialog_exchange_modules_base.h" + +/////////////////////////////////////////////////////////////////////////// + +DIALOG_EXCHANGE_MODULE_BASE::DIALOG_EXCHANGE_MODULE_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bMainSizer; + bMainSizer = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bUpperSizer; + bUpperSizer = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bLeftSizer; + bLeftSizer = new wxBoxSizer( wxVERTICAL ); + + m_staticText6 = new wxStaticText( this, wxID_ANY, _("Current Module"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText6->Wrap( -1 ); + bLeftSizer->Add( m_staticText6, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_OldModule = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); + bLeftSizer->Add( m_OldModule, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticText7 = new wxStaticText( this, wxID_ANY, _("Current Value"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText7->Wrap( -1 ); + bLeftSizer->Add( m_staticText7, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_OldValue = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); + bLeftSizer->Add( m_OldValue, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticText8 = new wxStaticText( this, wxID_ANY, _("New Module"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText8->Wrap( -1 ); + bLeftSizer->Add( m_staticText8, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_NewModule = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bLeftSizer->Add( m_NewModule, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + bUpperSizer->Add( bLeftSizer, 1, 0, 5 ); + + wxBoxSizer* bMiddleSizer; + bMiddleSizer = new wxBoxSizer( wxVERTICAL ); + + wxString m_SelectionChoices[] = { _("Change module"), _("Change same modules"), _("Ch. same module+value"), _("Change all") }; + int m_SelectionNChoices = sizeof( m_SelectionChoices ) / sizeof( wxString ); + m_Selection = new wxRadioBox( this, ID_SELECTION_CLICKED, _("wxRadioBox"), wxDefaultPosition, wxDefaultSize, m_SelectionNChoices, m_SelectionChoices, 1, wxRA_SPECIFY_COLS ); + m_Selection->SetSelection( 0 ); + bMiddleSizer->Add( m_Selection, 0, wxALL, 5 ); + + bUpperSizer->Add( bMiddleSizer, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bRightSizer; + bRightSizer = new wxBoxSizer( wxVERTICAL ); + + m_OKbutton = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 ); + bRightSizer->Add( m_OKbutton, 0, wxALL, 5 ); + + m_Quitbutton = new wxButton( this, wxID_CANCEL, _("Quit"), wxDefaultPosition, wxDefaultSize, 0 ); + bRightSizer->Add( m_Quitbutton, 0, wxALL, 5 ); + + m_Browsebutton = new wxButton( this, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + bRightSizer->Add( m_Browsebutton, 0, wxALL, 5 ); + + bUpperSizer->Add( bRightSizer, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bMainSizer->Add( bUpperSizer, 0, wxEXPAND, 5 ); + + m_WinMessages = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); + m_WinMessages->SetMinSize( wxSize( 450,300 ) ); + + bMainSizer->Add( m_WinMessages, 1, wxALL|wxEXPAND, 5 ); + + this->SetSizer( bMainSizer ); + this->Layout(); + + // Connect Events + m_Selection->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_EXCHANGE_MODULE_BASE::OnSelectionClicked ), NULL, this ); + m_OKbutton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EXCHANGE_MODULE_BASE::OnOkClick ), NULL, this ); + m_Quitbutton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EXCHANGE_MODULE_BASE::OnQuit ), NULL, this ); + m_Browsebutton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EXCHANGE_MODULE_BASE::BrowseAndSelectFootprint ), NULL, this ); +} + +DIALOG_EXCHANGE_MODULE_BASE::~DIALOG_EXCHANGE_MODULE_BASE() +{ + // Disconnect Events + m_Selection->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_EXCHANGE_MODULE_BASE::OnSelectionClicked ), NULL, this ); + m_OKbutton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EXCHANGE_MODULE_BASE::OnOkClick ), NULL, this ); + m_Quitbutton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EXCHANGE_MODULE_BASE::OnQuit ), NULL, this ); + m_Browsebutton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EXCHANGE_MODULE_BASE::BrowseAndSelectFootprint ), NULL, this ); +} diff --git a/pcbnew/dialog_exchange_modules_base.fbp b/pcbnew/dialog_exchange_modules_base.fbp new file mode 100644 index 0000000000..ab66f236f1 --- /dev/null +++ b/pcbnew/dialog_exchange_modules_base.fbp @@ -0,0 +1,708 @@ + + + + + + C++ + 1 + UTF-8 + connect + dialog_exchange_modules_base + 1000 + none + 1 + dialog_exchange_modules_base + + . + + 1 + 0 + 0 + + + + + 1 + + + + 0 + wxID_ANY + + + DIALOG_EXCHANGE_MODULE_BASE + + 416,469 + wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER + + Exchange Modules + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bMainSizer + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + + bUpperSizer + wxHORIZONTAL + none + + 5 + + 1 + + + bLeftSizer + wxVERTICAL + none + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Current Module + + + m_staticText6 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_OldModule + protected + + + wxTE_READONLY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + Current Value + + + m_staticText7 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_OldValue + protected + + + wxTE_READONLY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxTOP|wxRIGHT|wxLEFT + 0 + + + + 1 + + + 0 + wxID_ANY + New Module + + + m_staticText8 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + m_NewModule + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + bMiddleSizer + wxVERTICAL + none + + 5 + wxALL + 0 + + + "Change module" "Change same modules" "Ch. same module+value" "Change all" + + 1 + + + 0 + ID_SELECTION_CLICKED + wxRadioBox + 1 + + + m_Selection + protected + + 0 + + wxRA_SPECIFY_COLS + + + + + + + + + + + + + + + + + + + + + + + OnSelectionClicked + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL + 0 + + + bRightSizer + wxVERTICAL + none + + 5 + wxALL + 0 + + + + 0 + 1 + + + 0 + wxID_OK + OK + + + m_OKbutton + protected + + + + + + + + + OnOkClick + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 0 + 1 + + + 0 + wxID_CANCEL + Quit + + + m_Quitbutton + protected + + + + + + + + + OnQuit + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 0 + 1 + + + 0 + wxID_ANY + Browse + + + m_Browsebutton + protected + + + + + + + + + BrowseAndSelectFootprint + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + 0 + 450,300 + m_WinMessages + protected + + + wxTE_MULTILINE|wxTE_READONLY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pcbnew/dialog_exchange_modules_base.h b/pcbnew/dialog_exchange_modules_base.h new file mode 100644 index 0000000000..13e147a735 --- /dev/null +++ b/pcbnew/dialog_exchange_modules_base.h @@ -0,0 +1,62 @@ +/////////////////////////////////////////////////////////////////////////// +// C++ code generated with wxFormBuilder (version Apr 16 2008) +// http://www.wxformbuilder.org/ +// +// PLEASE DO "NOT" EDIT THIS FILE! +/////////////////////////////////////////////////////////////////////////// + +#ifndef __dialog_exchange_modules_base__ +#define __dialog_exchange_modules_base__ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////// + +#define ID_SELECTION_CLICKED 1000 + +/////////////////////////////////////////////////////////////////////////////// +/// Class DIALOG_EXCHANGE_MODULE_BASE +/////////////////////////////////////////////////////////////////////////////// +class DIALOG_EXCHANGE_MODULE_BASE : public wxDialog +{ + private: + + protected: + wxStaticText* m_staticText6; + wxTextCtrl* m_OldModule; + wxStaticText* m_staticText7; + wxTextCtrl* m_OldValue; + wxStaticText* m_staticText8; + wxTextCtrl* m_NewModule; + wxRadioBox* m_Selection; + wxButton* m_OKbutton; + wxButton* m_Quitbutton; + wxButton* m_Browsebutton; + wxTextCtrl* m_WinMessages; + + // Virtual event handlers, overide them in your derived class + virtual void OnSelectionClicked( wxCommandEvent& event ){ event.Skip(); } + virtual void OnOkClick( wxCommandEvent& event ){ event.Skip(); } + virtual void OnQuit( wxCommandEvent& event ){ event.Skip(); } + virtual void BrowseAndSelectFootprint( wxCommandEvent& event ){ event.Skip(); } + + + public: + DIALOG_EXCHANGE_MODULE_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Exchange Modules"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 416,469 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DIALOG_EXCHANGE_MODULE_BASE(); + +}; + +#endif //__dialog_exchange_modules_base__ diff --git a/pcbnew/editmod.cpp b/pcbnew/editmod.cpp index 9a1f4ac366..d7f110b2ae 100644 --- a/pcbnew/editmod.cpp +++ b/pcbnew/editmod.cpp @@ -15,14 +15,12 @@ #include "3d_struct.h" #include "3d_viewer.h" +#include "dialog_edit_module.h" + #include "protos.h" -/* Variables locales: */ bool GoToEditor = FALSE; -/* class WinEDA_ModulePropertiesFrame */ -#include "dialog_edit_module.cpp" - /*******************************************************************/ void WinEDA_BasePcbFrame::InstallModuleOptionsFrame( MODULE* Module, wxDC * DC ) /*******************************************************************/ diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp index 0cd53f6f32..47f7b3c3d4 100644 --- a/pcbnew/files.cpp +++ b/pcbnew/files.cpp @@ -265,8 +265,11 @@ int WinEDA_PcbFrame::LoadOnePcbFile( const wxString& FullFileName, bool Append ) /* Rebuild the new pad list (for drc and ratsnet control ...) */ GetBoard()->m_Status_Pcb = 0; + // Display the loaded board: DrawPanel->Refresh( true); - + wxSafeYield(); // Needed if we want to see the board now. + + // Compile rastnest and displays net info Compile_Ratsnest( NULL, true ); GetBoard()->DisplayInfo( this ); diff --git a/pcbnew/modules.cpp b/pcbnew/modules.cpp index 03635a1445..4946557fa6 100644 --- a/pcbnew/modules.cpp +++ b/pcbnew/modules.cpp @@ -642,7 +642,7 @@ int ChangeSideNumLayer( int oldlayer ) /*****************************************************************/ -void WinEDA_BasePcbFrame::Place_Module( MODULE* module, wxDC* DC ) +void WinEDA_BasePcbFrame::Place_Module( MODULE* module, wxDC* DC, bool aDoNotRecreateRatsnest ) /*****************************************************************/ /* Place a l'endroit pointe par la souris le module deja existant selectionne @@ -688,8 +688,8 @@ void WinEDA_BasePcbFrame::Place_Module( MODULE* module, wxDC* DC ) EraseDragListe(); } - /* affichage chevelu general si necessaire */ - Compile_Ratsnest( DC, true ); + if( !aDoNotRecreateRatsnest ) + Compile_Ratsnest( DC, true ); module->DisplayInfo( this ); diff --git a/pcbnew/ratsnest.cpp b/pcbnew/ratsnest.cpp index f68646a233..aaa5678117 100644 --- a/pcbnew/ratsnest.cpp +++ b/pcbnew/ratsnest.cpp @@ -13,6 +13,7 @@ #include "protos.h" +#define DBG_BUID_NETINFO /* local variables */ static std::vector s_localPadBuffer; // for local ratsnest calculations when moving a footprint: buffer of pads to consider @@ -107,7 +108,10 @@ void WinEDA_BasePcbFrame::Compile_Ratsnest( wxDC* DC, bool display_status_pcb ) GetBoard()->m_Status_Pcb = 0; /* we want a full ratnest computation, from the scratch */ - MsgPanel->EraseMsgBox(); + MsgPanel->EraseMsgBox(); +#ifdef DBG_BUID_NETINFO + wxSafeYield(); +#endif // Rebuild the full pads and net info list @@ -124,6 +128,9 @@ void WinEDA_BasePcbFrame::Compile_Ratsnest( wxDC* DC, bool display_status_pcb ) msg.Printf( wxT( " %d" ), m_Pcb->m_NetInfo->GetNetsCount() ); Affiche_1_Parametre( this, 8, wxT( "Nets" ), msg, CYAN ); } +#ifdef DBG_BUID_NETINFO + wxSafeYield(); +#endif /* Compute the full ratsnest * which can be see like all the possible links or logical connections. @@ -449,7 +456,7 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) DisplayError(this,wxT("Build_Board_Ratsnest() error: net not found") ); return; } - net->m_RatsnestStart = m_Pcb->GetRatsnestsCount(); + net->m_RatsnestStartIdx = m_Pcb->GetRatsnestsCount(); int num_block = 0; for( unsigned ii = 0; ii < net->m_ListPad.size(); ii++ ) @@ -473,14 +480,14 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) icnt = gen_rats_block_to_block( DrawPanel, m_Pcb->m_FullRatsnest, pstart, pend ); } - net->m_RatsnestEnd = m_Pcb->GetRatsnestsCount(); + net->m_RatsnestEndIdx = m_Pcb->GetRatsnestsCount(); /* sort by lenght */ - if( (net->m_RatsnestEnd - net->m_RatsnestStart) > 1 ) + if( (net->m_RatsnestEndIdx - net->m_RatsnestStartIdx) > 1 ) { RATSNEST_ITEM* rats = &m_Pcb->m_FullRatsnest[0]; - qsort( rats + net->m_RatsnestStart, - net->m_RatsnestEnd - net->m_RatsnestStart, + qsort( rats + net->m_RatsnestStartIdx, + net->m_RatsnestEndIdx - net->m_RatsnestStartIdx, sizeof(RATSNEST_ITEM), sort_by_length ); } } @@ -555,7 +562,7 @@ static int tst_rats_block_to_block( NETINFO_ITEM* net, vector& aR /* Search a link from a block to an other block */ min_rats = NULL; - for( unsigned ii = net->m_RatsnestStart; ii < net->m_RatsnestEnd; ii++ ) + for( unsigned ii = net->m_RatsnestStartIdx; ii < net->m_RatsnestEndIdx; ii++ ) { rats = &aRatsnestBuffer[ii]; if( rats->m_PadStart->GetSubRatsnest() == rats->m_PadEnd->GetSubRatsnest() ) // Same block @@ -691,14 +698,14 @@ void WinEDA_BasePcbFrame::Tst_Ratsnest( wxDC* DC, int ref_netcode ) num_block = MAX( num_block, subnet ); } - for( unsigned ii = net->m_RatsnestStart; ii < net->m_RatsnestEnd; ii++ ) + for( unsigned ii = net->m_RatsnestStartIdx; ii < net->m_RatsnestEndIdx; ii++ ) { m_Pcb->m_FullRatsnest[ii].m_Status &= ~CH_ACTIF; } /* a - tst connection between pads */ rats = &m_Pcb->m_FullRatsnest[0]; - int icnt = tst_rats_pad_to_pad( num_block, rats + net->m_RatsnestStart, rats + net->m_RatsnestEnd ); + int icnt = tst_rats_pad_to_pad( num_block, rats + net->m_RatsnestStartIdx, rats + net->m_RatsnestEndIdx ); /* b - test connexion between blocks (Iteration) */ while( icnt > 1 ) diff --git a/pcbnew/xchgmod.cpp b/pcbnew/xchgmod.cpp index 16fb8524e5..8e7ae3e17d 100644 --- a/pcbnew/xchgmod.cpp +++ b/pcbnew/xchgmod.cpp @@ -5,196 +5,136 @@ /* Fichier xchmod.cpp */ #include "fctsys.h" -#include "gr_basic.h" #include "common.h" +#include "class_drawpanel.h" #include "confirm.h" #include "kicad_string.h" -#include "gestfich.h" #include "pcbnew.h" -#include "autorout.h" -#include "protos.h" +#include "dialog_exchange_modules_base.h" -/* variables locales */ - -enum id_ExchangeModule { - ID_EXEC_EXCHANGE_MODULE = 1900, - ID_EXEC_EXCHANGE_ID_MODULES, - ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE, - ID_EXEC_EXCHANGE_ALL_MODULES, - ID_CLOSE_EXCHANGE_MODULE, - ID_BROWSE_LIB_MODULES -}; +// Local variables: +int s_SelectionMode = 0; // Remember the last exchange option, when exit dialog. /************************************/ -/* class WinEDA_ExchangeModuleFrame */ +/* class DIALOG_EXCHANGE_MODULE */ /************************************/ -class WinEDA_ExchangeModuleFrame : public wxDialog +class DIALOG_EXCHANGE_MODULE : public DIALOG_EXCHANGE_MODULE_BASE { private: WinEDA_BasePcbFrame* m_Parent; - wxDC* m_DC; MODULE* m_CurrentModule; - WinEDA_EnterText* m_OldModule; - WinEDA_EnterText* m_OldValue; - WinEDA_EnterText* m_NewModule; - wxTextCtrl* m_WinMsg; public: // Constructor and destructor - WinEDA_ExchangeModuleFrame( WinEDA_BasePcbFrame* parent, - MODULE* Module, wxDC* DC, const wxPoint& pos ); - ~WinEDA_ExchangeModuleFrame() - { - } - + DIALOG_EXCHANGE_MODULE( WinEDA_BasePcbFrame* aParent, MODULE* aModule ); + ~DIALOG_EXCHANGE_MODULE() { }; private: + void OnSelectionClicked( wxCommandEvent& event ); + void OnOkClick( wxCommandEvent& event ); void OnQuit( wxCommandEvent& event ); - void Change_Module( wxCommandEvent& event ); - void Change_ModuleId( wxCommandEvent& event ); - void Change_ModuleAll( wxCommandEvent& event ); + void BrowseAndSelectFootprint( wxCommandEvent& event ); + void Init(); + + void Change_Module(); + void Change_ModuleId( bool aUseValue ); + void Change_ModuleAll(); int Maj_ListeCmp( const wxString& reference, const wxString& old_name, const wxString& new_name, bool ShowError ); MODULE* Change_1_Module( MODULE* Module, const wxString& new_module, bool ShowError ); - void Sel_NewMod_By_Liste( wxCommandEvent& event ); - - - DECLARE_EVENT_TABLE() }; -BEGIN_EVENT_TABLE( WinEDA_ExchangeModuleFrame, wxDialog ) - EVT_BUTTON( ID_EXEC_EXCHANGE_MODULE, - WinEDA_ExchangeModuleFrame::Change_Module ) - EVT_BUTTON( ID_EXEC_EXCHANGE_ID_MODULES, - WinEDA_ExchangeModuleFrame::Change_ModuleId ) - EVT_BUTTON( ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE, - WinEDA_ExchangeModuleFrame::Change_ModuleId ) - EVT_BUTTON( ID_EXEC_EXCHANGE_ALL_MODULES, - WinEDA_ExchangeModuleFrame::Change_ModuleAll ) - EVT_BUTTON( ID_CLOSE_EXCHANGE_MODULE, - WinEDA_ExchangeModuleFrame::OnQuit ) - EVT_BUTTON( ID_BROWSE_LIB_MODULES, - WinEDA_ExchangeModuleFrame::Sel_NewMod_By_Liste ) -END_EVENT_TABLE() - -WinEDA_ExchangeModuleFrame::WinEDA_ExchangeModuleFrame( - WinEDA_BasePcbFrame* parent, - MODULE* Module, - wxDC* DC, - const wxPoint& - framepos ) : - wxDialog( parent, -1, _( "Exchange Modules" ), framepos, wxSize( 360, 460 ), - DIALOG_STYLE ) +DIALOG_EXCHANGE_MODULE::DIALOG_EXCHANGE_MODULE( WinEDA_BasePcbFrame* parent, MODULE* Module ) : + DIALOG_EXCHANGE_MODULE_BASE( parent ) { - wxButton* Button; - m_Parent = parent; - m_DC = DC; - Centre(); - m_CurrentModule = Module; - - wxBoxSizer* MainBoxSizer = new wxBoxSizer( wxVERTICAL ); - - SetSizer( MainBoxSizer ); - wxBoxSizer* UpperBoxSizer = new wxBoxSizer( wxHORIZONTAL ); - - MainBoxSizer->Add( UpperBoxSizer, 0, wxGROW | wxALL, 5 ); - wxBoxSizer* LeftBoxSizer = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* RightBoxSizer = new wxBoxSizer( wxVERTICAL ); - - UpperBoxSizer->Add( LeftBoxSizer, 0, wxGROW | wxALL, 5 ); - UpperBoxSizer->Add( RightBoxSizer, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5 ); - - /* Creation des boutons de commande */ - Button = new wxButton( this, ID_EXEC_EXCHANGE_MODULE, - _( "Change module" ) ); - - RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); - - Button = new wxButton( this, ID_EXEC_EXCHANGE_ID_MODULES, - _( "Change same modules" ) ); - - RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 ); - - Button = new wxButton( this, ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE, - _( "Ch. same module+value" ) ); - - RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 ); - - Button = new wxButton( this, ID_EXEC_EXCHANGE_ALL_MODULES, - _( "Change all" ) ); - - RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 ); - - Button = new wxButton( this, ID_BROWSE_LIB_MODULES, - _( "Browse Libs modules" ) ); - - RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT, 5 ); - - Button = new wxButton( this, ID_CLOSE_EXCHANGE_MODULE, - _( "Close" ) ); - - RightBoxSizer->Add( Button, 0, wxGROW | wxLEFT | wxRIGHT | wxBOTTOM, 5 ); - - m_OldModule = new WinEDA_EnterText( this, _( "Current Module" ), - m_CurrentModule ? - m_CurrentModule->m_LibRef.GetData() : - wxEmptyString, - LeftBoxSizer, wxSize( 150, -1 ) ); - - m_OldModule->Enable( FALSE ); - - m_OldValue = new WinEDA_EnterText( this, _( "Current Value" ), - m_CurrentModule ? - m_CurrentModule->m_Value->m_Text.GetData() : - wxEmptyString, - LeftBoxSizer, wxSize( 150, -1 ) ); - - m_OldValue->Enable( FALSE ); - - m_NewModule = new WinEDA_EnterText( this, _( "New Module" ), - m_OldModule->GetValue(), - LeftBoxSizer, wxSize( 150, -1 ) ); - - m_WinMsg = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, - wxSize( 340, 230 ), - wxTE_READONLY | wxTE_MULTILINE ); - - MainBoxSizer->Add( m_WinMsg, 0, wxGROW | wxALL, 5 ); - + Init(); GetSizer()->Fit( this ); GetSizer()->SetSizeHints( this ); } -void WinEDA_BasePcbFrame::InstallExchangeModuleFrame( MODULE* Module, - wxDC* DC, - const wxPoint& pos ) +void WinEDA_BasePcbFrame::InstallExchangeModuleFrame( MODULE* Module ) { - WinEDA_ExchangeModuleFrame* frame = - new WinEDA_ExchangeModuleFrame( this, Module, DC, pos ); + DIALOG_EXCHANGE_MODULE dialog( this, Module ); - frame->ShowModal(); - frame->Destroy(); + dialog.ShowModal(); } -void WinEDA_ExchangeModuleFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) ) +void DIALOG_EXCHANGE_MODULE::OnQuit( wxCommandEvent& WXUNUSED(event) ) { + s_SelectionMode = m_Selection->GetSelection(); Close( true ); // true is to force the frame to close } +void DIALOG_EXCHANGE_MODULE::Init() +{ + SetFocus(); + + m_OldModule->AppendText( m_CurrentModule->m_LibRef ); + m_NewModule->AppendText( m_CurrentModule->m_LibRef ); + m_OldValue->AppendText( m_CurrentModule->m_Value->m_Text ); + m_Selection->SetSelection( s_SelectionMode ); + + // Enable/disable widgets: + wxCommandEvent event; + OnSelectionClicked( event ); +} + + +void DIALOG_EXCHANGE_MODULE::OnOkClick( wxCommandEvent& event ) +{ + s_SelectionMode = m_Selection->GetSelection(); + switch( m_Selection->GetSelection() ) + { + case 0: + Change_Module(); + break; + + case 1: + Change_ModuleId( false ); + break; + + case 2: + Change_ModuleId( true ); + break; + + case 3: + Change_ModuleAll(); + break; + } +} + + +void DIALOG_EXCHANGE_MODULE::OnSelectionClicked( wxCommandEvent& event ) +{ + switch( m_Selection->GetSelection() ) + { + case 0: + case 1: + case 2: + m_NewModule->Enable( true ); + break; + + case 3: + m_NewModule->Enable( false ); + break; + } +} + + /************************************************************************/ + /* * Met a jour le fichier name.CMP (s'il existe) apres un echange de module * (par la commande changeMod), si les modules sont geres par ce fichier @@ -203,10 +143,10 @@ void WinEDA_ExchangeModuleFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) ) * trouve. * Retoure 1 si erreur */ -int WinEDA_ExchangeModuleFrame::Maj_ListeCmp( const wxString& reference, - const wxString& old_name, - const wxString& new_name, - bool ShowError ) +int DIALOG_EXCHANGE_MODULE::Maj_ListeCmp( const wxString& reference, + const wxString& old_name, + const wxString& new_name, + bool ShowError ) { wxFileName fn; wxFileName tmpFileName; @@ -228,7 +168,7 @@ int WinEDA_ExchangeModuleFrame::Maj_ListeCmp( const wxString& reference, if( ShowError ) { msg.Printf( _( "file %s not found" ), fn.GetFullPath().c_str() ); - m_WinMsg->WriteText( msg ); + m_WinMessages->AppendText( msg ); } return 1; } @@ -242,15 +182,15 @@ int WinEDA_ExchangeModuleFrame::Maj_ListeCmp( const wxString& reference, if( ShowError ) { msg.Printf( _( "Unable to create file %s" ), - tmpFileName.GetFullPath().c_str() ); - m_WinMsg->WriteText( msg ); + tmpFileName.GetFullPath().c_str() ); + m_WinMessages->AppendText( msg ); } return 1; } fgets( Line, sizeof(Line), FichCmp ); fprintf( NewFile, "Cmp-Mod V01 Genere par PcbNew le %s\n", - DateAndTime( Line ) ); + DateAndTime( Line ) ); bool start_descr = FALSE; while( fgets( Line, sizeof(Line), FichCmp ) != NULL ) @@ -267,7 +207,7 @@ int WinEDA_ExchangeModuleFrame::Maj_ListeCmp( const wxString& reference, } if( (strnicmp( Line, "Begin", 5 ) == 0) - || (strnicmp( Line, "End", 3 ) == 0) ) + || (strnicmp( Line, "End", 3 ) == 0) ) { start_descr = FALSE; } @@ -277,7 +217,7 @@ int WinEDA_ExchangeModuleFrame::Maj_ListeCmp( const wxString& reference, sprintf( Line + 8, " = %s;\n", CONV_TO_UTF8( new_name ) ); msg = wxT( " * in <" ) + fn.GetFullPath() + wxT( ">.\n" ); - m_WinMsg->WriteText( msg ); + m_WinMessages->AppendText( msg ); start_descr = FALSE; } @@ -300,7 +240,7 @@ int WinEDA_ExchangeModuleFrame::Maj_ListeCmp( const wxString& reference, * - memes textes valeur et ref * - memes netnames pour pads de meme nom */ -void WinEDA_ExchangeModuleFrame::Change_Module( wxCommandEvent& event ) +void DIALOG_EXCHANGE_MODULE::Change_Module() { wxString newmodulename = m_NewModule->GetValue(); @@ -309,7 +249,8 @@ void WinEDA_ExchangeModuleFrame::Change_Module( wxCommandEvent& event ) if( Change_1_Module( m_CurrentModule, newmodulename, TRUE ) ) { - m_Parent->Compile_Ratsnest( m_DC, true ); + m_Parent->Compile_Ratsnest( NULL, true ); + m_Parent->DrawPanel->Refresh(); } } @@ -325,7 +266,7 @@ void WinEDA_ExchangeModuleFrame::Change_Module( wxCommandEvent& event ) * Attention: m_CurrentModule ne pointe plus sur le module de reference * puisque celui ci a ete change!! */ -void WinEDA_ExchangeModuleFrame::Change_ModuleId( wxCommandEvent& event ) +void DIALOG_EXCHANGE_MODULE::Change_ModuleId( bool aUseValue ) { wxString msg; MODULE* Module, * PtBack; @@ -341,19 +282,19 @@ void WinEDA_ExchangeModuleFrame::Change_ModuleId( wxCommandEvent& event ) return; lib_reference = m_CurrentModule->m_LibRef; - if( event.GetId() == ID_EXEC_EXCHANGE_ID_MODULE_AND_VALUE ) + if( aUseValue ) { check_module_value = TRUE; value = m_CurrentModule->m_Value->m_Text; msg.Printf( _( "Change modules <%s> -> <%s> (val = %s)?" ), - m_CurrentModule->m_LibRef.GetData(), - newmodulename.GetData(), - m_CurrentModule->m_Value->m_Text.GetData() ); + m_CurrentModule->m_LibRef.GetData(), + newmodulename.GetData(), + m_CurrentModule->m_Value->m_Text.GetData() ); } else { msg.Printf( _( "Change modules <%s> -> <%s> ?" ), - lib_reference.GetData(), newmodulename.GetData() ); + lib_reference.GetData(), newmodulename.GetData() ); } if( !IsOK( this, msg ) ) @@ -363,17 +304,10 @@ void WinEDA_ExchangeModuleFrame::Change_ModuleId( wxCommandEvent& event ) * Change_1_Module() modifie le dernier module de la liste */ - Module = m_Parent->GetBoard()->m_Modules; - for( ; Module != NULL; Module = Module->Next() ) - { - if( Module->Next() == NULL ) - break; - } - - /* Ici Module pointe le dernier module de la liste */ - for( ; - Module && ( (BOARD*) Module != m_Parent->GetBoard() ); - Module = PtBack ) + /* note: for the first module in chain (the last here), Module->Back() points the board or is NULL + */ + Module = m_Parent->GetBoard()->m_Modules.GetLast(); + for( ; Module && ( Module->Type() == TYPE_MODULE ); Module = PtBack ) { MODULE* module; PtBack = Module->Back(); @@ -393,7 +327,8 @@ void WinEDA_ExchangeModuleFrame::Change_ModuleId( wxCommandEvent& event ) if( change ) { - m_Parent->Compile_Ratsnest( m_DC, true ); + m_Parent->Compile_Ratsnest( NULL, true ); + m_Parent->DrawPanel->Refresh(); } } @@ -406,7 +341,7 @@ void WinEDA_ExchangeModuleFrame::Change_ModuleId( wxCommandEvent& event ) * - memes textes valeur et ref * - memes netnames pour pads de meme nom */ -void WinEDA_ExchangeModuleFrame::Change_ModuleAll( wxCommandEvent& event ) +void DIALOG_EXCHANGE_MODULE::Change_ModuleAll() { MODULE* Module, * PtBack; bool change = FALSE; @@ -422,17 +357,10 @@ void WinEDA_ExchangeModuleFrame::Change_ModuleAll( wxCommandEvent& event ) * Change_1_Module() modifie le dernier module de la liste */ - Module = m_Parent->GetBoard()->m_Modules; - for( ; Module != NULL; Module = Module->Next() ) - { - if( Module->Next() == NULL ) - break; - } - - /* Ici Module pointe le dernier module de la liste */ - for( ; - Module && ( (BOARD*) Module != m_Parent->GetBoard() ); - Module = PtBack ) + /* note: for the first module in chain (the last here), Module->Back() points the board or is NULL + */ + Module = m_Parent->GetBoard()->m_Modules.GetLast(); + for( ; Module && ( Module->Type() == TYPE_MODULE ); Module = PtBack ) { PtBack = Module->Back(); if( Change_1_Module( Module, Module->m_LibRef.GetData(), ShowErr ) ) @@ -443,7 +371,8 @@ void WinEDA_ExchangeModuleFrame::Change_ModuleAll( wxCommandEvent& event ) if( change ) { - m_Parent->Compile_Ratsnest( m_DC, true ); + m_Parent->Compile_Ratsnest( NULL, true ); + m_Parent->DrawPanel->Refresh(); } } @@ -458,10 +387,11 @@ void WinEDA_ExchangeModuleFrame::Change_ModuleAll( wxCommandEvent& event ) * Retourne : * 0 si pas de changement ( si le nouveau module n'est pas en libr) * 1 si OK + * Ratsnest *must be recalculated* after modules changes */ -MODULE* WinEDA_ExchangeModuleFrame::Change_1_Module( MODULE* Module, - const wxString& new_module, - bool ShowError ) +MODULE* DIALOG_EXCHANGE_MODULE::Change_1_Module( MODULE* Module, + const wxString& new_module, + bool ShowError ) { wxString namecmp, oldnamecmp; MODULE* NewModule; @@ -479,7 +409,7 @@ MODULE* WinEDA_ExchangeModuleFrame::Change_1_Module( MODULE* Module, /* Chargement du module */ Line.Printf( _( "Change module %s (%s) " ), Module->m_Reference->m_Text.GetData(), oldnamecmp.GetData() ); - m_WinMsg->WriteText( Line ); + m_WinMessages->AppendText( Line ); namecmp.Trim( TRUE ); namecmp.Trim( FALSE ); @@ -488,24 +418,16 @@ MODULE* WinEDA_ExchangeModuleFrame::Change_1_Module( MODULE* Module, ShowError ); if( NewModule == NULL ) /* Nouveau module NON trouve, reaffichage de l'ancien */ { - m_WinMsg->WriteText( wxT( "No\n" ) ); + m_WinMessages->AppendText( wxT( "No\n" ) ); return NULL; } if( Module == m_CurrentModule ) m_CurrentModule = NewModule; - m_WinMsg->WriteText( wxT( "Ok\n" ) ); - - /* Effacement a l'ecran de l'ancien module */ - if ( m_DC ) - Module->Draw( m_Parent->DrawPanel, m_DC, GR_XOR ); + m_WinMessages->AppendText( wxT( "Ok\n" ) ); m_Parent->Exchange_Module( this, Module, NewModule ); - /* Affichage du nouveau module */ - if ( m_DC ) - NewModule->Draw( m_Parent->DrawPanel, m_DC, GR_OR ); - Maj_ListeCmp( NewModule->m_Reference->m_Text, oldnamecmp, namecmp, @@ -527,12 +449,11 @@ MODULE* WinEDA_BasePcbFrame::Exchange_Module( wxWindow* winaff, wxPoint oldpos; /* memorisation temporaire pos curseur */ D_PAD* pad, * old_pad; - if( (OldModule->Type() != TYPE_MODULE) || (NewModule->Type() != TYPE_MODULE) ) { DisplayError( winaff, - wxT( "WinEDA_BasePcbFrame::Exchange_Module() StuctType error" ) ); + wxT( "WinEDA_BasePcbFrame::Exchange_Module() StuctType error" ) ); } NewModule->SetParent( GetBoard() ); @@ -540,7 +461,11 @@ MODULE* WinEDA_BasePcbFrame::Exchange_Module( wxWindow* winaff, GetBoard()->m_Status_Pcb = 0; oldpos = GetScreen()->m_Curseur; GetScreen()->m_Curseur = OldModule->m_Pos; - Place_Module( NewModule, NULL ); + + /* place module without ratsnets refresh: this will be made later + * when all modules are on board + */ + Place_Module( NewModule, NULL, true ); GetScreen()->m_Curseur = oldpos; /* Changement eventuel de couche */ @@ -573,7 +498,7 @@ MODULE* WinEDA_BasePcbFrame::Exchange_Module( wxWindow* winaff, for( ; old_pad != NULL; old_pad = old_pad->Next() ) { if( strnicmp( pad->m_Padname, old_pad->m_Padname, - sizeof(pad->m_Padname) ) == 0 ) + sizeof(pad->m_Padname) ) == 0 ) { pad->SetNetname( old_pad->GetNetname() ); pad->SetNet( old_pad->GetNet() ); @@ -595,7 +520,7 @@ MODULE* WinEDA_BasePcbFrame::Exchange_Module( wxWindow* winaff, /* * affiche la liste des modules en librairie et selectione 1 nom */ -void WinEDA_ExchangeModuleFrame::Sel_NewMod_By_Liste( wxCommandEvent& event ) +void DIALOG_EXCHANGE_MODULE::BrowseAndSelectFootprint( wxCommandEvent& event ) { wxString newname; @@ -654,7 +579,7 @@ void WinEDA_PcbFrame::RecreateCmpFileFromBoard( wxCommandEvent& aEvent ) fgets( Line, sizeof(Line), FichCmp ); fprintf( FichCmp, "Cmp-Mod V01 Genere par PcbNew le %s\n", - DateAndTime( Line ) ); + DateAndTime( Line ) ); for( ; Module != NULL; Module = Module->Next() ) { @@ -668,7 +593,7 @@ void WinEDA_PcbFrame::RecreateCmpFileFromBoard( wxCommandEvent& aEvent ) !Module->m_Value->m_Text.IsEmpty() ? CONV_TO_UTF8( Module->m_Value->m_Text ) : "[NoVal]" ); fprintf( FichCmp, "IdModule = %s;\n", - CONV_TO_UTF8( Module->m_LibRef ) ); + CONV_TO_UTF8( Module->m_LibRef ) ); fprintf( FichCmp, "EndCmp\n" ); }