From f0cd147643500f9459597debce7d17d2cb9bb909 Mon Sep 17 00:00:00 2001 From: CHARRAS Date: Sat, 27 Oct 2007 18:05:50 +0000 Subject: [PATCH] pcbnew: use collector class to locate items in modedit, the footprint editor (thanks, Dick). --- change_log.txt | 4 + include/wxstruct.h | 2 +- internat/fr/kicad.mo | Bin 134017 -> 134000 bytes internat/fr/kicad.po | 300 ++++++++++++++++++------------------- pcbnew/basepcbframe.cpp | 4 +- pcbnew/clean.cpp | 102 ++++++------- pcbnew/collectors.cpp | 8 + pcbnew/collectors.h | 5 + pcbnew/modedit.cpp | 100 +++++++++++-- pcbnew/modedit_onclick.cpp | 2 + pcbnew/moduleframe.cpp | 3 + 11 files changed, 318 insertions(+), 212 deletions(-) diff --git a/change_log.txt b/change_log.txt index 7b825e2e6d..8630a431ce 100644 --- a/change_log.txt +++ b/change_log.txt @@ -15,6 +15,10 @@ email address. display frame minor other changes ++ pcbnew: + Use collector class to locate items in modedit. + This is a big enhancement, + but a small work for me because Dick made all the work. 2007-Oct-26 UPDATE Jean-Pierre Charras diff --git a/include/wxstruct.h b/include/wxstruct.h index 025d8968a8..3c6b43da50 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -942,7 +942,7 @@ public: virtual void HandleBlockPlace( wxDC* DC ); virtual int HandleBlockEnd( wxDC* DC ); - BOARD_ITEM* ModeditLocateAndDisplay(); + BOARD_ITEM* ModeditLocateAndDisplay( int aHotKeyCode = 0 ); /* Undo and redo functions */ public: diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index 241ef8662eb33b0c8e38d93094c1fb89d6914022..0e761081d68ef673045249ff36594e9e0bc34506 100644 GIT binary patch delta 47732 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\n" "MIME-Version: 1.0\n" @@ -122,7 +122,7 @@ msgstr "Addition #: pcbnew/edit.cpp:283 #: pcbnew/tool_modedit.cpp:180 #: eeschema/schedit.cpp:314 -#: eeschema/libframe.cpp:502 +#: eeschema/libframe.cpp:503 #: gerbview/tool_gerber.cpp:383 msgid "Add Text" msgstr "Ajout de Texte" @@ -146,7 +146,7 @@ msgstr "Monter le chevelu g #: pcbnew/edit.cpp:461 #: pcbnew/modedit.cpp:344 #: eeschema/schedit.cpp:454 -#: eeschema/libframe.cpp:578 +#: eeschema/libframe.cpp:579 msgid "Delete item" msgstr "Suppression d'éléments" @@ -411,7 +411,7 @@ msgid "Create error " msgstr "Erreur en création " #: pcbnew/muwave_command.cpp:52 -#: eeschema/libframe.cpp:518 +#: eeschema/libframe.cpp:519 msgid "Add Line" msgstr "Addition de lignes" @@ -1131,8 +1131,8 @@ msgstr "Offset Y" #: eeschema/dialog_cmp_graphic_properties.cpp:178 #: eeschema/pinedit-dialog.cpp:308 #: eeschema/dialog_build_BOM.cpp:339 -#: cvpcb/dialog_display_options.cpp:190 -#: cvpcb/dialog_cvpcb_config.cpp:135 +#: cvpcb/dialog_cvpcb_config.cpp:139 +#: cvpcb/dialog_display_options.cpp:186 #: share/setpage.cpp:232 msgid "&OK" msgstr "&OK" @@ -1155,7 +1155,7 @@ msgstr "&OK" #: eeschema/dialog_cmp_graphic_properties.cpp:182 #: eeschema/pinedit-dialog.cpp:304 #: eeschema/dialog_build_BOM.cpp:343 -#: cvpcb/dialog_display_options.cpp:195 +#: cvpcb/dialog_display_options.cpp:191 #: share/setpage.cpp:237 msgid "&Cancel" msgstr "&Annuler" @@ -1278,7 +1278,7 @@ msgstr "Composant [%s]: Module <%sw non trouv #: pcbnew/dialog_setup_libs.cpp:97 #: eeschema/eestatus.cpp:111 #: eeschema/dialog_eeschema_config.cpp:105 -#: cvpcb/dialog_cvpcb_config.cpp:74 +#: cvpcb/dialog_cvpcb_config.cpp:76 #: gerbview/reglage.cpp:98 msgid "from " msgstr "De " @@ -1287,8 +1287,8 @@ msgstr "De " #: pcbnew/dialog_setup_libs.cpp:153 #: eeschema/eestatus.cpp:116 #: eeschema/dialog_eeschema_config.cpp:161 -#: cvpcb/dialog_display_options.cpp:181 -#: cvpcb/dialog_cvpcb_config.cpp:127 +#: cvpcb/dialog_cvpcb_config.cpp:131 +#: cvpcb/dialog_display_options.cpp:177 msgid "Save Cfg" msgstr "Sauver config" @@ -1296,6 +1296,8 @@ msgstr "Sauver config" #: pcbnew/dialog_setup_libs.cpp:175 #: eeschema/eestatus.cpp:120 #: eeschema/dialog_eeschema_config.cpp:196 +#: cvpcb/dialog_cvpcb_config.cpp:170 +#: cvpcb/dialog_cvpcb_config.cpp:202 msgid "Del" msgstr "Supprimer" @@ -1305,6 +1307,8 @@ msgstr "Supprimer" #: eeschema/dialog_eeschema_config.cpp:200 #: eeschema/edit_component_in_lib.cpp:233 #: eeschema/edit_component_in_lib.cpp:312 +#: cvpcb/dialog_cvpcb_config.cpp:174 +#: cvpcb/dialog_cvpcb_config.cpp:206 msgid "Add" msgstr "Ajouter" @@ -1312,6 +1316,8 @@ msgstr "Ajouter" #: pcbnew/dialog_setup_libs.cpp:183 #: eeschema/eestatus.cpp:128 #: eeschema/dialog_eeschema_config.cpp:204 +#: cvpcb/dialog_cvpcb_config.cpp:178 +#: cvpcb/dialog_cvpcb_config.cpp:210 msgid "Ins" msgstr "Insérer" @@ -1323,7 +1329,7 @@ msgstr "Lib Modules:" #: pcbnew/dialog_setup_libs.cpp:159 #: eeschema/eestatus.cpp:148 #: eeschema/dialog_eeschema_config.cpp:180 -#: cvpcb/dialog_cvpcb_config.cpp:147 +#: cvpcb/dialog_cvpcb_config.cpp:151 msgid "Files ext:" msgstr "Ext. Fichiers" @@ -1443,8 +1449,6 @@ msgstr "Garder" #: pcbnew/onrightclick.cpp:816 #: eeschema/edit_component_in_lib.cpp:239 #: eeschema/edit_component_in_lib.cpp:320 -#: cvpcb/dialog_cvpcb_config.cpp:166 -#: cvpcb/dialog_cvpcb_config.cpp:198 msgid "Delete" msgstr "Supprimer" @@ -1480,109 +1484,109 @@ msgstr "Test Modules" msgid "Compile" msgstr "Compile" -#: pcbnew/pcbframe.cpp:261 +#: pcbnew/pcbframe.cpp:262 msgid "Board modified, Save before exit ?" msgstr "Circuit Imprimé modifiée, Sauver avant de quitter ?" -#: pcbnew/pcbframe.cpp:262 +#: pcbnew/pcbframe.cpp:263 #: eeschema/schframe.cpp:183 #: cvpcb/cvframe.cpp:169 #: common/confirm.cpp:109 msgid "Confirmation" msgstr "Confirmation" -#: pcbnew/pcbframe.cpp:362 +#: pcbnew/pcbframe.cpp:363 msgid "DRC Off (Disable !!!), Currently: DRC is active" msgstr "DRC off (désactivée !!!), actuellement DRC active" -#: pcbnew/pcbframe.cpp:363 +#: pcbnew/pcbframe.cpp:364 msgid "DRC On (Currently: DRC is inactive !!!)" msgstr "DRC On (Actuellement, DRC désactivée !!!)" -#: pcbnew/pcbframe.cpp:374 +#: pcbnew/pcbframe.cpp:375 msgid "Polar Coords not show" msgstr "Coord Polaires non affichées" -#: pcbnew/pcbframe.cpp:375 +#: pcbnew/pcbframe.cpp:376 msgid "Display Polar Coords" msgstr "Affichage coord Polaires" -#: pcbnew/pcbframe.cpp:380 +#: pcbnew/pcbframe.cpp:381 #: eeschema/schframe.cpp:261 msgid "Grid not show" msgstr "Grille non montrée" -#: pcbnew/pcbframe.cpp:380 +#: pcbnew/pcbframe.cpp:381 #: eeschema/schframe.cpp:261 msgid "Show Grid" msgstr "Afficher grille" -#: pcbnew/pcbframe.cpp:389 +#: pcbnew/pcbframe.cpp:390 msgid "General ratsnest not show" msgstr "Chevelu général non affiché" -#: pcbnew/pcbframe.cpp:389 +#: pcbnew/pcbframe.cpp:390 msgid "Show General ratsnest" msgstr "Afficher le chevelu général" -#: pcbnew/pcbframe.cpp:395 +#: pcbnew/pcbframe.cpp:396 msgid "Module ratsnest not show" msgstr "Ne pas montrer le chevelu du module pendant déplacement" -#: pcbnew/pcbframe.cpp:396 +#: pcbnew/pcbframe.cpp:397 msgid "Show Module ratsnest" msgstr "Montrer le chevelu du module" -#: pcbnew/pcbframe.cpp:403 +#: pcbnew/pcbframe.cpp:404 msgid "Disable Auto Delete old Track" msgstr "Ne pas Autoriser l'effacement automatique des pistes" -#: pcbnew/pcbframe.cpp:404 +#: pcbnew/pcbframe.cpp:405 msgid "Enable Auto Delete old Track" msgstr "Autoriser l'effacement automatique des pistes" -#: pcbnew/pcbframe.cpp:411 +#: pcbnew/pcbframe.cpp:412 msgid "Do not Show Zones" msgstr "Ne pas monter Zones" -#: pcbnew/pcbframe.cpp:411 +#: pcbnew/pcbframe.cpp:412 #: pcbnew/tool_pcb.cpp:361 #: pcbnew/set_color.h:344 msgid "Show Zones" msgstr "Monter Zones" -#: pcbnew/pcbframe.cpp:417 +#: pcbnew/pcbframe.cpp:418 msgid "Show Pads Sketch mode" msgstr "Afficher pastilles en contour" -#: pcbnew/pcbframe.cpp:418 +#: pcbnew/pcbframe.cpp:419 msgid "Show pads filled mode" msgstr "Afficher pastilles en mode plein" -#: pcbnew/pcbframe.cpp:424 +#: pcbnew/pcbframe.cpp:425 msgid "Show Tracks Sketch mode" msgstr "Afficher pistes en contour" -#: pcbnew/pcbframe.cpp:425 +#: pcbnew/pcbframe.cpp:426 msgid "Show Tracks filled mode" msgstr "Afficher pistes en mode plein" -#: pcbnew/pcbframe.cpp:431 +#: pcbnew/pcbframe.cpp:432 msgid "Normal Contrast Mode Display" msgstr "Mode d'affichage Contraste normal" -#: pcbnew/pcbframe.cpp:432 +#: pcbnew/pcbframe.cpp:433 #: pcbnew/tool_pcb.cpp:374 msgid "Hight Contrast Mode Display" msgstr "Mode d'affichage Haut Contraste" -#: pcbnew/pcbframe.cpp:442 +#: pcbnew/pcbframe.cpp:443 #: pcbnew/class_board_item.cpp:140 #: pcbnew/class_track.cpp:728 msgid "Track" msgstr "Piste" -#: pcbnew/pcbframe.cpp:474 +#: pcbnew/pcbframe.cpp:475 #: pcbnew/class_board_item.cpp:170 msgid "Via" msgstr "Via" @@ -2067,7 +2071,7 @@ msgid "Buried" msgstr "Borgne" #: pcbnew/class_board_item.cpp:198 -#: pcbnew/classpcb.cpp:313 +#: pcbnew/class_marker.cpp:92 msgid "Marker" msgstr "Marqueur" @@ -2466,7 +2470,7 @@ msgid "Inches" msgstr "Pouces" #: pcbnew/set_grid.cpp:148 -#: share/drawframe.cpp:381 +#: share/drawframe.cpp:389 msgid "mm" msgstr "mm" @@ -2541,7 +2545,7 @@ msgid "Drill Shape:" msgstr "Forme du perçage:" #: pcbnew/dialog_pad_edit.cpp:186 -#: pcbnew/clean.cpp:456 +#: pcbnew/clean.cpp:462 #: eeschema/dialog_erc.cpp:192 #: eeschema/dialog_erc.cpp:196 #: eeschema/dialog_edit_component_in_schematic.cpp:172 @@ -2736,9 +2740,9 @@ msgid "Modules (%d items)" msgstr "Modules (%d éléments)" #: pcbnew/classpcb.cpp:181 -#: pcbnew/classpcb.cpp:313 #: pcbnew/class_text_mod.cpp:337 #: pcbnew/class_track.cpp:739 +#: pcbnew/class_marker.cpp:92 #: gerbview/affiche.cpp:93 msgid "Type" msgstr "Type" @@ -2756,10 +2760,6 @@ msgstr " Arc " msgid "Segment" msgstr "Segment" -#: pcbnew/classpcb.cpp:316 -msgid "Marker Error Text" -msgstr "Texte du Marqueur d'erreurs" - #: pcbnew/cleaningoptions_dialog.cpp:146 msgid "Static" msgstr "Static" @@ -3024,59 +3024,59 @@ msgstr "Ref." #: pcbnew/class_pad.cpp:883 #: pcbnew/class_edge_mod.cpp:285 #: pcbnew/class_module.cpp:1142 -#: cvpcb/setvisu.cpp:30 +#: cvpcb/setvisu.cpp:31 msgid "Module" msgstr "Module" -#: pcbnew/clean.cpp:172 +#: pcbnew/clean.cpp:177 msgid "Delete unconnected tracks:" msgstr "Suppression Pistes non connectées" -#: pcbnew/clean.cpp:191 +#: pcbnew/clean.cpp:196 msgid "ViaDef" msgstr "ViaDef" -#: pcbnew/clean.cpp:362 +#: pcbnew/clean.cpp:368 msgid "Clean Null Segments" msgstr "Nettoyage segments nulls" -#: pcbnew/clean.cpp:454 +#: pcbnew/clean.cpp:460 msgid "Merging Segments:" msgstr "Associe Segment" -#: pcbnew/clean.cpp:456 +#: pcbnew/clean.cpp:462 msgid "Merge" msgstr "Merge" -#: pcbnew/clean.cpp:473 +#: pcbnew/clean.cpp:478 msgid "Merge: " msgstr "Merge: " -#: pcbnew/clean.cpp:698 +#: pcbnew/clean.cpp:708 msgid "DRC Control:" msgstr "Controle DRC:" -#: pcbnew/clean.cpp:703 +#: pcbnew/clean.cpp:713 msgid "NetCtr" msgstr "NetCtr" -#: pcbnew/clean.cpp:1052 +#: pcbnew/clean.cpp:1055 msgid "Centre" msgstr "Centre" -#: pcbnew/clean.cpp:1052 +#: pcbnew/clean.cpp:1055 msgid "0 " msgstr "0" -#: pcbnew/clean.cpp:1063 +#: pcbnew/clean.cpp:1066 msgid "Pads: " msgstr "Pastilles: " -#: pcbnew/clean.cpp:1067 +#: pcbnew/clean.cpp:1070 msgid "Max" msgstr "Max" -#: pcbnew/clean.cpp:1070 +#: pcbnew/clean.cpp:1073 msgid "Segm" msgstr "Segm" @@ -3247,11 +3247,12 @@ msgstr "X Pos" msgid "Y pos" msgstr "Y pos" -#: pcbnew/basepcbframe.cpp:119 +#: pcbnew/basepcbframe.cpp:129 msgid "3D Frame already opened" msgstr "Fenetre 3D déjà ouverte" -#: pcbnew/basepcbframe.cpp:122 +#: pcbnew/basepcbframe.cpp:134 +#: pcbnew/basepcbframe.cpp:137 msgid "3D Viewer" msgstr "Visu 3D" @@ -3481,7 +3482,7 @@ msgstr "Appliquer" #: eeschema/eestatus.cpp:139 #: eeschema/dialog_eeschema_config.cpp:211 #: cvpcb/menucfg.cpp:231 -#: cvpcb/dialog_cvpcb_config.cpp:181 +#: cvpcb/dialog_cvpcb_config.cpp:185 msgid "Libraries" msgstr "Librairies" @@ -3827,7 +3828,7 @@ msgstr "Deselection" msgid "Deselect this layer to restore its No Change state" msgstr "Deselectionner cette couche pour restorer l'option Pas de Changement" -#: pcbnew/moduleframe.cpp:177 +#: pcbnew/moduleframe.cpp:178 msgid "Module Editor: module modified!, Continue ?" msgstr "Editeur de Module: module modifié! Continuer ?" @@ -4326,6 +4327,10 @@ msgstr "&3D Visu" msgid "&Help" msgstr "&Aide" +#: pcbnew/class_marker.cpp:95 +msgid "Marker Error Text" +msgstr "Texte du Marqueur d'erreurs" + #: pcbnew/globaleditpad.cpp:76 msgid "Pads Global Edit" msgstr "Pads: Edition globale" @@ -4803,7 +4808,6 @@ msgstr "KeyW: " #: eeschema/dialog_edit_component_in_lib.cpp:166 #: eeschema/dialog_create_component.cpp:176 #: eeschema/dialog_edit_component_in_schematic.cpp:204 -#: cvpcb/dialog_display_options.h:50 msgid "Options" msgstr "Options" @@ -5692,52 +5696,52 @@ msgstr "" msgid "Nothing found" msgstr " Rien trouvé" -#: eeschema/libframe.cpp:104 +#: eeschema/libframe.cpp:105 msgid "LibEdit: Part modified!, Continue ?" msgstr "LibEdit: composant modifié, Continuer ?" -#: eeschema/libframe.cpp:117 +#: eeschema/libframe.cpp:118 #, c-format msgid "Library %s modified!, Continue ?" msgstr "Librairie %s modifiée!, Continuer ?" -#: eeschema/libframe.cpp:343 +#: eeschema/libframe.cpp:344 msgid "Include last component changes" msgstr "Inclure les dernieres modifs du composant" -#: eeschema/libframe.cpp:406 +#: eeschema/libframe.cpp:407 msgid " Tst Pins OK!" msgstr " Test Pins OK!" -#: eeschema/libframe.cpp:480 +#: eeschema/libframe.cpp:481 msgid "Add Pin" msgstr "Addition de \"pins\"" -#: eeschema/libframe.cpp:484 +#: eeschema/libframe.cpp:485 msgid "Set Pin Opt" msgstr "Choix Options des pins" -#: eeschema/libframe.cpp:506 +#: eeschema/libframe.cpp:507 msgid "Add Rectangle" msgstr "Addition de rectangles" -#: eeschema/libframe.cpp:510 +#: eeschema/libframe.cpp:511 msgid "Add Circle" msgstr "Addition de cercle" -#: eeschema/libframe.cpp:514 +#: eeschema/libframe.cpp:515 msgid "Add Arc" msgstr "Addition d' arc" -#: eeschema/libframe.cpp:522 +#: eeschema/libframe.cpp:523 msgid "Anchor" msgstr "Ancre" -#: eeschema/libframe.cpp:526 +#: eeschema/libframe.cpp:527 msgid "Import" msgstr "Importer" -#: eeschema/libframe.cpp:532 +#: eeschema/libframe.cpp:533 msgid "Export" msgstr "Exporter" @@ -5997,26 +6001,26 @@ msgid "Display next part" msgstr "Afficher composant suivant" #: eeschema/tool_viewlib.cpp:70 -#: cvpcb/displayframe.cpp:119 +#: cvpcb/displayframe.cpp:124 #: 3d-viewer/3d_toolbar.cpp:44 msgid "zoom + (F1)" msgstr "zoom + (F1)" #: eeschema/tool_viewlib.cpp:74 -#: cvpcb/displayframe.cpp:122 +#: cvpcb/displayframe.cpp:127 #: 3d-viewer/3d_toolbar.cpp:47 msgid "zoom - (F2)" msgstr "zoom - (F2)" #: eeschema/tool_viewlib.cpp:78 -#: cvpcb/displayframe.cpp:125 +#: cvpcb/displayframe.cpp:130 #: 3d-viewer/3d_toolbar.cpp:50 msgid "redraw (F3)" msgstr "Redessin (F3)" #: eeschema/tool_viewlib.cpp:82 -#: cvpcb/displayframe.cpp:128 -#: cvpcb/displayframe.cpp:132 +#: cvpcb/displayframe.cpp:133 +#: cvpcb/displayframe.cpp:137 msgid "1:1 zoom" msgstr "1:1 zoom" @@ -6078,7 +6082,7 @@ msgstr "Librairie d #: eeschema/eestatus.cpp:303 #: eeschema/dialog_eeschema_config.cpp:174 -#: cvpcb/dialog_cvpcb_config.cpp:144 +#: cvpcb/dialog_cvpcb_config.cpp:147 msgid "NetList Formats:" msgstr " Formats NetListe:" @@ -7697,7 +7701,7 @@ msgid "Create &List" msgstr "Créer &Liste" #: eeschema/dialog_build_BOM.cpp:347 -#: cvpcb/dialog_display_options.cpp:199 +#: cvpcb/dialog_display_options.cpp:195 msgid "&Apply" msgstr "&Appliquer" @@ -7869,7 +7873,7 @@ msgid "Retro ext:" msgstr "Retro ext:" #: cvpcb/menucfg.cpp:285 -#: cvpcb/dialog_cvpcb_config.cpp:213 +#: cvpcb/dialog_cvpcb_config.cpp:217 msgid "Equiv" msgstr "Equiv" @@ -7960,11 +7964,11 @@ msgstr "Impossible de cr msgid "Load Net List" msgstr "Lire Netliste" -#: cvpcb/setvisu.cpp:43 +#: cvpcb/setvisu.cpp:42 msgid "Footprint: " msgstr "Module: " -#: cvpcb/setvisu.cpp:46 +#: cvpcb/setvisu.cpp:45 msgid "Lib: " msgstr "Lib: " @@ -8023,8 +8027,25 @@ msgstr "Choisir les fontes et leur taille pour les dialogues, infos et ligne d' msgid "Netlist Format: Pcad" msgstr " Format NetListe: Pcad" -#: cvpcb/displayframe.cpp:114 +#: cvpcb/dialog_cvpcb_config.cpp:135 +msgid "Read Cfg" +msgstr "Lire Cfg" + +#: cvpcb/dialog_cvpcb_config.cpp:144 +msgid "&PcbNew" +msgstr "&PcbNew" + +#: cvpcb/dialog_cvpcb_config.cpp:145 +msgid "&ViewLogic" +msgstr "&ViewLogic" + +#: cvpcb/dialog_cvpcb_config.cpp:146 +msgid "View &Net + Pkg" +msgstr "View &Net + Pkg" + +#: cvpcb/displayframe.cpp:119 #: pcbnew/dialog_display_options.h:43 +#: cvpcb/dialog_display_options.h:51 msgid "Display Options" msgstr "Options d'affichage" @@ -8037,41 +8058,6 @@ msgstr " Formats NetListe: EESchema" msgid "Netlist error: %s" msgstr "Erreur Netliste: %s" -#: cvpcb/dialog_display_options.cpp:151 -#: cvpcb/dialog_display_options.cpp:159 -msgid "&Line" -msgstr "&Ligne" - -#: cvpcb/dialog_display_options.cpp:152 -#: cvpcb/dialog_display_options.cpp:160 -msgid "&Filled" -msgstr "&Plein" - -#: cvpcb/dialog_display_options.cpp:153 -#: cvpcb/dialog_display_options.cpp:161 -msgid "&Sketch" -msgstr "&Contour" - -#: cvpcb/dialog_display_options.cpp:154 -msgid "Edges:" -msgstr "Contours:" - -#: cvpcb/dialog_display_options.cpp:162 -msgid "Texts:" -msgstr "Textes:" - -#: cvpcb/dialog_display_options.cpp:169 -msgid "&Pad Filled" -msgstr "&Pad plein" - -#: cvpcb/dialog_display_options.cpp:173 -msgid "Display Pad &Num" -msgstr "Afficher Numero de Pad" - -#: cvpcb/dialog_display_options.cpp:176 -msgid "Display pad number" -msgstr "Afficher numéro des pastilles" - #: cvpcb/tool_cvpcb.cpp:35 msgid "Open Netlist" msgstr "Lire Netliste" @@ -8156,31 +8142,40 @@ msgstr "Sauver les options en r msgid "Open the cvpcb manual" msgstr "Ouvrir la documentation de cvpcb" -#: cvpcb/dialog_cvpcb_config.cpp:131 -msgid "Read Cfg" -msgstr "Lire Cfg" +#: cvpcb/dialog_display_options.cpp:147 +#: cvpcb/dialog_display_options.cpp:155 +msgid "&Line" +msgstr "&Ligne" -#: cvpcb/dialog_cvpcb_config.cpp:140 -msgid "&PcbNew" -msgstr "&PcbNew" +#: cvpcb/dialog_display_options.cpp:148 +#: cvpcb/dialog_display_options.cpp:156 +msgid "&Filled" +msgstr "&Plein" -#: cvpcb/dialog_cvpcb_config.cpp:141 -msgid "&ViewLogic" -msgstr "&ViewLogic" +#: cvpcb/dialog_display_options.cpp:149 +#: cvpcb/dialog_display_options.cpp:157 +msgid "&Sketch" +msgstr "&Contour" -#: cvpcb/dialog_cvpcb_config.cpp:142 -msgid "View &Net + Pkg" -msgstr "View &Net + Pkg" +#: cvpcb/dialog_display_options.cpp:150 +msgid "Edges:" +msgstr "Contours:" -#: cvpcb/dialog_cvpcb_config.cpp:170 -#: cvpcb/dialog_cvpcb_config.cpp:202 -msgid "Add below" -msgstr "Ajout avant" +#: cvpcb/dialog_display_options.cpp:158 +msgid "Texts:" +msgstr "Textes:" -#: cvpcb/dialog_cvpcb_config.cpp:174 -#: cvpcb/dialog_cvpcb_config.cpp:206 -msgid "Add above" -msgstr "Ajout après" +#: cvpcb/dialog_display_options.cpp:165 +msgid "&Pad Filled" +msgstr "&Pad plein" + +#: cvpcb/dialog_display_options.cpp:169 +msgid "Display Pad &Num" +msgstr "Afficher Numero de Pad" + +#: cvpcb/dialog_display_options.cpp:172 +msgid "Display pad number" +msgstr "Afficher numéro des pastilles" #: kicad/preferences.cpp:33 msgid "Prefered Pdf Browser:" @@ -9077,7 +9072,6 @@ msgid "Infos:" msgstr "Infos:" #: common/selcolor.cpp:75 -#: share/selcolor.cpp:99 msgid "Colors" msgstr "Couleurs" @@ -9330,7 +9324,7 @@ msgstr "Liste tous" msgid "By Lib Browser" msgstr "Par Visualisateur libs" -#: common/basicframe.cpp:217 +#: common/basicframe.cpp:216 #, c-format msgid "Help file %s not found" msgstr "Fichier d'aide %s non trouvé" @@ -9696,11 +9690,11 @@ msgstr "" msgid "font for info display" msgstr "fonte pour affichage infos" -#: share/drawframe.cpp:377 +#: share/drawframe.cpp:385 msgid "Inch" msgstr "Pouce" -#: share/drawframe.cpp:385 +#: share/drawframe.cpp:393 msgid "??" msgstr "??" @@ -9732,7 +9726,6 @@ msgstr "Chercher" #: pcbnew/dialog_setup_libs.h:43 #: eeschema/dialog_edit_label.h:40 #: eeschema/dialog_eeschema_config.h:50 -#: cvpcb/dialog_cvpcb_config.h:39 msgid "Dialog" msgstr "Dialog" @@ -9949,6 +9942,10 @@ msgstr "Propri msgid "Component properties" msgstr "Propriétés du composant" +#: cvpcb/dialog_cvpcb_config.h:50 +msgid "Cvpcb Configuration" +msgstr "Configuration de Cvpcb" + #: gerbview/set_color.h:5 msgid "Layers 1-16" msgstr "Couches 1-16" @@ -10093,14 +10090,15 @@ msgstr "Autres" msgid "D codes id." msgstr "DCodes id." -#: share/setpage.h:54 -msgid "Page Settings" -msgstr "Ajustage opt Page" - +#: common/svg_print.h:52 #: share/svg_print.h:50 msgid "Create SVG file" msgstr "Créer Fichier SVG" +#: share/setpage.h:54 +msgid "Page Settings" +msgstr "Ajustage opt Page" + #: share/dialog_print.h:51 msgid "Print" msgstr "Imprimer" diff --git a/pcbnew/basepcbframe.cpp b/pcbnew/basepcbframe.cpp index 27f7f9d7be..b506977fdd 100644 --- a/pcbnew/basepcbframe.cpp +++ b/pcbnew/basepcbframe.cpp @@ -69,6 +69,9 @@ WinEDA_BasePcbFrame::~WinEDA_BasePcbFrame( void ) /**************************************/ int WinEDA_BasePcbFrame::BestZoom( void ) /**************************************/ +/** + * Return the "best" zoom, i.e. the zoom which shows the entire borad on screen + */ { int dx, dy, ii, jj; int bestzoom; @@ -79,7 +82,6 @@ int WinEDA_BasePcbFrame::BestZoom( void ) m_Pcb->ComputeBoundaryBox(); - /* calcul du zoom montrant tout le dessim */ dx = m_Pcb->m_BoundaryBox.GetWidth(); dy = m_Pcb->m_BoundaryBox.GetHeight(); diff --git a/pcbnew/clean.cpp b/pcbnew/clean.cpp index 856c74b800..5016a95707 100644 --- a/pcbnew/clean.cpp +++ b/pcbnew/clean.cpp @@ -14,21 +14,21 @@ #include "protos.h" -/* Constantes de controle de l'affichage des messages */ +/* Position of messages on the bottom display */ #define AFFICHE 1 #define POS_AFF_PASSE 40 #define POS_AFF_VAR 50 #define POS_AFF_MAX 60 #define POS_AFF_NUMSEGM 70 -/* Routines locales : */ +/* local functions : */ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ); static void DeleteUnconnectedTracks( WinEDA_PcbFrame* frame, wxDC* DC ); static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extremite ); static void Clean_Pcb_Items( WinEDA_PcbFrame* frame, wxDC* DC ); -/* Variables locales : */ -static bool a_color; /* couleur du message */ +/* Local Variables: */ +static bool a_color; /* message color */ static bool s_CleanVias = true; static bool s_MergeSegments = true; static bool s_DeleteUnconnectedSegm = true; @@ -48,13 +48,8 @@ static void Gen_Raccord_Track( WinEDA_PcbFrame* frame, wxDC* DC ); /*****************************************/ void WinEDA_PcbFrame::Clean_Pcb( wxDC* DC ) /*****************************************/ - -/* Regroupement des segments de meme piste. - * Suppression des points inutiles - * - via sur pad - * - points de couche et coord identiques - * - points alignes (supp du pt milieu) - */ +/* Install the track operation dialog frame +*/ { s_ConnectToPads = false; WinEDA_CleaningOptionsFrame* frame = new WinEDA_CleaningOptionsFrame( this, DC ); @@ -67,6 +62,15 @@ void WinEDA_PcbFrame::Clean_Pcb( wxDC* DC ) /************************************************************/ void Clean_Pcb_Items( WinEDA_PcbFrame* frame, wxDC* DC ) /************************************************************/ +/* Main cleaning function. + * Delete + * - Redundant points on tracks (merge aligned segments) + * - vias on pad + * - null segments + * - Redundant segments + * Create segments when track ends are incorrecty connected: + * i.e. when a track end covers a pad or a via but is not exactly on the pad or the via center + */ { frame->MsgPanel->EraseMsgBox(); frame->m_Pcb->GetNumSegmTrack(); // update the count @@ -446,9 +450,9 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) } } - /****************************/ + /*******************************/ /* delete intermediate points */ - /****************************/ + /*******************************/ nbpoints_supprimes = 0; percent = 0; @@ -489,7 +493,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) flag = no_inc = 0; - // search for a possible point that connects on START of segment + // search for a possible point that connects on the START point of the segment for( segStart = segment->Next(); ; ) { segStart = Locate_Piste_Connectee( segment, segStart, @@ -504,7 +508,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) if( segStart->Type() != TYPETRACK ) break; - /* On ne peut avoir que 1 seul segment connecte */ + /* We must have only one segment connected */ segStart->SetState( BUSY, ON ); other = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, NULL, START ); @@ -518,7 +522,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) break; } - if( flag ) /* debut de segment raccorde a un autre segment */ + if( flag ) /* We have the starting point of the segment is connecte to an other segment */ { segDelete = AlignSegment( frame->m_Pcb, segment, segStart, START ); if( segDelete ) @@ -528,7 +532,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) } } - /* Recherche d'un point possible raccorde sur FIN de segment: */ + /* search for a possible point that connects on the END point of the segment: */ for( segEnd = segment->Next(); ; ) { segEnd = Locate_Piste_Connectee( segment, segEnd, NULL, END ); @@ -540,7 +544,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) if( segEnd->Type() != TYPETRACK ) break; - /* On ne peut avoir que 1 seul segment connecte */ + /* We must have only one segment connected */ segEnd->SetState( BUSY, ON ); other = Locate_Piste_Connectee( segment, frame->m_Pcb->m_Track, NULL, END ); @@ -555,7 +559,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) break; } - if( flag & 2 ) /* FIN de segment raccorde a un autre segment */ + if( flag & 2 ) /* We have the ending point of the segment is connecte to an other segment */ { segDelete = AlignSegment( frame->m_Pcb, segment, segEnd, END ); if( segDelete ) @@ -566,7 +570,7 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) } } - if( no_inc ) /* Le segment en cours a ete modifie, il faut le reexaminer */ + if( no_inc ) /* The current segment was modified, retry to merge it */ { msg.Printf( wxT( "%d " ), nbpoints_supprimes ); Affiche_1_Parametre( frame, POS_AFF_VAR, wxEmptyString, msg, a_color ); @@ -582,18 +586,16 @@ static int clean_segments( WinEDA_PcbFrame* frame, wxDC* DC ) /****************************************************************************/ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extremite ) /****************************************************************************/ - -/** - * Function AlignSegment - */ - -/* Routine utilisee par clean_segments. - * Verifie l'alignement de pt_segm / pt_ref. et verifie que le point commun - * a faire disparaitre n'est pas sur un pad. - * l'extremite testee est debut (extremite == START) ou fin (extremite == FIN) - * si il y a alignement, modifie les coord d'extremite de pt_ref et retourne - * pt_segm. - * sinon retourne NULL +/* Function used by clean_segments. + * Test alignement of pt_segm and pt_ref (which must have acommon end). + * and see if the common point is not on a pad (i.e. if this common point can be removed). + * the ending point of pt_ref is the start point (extremite == START) + * or the end point (extremite == FIN) + * if the common end can be deleted, this function + * change the common point coordinate of the pt_ref segm + * (and therefore connect the 2 other ending points) + * and return pt_segm (which can be deleted). + * else return NULL */ { int flag = 0; @@ -604,7 +606,7 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre int segmdx = pt_segm->m_End.x - pt_segm->m_Start.x; int segmdy = pt_segm->m_End.y - pt_segm->m_Start.y; - // test for vertical alignment + // test for vertical alignment (easy to handle) if( refdx == 0 ) { if( segmdx != 0 ) @@ -613,7 +615,7 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre flag = 1; } - // test for horizontal alignment + // test for horizontal alignment (easy to handle) if( refdy == 0 ) { if( segmdy != 0 ) @@ -622,8 +624,8 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre flag = 2; } - /* tst si il y a alignement d'angle qcq - * il faut que refdy/refdx == (+/-)segmdy/segmdx, c.a.d meme direction */ + /* tst if alignement in other cases + * We must have refdy/refdx == (+/-)segmdy/segmdx, (i.e. same orientation) */ if( flag == 0 ) { if( (refdy * segmdx != refdx * segmdy) @@ -632,21 +634,26 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre flag = 4; } - /* Ici il y a alignement: il faut determiner les positions relatives - * pour supprimer le point commun et le remplacer */ + /* Here we have 2 aligned segments: + We must change the pt_ref common point only if not on a pad + (this function) is called when thre is only 2 connected segments, + and if this point is not on a pad, it can be removed and the 2 segments will be merged + */ if( extremite == START ) { - /* Ce ne doit pas etre sur un pad */ + /* We do not have a pad */ if( Fast_Locate_Pad_Connecte( Pcb, pt_ref->m_Start, g_TabOneLayerMask[pt_ref->GetLayer()] ) ) return NULL; + /* change the common point coordinate of pt_segm tu use the other point + of pt_segm (pt_segm will be removed later) */ if( pt_ref->m_Start == pt_segm->m_Start ) { pt_ref->m_Start = pt_segm->m_End; return pt_segm; } - else /* connexion par la fin de pt_segm */ + else { pt_ref->m_Start = pt_segm->m_Start; return pt_segm; @@ -654,17 +661,19 @@ static TRACK* AlignSegment( BOARD* Pcb, TRACK* pt_ref, TRACK* pt_segm, int extre } else /* extremite == END */ { - /* Ce ne doit pas etre sur un pad */ + /* We do not have a pad */ if( Fast_Locate_Pad_Connecte( Pcb, pt_ref->m_End, g_TabOneLayerMask[pt_ref->GetLayer()] ) ) return NULL; + /* change the common point coordinate of pt_segm tu use the other point + of pt_segm (pt_segm will be removed later) */ if( pt_ref->m_End == pt_segm->m_Start ) { pt_ref->m_End = pt_segm->m_End; return pt_segm; } - else /* connexion par la fin de pt_segm */ + else { pt_ref->m_End = pt_segm->m_Start; return pt_segm; @@ -768,7 +777,7 @@ int Netliste_Controle_piste( WinEDA_PcbFrame* frame, wxDC* DC, int affiche ) } } - // suppression of segments + // Removal of flagged segments for( segment = frame->m_Pcb->m_Track; segment; segment = next ) { next = (TRACK*) segment->Next(); @@ -810,13 +819,6 @@ static void Gen_Raccord_Track( WinEDA_PcbFrame* frame, wxDC* DC ) * segment first being operated on. This is done so that the subsequent tests * of connection, which do not test segment overlaps, will see this continuity. */ - -/* Teste les extremites de segments : - * si une extremite est sur un segment de piste, mais pas sur une extremite, - * le segment est coupe en 2, le point de coupure etant l'extremite du segment - * Ceci est fait pour que les tests de connexion qui ne testent que les extremites - * de segments voient la connexion - */ { TRACK* segment; TRACK* other; diff --git a/pcbnew/collectors.cpp b/pcbnew/collectors.cpp index c9f3eba73f..c67dffd98c 100644 --- a/pcbnew/collectors.cpp +++ b/pcbnew/collectors.cpp @@ -92,6 +92,14 @@ const KICAD_T GENERAL_COLLECTOR::PadsOrModules[] = { EOT }; +const KICAD_T GENERAL_COLLECTOR::ModulesAndTheirItems[] = { + TYPETEXTEMODULE, + TYPEEDGEMODULE, + TYPEPAD, + TYPEMODULE, + EOT +}; + const KICAD_T GENERAL_COLLECTOR::Tracks[] = { TYPETRACK, diff --git a/pcbnew/collectors.h b/pcbnew/collectors.h index eba1feaef9..28da5546f6 100644 --- a/pcbnew/collectors.h +++ b/pcbnew/collectors.h @@ -226,6 +226,11 @@ public: */ static const KICAD_T PadsOrModules[]; + /** + * A scan list for MODULEs and their items (for Modedit) + */ + static const KICAD_T ModulesAndTheirItems[]; + /** * A scan list for only TRACKS diff --git a/pcbnew/modedit.cpp b/pcbnew/modedit.cpp index 55fc3eb723..6b205731be 100644 --- a/pcbnew/modedit.cpp +++ b/pcbnew/modedit.cpp @@ -17,29 +17,111 @@ #include "protos.h" #include "id.h" +#include "collectors.h" -/*********************************************************************/ -BOARD_ITEM* WinEDA_ModuleEditFrame::ModeditLocateAndDisplay() -/*********************************************************************/ +/****************************************************************************/ +BOARD_ITEM* WinEDA_ModuleEditFrame::ModeditLocateAndDisplay( int aHotKeyCode ) +/****************************************************************************/ { - BOARD_ITEM* DrawStruct = GetCurItem(); + BOARD_ITEM* item = GetCurItem(); MODULE* Module = m_Pcb->m_Modules; if( Module == NULL ) return NULL; - DrawStruct = Locate_Edge_Module( Module, CURSEUR_OFF_GRILLE ); - if( DrawStruct ) + GENERAL_COLLECTORS_GUIDE guide = GetCollectorsGuide(); + + // Assign to scanList the proper item types desired based on tool type + // or hotkey that is in play. + + const KICAD_T* scanList = NULL; + + if( aHotKeyCode ) { - DrawStruct->Display_Infos( this ); + // @todo: add switch here and add calls to PcbGeneralLocateAndDisplay( int aHotKeyCode ) + // when searching is needed from a hotkey handler } else - DrawStruct = Locate( CURSEUR_OFF_GRILLE, -1 ); + { + scanList = GENERAL_COLLECTOR::ModulesAndTheirItems; + } + + m_Collector->Collect( m_Pcb, scanList, GetScreen()->RefPos( true ), guide ); + + /* Remove redundancies: when an item is found, we can remove the + * module from list + */ + if( m_Collector->GetCount() > 1 ) + { + for( int ii = 0; ii < m_Collector->GetCount(); ii++ ) + { + item = (*m_Collector)[ii]; + if( item->Type() != TYPEMODULE ) + continue; + m_Collector->Remove( ii ); + ii--; + } + } + + if( m_Collector->GetCount() <= 1 ) + { + item = (*m_Collector)[0]; + SetCurItem( item ); + } + + else // we can't figure out which item user wants, do popup menu so user can choose + { + wxMenu itemMenu; + + /* Give a title to the selection menu. This is also a cancel menu item */ + wxMenuItem * item_title = new wxMenuItem(&itemMenu, -1, _( "Selection Clarification" ) ); +#ifdef __WINDOWS__ + wxFont bold_font(*wxNORMAL_FONT); + bold_font.SetWeight(wxFONTWEIGHT_BOLD); + bold_font.SetStyle( wxFONTSTYLE_ITALIC); + item_title->SetFont(bold_font); +#endif + itemMenu.Append(item_title); + itemMenu.AppendSeparator(); + + int limit = MIN( MAX_ITEMS_IN_PICKER, m_Collector->GetCount() ); + + for( int ii = 0; iiMenuText( m_Pcb ); + xpm = item->MenuIcon(); + + ADD_MENUITEM( &itemMenu, ID_POPUP_PCB_ITEM_SELECTION_START + ii, text, xpm ); + } + + // this menu's handler is void WinEDA_BasePcbFrame::ProcessItemSelection() + // and it calls SetCurItem() which in turn calls Display_Infos() on the item. + DrawPanel->m_AbortRequest = true; // changed in false if an item + PopupMenu( &itemMenu ); // m_AbortRequest = false if an item is selected + + DrawPanel->MouseToCursorSchema(); - return DrawStruct; + DrawPanel->m_IgnoreMouseEvents = FALSE; + + // The function ProcessItemSelection() has set the current item, return it. + item = GetCurItem(); + } + + if( item ) + { + item->Display_Infos( this ); + } + + return item; } + /****************************************************************************/ void WinEDA_ModuleEditFrame::Process_Special_Functions( wxCommandEvent& event ) /****************************************************************************/ diff --git a/pcbnew/modedit_onclick.cpp b/pcbnew/modedit_onclick.cpp index c688684ba1..9265692f65 100644 --- a/pcbnew/modedit_onclick.cpp +++ b/pcbnew/modedit_onclick.cpp @@ -74,6 +74,8 @@ void WinEDA_ModuleEditFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos ) DrawStruct = GetCurItem(); if( !DrawStruct || (DrawStruct->m_Flags == 0) ) { + if( !wxGetKeyState(WXK_SHIFT) && !wxGetKeyState(WXK_ALT) && + !wxGetKeyState(WXK_CONTROL) ) DrawStruct = ModeditLocateAndDisplay(); SetCurItem( DrawStruct ); } diff --git a/pcbnew/moduleframe.cpp b/pcbnew/moduleframe.cpp index 7ffd9def37..37d8c2db2f 100644 --- a/pcbnew/moduleframe.cpp +++ b/pcbnew/moduleframe.cpp @@ -19,6 +19,9 @@ /* class WinEDA_ModuleEditFrame */ /********************************/ BEGIN_EVENT_TABLE( WinEDA_ModuleEditFrame, wxFrame ) +COMMON_EVENTS_DRAWFRAME EVT_MENU_RANGE( ID_POPUP_PCB_ITEM_SELECTION_START, + ID_POPUP_PCB_ITEM_SELECTION_END, + WinEDA_BasePcbFrame::ProcessItemSelection ) COMMON_EVENTS_DRAWFRAME EVT_CLOSE( WinEDA_ModuleEditFrame::OnCloseWindow ) EVT_SIZE( WinEDA_ModuleEditFrame::OnSize )