From ca5fd179d54b79a8714dbc808e1bc6bf94f89638 Mon Sep 17 00:00:00 2001 From: CHARRAS Date: Sat, 13 Oct 2007 12:17:17 +0000 Subject: [PATCH] ratsnest.cpp translated, onrightclick() bug solved. --- change_log.txt | 9 + internat/fr/kicad.mo | Bin 132311 -> 133144 bytes internat/fr/kicad.po | 1944 +++++++++++++++++------------------ pcbnew/class_board_item.cpp | 14 +- pcbnew/class_pad.cpp | 2 +- pcbnew/onrightclick.cpp | 41 +- pcbnew/pcbpiste.cpp.notused | 305 ------ pcbnew/ratsnest.cpp | 775 ++++++++------ pcbnew/struct.cpp.notused | 58 -- 9 files changed, 1432 insertions(+), 1716 deletions(-) delete mode 100644 pcbnew/pcbpiste.cpp.notused delete mode 100644 pcbnew/struct.cpp.notused diff --git a/change_log.txt b/change_log.txt index 69df022440..c624d81df7 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,6 +4,15 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2007-Oct-13 UPDATE Dick Hollenbeck +================================================================================ ++ pcbnew: + ratsnest.cpp translated into english. + Many infos on the LEE algorithm used here added. + todo (by myself): connect.cpp translation. + onrightclick() bug (created by last change) solved: one could reselect an item, + while moving a previously selected item (pcbnew crashes). + 2007-Oct-13 UPDATE Geoff Harland ================================================================================ diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index 1612fa063dc7e6c288178434e0dcd141c1a7d3bb..6c3d64e8aec74ec0eb5843c028775330683bee34 100644 GIT binary patch delta 48969 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 K51mslC;k`j4IKXf delta 48426 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 Bh-?4= diff --git a/internat/fr/kicad.po b/internat/fr/kicad.po index 7a493bf7f7..de526e45b7 100644 --- a/internat/fr/kicad.po +++ b/internat/fr/kicad.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: kicad\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2007-10-08 07:56+0100\n" +"PO-Revision-Date: 2007-10-12 09:04+0100\n" "Last-Translator: jp charras \n" "Language-Team: kicad team \n" "MIME-Version: 1.0\n" @@ -111,7 +111,6 @@ msgstr "Ajouter Pastilles" #: pcbnew/modedit.cpp:316 #: pcbnew/menubarpcb.cpp:209 #: pcbnew/tool_modedit.cpp:133 -#: pcbnew/globaleditpad.cpp:96 #: pcbnew/menubarmodedit.cpp:45 msgid "Pad Settings" msgstr "Caract pads" @@ -127,7 +126,7 @@ msgid "Place anchor" msgstr "Place Ancre" #: pcbnew/modedit.cpp:344 -#: pcbnew/edit.cpp:457 +#: pcbnew/edit.cpp:459 #: eeschema/schedit.cpp:454 #: eeschema/libframe.cpp:578 msgid "Delete item" @@ -470,13 +469,11 @@ msgstr "Outils de per #: pcbnew/gendrill.cpp:171 #: pcbnew/dialog_general_options.cpp:271 -#: eeschema/options.cpp:185 #: gerbview/options.cpp:184 msgid "millimeters" msgstr "millimetres" #: pcbnew/gendrill.cpp:171 -#: eeschema/options.cpp:185 #: eeschema/dialog_options.cpp:246 msgid "inches" msgstr "Pouces" @@ -637,9 +634,9 @@ msgstr "Outils" #: pcbnew/gendrill.cpp:411 #: pcbnew/gendrill.cpp:1098 #: pcbnew/gendrill.cpp:1674 -#: pcbnew/class_pad.cpp:930 -#: pcbnew/class_track.cpp:771 -#: pcbnew/class_track.cpp:776 +#: pcbnew/class_pad.cpp:974 +#: pcbnew/class_track.cpp:791 +#: pcbnew/class_track.cpp:796 msgid "Drill" msgstr "Perçage" @@ -700,102 +697,58 @@ msgstr "Valeur incorrecte pour diametre de per msgid "Incorrect value for pad offset" msgstr "Valeur incorrecte pour offset du pad" -#: pcbnew/pcbpiste.cpp:62 -#: pcbnew/swap_layers.cpp:59 -msgid "Swap Layers:" -msgstr "Permutte couches" +#: pcbnew/edit.cpp:169 +#: pcbnew/editmod.cpp:45 +msgid "Module Editor" +msgstr "Ouvrir Editeur de modules" -#: pcbnew/pcbpiste.cpp:77 -#: pcbnew/pcbpiste.cpp:135 -#: pcbnew/swap_layers.cpp:75 -#: pcbnew/swap_layers.cpp:129 -#: pcbnew/swap_layers.cpp:162 -msgid "No Change" -msgstr "Garder" +#: pcbnew/edit.cpp:249 +msgid "Add Tracks" +msgstr "Addition de pistes" -#: pcbnew/pcbpiste.cpp:81 -#: pcbnew/swap_layers.cpp:80 -#: gerbview/select_layers_to_pcb.cpp:134 -msgid "Layers" -msgstr "Couches" +#: pcbnew/edit.cpp:258 +msgid "Add Zones" +msgstr "Addition de Zones" -#: pcbnew/pcbpiste.cpp:89 -#: pcbnew/cotation.cpp:109 -#: pcbnew/muonde.cpp:352 -#: pcbnew/mirepcb.cpp:107 -#: pcbnew/block.cpp:153 -#: pcbnew/pcbtexte.cpp:116 -#: pcbnew/sel_layer.cpp:162 -#: pcbnew/sel_layer.cpp:313 -#: pcbnew/modedit_onclick.cpp:202 -#: pcbnew/modedit_onclick.cpp:234 -#: pcbnew/swap_layers.cpp:103 -#: pcbnew/dialog_edit_module.cpp:121 -#: pcbnew/globaleditpad.cpp:111 -#: pcbnew/onrightclick.cpp:143 -#: pcbnew/onrightclick.cpp:157 -#: eeschema/options.cpp:114 -#: eeschema/sheetlab.cpp:97 -#: eeschema/libedit_onrightclick.cpp:68 -#: eeschema/libedit_onrightclick.cpp:83 -#: eeschema/onrightclick.cpp:121 -#: eeschema/onrightclick.cpp:133 -#: cvpcb/dialog_display_options.cpp:194 -#: gerbview/set_color.cpp:251 -#: gerbview/options.cpp:167 -#: gerbview/options.cpp:296 -#: gerbview/reglage.cpp:120 -#: gerbview/onrightclick.cpp:40 -#: gerbview/onrightclick.cpp:59 -#: gerbview/select_layers_to_pcb.cpp:171 -#: common/selcolor.cpp:147 -#: common/displlst.cpp:103 -#: common/get_component_dialog.cpp:121 -msgid "Cancel" -msgstr "Annuler" +#: pcbnew/edit.cpp:260 +msgid "Warning: Display Zone is OFF!!!" +msgstr "Attention: Affichage zones désactivé !!!" -#: pcbnew/pcbpiste.cpp:96 -#: pcbnew/cotation.cpp:105 -#: pcbnew/muonde.cpp:348 -#: pcbnew/block.cpp:156 -#: pcbnew/pcbtexte.cpp:111 -#: pcbnew/sel_layer.cpp:158 -#: pcbnew/sel_layer.cpp:309 -#: pcbnew/swap_layers.cpp:98 -#: pcbnew/dialog_edit_module.cpp:117 -#: eeschema/options.cpp:110 -#: eeschema/sheetlab.cpp:93 -#: cvpcb/dialog_display_options.cpp:189 -#: gerbview/set_color.cpp:247 -#: gerbview/options.cpp:163 -#: gerbview/options.cpp:292 -#: gerbview/reglage.cpp:116 -#: gerbview/select_layers_to_pcb.cpp:167 -#: common/displlst.cpp:99 -#: common/get_component_dialog.cpp:112 -msgid "OK" -msgstr "OK" +#: pcbnew/edit.cpp:267 +msgid "Add Layer Alignment Target" +msgstr "Ajouter Mire de superposition" -#: pcbnew/pcbpiste.cpp:103 -#: pcbnew/swap_layers.cpp:93 -#: gerbview/select_layers_to_pcb.cpp:156 -msgid "Deselect" -msgstr "Deselection" +#: pcbnew/edit.cpp:271 +msgid "Adjust Zero" +msgstr "Ajuster Zéro" -#: pcbnew/pcbpiste.cpp:110 -#: pcbnew/dialog_netlist.cpp:162 -msgid "Select" -msgstr "Sélection" +#: pcbnew/edit.cpp:277 +msgid "Add Graphic" +msgstr "Addition éléments graphiques" -#: pcbnew/pcbpiste.cpp:259 -#: pcbnew/surbrill.cpp:35 -msgid "Filter for net names:" -msgstr "Filtre pour nets:" +#: pcbnew/edit.cpp:281 +#: pcbnew/tool_modedit.cpp:180 +#: eeschema/schedit.cpp:314 +#: eeschema/libframe.cpp:502 +#: gerbview/tool_gerber.cpp:383 +msgid "Add Text" +msgstr "Ajout de Texte" -#: pcbnew/pcbpiste.cpp:263 -#: pcbnew/surbrill.cpp:39 -msgid "List Nets" -msgstr "Liste équipots" +#: pcbnew/edit.cpp:285 +msgid "Add Modules" +msgstr "Addition de Modules" + +#: pcbnew/edit.cpp:289 +msgid "Add Cotation" +msgstr "Addition de Cotations" + +#: pcbnew/edit.cpp:297 +msgid "Net Highlight" +msgstr "Surbrillance des équipotentielles" + +#: pcbnew/edit.cpp:301 +msgid "Local Ratsnest" +msgstr "Monter le chevelu général" #: pcbnew/plotps.cpp:361 #: pcbnew/affiche.cpp:63 @@ -807,313 +760,6 @@ msgstr "Vias" msgid "Tracks" msgstr "Pistes" -#: pcbnew/tool_pcb.cpp:51 -msgid "" -"Show active layer selections\n" -"and select layer pair for route and place via" -msgstr "" -"Affiche selections couche active\n" -"et selection paire de couches pour routage and placement via" - -#: pcbnew/tool_pcb.cpp:239 -msgid "New Board" -msgstr "Nouveau Circuit Imprimé" - -#: pcbnew/tool_pcb.cpp:241 -msgid "Open existing Board" -msgstr "Ouvrir C.I. existant" - -#: pcbnew/tool_pcb.cpp:242 -msgid "Save Board" -msgstr "Sauver Circuit Imprimé" - -#: pcbnew/tool_pcb.cpp:246 -#: eeschema/tool_sch.cpp:65 -#: gerbview/tool_gerber.cpp:233 -msgid "page settings (size, texts)" -msgstr "Ajustage de la feuille de dessin (dimensions, textes)" - -#: pcbnew/tool_pcb.cpp:250 -msgid "Open Module Editor" -msgstr "Ouvrir Editeur de modules" - -#: pcbnew/tool_pcb.cpp:253 -#: eeschema/tool_sch.cpp:81 -#: gerbview/tool_gerber.cpp:244 -msgid "Cut selected item" -msgstr "Suppression des éléments sélectionnés" - -#: pcbnew/tool_pcb.cpp:257 -#: eeschema/tool_sch.cpp:84 -#: gerbview/tool_gerber.cpp:249 -msgid "Copy selected item" -msgstr "Copie des éléments sélectionnés" - -#: pcbnew/tool_pcb.cpp:259 -#: eeschema/tool_sch.cpp:87 -#: gerbview/tool_gerber.cpp:255 -msgid "Paste" -msgstr "Copie des éléments sauvegardés" - -#: pcbnew/tool_pcb.cpp:262 -#: gerbview/tool_gerber.cpp:262 -msgid "Undelete" -msgstr "Annulation du dernier effacement" - -#: pcbnew/tool_pcb.cpp:265 -msgid "Print Board" -msgstr "Imprimer C.I." - -#: pcbnew/tool_pcb.cpp:267 -msgid "Plot (HPGL, PostScript, or GERBER format)" -msgstr "Tracer en format HPGL, POSTSCRIPT ou GERBER" - -#: pcbnew/tool_pcb.cpp:270 -#: pcbnew/tool_modedit.cpp:115 -#: eeschema/tool_lib.cpp:170 -#: eeschema/tool_sch.cpp:108 -#: gerbview/tool_gerber.cpp:272 -msgid "zoom +" -msgstr "zoom +" - -#: pcbnew/tool_pcb.cpp:274 -#: pcbnew/tool_modedit.cpp:119 -#: eeschema/tool_lib.cpp:174 -#: eeschema/tool_sch.cpp:112 -#: gerbview/tool_gerber.cpp:279 -msgid "zoom -" -msgstr "zoom -" - -#: pcbnew/tool_pcb.cpp:278 -#: pcbnew/tool_modedit.cpp:123 -#: eeschema/tool_lib.cpp:178 -#: eeschema/tool_sch.cpp:116 -#: gerbview/tool_gerber.cpp:286 -msgid "redraw" -msgstr "Redessin" - -#: pcbnew/tool_pcb.cpp:283 -#: pcbnew/tool_modedit.cpp:128 -#: eeschema/tool_lib.cpp:184 -#: eeschema/tool_sch.cpp:121 -#: gerbview/tool_gerber.cpp:297 -#: 3d-viewer/3d_toolbar.cpp:53 -msgid "auto zoom" -msgstr "Zoom automatique" - -#: pcbnew/tool_pcb.cpp:286 -#: eeschema/tool_sch.cpp:125 -msgid "Find components and texts" -msgstr "Recherche de composants et textes" - -#: pcbnew/tool_pcb.cpp:292 -msgid "Read Netlist" -msgstr "Lire Netliste" - -#: pcbnew/tool_pcb.cpp:294 -msgid "Pcb Design Rules Check" -msgstr "Controle des règles de conception" - -#: pcbnew/tool_pcb.cpp:305 -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:308 -msgid "Mode Track and Autorouting" -msgstr "Mode Pistes and Autoroutage" - -#: pcbnew/tool_pcb.cpp:332 -msgid "Drc OFF" -msgstr "Drc DESACTIVEE" - -#: pcbnew/tool_pcb.cpp:334 -#: pcbnew/tool_modedit.cpp:212 -#: eeschema/tool_sch.cpp:257 -#: gerbview/tool_gerber.cpp:412 -msgid "Display Grid OFF" -msgstr "Suppression de l'affichage de la grille" - -#: pcbnew/tool_pcb.cpp:337 -#: pcbnew/tool_modedit.cpp:216 -#: gerbview/tool_gerber.cpp:418 -msgid "Display Polar Coord ON" -msgstr "Activer affichage coord Polaires" - -#: pcbnew/tool_pcb.cpp:339 -#: pcbnew/tool_modedit.cpp:220 -#: eeschema/tool_sch.cpp:261 -#: gerbview/tool_gerber.cpp:422 -msgid "Units = Inch" -msgstr "Unités = pouce" - -#: pcbnew/tool_pcb.cpp:341 -#: pcbnew/tool_modedit.cpp:224 -#: eeschema/tool_sch.cpp:265 -#: gerbview/tool_gerber.cpp:426 -msgid "Units = mm" -msgstr "Unités = mm" - -#: pcbnew/tool_pcb.cpp:344 -#: pcbnew/tool_modedit.cpp:230 -#: eeschema/tool_sch.cpp:269 -#: gerbview/tool_gerber.cpp:432 -msgid "Change Cursor Shape" -msgstr "Sélection de la forme du curseur" - -#: pcbnew/tool_pcb.cpp:349 -msgid "Show General Ratsnest" -msgstr "Monter le chevelu général" - -#: pcbnew/tool_pcb.cpp:352 -msgid "Show Module Ratsnest when moving" -msgstr "Monter le chevelu du module pendant déplacement" - -#: pcbnew/tool_pcb.cpp:357 -msgid "Enable Auto Del Track" -msgstr "Autoriser l'effacement automatique des pistes" - -#: pcbnew/tool_pcb.cpp:361 -#: pcbnew/pcbframe.cpp:411 -#: pcbnew/set_color.cpp:389 -msgid "Show Zones" -msgstr "Monter Zones" - -#: pcbnew/tool_pcb.cpp:366 -#: pcbnew/tool_modedit.cpp:238 -msgid "Show Pads Sketch" -msgstr "Afficher pastilles en contour" - -#: pcbnew/tool_pcb.cpp:370 -msgid "Show Tracks Sketch" -msgstr "Afficher pistes en contour" - -#: pcbnew/tool_pcb.cpp:374 -#: pcbnew/pcbframe.cpp:432 -msgid "Hight Contrast Mode Display" -msgstr "Mode d'affichage Haut Contraste" - -#: pcbnew/tool_pcb.cpp:383 -msgid "" -"Display auxiliary vertical toolbar (tools for micro wave applications)\n" -" This is a very experimental feature (under development)" -msgstr "" -"Affiche toolbar vertical auxiliaire (outils pour applications micro-ondes)\n" -"C'est un outil expérimental (en cours de développement)" - -#: pcbnew/tool_pcb.cpp:412 -msgid "Net highlight" -msgstr "Surbrillance des équipotentielles" - -#: pcbnew/tool_pcb.cpp:416 -msgid "Display local ratsnest (pad or module)" -msgstr "Afficher le chevelu local (pastilles ou modules)" - -#: pcbnew/tool_pcb.cpp:421 -msgid "Add modules" -msgstr "Addition de Modules" - -#: pcbnew/tool_pcb.cpp:425 -msgid "Add Tracks an vias" -msgstr "Ajouter pistes et vias" - -#: pcbnew/tool_pcb.cpp:429 -#: pcbnew/edit.cpp:256 -msgid "Add Zones" -msgstr "Addition de Zones" - -#: pcbnew/tool_pcb.cpp:434 -#: pcbnew/tool_modedit.cpp:168 -#: eeschema/tool_sch.cpp:226 -msgid "Add graphic line or polygon" -msgstr "Addition de lignes ou polygones graphiques" - -#: pcbnew/tool_pcb.cpp:438 -#: pcbnew/tool_modedit.cpp:172 -msgid "Add graphic circle" -msgstr "Addition de graphiques (Cercle)" - -#: pcbnew/tool_pcb.cpp:442 -#: pcbnew/tool_modedit.cpp:176 -msgid "Add graphic arc" -msgstr "Addition de graphiques (Arc de Cercle)" - -#: pcbnew/tool_pcb.cpp:446 -#: pcbnew/edit.cpp:279 -#: pcbnew/tool_modedit.cpp:180 -#: eeschema/schedit.cpp:314 -#: eeschema/libframe.cpp:502 -#: gerbview/tool_gerber.cpp:383 -msgid "Add Text" -msgstr "Ajout de Texte" - -#: pcbnew/tool_pcb.cpp:451 -#: pcbnew/edit.cpp:287 -msgid "Add Cotation" -msgstr "Addition de Cotations" - -#: pcbnew/tool_pcb.cpp:455 -#: gerbview/tool_gerber.cpp:376 -msgid "Add Mires" -msgstr "Addition de Mires de superposition" - -#: pcbnew/tool_pcb.cpp:460 -#: pcbnew/tool_modedit.cpp:190 -#: eeschema/tool_lib.cpp:93 -#: eeschema/tool_sch.cpp:235 -#: gerbview/tool_gerber.cpp:391 -msgid "Delete items" -msgstr "Suppression d'éléments" - -#: pcbnew/tool_pcb.cpp:465 -msgid "Offset adjust for drill and place files" -msgstr "Ajuste offset pour fichier de perçage et placement" - -#: pcbnew/tool_pcb.cpp:490 -msgid "Create line of specified length for microwave applications" -msgstr "Creation de lignes de longueur spécifiée (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:496 -msgid "Create gap of specified length for microwave applications" -msgstr "Creation de gaps de longueur spécifiée (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:504 -msgid "Create stub of specified length for microwave applications" -msgstr "Creation de stub de longueur spécifiée (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:510 -msgid "Create stub (arc) of specified length for microwave applications" -msgstr "Creation de stub (arc) de longueur spécifiée (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:517 -msgid "Create a polynomial shape for microwave applications" -msgstr "Creation de formes polynomiales (pour applications micro-ondes)" - -#: pcbnew/tool_pcb.cpp:567 -#: pcbnew/tool_modedit.cpp:285 -#: eeschema/plotps.cpp:169 -#: share/zoom.cpp:368 -msgid "Auto" -msgstr "Auto" - -#: pcbnew/tool_pcb.cpp:571 -msgid "Zoom " -msgstr "Zoom " - -#: pcbnew/tool_pcb.cpp:585 -#: pcbnew/set_color.cpp:380 -#: gerbview/set_color.h:246 -msgid "Grid" -msgstr "Grille" - -#: pcbnew/tool_pcb.cpp:601 -#: pcbnew/tool_modedit.cpp:314 -msgid "User Grid" -msgstr "Grille perso" - -#: pcbnew/tool_pcb.cpp:676 -msgid "+/- to switch" -msgstr "+/- pour commuter" - #: pcbnew/router.cpp:60 msgid "Unable to create temporary file " msgstr "Impossible de créer le fichier temporaire " @@ -1141,13 +787,13 @@ msgid "PCB Text" msgstr "Texte Pcb" #: pcbnew/class_pcb_text.cpp:167 -#: pcbnew/class_pad.cpp:907 +#: pcbnew/class_pad.cpp:951 #: pcbnew/classpcb.cpp:197 #: pcbnew/class_text_mod.cpp:347 #: pcbnew/class_text_mod.cpp:351 #: pcbnew/sel_layer.cpp:145 -#: pcbnew/class_track.cpp:755 #: pcbnew/dialog_edit_module.cpp:234 +#: pcbnew/class_track.cpp:775 #: pcbnew/class_module.cpp:1116 #: gerbview/affiche.cpp:109 msgid "Layer" @@ -1166,7 +812,6 @@ msgstr "Miroir" #: pcbnew/class_pcb_text.cpp:173 #: pcbnew/dialog_display_options.cpp:273 #: pcbnew/class_text_mod.cpp:341 -#: eeschema/options.cpp:202 #: eeschema/dialog_options.cpp:265 #: gerbview/affiche.cpp:43 msgid "No" @@ -1175,14 +820,13 @@ msgstr "Non" #: pcbnew/class_pcb_text.cpp:175 #: pcbnew/dialog_display_options.cpp:272 #: pcbnew/class_text_mod.cpp:343 -#: eeschema/options.cpp:202 #: eeschema/dialog_options.cpp:264 #: gerbview/affiche.cpp:45 msgid "Yes" msgstr "Oui" #: pcbnew/class_pcb_text.cpp:178 -#: pcbnew/class_pad.cpp:949 +#: pcbnew/class_pad.cpp:993 #: pcbnew/class_text_mod.cpp:361 #: pcbnew/dialog_edit_module.cpp:245 #: pcbnew/class_module.cpp:1139 @@ -1194,12 +838,12 @@ msgstr "Orient" #: pcbnew/class_pcb_text.cpp:181 #: pcbnew/dialog_edit_mod_text.cpp:204 #: pcbnew/cotation.cpp:129 -#: pcbnew/mirepcb.cpp:117 +#: pcbnew/mirepcb.cpp:113 #: pcbnew/classpcb.cpp:202 #: pcbnew/class_text_mod.cpp:364 #: pcbnew/pcbtexte.cpp:130 -#: pcbnew/class_track.cpp:779 #: pcbnew/class_edge_mod.cpp:297 +#: pcbnew/class_track.cpp:799 #: eeschema/affiche.cpp:188 #: eeschema/dialog_cmp_graphic_properties.cpp:188 #: gerbview/affiche.cpp:52 @@ -1208,14 +852,14 @@ msgid "Width" msgstr "Epaisseur" #: pcbnew/class_pcb_text.cpp:184 -#: pcbnew/class_pad.cpp:920 +#: pcbnew/class_pad.cpp:964 #: pcbnew/class_text_mod.cpp:367 #: gerbview/affiche.cpp:55 msgid "H Size" msgstr "Taille H" #: pcbnew/class_pcb_text.cpp:187 -#: pcbnew/class_pad.cpp:924 +#: pcbnew/class_pad.cpp:968 #: pcbnew/class_text_mod.cpp:370 #: gerbview/affiche.cpp:58 msgid "V Size" @@ -1238,7 +882,7 @@ msgid "Footprint name:" msgstr "Nom Module: " #: pcbnew/modules.cpp:281 -#: pcbnew/onrightclick.cpp:650 +#: pcbnew/onrightclick.cpp:688 msgid "Delete Module" msgstr "Supprimer Module" @@ -1392,7 +1036,6 @@ msgid "Pad options:" msgstr "Options pads" #: pcbnew/zones.cpp:192 -#: eeschema/options.cpp:194 #: eeschema/dialog_options.cpp:257 msgid "Any" msgstr "Tout" @@ -1438,12 +1081,11 @@ msgid "No Net" msgstr "No Net" #: pcbnew/zones.cpp:916 -#: pcbnew/class_track.cpp:714 +#: pcbnew/class_track.cpp:734 msgid "NetName" msgstr "NetName" #: pcbnew/zones.cpp:984 -#: pcbnew/mirepcb.cpp:103 msgid "Ok" msgstr "Ok" @@ -1610,6 +1252,94 @@ msgstr "Fichiers Librairies" msgid "Library exists! No Change" msgstr "Librairie existante! Pas de changement" +#: pcbnew/cotation.cpp:85 +msgid "Dimension properties" +msgstr "Propriétés des Cotes" + +#: pcbnew/cotation.cpp:105 +#: pcbnew/mirepcb.cpp:99 +#: pcbnew/muonde.cpp:348 +#: pcbnew/block.cpp:156 +#: pcbnew/pcbtexte.cpp:111 +#: pcbnew/sel_layer.cpp:158 +#: pcbnew/sel_layer.cpp:309 +#: pcbnew/set_color.cpp:275 +#: pcbnew/swap_layers.cpp:98 +#: pcbnew/dialog_edit_module.cpp:117 +#: eeschema/sheetlab.cpp:93 +#: cvpcb/dialog_display_options.cpp:189 +#: gerbview/set_color.cpp:249 +#: gerbview/options.cpp:163 +#: gerbview/options.cpp:292 +#: gerbview/reglage.cpp:116 +#: gerbview/select_layers_to_pcb.cpp:167 +#: common/displlst.cpp:99 +#: common/get_component_dialog.cpp:112 +msgid "OK" +msgstr "OK" + +#: pcbnew/cotation.cpp:109 +#: pcbnew/mirepcb.cpp:103 +#: pcbnew/muonde.cpp:352 +#: pcbnew/block.cpp:153 +#: pcbnew/pcbtexte.cpp:116 +#: pcbnew/sel_layer.cpp:162 +#: pcbnew/sel_layer.cpp:313 +#: pcbnew/modedit_onclick.cpp:202 +#: pcbnew/modedit_onclick.cpp:234 +#: pcbnew/set_color.cpp:280 +#: pcbnew/swap_layers.cpp:103 +#: pcbnew/dialog_edit_module.cpp:121 +#: pcbnew/onrightclick.cpp:146 +#: pcbnew/onrightclick.cpp:160 +#: pcbnew/globaleditpad.cpp:108 +#: eeschema/sheetlab.cpp:97 +#: eeschema/libedit_onrightclick.cpp:68 +#: eeschema/libedit_onrightclick.cpp:83 +#: eeschema/onrightclick.cpp:121 +#: eeschema/onrightclick.cpp:133 +#: cvpcb/dialog_display_options.cpp:194 +#: gerbview/set_color.cpp:253 +#: gerbview/options.cpp:167 +#: gerbview/options.cpp:296 +#: gerbview/reglage.cpp:120 +#: gerbview/onrightclick.cpp:40 +#: gerbview/onrightclick.cpp:59 +#: gerbview/select_layers_to_pcb.cpp:171 +#: common/selcolor.cpp:147 +#: common/displlst.cpp:103 +#: common/get_component_dialog.cpp:121 +msgid "Cancel" +msgstr "Annuler" + +#: pcbnew/cotation.cpp:113 +#: pcbnew/muonde.cpp:360 +#: pcbnew/pcbtexte.cpp:176 +#: pcbnew/dialog_edit_module.cpp:242 +#: pcbnew/dialog_edit_module.cpp:288 +#: eeschema/dialog_options.cpp:229 +#: eeschema/dialog_edit_component_in_schematic.cpp:182 +#: eeschema/onrightclick.cpp:305 +msgid "Normal" +msgstr "Normal" + +#: pcbnew/cotation.cpp:125 +#: pcbnew/mirepcb.cpp:108 +#: pcbnew/muonde.cpp:367 +#: pcbnew/pcbtexte.cpp:126 +#: eeschema/sheet.cpp:189 +#: eeschema/sheet.cpp:200 +#: eeschema/pinedit-dialog.cpp:273 +#: eeschema/pinedit-dialog.cpp:279 +#: common/wxwineda.cpp:91 +msgid "Size" +msgstr "Taille " + +#: pcbnew/cotation.cpp:133 +#: gerbview/affiche.cpp:37 +msgid "Layer:" +msgstr "Couche:" + #: pcbnew/dialog_netlist.cpp:133 #: pcbnew/class_board_item.cpp:67 #: eeschema/eelayer.cpp:99 @@ -1633,9 +1363,9 @@ msgid "Keep" msgstr "Garder" #: pcbnew/dialog_netlist.cpp:141 -#: pcbnew/onrightclick.cpp:575 -#: pcbnew/onrightclick.cpp:682 -#: pcbnew/onrightclick.cpp:779 +#: pcbnew/onrightclick.cpp:613 +#: pcbnew/onrightclick.cpp:720 +#: pcbnew/onrightclick.cpp:817 #: eeschema/edit_component_in_lib.cpp:239 #: eeschema/edit_component_in_lib.cpp:320 #: cvpcb/dialog_cvpcb_config.cpp:166 @@ -1659,6 +1389,10 @@ msgstr "Echange module:" msgid "Display Warnings" msgstr "Affiche warnings" +#: pcbnew/dialog_netlist.cpp:162 +msgid "Select" +msgstr "Sélection" + #: pcbnew/dialog_netlist.cpp:166 msgid "Read" msgstr "Lire" @@ -1736,6 +1470,12 @@ msgstr "Autoriser l'effacement automatique des pistes" msgid "Do not Show Zones" msgstr "Ne pas monter Zones" +#: pcbnew/pcbframe.cpp:411 +#: pcbnew/tool_pcb.cpp:361 +#: pcbnew/set_color.h:344 +msgid "Show Zones" +msgstr "Monter Zones" + #: pcbnew/pcbframe.cpp:417 msgid "Show Pads Sketch mode" msgstr "Afficher pastilles en contour" @@ -1756,9 +1496,14 @@ msgstr "Afficher pistes en mode plein" msgid "Normal Contrast Mode Display" msgstr "Mode d'affichage Contraste normal" +#: pcbnew/pcbframe.cpp:432 +#: pcbnew/tool_pcb.cpp:374 +msgid "Hight Contrast Mode Display" +msgstr "Mode d'affichage Haut Contraste" + #: pcbnew/pcbframe.cpp:442 #: pcbnew/class_board_item.cpp:127 -#: pcbnew/class_track.cpp:688 +#: pcbnew/class_track.cpp:708 msgid "Track" msgstr "Piste" @@ -1767,47 +1512,310 @@ msgstr "Piste" msgid "Via" msgstr "Via" -#: pcbnew/class_pad.cpp:732 -msgid "Unknown Pad shape" -msgstr "Forme pad inconnue" +#: pcbnew/tool_pcb.cpp:51 +msgid "" +"Show active layer selections\n" +"and select layer pair for route and place via" +msgstr "" +"Affiche selections couche active\n" +"et selection paire de couches pour routage and placement via" -#: pcbnew/class_pad.cpp:818 -#: pcbnew/class_text_mod.cpp:328 -#: pcbnew/class_edge_mod.cpp:285 -#: pcbnew/class_module.cpp:1142 -#: cvpcb/setvisu.cpp:30 -msgid "Module" -msgstr "Module" +#: pcbnew/tool_pcb.cpp:239 +msgid "New Board" +msgstr "Nouveau Circuit Imprimé" -#: pcbnew/class_pad.cpp:821 -msgid "RefP" -msgstr "RefP" +#: pcbnew/tool_pcb.cpp:241 +msgid "Open existing Board" +msgstr "Ouvrir C.I. existant" -#: pcbnew/class_pad.cpp:824 -#: pcbnew/class_board_item.cpp:35 -msgid "Net" -msgstr "Net" +#: pcbnew/tool_pcb.cpp:242 +msgid "Save Board" +msgstr "Sauver Circuit Imprimé" -#: pcbnew/class_pad.cpp:938 -msgid "Drill X / Y" -msgstr "Perçage X/Y" +#: pcbnew/tool_pcb.cpp:246 +#: eeschema/tool_sch.cpp:65 +#: gerbview/tool_gerber.cpp:233 +msgid "page settings (size, texts)" +msgstr "Ajustage de la feuille de dessin (dimensions, textes)" -#: pcbnew/class_pad.cpp:953 -msgid "X Pos" -msgstr "X Pos" +#: pcbnew/tool_pcb.cpp:250 +msgid "Open Module Editor" +msgstr "Ouvrir Editeur de modules" -#: pcbnew/class_pad.cpp:957 -msgid "Y pos" -msgstr "Y pos" +#: pcbnew/tool_pcb.cpp:253 +#: eeschema/tool_sch.cpp:81 +#: gerbview/tool_gerber.cpp:244 +msgid "Cut selected item" +msgstr "Suppression des éléments sélectionnés" -#: pcbnew/hotkeys.cpp:435 -#, c-format -msgid "Footprint %s found, but locked" -msgstr "Module %s trouvé, mais verrouillé" +#: pcbnew/tool_pcb.cpp:257 +#: eeschema/tool_sch.cpp:84 +#: gerbview/tool_gerber.cpp:249 +msgid "Copy selected item" +msgstr "Copie des éléments sélectionnés" -#: pcbnew/hotkeys.cpp:598 -msgid "Delete module?" -msgstr "Effacer Module?" +#: pcbnew/tool_pcb.cpp:259 +#: eeschema/tool_sch.cpp:87 +#: gerbview/tool_gerber.cpp:255 +msgid "Paste" +msgstr "Copie des éléments sauvegardés" + +#: pcbnew/tool_pcb.cpp:262 +#: gerbview/tool_gerber.cpp:262 +msgid "Undelete" +msgstr "Annulation du dernier effacement" + +#: pcbnew/tool_pcb.cpp:265 +msgid "Print Board" +msgstr "Imprimer C.I." + +#: pcbnew/tool_pcb.cpp:267 +msgid "Plot (HPGL, PostScript, or GERBER format)" +msgstr "Tracer en format HPGL, POSTSCRIPT ou GERBER" + +#: pcbnew/tool_pcb.cpp:270 +#: pcbnew/tool_modedit.cpp:115 +#: eeschema/tool_lib.cpp:170 +#: eeschema/tool_sch.cpp:108 +#: gerbview/tool_gerber.cpp:272 +msgid "zoom +" +msgstr "zoom +" + +#: pcbnew/tool_pcb.cpp:274 +#: pcbnew/tool_modedit.cpp:119 +#: eeschema/tool_lib.cpp:174 +#: eeschema/tool_sch.cpp:112 +#: gerbview/tool_gerber.cpp:279 +msgid "zoom -" +msgstr "zoom -" + +#: pcbnew/tool_pcb.cpp:278 +#: pcbnew/tool_modedit.cpp:123 +#: eeschema/tool_lib.cpp:178 +#: eeschema/tool_sch.cpp:116 +#: gerbview/tool_gerber.cpp:286 +msgid "redraw" +msgstr "Redessin" + +#: pcbnew/tool_pcb.cpp:283 +#: pcbnew/tool_modedit.cpp:128 +#: eeschema/tool_lib.cpp:184 +#: eeschema/tool_sch.cpp:121 +#: gerbview/tool_gerber.cpp:297 +#: 3d-viewer/3d_toolbar.cpp:53 +msgid "auto zoom" +msgstr "Zoom automatique" + +#: pcbnew/tool_pcb.cpp:286 +#: eeschema/tool_sch.cpp:125 +msgid "Find components and texts" +msgstr "Recherche de composants et textes" + +#: pcbnew/tool_pcb.cpp:292 +msgid "Read Netlist" +msgstr "Lire Netliste" + +#: pcbnew/tool_pcb.cpp:294 +msgid "Pcb Design Rules Check" +msgstr "Controle des règles de conception" + +#: pcbnew/tool_pcb.cpp:305 +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:308 +msgid "Mode Track and Autorouting" +msgstr "Mode Pistes and Autoroutage" + +#: pcbnew/tool_pcb.cpp:332 +msgid "Drc OFF" +msgstr "Drc DESACTIVEE" + +#: pcbnew/tool_pcb.cpp:334 +#: pcbnew/tool_modedit.cpp:212 +#: eeschema/tool_sch.cpp:257 +#: gerbview/tool_gerber.cpp:412 +msgid "Display Grid OFF" +msgstr "Suppression de l'affichage de la grille" + +#: pcbnew/tool_pcb.cpp:337 +#: pcbnew/tool_modedit.cpp:216 +#: gerbview/tool_gerber.cpp:418 +msgid "Display Polar Coord ON" +msgstr "Activer affichage coord Polaires" + +#: pcbnew/tool_pcb.cpp:339 +#: pcbnew/tool_modedit.cpp:220 +#: eeschema/tool_sch.cpp:261 +#: gerbview/tool_gerber.cpp:422 +msgid "Units = Inch" +msgstr "Unités = pouce" + +#: pcbnew/tool_pcb.cpp:341 +#: pcbnew/tool_modedit.cpp:224 +#: eeschema/tool_sch.cpp:265 +#: gerbview/tool_gerber.cpp:426 +msgid "Units = mm" +msgstr "Unités = mm" + +#: pcbnew/tool_pcb.cpp:344 +#: pcbnew/tool_modedit.cpp:230 +#: eeschema/tool_sch.cpp:269 +#: gerbview/tool_gerber.cpp:432 +msgid "Change Cursor Shape" +msgstr "Sélection de la forme du curseur" + +#: pcbnew/tool_pcb.cpp:349 +msgid "Show General Ratsnest" +msgstr "Monter le chevelu général" + +#: pcbnew/tool_pcb.cpp:352 +msgid "Show Module Ratsnest when moving" +msgstr "Monter le chevelu du module pendant déplacement" + +#: pcbnew/tool_pcb.cpp:357 +msgid "Enable Auto Del Track" +msgstr "Autoriser l'effacement automatique des pistes" + +#: pcbnew/tool_pcb.cpp:366 +#: pcbnew/tool_modedit.cpp:238 +msgid "Show Pads Sketch" +msgstr "Afficher pastilles en contour" + +#: pcbnew/tool_pcb.cpp:370 +msgid "Show Tracks Sketch" +msgstr "Afficher pistes en contour" + +#: pcbnew/tool_pcb.cpp:383 +msgid "" +"Display auxiliary vertical toolbar (tools for micro wave applications)\n" +" This is a very experimental feature (under development)" +msgstr "" +"Affiche toolbar vertical auxiliaire (outils pour applications micro-ondes)\n" +"C'est un outil expérimental (en cours de développement)" + +#: pcbnew/tool_pcb.cpp:412 +msgid "Net highlight" +msgstr "Surbrillance des équipotentielles" + +#: pcbnew/tool_pcb.cpp:416 +msgid "Display local ratsnest (pad or module)" +msgstr "Afficher le chevelu local (pastilles ou modules)" + +#: pcbnew/tool_pcb.cpp:421 +msgid "Add modules" +msgstr "Addition de Modules" + +#: pcbnew/tool_pcb.cpp:425 +msgid "Add tracks and vias" +msgstr "Ajouter pistes et vias" + +#: pcbnew/tool_pcb.cpp:429 +msgid "Add zones" +msgstr "Addition de Zones" + +#: pcbnew/tool_pcb.cpp:434 +#: pcbnew/tool_modedit.cpp:168 +#: eeschema/tool_sch.cpp:226 +msgid "Add graphic line or polygon" +msgstr "Addition de lignes ou polygones graphiques" + +#: pcbnew/tool_pcb.cpp:438 +#: pcbnew/tool_modedit.cpp:172 +msgid "Add graphic circle" +msgstr "Addition de graphiques (Cercle)" + +#: pcbnew/tool_pcb.cpp:442 +#: pcbnew/tool_modedit.cpp:176 +msgid "Add graphic arc" +msgstr "Addition de graphiques (Arc de Cercle)" + +#: pcbnew/tool_pcb.cpp:446 +msgid "Add text" +msgstr "Ajout de Texte" + +#: pcbnew/tool_pcb.cpp:451 +msgid "Add dimension" +msgstr "Ajout des cotes" + +#: pcbnew/tool_pcb.cpp:455 +#: gerbview/tool_gerber.cpp:376 +msgid "Add layer alignment target" +msgstr "Ajouter Mire de superposition" + +#: pcbnew/tool_pcb.cpp:460 +#: pcbnew/tool_modedit.cpp:190 +#: eeschema/tool_lib.cpp:93 +#: eeschema/tool_sch.cpp:235 +#: gerbview/tool_gerber.cpp:391 +msgid "Delete items" +msgstr "Suppression d'éléments" + +#: pcbnew/tool_pcb.cpp:465 +msgid "Offset adjust for drill and place files" +msgstr "Ajuste offset pour fichier de perçage et placement" + +#: pcbnew/tool_pcb.cpp:490 +msgid "Create line of specified length for microwave applications" +msgstr "Creation de lignes de longueur spécifiée (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:496 +msgid "Create gap of specified length for microwave applications" +msgstr "Creation de gaps de longueur spécifiée (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:504 +msgid "Create stub of specified length for microwave applications" +msgstr "Creation de stub de longueur spécifiée (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:510 +msgid "Create stub (arc) of specified length for microwave applications" +msgstr "Creation de stub (arc) de longueur spécifiée (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:517 +msgid "Create a polynomial shape for microwave applications" +msgstr "Creation de formes polynomiales (pour applications micro-ondes)" + +#: pcbnew/tool_pcb.cpp:567 +#: pcbnew/tool_modedit.cpp:285 +#: eeschema/plotps.cpp:169 +#: share/zoom.cpp:368 +msgid "Auto" +msgstr "Auto" + +#: pcbnew/tool_pcb.cpp:571 +msgid "Zoom " +msgstr "Zoom " + +#: pcbnew/tool_pcb.cpp:585 +#: pcbnew/set_color.h:335 +#: gerbview/set_color.h:246 +msgid "Grid" +msgstr "Grille" + +#: pcbnew/tool_pcb.cpp:601 +#: pcbnew/tool_modedit.cpp:314 +msgid "User Grid" +msgstr "Grille perso" + +#: pcbnew/tool_pcb.cpp:676 +msgid "+/- to switch" +msgstr "+/- pour commuter" + +#: pcbnew/mirepcb.cpp:78 +msgid "Target Properties" +msgstr "Propriétés de la mire" + +#: pcbnew/mirepcb.cpp:118 +msgid "shape +" +msgstr "Forme +" + +#: pcbnew/mirepcb.cpp:118 +msgid "shape X" +msgstr "Forme X" + +#: pcbnew/mirepcb.cpp:120 +msgid "Target Shape:" +msgstr "Forme Mire:" #: pcbnew/dialog_initpcb.cpp:105 msgid "Items to delete" @@ -2011,44 +2019,10 @@ msgid "Display other items:" msgstr "Afficher autres éléments" #: pcbnew/dialog_display_options.cpp:275 -#: eeschema/options.cpp:204 #: eeschema/dialog_options.cpp:267 msgid "Show page limits" msgstr " Afficher limites de page" -#: pcbnew/cotation.cpp:85 -msgid "Cotation properties" -msgstr "Propriétés des Cotations" - -#: pcbnew/cotation.cpp:113 -#: pcbnew/muonde.cpp:360 -#: pcbnew/pcbtexte.cpp:176 -#: pcbnew/dialog_edit_module.cpp:242 -#: pcbnew/dialog_edit_module.cpp:288 -#: eeschema/options.cpp:177 -#: eeschema/dialog_options.cpp:229 -#: eeschema/dialog_edit_component_in_schematic.cpp:182 -#: eeschema/onrightclick.cpp:305 -msgid "Normal" -msgstr "Normal" - -#: pcbnew/cotation.cpp:125 -#: pcbnew/muonde.cpp:367 -#: pcbnew/mirepcb.cpp:112 -#: pcbnew/pcbtexte.cpp:126 -#: eeschema/sheet.cpp:189 -#: eeschema/sheet.cpp:200 -#: eeschema/pinedit-dialog.cpp:273 -#: eeschema/pinedit-dialog.cpp:279 -#: common/wxwineda.cpp:91 -msgid "Size" -msgstr "Taille " - -#: pcbnew/cotation.cpp:133 -#: gerbview/affiche.cpp:37 -msgid "Layer:" -msgstr "Couche:" - #: pcbnew/plotgerb.cpp:72 msgid "unable to create file " msgstr "Impossible de créer fichier " @@ -2098,21 +2072,18 @@ msgid "Complex shape" msgstr "Formr complexe" #: pcbnew/muonde.cpp:356 -#, fuzzy msgid "Read Shape Descr File..." -msgstr "Lire fichier de description de forme" +msgstr "Lire fichier de description de forme..." #: pcbnew/muonde.cpp:360 msgid "Symmetrical" msgstr "Symétrique" #: pcbnew/muonde.cpp:360 -#, fuzzy msgid "Mirrored" msgstr "Miroir" #: pcbnew/muonde.cpp:362 -#, fuzzy msgid "Shape Option" msgstr "Option Forme" @@ -2148,22 +2119,6 @@ msgstr "Gap (mm):" msgid "Gap (inch):" msgstr "Gap (inch):" -#: pcbnew/mirepcb.cpp:82 -msgid "Mire properties" -msgstr "Propriétés des Mires" - -#: pcbnew/mirepcb.cpp:122 -msgid "shape +" -msgstr "Forme +" - -#: pcbnew/mirepcb.cpp:122 -msgid "shape X" -msgstr "Forme X" - -#: pcbnew/mirepcb.cpp:124 -msgid "Mire Shape:" -msgstr "Forme Mire:" - #: pcbnew/deltrack.cpp:153 msgid "Delete NET ?" msgstr "Supprimer Net ?" @@ -2427,6 +2382,15 @@ msgstr "Grille perso dim X" msgid "User Grid Size Y" msgstr "Grille perso dim Y" +#: pcbnew/hotkeys.cpp:434 +#, c-format +msgid "Footprint %s found, but locked" +msgstr "Module %s trouvé, mais verrouillé" + +#: pcbnew/hotkeys.cpp:597 +msgid "Delete module?" +msgstr "Effacer Module?" + #: pcbnew/dialog_pad_edit.cpp:157 msgid "Pad Num :" msgstr "Num Pad :" @@ -2439,7 +2403,7 @@ msgstr "NetName Pad:" #: pcbnew/dialog_pad_edit.cpp:196 #: pcbnew/classpcb.cpp:186 #: pcbnew/class_board_item.cpp:100 -#: pcbnew/class_track.cpp:725 +#: pcbnew/class_track.cpp:745 msgid "Circle" msgstr "Cercle" @@ -2489,7 +2453,7 @@ msgid "Pad Shape:" msgstr "Forme Pad:" #: pcbnew/dialog_pad_edit.cpp:205 -#: pcbnew/class_track.cpp:727 +#: pcbnew/class_track.cpp:747 msgid "Standard" msgstr "Standard" @@ -2570,35 +2534,9 @@ msgstr "couche E.C.O.2" msgid "Draft layer" msgstr "Couche dessin" -#: pcbnew/classpcb.cpp:181 -#: pcbnew/classpcb.cpp:313 -#: pcbnew/class_text_mod.cpp:337 -#: pcbnew/class_track.cpp:699 -#: gerbview/affiche.cpp:93 -msgid "Type" -msgstr "Type" - -#: pcbnew/classpcb.cpp:183 -msgid "Shape" -msgstr "Forme" - -#: pcbnew/classpcb.cpp:190 -msgid " Arc " -msgstr " Arc " - -#: pcbnew/classpcb.cpp:195 -#: pcbnew/class_track.cpp:723 -msgid "Segment" -msgstr "Segment" - -#: pcbnew/classpcb.cpp:313 -#: pcbnew/class_board_item.cpp:182 -msgid "Marker" -msgstr "Marqueur" - -#: pcbnew/classpcb.cpp:316 -msgid "Marker Error Text" -msgstr "Texte du Marqueur d'erreurs" +#: pcbnew/controle.cpp:172 +msgid "Selection Clarification" +msgstr "Clarification de la Sélection" #: pcbnew/pcbcfg.cpp:68 #: eeschema/eeconfig.cpp:58 @@ -2652,6 +2590,69 @@ msgstr "Librairie: " msgid "Modules (%d items)" msgstr "Modules (%d éléments)" +#: pcbnew/class_pad.cpp:776 +msgid "Unknown Pad shape" +msgstr "Forme pad inconnue" + +#: pcbnew/class_pad.cpp:862 +#: pcbnew/class_text_mod.cpp:328 +#: pcbnew/class_edge_mod.cpp:285 +#: pcbnew/class_module.cpp:1142 +#: cvpcb/setvisu.cpp:30 +msgid "Module" +msgstr "Module" + +#: pcbnew/class_pad.cpp:865 +msgid "RefP" +msgstr "RefP" + +#: pcbnew/class_pad.cpp:868 +#: pcbnew/class_board_item.cpp:35 +msgid "Net" +msgstr "Net" + +#: pcbnew/class_pad.cpp:982 +msgid "Drill X / Y" +msgstr "Perçage X/Y" + +#: pcbnew/class_pad.cpp:997 +msgid "X Pos" +msgstr "X Pos" + +#: pcbnew/class_pad.cpp:1001 +msgid "Y pos" +msgstr "Y pos" + +#: pcbnew/classpcb.cpp:181 +#: pcbnew/classpcb.cpp:313 +#: pcbnew/class_text_mod.cpp:337 +#: pcbnew/class_track.cpp:719 +#: gerbview/affiche.cpp:93 +msgid "Type" +msgstr "Type" + +#: pcbnew/classpcb.cpp:183 +msgid "Shape" +msgstr "Forme" + +#: pcbnew/classpcb.cpp:190 +msgid " Arc " +msgstr " Arc " + +#: pcbnew/classpcb.cpp:195 +#: pcbnew/class_track.cpp:743 +msgid "Segment" +msgstr "Segment" + +#: pcbnew/classpcb.cpp:313 +#: pcbnew/class_board_item.cpp:182 +msgid "Marker" +msgstr "Marqueur" + +#: pcbnew/classpcb.cpp:316 +msgid "Marker Error Text" +msgstr "Texte du Marqueur d'erreurs" + #: pcbnew/files.cpp:57 msgid "Recovery file " msgstr "Fichier de secours " @@ -2924,10 +2925,6 @@ msgstr "Valeur" msgid "Text" msgstr "Texte" -#: pcbnew/controle.cpp:174 -msgid "Selection Clarification" -msgstr "Clarification de la Sélection" - #: pcbnew/drc.cpp:80 msgid "Look for active routes\n" msgstr "Recherche des chevelus actifs\n" @@ -3001,7 +2998,7 @@ msgid "Tst Zones\n" msgstr "Test Zones\n" #: pcbnew/drc.cpp:1367 -#, fuzzy, c-format +#, c-format msgid "%d Drc Err %d %s (net %s) and PAD %s (%s) net %s @ %d,%d\n" msgstr "%d Err Drc %d %s (net %s) et PAD %s (%s) net %s @ %d,%d\n" @@ -3028,10 +3025,13 @@ msgstr "Propri msgid "Position" msgstr "Position" -#: pcbnew/editmod.cpp:45 -#: pcbnew/edit.cpp:167 -msgid "Module Editor" -msgstr "Ouvrir Editeur de modules" +#: pcbnew/surbrill.cpp:35 +msgid "Filter for net names:" +msgstr "Filtre pour nets:" + +#: pcbnew/surbrill.cpp:39 +msgid "List Nets" +msgstr "Liste équipots" #: pcbnew/editmod.cpp:144 msgid "Text is REFERENCE!" @@ -3422,112 +3422,13 @@ msgstr "&3D Visu" msgid "&Help" msgstr "&Aide" -#: pcbnew/set_color.cpp:50 -msgid "Copper Layers" -msgstr "Couches Cuivre." - -#: pcbnew/set_color.cpp:184 -msgid "Tech Layers" -msgstr "Couches Tech." - -#: pcbnew/set_color.cpp:323 -msgid "Ratsnest" -msgstr "Chevelu" - -#: pcbnew/set_color.cpp:332 -msgid "Pad Cu" -msgstr "Pad Cu" - -#: pcbnew/set_color.cpp:340 -msgid "Pad Cmp" -msgstr "Pad Cmp" - -#: pcbnew/set_color.cpp:348 -msgid "Text Module Cu" -msgstr "Texte Module Cu" - -#: pcbnew/set_color.cpp:356 -msgid "Text Module Cmp" -msgstr "Texte Module Cmp" - -#: pcbnew/set_color.cpp:364 -msgid "Text Module invisible" -msgstr "Texte Module invisible" - -#: pcbnew/set_color.cpp:372 -msgid "Anchors" -msgstr "Ancres" - -#: pcbnew/set_color.cpp:398 -msgid "Show Noconnect" -msgstr "Montrer Non Conn" - -#: pcbnew/set_color.cpp:407 -msgid "Show Modules Cmp" -msgstr "Afficher Modules Cmp" - -#: pcbnew/set_color.cpp:416 -msgid "Show Modules Cu" -msgstr "Afficher Modules Cu" - -#: pcbnew/set_color.cpp:577 -msgid "Colors:" -msgstr "Couleurs:" - -#: pcbnew/set_color.cpp:704 -#: gerbview/set_color.cpp:234 -msgid "Show All" -msgstr "Tout Afficher" - -#: pcbnew/set_color.cpp:710 -#: gerbview/set_color.cpp:239 -msgid "Show None" -msgstr "Rien Afficher" - -#: pcbnew/set_color.cpp:716 -msgid "Exit" -msgstr "Quitter" - -#: pcbnew/edit.cpp:247 -msgid "Add Tracks" -msgstr "Addition de pistes" - -#: pcbnew/edit.cpp:258 -msgid "Warning: Display Zone is OFF!!!" -msgstr "Attention: Affichage zones désactivé !!!" - -#: pcbnew/edit.cpp:265 -msgid "Add Mire" -msgstr "Ajouter Mires de superposition" - -#: pcbnew/edit.cpp:269 -msgid "Adjust Zero" -msgstr "Ajuster Zéro" - -#: pcbnew/edit.cpp:275 -msgid "Add Graphic" -msgstr "Addition éléments graphiques" - -#: pcbnew/edit.cpp:283 -msgid "Add Modules" -msgstr "Addition de Modules" - -#: pcbnew/edit.cpp:295 -msgid "Net Highlight" -msgstr "Surbrillance des équipotentielles" - -#: pcbnew/edit.cpp:299 -msgid "Local Ratsnest" -msgstr "Monter le chevelu général" - #: pcbnew/sel_layer.cpp:92 msgid "Select Layer:" msgstr "Selection couche:" #: pcbnew/sel_layer.cpp:137 -#, fuzzy msgid "(Deselect)" -msgstr "Deselection" +msgstr "(Deselection)" #: pcbnew/sel_layer.cpp:238 msgid "Less than two copper layers are being used." @@ -3551,7 +3452,7 @@ msgstr "Couche Inf." #: pcbnew/sel_layer.cpp:351 msgid "The Top Layer and Bottom Layer must differ" -msgstr "" +msgstr "Les couches dessus et dessous doivent différer" #: pcbnew/automove.cpp:212 msgid "Move Modules ?" @@ -3566,74 +3467,16 @@ msgstr "Autoplace modules: pas de contours sur pcb, impossible de placer les mod msgid "Ok to set module orientation to %d degrees ?" msgstr "Ok pour orientation module à %d degrés ?" -#: pcbnew/class_board_item.cpp:40 -#: eeschema/component_class.cpp:56 -msgid "Footprint" -msgstr "Module" +#: pcbnew/basepcbframe.cpp:119 +msgid "3D Frame already opened" +msgstr "Fenetre 3D déjà ouverte" -#: pcbnew/class_board_item.cpp:45 -msgid "Pad" -msgstr "Pad" - -#: pcbnew/class_board_item.cpp:45 -#: pcbnew/class_board_item.cpp:71 -#: pcbnew/class_board_item.cpp:77 -#: pcbnew/class_board_item.cpp:122 -msgid " of " -msgstr " de " - -#: pcbnew/class_board_item.cpp:50 -msgid "Pcb Graphic" -msgstr "Pcb Graphic" - -#: pcbnew/class_board_item.cpp:50 -#: pcbnew/class_board_item.cpp:59 -#: pcbnew/class_board_item.cpp:133 -#: pcbnew/class_board_item.cpp:148 -#: pcbnew/class_board_item.cpp:175 -#: pcbnew/class_board_item.cpp:194 -msgid " on " -msgstr " sur " - -#: pcbnew/class_board_item.cpp:54 -msgid "Pcb Text" -msgstr "Texte Pcb" - -#: pcbnew/class_board_item.cpp:85 -msgid "Graphic" -msgstr "Graphique" - -#: pcbnew/class_board_item.cpp:97 -msgid "Arc" -msgstr "Arc" - -#: pcbnew/class_board_item.cpp:137 -#: pcbnew/class_track.cpp:692 -msgid "Zone" -msgstr "Zone" - -#: pcbnew/class_board_item.cpp:158 -msgid "Blind" -msgstr "Enterrée" - -#: pcbnew/class_board_item.cpp:160 -msgid "Buried" -msgstr "Borgne" - -#: pcbnew/class_board_item.cpp:186 -msgid "Dimension" -msgstr "Dimension" - -#: pcbnew/class_board_item.cpp:190 -msgid "Mire" -msgstr "Mire" - -#: pcbnew/class_board_item.cpp:194 -msgid "Edge Zone" -msgstr "Contour Zone" +#: pcbnew/basepcbframe.cpp:122 +msgid "3D Viewer" +msgstr "Visu 3D" #: pcbnew/modedit_onclick.cpp:206 -#: pcbnew/onrightclick.cpp:148 +#: pcbnew/onrightclick.cpp:151 #: eeschema/libedit_onrightclick.cpp:73 #: eeschema/onrightclick.cpp:125 #: gerbview/onrightclick.cpp:42 @@ -3641,7 +3484,7 @@ msgid "End Tool" msgstr "Fin Outil" #: pcbnew/modedit_onclick.cpp:216 -#: pcbnew/onrightclick.cpp:457 +#: pcbnew/onrightclick.cpp:495 #: eeschema/libedit_onrightclick.cpp:252 #: eeschema/onrightclick.cpp:581 #: gerbview/onrightclick.cpp:51 @@ -3649,13 +3492,13 @@ msgid "Cancel Block" msgstr "Annuler Bloc" #: pcbnew/modedit_onclick.cpp:218 -#: pcbnew/onrightclick.cpp:459 +#: pcbnew/onrightclick.cpp:497 #: gerbview/onrightclick.cpp:52 msgid "Zoom Block (Midd butt drag)" msgstr "Zoom Bloc (drag+bouton milieu)" #: pcbnew/modedit_onclick.cpp:221 -#: pcbnew/onrightclick.cpp:462 +#: pcbnew/onrightclick.cpp:500 #: eeschema/libedit_onrightclick.cpp:260 #: eeschema/onrightclick.cpp:589 #: gerbview/onrightclick.cpp:54 @@ -3663,7 +3506,7 @@ msgid "Place Block" msgstr "Place Bloc" #: pcbnew/modedit_onclick.cpp:223 -#: pcbnew/onrightclick.cpp:464 +#: pcbnew/onrightclick.cpp:502 #: eeschema/libedit_onrightclick.cpp:266 #: eeschema/onrightclick.cpp:598 msgid "Copy Block (shift + drag mouse)" @@ -3674,18 +3517,18 @@ msgid "Mirror Block (alt + drag mouse)" msgstr "Bloc Miroir (alt + drag mouse)" #: pcbnew/modedit_onclick.cpp:227 -#: pcbnew/onrightclick.cpp:468 +#: pcbnew/onrightclick.cpp:506 msgid "Rotate Block (ctrl + drag mouse)" msgstr "Rotation Bloc (ctrl + drag mouse)" #: pcbnew/modedit_onclick.cpp:229 -#: pcbnew/onrightclick.cpp:470 +#: pcbnew/onrightclick.cpp:508 msgid "Delete Block (shift+ctrl + drag mouse)" msgstr "Effacement Bloc (shift+ctrl + drag mouse)" #: pcbnew/modedit_onclick.cpp:251 -#: pcbnew/onrightclick.cpp:676 -#: pcbnew/onrightclick.cpp:773 +#: pcbnew/onrightclick.cpp:714 +#: pcbnew/onrightclick.cpp:811 msgid "Rotate" msgstr "Rotation" @@ -3715,17 +3558,17 @@ msgid "Move Pad" msgstr "Déplace Pad" #: pcbnew/modedit_onclick.cpp:273 -#: pcbnew/onrightclick.cpp:715 +#: pcbnew/onrightclick.cpp:753 msgid "Edit Pad" msgstr "Edit Pad" #: pcbnew/modedit_onclick.cpp:275 -#: pcbnew/onrightclick.cpp:719 +#: pcbnew/onrightclick.cpp:757 msgid "New Pad Settings" msgstr "Nouvelles Caract. Pads" #: pcbnew/modedit_onclick.cpp:277 -#: pcbnew/onrightclick.cpp:721 +#: pcbnew/onrightclick.cpp:759 msgid "Export Pad Settings" msgstr "Exporte Caract. Pads" @@ -3734,7 +3577,7 @@ msgid "delete Pad" msgstr "Supprimer Pad" #: pcbnew/modedit_onclick.cpp:284 -#: pcbnew/onrightclick.cpp:726 +#: pcbnew/onrightclick.cpp:764 msgid "Global Pad Settings" msgstr "Edition Globale des pads" @@ -3767,9 +3610,9 @@ msgid "Place edge" msgstr "Place contour" #: pcbnew/modedit_onclick.cpp:316 -#: pcbnew/onrightclick.cpp:644 -#: pcbnew/onrightclick.cpp:678 -#: pcbnew/onrightclick.cpp:775 +#: pcbnew/onrightclick.cpp:682 +#: pcbnew/onrightclick.cpp:716 +#: pcbnew/onrightclick.cpp:813 #: eeschema/onrightclick.cpp:312 msgid "Edit" msgstr "Editer" @@ -3798,6 +3641,26 @@ msgstr "Effacement contour" msgid "Set Width" msgstr "Ajuste Epaiss" +#: pcbnew/set_color.cpp:149 +msgid "Colors:" +msgstr "Couleurs:" + +#: pcbnew/set_color.cpp:264 +#: gerbview/set_color.cpp:236 +msgid "Show All" +msgstr "Tout Afficher" + +#: pcbnew/set_color.cpp:270 +#: gerbview/set_color.cpp:241 +msgid "Show None" +msgstr "Rien Afficher" + +#: pcbnew/set_color.cpp:285 +#: cvpcb/dialog_display_options.cpp:199 +#: gerbview/set_color.cpp:257 +msgid "Apply" +msgstr "Appliquer" + #: pcbnew/dialog_setup_libs.cpp:191 #: eeschema/eestatus.cpp:139 #: eeschema/dialog_eeschema_config.cpp:211 @@ -3949,29 +3812,35 @@ msgstr "Largeur Texte Module" msgid "GenCAD file:" msgstr "Fichier GenCAD:" +#: pcbnew/swap_layers.cpp:59 +msgid "Swap Layers:" +msgstr "Permutte couches" + +#: pcbnew/swap_layers.cpp:75 +#: pcbnew/swap_layers.cpp:129 +#: pcbnew/swap_layers.cpp:162 +msgid "No Change" +msgstr "Garder" + +#: pcbnew/swap_layers.cpp:80 +#: gerbview/select_layers_to_pcb.cpp:134 +msgid "Layers" +msgstr "Couches" + #: pcbnew/swap_layers.cpp:88 #: gerbview/select_layers_to_pcb.cpp:152 -#, fuzzy msgid "Select..." -msgstr "Sélection" +msgstr "Sélection..." + +#: pcbnew/swap_layers.cpp:93 +#: gerbview/select_layers_to_pcb.cpp:156 +msgid "Deselect" +msgstr "Deselection" #: pcbnew/swap_layers.cpp:150 msgid "Deselect this layer to restore its No Change state" msgstr "Deselectionner cette couche pour restorer l'option Pas de Changement" -#: pcbnew/class_track.cpp:719 -msgid "NetCode" -msgstr "NetCode" - -#: pcbnew/class_track.cpp:739 -#: pcbnew/class_module.cpp:1135 -msgid "Stat" -msgstr "Stat" - -#: pcbnew/class_track.cpp:763 -msgid "Diam" -msgstr "Diam" - #: pcbnew/dialog_edit_module.cpp:39 msgid "Module properties" msgstr "Propriétés du Module" @@ -4129,53 +3998,71 @@ msgstr "R msgid "Delete [%s]" msgstr "Supprimer [%s]" -#: pcbnew/globaleditpad.cpp:79 -msgid "Pads Global Edit" -msgstr "Pads: Edition globale" +#: pcbnew/class_board_item.cpp:40 +#: eeschema/component_class.cpp:56 +msgid "Footprint" +msgstr "Module" -#: pcbnew/globaleditpad.cpp:101 -msgid "Change Module" -msgstr "Change module" +#: pcbnew/class_board_item.cpp:45 +msgid "Pad" +msgstr "Pad" -#: pcbnew/globaleditpad.cpp:106 -msgid "Change Id Modules" -msgstr "Change Modules ident." +#: pcbnew/class_board_item.cpp:45 +#: pcbnew/class_board_item.cpp:71 +#: pcbnew/class_board_item.cpp:77 +#: pcbnew/class_board_item.cpp:122 +msgid " of " +msgstr " de " -#: pcbnew/globaleditpad.cpp:117 -msgid "Pad Filter :" -msgstr "Filtre Pad :" +#: pcbnew/class_board_item.cpp:50 +msgid "Pcb Graphic" +msgstr "Pcb Graphic" -#: pcbnew/globaleditpad.cpp:119 -msgid "Shape Filter" -msgstr "Filtre sur forme" +#: pcbnew/class_board_item.cpp:50 +#: pcbnew/class_board_item.cpp:59 +#: pcbnew/class_board_item.cpp:133 +#: pcbnew/class_board_item.cpp:148 +#: pcbnew/class_board_item.cpp:175 +#: pcbnew/class_board_item.cpp:197 +msgid " on " +msgstr " sur " -#: pcbnew/globaleditpad.cpp:123 -msgid "Layer Filter" -msgstr "Filtre sur couche" +#: pcbnew/class_board_item.cpp:54 +msgid "Pcb Text" +msgstr "Texte Pcb" -#: pcbnew/globaleditpad.cpp:127 -msgid "Orient Filter" -msgstr "Filtre Orientation" +#: pcbnew/class_board_item.cpp:85 +msgid "Graphic" +msgstr "Graphique" -#: pcbnew/globaleditpad.cpp:132 -msgid "Change Items :" -msgstr "Eléments à changer:" +#: pcbnew/class_board_item.cpp:97 +msgid "Arc" +msgstr "Arc" -#: pcbnew/globaleditpad.cpp:134 -msgid "Change Size" -msgstr "Change Taille" +#: pcbnew/class_board_item.cpp:137 +#: pcbnew/class_track.cpp:712 +msgid "Zone" +msgstr "Zone" -#: pcbnew/globaleditpad.cpp:138 -msgid "Change Shape" -msgstr "Change Forme" +#: pcbnew/class_board_item.cpp:158 +msgid "Blind" +msgstr "Enterrée" -#: pcbnew/globaleditpad.cpp:142 -msgid "Change Drill" -msgstr "Change Perçage" +#: pcbnew/class_board_item.cpp:160 +msgid "Buried" +msgstr "Borgne" -#: pcbnew/globaleditpad.cpp:146 -msgid "Change Orient" -msgstr "Change Orientation" +#: pcbnew/class_board_item.cpp:186 +msgid "Dimension" +msgstr "Dimension" + +#: pcbnew/class_board_item.cpp:190 +msgid "Target" +msgstr "Mire" + +#: pcbnew/class_board_item.cpp:197 +msgid "Edge Zone" +msgstr "Contour Zone" #: pcbnew/class_edge_mod.cpp:283 msgid "Seg" @@ -4226,6 +4113,19 @@ msgstr "Pin localis msgid "Module Editor: module modified!, Continue ?" msgstr "Editeur de Module: module modifié! Continuer ?" +#: pcbnew/class_track.cpp:739 +msgid "NetCode" +msgstr "NetCode" + +#: pcbnew/class_track.cpp:759 +#: pcbnew/class_module.cpp:1135 +msgid "Stat" +msgstr "Stat" + +#: pcbnew/class_track.cpp:783 +msgid "Diam" +msgstr "Diam" + #: pcbnew/gen_modules_placefile.cpp:76 msgid "No Modules for Automated Placement" msgstr "Pas de Module pour placement Automatisé" @@ -4242,379 +4142,435 @@ msgstr "Fichier placement cot msgid "Module count" msgstr "Nb Modules" -#: pcbnew/basepcbframe.cpp:119 -msgid "3D Frame already opened" -msgstr "Fenetre 3D déjà ouverte" - -#: pcbnew/basepcbframe.cpp:122 -msgid "3D Viewer" -msgstr "Visu 3D" - -#: pcbnew/onrightclick.cpp:80 +#: pcbnew/onrightclick.cpp:83 #, c-format msgid "Track %.1f" msgstr "Piste %.1f" -#: pcbnew/onrightclick.cpp:82 +#: pcbnew/onrightclick.cpp:85 #, c-format msgid "Track %.3f" msgstr "Piste %.3f" -#: pcbnew/onrightclick.cpp:98 +#: pcbnew/onrightclick.cpp:101 #, c-format msgid "Via %.1f" msgstr "Via %.1f" -#: pcbnew/onrightclick.cpp:100 +#: pcbnew/onrightclick.cpp:103 #, c-format msgid "Via %.3f" msgstr "Via %.3f" -#: pcbnew/onrightclick.cpp:197 +#: pcbnew/onrightclick.cpp:235 msgid "Lock Module" msgstr "Verrouiller Modules" -#: pcbnew/onrightclick.cpp:205 +#: pcbnew/onrightclick.cpp:243 msgid "Unlock Module" msgstr "Déverrouiller Modules" -#: pcbnew/onrightclick.cpp:213 +#: pcbnew/onrightclick.cpp:251 msgid "Auto place Module" msgstr "Auto place Module" -#: pcbnew/onrightclick.cpp:219 +#: pcbnew/onrightclick.cpp:257 msgid "Autoroute" msgstr "Autoroute" -#: pcbnew/onrightclick.cpp:235 +#: pcbnew/onrightclick.cpp:273 msgid "Move Drawing" msgstr "Déplace Tracé" -#: pcbnew/onrightclick.cpp:240 +#: pcbnew/onrightclick.cpp:278 msgid "End Drawing" msgstr "Fin tracé" -#: pcbnew/onrightclick.cpp:242 +#: pcbnew/onrightclick.cpp:280 msgid "Edit Drawing" msgstr "Edit Tracé" -#: pcbnew/onrightclick.cpp:243 +#: pcbnew/onrightclick.cpp:281 msgid "Delete Drawing" msgstr "Supprimer Tracé" -#: pcbnew/onrightclick.cpp:250 +#: pcbnew/onrightclick.cpp:288 msgid "End edge zone" msgstr "Fin contour Zone" -#: pcbnew/onrightclick.cpp:253 +#: pcbnew/onrightclick.cpp:291 msgid "Delete edge zone" msgstr "Supprimer Contour Zone" -#: pcbnew/onrightclick.cpp:268 +#: pcbnew/onrightclick.cpp:306 msgid "Edit Zone" msgstr "Editer Zone" -#: pcbnew/onrightclick.cpp:270 +#: pcbnew/onrightclick.cpp:308 msgid "Delete Zone" msgstr "Supprimer Zone" -#: pcbnew/onrightclick.cpp:275 +#: pcbnew/onrightclick.cpp:313 msgid "Delete Marker" msgstr "Effacer Marqueur" -#: pcbnew/onrightclick.cpp:282 -msgid "Edit Cotation" -msgstr "Editer Cotation" +#: pcbnew/onrightclick.cpp:320 +msgid "Edit Dimension" +msgstr "Edit Cote" -#: pcbnew/onrightclick.cpp:285 -msgid "Delete Cotation" -msgstr "Supprimer Cotation" +#: pcbnew/onrightclick.cpp:323 +msgid "Delete Dimension" +msgstr "Suppression Cote" -#: pcbnew/onrightclick.cpp:292 -msgid "Move Mire" -msgstr "Déplace Mire" +#: pcbnew/onrightclick.cpp:330 +msgid "Move Target" +msgstr "Déplacer Mire" -#: pcbnew/onrightclick.cpp:295 -msgid "Edit Mire" -msgstr "Edit Mire" +#: pcbnew/onrightclick.cpp:333 +msgid "Edit Target" +msgstr "Editer Mire" -#: pcbnew/onrightclick.cpp:297 -msgid "Delete Mire" +#: pcbnew/onrightclick.cpp:335 +msgid "Delete Target" msgstr "Supprimer Mire" -#: pcbnew/onrightclick.cpp:324 +#: pcbnew/onrightclick.cpp:362 msgid "Get and Move Footprint" msgstr "Sel et Dépl.t module" -#: pcbnew/onrightclick.cpp:336 +#: pcbnew/onrightclick.cpp:374 msgid "Fill zone" msgstr "Remplir zone" -#: pcbnew/onrightclick.cpp:344 +#: pcbnew/onrightclick.cpp:382 msgid "Select Net" msgstr "Sélection Net" -#: pcbnew/onrightclick.cpp:349 +#: pcbnew/onrightclick.cpp:387 msgid "Delete Zone Limit" msgstr "Supprimer Limite de Zone" -#: pcbnew/onrightclick.cpp:354 -#: pcbnew/onrightclick.cpp:365 -#: pcbnew/onrightclick.cpp:378 -#: pcbnew/onrightclick.cpp:439 +#: pcbnew/onrightclick.cpp:392 +#: pcbnew/onrightclick.cpp:403 +#: pcbnew/onrightclick.cpp:416 +#: pcbnew/onrightclick.cpp:477 msgid "Select Working Layer" msgstr "Sélection de la couche de travail" -#: pcbnew/onrightclick.cpp:363 -#: pcbnew/onrightclick.cpp:436 +#: pcbnew/onrightclick.cpp:401 +#: pcbnew/onrightclick.cpp:474 msgid "Select Track Width" msgstr "Sélection Epais. Piste" -#: pcbnew/onrightclick.cpp:367 +#: pcbnew/onrightclick.cpp:405 msgid "Select layer pair for vias" msgstr "Selection couple de couches pour Vias" -#: pcbnew/onrightclick.cpp:384 +#: pcbnew/onrightclick.cpp:422 msgid "Footprint documentation" msgstr "Documentation des modules" -#: pcbnew/onrightclick.cpp:394 +#: pcbnew/onrightclick.cpp:432 msgid "Glob Move and Place" msgstr "Move et Place Globaux" -#: pcbnew/onrightclick.cpp:396 +#: pcbnew/onrightclick.cpp:434 msgid "Unlock All Modules" msgstr "Déverrouiller tous les Modules" -#: pcbnew/onrightclick.cpp:398 +#: pcbnew/onrightclick.cpp:436 msgid "Lock All Modules" msgstr "Verrouiller tous les Modules" -#: pcbnew/onrightclick.cpp:401 +#: pcbnew/onrightclick.cpp:439 msgid "Move All Modules" msgstr "Déplace tous les Modules" -#: pcbnew/onrightclick.cpp:402 +#: pcbnew/onrightclick.cpp:440 msgid "Move New Modules" msgstr "Déplace nouveaux Modules" -#: pcbnew/onrightclick.cpp:404 +#: pcbnew/onrightclick.cpp:442 msgid "Autoplace All Modules" msgstr "Autoplace Tous Modules" -#: pcbnew/onrightclick.cpp:405 +#: pcbnew/onrightclick.cpp:443 msgid "Autoplace New Modules" msgstr "AutoPlace nouveaux Modules" -#: pcbnew/onrightclick.cpp:406 +#: pcbnew/onrightclick.cpp:444 msgid "Autoplace Next Module" msgstr "Autoplace Module suivant" -#: pcbnew/onrightclick.cpp:409 +#: pcbnew/onrightclick.cpp:447 msgid "Orient All Modules" msgstr "Oriente Tous Modules" -#: pcbnew/onrightclick.cpp:416 +#: pcbnew/onrightclick.cpp:454 msgid "Global Autoroute" msgstr "Autoroutage global" -#: pcbnew/onrightclick.cpp:418 +#: pcbnew/onrightclick.cpp:456 msgid "Select layer pair" msgstr "Selection couple de couches" -#: pcbnew/onrightclick.cpp:420 +#: pcbnew/onrightclick.cpp:458 msgid "Autoroute All Modules" msgstr "Autoroute Tous Modules" -#: pcbnew/onrightclick.cpp:422 +#: pcbnew/onrightclick.cpp:460 msgid "Reset Unrouted" msgstr "Réinit Non routés" -#: pcbnew/onrightclick.cpp:427 +#: pcbnew/onrightclick.cpp:465 msgid "Global AutoRouter" msgstr "Autorouteur Global" -#: pcbnew/onrightclick.cpp:429 +#: pcbnew/onrightclick.cpp:467 msgid "Read Global AutoRouter Data" msgstr "Lire Données de L'autorouteur global" -#: pcbnew/onrightclick.cpp:466 +#: pcbnew/onrightclick.cpp:504 msgid "Flip Block (alt + drag mouse)" msgstr "Inversion Bloc (alt + drag mouse)" -#: pcbnew/onrightclick.cpp:489 +#: pcbnew/onrightclick.cpp:527 msgid "Drag Via" msgstr "Drag Via" -#: pcbnew/onrightclick.cpp:493 +#: pcbnew/onrightclick.cpp:531 msgid "Edit Via" msgstr "Edit Via" -#: pcbnew/onrightclick.cpp:495 +#: pcbnew/onrightclick.cpp:533 msgid "Set via hole to Default" msgstr "Ajuste perçage via à défaut" -#: pcbnew/onrightclick.cpp:497 +#: pcbnew/onrightclick.cpp:535 msgid "Set via hole to alt value" msgstr "Ajuste perçage via à valeur alternative" -#: pcbnew/onrightclick.cpp:499 +#: pcbnew/onrightclick.cpp:537 msgid "Set the via hole alt value" msgstr "Ajuste la valeur alt. perçage via" -#: pcbnew/onrightclick.cpp:501 +#: pcbnew/onrightclick.cpp:539 msgid "Export Via hole to alt value" msgstr "Exporte perçage via à valeur alt." -#: pcbnew/onrightclick.cpp:503 +#: pcbnew/onrightclick.cpp:541 msgid "Export via hole to others id vias" msgstr "Exporte perçage via aux autres semblables." -#: pcbnew/onrightclick.cpp:505 +#: pcbnew/onrightclick.cpp:543 msgid "Set ALL via holes to default" msgstr "Ajuste perçage TOUTES vias au défaut" -#: pcbnew/onrightclick.cpp:518 +#: pcbnew/onrightclick.cpp:556 msgid "Move Node" msgstr "Déplace Noeud" -#: pcbnew/onrightclick.cpp:523 +#: pcbnew/onrightclick.cpp:561 msgid "Drag Segments, keep slope" msgstr "Drag Segments, garder direction" -#: pcbnew/onrightclick.cpp:525 +#: pcbnew/onrightclick.cpp:563 msgid "Drag Segment" msgstr "Drag Segment" -#: pcbnew/onrightclick.cpp:528 +#: pcbnew/onrightclick.cpp:566 msgid "Move Segment" msgstr "Déplace Segment" -#: pcbnew/onrightclick.cpp:531 +#: pcbnew/onrightclick.cpp:569 msgid "Break Track" msgstr "Briser piste" -#: pcbnew/onrightclick.cpp:538 +#: pcbnew/onrightclick.cpp:576 msgid "Place Node" msgstr "Place noeud" -#: pcbnew/onrightclick.cpp:545 +#: pcbnew/onrightclick.cpp:583 msgid "End Track" msgstr "Terminer Piste" -#: pcbnew/onrightclick.cpp:548 +#: pcbnew/onrightclick.cpp:586 msgid "Place Via" msgstr "Place Via" -#: pcbnew/onrightclick.cpp:555 +#: pcbnew/onrightclick.cpp:593 msgid "Change Width" msgstr "Change Largeur" -#: pcbnew/onrightclick.cpp:557 +#: pcbnew/onrightclick.cpp:595 msgid "Edit Segment" msgstr "Edit Segment" -#: pcbnew/onrightclick.cpp:561 +#: pcbnew/onrightclick.cpp:599 msgid "Edit Track" msgstr "Editer Piste" -#: pcbnew/onrightclick.cpp:563 +#: pcbnew/onrightclick.cpp:601 msgid "Edit Net" msgstr "Edit Net" -#: pcbnew/onrightclick.cpp:565 +#: pcbnew/onrightclick.cpp:603 msgid "Edit ALL Tracks and Vias" msgstr "Editer TOUTES Pistes et Vias" -#: pcbnew/onrightclick.cpp:567 +#: pcbnew/onrightclick.cpp:605 msgid "Edit ALL Vias (no track)" msgstr "Editer TOUTES Vias (pas les pistes)" -#: pcbnew/onrightclick.cpp:569 +#: pcbnew/onrightclick.cpp:607 msgid "Edit ALL Tracks (no via)" msgstr "Editer TOUTES Pistes (pas les vias)" -#: pcbnew/onrightclick.cpp:576 +#: pcbnew/onrightclick.cpp:614 msgid "Delete Segment" msgstr "SupprimerSegment" -#: pcbnew/onrightclick.cpp:581 +#: pcbnew/onrightclick.cpp:619 msgid "Delete Track" msgstr "Effacer Piste" -#: pcbnew/onrightclick.cpp:585 +#: pcbnew/onrightclick.cpp:623 msgid "Delete Net" msgstr "Supprimer Net" -#: pcbnew/onrightclick.cpp:590 +#: pcbnew/onrightclick.cpp:628 msgid "Set Flags" msgstr "Ajust. Flags" -#: pcbnew/onrightclick.cpp:591 +#: pcbnew/onrightclick.cpp:629 msgid "Locked: Yes" msgstr "Verrou: Oui" -#: pcbnew/onrightclick.cpp:592 +#: pcbnew/onrightclick.cpp:630 msgid "Locked: No" msgstr "Verrou: Non" -#: pcbnew/onrightclick.cpp:602 +#: pcbnew/onrightclick.cpp:640 msgid "Track Locked: Yes" msgstr "Piste verrouillée: Oui" -#: pcbnew/onrightclick.cpp:603 +#: pcbnew/onrightclick.cpp:641 msgid "Track Locked: No" msgstr "Piste verrouillée: Non" -#: pcbnew/onrightclick.cpp:605 +#: pcbnew/onrightclick.cpp:643 msgid "Net Locked: Yes" msgstr "Net verrouillé: Oui" -#: pcbnew/onrightclick.cpp:606 +#: pcbnew/onrightclick.cpp:644 msgid "Net Locked: No" msgstr "Net verrouillé: Non" -#: pcbnew/onrightclick.cpp:628 -#: pcbnew/onrightclick.cpp:673 +#: pcbnew/onrightclick.cpp:666 #: pcbnew/onrightclick.cpp:711 -#: pcbnew/onrightclick.cpp:770 +#: pcbnew/onrightclick.cpp:749 +#: pcbnew/onrightclick.cpp:808 msgid "Move" msgstr "Move" -#: pcbnew/onrightclick.cpp:631 -#: pcbnew/onrightclick.cpp:713 +#: pcbnew/onrightclick.cpp:669 +#: pcbnew/onrightclick.cpp:751 msgid "Drag" msgstr "Drag" -#: pcbnew/onrightclick.cpp:635 +#: pcbnew/onrightclick.cpp:673 msgid "Rotate +" msgstr "Rotation +" -#: pcbnew/onrightclick.cpp:639 +#: pcbnew/onrightclick.cpp:677 #: eeschema/onrightclick.cpp:300 msgid "Rotate -" msgstr "Rotation -" -#: pcbnew/onrightclick.cpp:640 +#: pcbnew/onrightclick.cpp:678 msgid "Flip" msgstr "Change côté" -#: pcbnew/onrightclick.cpp:730 +#: pcbnew/onrightclick.cpp:768 msgid "delete" msgstr "Effacer" -#: pcbnew/onrightclick.cpp:737 +#: pcbnew/onrightclick.cpp:775 msgid "Autoroute Pad" msgstr "Autoroute Pad" -#: pcbnew/onrightclick.cpp:738 +#: pcbnew/onrightclick.cpp:776 msgid "Autoroute Net" msgstr "Autoroute Net" +#: pcbnew/onleftclick.cpp:168 +msgid "Graphic not autorized on Copper layers" +msgstr "Graphique non autorisé sur couches cuivre" + +#: pcbnew/onleftclick.cpp:191 +msgid "Tracks on Copper layers only " +msgstr "Pistes sur couches cuivre seulement" + +#: pcbnew/onleftclick.cpp:267 +msgid "Cotation not autorized on Copper layers" +msgstr "Cotation non autorisée sur couches cuivre" + #: pcbnew/menubarmodedit.cpp:40 msgid "Sizes and Widths" msgstr "Dims. et Epaiss." +#: pcbnew/globaleditpad.cpp:76 +msgid "Pads Global Edit" +msgstr "Pads: Edition globale" + +#: pcbnew/globaleditpad.cpp:94 +msgid "Pad Settings..." +msgstr "Caract pad ..." + +#: pcbnew/globaleditpad.cpp:99 +msgid "Change Module" +msgstr "Change module" + +#: pcbnew/globaleditpad.cpp:104 +msgid "Change Id Modules" +msgstr "Change Modules ident." + +#: pcbnew/globaleditpad.cpp:114 +msgid "Pad Filter :" +msgstr "Filtre Pad :" + +#: pcbnew/globaleditpad.cpp:118 +msgid "Shape Filter" +msgstr "Filtre sur forme" + +#: pcbnew/globaleditpad.cpp:122 +msgid "Layer Filter" +msgstr "Filtre sur couche" + +#: pcbnew/globaleditpad.cpp:126 +msgid "Orient Filter" +msgstr "Filtre Orientation" + +#: pcbnew/globaleditpad.cpp:132 +msgid "Change Items :" +msgstr "Eléments à changer:" + +#: pcbnew/globaleditpad.cpp:136 +msgid "Change Size" +msgstr "Change Taille" + +#: pcbnew/globaleditpad.cpp:140 +msgid "Change Shape" +msgstr "Change Forme" + +#: pcbnew/globaleditpad.cpp:144 +msgid "Change Drill" +msgstr "Change Perçage" + +#: pcbnew/globaleditpad.cpp:148 +msgid "Change Orient" +msgstr "Change Orientation" + #: pcbnew/class_board.cpp:317 msgid "Nodes" msgstr "Nodes" @@ -4722,18 +4678,6 @@ msgstr "Larg. piste: %s Diam Vias : %s" msgid "Drc error, cancelled" msgstr "Erreur DRC, annulation" -#: pcbnew/onleftclick.cpp:173 -msgid "Graphic not autorized on Copper layers" -msgstr "Graphique non autorisé sur couches cuivre" - -#: pcbnew/onleftclick.cpp:196 -msgid "Tracks on Copper layers only " -msgstr "Pistes sur couches cuivre seulement" - -#: pcbnew/onleftclick.cpp:272 -msgid "Cotation not autorized on Copper layers" -msgstr "Cotation non autorisée sur couches cuivre" - #: pcbnew/cleaningoptions_dialog.cpp:146 msgid "Static" msgstr "Static" @@ -4769,7 +4713,6 @@ msgid "Display Polar Coord" msgstr "Affichage coord Polaires" #: pcbnew/dialog_general_options.cpp:273 -#: eeschema/options.cpp:187 #: eeschema/dialog_options.cpp:248 #: gerbview/options.cpp:185 msgid "Units" @@ -4834,7 +4777,6 @@ msgid "Segments 45 Only" msgstr "Segments 45 seulement" #: pcbnew/dialog_general_options.cpp:341 -#: eeschema/options.cpp:124 #: eeschema/dialog_options.cpp:239 msgid "Auto PAN" msgstr "Auto PAN" @@ -5268,80 +5210,6 @@ msgstr "Un fichier %s existe, Le charger ?" msgid "Ok to cleanup this sheet" msgstr "Ok pour nettoyer cette feuille" -#: eeschema/options.cpp:96 -#: eeschema/eelayer.cpp:282 -msgid "EESchema Preferences" -msgstr "EESchema Préférences" - -#: eeschema/options.cpp:119 -#: eeschema/dialog_options.cpp:212 -msgid "Show grid" -msgstr "Afficher grille" - -#: eeschema/options.cpp:130 -#: eeschema/dialog_options.cpp:217 -msgid "Normal (50 mils)" -msgstr "Normal (50 mils)" - -#: eeschema/options.cpp:131 -#: eeschema/dialog_options.cpp:218 -msgid "Small (25 mils)" -msgstr "Petit (25 mils)" - -#: eeschema/options.cpp:132 -#: eeschema/dialog_options.cpp:219 -msgid "Very small (10 mils)" -msgstr "Très petit (10 mils)" - -#: eeschema/options.cpp:133 -#: eeschema/dialog_options.cpp:220 -msgid "Special (5 mils)" -msgstr "Special (5 mils)" - -#: eeschema/options.cpp:134 -#: eeschema/dialog_options.cpp:221 -msgid "Special (2 mils)" -msgstr "Special (2 mils)" - -#: eeschema/options.cpp:135 -#: eeschema/dialog_options.cpp:222 -msgid "Special (1 mil)" -msgstr "Special (1 mil)" - -#: eeschema/options.cpp:138 -#: eeschema/dialog_options.cpp:224 -msgid "Grid Size" -msgstr "Dim Grille" - -#: eeschema/options.cpp:177 -#: eeschema/dialog_options.cpp:230 -msgid "Show alls" -msgstr "Tout Afficher" - -#: eeschema/options.cpp:179 -#: eeschema/dialog_options.cpp:232 -msgid "Show pins" -msgstr "Monter Pins" - -#: eeschema/options.cpp:194 -#: eeschema/dialog_options.cpp:256 -msgid "Horiz/Vertical" -msgstr "Horiz/Vertical" - -#: eeschema/options.cpp:196 -#: eeschema/dialog_options.cpp:259 -msgid "Wires - Bus orient" -msgstr "Fils-Bus Orient" - -#: eeschema/options.cpp:211 -msgid "Delta Step" -msgstr "Incrément" - -#: eeschema/options.cpp:216 -#: eeschema/dialog_options.cpp:300 -msgid "Delta Label:" -msgstr "Incrément Label:" - #: eeschema/sheetlab.cpp:72 msgid "PinSheet Properties:" msgstr "Propriétés des Pins de Hierarchie" @@ -5374,14 +5242,66 @@ msgstr "Incr msgid "Draw Options:" msgstr "Options de tracé:" +#: eeschema/dialog_options.cpp:212 +msgid "Show grid" +msgstr "Afficher grille" + +#: eeschema/dialog_options.cpp:217 +msgid "Normal (50 mils)" +msgstr "Normal (50 mils)" + +#: eeschema/dialog_options.cpp:218 +msgid "Small (25 mils)" +msgstr "Petit (25 mils)" + +#: eeschema/dialog_options.cpp:219 +msgid "Very small (10 mils)" +msgstr "Très petit (10 mils)" + +#: eeschema/dialog_options.cpp:220 +msgid "Special (5 mils)" +msgstr "Special (5 mils)" + +#: eeschema/dialog_options.cpp:221 +msgid "Special (2 mils)" +msgstr "Special (2 mils)" + +#: eeschema/dialog_options.cpp:222 +msgid "Special (1 mil)" +msgstr "Special (1 mil)" + +#: eeschema/dialog_options.cpp:224 +msgid "Grid Size" +msgstr "Dim Grille" + +#: eeschema/dialog_options.cpp:230 +msgid "Show alls" +msgstr "Tout Afficher" + +#: eeschema/dialog_options.cpp:232 +msgid "Show pins" +msgstr "Monter Pins" + #: eeschema/dialog_options.cpp:245 msgid "millimeter" msgstr "millimetre" +#: eeschema/dialog_options.cpp:256 +msgid "Horiz/Vertical" +msgstr "Horiz/Vertical" + +#: eeschema/dialog_options.cpp:259 +msgid "Wires - Bus orient" +msgstr "Fils-Bus Orient" + #: eeschema/dialog_options.cpp:284 msgid "Auto increment params" msgstr "Auto increment params" +#: eeschema/dialog_options.cpp:300 +msgid "Delta Label:" +msgstr "Incrément Label:" + #: eeschema/dialog_options.cpp:308 #: eeschema/plotps.cpp:227 msgid "Default Line Width" @@ -6394,6 +6314,10 @@ msgstr "ERC Warning" msgid "Erc Error" msgstr "ERC Erreur" +#: eeschema/eelayer.cpp:282 +msgid "EESchema Preferences" +msgstr "EESchema Préférences" + #: eeschema/eelayer.cpp:367 msgid "White Background" msgstr "Fond Blanc" @@ -8212,11 +8136,6 @@ msgstr "&Pad plein" msgid "Save Cfg..." msgstr "Sauver config..." -#: cvpcb/dialog_display_options.cpp:199 -#: gerbview/set_color.cpp:255 -msgid "Apply" -msgstr "Appliquer" - #: cvpcb/tool_cvpcb.cpp:35 msgid "Open Netlist" msgstr "Lire Netliste" @@ -8785,8 +8704,7 @@ msgstr "Effacer Zones ?" msgid "Delete Layer %d" msgstr "Effacer Couche %d" -#: gerbview/set_color.cpp:149 -#, fuzzy +#: gerbview/set_color.cpp:151 msgid "GerbView Layer Colors:" msgstr "Gerbview: Couleur des couches" @@ -9215,6 +9133,10 @@ msgstr "Ne peut trouver le visualisateur Pdf %s" msgid "Colors" msgstr "Couleurs" +#: common/confirm.cpp:97 +msgid "Infos:" +msgstr "Infos:" + #: common/common.cpp:48 msgid " (\"):" msgstr " (\"):" @@ -9335,10 +9257,6 @@ msgstr "Contour Pcb" msgid "--- " msgstr "--- " -#: common/confirm.cpp:97 -msgid "Infos:" -msgstr "Infos:" - #: common/block_commande.cpp:56 msgid "Block Move" msgstr "Move Bloc" @@ -9891,6 +9809,54 @@ msgstr "Options g msgid "TextMod properties" msgstr "Propriétés du Texte sur Module" +#: pcbnew/set_color.h:5 +msgid "Copper Layers" +msgstr "Couches Cuivre." + +#: pcbnew/set_color.h:139 +msgid "Tech Layers" +msgstr "Couches Tech." + +#: pcbnew/set_color.h:278 +msgid "Ratsnest" +msgstr "Chevelu" + +#: pcbnew/set_color.h:287 +msgid "Pad Cu" +msgstr "Pad Cu" + +#: pcbnew/set_color.h:295 +msgid "Pad Cmp" +msgstr "Pad Cmp" + +#: pcbnew/set_color.h:303 +msgid "Text Module Cu" +msgstr "Texte Module Cu" + +#: pcbnew/set_color.h:311 +msgid "Text Module Cmp" +msgstr "Texte Module Cmp" + +#: pcbnew/set_color.h:319 +msgid "Text Module invisible" +msgstr "Texte Module invisible" + +#: pcbnew/set_color.h:327 +msgid "Anchors" +msgstr "Ancres" + +#: pcbnew/set_color.h:353 +msgid "Show Noconnect" +msgstr "Montrer Non Conn" + +#: pcbnew/set_color.h:362 +msgid "Show Modules Cmp" +msgstr "Afficher Modules Cmp" + +#: pcbnew/set_color.h:371 +msgid "Show Modules Cu" +msgstr "Afficher Modules Cu" + #: pcbnew/zones.h:54 msgid "Fill Zones Options" msgstr "Options de remplissage de Zone" diff --git a/pcbnew/class_board_item.cpp b/pcbnew/class_board_item.cpp index 8aa29f32f7..30d5d157a4 100644 --- a/pcbnew/class_board_item.cpp +++ b/pcbnew/class_board_item.cpp @@ -28,6 +28,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const wxString text; const BOARD_ITEM* item = this; EQUIPOT* net; + D_PAD * pad; switch( item->Type() ) { @@ -42,8 +43,17 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const break; case TYPEPAD: - text << _( "Pad" ) << wxT( " " ) << ( (D_PAD*) item )->ReturnStringPadName() << _( " of " ) - << ( (MODULE*) GetParent() )->GetReference(); + pad = (D_PAD *) this; + text << _( "Pad" ) << wxT( " \"" ) << pad->ReturnStringPadName() + << wxT( "\" (" ); + if ( (pad->m_Masque_Layer & ALL_CU_LAYERS) == ALL_CU_LAYERS ) + text << _("all copper layers"); + else if( (pad->m_Masque_Layer & CUIVRE_LAYER) == CUIVRE_LAYER ) + text << _("copper layers"); + else if( (pad->m_Masque_Layer & CMP_LAYER) == CMP_LAYER ) + text << _("cmp layers"); + else text << _("???"); + text << _( ") of " ) << ( (MODULE*) GetParent() )->GetReference(); break; case TYPEDRAWSEGMENT: diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index 5b0ad76827..c6d0634dc0 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -888,7 +888,7 @@ void D_PAD::Display_Infos( WinEDA_DrawFrame* frame ) pos += 4; Affiche_1_Parametre( frame, pos, _( "Net" ), m_Netname, DARKCYAN ); - /* pour mise au point (peut etre supprim� : Affichage du numero de Net et sous net */ + /* For test and debug only: display m_physical_connexion and m_logical_connexion */ pos += 10; #if 0 Line.Printf( wxT( "%d.%d " ), m_logical_connexion, m_physical_connexion ); diff --git a/pcbnew/onrightclick.cpp b/pcbnew/onrightclick.cpp index b51e4992eb..b0fed0eaab 100644 --- a/pcbnew/onrightclick.cpp +++ b/pcbnew/onrightclick.cpp @@ -173,27 +173,26 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) // printf( "cursor=(%d, %d) select=(%d,%d)\n", cursorPos.x, cursorPos.y, selectPos.x, selectPos.y ); - /* If not editing a track, and there is no selected item or the right click - happened at a position other than where the selection was made. - We cannot call PcbGeneralLocateAndDisplay() when dragging a track because - editrack.cpp's void Exit_Editrack( WinEDA_DrawPanel* Panel, wxDC* DC ) - uses GetCurItem(), thinking it is an aborted track, yet after calling - PcbGeneralLocateAndDisplay(), GetCurItem() is any arbitrary BOARD_ITEM, - not the aborted track. - */ - if( ShowNewTrackWhenMovingCursor != DrawPanel->ManageCurseur - && ( !item || cursorPos != selectPos ) ) - { - DrawPanel->m_AbortRequest = false; - item = PcbGeneralLocateAndDisplay(); - if( DrawPanel->m_AbortRequest ) - { - DrawPanel->CursorOn( &dc ); - return false; - } - - // SetCurItem( item ); no, PcbGeneralLocateAndDisplay() does this - } + /* We can reselect an other item only if there are no item being edited + * because ALL moving functions use GetCurItem(), + * therefore GetCurItem() must return the same item during moving. + * We know an item is moving if ( item && (item->m_Flags != 0)) is true + * and after calling PcbGeneralLocateAndDisplay(), GetCurItem() is any arbitrary BOARD_ITEM, + * not the current editen item. + */ + if ( ! item || (item->m_Flags == 0) ) + { + if( !item || cursorPos != selectPos ) // Filter + { + DrawPanel->m_AbortRequest = false; + item = PcbGeneralLocateAndDisplay(); + if( DrawPanel->m_AbortRequest ) + { + DrawPanel->CursorOn( &dc ); + return false; + } + } + } #else diff --git a/pcbnew/pcbpiste.cpp.notused b/pcbnew/pcbpiste.cpp.notused deleted file mode 100644 index adbcb28e92..0000000000 --- a/pcbnew/pcbpiste.cpp.notused +++ /dev/null @@ -1,305 +0,0 @@ -/******************************************************/ -/* Fonctions diverses (swap..) relatives au pistes */ -/* et fonctions de test */ -/******************************************************/ - -/* Fichier PCBPISTE.CPP */ - -#include "fctsys.h" -#include "gr_basic.h" -#include "common.h" -#include "pcbnew.h" -#include "autorout.h" - -#include "protos.h" - -/* Variables locales */ -static int New_Layer[32]; - -enum swap_layer_id { - ID_SWAP_LAYER_EXECUTE = 1800, - ID_SWAP_LAYER_CANCEL, - ID_SWAP_LAYER_BUTTON_SELECT, - ID_SWAP_LAYER_DESELECT, - ID_SWAP_LAYER_SELECT -}; - - -/***********************************************/ -/* classe pour la frame de selection de layers */ -/***********************************************/ - -class WinEDA_SwapLayerFrame : public wxDialog -{ -private: - WinEDA_BasePcbFrame* m_Parent; - wxRadioBox* m_LayerList; - -public: - - // Constructor and destructor - WinEDA_SwapLayerFrame( WinEDA_BasePcbFrame * parent ); - ~WinEDA_SwapLayerFrame() { }; - -private: - void Sel_Layer( wxCommandEvent& event ); - void Cancel( wxCommandEvent& event ); - void Execute( wxCommandEvent& event ); - - DECLARE_EVENT_TABLE() -}; -/* Table des evenements pour WinEDA_SwapLayerFrame */ -BEGIN_EVENT_TABLE( WinEDA_SwapLayerFrame, wxDialog ) -EVT_BUTTON( ID_SWAP_LAYER_EXECUTE, WinEDA_SwapLayerFrame::Execute ) -EVT_BUTTON( ID_SWAP_LAYER_CANCEL, WinEDA_SwapLayerFrame::Cancel ) -EVT_BUTTON( ID_SWAP_LAYER_DESELECT, WinEDA_SwapLayerFrame::Sel_Layer ) -EVT_BUTTON( ID_SWAP_LAYER_BUTTON_SELECT, WinEDA_SwapLayerFrame::Sel_Layer ) -EVT_RADIOBOX( ID_SWAP_LAYER_SELECT, WinEDA_SwapLayerFrame::Sel_Layer ) -END_EVENT_TABLE() - - -WinEDA_SwapLayerFrame::WinEDA_SwapLayerFrame( WinEDA_BasePcbFrame* parent ) : - wxDialog( parent, -1, _( "Swap Layers:" ), wxPoint( -1, -1 ), - wxSize( 470, 450 ), DIALOG_STYLE ) -{ -#define START_Y 15 - wxButton* Button; - int ii; - wxPoint pos; - wxString g_Layer_Name_Pair[32]; - wxSize winsize; - - m_Parent = parent; - SetFont( *g_DialogFont ); - - for( ii = 0; ii < NB_LAYERS; ii++ ) - { - g_Layer_Name_Pair[ii] = ReturnPcbLayerName( ii ) + wxT( " -> " ) + _( "No Change" ); - } - - pos.x = 5; pos.y = START_Y; - m_LayerList = new wxRadioBox( this, ID_SWAP_LAYER_SELECT, _( "Layers" ), - pos, wxSize( -1, - -1 ), 29, g_Layer_Name_Pair, 16, wxRA_SPECIFY_ROWS ); - - winsize.y = m_LayerList->GetRect().GetBottom(); - - pos.x = m_LayerList->GetRect().GetRight() + 12; - Button = new wxButton( this, ID_SWAP_LAYER_CANCEL, - _( "Cancel" ), pos ); - - Button->SetForegroundColour( *wxRED ); - winsize.x = MAX( winsize.x, Button->GetRect().GetRight() ); - - pos.y += Button->GetSize().y + 5; - Button = new wxButton( this, ID_SWAP_LAYER_EXECUTE, - _( "OK" ), pos ); - - Button->SetForegroundColour( *wxBLUE ); - winsize.x = MAX( winsize.x, Button->GetRect().GetRight() ); - - pos.y += Button->GetSize().y + 15; - Button = new wxButton( this, ID_SWAP_LAYER_DESELECT, - _( "Deselect" ), pos ); - - Button->SetForegroundColour( wxColour( 0, 100, 0 ) ); - winsize.x = MAX( winsize.x, Button->GetRect().GetRight() ); - - pos.y += Button->GetSize().y + 5; - Button = new wxButton( this, ID_SWAP_LAYER_BUTTON_SELECT, - _( "Select" ), pos ); - - Button->SetForegroundColour( wxColour( 0, 100, 100 ) ); - winsize.x = MAX( winsize.x, Button->GetRect().GetRight() ); - - winsize.x += 10; winsize.y += 10; - SetClientSize( winsize ); -} - - -/***************************************************************/ -void WinEDA_SwapLayerFrame::Sel_Layer( wxCommandEvent& event ) -/***************************************************************/ -{ - int ii, jj; - - ii = m_LayerList->GetSelection(); - - switch( event.GetId() ) - { - case ID_SWAP_LAYER_DESELECT: - if( New_Layer[ii] != -1 ) - { - New_Layer[ii] = -1; - m_LayerList->SetString( ii, ReturnPcbLayerName( ii ) + - + wxT( " -> " ) + _( "No Change" ) ); - } - break; - - case ID_SWAP_LAYER_BUTTON_SELECT: - case ID_SWAP_LAYER_SELECT: - jj = m_Parent->SelectLayer( ii, -1, -1 ); - if( (jj < 0) || (jj >= 29) ) - return; - - if( ii != jj ) - { - New_Layer[ii] = jj; - m_LayerList->SetString( ii, - ReturnPcbLayerName( ii ) + wxT( " -> " ) + - ReturnPcbLayerName( jj ) ); - } - break; - } -} - - -/*********************************************************/ -void WinEDA_SwapLayerFrame::Cancel( wxCommandEvent& event ) -/*********************************************************/ -{ - EndModal( -1 ); -} - - -/*********************************************************/ -void WinEDA_SwapLayerFrame::Execute( wxCommandEvent& event ) -/*********************************************************/ -{ - EndModal( 1 ); -} - - -/********************************************************/ -void WinEDA_PcbFrame::Swap_Layers( wxCommandEvent& event ) -/********************************************************/ -/* Swap layers */ -{ - int ii, jj; - TRACK* pt_segm; - DRAWSEGMENT* pt_drawsegm; - EDA_BaseStruct* PtStruct; - - - /* Init default values */ - for( ii = 0; ii < 32; ii++ ) - New_Layer[ii] = -1; - - WinEDA_SwapLayerFrame* frame = new WinEDA_SwapLayerFrame( this ); - - ii = frame->ShowModal(); frame->Destroy(); - - if( ii != 1 ) - return; - - /* Modifications des pistes */ - pt_segm = (TRACK*) m_Pcb->m_Track; - for( ; pt_segm != NULL; pt_segm = (TRACK*) pt_segm->Pnext ) - { - m_CurrentScreen->SetModify(); - if( pt_segm->Type() == TYPEVIA ) - { - SEGVIA* Via = (SEGVIA*) pt_segm; - if( Via->Shape() == VIA_NORMALE ) - continue; - int top_layer, bottom_layer; - Via->ReturnLayerPair( &top_layer, &bottom_layer ); - if( New_Layer[bottom_layer] >= 0 ) - bottom_layer = New_Layer[bottom_layer]; - if( New_Layer[top_layer] >= 0 ) - top_layer = New_Layer[top_layer]; - Via->SetLayerPair( top_layer, bottom_layer ); - } - else - { - jj = pt_segm->m_Layer; - if( New_Layer[jj] >= 0 ) - pt_segm->m_Layer = New_Layer[jj]; - } - } - - /* Modifications des zones */ - pt_segm = (TRACK*) m_Pcb->m_Zone; - for( ; pt_segm != NULL; pt_segm = (TRACK*) pt_segm->Pnext ) - { - m_CurrentScreen->SetModify(); - jj = pt_segm->m_Layer; - if( New_Layer[jj] >= 0 ) - pt_segm->m_Layer = New_Layer[jj]; - } - - /* Modifications des autres segments */ - PtStruct = m_Pcb->m_Drawings; - for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext ) - { - if( PtStruct->Type() == TYPEDRAWSEGMENT ) - { - m_CurrentScreen->SetModify(); - pt_drawsegm = (DRAWSEGMENT*) PtStruct; - jj = pt_drawsegm->m_Layer; - if( New_Layer[jj] >= 0 ) - pt_drawsegm->m_Layer = New_Layer[jj]; - } - } - - DrawPanel->Refresh( TRUE ); -} - - -/*********************************************************/ -void WinEDA_PcbFrame::Liste_Equipot( wxCommandEvent& event ) -/*********************************************************/ -{ - EQUIPOT* Equipot; - wxString msg; - WinEDA_TextFrame* List; - int ii, jj; - - msg = wxT( "*" ); - Get_Message( _( "Filter for net names:" ), msg, this ); - if( msg.IsEmpty() ) - return; - - List = new WinEDA_TextFrame( this, _( "List Nets" ) ); - - Equipot = (EQUIPOT*) m_Pcb->m_Equipots; - for( ; Equipot != NULL; Equipot = (EQUIPOT*) Equipot->Pnext ) - { - wxString Line; - /* calcul adr relative du nom de la pastille reference de la piste */ - if( !WildCompareString( msg, Equipot->m_Netname, FALSE ) ) - continue; - - Line.Printf( wxT( "net_code = %3.3d [%.16s] " ), Equipot->m_NetCode, - Equipot->m_Netname.GetData() ); - List->Append( Line ); - } - - ii = List->ShowModal(); List->Destroy(); - if( ii < 0 ) - return; - - /* Recherche du numero de net rellement selectionné */ - Equipot = (EQUIPOT*) m_Pcb->m_Equipots; - for( jj = 0; Equipot != NULL; Equipot = (EQUIPOT*) Equipot->Pnext ) - { - /* calcul adr relative du nom de la pastille reference de la piste */ - if( !WildCompareString( msg, Equipot->m_Netname, FALSE ) ) - continue; - if( ii == jj ) - { - ii = Equipot->m_NetCode; - break; - } - jj++; - } - - wxClientDC dc( DrawPanel ); - - DrawPanel->PrepareGraphicContext( &dc ); - - if( g_HightLigt_Status ) - Hight_Light( &dc ); - g_HightLigth_NetCode = ii; - Hight_Light( &dc ); -} diff --git a/pcbnew/ratsnest.cpp b/pcbnew/ratsnest.cpp index 76b0e1328c..6c4becb344 100644 --- a/pcbnew/ratsnest.cpp +++ b/pcbnew/ratsnest.cpp @@ -1,9 +1,7 @@ -/************************************/ -/**** editeur de PCB ****/ -/* traitement du Chevelu (Rastnest) */ -/************************************/ - -/* Fichier RATSNEST.CPP */ +/***********************/ +/**** ratsnest.cpp ****/ +/* Ratsnets functions */ +/***********************/ #include "fctsys.h" #include "gr_basic.h" @@ -14,39 +12,110 @@ #include "protos.h" -/* variables locales */ -CHEVELU* g_pt_chevelu; -CHEVELU* local_liste_chevelu; // adresse de base du buffer des chevelus locaux -int nb_local_chevelu; // nbr de links du module en deplacement -int nb_pads_ref; // nbr de nodes du module en deplacement -int nb_pads_externes; // nbr de pads connectes au module en deplacement -bool DisplayRastnestInProgress; // autorise affichage chevelu en cours de calcul - // de celui-ci +/* exported variables */ +CHEVELU* g_pt_chevelu; +CHEVELU* local_liste_chevelu; // Buffer address for local ratsnest +// (ratnest relative to one footprint while moving it +int nb_local_chevelu; // link count (active ratnest count) for the footprint beeing moved +/* local variables */ +static int nb_pads_ref; // node count (node = pad with a net code) for the footprint beeing moved +static int nb_pads_externes; // Connected pads count ( pads which are +// in other footprints and connected to a pad of the footprint beeing moved +static bool DisplayRastnestInProgress; // Enable the display of the ratsnest during the ratsnest computations +/* Note about the ratsnest computation: + * Building the general ratsnest: + * I used the "lee algoritm". + * This is a 2 steps algoritm. + * the m_logical_connexion member of pads handle a "block number" or a "cluster number" + * initially, m_logical_connexion = 0 (pad not connected). + * Build_Board_Ratsnest( wxDC* DC ) Create this rastnest + * for each net: + * First: + * we create links (and therefore a logical block) between 2 pad. This is achieved by: + * search for a pad without link. + * search its nearest pad + * link these 2 pads (i.e. create a ratsnest item) + * the pads are grouped in a logical block ( a cluster). + * until no pad without link found. + * Each logical block has a number called block number, + * stored in m_logical_connexion member for each pad of the block. + * The first block has its block number = 1, the second is 2 ... + * the function to do thas is gen_rats_pad_to_pad() + * + * Secondly: + * The first pass created many logical blocks + * A block contains 2 or more pads. + * we create links between 2 block. This is achieved by: + * Test all pads in the first block, and search (for each pad) + * a neighboor in other blocks and compute the distance between pads, + * We select the pad pair which have the smallest distance. + * These 2 pads are linked (i.e. a new ratsnest item is created between thes 2 pads) + * and the 2 block are merged. + * Therefore the logical block 1 contains the initial block 1 "eats" the pads of the other block + * The computation is made until only one block is found. + * the function used is gen_rats_block_to_block() + * + * + * How existing and new tracks are handled: + * The complete rastnest (using the pad analysis) is computed. + * it is independant of the tracks and handle the "logical connections". + * It depends only on the footprints geometry (and the netlist), + * and must be computed only after a netlist read or a footprints geometry change. + * Each link (ratsnest) can only be INACTIVE (because pads are connected by a track) or ACTIVE (no tracks) + * + * After the complete rastnest is built, or when a track is added or deleted, + * we run an algorithm derived from the complete rastnest computation. + * it is much faster because it analyses only the existing rastnest and not all the pads list + * and determine only if an existing rastnest must be activated + * (no physical track exists) or not (a physical track exists) + * if a track is added or deleted only the corresponding net is tested. + * + * the m_logical_connexion member of pads is set to 0 (no blocks), and alls links are set to INACTIVE (ratsnest not show). + * Before running this fast lee algorithm, we create blocks (and their corresponding block number) + * by grouping pads connected by tracks. + * So, when tracks exists, the fast lee algorithm is started with some blocks already created. + * because the fast lee algorithm test only the ratsnest and does not search for + * nearest pads (this search was previously made) the online ratsnest can be done + * when a track is created without noticeable computing time + * First: + * for all links (in this step, all are inactive): + * search for a link which have 1 (or 2) pad having the m_logical_connexion member = 0. + * if found the link is set to ACTIVE (i.e. the ratsnest will be showed) and the pad is meged with the block + * or a new block is created ( see tst_rats_pad_to_pad() ). + * Secondly: + * blocks are tested: + * for all links we search if the 2 pads linkeds are in 2 different block. + * if yes, the link status is set to ACTIVE, and the 2 block are merged + * until only one block is found + * ( see tst_rats_block_to_block() ) + * + * + */ /******************************************************************************/ void WinEDA_BasePcbFrame::Compile_Ratsnest( wxDC* DC, bool display_status_pcb ) /******************************************************************************/ /* - * Génère le chevelu complet de la carte. - * Doit etre appelé APRES le calcul de connectivité - * Doit etre appelé apres changement de structure de la carte (modif - * de pads, de nets, de modules). - * - * Si display_status_pcb : affichage des résultats en bas d'ecran + * Create the entire board ratsnesr. + * Msut be called AFTER the connectivity computation + * Must be called after a board change (changes for + * pads, footprints or a read netlist ). + * + * if display_status_pcb != 0 : Display the computation results */ { wxString msg; DisplayRastnestInProgress = TRUE; - /* construction de la liste des coordonnées des pastilles */ - m_Pcb->m_Status_Pcb = 0; /* réinit total du calcul */ + /* Create the sorted pad list */ + m_Pcb->m_Status_Pcb = 0; /* we want a full ratnest computation, from the scratch */ build_liste_pads(); - - MsgPanel->EraseMsgBox(); /* effacement du bas d'ecran */ - + + MsgPanel->EraseMsgBox(); + msg.Printf( wxT( " %d" ), m_Pcb->m_NbPads ); Affiche_1_Parametre( this, 1, wxT( "pads" ), msg, RED ); @@ -54,15 +123,25 @@ void WinEDA_BasePcbFrame::Compile_Ratsnest( wxDC* DC, bool display_status_pcb ) Affiche_1_Parametre( this, 8, wxT( "Nets" ), msg, CYAN ); reattribution_reference_piste( display_status_pcb ); - - Build_Board_Ratsnest( DC ); /* calcul du chevelu general */ - - test_connexions( DC ); /* determine les blocks de pads connectés par - * les pistes existantes */ - Tst_Ratsnest( DC, 0 ); /* calcul du chevelu actif */ + /* Compute the full ratsnest + * which can be see like all the possible links or logical connections. + * some of thems are active (no track connected) and others are inactive (when track connect pads) + * This full ratsnest is not modified by track editing. + * It change only when a netlist is read, or footprints are modified + */ + Build_Board_Ratsnest( DC ); - // Reaffichage des chevelus actifs + /* Compute the pad connections due to the existing tracks (physical connections)*/ + test_connexions( DC ); + + /* Compute the active ratsnest, i.e. the unconnected links + * it is faster than Build_Board_Ratsnest() + * because many optimisations and computations are already made + */ + Tst_Ratsnest( DC, 0 ); + + // Redraw the active ratsnest ( if enabled ) if( g_Show_Ratsnest ) DrawGeneralRatsnest( DC, 0 ); @@ -74,11 +153,14 @@ void WinEDA_BasePcbFrame::Compile_Ratsnest( wxDC* DC, bool display_status_pcb ) /*****************************************************************/ static int tri_par_net( const void* o1, const void* o2 ) /****************************************************************/ -/* routine utilisee par la foncion QSORT */ + +/* Sort function used by QSORT + * Sort pads by net code + */ { LISTE_PAD* pt_ref = (LISTE_PAD*) o1; - LISTE_PAD* pt_compare = (LISTE_PAD*) o2; - + LISTE_PAD* pt_compare = (LISTE_PAD*) o2; + return (*pt_ref)->GetNet() - (*pt_compare)->GetNet(); } @@ -86,11 +168,14 @@ static int tri_par_net( const void* o1, const void* o2 ) /********************************************************/ static int sort_by_length( const void* o1, const void* o2 ) /********************************************************/ -/* routine de tri par longueur des chevelus utilisee par la foncion QSORT */ + +/* Sort function used by QSORT + * Sort ratsnest by lenght + */ { CHEVELU* ref = (CHEVELU*) o1; CHEVELU* compare = (CHEVELU*) o2; - + return ref->dist - compare->dist; } @@ -100,20 +185,20 @@ static int gen_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC, LISTE_PAD* pt_liste_pad, LISTE_PAD* pt_limite, int* nblinks ) /*****************************************************************************/ -/* - * Routine utilisee par Build_Board_Ratsnest() - * Routine generant le chevelu entre 2 blocks ( supposes du meme net ) - * la recherche est faite entre les pads du block 1 et les autres blocks - * le block n ( n > 1 ) est alors connecte au block 1 par leur 2 pads - * les plus proches. - * Entree : - * pt_chain_pad = adresse de debut de recherche - * pt_limite = adresse de fin de recherche (borne non comprise) - * Sortie: - * liste des chevelus ( structures) - * mise a jour de g_pt_chevelu a la 1ere case libre - * Retourne: - * nombre de blocks non connectes entre eux +/** + * Function used by Build_Board_Ratsnest() + * This function creates a rastsnet between two blocks ( which fit the same net ) + * A block is a group of pads already linked (by a previous ratsnest computation, or tracks) + * The search is made between the pads in block 1 (the reference block) and other blocks + * the block n ( n > 1 ) it connected to block 1 by their 2 nearest pads. + * When the block is found, it is merged with the block 1 + * the D_PAD member m_logical_connexion handles the block number + * @param pt_liste_pad = starting address (within the pad list) for search + * @param pt_limite = ending address (within the pad list) for search + * return in global variables: + * ratsnest list in buffer + * g_pt_chevelu updated to the first free memory location + * @return blocks not connected count */ { int dist_min, current_dist; @@ -123,39 +208,43 @@ static int gen_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC, LISTE_PAD* pt_liste_pad_block1 = NULL; LISTE_PAD* pt_start_liste; - pt_liste_pad_tmp = NULL; - + pt_liste_pad_tmp = NULL; + dist_min = 0x7FFFFFFF; - - pt_start_liste = pt_liste_pad; + + pt_start_liste = pt_liste_pad; if( DC ) GRSetDrawMode( DC, GR_XOR ); - /* Recherche du pad le plus proche du block 1 */ + /* Search the nearest pad from block 1 */ for( ; pt_liste_pad < pt_limite; pt_liste_pad++ ) { D_PAD* ref_pad = *pt_liste_pad; - + + /* search a pad which is in the block 1 */ if( ref_pad->m_logical_connexion != 1 ) continue; + /* pad is found, search its nearest neighbour in other blocks */ for( pt_liste_pad_aux = pt_start_liste; ; pt_liste_pad_aux++ ) { D_PAD* curr_pad = *pt_liste_pad_aux; - + if( pt_liste_pad_aux >= pt_limite ) break; - - if( curr_pad->m_logical_connexion == 1 ) + + if( curr_pad->m_logical_connexion == 1 ) // not in an other block continue; - /* Comparaison des distances des pastilles (calcul simplifie) */ + /* Compare distance between pads ("Manhattan" distance) */ current_dist = abs( curr_pad->m_Pos.x - ref_pad->m_Pos.x ) + abs( curr_pad->m_Pos.y - ref_pad->m_Pos.y ); - if( dist_min > current_dist ) + if( dist_min > current_dist ) // we have found a better pad pair { + // The tested block can be a good candidate for merging + // we memorise the "best" current values for merging current_num_block = curr_pad->m_logical_connexion; dist_min = current_dist; pt_liste_pad_tmp = pt_liste_pad_aux; @@ -164,9 +253,16 @@ static int gen_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC, } } - if( current_num_block > 1 ) /* le block n a ete connecte au bloc 1 */ + /* The reference block is labelled block 1. + * if current_num_block != 1 we have found an other block, and we must merge it + * with the reference block + * The link is made by the 2 nearest pads + */ + if( current_num_block > 1 ) { - /* le block n est fondu avec le bloc 1 : */ + /* The block n is merged with the bloc 1 : + * to do that, we set the m_logical_connexion member to 1 for all pads in block n + */ for( pt_liste_pad = pt_start_liste; pt_liste_pad < pt_limite; pt_liste_pad++ ) { if( (*pt_liste_pad)->m_logical_connexion == current_num_block ) @@ -175,6 +271,7 @@ static int gen_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC, pt_liste_pad = pt_liste_pad_block1; + /* Create the new ratsnet */ (*nblinks)++; g_pt_chevelu->SetNet( (*pt_liste_pad)->GetNet() ); g_pt_chevelu->status = CH_ACTIF | CH_VISIBLE; @@ -201,25 +298,26 @@ static int gen_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC, LISTE_PAD* pt_limite, int current_num_block, int* nblinks ) /*****************************************************************************/ -/* - * Routine utilisee par Build_Board_Ratsnest() - * Routine generant le chevelu entre 2 pads ( supposes du meme net ) - * la routine connecte 1 pad non deja connecte a un autre et crée donc un certqins nombre - * de blocks de pads liées par un chevelu - * Ces blocks sont donc constitués de 2 pads. - * - * Entree : - * pt_chain_pad = adresse de debut de recherche - * pt_limite = adresse de fin de recherche (borne non comprise) - * current_num_block = numero du dernier block de pads (constitué par les connexions - * de pistes existantes - * - * Sortie: - * liste des chevelus ( structures) - * mise a jour de g_pt_chevelu a la 1ere case libre - * - * Retourne: - * nombre de blocks crees (paquets de pads) +/** + * Function used by Build_Board_Ratsnest() + * this is the first pass of the lee algorithm + * This function creates the link (ratsnest) between 2 pads ( fitting the same net ) + * the function search for a first not connected pad + * and search its nearest neighboor + * Its creates a block if the 2 pads are not connected, or merge the unconnected pad to the existing block. + * These blocks include 2 pads and the 2 pads are linked by a ratsnest. + * + * @param pt_liste_pad = starting address in the pad buffer + * @param pt_limite = ending address + * @param current_num_block = Last existing block number de pads + * These block are created by the existing tracks analysis + * + * output: + * Ratsnest list + * g_pt_chevelu updated to the first free memory address + * + * @return: + * last block number used */ { int dist_min, current_dist; @@ -236,24 +334,24 @@ static int gen_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC, for( ; pt_liste_pad < pt_limite; pt_liste_pad++ ) { ref_pad = *pt_liste_pad; - - if( ref_pad->m_logical_connexion ) - continue; // Pad deja connecte - pt_liste_pad_tmp = NULL; + if( ref_pad->m_logical_connexion ) + continue; // Pad already connected + + pt_liste_pad_tmp = NULL; dist_min = 0x7FFFFFFF; for( pt_liste_pad_aux = pt_start_liste; ; pt_liste_pad_aux++ ) { if( pt_liste_pad_aux >= pt_limite ) break; - + if( pt_liste_pad_aux == pt_liste_pad ) continue; pad = *pt_liste_pad_aux; - - /* Comparaison des distances des pastilles (calcul simplifie) */ + + /* Compare distance between pads ("Manhattan" distance) */ current_dist = abs( pad->m_Pos.x - ref_pad->m_Pos.x ) + abs( pad->m_Pos.y - ref_pad->m_Pos.y ); @@ -268,20 +366,21 @@ static int gen_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC, { pad = *pt_liste_pad_tmp; - /* Mise a jour du numero de block ( ou de sous graphe ) */ - /* si aucun des 2 pads n'est deja connecte : creation d'un nouveau block */ + /* Update the block number + * if the 2 pads are not already created : a new block is created + */ if( (pad->m_logical_connexion == 0) && (ref_pad->m_logical_connexion == 0) ) { current_num_block++; pad->m_logical_connexion = current_num_block; ref_pad->m_logical_connexion = current_num_block; } - /* si 1 des 2 pads est deja connecte : mise a jour pour l'autre */ + /* If a pad is already connected connected : merge the other pad in the block */ else { ref_pad->m_logical_connexion = pad->m_logical_connexion; } - + (*nblinks)++; g_pt_chevelu->SetNet( ref_pad->GetNet() ); g_pt_chevelu->status = CH_ACTIF | CH_VISIBLE; @@ -309,31 +408,30 @@ static int gen_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC, void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) /***********************************************************/ -/* Routine de calcul du chevelu complet du circuit (algorithme de LEE ) - * les connexions physiques (pistes) ne sont pas ici prises en compte - * Il s'agit donc du chevelu de base qui ne depend que de la disposition des pads. - * - * - etablit la liste complete des pads si nécessaire - * les pads utiles (cad appartenant a un net ) sont appeles - * nodes (noeuds) - * et la trie par blocs de pads homogenes ( i.e. appartenant au meme net ) - * - * - puis calcule le ratsnest selon l'algorithme de LEE, consistant a - * a - etablir le ratsnest entre 1 pad non "connecte" et son plus proche - * voisin. Ceci cree des "blocks" ou sous graphes non connectes entre - * eux - * b - "connecter" (par un chevelu) entre eux ces blocks en prenant le 1er block et - * en le connectant a son plus proche voisin par les 2 pads les plus - * proches (Iteration jusqu'a ce qu'il n'y ait plus qu'un seul block). - * - * les chevelus calculés montrent les connexions "logiques" - * - * Entree = adr du buffer de classement (usuellement buf_work) - * met a jour : - * nb_nodes = nombre de pads connectes a un net ( pads "utiles") - * nb_links = nombre min de liens : - * il y a n-1 liens par equipotentielle comportant n pads. - * +/** Function to compute the full ratsnest (using the LEE algorithm ) + * In the functions tracks are not considered + * This is only the "basic" ratsnest depending only on pads. + * + * - Create the sorted pad list (if necessary) + * The active pads (i.e included in a net ) are called nodes + * This pad list is sorted by net codes + * + * - Compute the ratsnest (LEE algorithm ): + * a - Create the ratsnest between a not connected pad and its nearest + * neighbour. Blocks of pads are created + * b - Create the ratsnest between blocks: + * Test the pads of the 1st block and create a link (ratsnest) + * with the nearest pad found in an other block. + * Thi other block is merged with the first block. + * until only one block is left. + * + * A ratnest can be seen as a logical connection. + * + * Update : + * nb_nodes = Active pads count for the board + * nb_links = link count for the board (logical connection count) + * (there are n-1 links for an equipotent which have n active pads) . + * */ { LISTE_PAD* pt_liste_pad, * pt_start_liste, * pt_end_liste, * pt_liste_pad_limite; @@ -349,7 +447,7 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) if( m_Pcb->m_NbPads == 0 ) return; - /* Etablissement de la liste des pads et leur net_codes si necessaire */ + /* Created pad list and the net_codes if needed */ if( (m_Pcb->m_Status_Pcb & NET_CODES_OK) == 0 ) recalcule_pad_net_code(); @@ -360,27 +458,27 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) pad->m_logical_connexion = 0; } - /* classement des pointeurs sur pads par nets */ + /* Sort the pad list by nets */ qsort( m_Pcb->m_Pads, m_Pcb->m_NbPads, sizeof(LISTE_PAD), tri_par_net ); - /* Allocation memoire du buffer des chevelus: il y a nb_nodes - 1 chevelu - * au maximum ( 1 node = 1 pad connecte ). - * on alloue donc un buffer pour nb_nodes chevelus... (+ une petite marge) - * le nombre reel de chevelus est nb_links + /* Allocate memory for buffer ratsnest: there are nb_nodes - 1 ratsnest + * maximum ( 1 node = 1 active pad ). + * Meory is allocated for nb_nodes ratsnests... (+ a bit more, just in case) + * The real ratsnests count nb_links < nb_nodes */ if( m_Pcb->m_Ratsnest ) MyFree( m_Pcb->m_Ratsnest ); m_Pcb->m_Ratsnest = NULL; if( m_Pcb->m_NbNodes == 0 ) - return; /* pas de connexions utiles */ + return; /* pas de connexions utiles */ m_Pcb->m_Ratsnest = (CHEVELU*) MyZMalloc( (m_Pcb->m_NbNodes + 10 ) * sizeof(CHEVELU) ); if( m_Pcb->m_Ratsnest == NULL ) return; - /* calcul du chevelu */ + /* Ratsnest computation */ DisplayRastnestInProgress = TRUE; g_pt_chevelu = m_Pcb->m_Ratsnest; pt_liste_pad = pt_start_liste = m_Pcb->m_Pads; @@ -393,13 +491,13 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) { pt_deb_liste_ch = g_pt_chevelu; pad = *pt_liste_pad; - /* saut des pads non connectes */ + /* Skip the not connected pads */ if( pad->GetNet() == 0 ) { pt_liste_pad++; pt_start_liste = pt_liste_pad; continue; } - /* Recherche de la fin de la liste des pads du net courant */ + /* Search the end of pad list des pads for the current net */ num_block = pad->m_logical_connexion; nbpads = 0; for( pt_end_liste = pt_liste_pad + 1; ; pt_end_liste++ ) @@ -416,7 +514,7 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) m_Pcb->m_NbLinks += nbpads; - /* fin de liste trouvee: calcul du chevelu du net "net_code" */ + /* End of list found: Compute the ratsnest relative to the current net "net_code" */ equipot = m_Pcb->FindNet( current_net_code ); if( equipot == NULL ) DisplayError( this, wxT( "Gen ratsnest err: NULL equipot" ) ); @@ -429,11 +527,11 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) equipot->m_RatsnestStart = g_pt_chevelu; } - /* a - connexion des pads entre eux */ + /* a - first pass : create the blocks from "not in block" pads */ ii = gen_rats_pad_to_pad( DrawPanel, DC, pt_start_liste, pt_end_liste, num_block, &noconn ); - /* b - connexion des blocks formes precedemment (Iteration) */ + /* b - blocks connection (Iteration) */ while( ii > 1 ) { ii = gen_rats_block_to_block( DrawPanel, DC, pt_liste_pad, @@ -443,7 +541,7 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) if( equipot ) { equipot->m_RatsnestEnd = g_pt_chevelu; - /* classement des chevelus par longueur croissante */ + /* sort by lenght */ qsort( equipot->m_RatsnestStart, equipot->m_RatsnestEnd - equipot->m_RatsnestStart, sizeof(CHEVELU), @@ -459,7 +557,7 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) m_Pcb->m_Status_Pcb |= LISTE_CHEVELU_OK; adr_lowmem = buf_work; - // Effacement du chevelu calcule + // erase the ratsnest displayed on screen if needed CHEVELU* Chevelu = (CHEVELU*) m_Pcb->m_Ratsnest; GRSetDrawMode( DC, GR_XOR ); for( ii = m_Pcb->GetNumRatsnests(); ii > 0; ii--, Chevelu++ ) @@ -479,7 +577,7 @@ void WinEDA_BasePcbFrame::Build_Board_Ratsnest( wxDC* DC ) void WinEDA_BasePcbFrame::ReCompile_Ratsnest_After_Changes( wxDC* DC ) /**********************************************************************/ -/* recompile rastnest afet am module move, delete, .. +/* recompile rastnest after a module move, delete, .. */ { if( g_Show_Ratsnest && DC ) @@ -491,10 +589,10 @@ void WinEDA_BasePcbFrame::ReCompile_Ratsnest_After_Changes( wxDC* DC ) void WinEDA_BasePcbFrame::DrawGeneralRatsnest( wxDC* DC, int net_code ) /*********************************************************************/ -/* - * Affiche le chevelu general du circuit - * Affiche les chevelus dont le bit CH_VISIBLE du status du chevelu est a 1 - * Si net_code > 0, affichage des seuls chevelus de net_code correspondant +/** + * Displays the general ratsnest + * Only ratsnets with the status bit CH_VISIBLE is set are displayed + * @param netcode if > 0, Display only the ratsnest relative to the correponding net_code */ { int ii; @@ -516,7 +614,7 @@ void WinEDA_BasePcbFrame::DrawGeneralRatsnest( wxDC* DC, int net_code ) { if( ( Chevelu->status & (CH_VISIBLE | CH_ACTIF) ) != (CH_VISIBLE | CH_ACTIF) ) continue; - + if( (net_code <= 0) || (net_code == Chevelu->GetNet()) ) { GRLine( &DrawPanel->m_ClipBox, DC, @@ -534,37 +632,37 @@ static int tst_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC, CHEVELU* start_rat_list, CHEVELU* end_rat_list ) /*****************************************************************************/ -/* - * Routine utilisee par Tst_Ratsnest() - * Routine tres proche de gen_rats_block_to_block(..) - * Routine testant le chevelu entre 2 blocks ( supposes du meme net ) - * la recherche est faite entre les pads du block 1 et les autres blocks - * le block n ( n > 1 ) est alors connecte au block 1 par le chevelu le plus court - * A la différence de gen_rats_block_to_block(..), - * l'analyse n'est pas faite pads a pads mais a travers la liste générale des chevelus. - * La routine active alors le chevelu le plus court reliant le block 1 au block n - * (etablissement d'une connexion "logique") - * - * Entree : - * pt_chain_pad = adresse de debut de zone pad utile - * pt_limite = adresse de fin de zone (borne non comprise) - * Sortie: - * Membre .state du chevelu sélectionné - * Retourne: - * nombre de blocks non connectes entre eux +/** + * Function used by Tst_Ratsnest() + * Function like gen_rats_block_to_block(..) + * Function testing the ratsnest between 2 blocks ( same net ) + * The search is made between pads in block 1 and the others blocks + * The block n ( n > 1 ) is merged with block 1 by the smallest ratsnest + * Différence between gen_rats_block_to_block(..): + * The analysis is not made pads to pads but uses the general ratsnest list. + * The function activate the smallest ratsnest between block 1 and the block n + * (activate a logical connexion) + * + * @param pt_liste_pad_start = adresse de debut de zone pad utile + * pt_liste_pad_end = adresse de fin de zone pad + * start_rat_list = adresse de debut de zone ratsnest utile + * end_rat_list = adresse de fin de zone ratsnest + * output: + * .state member of the ratsnests + * @return blocks not connected count */ { int current_num_block, min_block; LISTE_PAD* pt_liste_pad; CHEVELU* chevelu, * min_chevelu; - /* Recherche du chevelu le plus court d'un block a un autre block */ + /* Search a link from a blockto an other block */ min_chevelu = NULL; for( chevelu = start_rat_list; chevelu < end_rat_list; chevelu++ ) { - if( chevelu->pad_start->m_logical_connexion == chevelu->pad_end->m_logical_connexion ) + if( chevelu->pad_start->m_logical_connexion == chevelu->pad_end->m_logical_connexion ) // Same block continue; - + if( min_chevelu == NULL ) min_chevelu = chevelu; else if( min_chevelu->dist > chevelu->dist ) @@ -574,14 +672,17 @@ static int tst_rats_block_to_block( WinEDA_DrawPanel* DrawPanel, wxDC* DC, if( min_chevelu == NULL ) return 1; + /* At this point we have found a link between 2 differents blocks (clusters) : + * we must set its status to ACTIVE and merge the 2 blocks + */ min_chevelu->status |= CH_ACTIF; current_num_block = min_chevelu->pad_start->m_logical_connexion; min_block = min_chevelu->pad_end->m_logical_connexion; - + if( min_block > current_num_block ) EXCHG( min_block, current_num_block ); - /* les 2 blocks vont etre fondus */ + /* Merging the 2 blocks in one cluster */ for( pt_liste_pad = pt_liste_pad_start; pt_liste_pad < pt_liste_pad_end; pt_liste_pad++ ) { if( (*pt_liste_pad)->m_logical_connexion == current_num_block ) @@ -600,25 +701,23 @@ static int tst_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC, CHEVELU* start_rat_list, CHEVELU* end_rat_list ) /**********************************************************************/ -/* - * Routine utilisee par Tst_Ratsnest_general() - * Routine Activant le chevelu entre 2 pads ( supposes du meme net ) - * la routine connecte 1 pad non deja connecte a un autre et active donc - * un certain nombre de blocks de pads liées par un chevelu - * Ces blocks sont donc constitués de 2 pads. - * - * Entree : - * pt_chain_pad = adresse de debut de zone pad - * pt_limite = adresse de fin de recherche (borne non comprise) - * current_num_block = numero du dernier block de pads (constitué par les connexions - * de pistes existantes - * - * Sortie: - * liste des chevelus ( structures) - * mise a jour du membre .state du chevelu activé - * - * Retourne: - * nombre de blocks crees (paquets de pads) +/** + * Function used by Tst_Ratsnest_general() + * The general ratsnest list must exists + * Activates the ratsnest between 2 pads ( supposes du meme net ) + * The function links 1 pad not already connected an other pad and activate + * some blocks linked by a ratsnest + * Its test only the existing ratsnest and activate some ratsnest (status bit CH_ACTIF set) + * + * @param start_rat_list = starting address for the ratnest list + * @param end_rat_list = ending address for the ratnest list + * @param current_num_block = last block number (computed from the track analysis) + * + * output: + * ratsnest list (status member set) + * and pad list (m_logical_connexion set) + * + * @return new block number */ { D_PAD* pad_start, * pad_end; @@ -627,9 +726,9 @@ static int tst_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC, for( chevelu = start_rat_list; chevelu < end_rat_list; chevelu++ ) { pad_start = chevelu->pad_start; pad_end = chevelu->pad_end; - /* Mise a jour du numero de block ( ou de sous graphe ) */ - /* si aucun des 2 pads n'est deja connecte : creation d'un nouveau block */ + /* Update the block if the 2 pads are not connected : a new block is created + */ if( (pad_start->m_logical_connexion == 0) && (pad_end->m_logical_connexion == 0) ) { current_num_block++; @@ -637,7 +736,7 @@ static int tst_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC, pad_end->m_logical_connexion = current_num_block; chevelu->status |= CH_ACTIF; } - /* si 1 des 2 pads est deja connecte : mise a jour pour l'autre */ + /* If a pad is already connected : the other is merged in the current block */ else if( pad_start->m_logical_connexion == 0 ) { pad_start->m_logical_connexion = pad_end->m_logical_connexion; @@ -658,9 +757,9 @@ static int tst_rats_pad_to_pad( WinEDA_DrawPanel* DrawPanel, wxDC* DC, void WinEDA_BasePcbFrame::Tst_Ratsnest( wxDC* DC, int ref_netcode ) /*******************************************************************/ -/* calcul du chevelu actif - * Le chevelu général doit etre calculé - * Determite les chevelus ACTIFS dans la liste générale des chevelus +/* Compute the active ratsnest + * The general ratsnest list must exists + * Compute the ACTIVE ratsnests in the general ratsnest list */ { LISTE_PAD* pt_liste_pad; @@ -678,7 +777,7 @@ void WinEDA_BasePcbFrame::Tst_Ratsnest( wxDC* DC, int ref_netcode ) equipot = m_Pcb->FindNet( net_code ); if( equipot == NULL ) break; - + if( ref_netcode && (net_code != ref_netcode) ) continue; @@ -696,11 +795,11 @@ void WinEDA_BasePcbFrame::Tst_Ratsnest( wxDC* DC, int ref_netcode ) chevelu->status &= ~CH_ACTIF; } - /* a - tst connexion des pads entre eux */ + /* a - tst connection between pads */ ii = tst_rats_pad_to_pad( DrawPanel, DC, num_block, equipot->m_RatsnestStart, equipot->m_RatsnestEnd ); - /* b - connexion des blocks formes precedemment (Iteration) */ + /* b - test connexion between blocks (Iteration) */ while( ii > 1 ) { ii = tst_rats_block_to_block( DrawPanel, DC, @@ -722,7 +821,11 @@ void WinEDA_BasePcbFrame::Tst_Ratsnest( wxDC* DC, int ref_netcode ) /**************************************************************************/ int WinEDA_BasePcbFrame::Test_1_Net_Ratsnest( wxDC* DC, int ref_netcode ) /**************************************************************************/ -/* Calcule le chevelu du net net_code */ + +/** + * Compute the rastnest relative to the net "net_code" + * @param ref_netcode = netcode used to compute the rastnest. + */ { DisplayRastnestInProgress = FALSE; DrawGeneralRatsnest( DC, ref_netcode ); @@ -737,11 +840,13 @@ int WinEDA_BasePcbFrame::Test_1_Net_Ratsnest( wxDC* DC, int ref_netcode ) void WinEDA_BasePcbFrame::recalcule_pad_net_code() /*****************************************************/ -/* - * Calcule et met a jour les net_codes des PADS et des equipotentielles - * met a jour le buffer des equipotentielles - * A utiliser apres edition de nets sur un pad ou lecture d'une netliste - * positionne a 1 le bit NET_CODE_OK du status_pcb; +/** + * Compute and update the net_codes for PADS et and equipots (.m_NetCode member) + * net_codes are >= 1 (net_code = 0 means not connected) + * Update the equipotents buffer + * Must be called after editing pads (netname, or deleting) or after read a netlist + * set to 1 flag NET_CODE_OK of m_Pcb->m_Status_Pcb; + * m_Pcb->m_NbNodes and m_Pcb->m_NbNets are updated */ { LISTE_PAD* pad_ref, * pad_courant; @@ -750,7 +855,7 @@ void WinEDA_BasePcbFrame::recalcule_pad_net_code() EDA_BaseStruct* PtStruct; EQUIPOT** BufPtEquipot; - /* construction de la liste des adr des PADS */ + /* Build the PAD list */ build_liste_pads(); /* calcul des net_codes des pads */ @@ -758,45 +863,47 @@ void WinEDA_BasePcbFrame::recalcule_pad_net_code() m_Pcb->m_NbNodes = 0; m_Pcb->m_NbNets = 0; + /* search for differents netnames, and create a netcode for each netname */ pad_courant = m_Pcb->m_Pads; for( ; ii > 0; pad_courant++, ii-- ) { - if( (*pad_courant)->m_Netname.IsEmpty() ) // pad non connecte + if( (*pad_courant)->m_Netname.IsEmpty() ) // pad not connected { (*pad_courant)->SetNet( 0 ); continue; } - + m_Pcb->m_NbNodes++; - - /* si le netname a deja ete rencontre: mise a jour , sinon nouveau net_code */ + + /* if the current netname was already found: use the current net_code , else create a new net_code */ pad_ref = m_Pcb->m_Pads; while( pad_ref < pad_courant ) { if( (*pad_ref)->m_Netname == (*pad_courant)->m_Netname ) - break; // sont du meme met - + break; // sont du meme met + pad_ref++; } - /* si pad_ref = pad_courant: nouveau net sinon, deja net deja traite */ - if( pad_ref == pad_courant ) + /* if pad_ref != pad_courant we have found 2 pads on the same net., Use the current net_code for pad_courant + * if pad_ref == pad_courant: new net found (end of list reached) without other pad found on the same net: + * we must create a new net_code + */ + if( pad_ref == pad_courant ) // create a new net_code { m_Pcb->m_NbNets++; (*pad_courant)->SetNet( m_Pcb->m_NbNets ); } - else + else // Use the current net_code for pad_courant (*pad_courant)->SetNet( (*pad_ref)->GetNet() ); } - /* Construction ou correction de la liste des equipotentielles, - * et construction d'un tableau d'adressage des equipots*/ - - BufPtEquipot = (EQUIPOT**) MyMalloc( sizeof(EQUIPOT *) * (m_Pcb->m_NbNets + 1) ); + /* Build or update the equipotent list: we reuse the old list */ + BufPtEquipot = (EQUIPOT**) MyMalloc( sizeof(EQUIPOT*) * (m_Pcb->m_NbNets + 1) ); pt_equipot = m_Pcb->m_Equipots; PtStruct = (EDA_BaseStruct*) m_Pcb; for( ii = 0; ii <= m_Pcb->m_NbNets; ii++ ) { - if( pt_equipot == NULL ) /* Creation d'une nouvelle equipot */ + if( pt_equipot == NULL ) /* Create a new equipot if no more equipot in old list */ { pt_equipot = new EQUIPOT( m_Pcb ); @@ -813,7 +920,8 @@ void WinEDA_BasePcbFrame::recalcule_pad_net_code() pt_equipot->Pnext = NULL; } - pt_equipot->SetNet( ii ); // Mise a jour du numero d'equipot + // Set the net_code for this equipot and reset other values + pt_equipot->SetNet(ii); pt_equipot->m_NbNodes = 0; pt_equipot->m_Netname.Empty(); @@ -822,19 +930,19 @@ void WinEDA_BasePcbFrame::recalcule_pad_net_code() pt_equipot = (EQUIPOT*) pt_equipot->Pnext; } - /* Effacement des equipots inutiles */ + /* Delete the unused equipots in the old list */ while( pt_equipot ) { PtStruct = pt_equipot->Pnext; - pt_equipot ->DeleteStructure(); + pt_equipot->DeleteStructure(); pt_equipot = (EQUIPOT*) PtStruct; } pad_courant = m_Pcb->m_Pads; pt_equipot = m_Pcb->m_Equipots; - /* Placement des noms de net en structure EQUIPOT */ + /* Set the equpot net name and node count for each equipot in equipot list */ for( ii = m_Pcb->m_NbPads; ii > 0; pad_courant++, ii-- ) { jj = (*pad_courant)->GetNet(); @@ -856,29 +964,14 @@ void WinEDA_BasePcbFrame::build_liste_pads() /***********************************************/ /* - * construction de la liste ( sous forme d'une liste de stucture ) - * des caract utiles des pads du PCB pour autoroutage,DRC .. ) - * parametres: - * adresse du buffer de classement = buf_work - * retourne: - * 1ere adresse disponible si OK - * NULL si trop de pastilles - * - * - * Parametres de routage calcules et mis a jour - * - parametre net_code: - * numero de code interne de chaque net du PCB. - * permet d'accelerer les calculs de chevelu et de connexions - * - parametre .link est mis a jour - * pour chaque pastille, il indique le nombre d'autres pastilles du meme net - * appartenant au meme module. - * - * Variables globales mise a jour: - * pointeur base_adr_liste_pad (adr de classement de la liste des pads) - * nb_pads = nombre total de pastilles du PCB - * nb_nets = nombre de nets differents - * status_pcb |= LISTE_PAD_OK (flag permettant d'eviter la reexecution inutile - * de cette routine) + * Create the pad list + * initialise: + * m_Pcb->m_Pads (list of pads) + * m_Pcb->m_NbPads = pad count + * m_Pcb->m_NbNodes = node count + * set m_Pcb->m_Status_Pcb = LISTE_PAD_OK; + * and clear for all pad their m_logical_connexion member; + * delete ( free memory) m_Pcb->m_Ratsnest and set m_Pcb->m_Ratsnest to NULL */ { LISTE_PAD* pt_liste_pad; @@ -888,16 +981,16 @@ void WinEDA_BasePcbFrame::build_liste_pads() if( m_Pcb->m_Status_Pcb & LISTE_PAD_OK ) return; - /* construction de la liste des pointeurs sur les structures D_PAD */ + /* delete the old list */ if( m_Pcb->m_Pads ) { MyFree( m_Pcb->m_Pads ); m_Pcb->m_Pads = NULL; } - /* Calcul du nombre de pads */ + /* Set the pad count */ m_Pcb->m_NbPads = 0; - Module = m_Pcb->m_Modules; + Module = m_Pcb->m_Modules; for( ; Module != NULL; Module = (MODULE*) Module->Pnext ) { PtPad = (D_PAD*) Module->m_Pads; @@ -908,12 +1001,12 @@ void WinEDA_BasePcbFrame::build_liste_pads() if( m_Pcb->m_NbPads == 0 ) return; - /* Allocation memoire du buffer */ - pt_liste_pad = m_Pcb->m_Pads - = (D_PAD**) MyZMalloc( (m_Pcb->m_NbPads + 1) * sizeof(D_PAD *) ); + /* Allocate memory for the pad list */ + pt_liste_pad = m_Pcb->m_Pads + = (D_PAD**) MyZMalloc( (m_Pcb->m_NbPads + 1) * sizeof(D_PAD*) ); m_Pcb->m_NbNodes = 0; - /* Initialisation du buffer et des variables de travail */ + /* Clear variables used in rastnest computation */ Module = m_Pcb->m_Modules; for( ; Module != NULL; Module = (MODULE*) Module->Pnext ) { @@ -922,25 +1015,25 @@ void WinEDA_BasePcbFrame::build_liste_pads() { *pt_liste_pad = PtPad; PtPad->m_logical_connexion = 0; - PtPad->m_Parent = Module; - + PtPad->m_Parent = Module; // Just in case + if( PtPad->GetNet() ) m_Pcb->m_NbNodes++; - + pt_liste_pad++; } } - *pt_liste_pad = NULL; // fin de liste + *pt_liste_pad = NULL; // set end of list adr_lowmem = buf_work; - + if( m_Pcb->m_Ratsnest ) { MyFree( m_Pcb->m_Ratsnest ); - m_Pcb->m_Ratsnest = NULL; + m_Pcb->m_Ratsnest = NULL; } - + m_Pcb->m_Status_Pcb = LISTE_PAD_OK; } @@ -949,19 +1042,19 @@ void WinEDA_BasePcbFrame::build_liste_pads() char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module ) /*****************************************************************************/ -/* - * construction de la liste en mode de calcul rapide pour affichage - * en temps reel lors des deplacements du chevelu d'un module. - * - * parametres d'appel: - * Module = pointeur sur module dont le ratsnest est a calculer - * - * retourne: adresse memoire disponible - * Le chevelu calcule comporte 2 parties - * - un chevelu interne relatif aux pads du module appartenant a un - * meme net. Il est calcule 1 seule fois - * - le chevelu externe reliant un pad interne a un pad externe au module - * Ce chevelu est recalcule a chaque deplacement +/** + * Build a rastenest relative to one footprint. This is a simplified computation + * used only in move footprint. It is not optimal, but it is fast and sufficient + * to guide a footprint placement + * It shows the connections from a pad to the nearest conected pad + * @param Module = module to consider. + * + * the general buffer adr_lowmem is used to store the local footprint ratnest (to do: better to allocate memory) + * The ratsnest has 2 sections: + * - An "internal" ratsnet relative to pads of this footprint which are in the same net. + * this ratsnest section is computed once. + * - An "external" rastnest connecting a pad of this footprint to an other pad (in an other footprint) + * The ratsnest section must be computed for each new position */ { LISTE_PAD* pt_liste_pad; @@ -974,31 +1067,33 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module ) LISTE_PAD* pt_end_liste; int ii, jj; CHEVELU* local_chevelu; - static CHEVELU* pt_fin_int_chevelu; // pointeur sur la fin de la liste - // des chevelus internes au module - static int nb_int_chevelu; // nombre e chevelus internes + static CHEVELU* pt_fin_int_chevelu; // End list for "internal" ratsnest + static int nb_int_chevelu; // "internal" ratsnest count int current_net_code; int increment, distance; // variables de calcul de ratsnest - int pad_pos_X, pad_pos_Y; // position reelle des pads du module en mouvement + int pad_pos_X, pad_pos_Y; // True pad position according to the current footprint position if( (m_Pcb->m_Status_Pcb & LISTE_PAD_OK) == 0 ) build_liste_pads(); - /* construction de la liste des pads du module si necessaire */ + /* Compute the "local" ratsnest if needed (when this footprint starts move) + and the list of external pads to consider, i.e pads in others footprints which are "connected" to + a pad in the current footprint + */ if( (m_Pcb->m_Status_Pcb & CHEVELU_LOCAL_OK) != 0 ) goto calcul_chevelu_ext; - /* calcul du chevelu "interne", c.a.d. liant les seuls pads du module */ - pt_liste_pad = (LISTE_PAD*) adr_lowmem; - nb_pads_ref = 0; - + /* Compute the "internal" ratsnest, i.e the links beteween the curent footprint pads */ + pt_liste_pad = (LISTE_PAD*) adr_lowmem; + nb_pads_ref = 0; + pad_ref = Module->m_Pads; for( ; pad_ref != NULL; pad_ref = (D_PAD*) pad_ref->Pnext ) { if( pad_ref->GetNet() == 0 ) continue; - + *pt_liste_pad = pad_ref; pad_ref->m_logical_connexion = 0; pad_ref->m_physical_connexion = 0; @@ -1006,15 +1101,15 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module ) } if( nb_pads_ref == 0 ) - return (char*) pt_liste_pad; /* pas de connexions! */ + return (char*) pt_liste_pad; /* pas de connexions! */ - qsort( adr_lowmem, nb_pads_ref, sizeof(D_PAD *), tri_par_net ); + qsort( adr_lowmem, nb_pads_ref, sizeof(D_PAD*), tri_par_net ); - /* construction de la liste des pads connectes aux pads de ce module */ + /* Build the list of pads linked to the current ffotprint pads */ DisplayRastnestInProgress = FALSE; - pt_liste_ref = (LISTE_PAD*) adr_lowmem; - - nb_pads_externes = 0; + pt_liste_ref = (LISTE_PAD*) adr_lowmem; + + nb_pads_externes = 0; current_net_code = 0; for( ii = 0; ii < nb_pads_ref; ii++ ) { @@ -1029,10 +1124,10 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module ) pad_externe = *pt_liste_generale; pt_liste_generale++; if( pad_externe->GetNet() != current_net_code ) continue; - + if( pad_externe->m_Parent == Module ) continue; - + pad_externe->m_logical_connexion = 0; pad_externe->m_physical_connexion = 0; *pt_liste_pad = pad_externe; pt_liste_pad++; @@ -1040,13 +1135,14 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module ) } } - /* tri par net_codes croissants de la liste des pads externes */ - qsort( pt_liste_ref + nb_pads_ref, nb_pads_externes, sizeof(D_PAD *), + /* Sort the pad list by net_code */ + qsort( pt_liste_ref + nb_pads_ref, nb_pads_externes, sizeof(D_PAD*), tri_par_net ); - /* calcul du chevelu interne au module: - * Ce calcul est identique au calcul du chevelu general, mais il est - * restreint aux seuls pads du module courant */ + /* Compute the internal ratsnet: + * this is the same as general ratsnest, but considers onluy tje currant footprint pads + * it is therefore not time consumming, and it is made onlu once + */ local_liste_chevelu = (CHEVELU*) (pt_liste_pad); // buffer chevelu a la suite de la liste des pads nb_local_chevelu = 0; pt_liste_ref = (LISTE_PAD*) adr_lowmem; @@ -1058,23 +1154,23 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module ) for( ; pt_liste_pad < pt_liste_pad_limite; ) { - /* Recherche de la fin de la liste des pads du net courant */ + /* Search the end of pad list relative to the current net */ for( pt_end_liste = pt_liste_pad + 1; ; pt_end_liste++ ) { if( pt_end_liste >= pt_liste_pad_limite ) break; - + if( (*pt_end_liste)->GetNet() != current_net_code ) break; } - /* fin de liste trouvee : */ - /* a - connexion des pads entre eux */ + /* End of list found: */ + /* a - first step of lee algorithm : build the pad to pad link list */ ii = gen_rats_pad_to_pad( DrawPanel, DC, pt_start_liste, pt_end_liste, 0, &nb_local_chevelu ); - /* b - connexion des blocks formes precedemment (Iteration) */ + /* b - secon step of lee algorithm : build the block to block link list (Iteration) */ while( ii > 1 ) { ii = gen_rats_block_to_block( DrawPanel, DC, pt_liste_pad, @@ -1089,7 +1185,7 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module ) pt_fin_int_chevelu = local_chevelu = g_pt_chevelu; nb_int_chevelu = nb_local_chevelu; - /* Mise a 1 du flag LOCAL */ + /* set the ratsnets status, flag LOCAL_CHEVELU */ g_pt_chevelu = local_liste_chevelu; while( g_pt_chevelu < pt_fin_int_chevelu ) { @@ -1098,21 +1194,21 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module ) m_Pcb->m_Status_Pcb |= CHEVELU_LOCAL_OK; - ///////////////////////////////////////// - // calcul du chevelu externe au module // - ///////////////////////////////////////// + /* + This section computes the "external" ratsnest: must be done when the footprint position changes + */ calcul_chevelu_ext: - /* Cette partie est executee a chaque deplacement du module: on calcule - * pour chaque pad du module courant la + courte distance a un pad externe. - * Pour chaque groupe de pad du module courant appartenant a un meme net, - * on ne garde qu'un seul chevelu: le plus court. + /* This section search: + * for each current module pad the nearest neighbour external pad (of course for the same net code). + * For each current footprint cluster of pad (pads having the same net code), + * we keep the smaller ratsnest. */ local_chevelu = pt_fin_int_chevelu; nb_local_chevelu = nb_int_chevelu; pt_liste_ref = (LISTE_PAD*) adr_lowmem; pad_ref = *pt_liste_ref; - + current_net_code = pad_ref->GetNet(); local_chevelu->dist = 0x7FFFFFFF; local_chevelu->status = 0; @@ -1121,9 +1217,8 @@ calcul_chevelu_ext: { pad_ref = *(pt_liste_ref + ii); if( pad_ref->GetNet() != current_net_code ) - { - /* un nouveau chevelu est cree (si necessaire) pour - * chaque nouveau net */ + { + /* if needed a new ratsenest for each new net */ if( increment ) { nb_local_chevelu++; local_chevelu++; @@ -1140,17 +1235,17 @@ calcul_chevelu_ext: for( jj = nb_pads_externes; jj > 0; jj-- ) { pad_externe = *pt_liste_generale; pt_liste_generale++; - - /* les netcodes doivent etre identiques */ + + /* we search pads having the same net coade */ if( pad_externe->GetNet() < pad_ref->GetNet() ) continue; - - if( pad_externe->GetNet() > pad_ref->GetNet() ) + + if( pad_externe->GetNet() > pad_ref->GetNet() ) // remember pads are sorted by net code break; - + distance = abs( pad_externe->m_Pos.x - pad_pos_X ) + abs( pad_externe->m_Pos.y - pad_pos_Y ); - + if( distance < local_chevelu->dist ) { local_chevelu->pad_start = pad_ref; @@ -1165,16 +1260,16 @@ calcul_chevelu_ext: if( increment ) // fin de balayage : le ratsnest courant doit etre memorise { - nb_local_chevelu++; + nb_local_chevelu++; local_chevelu++; } - /* Retourne l'adr de la zone disponible */ + /* return the newt free memory buffer address, in the general buffer */ adr_max = MAX( adr_max, (char*) (local_chevelu + 1) ); - return (char*) (local_chevelu + 1); /* la struct pointee par - * local_chevelu est utilisee - * pour des calculs temporaires */ + return (char*) (local_chevelu + 1); /* the struct pointed by local_chevelu is used + in temporary computations, so we skip it + */ } @@ -1183,8 +1278,7 @@ void WinEDA_BasePcbFrame::trace_ratsnest_module( wxDC* DC ) /**********************************************************/ /* - * affiche le chevelu d'un module calcule en mode rapide. - * retourne: rien + * Display the rastnest of a moving footprint, computed by build_ratsnest_module() */ { CHEVELU* local_chevelu; @@ -1227,11 +1321,11 @@ void WinEDA_BasePcbFrame::trace_ratsnest_module( wxDC* DC ) /* int * WinEDA_BasePcbFrame::build_ratsnest_pad(D_PAD * pad_ref, const wxPoint & refpos) */ /*********************************************************************************************/ -/* +/** * construction de la liste en mode de calcul rapide pour affichage * en temps reel du chevelu d'un pad lors des tracés d'une piste démarrant * sur ce pad. - * + * * parametres d'appel: * pad_ref ( si null : mise a 0 du nombre de chevelus ) * ox, oy = coord de l'extremite de la piste en trace @@ -1241,27 +1335,27 @@ void WinEDA_BasePcbFrame::trace_ratsnest_module( wxDC* DC ) * retourne: adresse memoire disponible */ -/* routine locale de tri par longueur de links utilisee par la fonction QSORT */ +/* Used by build_ratsnest_pad(): sort function by link lenght (manathann distance)*/ static int sort_by_localnetlength( const void* o1, const void* o2 ) { int* ref = (int*) o1; int* compare = (int*) o2; - - int* org = (int*) adr_lowmem; + + int* org = (int*) adr_lowmem; // ref coordinate (todo : change for a betted code: used an external wxPoint variable) int ox = *org++; int oy = *org++; int lengthref, lengthcmp; lengthref = abs( *ref - ox ); ref++; - - lengthref += abs( *ref - oy ); // = longueur entre point origine et pad ref - - lengthcmp = abs( *compare - ox ); - + + lengthref += abs( *ref - oy ); // = distance between ref coordinate and pad ref + + lengthcmp = abs( *compare - ox ); + compare++; - - lengthcmp += abs( *compare - oy ); // = longueur entre point origine et pad comparé + + lengthcmp += abs( *compare - oy ); // = distance between ref coordinate and the other pad return lengthref - lengthcmp; } @@ -1279,7 +1373,7 @@ int* WinEDA_BasePcbFrame::build_ratsnest_pad( EDA_BaseStruct* ref, D_PAD* pad_ref = NULL; if( ( (m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 ) - || ( (m_Pcb->m_Status_Pcb & LISTE_PAD_OK) == 0 ) ) + || ( (m_Pcb->m_Status_Pcb & LISTE_PAD_OK) == 0 ) ) { nb_local_chevelu = 0; return NULL; @@ -1330,10 +1424,10 @@ int* WinEDA_BasePcbFrame::build_ratsnest_pad( EDA_BaseStruct* ref, D_PAD* pad = *padlist; if( pad->GetNet() != current_net_code ) continue; - + if( pad == pad_ref ) continue; - + if( !pad->m_physical_connexion || (pad->m_physical_connexion != conn_number) ) { *pt_coord = pad->m_Pos.x; pt_coord++; @@ -1341,7 +1435,8 @@ int* WinEDA_BasePcbFrame::build_ratsnest_pad( EDA_BaseStruct* ref, nb_local_chevelu++; } } - } /* Fin Init */ + } /* end if Init */ + else if( nb_local_chevelu ) { *pt_coord = refpos.x; @@ -1359,7 +1454,7 @@ void WinEDA_BasePcbFrame::trace_ratsnest_pad( wxDC* DC ) /*******************************************************/ /* - * affiche le "chevelu" d'un pad lors des trace de segments de piste + * Displays a "ratsnest" during track creation */ { int* pt_coord; @@ -1368,15 +1463,15 @@ void WinEDA_BasePcbFrame::trace_ratsnest_pad( wxDC* DC ) if( (m_Pcb->m_Status_Pcb & LISTE_CHEVELU_OK) == 0 ) return; - + if( nb_local_chevelu == 0 ) return; - + if( local_liste_chevelu == NULL ) return; pt_coord = (int*) local_liste_chevelu; - + refX = *pt_coord++; refY = *pt_coord++; @@ -1385,7 +1480,7 @@ void WinEDA_BasePcbFrame::trace_ratsnest_pad( wxDC* DC ) { if( ii >= g_MaxLinksShowed ) break; - + GRLine( &DrawPanel->m_ClipBox, DC, refX, refY, *pt_coord, *(pt_coord + 1), 0, YELLOW ); pt_coord += 2; diff --git a/pcbnew/struct.cpp.notused b/pcbnew/struct.cpp.notused deleted file mode 100644 index 573cf4b3b8..0000000000 --- a/pcbnew/struct.cpp.notused +++ /dev/null @@ -1,58 +0,0 @@ -/***********************************************/ -/* Routines d'effacement et copie de structures*/ -/***********************************************/ - -#include "fctsys.h" -#include "gr_basic.h" - -#include "common.h" -#include "pcbnew.h" - -#if 0 - -/* Routines Locales */ -/* Variables locales */ - -/***********************************************/ -void DeleteStructure( BOARD_ITEM* item ) -/***********************************************/ -/* Supprime de la liste chainee la stucture pointee par GenericStructure - et libere la memoire correspondante -*/ -{ - if( !item ) - return; - - switch( item->Type() ) - { - case TYPE_NOT_INIT: - DisplayError(NULL, wxT("DeleteStruct: Type Structure Non Initialise")); - break; - - case PCB_EQUIPOT_STRUCT_TYPE: - case TYPEMODULE: - case TYPEPAD: - case TYPECOTATION: - case TYPEMIRE: - case TYPEDRAWSEGMENT: - case TYPETEXTE: - case TYPETEXTEMODULE: - case TYPEEDGEMODULE: - case TYPETRACK: - case TYPEVIA: - case TYPEZONE: - case TYPEMARQUEUR: - item->UnLink(); - delete item; - break; - - default: - { - wxString msg; - msg.Printf( wxT(" DeleteStructure: Type %d Inattendu"), item->Type() ); - DisplayError(NULL, msg); - } - } -} - -#endif