From e3a3d16af861e5b28bfcfa2125c5cf3825ff7ceb Mon Sep 17 00:00:00 2001 From: CHARRAS Date: Sat, 12 Jan 2008 20:31:56 +0000 Subject: [PATCH] small bugs fixed. Added: Support for microvias (see changelog) --- 3d-viewer/3d_draw.cpp | 3 +- change_log.txt | 10 + eeschema/netform.cpp | 3 +- gerbview/export_to_pcbnew.cpp | 2 +- include/id.h | 1 + include/pcbstruct.h | 11 + internat/fr/kicad.mo | Bin 140740 -> 139652 bytes internat/fr/kicad.po | 2427 +++++++++++++++---------------- pcbnew/class_board.cpp | 6 + pcbnew/class_board_item.cpp | 8 +- pcbnew/class_drc_item.cpp | 2 + pcbnew/class_marker.cpp | 24 +- pcbnew/class_marker.h | 25 +- pcbnew/class_track.cpp | 104 +- pcbnew/class_track.h | 77 +- pcbnew/classpcb.cpp | 30 +- pcbnew/dialog_track_options.cpp | 138 +- pcbnew/dialog_track_options.h | 12 + pcbnew/dialog_track_options.pjd | 757 +++++++--- pcbnew/drc.cpp | 50 +- pcbnew/drc_stuff.h | 368 ++--- pcbnew/edit.cpp | 10 +- pcbnew/edit_track_width.cpp | 2 + pcbnew/editrack-part2.cpp | 40 +- pcbnew/gendrill.cpp | 18 +- pcbnew/hotkeys.cpp | 29 +- pcbnew/hotkeys.h | 4 +- pcbnew/ioascii.cpp | 32 +- pcbnew/onrightclick.cpp | 8 +- pcbnew/pcbcfg.h | 245 ++-- pcbnew/pcbnew.h | 22 +- pcbnew/plotps.cpp | 8 +- pcbnew/router.cpp | 2 +- pcbnew/set_color.h | 16 +- pcbnew/via_edit.cpp | 189 +-- 35 files changed, 2700 insertions(+), 1983 deletions(-) diff --git a/3d-viewer/3d_draw.cpp b/3d-viewer/3d_draw.cpp index ef1a108908..7b763ce68a 100644 --- a/3d-viewer/3d_draw.cpp +++ b/3d-viewer/3d_draw.cpp @@ -250,7 +250,8 @@ double zpos, height; int color; r = via->m_Width * g_Parm_3D_Visu.m_BoardScale / 2; - hole = g_Parm_3D_Visu.m_BoardSettings->m_ViaDrill * g_Parm_3D_Visu.m_BoardScale / 2; + hole = via->GetDrillValue(); + hole *= g_Parm_3D_Visu.m_BoardScale / 2; x = via->m_Start.x * g_Parm_3D_Visu.m_BoardScale; y = via->m_Start.y * g_Parm_3D_Visu.m_BoardScale; diff --git a/change_log.txt b/change_log.txt index ada586dc25..2e9004e139 100644 --- a/change_log.txt +++ b/change_log.txt @@ -4,6 +4,16 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. +2007-Dec-12 UPDATE Jean-Pierre Charras +================================================================================ ++eeschema: + missing footprints in export netlist (bug 1867321) + Affected: PadsPcb converter did not list all footprints + ++pcbnew: + fixed: memory not freeed in block copy (minor bug) + Support for micro vias (generation of drill files not finished) + 2008-jan-06 UPDATE Jean-Pierre Charras ================================================================================ +pcbnew: diff --git a/eeschema/netform.cpp b/eeschema/netform.cpp index 0ffa83b491..432b2eade0 100644 --- a/eeschema/netform.cpp +++ b/eeschema/netform.cpp @@ -250,7 +250,8 @@ void Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, /* Create netlist module section */ fprintf( tmpfile, "$BeginComponentList\n" ); - for( CurrScreen = ScreenSch; CurrScreen != NULL; CurrScreen = (BASE_SCREEN*) CurrScreen->Pnext ) + EDA_ScreenList ScreenList( NULL ); + for( CurrScreen = ScreenList.GetFirst(); CurrScreen != NULL; CurrScreen = ScreenList.GetNext() ) { for( DrawList = CurrScreen->EEDrawList; DrawList != NULL; DrawList = DrawList->Pnext ) { diff --git a/gerbview/export_to_pcbnew.cpp b/gerbview/export_to_pcbnew.cpp index 3fcb17d0d3..a12dc02cc3 100644 --- a/gerbview/export_to_pcbnew.cpp +++ b/gerbview/export_to_pcbnew.cpp @@ -181,7 +181,7 @@ static int SavePcbFormatAscii( WinEDA_GerberFrame* frame, FILE* aFile, newtrack->SetLayer( 0x0F ); // Layers are 0 to 15 (Cu/Cmp) - newtrack->m_Drill = -1; + newtrack->SetDrillDefault(); // Compute the via position from track position ( Via position is the // position of the middle of the track segment ) diff --git a/include/id.h b/include/id.h index 7c3a201fdd..0642b3ef95 100644 --- a/include/id.h +++ b/include/id.h @@ -577,6 +577,7 @@ enum main_id { ID_POPUP_PCB_EDIT_COTATION, ID_POPUP_PCB_END_TRACK, ID_POPUP_PCB_PLACE_VIA, + ID_POPUP_PCB_PLACE_MICROVIA, ID_POPUP_PCB_IMPORT_PAD_SETTINGS, ID_POPUP_PCB_EXPORT_PAD_SETTINGS, diff --git a/include/pcbstruct.h b/include/pcbstruct.h index c9f5111d95..c350b92cd0 100644 --- a/include/pcbstruct.h +++ b/include/pcbstruct.h @@ -150,7 +150,10 @@ class EDA_BoardDesignSettings public: int m_CopperLayerCount; // Number of copper layers for this design int m_ViaDrill; // via drill (for the entire board) + int m_MicroViaDrill; // micro via drill (for the entire board) int m_CurrentViaSize; // Current via size + int m_CurrentMicroViaSize; // Current micro via size + bool m_MicroViasAllowed; // true to allow micro vias int m_ViaSizeHistory[HIST0RY_NUMBER]; // Last HIST0RY_NUMBER used via sizes int m_CurrentViaType; // via type (BLIND, TROUGHT ...), bits 1 and 2 (not 0 and 1) int m_CurrentTrackWidth; // current track width @@ -222,6 +225,14 @@ public: * @return BOARD_ITEM* - the one selected, or NULL. */ BOARD_ITEM* GetCurItem() const { return (BOARD_ITEM*) BASE_SCREEN::GetCurItem(); } + + /* Return true if a microvia can be put on board + * A microvia ia a small via restricted to 2 near neighbour layers + * because its is hole is made by laser which can penetrate only one layer + * It is mainly used to connect BGA to the first inner layer + * And it is allowed from an external layer to the first inner layer + */ + bool IsMicroViaAcceptable(void); }; /**********************************/ diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index b9cb42970bb81112f7a6e389c4cb10474085f6ad..2f966f1b4484b8c2f25ae85c43abea805540fc5f 100644 GIT binary patch delta 50951 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 delta 52179 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\n" "MIME-Version: 1.0\n" @@ -21,195 +21,26 @@ msgstr "" "X-Poedit-SearchPath-6: 3d-viewer\n" "X-Poedit-SearchPath-7: share\n" -#: pcbnew/gendrill.cpp:150 -msgid "Drill tools" -msgstr "Outils de perçage" +#: pcbnew/specctra.cpp:1557 +#: pcbnew/specctra.cpp:1564 +msgid "Expecting" +msgstr "Attendu" -#: pcbnew/gendrill.cpp:171 -#: pcbnew/dialog_general_options.cpp:272 -#: gerbview/options.cpp:186 -msgid "millimeters" -msgstr "millimetres" +#: pcbnew/specctra.cpp:1573 +#: pcbnew/specctra.cpp:1580 +msgid "Unexpected" +msgstr "Inattendu" -#: pcbnew/gendrill.cpp:171 -#: eeschema/dialog_options.cpp:246 -msgid "inches" -msgstr "Pouces" - -#: pcbnew/gendrill.cpp:173 -msgid "Drill Units:" -msgstr "Unités perçage:" - -#: pcbnew/gendrill.cpp:181 -msgid "decimal format" -msgstr "Format décimal" - -#: pcbnew/gendrill.cpp:182 -msgid "suppress leading zeros" -msgstr "Suppression zeros de tête" - -#: pcbnew/gendrill.cpp:182 -msgid "suppress trailing zeros" -msgstr "Suppression zeros de fin" - -#: pcbnew/gendrill.cpp:182 -msgid "keep zeros" -msgstr "Garder les zéros" - -#: pcbnew/gendrill.cpp:185 -msgid "Zeros Format" -msgstr "Format des zéros" - -#: pcbnew/gendrill.cpp:192 -#: pcbnew/gendrill.cpp:452 -msgid "2:3" -msgstr "2:3" - -#: pcbnew/gendrill.cpp:192 -#: pcbnew/gendrill.cpp:453 -msgid "2:4" -msgstr "2:4" - -#: pcbnew/gendrill.cpp:193 -#: pcbnew/gendrill.cpp:458 -msgid "3:2" -msgstr "3:2" - -#: pcbnew/gendrill.cpp:193 -#: pcbnew/gendrill.cpp:459 -msgid "3:3" -msgstr "3:3" - -#: pcbnew/gendrill.cpp:199 -msgid "Precision" -msgstr "Précision" - -#: pcbnew/gendrill.cpp:211 -msgid "absolute" -msgstr "Absolu" - -#: pcbnew/gendrill.cpp:211 -msgid "auxiliary axis" -msgstr "Axe Auxiliaire" - -#: pcbnew/gendrill.cpp:213 -msgid "Drill Origin:" -msgstr "Origine des coord de percage:" - -#: pcbnew/gendrill.cpp:222 -#: pcbnew/gendrill.cpp:230 -#: eeschema/libedit.cpp:41 -#: eeschema/viewlibs.cpp:120 -msgid "None" -msgstr "Aucun" - -#: pcbnew/gendrill.cpp:222 -msgid "drill sheet (HPGL)" -msgstr "Plan de perçage (HPGL)" - -#: pcbnew/gendrill.cpp:222 -msgid "drill sheet (PostScript)" -msgstr "Plan de perçage (Postscript)" - -#: pcbnew/gendrill.cpp:224 -msgid "Drill Sheet:" -msgstr "Plan de perçage:" - -#: pcbnew/gendrill.cpp:230 -msgid "Drill report" -msgstr "Rapport de perçage" - -#: pcbnew/gendrill.cpp:232 -msgid "Drill Report:" -msgstr "Rapport de perçage:" - -#: pcbnew/gendrill.cpp:238 -msgid "Via Drill" -msgstr "Perçage des vias" - -#: pcbnew/gendrill.cpp:243 -#: eeschema/plothpgl.cpp:239 -msgid "Pen Number" -msgstr "Numéro de plume" - -#: pcbnew/gendrill.cpp:246 -msgid "Speed (cm/s)" -msgstr "Vitesse plume ( cm/s )" - -#: pcbnew/gendrill.cpp:249 -msgid "mirror y axis" -msgstr "Miroir sur axe Y" - -#: pcbnew/gendrill.cpp:253 -msgid "minimal header" -msgstr "Entête minimal" - -#: pcbnew/gendrill.cpp:259 -msgid "&Execute" -msgstr "&Exécuter" - -#: pcbnew/gendrill.cpp:263 -#: eeschema/plotps.cpp:208 -#: share/svg_print.cpp:222 -#: share/dialog_print.cpp:225 -msgid "&Close" -msgstr "&Fermer" - -#: pcbnew/gendrill.cpp:389 -msgid "Drill file" -msgstr "Fichier de percage" - -#: pcbnew/gendrill.cpp:403 -#: pcbnew/gendrill.cpp:1623 -#: pcbnew/plotps.cpp:51 -#: pcbnew/xchgmod.cpp:642 -msgid "Unable to create file " -msgstr "Impossible de créer le fichier " - -#: pcbnew/gendrill.cpp:410 -#: pcbnew/gendrill.cpp:1036 -#: pcbnew/gendrill.cpp:1629 -#: pcbnew/plothpgl.cpp:74 -#: pcbnew/plotps.cpp:58 -#: pcbnew/plotgerb.cpp:84 -msgid "File" -msgstr "Fichier" - -#: pcbnew/gendrill.cpp:416 -#: pcbnew/gendrill.cpp:1041 -#: pcbnew/gendrill.cpp:1634 -msgid "Tools" -msgstr "Outils" - -#: pcbnew/gendrill.cpp:420 -#: pcbnew/gendrill.cpp:1110 -#: pcbnew/gendrill.cpp:1686 -#: pcbnew/class_pad.cpp:1085 -#: pcbnew/class_track.cpp:822 -#: pcbnew/class_track.cpp:827 -msgid "Drill" -msgstr "Perçage" - -#: pcbnew/gendrill.cpp:971 -msgid "Drill Map file" -msgstr "Fichier Plan de perçage" - -#: pcbnew/gendrill.cpp:1030 +#: pcbnew/specctra.cpp:1601 +#: pcbnew/specctra.cpp:2846 #, c-format -msgid "Unable to create file <%s>" -msgstr "Impossible de créer fichier <%s>" +msgid "Unable to open file \"%s\"" +msgstr "Ne peut pas ouvrirle fichier \"%s\"" -#: pcbnew/gendrill.cpp:1332 -msgid "" -" Drill map: Too many diameter values to draw to draw one symbol per drill value (max 13)\n" -"Plot uses circle shape for some drill values" -msgstr "" -"Plan de perçage: trop de diametres différents pour tracer 1 symbole par diametre\n" -"Le tracé utilise des cercles pour quelques valeurs " - -#: pcbnew/gendrill.cpp:1608 -msgid "Drill Report file" -msgstr "Fichier rapport de perçage:" +#: pcbnew/specctra.cpp:2814 +#, c-format +msgid "System file error writing to file \"%s\"" +msgstr "Erreur système sur écriture fichier \"%s\"" #: pcbnew/files.cpp:57 msgid "Recovery file " @@ -255,7 +86,6 @@ msgid "Warning: unable to create bakfile " msgstr "Attention: Impossible de créer fichier backup " #: pcbnew/files.cpp:326 -#: pcbnew/plothpgl.cpp:67 #: pcbnew/librairi.cpp:255 #: pcbnew/librairi.cpp:401 #: pcbnew/librairi.cpp:551 @@ -264,6 +94,7 @@ msgstr "Attention: Impossible de cr #: pcbnew/gen_modules_placefile.cpp:98 #: pcbnew/gen_modules_placefile.cpp:251 #: pcbnew/export_gencad.cpp:83 +#: pcbnew/plothpgl.cpp:67 #: eeschema/plothpgl.cpp:560 #: eeschema/plotps.cpp:389 #: cvpcb/genequiv.cpp:42 @@ -311,6 +142,12 @@ msgstr "Affichage coord Polaires" msgid "Inches" msgstr "Pouces" +#: pcbnew/dialog_general_options.cpp:272 +#: pcbnew/gendrill.cpp:171 +#: gerbview/options.cpp:186 +msgid "millimeters" +msgstr "millimetres" + #: pcbnew/dialog_general_options.cpp:275 #: eeschema/dialog_options.cpp:248 #: gerbview/options.cpp:187 @@ -411,13 +248,13 @@ msgstr "Controle la capture du curseur pcb quand le curseuir souris est sur le p #: pcbnew/dialog_general_options.cpp:368 #: pcbnew/dialog_graphic_items_options.cpp:263 +#: pcbnew/dialog_pad_edit.cpp:217 #: pcbnew/dialog_initpcb.cpp:161 #: pcbnew/dialog_edit_mod_text.cpp:213 -#: pcbnew/dialog_track_options.cpp:186 +#: pcbnew/dialog_track_options.cpp:212 #: pcbnew/dialog_display_options.cpp:282 #: pcbnew/swap_layers.cpp:220 #: pcbnew/set_grid.cpp:171 -#: pcbnew/dialog_pad_edit.cpp:217 #: pcbnew/dialog_drc.cpp:549 #: eeschema/symbtext.cpp:174 #: eeschema/dialog_options.cpp:274 @@ -438,14 +275,14 @@ msgstr "&OK" #: pcbnew/dialog_general_options.cpp:372 #: pcbnew/dialog_graphic_items_options.cpp:267 +#: pcbnew/dialog_pad_edit.cpp:221 #: pcbnew/dialog_netlist.cpp:189 #: pcbnew/dialog_initpcb.cpp:164 #: pcbnew/dialog_edit_mod_text.cpp:217 -#: pcbnew/dialog_track_options.cpp:190 +#: pcbnew/dialog_track_options.cpp:216 #: pcbnew/dialog_display_options.cpp:286 #: pcbnew/swap_layers.cpp:224 #: pcbnew/set_grid.cpp:176 -#: pcbnew/dialog_pad_edit.cpp:221 #: pcbnew/zones.cpp:219 #: pcbnew/dialog_zones_by_polygon.cpp:204 #: pcbnew/dialog_drc.cpp:545 @@ -470,19 +307,19 @@ msgstr "&OK" msgid "&Cancel" msgstr "&Annuler" -#: pcbnew/edit_track_width.cpp:94 +#: pcbnew/edit_track_width.cpp:96 msgid "Change track width (entire NET) ?" msgstr "Change largeur piste ( NET complet) ?" -#: pcbnew/edit_track_width.cpp:128 +#: pcbnew/edit_track_width.cpp:130 msgid "Edit All Tracks and Vias Sizes" msgstr "Editer TOUTES Pistes et Vias" -#: pcbnew/edit_track_width.cpp:133 +#: pcbnew/edit_track_width.cpp:135 msgid "Edit All Via Sizes" msgstr "Editer TOUTES Vias" -#: pcbnew/edit_track_width.cpp:138 +#: pcbnew/edit_track_width.cpp:140 msgid "Edit All Track Sizes" msgstr "Editer TOUTES Pistes" @@ -533,15 +370,15 @@ msgid "3D settings" msgstr "3D Caract" #: pcbnew/dialog_edit_module.cpp:118 -#: pcbnew/pcbtexte.cpp:111 -#: pcbnew/sel_layer.cpp:158 -#: pcbnew/sel_layer.cpp:316 #: pcbnew/muonde.cpp:348 -#: pcbnew/block.cpp:160 +#: pcbnew/pcbtexte.cpp:111 +#: pcbnew/block.cpp:157 #: pcbnew/cotation.cpp:105 #: pcbnew/mirepcb.cpp:99 #: pcbnew/set_color.cpp:353 #: pcbnew/dialog_zones_by_polygon.cpp:201 +#: pcbnew/sel_layer.cpp:158 +#: pcbnew/sel_layer.cpp:316 #: eeschema/sheetlab.cpp:93 #: eeschema/eelayer.cpp:251 #: gerbview/reglage.cpp:108 @@ -554,19 +391,19 @@ msgid "OK" msgstr "OK" #: pcbnew/dialog_edit_module.cpp:122 -#: pcbnew/pcbtexte.cpp:116 -#: pcbnew/sel_layer.cpp:162 -#: pcbnew/sel_layer.cpp:320 #: pcbnew/muonde.cpp:352 +#: pcbnew/pcbtexte.cpp:116 #: pcbnew/modedit_onclick.cpp:203 #: pcbnew/modedit_onclick.cpp:235 #: pcbnew/onrightclick.cpp:145 #: pcbnew/onrightclick.cpp:159 -#: pcbnew/block.cpp:157 -#: pcbnew/globaleditpad.cpp:108 +#: pcbnew/block.cpp:154 #: pcbnew/cotation.cpp:109 #: pcbnew/mirepcb.cpp:103 #: pcbnew/set_color.cpp:357 +#: pcbnew/sel_layer.cpp:162 +#: pcbnew/sel_layer.cpp:320 +#: pcbnew/globaleditpad.cpp:108 #: eeschema/onrightclick.cpp:122 #: eeschema/onrightclick.cpp:134 #: eeschema/sheetlab.cpp:97 @@ -622,7 +459,9 @@ msgid "Delete Field" msgstr "Supprimer Champ" #: pcbnew/dialog_edit_module.cpp:234 -#: common/common.cpp:280 +#: common/common.cpp:298 +#: common/common.cpp:309 +#: common/common.cpp:342 msgid "Component" msgstr "Composant" @@ -633,21 +472,21 @@ msgstr "Cuivre" #: pcbnew/dialog_edit_module.cpp:235 #: pcbnew/class_text_mod.cpp:369 #: pcbnew/class_text_mod.cpp:373 -#: pcbnew/sel_layer.cpp:145 -#: pcbnew/class_pcb_text.cpp:198 +#: pcbnew/class_pcb_text.cpp:177 #: pcbnew/class_pad.cpp:1062 -#: pcbnew/classpcb.cpp:210 -#: pcbnew/class_track.cpp:806 +#: pcbnew/classpcb.cpp:189 +#: pcbnew/class_track.cpp:779 #: pcbnew/class_module.cpp:1217 -#: pcbnew/class_zone.cpp:441 +#: pcbnew/sel_layer.cpp:145 +#: pcbnew/class_zone.cpp:483 #: gerbview/affiche.cpp:109 msgid "Layer" msgstr "Couche" #: pcbnew/dialog_edit_module.cpp:243 #: pcbnew/dialog_edit_module.cpp:289 -#: pcbnew/pcbtexte.cpp:176 #: pcbnew/muonde.cpp:360 +#: pcbnew/pcbtexte.cpp:176 #: pcbnew/cotation.cpp:113 #: eeschema/dialog_options.cpp:229 #: eeschema/onrightclick.cpp:306 @@ -662,7 +501,7 @@ msgstr "User" #: pcbnew/dialog_edit_module.cpp:246 #: pcbnew/class_text_mod.cpp:383 -#: pcbnew/class_pcb_text.cpp:209 +#: pcbnew/class_pcb_text.cpp:188 #: pcbnew/class_pad.cpp:1104 #: pcbnew/class_module.cpp:1240 #: eeschema/affiche.cpp:117 @@ -914,6 +753,101 @@ msgstr "Fichiers Librairies" msgid "Library exists! No Change" msgstr "Librairie existante! Pas de changement" +#: pcbnew/muonde.cpp:149 +msgid "Gap" +msgstr "Gap" + +#: pcbnew/muonde.cpp:154 +msgid "Stub" +msgstr "Stub" + +#: pcbnew/muonde.cpp:160 +msgid "Arc Stub" +msgstr "Arc Stub" + +#: pcbnew/muonde.cpp:175 +#: common/common.cpp:53 +msgid " (mm):" +msgstr " (mm):" + +#: pcbnew/muonde.cpp:182 +msgid " (inch):" +msgstr " (pouce):" + +#: pcbnew/muonde.cpp:189 +#: pcbnew/muonde.cpp:202 +#: pcbnew/gen_self.h:231 +msgid "Incorrect number, abort" +msgstr "Nombre incorrect, arret" + +#: pcbnew/muonde.cpp:198 +msgid "Angle (0.1deg):" +msgstr "Angle (0.1deg):" + +#: pcbnew/muonde.cpp:330 +msgid "Complex shape" +msgstr "Formr complexe" + +#: pcbnew/muonde.cpp:356 +msgid "Read Shape Descr File..." +msgstr "Lire fichier de description de forme..." + +#: pcbnew/muonde.cpp:360 +msgid "Symmetrical" +msgstr "Symétrique" + +#: pcbnew/muonde.cpp:360 +msgid "Mirrored" +msgstr "Miroir" + +#: pcbnew/muonde.cpp:362 +msgid "Shape Option" +msgstr "Option Forme" + +#: pcbnew/muonde.cpp:367 +#: pcbnew/pcbtexte.cpp:126 +#: pcbnew/cotation.cpp:125 +#: pcbnew/mirepcb.cpp:108 +#: 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/muonde.cpp:428 +msgid "Read descr shape file" +msgstr "Lire fichier de description de forme" + +#: pcbnew/muonde.cpp:444 +msgid "File not found" +msgstr "fichier non trouvé" + +#: pcbnew/muonde.cpp:548 +msgid "Shape has a null size!" +msgstr "La forme a une taille nulle" + +#: pcbnew/muonde.cpp:553 +msgid "Shape has no points!" +msgstr "La forme n'a pas de points" + +#: pcbnew/muonde.cpp:679 +msgid "No pad for this module" +msgstr "Pas de pad dans ce module" + +#: pcbnew/muonde.cpp:684 +msgid "Only one pad for this module" +msgstr "Seulement un pad dans ce module" + +#: pcbnew/muonde.cpp:698 +msgid "Gap (mm):" +msgstr "Gap (mm):" + +#: pcbnew/muonde.cpp:704 +msgid "Gap (inch):" +msgstr "Gap (inch):" + #: pcbnew/librairi.cpp:48 msgid "Import Module:" msgstr "Importer Module:" @@ -1354,16 +1288,16 @@ msgid "Module" msgstr "Module" #: pcbnew/class_text_mod.cpp:359 -#: pcbnew/classpcb.cpp:194 +#: pcbnew/classpcb.cpp:173 #: pcbnew/class_marker.cpp:112 -#: pcbnew/class_track.cpp:750 -#: pcbnew/class_zone.cpp:422 +#: pcbnew/class_track.cpp:723 +#: pcbnew/class_zone.cpp:454 #: gerbview/affiche.cpp:93 msgid "Type" msgstr "Type" #: pcbnew/class_text_mod.cpp:363 -#: pcbnew/class_pcb_text.cpp:204 +#: pcbnew/class_pcb_text.cpp:183 #: pcbnew/dialog_display_options.cpp:275 #: eeschema/dialog_options.cpp:265 #: gerbview/affiche.cpp:43 @@ -1371,7 +1305,7 @@ msgid "No" msgstr "Non" #: pcbnew/class_text_mod.cpp:365 -#: pcbnew/class_pcb_text.cpp:206 +#: pcbnew/class_pcb_text.cpp:185 #: pcbnew/dialog_display_options.cpp:274 #: eeschema/dialog_options.cpp:264 #: gerbview/affiche.cpp:45 @@ -1380,7 +1314,7 @@ msgstr "Oui" #: pcbnew/class_text_mod.cpp:380 #: pcbnew/pcbtexte.cpp:176 -#: pcbnew/class_pcb_text.cpp:202 +#: pcbnew/class_pcb_text.cpp:181 #: pcbnew/modedit_onclick.cpp:254 #: pcbnew/cotation.cpp:113 #: gerbview/affiche.cpp:40 @@ -1390,11 +1324,11 @@ msgstr "Miroir" #: pcbnew/class_text_mod.cpp:386 #: pcbnew/pcbtexte.cpp:130 -#: pcbnew/class_pcb_text.cpp:212 +#: pcbnew/class_pcb_text.cpp:191 #: pcbnew/dialog_edit_mod_text.cpp:204 -#: pcbnew/classpcb.cpp:215 +#: pcbnew/classpcb.cpp:194 #: pcbnew/cotation.cpp:129 -#: pcbnew/class_track.cpp:830 +#: pcbnew/class_track.cpp:806 #: pcbnew/mirepcb.cpp:113 #: pcbnew/class_edge_mod.cpp:297 #: eeschema/dialog_cmp_graphic_properties.cpp:188 @@ -1405,14 +1339,14 @@ msgid "Width" msgstr "Epaisseur" #: pcbnew/class_text_mod.cpp:389 -#: pcbnew/class_pcb_text.cpp:215 +#: pcbnew/class_pcb_text.cpp:194 #: pcbnew/class_pad.cpp:1075 #: gerbview/affiche.cpp:55 msgid "H Size" msgstr "Taille H" #: pcbnew/class_text_mod.cpp:392 -#: pcbnew/class_pcb_text.cpp:218 +#: pcbnew/class_pcb_text.cpp:197 #: pcbnew/class_pad.cpp:1079 #: gerbview/affiche.cpp:58 msgid "V Size" @@ -1429,18 +1363,6 @@ msgstr "Propri msgid "Text:" msgstr "Texte:" -#: pcbnew/pcbtexte.cpp:126 -#: pcbnew/muonde.cpp:367 -#: pcbnew/cotation.cpp:125 -#: pcbnew/mirepcb.cpp:108 -#: 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/pcbtexte.cpp:134 msgid "Position" msgstr "Position" @@ -1450,37 +1372,65 @@ msgstr "Position" msgid "Orientation" msgstr "Orientation" -#: pcbnew/sel_layer.cpp:92 -msgid "Select Layer:" -msgstr "Selection couche:" +#: pcbnew/clean.cpp:179 +msgid "Delete unconnected tracks:" +msgstr "Suppression Pistes non connectées" -#: pcbnew/sel_layer.cpp:137 -msgid "(Deselect)" -msgstr "(Deselection)" +#: pcbnew/clean.cpp:198 +msgid "ViaDef" +msgstr "ViaDef" -#: pcbnew/sel_layer.cpp:238 -msgid "Less than two copper layers are being used." -msgstr "Il y a moins de 2 couches cuivre utilisées." +#: pcbnew/clean.cpp:370 +msgid "Clean Null Segments" +msgstr "Nettoyage segments nulls" -#: pcbnew/sel_layer.cpp:239 -msgid "Hence Layer Pairs cannot be specified." -msgstr "Donc les paires de couche ne peuvent pas être spécifiées" +#: pcbnew/clean.cpp:462 +msgid "Merging Segments:" +msgstr "Associe Segment" -#: pcbnew/sel_layer.cpp:263 -msgid "Select Layer Pair:" -msgstr "Selection paire de couches" +#: pcbnew/clean.cpp:464 +msgid "Merge" +msgstr "Merge" -#: pcbnew/sel_layer.cpp:294 -msgid "Top Layer" -msgstr "Couche Sup." +#: pcbnew/clean.cpp:464 +#: pcbnew/dialog_pad_edit.cpp:186 +#: eeschema/dialog_erc.cpp:192 +#: eeschema/dialog_erc.cpp:196 +#: eeschema/dialog_edit_component_in_schematic.cpp:171 +msgid "0" +msgstr "0" -#: pcbnew/sel_layer.cpp:299 -msgid "Bottom Layer" -msgstr "Couche Inf." +#: pcbnew/clean.cpp:480 +msgid "Merge: " +msgstr "Merge: " -#: pcbnew/sel_layer.cpp:358 -msgid "The Top Layer and Bottom Layer must differ" -msgstr "Les couches dessus et dessous doivent différer" +#: pcbnew/clean.cpp:710 +msgid "DRC Control:" +msgstr "Controle DRC:" + +#: pcbnew/clean.cpp:715 +msgid "NetCtr" +msgstr "NetCtr" + +#: pcbnew/clean.cpp:1061 +msgid "Centre" +msgstr "Centre" + +#: pcbnew/clean.cpp:1061 +msgid "0 " +msgstr "0" + +#: pcbnew/clean.cpp:1072 +msgid "Pads: " +msgstr "Pastilles: " + +#: pcbnew/clean.cpp:1076 +msgid "Max" +msgstr "Max" + +#: pcbnew/clean.cpp:1079 +msgid "Segm" +msgstr "Segm" #: pcbnew/autorout.cpp:59 msgid "Net not selected" @@ -1502,89 +1452,6 @@ msgstr "Pas de memoire pour autoroutage" msgid "Place Cells" msgstr "Place Cells" -#: pcbnew/muonde.cpp:149 -msgid "Gap" -msgstr "Gap" - -#: pcbnew/muonde.cpp:154 -msgid "Stub" -msgstr "Stub" - -#: pcbnew/muonde.cpp:160 -msgid "Arc Stub" -msgstr "Arc Stub" - -#: pcbnew/muonde.cpp:175 -#: common/common.cpp:52 -msgid " (mm):" -msgstr " (mm):" - -#: pcbnew/muonde.cpp:182 -msgid " (inch):" -msgstr " (pouce):" - -#: pcbnew/muonde.cpp:189 -#: pcbnew/muonde.cpp:202 -#: pcbnew/gen_self.h:231 -msgid "Incorrect number, abort" -msgstr "Nombre incorrect, arret" - -#: pcbnew/muonde.cpp:198 -msgid "Angle (0.1deg):" -msgstr "Angle (0.1deg):" - -#: pcbnew/muonde.cpp:330 -msgid "Complex shape" -msgstr "Formr complexe" - -#: pcbnew/muonde.cpp:356 -msgid "Read Shape Descr File..." -msgstr "Lire fichier de description de forme..." - -#: pcbnew/muonde.cpp:360 -msgid "Symmetrical" -msgstr "Symétrique" - -#: pcbnew/muonde.cpp:360 -msgid "Mirrored" -msgstr "Miroir" - -#: pcbnew/muonde.cpp:362 -msgid "Shape Option" -msgstr "Option Forme" - -#: pcbnew/muonde.cpp:428 -msgid "Read descr shape file" -msgstr "Lire fichier de description de forme" - -#: pcbnew/muonde.cpp:444 -msgid "File not found" -msgstr "fichier non trouvé" - -#: pcbnew/muonde.cpp:548 -msgid "Shape has a null size!" -msgstr "La forme a une taille nulle" - -#: pcbnew/muonde.cpp:553 -msgid "Shape has no points!" -msgstr "La forme n'a pas de points" - -#: pcbnew/muonde.cpp:679 -msgid "No pad for this module" -msgstr "Pas de pad dans ce module" - -#: pcbnew/muonde.cpp:684 -msgid "Only one pad for this module" -msgstr "Seulement un pad dans ce module" - -#: pcbnew/muonde.cpp:698 -msgid "Gap (mm):" -msgstr "Gap (mm):" - -#: pcbnew/muonde.cpp:704 -msgid "Gap (inch):" -msgstr "Gap (inch):" - #: pcbnew/dialog_graphic_items_options.cpp:194 msgid "Graphics:" msgstr "Eléments graphiques;" @@ -1629,13 +1496,143 @@ msgstr "Hauteur Texte Module" msgid "Text Module Size H" msgstr "Largeur Texte Module" -#: pcbnew/zone_filling_algorithm.cpp:155 -msgid "No pads or starting point found to fill this zone outline" -msgstr "Pas de pads ou de points de départ pour remplir ce contour de zone" +#: pcbnew/dialog_pad_edit.cpp:157 +msgid "Pad Num :" +msgstr "Num Pad :" -#: pcbnew/zone_filling_algorithm.cpp:193 -msgid "Ok" -msgstr "Ok" +#: pcbnew/dialog_pad_edit.cpp:163 +msgid "Pad Net Name :" +msgstr "NetName Pad:" + +#: pcbnew/dialog_pad_edit.cpp:176 +#: pcbnew/dialog_pad_edit.cpp:196 +#: pcbnew/classpcb.cpp:178 +#: pcbnew/class_board_item.cpp:107 +#: pcbnew/class_track.cpp:749 +msgid "Circle" +msgstr "Cercle" + +#: pcbnew/dialog_pad_edit.cpp:177 +#: pcbnew/dialog_pad_edit.cpp:197 +msgid "Oval" +msgstr "Ovale" + +#: pcbnew/dialog_pad_edit.cpp:178 +msgid "Drill Shape:" +msgstr "Forme du perçage:" + +#: pcbnew/dialog_pad_edit.cpp:187 +msgid "90" +msgstr "90" + +#: pcbnew/dialog_pad_edit.cpp:188 +#: eeschema/dialog_edit_component_in_schematic.cpp:174 +msgid "-90" +msgstr "-90" + +#: pcbnew/dialog_pad_edit.cpp:189 +#: eeschema/dialog_edit_component_in_schematic.cpp:173 +msgid "180" +msgstr "180" + +#: pcbnew/dialog_pad_edit.cpp:191 +msgid "Pad Orient:" +msgstr "Orient pad:" + +#: pcbnew/dialog_pad_edit.cpp:198 +#: pcbnew/class_board_item.cpp:101 +msgid "Rect" +msgstr "Rect" + +#: pcbnew/dialog_pad_edit.cpp:199 +msgid "Trapezoidal" +msgstr "Trapezoidal" + +#: pcbnew/dialog_pad_edit.cpp:200 +msgid "Pad Shape:" +msgstr "Forme Pad:" + +#: pcbnew/dialog_pad_edit.cpp:205 +#: pcbnew/class_track.cpp:751 +msgid "Standard" +msgstr "Standard" + +#: pcbnew/dialog_pad_edit.cpp:206 +msgid "SMD" +msgstr "CMS" + +#: pcbnew/dialog_pad_edit.cpp:207 +#: eeschema/netlist.cpp:210 +msgid "Conn" +msgstr "Conn" + +#: pcbnew/dialog_pad_edit.cpp:208 +msgid "Hole" +msgstr "Hole" + +#: pcbnew/dialog_pad_edit.cpp:209 +msgid "Mechanical" +msgstr "Mechanical" + +#: pcbnew/dialog_pad_edit.cpp:210 +msgid "Pad Type:" +msgstr "Type Pad:" + +#: pcbnew/dialog_pad_edit.cpp:225 +msgid "Layers:" +msgstr "Couches:" + +#: pcbnew/dialog_pad_edit.cpp:229 +msgid "Copper layer" +msgstr "Couches Cuivre" + +#: pcbnew/dialog_pad_edit.cpp:233 +msgid "Comp layer" +msgstr "Couche Cmp" + +#: pcbnew/dialog_pad_edit.cpp:239 +msgid "Adhesive Cmp" +msgstr "Adhesive Cmp" + +#: pcbnew/dialog_pad_edit.cpp:243 +msgid "Adhesive Copper" +msgstr "Adhesive Cu" + +#: pcbnew/dialog_pad_edit.cpp:247 +msgid "Solder paste Cmp" +msgstr "Pate à souder Cmp" + +#: pcbnew/dialog_pad_edit.cpp:251 +msgid "Solder paste Copper" +msgstr "Pate à souder cuivre" + +#: pcbnew/dialog_pad_edit.cpp:255 +msgid "Silkscreen Cmp" +msgstr "Sérigr Cmp" + +#: pcbnew/dialog_pad_edit.cpp:259 +msgid "Silkscreen Copper" +msgstr "Sérigr Cu " + +#: pcbnew/dialog_pad_edit.cpp:263 +msgid "Solder mask Cmp" +msgstr "Masque soudure Cmp" + +#: pcbnew/dialog_pad_edit.cpp:267 +msgid "Solder mask Copper" +msgstr "Masque soudure cuivre" + +#: pcbnew/dialog_pad_edit.cpp:271 +msgid "E.C.O.1 layer" +msgstr "couche E.C.O.1" + +#: pcbnew/dialog_pad_edit.cpp:275 +msgid "E.C.O.2 layer" +msgstr "couche E.C.O.2" + +#: pcbnew/dialog_pad_edit.cpp:279 +msgid "Draft layer" +msgstr "Couche dessin" #: pcbnew/tool_modedit.cpp:53 #: eeschema/tool_lib.cpp:123 @@ -1864,21 +1861,236 @@ msgstr "Grille %.3f" msgid "User Grid" msgstr "Grille perso" +#: pcbnew/gendrill.cpp:150 +msgid "Drill tools" +msgstr "Outils de perçage" + +#: pcbnew/gendrill.cpp:171 +#: eeschema/dialog_options.cpp:246 +msgid "inches" +msgstr "Pouces" + +#: pcbnew/gendrill.cpp:173 +msgid "Drill Units:" +msgstr "Unités perçage:" + +#: pcbnew/gendrill.cpp:181 +msgid "decimal format" +msgstr "Format décimal" + +#: pcbnew/gendrill.cpp:182 +msgid "suppress leading zeros" +msgstr "Suppression zeros de tête" + +#: pcbnew/gendrill.cpp:182 +msgid "suppress trailing zeros" +msgstr "Suppression zeros de fin" + +#: pcbnew/gendrill.cpp:182 +msgid "keep zeros" +msgstr "Garder les zéros" + +#: pcbnew/gendrill.cpp:185 +msgid "Zeros Format" +msgstr "Format des zéros" + +#: pcbnew/gendrill.cpp:192 +#: pcbnew/gendrill.cpp:452 +msgid "2:3" +msgstr "2:3" + +#: pcbnew/gendrill.cpp:192 +#: pcbnew/gendrill.cpp:453 +msgid "2:4" +msgstr "2:4" + +#: pcbnew/gendrill.cpp:193 +#: pcbnew/gendrill.cpp:458 +msgid "3:2" +msgstr "3:2" + +#: pcbnew/gendrill.cpp:193 +#: pcbnew/gendrill.cpp:459 +msgid "3:3" +msgstr "3:3" + +#: pcbnew/gendrill.cpp:199 +msgid "Precision" +msgstr "Précision" + +#: pcbnew/gendrill.cpp:211 +msgid "absolute" +msgstr "Absolu" + +#: pcbnew/gendrill.cpp:211 +msgid "auxiliary axis" +msgstr "Axe Auxiliaire" + +#: pcbnew/gendrill.cpp:213 +msgid "Drill Origin:" +msgstr "Origine des coord de percage:" + +#: pcbnew/gendrill.cpp:222 +#: pcbnew/gendrill.cpp:230 +#: eeschema/libedit.cpp:41 +#: eeschema/viewlibs.cpp:120 +msgid "None" +msgstr "Aucun" + +#: pcbnew/gendrill.cpp:222 +msgid "drill sheet (HPGL)" +msgstr "Plan de perçage (HPGL)" + +#: pcbnew/gendrill.cpp:222 +msgid "drill sheet (PostScript)" +msgstr "Plan de perçage (Postscript)" + +#: pcbnew/gendrill.cpp:224 +msgid "Drill Sheet:" +msgstr "Plan de perçage:" + +#: pcbnew/gendrill.cpp:230 +msgid "Drill report" +msgstr "Rapport de perçage" + +#: pcbnew/gendrill.cpp:232 +msgid "Drill Report:" +msgstr "Rapport de perçage:" + +#: pcbnew/gendrill.cpp:238 +msgid "Via Drill" +msgstr "Perçage des vias" + +#: pcbnew/gendrill.cpp:243 +#: eeschema/plothpgl.cpp:239 +msgid "Pen Number" +msgstr "Numéro de plume" + +#: pcbnew/gendrill.cpp:246 +msgid "Speed (cm/s)" +msgstr "Vitesse plume ( cm/s )" + +#: pcbnew/gendrill.cpp:249 +msgid "mirror y axis" +msgstr "Miroir sur axe Y" + +#: pcbnew/gendrill.cpp:253 +msgid "minimal header" +msgstr "Entête minimal" + +#: pcbnew/gendrill.cpp:259 +msgid "&Execute" +msgstr "&Exécuter" + +#: pcbnew/gendrill.cpp:263 +#: eeschema/plotps.cpp:208 +#: share/svg_print.cpp:222 +#: share/dialog_print.cpp:225 +msgid "&Close" +msgstr "&Fermer" + +#: pcbnew/gendrill.cpp:389 +msgid "Drill file" +msgstr "Fichier de percage" + +#: pcbnew/gendrill.cpp:403 +#: pcbnew/gendrill.cpp:1623 +#: pcbnew/plotps.cpp:51 +#: pcbnew/xchgmod.cpp:642 +msgid "Unable to create file " +msgstr "Impossible de créer le fichier " + +#: pcbnew/gendrill.cpp:410 +#: pcbnew/gendrill.cpp:1036 +#: pcbnew/gendrill.cpp:1629 +#: pcbnew/plotps.cpp:58 +#: pcbnew/plotgerb.cpp:84 +#: pcbnew/plothpgl.cpp:74 +msgid "File" +msgstr "Fichier" + +#: pcbnew/gendrill.cpp:416 +#: pcbnew/gendrill.cpp:1041 +#: pcbnew/gendrill.cpp:1634 +msgid "Tools" +msgstr "Outils" + +#: pcbnew/gendrill.cpp:420 +#: pcbnew/gendrill.cpp:1110 +#: pcbnew/gendrill.cpp:1686 +#: pcbnew/class_pad.cpp:1085 +#: pcbnew/class_track.cpp:798 +#: pcbnew/class_track.cpp:803 +msgid "Drill" +msgstr "Perçage" + +#: pcbnew/gendrill.cpp:971 +msgid "Drill Map file" +msgstr "Fichier Plan de perçage" + +#: pcbnew/gendrill.cpp:1030 +#, c-format +msgid "Unable to create file <%s>" +msgstr "Impossible de créer fichier <%s>" + +#: pcbnew/gendrill.cpp:1332 +msgid "" +" Drill map: Too many diameter values to draw to draw one symbol per drill value (max 13)\n" +"Plot uses circle shape for some drill values" +msgstr "" +"Plan de perçage: trop de diametres différents pour tracer 1 symbole par diametre\n" +"Le tracé utilise des cercles pour quelques valeurs " + +#: pcbnew/gendrill.cpp:1608 +msgid "Drill Report file" +msgstr "Fichier rapport de perçage:" + #: pcbnew/via_edit.cpp:51 msgid "Incorrect value for Via drill. No via drill change" msgstr "Valeur incorrecte pour perçage.Pas de changement pour la via" -#: pcbnew/move-drag_pads.cpp:251 -#, c-format -msgid "Delete Pad (module %s %s) " -msgstr "Effacer Pad (module %s %s) " +#: pcbnew/editpads.cpp:77 +msgid "Pad Position" +msgstr "Position Pad" -#: pcbnew/class_pcb_text.cpp:194 +#: pcbnew/editpads.cpp:84 +msgid "Pad Size" +msgstr "Taille Pad" + +#: pcbnew/editpads.cpp:91 +msgid "Delta" +msgstr "Delta" + +#: pcbnew/editpads.cpp:98 +msgid "Offset" +msgstr "Offset" + +#: pcbnew/editpads.cpp:107 +msgid "Pad Drill" +msgstr "Diam perçage" + +#: pcbnew/editpads.cpp:119 +msgid "Pad Orient (0.1 deg)" +msgstr "Orient Pad (0.1 deg)" + +#: pcbnew/editpads.cpp:389 +msgid "Incorrect value for pad drill: pad drill bigger than pad size" +msgstr "Valeur incorrecte pour diametre de perçage.percage plus grand que la taille du pad" + +#: pcbnew/editpads.cpp:395 +msgid "Incorrect value for pad offset" +msgstr "Valeur incorrecte pour offset du pad" + +#: pcbnew/export_gencad.cpp:69 +msgid "GenCAD file:" +msgstr "Fichier GenCAD:" + +#: pcbnew/class_pcb_text.cpp:173 #: gerbview/affiche.cpp:29 msgid "COTATION" msgstr "COTATION" -#: pcbnew/class_pcb_text.cpp:196 +#: pcbnew/class_pcb_text.cpp:175 #: gerbview/affiche.cpp:32 msgid "PCB Text" msgstr "Texte Pcb" @@ -1910,9 +2122,9 @@ msgid "Keep" msgstr "Garder" #: pcbnew/dialog_netlist.cpp:143 -#: pcbnew/onrightclick.cpp:589 -#: pcbnew/onrightclick.cpp:754 -#: pcbnew/onrightclick.cpp:851 +#: pcbnew/onrightclick.cpp:599 +#: pcbnew/onrightclick.cpp:764 +#: pcbnew/onrightclick.cpp:861 #: eeschema/edit_component_in_lib.cpp:239 #: eeschema/edit_component_in_lib.cpp:320 msgid "Delete" @@ -2043,9 +2255,31 @@ msgstr "Invisible" msgid "Value:" msgstr "Valeur:" -#: pcbnew/export_gencad.cpp:69 -msgid "GenCAD file:" -msgstr "Fichier GenCAD:" +#: pcbnew/class_pad.cpp:801 +#: pcbnew/class_pad.cpp:887 +msgid "Unknown Pad shape" +msgstr "Forme pad inconnue" + +#: pcbnew/class_pad.cpp:976 +msgid "RefP" +msgstr "RefP" + +#: pcbnew/class_pad.cpp:979 +#: pcbnew/class_board_item.cpp:35 +msgid "Net" +msgstr "Net" + +#: pcbnew/class_pad.cpp:1093 +msgid "Drill X / Y" +msgstr "Perçage X/Y" + +#: pcbnew/class_pad.cpp:1108 +msgid "X Pos" +msgstr "X Pos" + +#: pcbnew/class_pad.cpp:1112 +msgid "Y pos" +msgstr "Y pos" #: pcbnew/modedit.cpp:77 #: pcbnew/controle.cpp:172 @@ -2086,7 +2320,7 @@ msgid "Add Drawing" msgstr "Ajout d'éléments graphiques" #: pcbnew/modedit.cpp:424 -#: pcbnew/edit.cpp:518 +#: pcbnew/edit.cpp:519 #: eeschema/schedit.cpp:455 #: eeschema/libframe.cpp:579 msgid "Delete item" @@ -2144,8 +2378,8 @@ msgid "Delete Block (shift+ctrl + drag mouse)" msgstr "Effacement Bloc (shift+ctrl + drag mouse)" #: pcbnew/modedit_onclick.cpp:252 -#: pcbnew/onrightclick.cpp:748 -#: pcbnew/onrightclick.cpp:845 +#: pcbnew/onrightclick.cpp:758 +#: pcbnew/onrightclick.cpp:855 msgid "Rotate" msgstr "Rotation" @@ -2170,17 +2404,17 @@ msgid "Move Pad" msgstr "Déplace Pad" #: pcbnew/modedit_onclick.cpp:274 -#: pcbnew/onrightclick.cpp:787 +#: pcbnew/onrightclick.cpp:797 msgid "Edit Pad" msgstr "Edit Pad" #: pcbnew/modedit_onclick.cpp:276 -#: pcbnew/onrightclick.cpp:791 +#: pcbnew/onrightclick.cpp:801 msgid "New Pad Settings" msgstr "Nouvelles Caract. Pads" #: pcbnew/modedit_onclick.cpp:278 -#: pcbnew/onrightclick.cpp:793 +#: pcbnew/onrightclick.cpp:803 msgid "Export Pad Settings" msgstr "Exporte Caract. Pads" @@ -2189,7 +2423,7 @@ msgid "delete Pad" msgstr "Supprimer Pad" #: pcbnew/modedit_onclick.cpp:285 -#: pcbnew/onrightclick.cpp:798 +#: pcbnew/onrightclick.cpp:808 msgid "Global Pad Settings" msgstr "Edition Globale des pads" @@ -2222,9 +2456,9 @@ msgid "Place edge" msgstr "Place contour" #: pcbnew/modedit_onclick.cpp:317 -#: pcbnew/onrightclick.cpp:716 -#: pcbnew/onrightclick.cpp:750 -#: pcbnew/onrightclick.cpp:847 +#: pcbnew/onrightclick.cpp:726 +#: pcbnew/onrightclick.cpp:760 +#: pcbnew/onrightclick.cpp:857 #: eeschema/onrightclick.cpp:313 msgid "Edit" msgstr "Editer" @@ -2253,84 +2487,37 @@ msgstr "Effacement contour" msgid "Set Width" msgstr "Ajuste Epaiss" -#: pcbnew/class_pad.cpp:801 -#: pcbnew/class_pad.cpp:887 -msgid "Unknown Pad shape" -msgstr "Forme pad inconnue" +#: pcbnew/plotps.cpp:361 +#: pcbnew/affiche.cpp:63 +#: pcbnew/class_board.cpp:406 +msgid "Vias" +msgstr "Vias" -#: pcbnew/class_pad.cpp:976 -msgid "RefP" -msgstr "RefP" +#: pcbnew/plotps.cpp:390 +msgid "Tracks" +msgstr "Pistes" -#: pcbnew/class_pad.cpp:979 -#: pcbnew/class_board_item.cpp:35 -msgid "Net" -msgstr "Net" - -#: pcbnew/class_pad.cpp:1093 -msgid "Drill X / Y" -msgstr "Perçage X/Y" - -#: pcbnew/class_pad.cpp:1108 -msgid "X Pos" -msgstr "X Pos" - -#: pcbnew/class_pad.cpp:1112 -msgid "Y pos" -msgstr "Y pos" - -#: pcbnew/classpcb.cpp:196 +#: pcbnew/classpcb.cpp:175 msgid "Shape" msgstr "Forme" -#: pcbnew/classpcb.cpp:199 -#: pcbnew/class_board_item.cpp:107 -#: pcbnew/class_track.cpp:776 -#: pcbnew/dialog_pad_edit.cpp:176 -#: pcbnew/dialog_pad_edit.cpp:196 -msgid "Circle" -msgstr "Cercle" - -#: pcbnew/classpcb.cpp:203 +#: pcbnew/classpcb.cpp:182 msgid " Arc " msgstr " Arc " -#: pcbnew/classpcb.cpp:208 -#: pcbnew/class_track.cpp:774 +#: pcbnew/classpcb.cpp:187 +#: pcbnew/class_track.cpp:747 msgid "Segment" msgstr "Segment" -#: pcbnew/editpads.cpp:77 -msgid "Pad Position" -msgstr "Position Pad" +#: pcbnew/plotgerb.cpp:72 +msgid "unable to create file " +msgstr "Impossible de créer fichier " -#: pcbnew/editpads.cpp:84 -msgid "Pad Size" -msgstr "Taille Pad" - -#: pcbnew/editpads.cpp:91 -msgid "Delta" -msgstr "Delta" - -#: pcbnew/editpads.cpp:98 -msgid "Offset" -msgstr "Offset" - -#: pcbnew/editpads.cpp:107 -msgid "Pad Drill" -msgstr "Diam perçage" - -#: pcbnew/editpads.cpp:119 -msgid "Pad Orient (0.1 deg)" -msgstr "Orient Pad (0.1 deg)" - -#: pcbnew/editpads.cpp:389 -msgid "Incorrect value for pad drill: pad drill bigger than pad size" -msgstr "Valeur incorrecte pour diametre de perçage.percage plus grand que la taille du pad" - -#: pcbnew/editpads.cpp:395 -msgid "Incorrect value for pad offset" -msgstr "Valeur incorrecte pour offset du pad" +#: pcbnew/plotgerb.cpp:817 +#, c-format +msgid "unable to reopen file <%s>" +msgstr "Ne peut pas réouvrir fichier <%s>" #: pcbnew/onleftclick.cpp:173 msgid "Graphic not authorized on Copper layers" @@ -2344,56 +2531,79 @@ msgstr "Pistes sur couches cuivre seulement" msgid "Cotation not authorized on Copper layers" msgstr "Cotation non autorisée sur Couches Cuivre" -#: pcbnew/dialog_track_options.cpp:130 +#: pcbnew/dialog_track_options.cpp:134 +msgid "Vias:" +msgstr "Vias:" + +#: pcbnew/dialog_track_options.cpp:138 msgid "Via Size" msgstr "Diametre Via" -#: pcbnew/dialog_track_options.cpp:136 +#: pcbnew/dialog_track_options.cpp:144 msgid "Default Via Drill" msgstr "Perçage vias par défaut" -#: pcbnew/dialog_track_options.cpp:142 +#: pcbnew/dialog_track_options.cpp:150 msgid "Alternate Via Drill" msgstr "Perçage vias alternatif" -#: pcbnew/dialog_track_options.cpp:151 -#: pcbnew/pcbnew.h:289 -msgid "Blind Via" -msgstr "Via borgne" - -#: pcbnew/dialog_track_options.cpp:152 -#: pcbnew/pcbnew.h:290 -msgid "Buried Via" -msgstr "Via enterrée" - -#: pcbnew/dialog_track_options.cpp:153 +#: pcbnew/dialog_track_options.cpp:157 #: pcbnew/pcbnew.h:291 -msgid "Standard Via" -msgstr "Via Standard" +msgid "Through Via" +msgstr "Via Traversante" -#: pcbnew/dialog_track_options.cpp:154 -msgid "Via Type" -msgstr "Type de Via" +#: pcbnew/dialog_track_options.cpp:158 +msgid "Blind or Buried Via " +msgstr "Via enterrée ou Aveugle" + +#: pcbnew/dialog_track_options.cpp:159 +msgid "Default Via Type" +msgstr "Via par Défaut" #: pcbnew/dialog_track_options.cpp:163 +msgid "Micro Vias:" +msgstr "Micro Vias:" + +#: pcbnew/dialog_track_options.cpp:167 +msgid "Micro Via Size" +msgstr "Diametre Micro Via" + +#: pcbnew/dialog_track_options.cpp:173 +msgid "Micro Via Drill" +msgstr "Perçage Micro Via" + +#: pcbnew/dialog_track_options.cpp:181 +msgid "Allows Micro Vias" +msgstr "Autorise Micro Vias" + +#: pcbnew/dialog_track_options.cpp:183 +#: pcbnew/dialog_track_options.cpp:185 +msgid "" +"Allows use of micro vias\n" +"They are very small vias only from an external copper layer to its near neightbour\n" +msgstr "" +"Autorise l'utilisation de micro vias\n" +"Ce sont de petites vias allant d'une couche externe a la plus proche couche interne uniquement\n" + +#: pcbnew/dialog_track_options.cpp:191 msgid "Track Width" msgstr "Epais. Piste" -#: pcbnew/dialog_track_options.cpp:169 +#: pcbnew/dialog_track_options.cpp:197 #: pcbnew/dialog_drc.cpp:439 msgid "Clearance" msgstr "Isolation" -#: pcbnew/dialog_track_options.cpp:175 +#: pcbnew/dialog_track_options.cpp:203 msgid "Mask clearance" msgstr "Retrait Masque" -#: pcbnew/dialog_track_options.cpp:262 +#: pcbnew/dialog_track_options.cpp:303 msgid "" -"You have selected VIA Blind or VIA Buried\n" +"You have selected VIA Blind and Buried\n" "WARNING: this feature is EXPERIMENTAL!!! Accept ?" msgstr "" -"Vous avez sélectionné VIA borgne ou VIA enterrée\n" +"Vous avez sélectionné VIA borgne et enterrée\n" "ATTENTION: Cette possibilité est EXPERIMENTALE!!! Accepter ?" #: pcbnew/dialog_display_options.cpp:186 @@ -2565,7 +2775,7 @@ msgid "Footprint name:" msgstr "Nom Module: " #: pcbnew/modules.cpp:281 -#: pcbnew/onrightclick.cpp:722 +#: pcbnew/onrightclick.cpp:732 msgid "Delete Module" msgstr "Supprimer Module" @@ -3059,7 +3269,7 @@ msgid "Drag Via" msgstr "Drag Via" #: pcbnew/onrightclick.cpp:505 -#: pcbnew/onrightclick.cpp:569 +#: pcbnew/onrightclick.cpp:579 msgid "Edit Via" msgstr "Edit Via" @@ -3119,331 +3329,216 @@ msgstr "Terminer Piste" msgid "Place Via" msgstr "Place Via" -#: pcbnew/onrightclick.cpp:567 +#: pcbnew/onrightclick.cpp:568 +msgid "Place Micro Via" +msgstr "Place Micro Via" + +#: pcbnew/onrightclick.cpp:577 msgid "Change Width" msgstr "Change Largeur" -#: pcbnew/onrightclick.cpp:570 +#: pcbnew/onrightclick.cpp:580 msgid "Edit Segment" msgstr "Edit Segment" -#: pcbnew/onrightclick.cpp:575 +#: pcbnew/onrightclick.cpp:585 msgid "Edit Track" msgstr "Editer Piste" -#: pcbnew/onrightclick.cpp:577 +#: pcbnew/onrightclick.cpp:587 msgid "Edit Net" msgstr "Edit Net" -#: pcbnew/onrightclick.cpp:579 +#: pcbnew/onrightclick.cpp:589 msgid "Edit ALL Tracks and Vias" msgstr "Editer TOUTES Pistes et Vias" -#: pcbnew/onrightclick.cpp:581 +#: pcbnew/onrightclick.cpp:591 msgid "Edit ALL Vias (no track)" msgstr "Editer TOUTES Vias (pas les pistes)" -#: pcbnew/onrightclick.cpp:583 +#: pcbnew/onrightclick.cpp:593 msgid "Edit ALL Tracks (no via)" msgstr "Editer TOUTES Pistes (pas les vias)" -#: pcbnew/onrightclick.cpp:591 +#: pcbnew/onrightclick.cpp:601 msgid "Delete Via" msgstr "Suppression Via" -#: pcbnew/onrightclick.cpp:591 +#: pcbnew/onrightclick.cpp:601 msgid "Delete Segment" msgstr "SupprimerSegment" -#: pcbnew/onrightclick.cpp:598 +#: pcbnew/onrightclick.cpp:608 msgid "Delete Track" msgstr "Effacer Piste" -#: pcbnew/onrightclick.cpp:602 +#: pcbnew/onrightclick.cpp:612 msgid "Delete Net" msgstr "Supprimer Net" -#: pcbnew/onrightclick.cpp:607 +#: pcbnew/onrightclick.cpp:617 msgid "Set Flags" msgstr "Ajust. Flags" -#: pcbnew/onrightclick.cpp:608 +#: pcbnew/onrightclick.cpp:618 msgid "Locked: Yes" msgstr "Verrou: Oui" -#: pcbnew/onrightclick.cpp:609 +#: pcbnew/onrightclick.cpp:619 msgid "Locked: No" msgstr "Verrou: Non" -#: pcbnew/onrightclick.cpp:619 +#: pcbnew/onrightclick.cpp:629 msgid "Track Locked: Yes" msgstr "Piste verrouillée: Oui" -#: pcbnew/onrightclick.cpp:620 +#: pcbnew/onrightclick.cpp:630 msgid "Track Locked: No" msgstr "Piste verrouillée: Non" -#: pcbnew/onrightclick.cpp:622 +#: pcbnew/onrightclick.cpp:632 msgid "Net Locked: Yes" msgstr "Net verrouillé: Oui" -#: pcbnew/onrightclick.cpp:623 +#: pcbnew/onrightclick.cpp:633 msgid "Net Locked: No" msgstr "Net verrouillé: Non" -#: pcbnew/onrightclick.cpp:638 +#: pcbnew/onrightclick.cpp:648 msgid "Place Corner" msgstr "Place Sommet" -#: pcbnew/onrightclick.cpp:648 +#: pcbnew/onrightclick.cpp:654 +#: pcbnew/dialog_drc.cpp:477 +msgid "Zones" +msgstr "Zones" + +#: pcbnew/onrightclick.cpp:659 msgid "Move Corner" msgstr "Déplace Sommet" -#: pcbnew/onrightclick.cpp:650 +#: pcbnew/onrightclick.cpp:661 msgid "Delete Corner" msgstr "Supprimer Sommet" -#: pcbnew/onrightclick.cpp:656 +#: pcbnew/onrightclick.cpp:666 msgid "Create Corner" msgstr "Créer Sommet" -#: pcbnew/onrightclick.cpp:661 +#: pcbnew/onrightclick.cpp:671 msgid "Add Similar Zone" msgstr "Addition d'une Zone Semblable" -#: pcbnew/onrightclick.cpp:664 +#: pcbnew/onrightclick.cpp:674 msgid "Add Cutout Area" msgstr "Addition d'une Zone Interdite" -#: pcbnew/onrightclick.cpp:668 +#: pcbnew/onrightclick.cpp:678 msgid "Fill Zone" msgstr "Remplir Zone" -#: pcbnew/onrightclick.cpp:671 +#: pcbnew/onrightclick.cpp:681 msgid "Edit Zone Params" msgstr "Editer Paramètres de la Zone" -#: pcbnew/onrightclick.cpp:675 +#: pcbnew/onrightclick.cpp:685 msgid "Delete Cutout" msgstr "Supprimer Zone Interdite" -#: pcbnew/onrightclick.cpp:678 +#: pcbnew/onrightclick.cpp:688 msgid "Delete Zone Outline" msgstr "Supprimer Contour de Zone" -#: pcbnew/onrightclick.cpp:700 -#: pcbnew/onrightclick.cpp:745 -#: pcbnew/onrightclick.cpp:783 -#: pcbnew/onrightclick.cpp:842 +#: pcbnew/onrightclick.cpp:710 +#: pcbnew/onrightclick.cpp:755 +#: pcbnew/onrightclick.cpp:793 +#: pcbnew/onrightclick.cpp:852 msgid "Move" msgstr "Move" -#: pcbnew/onrightclick.cpp:703 -#: pcbnew/onrightclick.cpp:785 +#: pcbnew/onrightclick.cpp:713 +#: pcbnew/onrightclick.cpp:795 msgid "Drag" msgstr "Drag" -#: pcbnew/onrightclick.cpp:707 +#: pcbnew/onrightclick.cpp:717 msgid "Rotate +" msgstr "Rotation +" -#: pcbnew/onrightclick.cpp:711 +#: pcbnew/onrightclick.cpp:721 #: eeschema/onrightclick.cpp:301 msgid "Rotate -" msgstr "Rotation -" -#: pcbnew/onrightclick.cpp:712 +#: pcbnew/onrightclick.cpp:722 msgid "Flip" msgstr "Change côté" -#: pcbnew/onrightclick.cpp:802 +#: pcbnew/onrightclick.cpp:812 msgid "delete" msgstr "Effacer" -#: pcbnew/onrightclick.cpp:809 +#: pcbnew/onrightclick.cpp:819 msgid "Autoroute Pad" msgstr "Autoroute Pad" -#: pcbnew/onrightclick.cpp:810 +#: pcbnew/onrightclick.cpp:820 msgid "Autoroute Net" msgstr "Autoroute Net" -#: pcbnew/block.cpp:125 +#: pcbnew/block.cpp:122 msgid "Include Modules" msgstr "Inclure Modules" -#: pcbnew/block.cpp:129 +#: pcbnew/block.cpp:126 msgid "Include tracks" msgstr "Inclure Pistes" -#: pcbnew/block.cpp:133 +#: pcbnew/block.cpp:130 msgid "Include zones" msgstr "Inclure zones" -#: pcbnew/block.cpp:138 +#: pcbnew/block.cpp:135 msgid "Include Text on copper layers" msgstr "Inclure Texte sur couches cuivre" -#: pcbnew/block.cpp:142 +#: pcbnew/block.cpp:139 msgid "Include drawings" msgstr "Inclure tracés" -#: pcbnew/block.cpp:146 +#: pcbnew/block.cpp:143 msgid "Include egde layer" msgstr "Inclure couche Edge" -#: pcbnew/block.cpp:453 +#: pcbnew/block.cpp:450 msgid "Delete Block" msgstr "Effacer Bloc" -#: pcbnew/block.cpp:464 -msgid "Delete Footprints" -msgstr "Suppression modules" - -#: pcbnew/block.cpp:484 -msgid "Delete tracks" -msgstr "Suppression Pistes" - -#: pcbnew/block.cpp:505 -msgid "Delete draw layers" -msgstr "Suppression couches sessin" - -#: pcbnew/block.cpp:570 +#: pcbnew/block.cpp:559 msgid "Delete zones" msgstr "SuppressionZones" -#: pcbnew/block.cpp:605 +#: pcbnew/block.cpp:601 msgid "Rotate Block" msgstr "Rotation Bloc" -#: pcbnew/block.cpp:620 -msgid "Footprint rotation" -msgstr "Rotation modules" - -#: pcbnew/block.cpp:654 -msgid "Track rotation" -msgstr "Rotation pistes" - -#: pcbnew/block.cpp:675 +#: pcbnew/block.cpp:658 msgid "Zone rotation" msgstr "Rotation Zones" -#: pcbnew/block.cpp:696 -msgid "Draw layers rotation" -msgstr "Rotation couches dessin" - -#: pcbnew/block.cpp:815 +#: pcbnew/block.cpp:766 msgid "Block mirroring" msgstr "Bloc Miroir" -#: pcbnew/block.cpp:830 -msgid "Footprint mirroring" -msgstr "Miroir modules" - -#: pcbnew/block.cpp:863 -msgid "Track mirroring" -msgstr "Miroir Pistes" - -#: pcbnew/block.cpp:889 -msgid "Zone mirroring" -msgstr "Miroir zone" - -#: pcbnew/block.cpp:911 -msgid "Draw layers mirroring" -msgstr "Draw layers mirroring" - -#: pcbnew/block.cpp:1038 +#: pcbnew/block.cpp:954 msgid "Move Block" msgstr "Déplacer Bloc" -#: pcbnew/block.cpp:1050 -msgid "Move footprints" -msgstr "Déplacement modules" - -#: pcbnew/block.cpp:1083 -msgid "Move tracks" -msgstr "Déplacement pistes" - -#: pcbnew/block.cpp:1104 -msgid "Move zones" -msgstr "Déplacement zones" - -#: pcbnew/block.cpp:1125 -msgid "Move draw layers" -msgstr "Déplacement couches dessin" - -#: pcbnew/block.cpp:1230 +#: pcbnew/block.cpp:1109 msgid "Copy Block" msgstr "Copie Bloc" -#: pcbnew/block.cpp:1242 -msgid "Module copy" -msgstr "Copie Modules" - -#: pcbnew/block.cpp:1281 -msgid "Track copy" -msgstr "Copie Piste" - -#: pcbnew/block.cpp:1305 -msgid "Zone copy" -msgstr "Copie Zone" - -#: pcbnew/block.cpp:1330 -msgid "Draw layers copy" -msgstr "Cpoie des couches dessin" - -#: 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/edit.cpp:171 #: pcbnew/editmod.cpp:45 msgid "Module Editor" @@ -3489,15 +3584,21 @@ msgstr "Surbrillance des msgid "Local Ratsnest" msgstr "Monter le chevelu général" -#: pcbnew/plotps.cpp:361 -#: pcbnew/affiche.cpp:63 -#: pcbnew/class_board.cpp:400 -msgid "Vias" -msgstr "Vias" +#: pcbnew/router.cpp:60 +msgid "Unable to create temporary file " +msgstr "Impossible de créer le fichier temporaire " -#: pcbnew/plotps.cpp:390 -msgid "Tracks" -msgstr "Pistes" +#: pcbnew/router.cpp:65 +msgid "Create temporary file " +msgstr "Creation fichier temporaire " + +#: pcbnew/router.cpp:566 +msgid "Unable to find data file " +msgstr "Impossible de trouver le fichier de données " + +#: pcbnew/router.cpp:572 +msgid "Reading autorouter data file " +msgstr "Lecture fichier données de l'autorouteur" #: pcbnew/netlist.cpp:96 #, c-format @@ -3615,11 +3716,11 @@ msgstr "Pcb Graphic" #: pcbnew/class_board_item.cpp:59 #: pcbnew/class_board_item.cpp:68 #: pcbnew/class_board_item.cpp:145 -#: pcbnew/class_board_item.cpp:169 -#: pcbnew/class_board_item.cpp:185 -#: pcbnew/class_board_item.cpp:212 -#: pcbnew/class_board_item.cpp:229 -#: pcbnew/class_board_item.cpp:235 +#: pcbnew/class_board_item.cpp:177 +#: pcbnew/class_board_item.cpp:193 +#: pcbnew/class_board_item.cpp:220 +#: pcbnew/class_board_item.cpp:237 +#: pcbnew/class_board_item.cpp:243 msgid " on " msgstr " sur " @@ -3637,23 +3738,18 @@ msgstr " de " msgid "Graphic" msgstr "Graphique" -#: pcbnew/class_board_item.cpp:101 -#: pcbnew/dialog_pad_edit.cpp:198 -msgid "Rect" -msgstr "Rect" - #: pcbnew/class_board_item.cpp:104 msgid "Arc" msgstr "Arc" #: pcbnew/class_board_item.cpp:139 #: pcbnew/pcbframe.cpp:447 -#: pcbnew/class_track.cpp:739 +#: pcbnew/class_track.cpp:712 msgid "Track" msgstr "Piste" #: pcbnew/class_board_item.cpp:146 -#: pcbnew/dialog_zones_by_polygon.cpp:220 +#: pcbnew/dialog_zones_by_polygon.cpp:228 msgid "Net:" msgstr "Net:" @@ -3662,51 +3758,57 @@ msgid "Length:" msgstr "Long.:" #: pcbnew/class_board_item.cpp:152 -#: pcbnew/class_zone.cpp:416 +#: pcbnew/class_zone.cpp:448 msgid "Zone Outline" msgstr "Contour de Zone" #: pcbnew/class_board_item.cpp:156 -#: pcbnew/class_zone.cpp:419 +#: pcbnew/class_zone.cpp:451 msgid "(Cutout)" msgstr "(Cutout)" -#: pcbnew/class_board_item.cpp:173 -#: pcbnew/class_track.cpp:743 +#: pcbnew/class_board_item.cpp:175 +#: pcbnew/class_zone.cpp:471 +msgid "Not Found" +msgstr " Non Trouvé" + +#: pcbnew/class_board_item.cpp:181 +#: pcbnew/class_track.cpp:716 msgid "Zone" msgstr "Zone" -#: pcbnew/class_board_item.cpp:191 +#: pcbnew/class_board_item.cpp:199 #: pcbnew/pcbframe.cpp:479 msgid "Via" msgstr "Via" -#: pcbnew/class_board_item.cpp:195 -msgid "Blind" -msgstr "Enterrée" +#: pcbnew/class_board_item.cpp:203 +msgid "Blind/Buried" +msgstr "Borgne/Aveugle" -#: pcbnew/class_board_item.cpp:197 -msgid "Buried" -msgstr "Borgne" +#: pcbnew/class_board_item.cpp:205 +#: pcbnew/pcbnew.h:289 +msgid "Micro Via" +msgstr "Micro Via" -#: pcbnew/class_board_item.cpp:219 +#: pcbnew/class_board_item.cpp:227 #: pcbnew/class_marker.cpp:112 msgid "Marker" msgstr "Marqueur" -#: pcbnew/class_board_item.cpp:224 +#: pcbnew/class_board_item.cpp:232 msgid "Dimension" msgstr "Dimension" -#: pcbnew/class_board_item.cpp:229 +#: pcbnew/class_board_item.cpp:237 msgid "Target" msgstr "Mire" -#: pcbnew/class_board_item.cpp:230 +#: pcbnew/class_board_item.cpp:238 msgid "size" msgstr "dimension" -#: pcbnew/class_board_item.cpp:235 +#: pcbnew/class_board_item.cpp:243 msgid "Edge Zone" msgstr "Contour Zone" @@ -3722,15 +3824,6 @@ msgstr "Type Err" msgid "Pcbnew is already running, Continue?" msgstr "Pcbnew est est cours d'exécution. Continuer ?" -#: pcbnew/plotgerb.cpp:72 -msgid "unable to create file " -msgstr "Impossible de créer fichier " - -#: pcbnew/plotgerb.cpp:817 -#, c-format -msgid "unable to reopen file <%s>" -msgstr "Ne peut pas réouvrir fichier <%s>" - #: pcbnew/pcbframe.cpp:266 msgid "Board modified, Save before exit ?" msgstr "Circuit Imprimé modifiée, Sauver avant de quitter ?" @@ -3832,27 +3925,11 @@ msgid "Dimension properties" msgstr "Propriétés des Cotes" #: pcbnew/cotation.cpp:133 -#: pcbnew/dialog_zones_by_polygon.cpp:227 +#: pcbnew/dialog_zones_by_polygon.cpp:235 #: gerbview/affiche.cpp:37 msgid "Layer:" msgstr "Couche:" -#: pcbnew/router.cpp:60 -msgid "Unable to create temporary file " -msgstr "Impossible de créer le fichier temporaire " - -#: pcbnew/router.cpp:65 -msgid "Create temporary file " -msgstr "Creation fichier temporaire " - -#: pcbnew/router.cpp:566 -msgid "Unable to find data file " -msgstr "Impossible de trouver le fichier de données " - -#: pcbnew/router.cpp:572 -msgid "Reading autorouter data file " -msgstr "Lecture fichier données de l'autorouteur" - #: pcbnew/editrack-part2.cpp:32 #, c-format msgid "Track Width: %s Vias Size : %s" @@ -3876,33 +3953,28 @@ msgstr "Net Code" #: pcbnew/affiche.cpp:52 #: pcbnew/class_module.cpp:1228 -#: pcbnew/class_board.cpp:390 +#: pcbnew/class_board.cpp:396 msgid "Pads" msgstr "Pads" -#: pcbnew/class_track.cpp:765 +#: pcbnew/class_track.cpp:738 #: pcbnew/zones.cpp:873 -#: pcbnew/zones_by_polygon.cpp:831 -#: pcbnew/class_zone.cpp:432 +#: pcbnew/zones_by_polygon.cpp:864 +#: pcbnew/class_zone.cpp:474 msgid "NetName" msgstr "NetName" -#: pcbnew/class_track.cpp:770 -#: pcbnew/class_zone.cpp:437 +#: pcbnew/class_track.cpp:743 +#: pcbnew/class_zone.cpp:479 msgid "NetCode" msgstr "NetCode" -#: pcbnew/class_track.cpp:778 -#: pcbnew/dialog_pad_edit.cpp:205 -msgid "Standard" -msgstr "Standard" - -#: pcbnew/class_track.cpp:790 +#: pcbnew/class_track.cpp:763 #: pcbnew/class_module.cpp:1236 msgid "Stat" msgstr "Stat" -#: pcbnew/class_track.cpp:814 +#: pcbnew/class_track.cpp:787 msgid "Diam" msgstr "Diam" @@ -4068,134 +4140,6 @@ msgstr "Pin %s (module %s) non trouv msgid "Locate Pin %s (module %s)" msgstr "Pin localisée %s (module %s)" -#: pcbnew/dialog_pad_edit.cpp:157 -msgid "Pad Num :" -msgstr "Num Pad :" - -#: pcbnew/dialog_pad_edit.cpp:163 -msgid "Pad Net Name :" -msgstr "NetName Pad:" - -#: pcbnew/dialog_pad_edit.cpp:177 -#: pcbnew/dialog_pad_edit.cpp:197 -msgid "Oval" -msgstr "Ovale" - -#: pcbnew/dialog_pad_edit.cpp:178 -msgid "Drill Shape:" -msgstr "Forme du perçage:" - -#: pcbnew/dialog_pad_edit.cpp:186 -#: pcbnew/clean.cpp:462 -#: eeschema/dialog_erc.cpp:192 -#: eeschema/dialog_erc.cpp:196 -#: eeschema/dialog_edit_component_in_schematic.cpp:171 -msgid "0" -msgstr "0" - -#: pcbnew/dialog_pad_edit.cpp:187 -msgid "90" -msgstr "90" - -#: pcbnew/dialog_pad_edit.cpp:188 -#: eeschema/dialog_edit_component_in_schematic.cpp:174 -msgid "-90" -msgstr "-90" - -#: pcbnew/dialog_pad_edit.cpp:189 -#: eeschema/dialog_edit_component_in_schematic.cpp:173 -msgid "180" -msgstr "180" - -#: pcbnew/dialog_pad_edit.cpp:191 -msgid "Pad Orient:" -msgstr "Orient pad:" - -#: pcbnew/dialog_pad_edit.cpp:199 -msgid "Trapezoidal" -msgstr "Trapezoidal" - -#: pcbnew/dialog_pad_edit.cpp:200 -msgid "Pad Shape:" -msgstr "Forme Pad:" - -#: pcbnew/dialog_pad_edit.cpp:206 -msgid "SMD" -msgstr "CMS" - -#: pcbnew/dialog_pad_edit.cpp:207 -#: eeschema/netlist.cpp:210 -msgid "Conn" -msgstr "Conn" - -#: pcbnew/dialog_pad_edit.cpp:208 -msgid "Hole" -msgstr "Hole" - -#: pcbnew/dialog_pad_edit.cpp:209 -msgid "Mechanical" -msgstr "Mechanical" - -#: pcbnew/dialog_pad_edit.cpp:210 -msgid "Pad Type:" -msgstr "Type Pad:" - -#: pcbnew/dialog_pad_edit.cpp:225 -msgid "Layers:" -msgstr "Couches:" - -#: pcbnew/dialog_pad_edit.cpp:229 -msgid "Copper layer" -msgstr "Couches Cuivre" - -#: pcbnew/dialog_pad_edit.cpp:233 -msgid "Comp layer" -msgstr "Couche Cmp" - -#: pcbnew/dialog_pad_edit.cpp:239 -msgid "Adhesive Cmp" -msgstr "Adhesive Cmp" - -#: pcbnew/dialog_pad_edit.cpp:243 -msgid "Adhesive Copper" -msgstr "Adhesive Cu" - -#: pcbnew/dialog_pad_edit.cpp:247 -msgid "Solder paste Cmp" -msgstr "Pate à souder Cmp" - -#: pcbnew/dialog_pad_edit.cpp:251 -msgid "Solder paste Copper" -msgstr "Pate à souder cuivre" - -#: pcbnew/dialog_pad_edit.cpp:255 -msgid "Silkscreen Cmp" -msgstr "Sérigr Cmp" - -#: pcbnew/dialog_pad_edit.cpp:259 -msgid "Silkscreen Copper" -msgstr "Sérigr Cu " - -#: pcbnew/dialog_pad_edit.cpp:263 -msgid "Solder mask Cmp" -msgstr "Masque soudure Cmp" - -#: pcbnew/dialog_pad_edit.cpp:267 -msgid "Solder mask Copper" -msgstr "Masque soudure cuivre" - -#: pcbnew/dialog_pad_edit.cpp:271 -msgid "E.C.O.1 layer" -msgstr "couche E.C.O.1" - -#: pcbnew/dialog_pad_edit.cpp:275 -msgid "E.C.O.2 layer" -msgstr "couche E.C.O.2" - -#: pcbnew/dialog_pad_edit.cpp:279 -msgid "Draft layer" -msgstr "Couche dessin" - #: pcbnew/class_edge_mod.cpp:283 msgid "Seg" msgstr "Seg" @@ -4303,58 +4247,6 @@ msgstr "Change module %s (%s) " msgid "Cmp files:" msgstr "Fichiers Cmp: " -#: pcbnew/clean.cpp:177 -msgid "Delete unconnected tracks:" -msgstr "Suppression Pistes non connectées" - -#: pcbnew/clean.cpp:196 -msgid "ViaDef" -msgstr "ViaDef" - -#: pcbnew/clean.cpp:368 -msgid "Clean Null Segments" -msgstr "Nettoyage segments nulls" - -#: pcbnew/clean.cpp:460 -msgid "Merging Segments:" -msgstr "Associe Segment" - -#: pcbnew/clean.cpp:462 -msgid "Merge" -msgstr "Merge" - -#: pcbnew/clean.cpp:478 -msgid "Merge: " -msgstr "Merge: " - -#: pcbnew/clean.cpp:708 -msgid "DRC Control:" -msgstr "Controle DRC:" - -#: pcbnew/clean.cpp:713 -msgid "NetCtr" -msgstr "NetCtr" - -#: pcbnew/clean.cpp:1059 -msgid "Centre" -msgstr "Centre" - -#: pcbnew/clean.cpp:1059 -msgid "0 " -msgstr "0" - -#: pcbnew/clean.cpp:1070 -msgid "Pads: " -msgstr "Pastilles: " - -#: pcbnew/clean.cpp:1074 -msgid "Max" -msgstr "Max" - -#: pcbnew/clean.cpp:1077 -msgid "Segm" -msgstr "Segm" - #: pcbnew/zones.cpp:155 #: pcbnew/zones.cpp:156 #: pcbnew/zones.cpp:157 @@ -4419,12 +4311,12 @@ msgid "Update Options" msgstr "Maj Options" #: pcbnew/zones.cpp:235 -#: pcbnew/dialog_zones_by_polygon.cpp:239 +#: pcbnew/dialog_zones_by_polygon.cpp:247 msgid "Zone clearance value:" msgstr "Valeur isolation zone:" #: pcbnew/zones.cpp:238 -#: pcbnew/dialog_zones_by_polygon.cpp:242 +#: pcbnew/dialog_zones_by_polygon.cpp:250 msgid "Grid :" msgstr "Grille:" @@ -4441,30 +4333,39 @@ msgid "Delete Current Zone Edges" msgstr "Effacer contour zone courant" #: pcbnew/zones.cpp:871 -#: pcbnew/zones_by_polygon.cpp:829 +#: pcbnew/zones_by_polygon.cpp:862 msgid "No Net" msgstr "No Net" -#: pcbnew/specctra.cpp:1015 -#: pcbnew/specctra.cpp:1022 -msgid "Expecting" -msgstr "Attendu" +#: pcbnew/dsn.cpp:469 +msgid "Line length exceeded" +msgstr "Longueur de ligne dépassée" -#: pcbnew/specctra.cpp:1031 -#: pcbnew/specctra.cpp:1038 -msgid "Unexpected" -msgstr "Inattendu" +#: pcbnew/dsn.cpp:579 +msgid "in file" +msgstr "dans le fichier" -#: pcbnew/specctra.cpp:1059 -#: pcbnew/specctra.cpp:1817 -#, c-format -msgid "Unable to open file \"%s\"" -msgstr "Ne peut pas ouvrirle fichier \"%s\"" +#: pcbnew/dsn.cpp:580 +msgid "on line" +msgstr "en ligne" -#: pcbnew/specctra.cpp:1792 -#, c-format -msgid "System file error writing to file \"%s\"" -msgstr "Erreur système sur écriture fichier \"%s\"" +#: pcbnew/dsn.cpp:581 +msgid "at offset" +msgstr "a l'offset" + +#: pcbnew/dsn.cpp:629 +msgid "String delimiter must be a single character of ', \", or $" +msgstr "Le caractère de délimitation de ligne doit être un seul caractère ', \", or $" + +#: pcbnew/dsn.cpp:708 +msgid "Un-terminated delimited string" +msgstr "Ligne délimitée non terminée" + +#: pcbnew/zones_by_polygon.cpp:324 +#: pcbnew/zones_by_polygon.cpp:378 +#: pcbnew/zones_by_polygon.cpp:667 +msgid "Area: DRC outline error" +msgstr "Zone; Erreur DRC sur contour" #: pcbnew/move_or_drag_track.cpp:714 msgid "Unable to drag this segment: too many segments connected" @@ -4502,38 +4403,22 @@ msgstr "Avanc msgid "Net sorting:" msgstr "Tri des Equipotentielles:" -#: pcbnew/dialog_zones_by_polygon.cpp:462 +#: pcbnew/dialog_zones_by_polygon.cpp:217 +msgid "Filter" +msgstr "Filtre" + +#: pcbnew/dialog_zones_by_polygon.cpp:222 +msgid "Do not list net names which match with this text, in advanced mode" +msgstr "" + +#: pcbnew/dialog_zones_by_polygon.cpp:501 msgid "Error : you must choose a layer" msgstr "Erreur. Vous devez choisir une couche" -#: pcbnew/dialog_zones_by_polygon.cpp:471 +#: pcbnew/dialog_zones_by_polygon.cpp:510 msgid "Error : you must choose a net name" msgstr "Erreur. Vous devez choisir une équipotentielle" -#: pcbnew/dsn.cpp:467 -msgid "Line length exceeded" -msgstr "Longueur de ligne dépassée" - -#: pcbnew/dsn.cpp:577 -msgid "in file" -msgstr "dans le fichier" - -#: pcbnew/dsn.cpp:578 -msgid "on line" -msgstr "en ligne" - -#: pcbnew/dsn.cpp:579 -msgid "at offset" -msgstr "a l'offset" - -#: pcbnew/dsn.cpp:618 -msgid "String delimiter must be a single character of ', \", or $" -msgstr "Le caractère de délimitation de ligne doit être un seul caractère ', \", or $" - -#: pcbnew/dsn.cpp:697 -msgid "Un-terminated delimited string" -msgstr "Ligne délimitée non terminée" - #: pcbnew/initpcb.cpp:125 msgid "Current Board will be lost ?" msgstr "Le C.I. courant sera perdu ?" @@ -4564,6 +4449,103 @@ msgstr "Effacement des Modules?" msgid "Delete Pcb Texts" msgstr "Effacer Textes Pcb" +#: pcbnew/sel_layer.cpp:92 +msgid "Select Layer:" +msgstr "Selection couche:" + +#: pcbnew/sel_layer.cpp:137 +msgid "(Deselect)" +msgstr "(Deselection)" + +#: pcbnew/sel_layer.cpp:238 +msgid "Less than two copper layers are being used." +msgstr "Il y a moins de 2 couches cuivre utilisées." + +#: pcbnew/sel_layer.cpp:239 +msgid "Hence Layer Pairs cannot be specified." +msgstr "Donc les paires de couche ne peuvent pas être spécifiées" + +#: pcbnew/sel_layer.cpp:263 +msgid "Select Layer Pair:" +msgstr "Selection paire de couches" + +#: pcbnew/sel_layer.cpp:294 +msgid "Top Layer" +msgstr "Couche Sup." + +#: pcbnew/sel_layer.cpp:299 +msgid "Bottom Layer" +msgstr "Couche Inf." + +#: pcbnew/sel_layer.cpp:358 +msgid "The Top Layer and Bottom Layer must differ" +msgstr "Les couches dessus et dessous doivent différer" + +#: pcbnew/move-drag_pads.cpp:251 +#, c-format +msgid "Delete Pad (module %s %s) " +msgstr "Effacer Pad (module %s %s) " + +#: 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/zone_filling_algorithm.cpp:155 +msgid "No pads or starting point found to fill this zone outline" +msgstr "Pas de pads ou de points de départ pour remplir ce contour de zone" + +#: pcbnew/zone_filling_algorithm.cpp:193 +msgid "Ok" +msgstr "Ok" + #: pcbnew/find.cpp:114 msgid "Marker found" msgstr "Marqueur trouvé" @@ -4603,115 +4585,27 @@ msgstr "Chercher Marqueur" msgid "Find Next Marker" msgstr "Marqueur Suivant" -#: pcbnew/class_board.cpp:403 +#: pcbnew/class_board.cpp:409 msgid "Nodes" msgstr "Nodes" -#: pcbnew/class_board.cpp:406 +#: pcbnew/class_board.cpp:412 msgid "Links" msgstr "Liens" -#: pcbnew/class_board.cpp:409 +#: pcbnew/class_board.cpp:415 msgid "Nets" msgstr "Nets" -#: pcbnew/class_board.cpp:412 +#: pcbnew/class_board.cpp:418 msgid "Connect" msgstr "Connect" -#: pcbnew/class_board.cpp:415 +#: pcbnew/class_board.cpp:421 #: eeschema/eelayer.h:116 msgid "NoConn" msgstr "Non Conn" -#: pcbnew/drc.cpp:1324 -msgid "Tst Pad to Pad\n" -msgstr "Tst Pad to Pad\n" - -#: pcbnew/drc.cpp:1370 -#: pcbnew/drc.cpp:1444 -msgid "SegmNb" -msgstr "SegmNb" - -#: pcbnew/drc.cpp:1371 -msgid "Track Err" -msgstr "Err Pistes" - -#: pcbnew/drc.cpp:1375 -msgid "Tst Tracks\n" -msgstr "Tst Pistes\n" - -#: pcbnew/drc.cpp:1406 -#: pcbnew/drc.cpp:1484 -#: eeschema/eelayer.h:104 -msgid "Netname" -msgstr "NetName" - -#: pcbnew/drc.cpp:1445 -msgid "Zone Err" -msgstr "Err. Zone" - -#: pcbnew/drc.cpp:1448 -msgid "Tst Zones\n" -msgstr "Test Zones\n" - -#: pcbnew/drc.cpp:1571 -msgid "Look for active routes\n" -msgstr "Recherche des chevelus actifs\n" - -#: pcbnew/drc.cpp:1594 -#, c-format -msgid "%d > Pad %s (%s) @ %.4f,%.4f and " -msgstr "%d > Pad %s (%s) @ %.4f,%.4f et " - -#: pcbnew/drc.cpp:1608 -#, c-format -msgid "Pad %s (%s) @ %.4f,%.4f\n" -msgstr "Pad %s (%s) @ %.4f,%.4f\n" - -#: pcbnew/drc.cpp:1618 -#, c-format -msgid "Active routes: %d\n" -msgstr "Active routes: %d\n" - -#: pcbnew/drc.cpp:1620 -msgid "OK! (No active routes)\n" -msgstr "OK! (Pas de chevelu actif)\n" - -#: pcbnew/drc.cpp:1679 -#, c-format -msgid "** End Drc: %d errors **\n" -msgstr "** FinDrc: %d erreurs **\n" - -#: pcbnew/drc.cpp:1681 -msgid "** End Drc: No Error **\n" -msgstr "** Fin Drc: Aucune Erreur **\n" - -#: pcbnew/drc.cpp:1690 -#, c-format -msgid "Report file <%s> created\n" -msgstr "Fichier rapport <%s> créé\n" - -#: pcbnew/drc.cpp:2588 -#, 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" - -#: pcbnew/drc.cpp:2605 -#, c-format -msgid "%d Err type %d: %s (net %s) and VIA (net %s) @ %d,%d\n" -msgstr "%d Err type %d: %s (net %s) et VIA (net %s) @ %d,%d\n" - -#: pcbnew/drc.cpp:2621 -#, c-format -msgid "%d Err type %d: %s (net %s) and track (net %s) @ %d,%d\n" -msgstr "%d Err type %d: %s (net %s) et piste (net %s) @ %d,%d\n" - -#: pcbnew/drc.cpp:2681 -#, c-format -msgid "%d Drc Err: PAD %s (%s) net %s @ %d,%d and PAD %s (%s) net %s @ %d,%d\n" -msgstr "%d Err Drc: PAD %s (%s) net %s @ %d,%d et PAD %s (%s) net %s @ %d,%d\n" - #: pcbnew/basepcbframe.cpp:159 msgid "3D Frame already opened" msgstr "Fenetre 3D déjà ouverte" @@ -4765,10 +4659,6 @@ msgstr "Pad msgid "Include tests for clearances between pad to pads" msgstr "Inclure test de l'isolation entre pads" -#: pcbnew/dialog_drc.cpp:477 -msgid "Zones" -msgstr "Zones" - #: pcbnew/dialog_drc.cpp:480 msgid "Include zones in clearance or unconnected tests" msgstr "Inclure zones dans les test d'isolation en test tests de nonconnexion" @@ -4849,11 +4739,11 @@ msgstr "Fichier rapport termin msgid "DRC Report file" msgstr "Fichier rapport de contrôle DRC:" -#: pcbnew/class_zone.cpp:445 +#: pcbnew/class_zone.cpp:487 msgid "Corners" msgstr "Sommets" -#: pcbnew/class_zone.cpp:449 +#: pcbnew/class_zone.cpp:491 msgid "Hatch lines" msgstr "Lignes de Hachure" @@ -4897,12 +4787,20 @@ msgstr "Pad pr msgid "Via hole > diameter" msgstr "Perçage via > diamètre" -#: pcbnew/hotkeys.cpp:443 +#: pcbnew/class_drc_item.cpp:69 +msgid "Copper area inside copper area" +msgstr "Zone de cuivre à l'intérieur d'une zone de cuivre" + +#: pcbnew/class_drc_item.cpp:71 +msgid "Copper areas intersect or too close" +msgstr "Les zones de cuivre se coupent ou sont trop proches" + +#: pcbnew/hotkeys.cpp:467 #, c-format msgid "Footprint %s found, but locked" msgstr "Module %s trouvé, mais verrouillé" -#: pcbnew/hotkeys.cpp:608 +#: pcbnew/hotkeys.cpp:632 msgid "Delete module?" msgstr "Effacer Module?" @@ -5195,7 +5093,7 @@ msgstr "\" de la librairie \"" #: eeschema/libedit.cpp:373 msgid "Clear old component from screen (changes will be lost)?" -msgstr "" +msgstr "Supprimer l'ancien composant de l'écran (les changements seront perdus)?" #: eeschema/libedit.cpp:391 msgid "\" exists in library \"" @@ -7113,38 +7011,6 @@ msgstr "Erreur. Vous devez entre une ligne de commande" msgid "Error. You must provide a Title" msgstr "Erreur. Vous devez entre un titre" -#: eeschema/netlist.cpp:179 -msgid "No component" -msgstr "Pas de composants" - -#: eeschema/netlist.cpp:200 -#: eeschema/netlist.cpp:305 -#: eeschema/netlist.cpp:343 -#: eeschema/netlist.cpp:364 -#: eeschema/netlist.cpp:379 -msgid "Done" -msgstr "Fini" - -#: eeschema/netlist.cpp:203 -msgid "NbItems" -msgstr "NbItems" - -#: eeschema/netlist.cpp:310 -msgid "Labels" -msgstr "Labels" - -#: eeschema/netlist.cpp:346 -msgid "Hierar." -msgstr "Hiérar." - -#: eeschema/netlist.cpp:367 -msgid "Sorting" -msgstr "Tri" - -#: eeschema/netlist.cpp:808 -msgid "Bad Bus Label: " -msgstr "Mauvais label de Bus: " - #: eeschema/edit_component_in_lib.cpp:168 #: eeschema/dialog_edit_component_in_lib.h:43 msgid "Lib Component Properties" @@ -7806,6 +7672,11 @@ msgstr "Tout" msgid "default" msgstr "Défaut" +#: eeschema/symbdraw.cpp:795 +#, c-format +msgid "Arc %.1f deg" +msgstr "Arc %.1f deg" + #: eeschema/delsheet.cpp:42 #, c-format msgid "Sheet %s (file %s) modified. Save it?" @@ -7867,11 +7738,6 @@ msgstr "Noir" msgid "Background Color:" msgstr "Couleur du Fond:" -#: eeschema/symbdraw.cpp:795 -#, c-format -msgid "Arc %.1f deg" -msgstr "Arc %.1f deg" - #: eeschema/pinedit-dialog.cpp:233 msgid "Pin Name :" msgstr "Nom de la pin :" @@ -8060,6 +7926,38 @@ msgstr "S msgid "Mirror Block (ctrl + drag mouse)" msgstr "Bloc Miroir (ctrl + drag mouse)" +#: eeschema/netlist.cpp:179 +msgid "No component" +msgstr "Pas de composants" + +#: eeschema/netlist.cpp:200 +#: eeschema/netlist.cpp:305 +#: eeschema/netlist.cpp:343 +#: eeschema/netlist.cpp:364 +#: eeschema/netlist.cpp:379 +msgid "Done" +msgstr "Fini" + +#: eeschema/netlist.cpp:203 +msgid "NbItems" +msgstr "NbItems" + +#: eeschema/netlist.cpp:310 +msgid "Labels" +msgstr "Labels" + +#: eeschema/netlist.cpp:346 +msgid "Hierar." +msgstr "Hiérar." + +#: eeschema/netlist.cpp:367 +msgid "Sorting" +msgstr "Tri" + +#: eeschema/netlist.cpp:808 +msgid "Bad Bus Label: " +msgstr "Mauvais label de Bus: " + #: eeschema/eelibs_read_libraryfiles.cpp:115 msgid "Start loading schematic libs" msgstr "Demarre chargement des librairies schématiques" @@ -8290,16 +8188,6 @@ msgstr "Format Netliste: ViewLogic net&pkg" msgid "Component [%s] not found in .pkg file" msgstr "Composant [%s] non trouvé en fichier .pkg" -#: cvpcb/listlib.cpp:69 -#, c-format -msgid "Library file <%s> not found" -msgstr "Librairie %s non trouvée" - -#: cvpcb/listlib.cpp:79 -#, c-format -msgid "Library file <%s> is not a module library" -msgstr "Le fichier %s n'est pas une librairie eeschema" - #: cvpcb/init.cpp:64 #, c-format msgid "Components: %d (free: %d)" @@ -8428,6 +8316,16 @@ msgstr "Ouvrir la documentation de cvpcb" msgid "Netlist Format: Pcad" msgstr " Format NetListe: Pcad" +#: cvpcb/listlib.cpp:69 +#, c-format +msgid "Library file <%s> not found" +msgstr "Librairie %s non trouvée" + +#: cvpcb/listlib.cpp:79 +#, c-format +msgid "Library file <%s> is not a module library" +msgstr "Le fichier %s n'est pas une librairie eeschema" + #: cvpcb/cvframe.cpp:175 msgid "Netlist and Cmp list modified, Save before exit ?" msgstr "Netlist et liste composants modifiés, Sauver avant de quitter ?" @@ -9260,126 +9158,6 @@ msgstr "X" msgid "Y" msgstr "Y" -#: common/common.cpp:48 -msgid " (\"):" -msgstr " (\"):" - -#: common/common.cpp:277 -msgid "Copper " -msgstr "Cuivre " - -#: common/common.cpp:277 -msgid "Inner L1 " -msgstr "Interne 1" - -#: common/common.cpp:277 -msgid "Inner L2 " -msgstr "Interne 2" - -#: common/common.cpp:277 -msgid "Inner L3 " -msgstr "Interne 3" - -#: common/common.cpp:278 -msgid "Inner L4 " -msgstr "Interne 4" - -#: common/common.cpp:278 -msgid "Inner L5 " -msgstr "Interne 5" - -#: common/common.cpp:278 -msgid "Inner L6 " -msgstr "Interne 6" - -#: common/common.cpp:278 -msgid "Inner L7 " -msgstr "Interne 7" - -#: common/common.cpp:279 -msgid "Inner L8 " -msgstr "Interne 8" - -#: common/common.cpp:279 -msgid "Inner L9 " -msgstr "Interne 9" - -#: common/common.cpp:279 -msgid "Inner L10" -msgstr "Interne 10" - -#: common/common.cpp:279 -msgid "Inner L11" -msgstr "Interne 11" - -#: common/common.cpp:280 -msgid "Inner L12" -msgstr "Interne 12" - -#: common/common.cpp:280 -msgid "Inner L13" -msgstr "Interne 13" - -#: common/common.cpp:280 -msgid "Inner L14" -msgstr "Interne 14" - -#: common/common.cpp:281 -msgid "Adhes Cop" -msgstr "Adhes Cu " - -#: common/common.cpp:281 -msgid "Adhes Cmp" -msgstr "Adhe Cmp" - -#: common/common.cpp:281 -msgid "SoldP Cop" -msgstr "SoldP Cu " - -#: common/common.cpp:281 -msgid "SoldP Cmp" -msgstr "SoldP Cmp" - -#: common/common.cpp:282 -msgid "SilkS Cop" -msgstr "Sérigr Cu " - -#: common/common.cpp:282 -msgid "SilkS Cmp" -msgstr "Sérigr Cmp" - -#: common/common.cpp:282 -msgid "Mask Cop " -msgstr "Masque Cu " - -#: common/common.cpp:282 -msgid "Mask Cmp " -msgstr "Masque Cmp" - -#: common/common.cpp:283 -msgid "Drawings " -msgstr "Drawings " - -#: common/common.cpp:283 -msgid "Comments " -msgstr "Comments " - -#: common/common.cpp:283 -msgid "Eco1 " -msgstr "Eco1 " - -#: common/common.cpp:283 -msgid "Eco2 " -msgstr "Eco2 " - -#: common/common.cpp:284 -msgid "Edges Pcb" -msgstr "Contour Pcb" - -#: common/common.cpp:284 -msgid "--- " -msgstr "--- " - #: common/basicframe.cpp:216 #, c-format msgid "Help file %s not found" @@ -9499,6 +9277,202 @@ msgstr "Inversion Bloc" msgid "Block Mirror" msgstr "Bloc Miroir" +#: common/common.cpp:49 +msgid " (\"):" +msgstr " (\"):" + +#: common/common.cpp:295 +msgid "H2 Bottom" +msgstr "H2 Bottom" + +#: common/common.cpp:295 +msgid "Power" +msgstr "Power" + +#: common/common.cpp:295 +msgid "V2 Signal" +msgstr "V2 Signal" + +#: common/common.cpp:295 +msgid "H1 Signal" +msgstr "H1 Signal" + +#: common/common.cpp:296 +msgid "Ground" +msgstr "Ground" + +#: common/common.cpp:296 +#: common/common.cpp:307 +#: common/common.cpp:340 +msgid "Inner L5 " +msgstr "Interne 5" + +#: common/common.cpp:296 +#: common/common.cpp:307 +#: common/common.cpp:340 +msgid "Inner L6 " +msgstr "Interne 6" + +#: common/common.cpp:296 +#: common/common.cpp:307 +#: common/common.cpp:340 +msgid "Inner L7 " +msgstr "Interne 7" + +#: common/common.cpp:297 +#: common/common.cpp:308 +#: common/common.cpp:341 +msgid "Inner L8 " +msgstr "Interne 8" + +#: common/common.cpp:297 +#: common/common.cpp:308 +#: common/common.cpp:341 +msgid "Inner L9 " +msgstr "Interne 9" + +#: common/common.cpp:297 +#: common/common.cpp:308 +#: common/common.cpp:341 +msgid "Inner L10" +msgstr "Interne 10" + +#: common/common.cpp:297 +#: common/common.cpp:308 +#: common/common.cpp:341 +msgid "Inner L11" +msgstr "Interne 11" + +#: common/common.cpp:298 +#: common/common.cpp:309 +#: common/common.cpp:342 +msgid "Inner L12" +msgstr "Interne 12" + +#: common/common.cpp:298 +#: common/common.cpp:309 +#: common/common.cpp:342 +msgid "Inner L13" +msgstr "Interne 13" + +#: common/common.cpp:298 +#: common/common.cpp:309 +#: common/common.cpp:342 +msgid "Inner L14" +msgstr "Interne 14" + +#: common/common.cpp:299 +#: common/common.cpp:310 +#: common/common.cpp:343 +msgid "Adhes Cop" +msgstr "Adhes Cu " + +#: common/common.cpp:299 +#: common/common.cpp:310 +#: common/common.cpp:343 +msgid "Adhes Cmp" +msgstr "Adhe Cmp" + +#: common/common.cpp:299 +#: common/common.cpp:310 +#: common/common.cpp:343 +msgid "SoldP Cop" +msgstr "SoldP Cu " + +#: common/common.cpp:299 +#: common/common.cpp:310 +#: common/common.cpp:343 +msgid "SoldP Cmp" +msgstr "SoldP Cmp" + +#: common/common.cpp:300 +#: common/common.cpp:311 +#: common/common.cpp:344 +msgid "SilkS Cop" +msgstr "Sérigr Cu " + +#: common/common.cpp:300 +#: common/common.cpp:311 +#: common/common.cpp:344 +msgid "SilkS Cmp" +msgstr "Sérigr Cmp" + +#: common/common.cpp:300 +#: common/common.cpp:311 +#: common/common.cpp:344 +msgid "Mask Cop " +msgstr "Masque Cu " + +#: common/common.cpp:300 +#: common/common.cpp:311 +#: common/common.cpp:344 +msgid "Mask Cmp " +msgstr "Masque Cmp" + +#: common/common.cpp:301 +#: common/common.cpp:312 +#: common/common.cpp:345 +msgid "Drawings " +msgstr "Drawings " + +#: common/common.cpp:301 +#: common/common.cpp:312 +#: common/common.cpp:345 +msgid "Comments " +msgstr "Comments " + +#: common/common.cpp:301 +#: common/common.cpp:312 +#: common/common.cpp:345 +msgid "Eco1 " +msgstr "Eco1 " + +#: common/common.cpp:301 +#: common/common.cpp:312 +#: common/common.cpp:345 +msgid "Eco2 " +msgstr "Eco2 " + +#: common/common.cpp:302 +#: common/common.cpp:313 +#: common/common.cpp:346 +msgid "Edges Pcb" +msgstr "Contour Pcb" + +#: common/common.cpp:302 +#: common/common.cpp:313 +msgid "BAD INDEX" +msgstr "BAD INDEX" + +#: common/common.cpp:306 +#: common/common.cpp:339 +msgid "Copper " +msgstr "Cuivre " + +#: common/common.cpp:306 +#: common/common.cpp:339 +msgid "Inner L1 " +msgstr "Interne 1" + +#: common/common.cpp:306 +#: common/common.cpp:339 +msgid "Inner L2 " +msgstr "Interne 2" + +#: common/common.cpp:306 +#: common/common.cpp:339 +msgid "Inner L3 " +msgstr "Interne 3" + +#: common/common.cpp:307 +#: common/common.cpp:340 +msgid "Inner L4 " +msgstr "Interne 4" + +#: common/common.cpp:346 +msgid "--- " +msgstr "--- " + #: common/gestfich.cpp:621 msgid "No default editor found, you must choose it" msgstr "Pas d'éditeur par défaut trouvé, vous devez en choisir un" @@ -9996,18 +9970,10 @@ msgid "grid user" msgstr "grille user" #: pcbnew/zones.h:59 -#: pcbnew/dialog_zones_by_polygon.h:52 +#: pcbnew/dialog_zones_by_polygon.h:53 msgid "Fill Zones Options" msgstr "Options de remplissage de Zone" -#: pcbnew/dialog_initpcb.h:38 -msgid "Global Delete" -msgstr "Effacements Généraux" - -#: pcbnew/dialog_edit_mod_text.h:43 -msgid "TextMod properties" -msgstr "Propriétés du Texte sur Module" - #: pcbnew/gen_self.h:217 msgid "Length(inch):" msgstr "Longueur (pouces):" @@ -10029,6 +9995,14 @@ msgstr "Incapable de cr msgid "Segm count = %d, Lenght = " msgstr "Nbr segm = %d, Longueur = " +#: pcbnew/dialog_initpcb.h:38 +msgid "Global Delete" +msgstr "Effacements Généraux" + +#: pcbnew/dialog_edit_mod_text.h:43 +msgid "TextMod properties" +msgstr "Propriétés du Texte sur Module" + #: pcbnew/find.h:38 msgid "Find" msgstr "Chercher" @@ -10037,7 +10011,7 @@ msgstr "Chercher" msgid "Pad properties" msgstr "Propriétés des Pads" -#: pcbnew/dialog_track_options.h:49 +#: pcbnew/dialog_track_options.h:53 msgid "Tracks and Vias Sizes" msgstr "Dims pistes et vias" @@ -10060,6 +10034,15 @@ msgstr "Options de nettoyage" msgid "General Options" msgstr "Options générales" +#: pcbnew/pcbnew.h:288 +msgid "??? Via" +msgstr "??? Via" + +#: pcbnew/pcbnew.h:290 +#, fuzzy +msgid "Blind/Buried Via" +msgstr "Via enterrée" + #: pcbnew/set_color.h:38 msgid "Pcbnew Layer Colors:" msgstr "Pcbnew: Couleur desCouches" @@ -10112,7 +10095,7 @@ msgstr "Afficher Modules Cmp" msgid "Show Modules Cu" msgstr "Afficher Modules Cu" -#: pcbnew/drc_stuff.h:120 +#: pcbnew/drc_stuff.h:121 #, c-format msgid "ErrType(%d): %s
  • %s: %s
  • %s: %s
" msgstr "Type Err(%d): %s
  • %s: %s
  • %s: %s
" @@ -10157,6 +10140,10 @@ msgstr "Label" msgid "GlobLabel" msgstr "Lab Global" +#: eeschema/eelayer.h:104 +msgid "Netname" +msgstr "NetName" + #: eeschema/eelayer.h:110 msgid "Notes" msgstr "Notes" diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index 75c95b1280..8a8a9f9113 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -110,6 +110,12 @@ void BOARD::UnLink() void BOARD::Add( BOARD_ITEM* aBoardItem, int aControl ) { + if ( aBoardItem == NULL ) + { + wxFAIL_MSG( wxT("BOARD::Add() param error: aBoardItem NULL") ); + return; + } + switch( aBoardItem->Type() ) { // this one uses a vector diff --git a/pcbnew/class_board_item.cpp b/pcbnew/class_board_item.cpp index c283ccaac8..7f7bd4a63a 100644 --- a/pcbnew/class_board_item.cpp +++ b/pcbnew/class_board_item.cpp @@ -199,10 +199,10 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const text << _( "Via" ) << wxT( " " ) << via->ShowWidth(); int shape = via->Shape(); - if( shape == VIA_BURIED ) - text << wxT(" ") << _( "Blind" ); - else if( shape == VIA_BLIND ) - text << wxT(" ") << _("Buried"); + if( shape == VIA_BLIND_BURIED ) + text << wxT(" ") << _( "Blind/Buried" ); + else if( shape == VIA_MICROVIA ) + text << wxT(" ") << _("Micro Via"); // else say nothing about normal (through) vias net = aPcb->FindNet( via->GetNet() ); diff --git a/pcbnew/class_drc_item.cpp b/pcbnew/class_drc_item.cpp index cc6f927f11..21f9f0bb12 100644 --- a/pcbnew/class_drc_item.cpp +++ b/pcbnew/class_drc_item.cpp @@ -65,6 +65,8 @@ wxString DRC_ITEM::GetErrorText() const return wxString( _("Pad near pad") ); case DRCE_VIA_HOLE_BIGGER: return wxString( _("Via hole > diameter")); + case DRCE_MICRO_VIA_INCORRECT_LAYER_PAIR: + return wxString( _("Micro Via: incorrect layer pairs (not adjacent)")); case COPPERAREA_INSIDE_COPPERAREA: return wxString( _("Copper area inside copper area")); case COPPERAREA_CLOSE_TO_COPPERAREA: diff --git a/pcbnew/class_marker.cpp b/pcbnew/class_marker.cpp index f7943915c7..5da83d1c1c 100644 --- a/pcbnew/class_marker.cpp +++ b/pcbnew/class_marker.cpp @@ -68,6 +68,16 @@ MARKER::MARKER( int aErrorCode, const wxPoint& aMarkerPos, bText, bPos ); } +MARKER::MARKER( int aErrorCode, const wxPoint& aMarkerPos, + const wxString& aText, const wxPoint& aPos ) : + BOARD_ITEM( NULL, TYPEMARKER ) // parent set during BOARD::Add() +{ + init(); + + SetData( aErrorCode, aMarkerPos, + aText, aPos ); +} + /* Effacement memoire de la structure */ MARKER::~MARKER() @@ -91,6 +101,17 @@ void MARKER::SetData( int aErrorCode, const wxPoint& aMarkerPos, } +void MARKER::SetData( int aErrorCode, const wxPoint& aMarkerPos, + const wxString& aText, const wxPoint& aPos ) +{ + m_drc.SetData( aErrorCode, aMarkerPos, + aText, aPos ); + + // @todo: switch on error code to set error code specific color, and possibly bitmap. + m_Color = WHITE; +} + + /* supprime du chainage la structure Struct * les structures arrieres et avant sont chainees directement */ @@ -122,7 +143,8 @@ void MARKER::Display_Infos( WinEDA_DrawFrame* frame ) txtA << DRC_ITEM::ShowCoord( rpt.GetPointA() ) << wxT(": ") << rpt.GetTextA(); wxString txtB; - txtB << DRC_ITEM::ShowCoord( rpt.GetPointB() ) << wxT(": ") << rpt.GetTextB(); + if ( rpt.AsSecondItem() ) + txtB << DRC_ITEM::ShowCoord( rpt.GetPointB() ) << wxT(": ") << rpt.GetTextB(); text_pos = 25; Affiche_1_Parametre( frame, text_pos, txtA, txtB, DARKBROWN ); diff --git a/pcbnew/class_marker.h b/pcbnew/class_marker.h index b312eeec4d..664ec220f2 100644 --- a/pcbnew/class_marker.h +++ b/pcbnew/class_marker.h @@ -37,8 +37,18 @@ public: MARKER( int aErrorCode, const wxPoint& aMarkerPos, const wxString& aText, const wxPoint& aPos, const wxString& bText, const wxPoint& bPos ); - - ~MARKER(); + /** + * Constructor + * @param aErrorCode The categorizing identifier for an error + * @param aMarkerPos The position of the MARKER on the BOARD + * @param aText Text describing the object + * @param aPos The position of the object + */ + MARKER( int aErrorCode, const wxPoint& aMarkerPos, + const wxString& aText, const wxPoint& aPos ); + + + ~MARKER(); void UnLink(); void Draw( WinEDA_DrawPanel* panel, wxDC* DC, int DrawMode ); @@ -78,6 +88,17 @@ public: const wxString& aText, const wxPoint& aPos, const wxString& bText, const wxPoint& bPos ); + /** + * Function SetData + * fills in all the reportable data associated with a MARKER. + * @param aErrorCode The categorizing identifier for an error + * @param aMarkerPos The position of the MARKER on the BOARD + * @param aText Text describing the object + * @param aPos The position of the object + */ + void SetData( int aErrorCode, const wxPoint& aMarkerPos, + const wxString& aText, const wxPoint& aPos ); + /** * Function GetReporter diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index f62a9a0fd4..fe7e1d6693 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -52,7 +52,7 @@ TRACK::TRACK( BOARD_ITEM* StructFather, KICAD_T idtype ) : start = end = NULL; SetNet( 0 ); SetSubNet( 0 ); - m_Drill = -1; + SetDrillDefault(); m_Param = 0; } @@ -131,6 +131,24 @@ TRACK* TRACK::Copy() const } +/** + * Function GetDrillValue + * calculate the drill value for vias (m-Drill if > 0, or default drill value for the board + * @return real drill_value +*/ +int TRACK::GetDrillValue(void) +{ + if ( Type() != TYPEVIA ) return 0; + + if ( m_Drill >= 0 ) return m_Drill; + + if ( m_Shape == VIA_MICROVIA ) + return g_DesignSettings.m_MicroViaDrill; + + return g_DesignSettings.m_ViaDrill; +} + + /***********************/ bool TRACK::IsNull() /***********************/ @@ -253,7 +271,7 @@ int TRACK::ReturnMaskLayer() if( via_type == VIA_THROUGH ) return ALL_CU_LAYERS; - // VIA_BLIND or VIA_BURIED: + // VIA_BLIND_BURIED or VIA_MICRVIA: int bottom_layer, top_layer; @@ -522,33 +540,6 @@ TRACK* TRACK::GetEndNetCode( int NetCode ) } -#if 0 // replaced by Save() -/********************************************/ -bool TRACK::WriteTrackDescr( FILE* File ) -/********************************************/ -/* write a via description on file -*/ -{ - int type = 0; - - if( Type() == TYPEVIA ) - type = 1; - - if( GetState( DELETED ) ) - return FALSE; - - fprintf( File, "Po %d %d %d %d %d %d %d\n", m_Shape, - m_Start.x, m_Start.y, m_End.x, m_End.y, m_Width, m_Drill ); - - fprintf( File, "De %d %d %d %lX %X\n", - m_Layer, type, GetNet(), - m_TimeStamp, ReturnStatus() ); - - return TRUE; -} -#endif - - bool TRACK::Save( FILE* aFile ) const { int type = 0; @@ -631,21 +622,18 @@ void TRACK::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode ) GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, rayon, color ); if( rayon > (4 * zoom) ) { - int drill_rayon, inner_rayon = rayon - (2 * zoom); + int drill_rayon = GetDrillValue() / 2; + int inner_rayon = rayon - (2 * zoom); GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, inner_rayon, color ); // Draw the via hole if the display option allows it if( DisplayOpt.m_DisplayViaMode != VIA_HOLE_NOT_SHOW ) { - if( (DisplayOpt.m_DisplayViaMode == ALL_VIA_HOLE_SHOW) - || ( m_Drill > 0 ) ) + if( (DisplayOpt.m_DisplayViaMode == ALL_VIA_HOLE_SHOW) || // Display all drill holes requested + ( (drill_rayon > 0 ) && ! IsDrillDefault() ) ) // Or Display non default holes requested { - if( m_Drill > 0 ) - drill_rayon = m_Drill / 2; - else - drill_rayon = g_DesignSettings.m_ViaDrill / 2; - if( drill_rayon < inner_rayon ) // We can show the via hole + if( drill_rayon < inner_rayon ) // We can show the via hole { GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, drill_rayon, color ); @@ -656,6 +644,33 @@ void TRACK::Draw( WinEDA_DrawPanel* panel, wxDC* DC, int draw_mode ) if( DisplayOpt.DisplayTrackIsol ) GRCircle( &panel->m_ClipBox, DC, m_Start.x, m_Start.y, rayon + g_DesignSettings.m_TrackClearence, color ); + // for Micro Vias, draw a partial cross : + // X on component layer, or + on copper layer + // (so we can see 2 superimposed microvias ): + if ( Shape() == VIA_MICROVIA ) + { + int ax, ay, bx, by; + if ( IsOnLayer(COPPER_LAYER_N) ) + { + ax = rayon; ay = 0; + bx = drill_rayon; by = 0; + } + else + { + ax = ay = (rayon * 707) / 1000; + bx = by = (drill_rayon * 707) / 1000; + } + /* lines | or \ */ + GRLine( &panel->m_ClipBox, DC, m_Start.x - ax , m_Start.y - ay, + m_Start.x - bx , m_Start.y - by, 0, color ); + GRLine( &panel->m_ClipBox, DC, m_Start.x + bx , m_Start.y + by, + m_Start.x + ax , m_Start.y + ay, 0, color ); + /* lines - or / */ + GRLine( &panel->m_ClipBox, DC, m_Start.x + ay, m_Start.y - ax , + m_Start.x + by, m_Start.y - bx, 0, color ); + GRLine( &panel->m_ClipBox, DC, m_Start.x - by, m_Start.y + bx , + m_Start.x - ay, m_Start.y + ax, 0, color ); + } } return; } @@ -813,8 +828,7 @@ void TRACK::Display_Infos( WinEDA_DrawFrame* frame ) { Affiche_1_Parametre( frame, text_pos, _( "Diam" ), msg, DARKCYAN ); - int drill_value = m_Drill >= 0 ? - m_Drill : g_DesignSettings.m_ViaDrill; + int drill_value = GetDrillValue(); valeur_param( (unsigned) drill_value, msg ); @@ -909,7 +923,7 @@ void TRACK::Show( int nestLevel, std::ostream& os ) " layer=\"" << m_Layer << '"' << " width=\"" << m_Width << '"' << -// " drill=\"" << m_Drill << '"' << +// " drill=\"" << GetDrillValue() << '"' << " netcode=\"" << GetNet() << "\">" << "" << ""; @@ -935,12 +949,12 @@ void SEGVIA::Show( int nestLevel, std::ostream& os ) cp = "through"; break; - case VIA_BURIED: - cp = "blind"; + case VIA_BLIND_BURIED: + cp = "blind/buried"; break; - case VIA_BLIND: - cp = "buried"; + case VIA_MICROVIA: + cp = "micro via"; break; default: @@ -959,7 +973,7 @@ void SEGVIA::Show( int nestLevel, std::ostream& os ) " layers=\"" << ReturnPcbLayerName( topLayer ).Trim().mb_str() << "," << ReturnPcbLayerName( botLayer ).Trim().mb_str() << '"' << " width=\"" << m_Width << '"' << - " drill=\"" << m_Drill << '"' << + " drill=\"" << GetDrillValue() << '"' << " netcode=\"" << GetNet() << "\">" << ""; diff --git a/pcbnew/class_track.h b/pcbnew/class_track.h index 8a4bfd1c9d..6c0feb5720 100644 --- a/pcbnew/class_track.h +++ b/pcbnew/class_track.h @@ -9,10 +9,10 @@ // Via attributes (m_Shape parmeter) -#define VIA_THROUGH 3 /* Always a through hole via */ -#define VIA_BURIED 2 /* this via can be on internal layers */ -#define VIA_BLIND 1 /* this via which connect from internal layers to an external layer */ -#define VIA_NOT_DEFINED 0 /* reserved (unused) */ +#define VIA_THROUGH 3 /* Always a through hole via */ +#define VIA_BLIND_BURIED 2 /* this via can be on internal layers */ +#define VIA_MICROVIA 1 /* this via which connect from an external layer to the near neightbour internal layer */ +#define VIA_NOT_DEFINED 0 /* not yet used */ /***/ @@ -22,10 +22,12 @@ public: int m_Width; // 0 = line, > 0 = tracks, bus ... wxPoint m_Start; // Line start point wxPoint m_End; // Line end point - int m_Shape; // vias: shape and type, Track = shape.. - int m_Drill; // for vias: via drill (- 1 for default value) +protected: + int m_Drill; // for vias: via drill (- 1 for default value) + +public: BOARD_ITEM* start; // pointers to a connected item (pad or track) BOARD_ITEM* end; @@ -64,20 +66,20 @@ public: { return m_Start; // it had to be start or end. } - + /* supprime du chainage la structure Struct */ void UnLink(); - + /** * Function Save * writes the data structures for this object out to a FILE in "*.brd" format. * @param aFile The FILE to write to. * @return bool - true if success writing else false. - */ - bool Save( FILE* aFile ) const; - + */ + bool Save( FILE* aFile ) const; + /** * Function Insert * inserts a single TRACK, SEGVIA or SEGZONE, or a list of such, @@ -90,13 +92,13 @@ public: * @param InsertPoint See above */ void Insert( BOARD* aPcb, BOARD_ITEM* InsertPoint ); - + /** * Function GetBestInsertPoint * searches the "best" insertion point within the track linked list. * The best point is the begging of the corresponding net code section. * (The BOARD::m_Track and BOARD::m_Zone lists are sorted by netcode.) - * @param aPcb The BOARD to search for the insertion point. + * @param aPcb The BOARD to search for the insertion point. * @return TRACK* - the item found in the linked list (or NULL if no track) */ TRACK* GetBestInsertPoint( BOARD* aPcb ); @@ -134,8 +136,9 @@ public: */ double GetLength() const { - int dx = m_Start.x - m_End.x; - int dy = m_Start.y - m_End.y; + int dx = m_Start.x - m_End.x; + int dy = m_Start.y - m_End.y; + return hypot( dx, dy ); } @@ -145,6 +148,32 @@ public: /* divers */ int Shape() const { return m_Shape & 0xFF; } + + /** + * Function SetDrillValue + * Set the drill value for vias + * @param drill_value = new drill value + */ + void SetDrillValue(int drill_value) { m_Drill = drill_value; } + + /** + * Function SetDrillDefault + * Set the drill value for vias at default value (-1) + */ + void SetDrillDefault(void) { m_Drill = -1; } + + /** + * Function IsDrillDefault + * @return true if the drill value is default value (-1) + */ + bool IsDrillDefault(void) { return m_Drill < 0; } + + /** + * Function GetDrillValue + * calculate the drill value for vias (m-Drill if > 0, or default drill value for the board + * @return real drill_value + */ + int GetDrillValue(void); /** * Function ReturnMaskLayer @@ -203,13 +232,13 @@ public: /** * Function HitTest (overlayed) * tests if the given wxRect intersect this object. - * For now, an ending point must be inside this rect. + * For now, an ending point must be inside this rect. * @param refPos A wxPoint to test * @return bool - true if a hit, else false */ - bool HitTest( EDA_Rect& refArea ); + bool HitTest( EDA_Rect& refArea ); - /** + /** * Function GetClass * returns the class name. * @return wxString @@ -284,12 +313,14 @@ public: * returns the position of this object. * @return const wxPoint& - The position of this object. */ - wxPoint& GetPosition() - { - return m_Start; + wxPoint& GetPosition() + { + return m_Start; } - void SetPosition( const wxPoint& aPoint ) { m_Start=aPoint; m_End=aPoint; } - + + + void SetPosition( const wxPoint& aPoint ) { m_Start = aPoint; m_End = aPoint; } + /** * Function GetClass * returns the class name. diff --git a/pcbnew/classpcb.cpp b/pcbnew/classpcb.cpp index b55fbcd522..1babe715c3 100644 --- a/pcbnew/classpcb.cpp +++ b/pcbnew/classpcb.cpp @@ -19,6 +19,8 @@ #include "trigo.h" + + /**************************************************************/ void EDA_BaseStruct::Place( WinEDA_DrawFrame* frame, wxDC* DC ) /**************************************************************/ @@ -301,6 +303,29 @@ void PCB_SCREEN::Init() } +/* Return true if a microvia can be put on board + * A microvia ia a small via restricted to 2 near neighbour layers + * because its is hole is made by laser which can penetrate only one layer + * It is mainly used to connect BGA to the first inner layer + * And it is allowed from an external layer to the first inner layer + */ +bool PCB_SCREEN::IsMicroViaAcceptable(void) +{ + int copperlayercnt = g_DesignSettings.m_CopperLayerCount; + + if ( ! g_DesignSettings.m_MicroViasAllowed ) + return false; // Obvious.. + if ( copperlayercnt < 4 ) + return false; // Only on multilayer boards.. + if ( (m_Active_Layer == COPPER_LAYER_N) || + (m_Active_Layer == LAYER_CMP_N) || + (m_Active_Layer == g_DesignSettings.m_CopperLayerCount - 2) || + (m_Active_Layer == LAYER_N_2) ) + return true; + + return false; +} + /*************************/ /* class DISPLAY_OPTIONS */ /*************************/ @@ -381,8 +406,9 @@ EDA_BoardDesignSettings::EDA_BoardDesignSettings() m_LayerColor[ii] = default_layer_color[ii]; // Layer colors (tracks and graphic items) - m_ViaColor[VIA_BLIND] = CYAN; - m_ViaColor[VIA_BURIED] = BROWN; + m_ViaColor[VIA_NOT_DEFINED] = DARKGRAY; + m_ViaColor[VIA_MICROVIA] = CYAN; + m_ViaColor[VIA_BLIND_BURIED] = BROWN; m_ViaColor[VIA_THROUGH] = WHITE; m_ModuleTextCMPColor = LIGHTGRAY; // Text module color for modules on the COMPONENT layer m_ModuleTextCUColor = MAGENTA; // Text module color for modules on the COPPER layer diff --git a/pcbnew/dialog_track_options.cpp b/pcbnew/dialog_track_options.cpp index 6a68430757..5bcef3ba00 100644 --- a/pcbnew/dialog_track_options.cpp +++ b/pcbnew/dialog_track_options.cpp @@ -49,6 +49,8 @@ BEGIN_EVENT_TABLE( WinEDA_PcbTracksDialog, wxDialog ) ////@begin WinEDA_PcbTracksDialog event table entries EVT_INIT_DIALOG( WinEDA_PcbTracksDialog::OnInitDialog ) + EVT_CHECKBOX( ID_CHECKBOX_ALLOWS_MICROVIA, WinEDA_PcbTracksDialog::OnCheckboxAllowsMicroviaClick ) + EVT_BUTTON( wxID_OK, WinEDA_PcbTracksDialog::OnOkClick ) EVT_BUTTON( wxID_CANCEL, WinEDA_PcbTracksDialog::OnCancelClick ) @@ -86,6 +88,11 @@ bool WinEDA_PcbTracksDialog::Create( wxWindow* parent, wxWindowID id, const wxSt m_ViaAltDrillValueTitle = NULL; m_OptCustomViaDrill = NULL; m_OptViaType = NULL; + m_MicroViaSizeTitle = NULL; + m_MicroViaSizeCtrl = NULL; + m_MicroViaDrillTitle = NULL; + m_MicroViaDrillCtrl = NULL; + m_AllowMicroViaCtrl = NULL; m_TrackWidthTitle = NULL; m_OptTrackWidth = NULL; m_TrackClearanceTitle = NULL; @@ -117,80 +124,101 @@ void WinEDA_PcbTracksDialog::CreateControls() SetFont(*g_DialogFont); ////@begin WinEDA_PcbTracksDialog content construction - // Generated by DialogBlocks, Sun 25 Nov 2007 15:41:58 CST (unregistered) + // Generated by DialogBlocks, 11/01/2008 21:51:48 (unregistered) WinEDA_PcbTracksDialog* itemDialog1 = this; wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxHORIZONTAL); itemDialog1->SetSizer(itemBoxSizer2); - wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL); - itemBoxSizer2->Add(itemBoxSizer3, 0, wxGROW|wxALL, 5); + wxStaticBox* itemStaticBoxSizer3Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Vias:")); + wxStaticBoxSizer* itemStaticBoxSizer3 = new wxStaticBoxSizer(itemStaticBoxSizer3Static, wxVERTICAL); + itemBoxSizer2->Add(itemStaticBoxSizer3, 0, wxGROW|wxALL, 5); m_ViaSizeTitle = new wxStaticText( itemDialog1, wxID_STATIC, _("Via Size"), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer3->Add(m_ViaSizeTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + itemStaticBoxSizer3->Add(m_ViaSizeTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); m_OptViaSize = new wxTextCtrl( itemDialog1, ID_TEXTCTRL, _T(""), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer3->Add(m_OptViaSize, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + itemStaticBoxSizer3->Add(m_OptViaSize, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); m_ViaDefaultDrillValueTitle = new wxStaticText( itemDialog1, wxID_STATIC, _("Default Via Drill"), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer3->Add(m_ViaDefaultDrillValueTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + itemStaticBoxSizer3->Add(m_ViaDefaultDrillValueTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); m_OptViaDrill = new wxTextCtrl( itemDialog1, ID_TEXTCTRL1, _T(""), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer3->Add(m_OptViaDrill, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + itemStaticBoxSizer3->Add(m_OptViaDrill, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); m_ViaAltDrillValueTitle = new wxStaticText( itemDialog1, wxID_STATIC, _("Alternate Via Drill"), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer3->Add(m_ViaAltDrillValueTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + itemStaticBoxSizer3->Add(m_ViaAltDrillValueTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); m_OptCustomViaDrill = new wxTextCtrl( itemDialog1, ID_TEXTCTRL2, _T(""), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer3->Add(m_OptCustomViaDrill, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); - - itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); + itemStaticBoxSizer3->Add(m_OptCustomViaDrill, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); wxArrayString m_OptViaTypeStrings; - m_OptViaTypeStrings.Add(_("Blind Via")); - m_OptViaTypeStrings.Add(_("Buried Via")); - m_OptViaTypeStrings.Add(_("Standard Via")); - m_OptViaType = new wxRadioBox( itemDialog1, ID_VIA_TYPE_SELECTION, _("Via Type"), wxDefaultPosition, wxDefaultSize, m_OptViaTypeStrings, 1, wxRA_SPECIFY_COLS ); + m_OptViaTypeStrings.Add(_("Through Via")); + m_OptViaTypeStrings.Add(_("Blind or Buried Via ")); + m_OptViaType = new wxRadioBox( itemDialog1, ID_VIA_TYPE_SELECTION, _("Default Via Type"), wxDefaultPosition, wxDefaultSize, m_OptViaTypeStrings, 1, wxRA_SPECIFY_COLS ); m_OptViaType->SetSelection(0); - itemBoxSizer3->Add(m_OptViaType, 0, wxGROW|wxALL, 5); + itemStaticBoxSizer3->Add(m_OptViaType, 0, wxGROW|wxALL, 5); - itemBoxSizer2->Add(5, 5, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); + wxStaticBox* itemStaticBoxSizer11Static = new wxStaticBox(itemDialog1, wxID_ANY, _("Micro Vias:")); + wxStaticBoxSizer* itemStaticBoxSizer11 = new wxStaticBoxSizer(itemStaticBoxSizer11Static, wxVERTICAL); + itemBoxSizer2->Add(itemStaticBoxSizer11, 0, wxGROW|wxALL, 5); - wxBoxSizer* itemBoxSizer13 = new wxBoxSizer(wxVERTICAL); - itemBoxSizer2->Add(itemBoxSizer13, 0, wxGROW|wxALL, 5); + m_MicroViaSizeTitle = new wxStaticText( itemDialog1, wxID_STATIC, _("Micro Via Size"), wxDefaultPosition, wxDefaultSize, 0 ); + itemStaticBoxSizer11->Add(m_MicroViaSizeTitle, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5); + + m_MicroViaSizeCtrl = new wxTextCtrl( itemDialog1, ID_TEXTCTRL7, _T(""), wxDefaultPosition, wxDefaultSize, 0 ); + itemStaticBoxSizer11->Add(m_MicroViaSizeCtrl, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + + m_MicroViaDrillTitle = new wxStaticText( itemDialog1, wxID_STATIC, _("Micro Via Drill"), wxDefaultPosition, wxDefaultSize, 0 ); + itemStaticBoxSizer11->Add(m_MicroViaDrillTitle, 0, wxGROW|wxLEFT|wxRIGHT|wxTOP, 5); + + m_MicroViaDrillCtrl = new wxTextCtrl( itemDialog1, ID_TEXTCTRL6, _T(""), wxDefaultPosition, wxDefaultSize, 0 ); + itemStaticBoxSizer11->Add(m_MicroViaDrillCtrl, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + + itemStaticBoxSizer11->Add(5, 5, 0, wxGROW|wxALL, 5); + + m_AllowMicroViaCtrl = new wxCheckBox( itemDialog1, ID_CHECKBOX_ALLOWS_MICROVIA, _("Allows Micro Vias"), wxDefaultPosition, wxDefaultSize, 0 ); + m_AllowMicroViaCtrl->SetValue(false); + m_AllowMicroViaCtrl->SetHelpText(_("Allows use of micro vias\nThey are very small vias only from an external copper layer to its near neightbour\n")); + if (WinEDA_PcbTracksDialog::ShowToolTips()) + m_AllowMicroViaCtrl->SetToolTip(_("Allows use of micro vias\nThey are very small vias only from an external copper layer to its near neightbour\n")); + itemStaticBoxSizer11->Add(m_AllowMicroViaCtrl, 0, wxGROW|wxALL, 5); + + wxBoxSizer* itemBoxSizer18 = new wxBoxSizer(wxVERTICAL); + itemBoxSizer2->Add(itemBoxSizer18, 0, wxGROW|wxALL, 5); m_TrackWidthTitle = new wxStaticText( itemDialog1, wxID_STATIC, _("Track Width"), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer13->Add(m_TrackWidthTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + itemBoxSizer18->Add(m_TrackWidthTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); m_OptTrackWidth = new wxTextCtrl( itemDialog1, ID_TEXTCTRL3, _T(""), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer13->Add(m_OptTrackWidth, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + itemBoxSizer18->Add(m_OptTrackWidth, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); m_TrackClearanceTitle = new wxStaticText( itemDialog1, wxID_STATIC, _("Clearance"), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer13->Add(m_TrackClearanceTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + itemBoxSizer18->Add(m_TrackClearanceTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); m_OptTrackClearance = new wxTextCtrl( itemDialog1, ID_TEXTCTRL4, _T(""), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer13->Add(m_OptTrackClearance, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + itemBoxSizer18->Add(m_OptTrackClearance, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); m_MaskClearanceTitle = new wxStaticText( itemDialog1, wxID_STATIC, _("Mask clearance"), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer13->Add(m_MaskClearanceTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); + itemBoxSizer18->Add(m_MaskClearanceTitle, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5); m_OptMaskMargin = new wxTextCtrl( itemDialog1, ID_TEXTCTRL5, _T(""), wxDefaultPosition, wxDefaultSize, 0 ); - itemBoxSizer13->Add(m_OptMaskMargin, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); + itemBoxSizer18->Add(m_OptMaskMargin, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5); - itemBoxSizer13->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); + wxBoxSizer* itemBoxSizer25 = new wxBoxSizer(wxVERTICAL); + itemBoxSizer2->Add(itemBoxSizer25, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); - wxBoxSizer* itemBoxSizer21 = new wxBoxSizer(wxVERTICAL); - itemBoxSizer13->Add(itemBoxSizer21, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5); + wxButton* itemButton26 = new wxButton( itemDialog1, wxID_OK, _("&OK"), wxDefaultPosition, wxDefaultSize, 0 ); + itemButton26->SetForegroundColour(wxColour(210, 0, 0)); + itemBoxSizer25->Add(itemButton26, 0, wxGROW|wxALL, 5); - wxButton* itemButton22 = new wxButton( itemDialog1, wxID_OK, _("&OK"), wxDefaultPosition, wxDefaultSize, 0 ); - itemButton22->SetForegroundColour(wxColour(210, 0, 0)); - itemBoxSizer21->Add(itemButton22, 0, wxGROW|wxALL, 5); - - wxButton* itemButton23 = new wxButton( itemDialog1, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, wxBU_LEFT ); - itemButton23->SetForegroundColour(wxColour(0, 0, 255)); - itemBoxSizer21->Add(itemButton23, 0, wxGROW|wxALL, 5); + wxButton* itemButton27 = new wxButton( itemDialog1, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, wxBU_LEFT ); + itemButton27->SetForegroundColour(wxColour(0, 0, 255)); + itemBoxSizer25->Add(itemButton27, 0, wxGROW|wxALL, 5); + // Set validators + m_AllowMicroViaCtrl->SetValidator( wxGenericValidator(& g_DesignSettings.m_MicroViasAllowed) ); ////@end WinEDA_PcbTracksDialog content construction SetDisplayValue(); } @@ -235,7 +263,9 @@ void WinEDA_PcbTracksDialog::SetDisplayValue() /*************************************************/ { AddUnitSymbol(*m_ViaSizeTitle); + AddUnitSymbol(*m_MicroViaSizeTitle); AddUnitSymbol(*m_ViaDefaultDrillValueTitle); + AddUnitSymbol(*m_MicroViaDrillTitle); AddUnitSymbol(*m_ViaAltDrillValueTitle); AddUnitSymbol(*m_TrackWidthTitle); AddUnitSymbol(*m_TrackClearanceTitle); @@ -243,32 +273,50 @@ void WinEDA_PcbTracksDialog::SetDisplayValue() int Internal_Unit = m_Parent->m_InternalUnits; PutValueInLocalUnits(*m_OptViaSize, g_DesignSettings.m_CurrentViaSize, Internal_Unit); + PutValueInLocalUnits(*m_MicroViaSizeCtrl, g_DesignSettings.m_CurrentMicroViaSize, Internal_Unit); PutValueInLocalUnits(*m_OptViaDrill, g_DesignSettings.m_ViaDrill, Internal_Unit); + PutValueInLocalUnits(*m_MicroViaDrillCtrl, g_DesignSettings.m_MicroViaDrill, Internal_Unit); PutValueInLocalUnits(*m_OptCustomViaDrill, g_ViaHoleLastValue, Internal_Unit); PutValueInLocalUnits(*m_OptTrackWidth, g_DesignSettings.m_CurrentTrackWidth, Internal_Unit); PutValueInLocalUnits(*m_OptTrackClearance, g_DesignSettings.m_TrackClearence, Internal_Unit); PutValueInLocalUnits(*m_OptMaskMargin, g_DesignSettings.m_MaskMargin, Internal_Unit); - m_OptViaType->SetSelection(g_DesignSettings.m_CurrentViaType - 1); + if ( g_DesignSettings.m_CurrentViaType != VIA_THROUGH ) + m_OptViaType->SetSelection(1); + + m_MicroViaSizeTitle->Enable(g_DesignSettings.m_MicroViasAllowed); + m_MicroViaSizeCtrl->Enable(g_DesignSettings.m_MicroViasAllowed); + + m_MicroViaDrillTitle->Enable(g_DesignSettings.m_MicroViasAllowed); + m_MicroViaDrillCtrl->Enable(g_DesignSettings.m_MicroViasAllowed); } /*******************************************************************/ void WinEDA_PcbTracksDialog::AcceptPcbOptions(wxCommandEvent& event) /*******************************************************************/ { - g_DesignSettings.m_CurrentViaType = m_OptViaType->GetSelection() + 1; + g_DesignSettings.m_CurrentViaType = VIA_THROUGH; + if ( m_OptViaType->GetSelection() > 0 ) + g_DesignSettings.m_CurrentViaType = VIA_BLIND_BURIED; if ( g_DesignSettings.m_CurrentViaType != VIA_THROUGH ) { if( ! IsOK(this, - _("You have selected VIA Blind or VIA Buried\nWARNING: this feature is EXPERIMENTAL!!! Accept ?") ) ) + _("You have selected VIA Blind and Buried\nWARNING: this feature is EXPERIMENTAL!!! Accept ?") ) ) g_DesignSettings.m_CurrentViaType = VIA_THROUGH; } g_DesignSettings.m_CurrentViaSize = ReturnValueFromTextCtrl(*m_OptViaSize, m_Parent->m_InternalUnits); + g_DesignSettings.m_CurrentMicroViaSize = + ReturnValueFromTextCtrl(*m_MicroViaSizeCtrl, m_Parent->m_InternalUnits); + + g_DesignSettings.m_MicroViaDrill = + ReturnValueFromTextCtrl(*m_MicroViaDrillCtrl, m_Parent->m_InternalUnits); g_DesignSettings.m_ViaDrill = ReturnValueFromTextCtrl(*m_OptViaDrill, m_Parent->m_InternalUnits); g_ViaHoleLastValue = ReturnValueFromTextCtrl(*m_OptCustomViaDrill, m_Parent->m_InternalUnits); + g_DesignSettings.m_MicroViasAllowed = m_AllowMicroViaCtrl->IsChecked(); + g_DesignSettings.m_CurrentTrackWidth = ReturnValueFromTextCtrl(*m_OptTrackWidth, m_Parent->m_InternalUnits); g_DesignSettings.m_TrackClearence = @@ -391,3 +439,17 @@ void WinEDA_PcbTracksDialog::OnInitDialog( wxInitDialogEvent& event ) event.Skip(); } + +/*! + * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_ALLOWS_MICROVIA + */ + +void WinEDA_PcbTracksDialog::OnCheckboxAllowsMicroviaClick( wxCommandEvent& event ) +{ + bool state = m_AllowMicroViaCtrl->IsChecked(); + m_MicroViaSizeTitle->Enable(state); + m_MicroViaSizeCtrl->Enable(state); + m_MicroViaDrillTitle->Enable(state); + m_MicroViaDrillCtrl->Enable(state); +} + diff --git a/pcbnew/dialog_track_options.h b/pcbnew/dialog_track_options.h index 7a3dd0c8d4..02c119fe87 100644 --- a/pcbnew/dialog_track_options.h +++ b/pcbnew/dialog_track_options.h @@ -23,6 +23,7 @@ */ ////@begin includes +#include "wx/valgen.h" ////@end includes /*! @@ -42,6 +43,9 @@ #define ID_TEXTCTRL1 10002 #define ID_TEXTCTRL2 10003 #define ID_VIA_TYPE_SELECTION 10004 +#define ID_TEXTCTRL7 10008 +#define ID_TEXTCTRL6 10010 +#define ID_CHECKBOX_ALLOWS_MICROVIA 10009 #define ID_TEXTCTRL3 10005 #define ID_TEXTCTRL4 10006 #define ID_TEXTCTRL5 10007 @@ -85,6 +89,9 @@ public: /// wxEVT_INIT_DIALOG event handler for ID_DIALOG void OnInitDialog( wxInitDialogEvent& event ); + /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_CHECKBOX_ALLOWS_MICROVIA + void OnCheckboxAllowsMicroviaClick( wxCommandEvent& event ); + /// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK void OnOkClick( wxCommandEvent& event ); @@ -115,6 +122,11 @@ public: wxStaticText* m_ViaAltDrillValueTitle; wxTextCtrl* m_OptCustomViaDrill; wxRadioBox* m_OptViaType; + wxStaticText* m_MicroViaSizeTitle; + wxTextCtrl* m_MicroViaSizeCtrl; + wxStaticText* m_MicroViaDrillTitle; + wxTextCtrl* m_MicroViaDrillCtrl; + wxCheckBox* m_AllowMicroViaCtrl; wxStaticText* m_TrackWidthTitle; wxTextCtrl* m_OptTrackWidth; wxStaticText* m_TrackClearanceTitle; diff --git a/pcbnew/dialog_track_options.pjd b/pcbnew/dialog_track_options.pjd index 15a44c073f..105fa8f6f2 100644 --- a/pcbnew/dialog_track_options.pjd +++ b/pcbnew/dialog_track_options.pjd @@ -108,10 +108,12 @@ 0 0 1 + 0 1 1 0 1 + 0 @@ -247,7 +249,6 @@ 0 1 0 - 0 1 0 0 @@ -295,7 +296,7 @@ 0 "<Any platform>" - "wxBoxSizer V" + "wxStaticBoxSizer V" "dialog-control-document" "" "sizer" @@ -304,9 +305,18 @@ 0 0 "24/4/2006" - "wbBoxSizerProxy" - "Vertical" + "wbStaticBoxSizerProxy" + "wxID_ANY" + -1 + "Vias:" "" + "" + "" + "" + 0 + 1 + "wxStaticBox" + "Vertical" "Centre" "Expand" 0 @@ -328,7 +338,7 @@ 1 0 0 - "24/4/2006" + "11/1/2008" "wbStaticTextProxy" "wxID_STATIC" 5105 @@ -398,7 +408,7 @@ 1 0 0 - "24/4/2006" + "11/1/2008" "wbTextCtrlProxy" "ID_TEXTCTRL" 10001 @@ -470,7 +480,6 @@ 0 "" "" - 0 "wxStaticText: wxID_STATIC" @@ -481,7 +490,7 @@ 1 0 0 - "24/4/2006" + "11/1/2008" "wbStaticTextProxy" "wxID_STATIC" 5105 @@ -551,7 +560,7 @@ 1 0 0 - "24/4/2006" + "11/1/2008" "wbTextCtrlProxy" "ID_TEXTCTRL1" 10002 @@ -623,7 +632,6 @@ 0 "" "" - 0 "wxStaticText: wxID_STATIC" @@ -634,7 +642,7 @@ 1 0 0 - "24/4/2006" + "11/1/2008" "wbStaticTextProxy" "wxID_STATIC" 5105 @@ -704,7 +712,7 @@ 1 0 0 - "24/4/2006" + "11/1/2008" "wbTextCtrlProxy" "ID_TEXTCTRL2" 10003 @@ -776,33 +784,6 @@ 0 "" "" - 0 - - - "Spacer" - "dialog-control-document" - "" - "spacer" - 0 - 1 - 0 - 0 - "24/4/2006" - "wbSpacerProxy" - 5 - 5 - "Centre" - "Centre" - 0 - 5 - 1 - 1 - 1 - 1 - 0 - 0 - 0 - "<Any platform>" "wxRadioBox: ID_VIA_TYPE_SELECTION" @@ -813,7 +794,7 @@ 1 0 0 - "24/4/2006" + "11/1/2008" "wbRadioBoxProxy" "ID_VIA_TYPE_SELECTION" 10004 @@ -825,9 +806,9 @@ "" "" "m_OptViaType" - "Via Type" + "Default Via Type" 1 - "Blind Via|Buried Via|Standard Via" + "Through Via|Blind or Buried Via " 0 "" "" @@ -870,20 +851,29 @@ - "Spacer" + "wxStaticBoxSizer V" "dialog-control-document" "" - "spacer" + "sizer" 0 1 0 0 - "24/4/2006" - "wbSpacerProxy" - 5 - 5 + "11/1/2008" + "wbStaticBoxSizerProxy" + "wxID_ANY" + -1 + "Micro Vias:" + "" + "" + "" + "" + 0 + 1 + "wxStaticBox" + "Vertical" "Centre" - "Centre" + "Expand" 0 5 1 @@ -894,6 +884,403 @@ 0 0 "<Any platform>" + + "wxStaticText: wxID_STATIC" + "dialog-control-document" + "" + "statictext" + 0 + 1 + 0 + 0 + "11/1/2008" + "wbStaticTextProxy" + "wxID_STATIC" + 5105 + "" + "wxStaticText" + "wxStaticText" + 1 + 0 + "" + "" + "m_MicroViaSizeTitle" + "Micro Via Size" + -1 + "" + "" + "" + "" + "" + 0 + 1 + "<Any platform>" + "" + "" + "" + "" + "" + "" + "" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + "" + -1 + -1 + -1 + -1 + "Expand" + "Centre" + 0 + 5 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + "" + "" + + + "wxTextCtrl: ID_TEXTCTRL7" + "dialog-control-document" + "" + "textctrl" + 0 + 1 + 0 + 0 + "11/1/2008" + "wbTextCtrlProxy" + "ID_TEXTCTRL7" + 10008 + "" + "wxTextCtrl" + "wxTextCtrl" + 1 + 0 + "" + "" + "m_MicroViaSizeCtrl" + "" + 0 + "" + "" + "" + "" + "" + 0 + 1 + "<Any platform>" + "" + "" + "" + "" + "" + "" + "" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + "" + -1 + -1 + -1 + -1 + "Expand" + "Centre" + 0 + 5 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + "" + "" + + + "wxStaticText: wxID_STATIC" + "dialog-control-document" + "" + "statictext" + 0 + 1 + 0 + 0 + "11/1/2008" + "wbStaticTextProxy" + "wxID_STATIC" + 5105 + "" + "wxStaticText" + "wxStaticText" + 1 + 0 + "" + "" + "m_MicroViaDrillTitle" + "Micro Via Drill" + -1 + "" + "" + "" + "" + "" + 0 + 1 + "<Any platform>" + "" + "" + "" + "" + "" + "" + "" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + "" + -1 + -1 + -1 + -1 + "Expand" + "Centre" + 0 + 5 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + "" + "" + + + "wxTextCtrl: ID_TEXTCTRL6" + "dialog-control-document" + "" + "textctrl" + 0 + 1 + 0 + 0 + "11/1/2008" + "wbTextCtrlProxy" + "ID_TEXTCTRL6" + 10010 + "" + "wxTextCtrl" + "wxTextCtrl" + 1 + 0 + "" + "" + "m_MicroViaDrillCtrl" + "" + 0 + "" + "" + "" + "" + "" + 0 + 1 + "<Any platform>" + "" + "" + "" + "" + "" + "" + "" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + "" + -1 + -1 + -1 + -1 + "Expand" + "Centre" + 0 + 5 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + "" + "" + + + "Spacer" + "dialog-control-document" + "" + "spacer" + 0 + 1 + 0 + 0 + "11/1/2008" + "wbSpacerProxy" + 5 + 5 + "Expand" + "Centre" + 0 + 5 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + "<Any platform>" + + + "wxCheckBox: ID_CHECKBOX_ALLOWS_MICROVIA" + "dialog-control-document" + "" + "checkbox" + 0 + 1 + 0 + 0 + "11/1/2008" + "wbCheckBoxProxy" + "wxEVT_COMMAND_CHECKBOX_CLICKED|OnCheckboxAllowsMicroviaClick|NONE||WinEDA_PcbTracksDialog" + "ID_CHECKBOX_ALLOWS_MICROVIA" + 10009 + "" + "wxCheckBox" + "wxCheckBox" + 1 + 0 + "" + "" + "m_AllowMicroViaCtrl" + "Allows Micro Vias" + 0 + "Allows use of micro vias +They are very small vias only from an external copper layer to its near neightbour +" + "" + "g_DesignSettings.m_MicroViasAllowed" + "wxGenericValidator(& %VARIABLE%)" + "" + "" + "" + "" + "" + "" + "" + "" + 0 + 1 + "<Any platform>" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + "" + -1 + -1 + -1 + -1 + "Expand" + "Centre" + 0 + 5 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + "" + "" + "wxBoxSizer V" @@ -1379,20 +1766,86 @@ "" 0 + + + "wxBoxSizer V" + "dialog-control-document" + "" + "sizer" + 0 + 1 + 0 + 0 + "11/1/2008" + "wbBoxSizerProxy" + "Vertical" + "" + "Centre" + "Centre" + 0 + 5 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + "<Any platform>" - "Spacer" + "wxButton: wxID_OK" "dialog-control-document" "" - "spacer" + "dialogcontrol" 0 1 0 0 - "24/4/2006" - "wbSpacerProxy" - 5 - 5 - "Centre" + "11/1/2008" + "wbButtonProxy" + "wxEVT_COMMAND_BUTTON_CLICKED|OnOkClick" + "wxID_OK" + 5100 + "" + "wxButton" + "wxButton" + 1 + 0 + "" + "" + "" + "&OK" + 0 + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "D20000" + "" + 0 + 1 + "<Any platform>" + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + "" + -1 + -1 + -1 + -1 + "Expand" "Centre" 0 5 @@ -1403,22 +1856,63 @@ 0 0 0 - "<Any platform>" + "" + "" - "wxBoxSizer V" + "wxButton: wxID_CANCEL" "dialog-control-document" "" - "sizer" + "dialogcontrol" 0 1 0 0 - "25/2/2006" - "wbBoxSizerProxy" - "Vertical" + "11/1/2008" + "wbButtonProxy" + "wxEVT_COMMAND_BUTTON_CLICKED|OnCancelClick" + "wxID_CANCEL" + 5101 + "" + "wxButton" + "wxButton" + 1 + 0 + "" + "" "" - "Centre" + "&Cancel" + 0 + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "0000FF" + "" + 0 + 1 + "<Any platform>" + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + "" + -1 + -1 + -1 + -1 + "Expand" "Centre" 0 5 @@ -1429,141 +1923,8 @@ 0 0 0 - "<Any platform>" - - "wxButton: wxID_OK" - "dialog-control-document" - "" - "dialogcontrol" - 0 - 1 - 0 - 0 - "25/2/2006" - "wbButtonProxy" - "wxEVT_COMMAND_BUTTON_CLICKED|OnOkClick" - "wxID_OK" - 5100 - "" - "wxButton" - "wxButton" - 1 - 0 - "" - "" - "" - "&OK" - 0 - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "D20000" - "" - 0 - 1 - "<Any platform>" - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - "" - -1 - -1 - -1 - -1 - "Expand" - "Centre" - 0 - 5 - 1 - 1 - 1 - 1 - 0 - 0 - 0 - "" - "" - - - "wxButton: wxID_CANCEL" - "dialog-control-document" - "" - "dialogcontrol" - 0 - 1 - 0 - 0 - "25/2/2006" - "wbButtonProxy" - "wxEVT_COMMAND_BUTTON_CLICKED|OnCancelClick" - "wxID_CANCEL" - 5101 - "" - "wxButton" - "wxButton" - 1 - 0 - "" - "" - "" - "&Cancel" - 0 - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "0000FF" - "" - 0 - 1 - "<Any platform>" - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - "" - -1 - -1 - -1 - -1 - "Expand" - "Centre" - 0 - 5 - 1 - 1 - 1 - 1 - 0 - 0 - 0 - "" - "" - + "" + "" diff --git a/pcbnew/drc.cpp b/pcbnew/drc.cpp index 6eba9ed970..6e5d1e10b6 100644 --- a/pcbnew/drc.cpp +++ b/pcbnew/drc.cpp @@ -215,8 +215,8 @@ void DRC::testTracks() if( !doTrackDrc( segm, segm->Next() ) ) { wxASSERT( m_currentMarker ); - m_pcb->Add( m_currentMarker ); - m_currentMarker = 0; + m_pcb->Add( m_currentMarker ); + m_currentMarker = 0; } } } @@ -367,13 +367,25 @@ MARKER* DRC::fillMarker( TRACK* aTrack, BOARD_ITEM* aItem, int aErrorCode, MARKE if( fillMe ) - fillMe->SetData( aErrorCode, position, + { + if ( aItem ) + fillMe->SetData( aErrorCode, position, textA, aTrack->GetPosition(), textB, posB ); + else + fillMe->SetData( aErrorCode, position, + textA, aTrack->GetPosition() ); + } else - fillMe = new MARKER( aErrorCode, position, + { + if ( aItem ) + fillMe = new MARKER( aErrorCode, position, textA, aTrack->GetPosition(), textB, posB ); + else + fillMe = new MARKER( aErrorCode, position, + textA, aTrack->GetPosition() ); + } return fillMe; } @@ -421,23 +433,41 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart ) m_segmAngle = 0; - // @todo: is this necessary? - /**************************************************************/ - /* Phase 0 : test if via's hole is bigger than its diameter : */ - /**************************************************************/ - + /* Phase 0 : Test vias : */ if( aRefSeg->Type() == TYPEVIA ) { + // test if via's hole is bigger than its diameter // This test seems necessary since the dialog box that displays the // desired via hole size and width does not enforce a hole size smaller // than the via's diameter. - if( aRefSeg->m_Drill > aRefSeg->m_Width ) + if( aRefSeg->GetDrillValue() > aRefSeg->m_Width ) { m_currentMarker = fillMarker( aRefSeg, NULL, DRCE_VIA_HOLE_BIGGER, m_currentMarker ); return false; } + + // For microvias: test if they are blindvias and only between 2 layers + // because they are used for very small drill size and are drill by laser + // and **only** one layer can be drilled + if( aRefSeg->Shape() == VIA_MICROVIA ) + { + int layer1, layer2; + bool err = true; + ((SEGVIA*)aRefSeg)->ReturnLayerPair(&layer1, &layer2); + if (layer1> layer2 ) EXCHG(layer1,layer2); + // test: + if (layer1 == COPPER_LAYER_N && layer2 == LAYER_N_2 ) err = false; + if (layer1 == (g_DesignSettings.m_CopperLayerCount - 2 ) && layer2 == LAYER_CMP_N ) err = false; + if ( err ) + { + m_currentMarker = fillMarker( aRefSeg, NULL, + DRCE_MICRO_VIA_INCORRECT_LAYER_PAIR, m_currentMarker ); + return false; + } + } + } // for a non horizontal or vertical segment Compute the segment angle diff --git a/pcbnew/drc_stuff.h b/pcbnew/drc_stuff.h index e1ca3fca65..bc25c874cf 100644 --- a/pcbnew/drc_stuff.h +++ b/pcbnew/drc_stuff.h @@ -34,28 +34,29 @@ /// DRC error codes: -#define DRCE_ 1 // not used yet -#define DRCE_UNCONNECTED_PADS 2 ///< pads are unconnected -#define DRCE_TRACK_NEAR_THROUGH_HOLE 3 ///< thru hole is too close to track -#define DRCE_TRACK_NEAR_PAD 4 ///< pad too close to track -#define DRCE_TRACK_NEAR_VIA 5 ///< track too close to via -#define DRCE_VIA_NEAR_VIA 6 ///< via too close to via -#define DRCE_VIA_NEAR_TRACK 7 ///< via too close to track -#define DRCE_TRACK_ENDS1 8 ///< @todo say what this problem is -#define DRCE_TRACK_ENDS2 9 ///< @todo say what this problem is -#define DRCE_TRACK_ENDS3 10 ///< @todo say what this problem is -#define DRCE_TRACK_ENDS4 11 ///< @todo say what this problem is -#define DRCE_TRACK_UNKNOWN1 12 ///< @todo check source code and change this comment -#define DRCE_TRACKS_CROSSING 13 ///< tracks are crossing -#define DRCE_ENDS_PROBLEM1 14 ///< track ends are too close -#define DRCE_ENDS_PROBLEM2 15 ///< track ends are too close -#define DRCE_ENDS_PROBLEM3 16 ///< track ends are too close -#define DRCE_ENDS_PROBLEM4 17 ///< track ends are too close -#define DRCE_ENDS_PROBLEM5 18 ///< track ends are too close -#define DRCE_PAD_NEAR_PAD1 19 ///< pad too close to pad -#define DRCE_VIA_HOLE_BIGGER 20 ///< via's hole is bigger than its diameter -#define COPPERAREA_INSIDE_COPPERAREA 21 ///< copper area outlines intersect -#define COPPERAREA_CLOSE_TO_COPPERAREA 22 ///< copper area outlines are too close +#define DRCE_ 1 // not used yet +#define DRCE_UNCONNECTED_PADS 2 ///< pads are unconnected +#define DRCE_TRACK_NEAR_THROUGH_HOLE 3 ///< thru hole is too close to track +#define DRCE_TRACK_NEAR_PAD 4 ///< pad too close to track +#define DRCE_TRACK_NEAR_VIA 5 ///< track too close to via +#define DRCE_VIA_NEAR_VIA 6 ///< via too close to via +#define DRCE_VIA_NEAR_TRACK 7 ///< via too close to track +#define DRCE_TRACK_ENDS1 8 ///< @todo say what this problem is +#define DRCE_TRACK_ENDS2 9 ///< @todo say what this problem is +#define DRCE_TRACK_ENDS3 10 ///< @todo say what this problem is +#define DRCE_TRACK_ENDS4 11 ///< @todo say what this problem is +#define DRCE_TRACK_UNKNOWN1 12 ///< @todo check source code and change this comment +#define DRCE_TRACKS_CROSSING 13 ///< tracks are crossing +#define DRCE_ENDS_PROBLEM1 14 ///< track ends are too close +#define DRCE_ENDS_PROBLEM2 15 ///< track ends are too close +#define DRCE_ENDS_PROBLEM3 16 ///< track ends are too close +#define DRCE_ENDS_PROBLEM4 17 ///< track ends are too close +#define DRCE_ENDS_PROBLEM5 18 ///< track ends are too close +#define DRCE_PAD_NEAR_PAD1 19 ///< pad too close to pad +#define DRCE_VIA_HOLE_BIGGER 20 ///< via's hole is bigger than its diameter +#define DRCE_MICRO_VIA_INCORRECT_LAYER_PAIR 21 ///< micro via's layer pair incorrect (layers must be adjacent) +#define COPPERAREA_INSIDE_COPPERAREA 22 ///< copper area outlines intersect +#define COPPERAREA_CLOSE_TO_COPPERAREA 23 ///< copper area outlines are too close /** * Class DRC_ITEM @@ -64,48 +65,67 @@ * information held is the board coordinate and the MenuText for each item. * Also held is the type of error by number and the location of the MARKER. * A function is provided to translate that number into text. + * Some errors involve only one item (item with an incorrect param) so m_AsSecondItem is set to false in this case */ -class DRC_ITEM +class DRC_ITEM { - protected: - int m_ErrorCode; ///< the error code's numeric value - wxPoint m_Pos; ///< position of the issue - wxString m_AText; ///< text for the first BOARD_ITEM - wxString m_BText; ///< text for the second BOARD_ITEM - wxPoint m_APos; ///< the location of the first BOARD_ITEM - wxPoint m_BPos; ///< the location of the first BOARD_ITEM + int m_ErrorCode; ///< the error code's numeric value + wxPoint m_Pos; ///< position of the issue + wxString m_AText; ///< text for the first BOARD_ITEM + wxString m_BText; ///< text for the second BOARD_ITEM + wxPoint m_APos; ///< the location of the first (or main ) BOARD_ITEM + wxPoint m_BPos; ///< the location of the second BOARD_ITEM + bool m_AsSecondItem; ///< true when 2 items create a DRC error, false if only one item public: DRC_ITEM() : - m_ErrorCode(0) + m_ErrorCode( 0 ) { } - DRC_ITEM( int aErrorCode, const wxPoint& aIssuePos, - const wxString& aText, const wxString& bText, - const wxPoint& aPos, const wxPoint& bPos ) + + DRC_ITEM( int aErrorCode, const wxPoint& aIssuePos, + const wxString& aText, const wxString& bText, + const wxPoint& aPos, const wxPoint& bPos ) { - SetData( aErrorCode, aIssuePos, + SetData( aErrorCode, aIssuePos, aText, bText, aPos, bPos ); } - void SetData( int aErrorCode, const wxPoint& aIssuePos, - const wxString& aText, const wxString& bText, - const wxPoint& aPos, const wxPoint& bPos ) + DRC_ITEM( int aErrorCode, const wxPoint& aIssuePos, + const wxString& aText, const wxPoint& aPos ) + { + SetData( aErrorCode, aIssuePos, aText, aPos ); + } + + + void SetData( int aErrorCode, const wxPoint& aIssuePos, + const wxString& aText, const wxPoint& aPos ) + { + SetData( aErrorCode, aIssuePos, + aText, aText, + aPos, aPos ); + m_AsSecondItem = false; + } + + void SetData( int aErrorCode, const wxPoint& aIssuePos, + const wxString& aText, const wxString& bText, + const wxPoint& aPos, const wxPoint& bPos ) { m_ErrorCode = aErrorCode; - m_Pos = aIssuePos; - m_AText = aText; - m_BText = bText; - m_APos = aPos; - m_BPos = bPos; + m_Pos = aIssuePos; + m_AText = aText; + m_BText = bText; + m_APos = aPos; + m_BPos = bPos; + m_AsSecondItem = true; } - - + + bool AsSecondItem(void) const { return m_AsSecondItem; } /** * Function ShowHtml * translates this object into a fragment of HTML suitable for the @@ -118,16 +138,16 @@ public: // an html fragment for the entire message in the listbox. feel free // to add color if you want: - ret.Printf( _("ErrType(%d): %s
  • %s: %s
  • %s: %s
"), - m_ErrorCode, - GetErrorText().GetData(), - ShowCoord( m_APos ).GetData(), m_AText.GetData(), - ShowCoord( m_BPos ).GetData(), m_BText.GetData() ); + ret.Printf( _( "ErrType(%d): %s
  • %s: %s
  • %s: %s
" ), + m_ErrorCode, + GetErrorText().GetData(), + ShowCoord( m_APos ).GetData(), m_AText.GetData(), + ShowCoord( m_BPos ).GetData(), m_BText.GetData() ); return ret; } - + /** * Function ShowReport * translates this object into a text string suitable for saving @@ -138,15 +158,16 @@ public: { wxString ret; - ret.Printf( wxT("ErrType(%d): %s\n %s: %s\n %s: %s\n"), - m_ErrorCode, - GetErrorText().GetData(), - ShowCoord( m_APos ).GetData(), m_AText.GetData(), - ShowCoord( m_BPos ).GetData(), m_BText.GetData() ); - + ret.Printf( wxT( "ErrType(%d): %s\n %s: %s\n %s: %s\n" ), + m_ErrorCode, + GetErrorText().GetData(), + ShowCoord( m_APos ).GetData(), m_AText.GetData(), + ShowCoord( m_BPos ).GetData(), m_BText.GetData() ); + return ret; } + /** * Function GetErrorCode * returns the error code. @@ -156,7 +177,7 @@ public: return m_ErrorCode; } - + /** * Function GetErrorText * returns the string form of a drc error code. @@ -167,33 +188,37 @@ public: { return m_AText; } - + + const wxString& GetTextB() const { return m_BText; } - - - const wxPoint& GetPointA() const + + + const wxPoint& GetPointA() const { return m_APos; } - - const wxPoint& GetPointB() const + + + const wxPoint& GetPointB() const { return m_BPos; } - + + /** * Function GetPosition - * @return wxPoint& - the position of this report item within + * @return wxPoint& - the position of this report item within * the drawing. */ - const wxPoint& GetPosition() const + const wxPoint& GetPosition() const { return m_Pos; } + /** * Function ShowCoord * formats a coordinate or position to text. @@ -225,7 +250,7 @@ public: * removes and deletes all the items in the list. */ virtual void DeleteAllItems() = 0; - + /** * Function GetItem * retrieves a DRC_ITEM by pointer. The actual item remains owned by the @@ -233,12 +258,12 @@ public: * @param aIndex The 0 based index into the list of the desired item. * @return const DRC_ITEM* - the desired item or NULL if aIndex is out of range. */ - virtual const DRC_ITEM* GetItem( int aIndex ) = 0; + virtual const DRC_ITEM* GetItem( int aIndex ) = 0; /** * Function DeleteAllItems * removes and deletes desired item from the list. - * @param aIndex The 0 based index into the list of the desired item which + * @param aIndex The 0 based index into the list of the desired item which * is to be deleted. */ virtual void DeleteItem( int aIndex ) = 0; @@ -247,13 +272,13 @@ public: * Function GetCount * returns the number of items in the list. */ - virtual int GetCount() = 0; - - virtual ~DRC_ITEM_LIST() {} + virtual int GetCount() = 0; + + virtual ~DRC_ITEM_LIST() { } }; -typedef std::vector DRC_LIST; +typedef std::vector DRC_LIST; /** @@ -264,88 +289,89 @@ typedef std::vector DRC_LIST; * be sent to a text file on disk. * This class is given access to the windows and the BOARD * that it needs via its constructor or public access functions. - */ + */ class DRC { - friend class DrcDialog; - -private: - // protected or private functions() are lowercase first character. - - bool m_doPad2PadTest; - bool m_doUnconnectedTest; - bool m_doZonesTest; - bool m_doCreateRptFile; - - wxString m_rptFilename; - - // int m_errorCount; - - MARKER* m_currentMarker; - - bool m_aboartDRC; - bool m_drcInProgress; - int m_spotcx; - int m_spotcy; - int m_finx; - int m_finy; // coord relatives de l'extremite du segm de reference - - int m_segmAngle; // angle d'inclinaison du segment de reference en 0,1 degre - int m_segmLength; // length of the reference segment - - int m_xcliplo; - int m_ycliplo; - int m_xcliphi; - int m_ycliphi; // coord de la surface de securite du segment a comparer - - WinEDA_PcbFrame* m_mainWindow; - WinEDA_DrawPanel* m_drawPanel; - BOARD* m_pcb; - DrcDialog* m_ui; + friend class DrcDialog; - DRC_LIST m_unconnected; ///< list of unconnected pads, as DRC_ITEMs - - - /** +private: + + // protected or private functions() are lowercase first character. + + bool m_doPad2PadTest; + bool m_doUnconnectedTest; + bool m_doZonesTest; + bool m_doCreateRptFile; + + wxString m_rptFilename; + + // int m_errorCount; + + MARKER* m_currentMarker; + + bool m_aboartDRC; + bool m_drcInProgress; + int m_spotcx; + int m_spotcy; + int m_finx; + int m_finy; // coord relatives de l'extremite du segm de reference + + int m_segmAngle; // angle d'inclinaison du segment de reference en 0,1 degre + int m_segmLength; // length of the reference segment + + int m_xcliplo; + int m_ycliplo; + int m_xcliphi; + int m_ycliphi; // coord de la surface de securite du segment a comparer + + WinEDA_PcbFrame* m_mainWindow; + WinEDA_DrawPanel* m_drawPanel; + BOARD* m_pcb; + DrcDialog* m_ui; + + DRC_LIST m_unconnected; ///< list of unconnected pads, as DRC_ITEMs + + + /** * Function updatePointers * is a private helper function used to update needed pointers from the * one pointer which is known not to change, m_mainWindow. */ - void updatePointers(); - + void updatePointers(); + /** * Function fillMarker - * optionally creates a marker and fills it in with information, - * but does not add it to the BOARD. Use this to report any kind of + * optionally creates a marker and fills it in with information, + * but does not add it to the BOARD. Use this to report any kind of * DRC problem, or unconnected pad problem. * * @param aTrack The reference track - * @param aItem Another item on the BOARD, such as a SEGVIA, SEGZONE, + * @param aItem Another item on the BOARD, such as a SEGVIA, SEGZONE, * or TRACK. * @param aErrorCode A categorizing identifier for the particular type * of error that is being reported. - * @param fillMe A MARKER* which is to be filled in, or NULL if one is to + * @param fillMe A MARKER* which is to be filled in, or NULL if one is to * first be allocated, then filled. */ MARKER* fillMarker( TRACK* aTrack, BOARD_ITEM* aItem, int aErrorCode, MARKER* fillMe ); MARKER* fillMarker( D_PAD* aPad, D_PAD* bPad, int aErrorCode, MARKER* fillMe ); - - //---------------------------------------------- - - void testTracks(); - - void testPad2Pad(); - void testUnconnected(); + //---------------------------------------------- - void testZones(); + void testTracks(); + + void testPad2Pad(); + + void testUnconnected(); + + void testZones(); + + + //---------------------------------------------- - - //---------------------------------------------- - /** * Function doPadToPadsDrc * tests the clearance between aRefPad and other pads. @@ -355,18 +381,18 @@ private: * @param aEnd Marks the end of the list and is not included * @param max_size The size of the biggest pad (used to stop the test when the X distance is > max_size) */ - bool doPadToPadsDrc( D_PAD* aRefPad, LISTE_PAD* aStart, - LISTE_PAD* aEnd, int max_size ); - + bool doPadToPadsDrc( D_PAD* aRefPad, LISTE_PAD* aStart, + LISTE_PAD* aEnd, int max_size ); + /** * Function DoTrackDrc - * tests the current segment. + * tests the current segment. * @param aRefSeg The segment to test * @param aStart The head of a list of tracks to test against (usually BOARD::m_Track) - * @return bool - true if no poblems, else false and m_currentMarker is + * @return bool - true if no poblems, else false and m_currentMarker is * filled in with the problem information. */ - bool doTrackDrc( TRACK* aRefSeg, TRACK* aStart ); + bool doTrackDrc( TRACK* aRefSeg, TRACK* aStart ); //--------------------------------------------------- @@ -377,9 +403,9 @@ private: * @param aPad Another pad to check against * @return bool - true if clearance between aRefPad and pad is >= dist_min, else false */ - bool checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad, const int dist_min ); - - + bool checkClearancePadToPad( D_PAD* aRefPad, D_PAD* aPad, const int dist_min ); + + /** * Function checkClearanceSegmToPad * check the distance from a pad to segment. This function uses several @@ -390,30 +416,30 @@ private: * spot_cX, spot_cY = position of pad / origin of segment * @param pad_to_test Is the pad involved in the check * @param w_segm Hhalf width of the segment to test - * @param dist_min Is the minimum clearance needed + * @param dist_min Is the minimum clearance needed * * @return false distance >= dist_min, * true if distance < dist_min */ - bool checkClearanceSegmToPad( const D_PAD* pad_to_test, int w_segm, int dist_min ); + bool checkClearanceSegmToPad( const D_PAD* pad_to_test, int w_segm, int dist_min ); + - /** * Function checkMarginToCircle * @todo this translation is no good, fix this: * calculates the distance from a circle (via or round end of track) to the * segment of reference on the right hand side. - * + * * @param cx The x coordinate of the circle's center - * @param cy The y coordinate of the circle's center - * @param radius A "keep out" radius centered over the circle + * @param cy The y coordinate of the circle's center + * @param radius A "keep out" radius centered over the circle * @param length The length of the segment (i.e. coordinate of end) * @return bool - true if distance >= radius, else * false when distance < radius */ static bool checkMarginToCircle( int cx, int cy, int radius, int length ); - + /** * Function checkLine * tests to see if one track is in contact with another track. @@ -422,15 +448,15 @@ private: * dans le cadre (xcliplo,ycliplo xcliphi,ycliphi) (variables globales, * locales a ce fichier) */ - bool checkLine( int x1, int y1, int x2, int y2 ); - + bool checkLine( int x1, int y1, int x2, int y2 ); + //-------------------------------------------------- - + public: DRC( WinEDA_PcbFrame* aPcbWindow ); ~DRC(); - + /** * Function Drc * tests the current segment and returns the result and displays the error @@ -441,10 +467,10 @@ public: */ int Drc( TRACK* aRefSeg, TRACK* aList ); - + /** * Function DrcBlind - * tests the current segment and returns the result. Any error is not + * tests the current segment and returns the result. Any error is not * displayed in the status panel. * @param aRefSeg The current segment to test. * @param aList The track list to test (usually m_Pcb->m_Track) @@ -453,18 +479,18 @@ public: int DrcBlind( TRACK* aRefSeg, TRACK* aList ) { updatePointers(); - + return doTrackDrc( aRefSeg, aList ) ? OK_DRC : BAD_DRC; } - - + + /** * Function ShowDialog - * opens a dialog and prompts the user, then if a test run button is + * opens a dialog and prompts the user, then if a test run button is * clicked, runs the test(s) and creates the MARKERS. The dialog is only * created if it is not already in existence. */ - void ShowDialog(); + void ShowDialog(); /** @@ -473,9 +499,9 @@ public: * the state of the dialog's existence. * @param aReason Indication of which button was clicked to cause the destruction. */ - void DestroyDialog( int aReason ); + void DestroyDialog( int aReason ); + - /** * Function SetSettings * saves all the UI or test settings and may be called before running the tests. @@ -483,38 +509,36 @@ public: * @param aUnconnectedTest Tells whether to list unconnected pads. * @param aZonesTest Tells whether to test zones. * @param aReportName A string telling the disk file report name entered. - * @param aSaveReport A boolean telling whether to generate disk file report. + * @param aSaveReport A boolean telling whether to generate disk file report. */ - void SetSettings( bool aPad2PadTest, bool aUnconnectedTest, - bool aZonesTest, const wxString& aReportName, bool aSaveReport ) + void SetSettings( bool aPad2PadTest, bool aUnconnectedTest, + bool aZonesTest, const wxString& aReportName, bool aSaveReport ) { m_doPad2PadTest = aPad2PadTest; m_doUnconnectedTest = aUnconnectedTest; - m_doZonesTest = aZonesTest; - m_rptFilename = aReportName; - m_doCreateRptFile = aSaveReport; + m_doZonesTest = aZonesTest; + m_rptFilename = aReportName; + m_doCreateRptFile = aSaveReport; } - + /** * Function RunTests * will actually run all the tests specified with a previous call to * SetSettings() */ - void RunTests(); + void RunTests(); /** * Function ListUnconnectedPad - * gathers a list of all the unconnected pads and shows them in the + * gathers a list of all the unconnected pads and shows them in the * dialog, and optionally prints a report of such. */ - void ListUnconnectedPads(); - + void ListUnconnectedPads(); }; - #endif // _DRC_STUFF_H //EOF diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp index 53cb37a260..564e51a725 100644 --- a/pcbnew/edit.cpp +++ b/pcbnew/edit.cpp @@ -61,6 +61,7 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_STOP_CURRENT_DRAWING: case ID_POPUP_PCB_END_TRACK: case ID_POPUP_PCB_PLACE_VIA: + case ID_POPUP_PCB_PLACE_MICROVIA: case ID_POPUP_PCB_IMPORT_PAD_SETTINGS: case ID_POPUP_PCB_EXPORT_PAD_SETTINGS: case ID_POPUP_PCB_GLOBAL_IMPORT_PAD_SETTINGS: @@ -372,6 +373,9 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) } break; + case ID_POPUP_PCB_PLACE_MICROVIA: + if ( ! GetScreen()->IsMicroViaAcceptable() ) + break; case ID_POPUP_PCB_PLACE_VIA: DrawPanel->MouseToCursorSchema(); if( GetCurItem()->m_Flags & IS_DRAGGED ) @@ -380,13 +384,17 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) } else { + int v_type = g_DesignSettings.m_CurrentViaType; + if ( id == ID_POPUP_PCB_PLACE_MICROVIA ) + g_DesignSettings.m_CurrentViaType = VIA_MICROVIA; // place micro via and switch layer Other_Layer_Route( (TRACK*) GetCurItem(), &dc ); + g_DesignSettings.m_CurrentViaType = v_type; if( DisplayOpt.ContrastModeDisplay ) GetScreen()->SetRefreshReq(); } break; - case ID_POPUP_PCB_DELETE_TRACKSEG: + case ID_POPUP_PCB_DELETE_TRACKSEG: if( GetCurItem() == NULL ) break; DrawPanel->MouseToCursorSchema(); diff --git a/pcbnew/edit_track_width.cpp b/pcbnew/edit_track_width.cpp index 159f13ec9d..a8e056b6b7 100644 --- a/pcbnew/edit_track_width.cpp +++ b/pcbnew/edit_track_width.cpp @@ -34,6 +34,8 @@ int WinEDA_PcbFrame::Edit_TrackSegm_Width( wxDC* DC, TRACK* pt_segm ) if( pt_segm->Type() == TYPEVIA ) { consigne = pt_segm->m_Width = g_DesignSettings.m_CurrentViaSize; + if ( pt_segm->m_Shape == VIA_MICROVIA ) + consigne = pt_segm->m_Width = g_DesignSettings.m_CurrentMicroViaSize; } if( old_w < consigne ) /* DRC utile puisque augm de dimension */ diff --git a/pcbnew/editrack-part2.cpp b/pcbnew/editrack-part2.cpp index dda0972eaf..15eee52001 100644 --- a/pcbnew/editrack-part2.cpp +++ b/pcbnew/editrack-part2.cpp @@ -210,11 +210,10 @@ bool WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC ) /* create the via */ Via = new SEGVIA( m_Pcb ); Via->m_Flags = IS_NEW; - Via->m_Width = g_DesignSettings.m_CurrentViaSize; Via->m_Shape = g_DesignSettings.m_CurrentViaType; + Via->m_Width = g_DesignSettings.m_CurrentViaSize; Via->SetNet( g_HightLigth_NetCode ); Via->m_Start = Via->m_End = g_CurrentTrackSegment->m_End; - int old_layer = GetScreen()->m_Active_Layer; //swap the layers. @@ -224,21 +223,30 @@ bool WinEDA_PcbFrame::Other_Layer_Route( TRACK* track, wxDC* DC ) GetScreen()->m_Active_Layer = GetScreen()->m_Route_Layer_BOTTOM; /* Adjust the via layer pair */ - if( Via->Shape() == VIA_BURIED ) - { - Via->SetLayerPair( old_layer, GetScreen()->m_Active_Layer ); - } + switch ( Via->Shape() ) + { + case VIA_BLIND_BURIED: + Via->SetLayerPair( old_layer, GetScreen()->m_Active_Layer ); + break; + + case VIA_MICROVIA: // from external to the near neghbour inner layer + if ( old_layer == COPPER_LAYER_N ) + GetScreen()->m_Active_Layer = LAYER_N_2; + else if ( old_layer == LAYER_CMP_N ) + GetScreen()->m_Active_Layer = m_Pcb->m_BoardSettings->m_CopperLayerCount - 2; + else if ( old_layer == LAYER_N_2 ) + GetScreen()->m_Active_Layer = COPPER_LAYER_N; + else if ( old_layer == m_Pcb->m_BoardSettings->m_CopperLayerCount - 2 ) + GetScreen()->m_Active_Layer = LAYER_CMP_N; + // else error + Via->SetLayerPair( old_layer, GetScreen()->m_Active_Layer ); + Via->m_Width = g_DesignSettings.m_CurrentMicroViaSize; + break; - else if( Via->Shape() == VIA_BLIND ) //blind via - { - // A revoir! ( la via devrait deboucher sur 1 cote ) - Via->SetLayerPair( old_layer, GetScreen()->m_Active_Layer ); - } - - else - { - // Usual via is from copper to component; layer pair is 0 and 0x0F. - Via->SetLayerPair( COPPER_LAYER_N, LAYER_CMP_N ); + default: + // Usual via is from copper to component; layer pair is 0 and 0x0F. + Via->SetLayerPair( COPPER_LAYER_N, LAYER_CMP_N ); + break; } if( Drc_On && BAD_DRC==m_drc->Drc( Via, m_Pcb->m_Track ) ) diff --git a/pcbnew/gendrill.cpp b/pcbnew/gendrill.cpp index 635574ef98..d41644609e 100644 --- a/pcbnew/gendrill.cpp +++ b/pcbnew/gendrill.cpp @@ -469,7 +469,7 @@ void WinEDA_DrillFrame::UpdatePrecisionOptions( wxCommandEvent& event ) int WinEDA_DrillFrame::Gen_Drill_File_EXCELLON( FORET* buffer ) /***************************************************************/ -/* Create the drill file in EXECELLON format +/* Create the drill file in EXCELLON format * Return hole count * buffer: Drill tools list */ @@ -497,10 +497,10 @@ int WinEDA_DrillFrame::Gen_Drill_File_EXCELLON( FORET* buffer ) { if( pt_piste->Type() != TYPEVIA ) continue; - if( pt_piste->m_Drill == 0 ) + int via_drill = pt_piste->GetDrillValue(); + if( via_drill == 0 ) continue; - int via_drill = ( pt_piste->m_Drill < - 0 ) ? g_DesignSettings.m_ViaDrill : pt_piste->m_Drill; + if( foret->m_Diameter != via_drill ) continue; @@ -789,11 +789,9 @@ int WinEDA_DrillFrame::Gen_Liste_Forets( FORET* buffer, bool print_header ) { if( pt_piste->Type() != TYPEVIA ) continue; - if( pt_piste->m_Drill == 0 ) + int via_drill = pt_piste->GetDrillValue(); + if( via_drill == 0 ) continue; - int via_drill = g_DesignSettings.m_ViaDrill; - if( pt_piste->m_Drill > 0 ) // Drill value is not the default value - via_drill = pt_piste->m_Drill; foret = GetOrAddForet( buffer, via_drill ); if( foret ) foret->m_TotalCount++; @@ -1343,9 +1341,7 @@ int WinEDA_DrillFrame::Plot_Drill_PcbMap( FORET* buffer, int format ) { if( pt_piste->Type() != TYPEVIA ) continue; - int via_drill = g_DesignSettings.m_ViaDrill; - if( pt_piste->m_Drill >= 0 ) - via_drill = pt_piste->m_Drill; + int via_drill = pt_piste->GetDrillValue(); if( via_drill != foret->m_Diameter ) continue; pos = pt_piste->m_Start; diff --git a/pcbnew/hotkeys.cpp b/pcbnew/hotkeys.cpp index f39c2ab50f..d3e3bfa819 100644 --- a/pcbnew/hotkeys.cpp +++ b/pcbnew/hotkeys.cpp @@ -69,7 +69,8 @@ static Ki_HotkeyInfo HkSavefile( wxT( "Save board" ), HK_SAVE_BOARD, 'S' + GR_KB static Ki_HotkeyInfo HkLoadfile( wxT( "Load board" ), HK_LOAD_BOARD, 'L' + GR_KB_CTRL ); static Ki_HotkeyInfo HkFindItem( wxT( "Find Item" ), HK_FIND_ITEM, 'F' + GR_KB_CTRL ); static Ki_HotkeyInfo HkBackspace( wxT( "Delete track segment" ), HK_BACK_SPACE, WXK_BACK ); -static Ki_HotkeyInfo HkAddVia( wxT( "Add Via" ), HK_ADD_VIA, 'V' ); +static Ki_HotkeyInfo HkAddMicroVia( wxT( "Add Via" ), HK_ADD_VIA, 'V' ); +static Ki_HotkeyInfo HkAddVia( wxT( "Add MicroVia" ), HK_ADD_MICROVIA, 'V' + GR_KB_CTRL ); static Ki_HotkeyInfo HkEndTrack( wxT( "End Track" ), HK_END_TRACK, WXK_END ); static Ki_HotkeyInfo HkFlipFootprint( wxT( "Flip Footprint" ), HK_FLIP_FOOTPRINT, 'F' ); static Ki_HotkeyInfo HkRotateFootprint( wxT( "Rotate Footprint" ), HK_ROTATE_FOOTPRINT, 'R' ); @@ -105,7 +106,9 @@ Ki_HotkeyInfo* s_Common_Hotkey_List[] = { Ki_HotkeyInfo* s_board_edit_Hotkey_List[] = { &HkTrackDisplayMode, &HkDelete, &HkBackspace, - &HkAddVia, &HkEndTrack, + &HkAddVia, + &HkAddMicroVia, + &HkEndTrack, &HkMoveFootprint, &HkFlipFootprint, &HkRotateFootprint, &HkDragFootprint, &HkGetAndMoveFootprint, @@ -382,6 +385,28 @@ void WinEDA_PcbFrame::OnHotKey( wxDC* DC, int hotkey, } break; + case HK_ADD_MICROVIA: // Place a micro via if a track is in progress + if( m_ID_current_state != ID_TRACK_BUTT ) + return; + if( ItemFree ) // no track in progress: nothing to do + break; + if( GetCurItem()->Type() != TYPETRACK ) // Should not occur + return; + if( (GetCurItem()->m_Flags & IS_NEW) == 0 ) + return; + + // place micro via and switch layer + if ( GetScreen()->IsMicroViaAcceptable() ) + { + int v_type = g_DesignSettings.m_CurrentViaType; + g_DesignSettings.m_CurrentViaType = VIA_MICROVIA; + Other_Layer_Route( (TRACK*) GetCurItem(), DC ); + g_DesignSettings.m_CurrentViaType = v_type; + if( DisplayOpt.ContrastModeDisplay ) + GetScreen()->SetRefreshReq(); + } + break; + case HK_ADD_VIA: // Switch to alternate layer and Place a via if a track is in progress if( m_ID_current_state != ID_TRACK_BUTT ) return; diff --git a/pcbnew/hotkeys.h b/pcbnew/hotkeys.h index 71aed5e381..5165311aec 100644 --- a/pcbnew/hotkeys.h +++ b/pcbnew/hotkeys.h @@ -22,7 +22,9 @@ enum hotkey_id_commnand { HK_FLIP_FOOTPRINT, HK_GET_AND_MOVE_FOOTPRINT, HK_LOCK_UNLOCK_FOOTPRINT, - HK_ADD_VIA, HK_END_TRACK, + HK_ADD_VIA, + HK_ADD_MICROVIA, + HK_END_TRACK, HK_SAVE_BOARD, HK_LOAD_BOARD, HK_SWITCH_UNITS, HK_SWITCH_TRACK_DISPLAY_MODE, diff --git a/pcbnew/ioascii.cpp b/pcbnew/ioascii.cpp index 871344c7aa..74af5bf038 100644 --- a/pcbnew/ioascii.cpp +++ b/pcbnew/ioascii.cpp @@ -88,7 +88,7 @@ int WinEDA_BasePcbFrame::ReadListeSegmentDescr( FILE* File, * @return items count or - count if no end block ($End...) found. */ { - int shape, width, layer, type, flags, net_code; + int shape, width, drill, layer, type, flags, net_code; int ii = 0; char line1[256]; char line2[256]; @@ -149,13 +149,15 @@ int WinEDA_BasePcbFrame::ReadListeSegmentDescr( FILE* File, int arg_count = sscanf( line1 + 2, " %d %d %d %d %d %d %d", &shape, &PtSegm->m_Start.x, &PtSegm->m_Start.y, &PtSegm->m_End.x, &PtSegm->m_End.y, &width, - &PtSegm->m_Drill ); + &drill ); PtSegm->m_Width = width; PtSegm->m_Shape = shape; - if( arg_count < 7 ) - PtSegm->m_Drill = -1; + if( arg_count < 7 || drill <= 0 ) + PtSegm->SetDrillDefault(); + else + PtSegm->SetDrillValue(drill); PtSegm->SetLayer( layer ); PtSegm->SetNet( net_code ); @@ -399,6 +401,12 @@ int WinEDA_BasePcbFrame::ReadSetup( FILE* File, int* LineNum ) continue; } + if( stricmp( Line, "MicroViaSize" ) == 0 ) + { + g_DesignSettings.m_CurrentMicroViaSize = atoi( data ); + continue; + } + if( stricmp( Line, "ViaSizeHistory" ) == 0 ) { int tmp = atoi( data ); @@ -412,6 +420,18 @@ int WinEDA_BasePcbFrame::ReadSetup( FILE* File, int* LineNum ) continue; } + if( stricmp( Line, "MicroViaDrill" ) == 0 ) + { + g_DesignSettings.m_MicroViaDrill = atoi( data ); + continue; + } + + if( stricmp( Line, "MicroViasAllowed" ) == 0 ) + { + g_DesignSettings.m_MicroViasAllowed = atoi( data ); + continue; + } + if( stricmp( Line, "TextPcbWidth" ) == 0 ) { g_DesignSettings.m_PcbTextWidth = atoi( data ); @@ -521,6 +541,10 @@ static int WriteSetup( FILE* File, WinEDA_BasePcbFrame* frame ) fprintf( File, "ViaSizeHistory %d\n", g_DesignSettings.m_ViaSizeHistory[ii] ); } + fprintf( File, "MicroViaSize %d\n", g_DesignSettings.m_CurrentMicroViaSize); + fprintf( File, "MicroViaDrill %d\n", g_DesignSettings.m_MicroViaDrill); + fprintf( File, "MicroViasAllowed %d\n", g_DesignSettings.m_MicroViasAllowed); + fprintf( File, "TextPcbWidth %d\n", g_DesignSettings.m_PcbTextWidth ); fprintf( File, "TextPcbSize %d %d\n", g_DesignSettings.m_PcbTextSize.x, g_DesignSettings.m_PcbTextSize.y ); diff --git a/pcbnew/onrightclick.cpp b/pcbnew/onrightclick.cpp index d96aa56a31..ea1982b88b 100644 --- a/pcbnew/onrightclick.cpp +++ b/pcbnew/onrightclick.cpp @@ -515,7 +515,7 @@ void WinEDA_PcbFrame::createPopupMenuForTracks( TRACK* Track, wxMenu* PopMenu ) _( "Export via hole to others id vias" ), global_options_pad_xpm ); ADD_MENUITEM( via_mnu, ID_POPUP_PCB_VIA_HOLE_RESET_TO_DEFAULT, _( "Set ALL via holes to default" ), apply_xpm ); - if( Track->m_Drill <= 0 ) + if( ! Track->IsDrillDefault() ) { via_mnu->Enable( ID_POPUP_PCB_VIA_HOLE_EXPORT, FALSE ); } @@ -559,6 +559,12 @@ void WinEDA_PcbFrame::createPopupMenuForTracks( TRACK* Track, wxMenu* PopMenu ) } msg = AddHotkeyName( _( "Place Via" ), s_Board_Editor_Hokeys_Descr, HK_ADD_VIA ); PopMenu->Append( ID_POPUP_PCB_PLACE_VIA, msg ); + // See if we can place a Micro Via (4 or more layers, and start from an external layer): + if ( GetScreen()->IsMicroViaAcceptable() ) + { + msg = AddHotkeyName( _( "Place Micro Via" ), s_Board_Editor_Hokeys_Descr, HK_ADD_MICROVIA ); + PopMenu->Append( ID_POPUP_PCB_PLACE_MICROVIA, msg ); + } } // track Width control : diff --git a/pcbnew/pcbcfg.h b/pcbnew/pcbcfg.h index fd9e41af7a..82d0f5fc8e 100644 --- a/pcbnew/pcbcfg.h +++ b/pcbnew/pcbcfg.h @@ -20,21 +20,21 @@ static int Pcbdiv_grille; /* memorisation temporaire */ static PARAM_CFG_WXSTRING UserLibDirBufCfg ( wxT( "LibDir" ), /* Keyword */ - & g_UserLibDirBuffer, /* Parameter address */ + &g_UserLibDirBuffer, /* Parameter address */ GROUPLIB ); static PARAM_CFG_LIBNAME_LIST LibNameBufCfg ( wxT( "LibName" ), /* Keyword */ - & g_LibName_List, /* Parameter address */ + &g_LibName_List, /* Parameter address */ GROUPLIB ); static PARAM_CFG_INT PadDrillCfg ( wxT( "PadDrlX" ), /* Keyword */ - & g_Pad_Master.m_Drill.x, /* Parameter address */ + &g_Pad_Master.m_Drill.x, /* Parameter address */ 320, /* Default value */ 0, 0x7FFF /* Valeurs extremes */ ); @@ -42,7 +42,7 @@ static PARAM_CFG_INT PadDrillCfg static PARAM_CFG_INT PadDimHCfg //Pad Diameter / H Size ( wxT( "PadDimH" ), /* Keyword */ - & g_Pad_Master.m_Size.x, /* Parameter address */ + &g_Pad_Master.m_Size.x, /* Parameter address */ 550, /* Default value */ 0, 0x7FFF /* Valeurs extremes */ ); @@ -50,7 +50,7 @@ static PARAM_CFG_INT PadDimHCfg //Pad Diameter / H Size static PARAM_CFG_INT PadDimVCfg ( wxT( "PadDimV" ), /* Keyword */ - & g_Pad_Master.m_Size.y, /* Parameter address */ + &g_Pad_Master.m_Size.y, /* Parameter address */ 550, /* Default value */ 0, 0x7FFF /* Valeurs extremes */ ); @@ -59,7 +59,7 @@ static PARAM_CFG_INT PadDimVCfg static PARAM_CFG_INT PadFormeCfg ( wxT( "PadForm" ), /* Keyword */ - & g_Pad_Master.m_PadShape, /* Parameter address */ + &g_Pad_Master.m_PadShape, /* Parameter address */ PAD_CIRCLE, /* Default value */ 0, 0x7F /* Valeurs extremes */ ); @@ -67,14 +67,14 @@ static PARAM_CFG_INT PadFormeCfg static PARAM_CFG_INT PadMasqueLayerCfg ( wxT( "PadMask" ), /* Keyword */ - & g_Pad_Master.m_Masque_Layer, /* Parameter address */ + &g_Pad_Master.m_Masque_Layer, /* Parameter address */ 0x0000FFFF /* Default value */ ); static PARAM_CFG_INT ViaDiametreCfg ( wxT( "ViaDiam" ), /* Keyword */ - & g_DesignSettings.m_CurrentViaSize, /* Parameter address */ + &g_DesignSettings.m_CurrentViaSize, /* Parameter address */ 450, /* Default value */ 0, 0xFFFF /* Valeurs extremes */ ); @@ -82,15 +82,32 @@ static PARAM_CFG_INT ViaDiametreCfg static PARAM_CFG_INT ViaDrillCfg ( wxT( "ViaDril" ), /* Keyword */ - & g_DesignSettings.m_ViaDrill, /* Parameter address */ + &g_DesignSettings.m_ViaDrill, /* Parameter address */ 250, /* Default value */ 0, 0xFFFF /* Valeurs extremes */ ); + +static PARAM_CFG_INT MicroViaDiametreCfg +( + wxT( "MViaDia" ), /* Keyword */ + &g_DesignSettings.m_CurrentMicroViaSize, /* Parameter address */ + 200, /* Default value */ + 0, 1000 /* Valeurs extremes */ +); + +static PARAM_CFG_INT MicroViaDrillCfg +( + wxT( "MViaDrl" ), /* Keyword */ + &g_DesignSettings.m_MicroViaDrill, /* Parameter address */ + 80, /* Default value */ + 0, 800 /* Valeurs extremes */ +); + static PARAM_CFG_INT ViaShowHoleCfg ( INSETUP, wxT( "ViaSHole" ), /* Keyword */ - & DisplayOpt.m_DisplayViaMode, /* Parameter address */ + &DisplayOpt.m_DisplayViaMode, /* Parameter address */ VIA_SPECIAL_HOLE_SHOW, /* Default value */ VIA_HOLE_NOT_SHOW, /* Valeurs extremes */ OPT_VIA_HOLE_END - 1 /* Valeurs extremes */ @@ -99,7 +116,7 @@ static PARAM_CFG_INT ViaShowHoleCfg static PARAM_CFG_INT TrackClearenceCfg ( wxT( "Isol" ), /* Keyword */ - & g_DesignSettings.m_TrackClearence, /* Parameter address */ + &g_DesignSettings.m_TrackClearence, /* Parameter address */ 120, /* Default value */ 0, 0xFFFF /* Valeurs extremes */ ); @@ -107,15 +124,15 @@ static PARAM_CFG_INT TrackClearenceCfg static PARAM_CFG_INT LayerCountCfg // Mask Working Layers ( wxT( "Countlayer" ), /* Keyword */ - & g_DesignSettings.m_CopperLayerCount, /* Parameter address */ + &g_DesignSettings.m_CopperLayerCount, /* Parameter address */ 2, /* Default value */ - 1, NB_COPPER_LAYERS /* Valeurs extremes */ + 1, NB_COPPER_LAYERS /* Valeurs extremes */ ); static PARAM_CFG_INT TrackWidthCfg ( wxT( "Lpiste" ), /* Keyword */ - & g_DesignSettings.m_CurrentTrackWidth, /* Parameter address */ + &g_DesignSettings.m_CurrentTrackWidth, /* Parameter address */ 170, /* Default value */ 2, 0xFFFF /* Valeurs extremes */ ); @@ -123,7 +140,7 @@ static PARAM_CFG_INT TrackWidthCfg static PARAM_CFG_INT RouteLayTopCfg // First current working layer ( wxT( "RouteTo" ), /* Keyword */ - & Route_Layer_TOP, /* Parameter address */ + &Route_Layer_TOP, /* Parameter address */ 15, /* Default value */ 0, 15 /* Valeurs extremes */ ); @@ -131,7 +148,7 @@ static PARAM_CFG_INT RouteLayTopCfg // First current working layer static PARAM_CFG_INT RouteLayBotCfg // second current working layer ( wxT( "RouteBo" ), /* Keyword */ - & Route_Layer_BOTTOM, /* Parameter address */ + &Route_Layer_BOTTOM, /* Parameter address */ 0, /* Default value */ 0, 15 /* Valeurs extremes */ ); @@ -139,7 +156,7 @@ static PARAM_CFG_INT RouteLayBotCfg // second current working layer static PARAM_CFG_INT TypeViaCfg ( wxT( "TypeVia" ), /* Keyword */ - & g_DesignSettings.m_CurrentViaType, /* Parameter address */ + &g_DesignSettings.m_CurrentViaType, /* Parameter address */ VIA_THROUGH, /* Default value */ 0, 3 /* Valeurs extremes */ ); @@ -147,70 +164,70 @@ static PARAM_CFG_INT TypeViaCfg static PARAM_CFG_BOOL Segm45Cfg // Segm Pistes a 0, 45, 90 degres uniquement ( wxT( "Segm45" ), /* Keyword */ - & Track_45_Only, /* Parameter address */ + &Track_45_Only, /* Parameter address */ TRUE /* Default value */ ); static PARAM_CFG_BOOL Raccord45Cfg // Generation automatique des Raccords a 45 degres ( wxT( "Racc45" ), /* Keyword */ - & g_Raccord_45_Auto, /* Parameter address */ + &g_Raccord_45_Auto, /* Parameter address */ TRUE /* Default value */ ); static PARAM_CFG_INT UnitCfg // Units: 0 inch, 1 mm ( wxT( "Unite" ), /* Keyword */ - & g_UnitMetric, /* Parameter address */ + &g_UnitMetric, /* Parameter address */ FALSE /* Default value */ ); static PARAM_CFG_BOOL SegmFillCfg ( wxT( "SegFill" ), /* Keyword */ - & DisplayOpt.DisplayPcbTrackFill, /* Parameter address */ + &DisplayOpt.DisplayPcbTrackFill, /* Parameter address */ TRUE /* Default value */ ); static PARAM_CFG_BOOL NewTrackAfficheGardeCfg ( wxT( "NewAffG" ), /* Keyword */ - & g_ShowIsolDuringCreateTrack, /* Parameter address */ + &g_ShowIsolDuringCreateTrack, /* Parameter address */ TRUE /* Default value */ ); static PARAM_CFG_BOOL TrackAfficheGardeCfg ( wxT( "SegAffG" ), /* Keyword */ - & DisplayOpt.DisplayTrackIsol, /* Parameter address */ + &DisplayOpt.DisplayTrackIsol, /* Parameter address */ FALSE /* Default value */ ); static PARAM_CFG_BOOL PadFillCfg ( wxT( "PadFill" ), /* Keyword */ - & DisplayOpt.DisplayPadFill, /* Parameter address */ + &DisplayOpt.DisplayPadFill, /* Parameter address */ TRUE /* Default value */ ); static PARAM_CFG_BOOL PadAfficheGardeCfg ( wxT( "PadAffG" ), /* Keyword */ - & DisplayOpt.DisplayPadIsol, /* Parameter address */ + &DisplayOpt.DisplayPadIsol, /* Parameter address */ TRUE /* Default value */ ); static PARAM_CFG_BOOL PadShowNumCfg ( wxT( "PadSNum" ), /* Keyword */ - & DisplayOpt.DisplayPadNum, /* Parameter address */ + &DisplayOpt.DisplayPadNum, /* Parameter address */ TRUE /* Default value */ ); static PARAM_CFG_INT AfficheContourModuleCfg // Module Edges: fill/line/sketch ( wxT( "ModAffC" ), /* Keyword */ - & DisplayOpt.DisplayModEdge, /* Parameter address */ + &DisplayOpt.DisplayModEdge, /* Parameter address */ FILAIRE, /* Default value */ 0, 2 /* Valeurs extremes */ ); @@ -218,7 +235,7 @@ static PARAM_CFG_INT AfficheContourModuleCfg // Module Edges: fill/line/sketc static PARAM_CFG_INT AfficheTexteModuleCfg // Module Texts: fill/line/sketch ( wxT( "ModAffT" ), /* Keyword */ - & DisplayOpt.DisplayModText, /* Parameter address */ + &DisplayOpt.DisplayModText, /* Parameter address */ FILAIRE, /* Default value */ 0, 2 /* Valeurs extremes */ ); @@ -226,7 +243,7 @@ static PARAM_CFG_INT AfficheTexteModuleCfg // Module Texts: fill/line/sketch static PARAM_CFG_INT AfficheTextePcbCfg // PCB Texts: fill/line/sketch ( wxT( "PcbAffT" ), /* Keyword */ - & DisplayOpt.DisplayDrawItems, /* Parameter address */ + &DisplayOpt.DisplayDrawItems, /* Parameter address */ FILAIRE, /* Default value */ 0, 2 /* Valeurs extremes */ ); @@ -234,14 +251,14 @@ static PARAM_CFG_INT AfficheTextePcbCfg // PCB Texts: fill/line/sketch static PARAM_CFG_BOOL SegmPcb45Cfg // Force 45 degrees for segments ( wxT( "SgPcb45" ), /* Keyword */ - & Segments_45_Only, /* Parameter address */ + &Segments_45_Only, /* Parameter address */ TRUE /* Default value */ ); static PARAM_CFG_INT TextePcbDimVCfg ( wxT( "TxtPcbV" ), /* Keyword */ - & g_DesignSettings.m_PcbTextSize.y, /* Parameter address */ + &g_DesignSettings.m_PcbTextSize.y, /* Parameter address */ 600, /* Default value */ 10, 2000 /* Valeurs extremes */ ); @@ -249,7 +266,7 @@ static PARAM_CFG_INT TextePcbDimVCfg static PARAM_CFG_INT TextePcbDimHCfg ( wxT( "TxtPcbH" ), /* Keyword */ - & g_DesignSettings.m_PcbTextSize.x, /* Parameter address */ + &g_DesignSettings.m_PcbTextSize.x, /* Parameter address */ 600, /* Default value */ 10, 2000 /* Valeurs extremes */ ); @@ -258,7 +275,7 @@ static PARAM_CFG_SETCOLOR ColorLayer0Cfg // CU Layer Color ( INSETUP, wxT( "ColLay0" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[0], /* Parameter address */ + &g_DesignSettings.m_LayerColor[0], /* Parameter address */ GREEN /* Default value */ ); @@ -266,7 +283,7 @@ static PARAM_CFG_SETCOLOR ColorLayer1Cfg ( INSETUP, wxT( "ColLay1" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[1], /* Parameter address */ + &g_DesignSettings.m_LayerColor[1], /* Parameter address */ BLUE /* Default value */ ); @@ -274,7 +291,7 @@ static PARAM_CFG_SETCOLOR ColorLayer2Cfg ( INSETUP, wxT( "ColLay2" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[2], /* Parameter address */ + &g_DesignSettings.m_LayerColor[2], /* Parameter address */ LIGHTGRAY /* Default value */ ); @@ -282,7 +299,7 @@ static PARAM_CFG_SETCOLOR ColorLayer3Cfg ( INSETUP, wxT( "ColLay3" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[3], /* Parameter address */ + &g_DesignSettings.m_LayerColor[3], /* Parameter address */ 5 /* Default value */ ); @@ -290,7 +307,7 @@ static PARAM_CFG_SETCOLOR ColorLayer4Cfg ( INSETUP, wxT( "ColLay4" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[4], /* Parameter address */ + &g_DesignSettings.m_LayerColor[4], /* Parameter address */ 4 /* Default value */ ); @@ -298,7 +315,7 @@ static PARAM_CFG_SETCOLOR ColorLayer5Cfg ( INSETUP, wxT( "ColLay5" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[5], /* Parameter address */ + &g_DesignSettings.m_LayerColor[5], /* Parameter address */ 5 /* Default value */ ); @@ -306,7 +323,7 @@ static PARAM_CFG_SETCOLOR ColorLayer6Cfg ( INSETUP, wxT( "ColLay6" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[6], /* Parameter address */ + &g_DesignSettings.m_LayerColor[6], /* Parameter address */ 6 /* Default value */ ); @@ -314,7 +331,7 @@ static PARAM_CFG_SETCOLOR ColorLayer7Cfg ( INSETUP, wxT( "ColLay7" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[7], /* Parameter address */ + &g_DesignSettings.m_LayerColor[7], /* Parameter address */ 5 /* Default value */ ); @@ -322,7 +339,7 @@ static PARAM_CFG_SETCOLOR ColorLayer8Cfg ( INSETUP, wxT( "ColLay8" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[8], /* Parameter address */ + &g_DesignSettings.m_LayerColor[8], /* Parameter address */ 7 /* Default value */ ); @@ -330,7 +347,7 @@ static PARAM_CFG_SETCOLOR ColorLayer9Cfg ( INSETUP, wxT( "ColLay9" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[9], /* Parameter address */ + &g_DesignSettings.m_LayerColor[9], /* Parameter address */ 1 /* Default value */ ); @@ -338,7 +355,7 @@ static PARAM_CFG_SETCOLOR ColorLayer10Cfg ( INSETUP, wxT( "ColLayA" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[10], /* Parameter address */ + &g_DesignSettings.m_LayerColor[10], /* Parameter address */ 2 /* Default value */ ); @@ -346,7 +363,7 @@ static PARAM_CFG_SETCOLOR ColorLayer11Cfg ( INSETUP, wxT( "ColLayB" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[11], /* Parameter address */ + &g_DesignSettings.m_LayerColor[11], /* Parameter address */ 3 /* Default value */ ); @@ -354,7 +371,7 @@ static PARAM_CFG_SETCOLOR ColorLayer12Cfg ( INSETUP, wxT( "ColLayC" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[12], /* Parameter address */ + &g_DesignSettings.m_LayerColor[12], /* Parameter address */ 12 /* Default value */ ); @@ -362,7 +379,7 @@ static PARAM_CFG_SETCOLOR ColorLayer13Cfg ( INSETUP, wxT( "ColLayD" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[13], /* Parameter address */ + &g_DesignSettings.m_LayerColor[13], /* Parameter address */ 13 /* Default value */ ); @@ -370,7 +387,7 @@ static PARAM_CFG_SETCOLOR ColorLayer14Cfg ( INSETUP, wxT( "ColLayE" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[14], /* Parameter address */ + &g_DesignSettings.m_LayerColor[14], /* Parameter address */ 14 /* Default value */ ); @@ -378,7 +395,7 @@ static PARAM_CFG_SETCOLOR ColorLayer15Cfg // CMP Layer Color ( INSETUP, wxT( "ColLayF" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[15], /* Parameter address */ + &g_DesignSettings.m_LayerColor[15], /* Parameter address */ RED /* Default value */ ); @@ -386,7 +403,7 @@ static PARAM_CFG_SETCOLOR ColorLayer16Cfg // Adhesive CU Layer Color ( INSETUP, wxT( "ColLayG" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[16], /* Parameter address */ + &g_DesignSettings.m_LayerColor[16], /* Parameter address */ 1 /* Default value */ ); @@ -394,7 +411,7 @@ static PARAM_CFG_SETCOLOR ColorLayer17Cfg // Adhesive CMP Layer Color ( INSETUP, wxT( "ColLayH" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[17], /* Parameter address */ + &g_DesignSettings.m_LayerColor[17], /* Parameter address */ 5 /* Default value */ ); @@ -402,7 +419,7 @@ static PARAM_CFG_SETCOLOR ColorLayer18Cfg // Solder Mask CU Layer Color ( INSETUP, wxT( "ColLayI" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[18], /* Parameter address */ + &g_DesignSettings.m_LayerColor[18], /* Parameter address */ 11 /* Default value */ ); @@ -410,7 +427,7 @@ static PARAM_CFG_SETCOLOR ColorLayer19Cfg // Solder Mask CMP Layer Color ( INSETUP, wxT( "ColLayJ" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[19], /* Parameter address */ + &g_DesignSettings.m_LayerColor[19], /* Parameter address */ 4 /* Default value */ ); @@ -418,7 +435,7 @@ static PARAM_CFG_SETCOLOR ColorLayer20Cfg // Silk Screen CU Layer Color ( INSETUP, wxT( "ColLayK" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[20], /* Parameter address */ + &g_DesignSettings.m_LayerColor[20], /* Parameter address */ 5 /* Default value */ ); @@ -426,7 +443,7 @@ static PARAM_CFG_SETCOLOR ColorLayer21Cfg // Silk Screen CMP Layer Color ( INSETUP, wxT( "ColLayL" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[21], /* Parameter address */ + &g_DesignSettings.m_LayerColor[21], /* Parameter address */ 3 /* Default value */ ); @@ -434,7 +451,7 @@ static PARAM_CFG_SETCOLOR ColorLayer22Cfg // Mask CU Layer Color ( INSETUP, wxT( "ColLayM" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[22], /* Parameter address */ + &g_DesignSettings.m_LayerColor[22], /* Parameter address */ 6 /* Default value */ ); @@ -442,7 +459,7 @@ static PARAM_CFG_SETCOLOR ColorLayer23Cfg // Mask CMP Layer Color ( INSETUP, wxT( "ColLayN" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[23], /* Parameter address */ + &g_DesignSettings.m_LayerColor[23], /* Parameter address */ 5 /* Default value */ ); @@ -450,7 +467,7 @@ static PARAM_CFG_SETCOLOR ColorLayer24Cfg // DRAW Layer Color ( INSETUP, wxT( "ColLayO" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[24], /* Parameter address */ + &g_DesignSettings.m_LayerColor[24], /* Parameter address */ LIGHTGRAY /* Default value */ ); @@ -458,7 +475,7 @@ static PARAM_CFG_SETCOLOR ColorLayer25Cfg // Comment Layer Color ( INSETUP, wxT( "ColLayP" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[25], /* Parameter address */ + &g_DesignSettings.m_LayerColor[25], /* Parameter address */ 1 /* Default value */ ); @@ -466,7 +483,7 @@ static PARAM_CFG_SETCOLOR ColorLayer26Cfg // ECO1 Layer Color ( INSETUP, wxT( "ColLayQ" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[26], /* Parameter address */ + &g_DesignSettings.m_LayerColor[26], /* Parameter address */ 2 /* Default value */ ); @@ -474,7 +491,7 @@ static PARAM_CFG_SETCOLOR ColorLayer27Cfg //ECO2 Layer Color ( INSETUP, wxT( "ColLayR" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[27], /* Parameter address */ + &g_DesignSettings.m_LayerColor[27], /* Parameter address */ 14 /* Default value */ ); @@ -482,7 +499,7 @@ static PARAM_CFG_SETCOLOR ColorLayer28Cfg // EDGES Layer Color ( INSETUP, wxT( "ColLayS" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[28], /* Parameter address */ + &g_DesignSettings.m_LayerColor[28], /* Parameter address */ YELLOW /* Default value */ ); @@ -490,7 +507,7 @@ static PARAM_CFG_SETCOLOR ColorLayer29Cfg ( INSETUP, wxT( "ColLayT" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[29], /* Parameter address */ + &g_DesignSettings.m_LayerColor[29], /* Parameter address */ 13 /* Default value */ ); @@ -498,7 +515,7 @@ static PARAM_CFG_SETCOLOR ColorLayer30Cfg ( INSETUP, wxT( "ColLayU" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[30], /* Parameter address */ + &g_DesignSettings.m_LayerColor[30], /* Parameter address */ 14 /* Default value */ ); @@ -506,7 +523,7 @@ static PARAM_CFG_SETCOLOR ColorLayer31Cfg ( INSETUP, wxT( "ColLayV" ), /* Keyword */ - & g_DesignSettings.m_LayerColor[31], /* Parameter address */ + &g_DesignSettings.m_LayerColor[31], /* Parameter address */ 7 /* Default value */ ); @@ -514,7 +531,7 @@ static PARAM_CFG_SETCOLOR ColorTxtModCmpCfg ( INSETUP, wxT( "CTxtMoC" ), /* Keyword */ - & g_ModuleTextCMPColor, /* Parameter address */ + &g_ModuleTextCMPColor, /* Parameter address */ LIGHTGRAY /* Default value */ ); @@ -522,7 +539,7 @@ static PARAM_CFG_SETCOLOR ColorTxtModCuCfg ( INSETUP, wxT( "CTxtMoS" ), /* Keyword */ - & g_ModuleTextCUColor, /* Parameter address */ + &g_ModuleTextCUColor, /* Parameter address */ 1 /* Default value */ ); @@ -530,14 +547,14 @@ static PARAM_CFG_SETCOLOR VisibleTxtModCfg ( INSETUP, wxT( "CTxtVis" ), /* Keyword */ - & g_ModuleTextNOVColor, /* Parameter address */ + &g_ModuleTextNOVColor, /* Parameter address */ DARKGRAY /* Default value */ ); static PARAM_CFG_INT TexteModDimVCfg ( wxT( "TxtModV" ), /* Keyword */ - & ModuleTextSize.y, /* Parameter address */ + &ModuleTextSize.y, /* Parameter address */ 500, /* Default value */ 1, 20000 /* Valeurs extremes */ ); @@ -545,7 +562,7 @@ static PARAM_CFG_INT TexteModDimVCfg static PARAM_CFG_INT TexteModDimHCfg ( wxT( "TxtModH" ), /* Keyword */ - & ModuleTextSize.x, /* Parameter address */ + &ModuleTextSize.x, /* Parameter address */ 500, /* Default value */ 1, 20000 /* Valeurs extremes */ ); @@ -553,7 +570,7 @@ static PARAM_CFG_INT TexteModDimHCfg static PARAM_CFG_INT TexteModWidthCfg ( wxT( "TxtModW" ), /* Keyword */ - & ModuleTextWidth, /* Parameter address */ + &ModuleTextWidth, /* Parameter address */ 100, /* Default value */ 1, 10000 /* Valeurs extremes */ ); @@ -562,7 +579,7 @@ static PARAM_CFG_SETCOLOR ColorAncreModCfg ( INSETUP, wxT( "CAncreM" ), /* Keyword */ - & g_AnchorColor, /* Parameter address */ + &g_AnchorColor, /* Parameter address */ BLUE /* Default value */ ); @@ -570,7 +587,7 @@ static PARAM_CFG_SETCOLOR ColorPadCuCfg ( INSETUP, wxT( "CoPadCu" ), /* Keyword */ - & g_PadCUColor, /* Parameter address */ + &g_PadCUColor, /* Parameter address */ GREEN /* Default value */ ); @@ -578,39 +595,39 @@ static PARAM_CFG_SETCOLOR ColorPadCmpCfg ( INSETUP, wxT( "CoPadCm" ), /* Keyword */ - & g_PadCMPColor, /* Parameter address */ + &g_PadCMPColor, /* Parameter address */ RED /* Default value */ ); -static PARAM_CFG_SETCOLOR ColorViaNormCfg +static PARAM_CFG_SETCOLOR ColorViaThroughCfg ( INSETUP, - wxT( "CoViaNo" ), /* Keyword */ - & g_DesignSettings.m_ViaColor[VIA_THROUGH], /* Parameter address */ + wxT( "CoViaTh" ), /* Keyword */ + &g_DesignSettings.m_ViaColor[VIA_THROUGH], /* Parameter address */ LIGHTGRAY /* Default value */ ); -static PARAM_CFG_SETCOLOR ColorViaborgneCfg +static PARAM_CFG_SETCOLOR ColorViaBlindBuriedCfg ( INSETUP, - wxT( "CoViaBo" ), /* Keyword */ - & g_DesignSettings.m_ViaColor[VIA_BURIED], /* Parameter address */ - CYAN /* Default value */ + wxT( "CoViaBu" ), /* Keyword */ + &g_DesignSettings.m_ViaColor[VIA_BLIND_BURIED], /* Parameter address */ + BROWN /* Default value */ ); -static PARAM_CFG_SETCOLOR ColorViaEnterreeCfg // Buried Via Color +static PARAM_CFG_SETCOLOR ColorViaMicroViaCfg // Buried Via Color ( INSETUP, - wxT( "CoViaEn" ), /* Keyword */ - & g_DesignSettings.m_ViaColor[VIA_BLIND], /* Parameter address */ - BROWN /* Default value */ + wxT( "CoViaMi" ), /* Keyword */ + &g_DesignSettings.m_ViaColor[VIA_MICROVIA], /* Parameter address */ + CYAN /* Default value */ ); static PARAM_CFG_SETCOLOR ColorpcbGrilleCfg ( INSETUP, wxT( "CoPcbGr" ), /* Keyword */ - & g_GridColor, /* Parameter address */ + &g_GridColor, /* Parameter address */ DARKGRAY /* Default value */ ); @@ -618,14 +635,14 @@ static PARAM_CFG_SETCOLOR ColorCheveluCfg ( INSETUP, wxT( "CoRatsN" ), /* Keyword */ - & g_DesignSettings.m_RatsnestColor, /* Parameter address */ + &g_DesignSettings.m_RatsnestColor, /* Parameter address */ WHITE /* Default value */ ); static PARAM_CFG_INT HPGLpenNumCfg ( wxT( "HPGLnum" ), /* Keyword */ - & g_HPGL_Pen_Num, /* Parameter address */ + &g_HPGL_Pen_Num, /* Parameter address */ 1, /* Default value */ 1, 16 /* Valeurs extremes */ ); @@ -633,7 +650,7 @@ static PARAM_CFG_INT HPGLpenNumCfg static PARAM_CFG_INT HPGLdiamCfg // HPGL pen size (mils) ( wxT( "HPGdiam" ), /* Keyword */ - & g_HPGL_Pen_Diam, /* Parameter address */ + &g_HPGL_Pen_Diam, /* Parameter address */ 15, /* Default value */ 0, 100 /* Valeurs extremes */ ); @@ -641,7 +658,7 @@ static PARAM_CFG_INT HPGLdiamCfg // HPGL pen size (mils) static PARAM_CFG_INT HPGLspeedCfg //HPGL pen speed (cm/s) ( wxT( "HPGLSpd" ), /* Keyword */ - & g_HPGL_Pen_Speed, /* Parameter address */ + &g_HPGL_Pen_Speed, /* Parameter address */ 20, /* Default value */ 0, 1000 /* Valeurs extremes */ ); @@ -649,7 +666,7 @@ static PARAM_CFG_INT HPGLspeedCfg //HPGL pen speed (cm/s) static PARAM_CFG_INT HPGLrecouvrementCfg ( wxT( "HPGLrec" ), /* Keyword */ - & g_HPGL_Pen_Recouvrement, /* Parameter address */ + &g_HPGL_Pen_Recouvrement, /* Parameter address */ 2, /* Default value */ 0, 0x100 /* Valeurs extremes */ ); @@ -657,14 +674,14 @@ static PARAM_CFG_INT HPGLrecouvrementCfg static PARAM_CFG_BOOL HPGLcenterCfg //HPGL Org Coord ( 0 normal, 1 Centre) ( wxT( "HPGLorg" ), /* Keyword */ - & HPGL_Org_Centre, /* Parameter address */ + &HPGL_Org_Centre, /* Parameter address */ FALSE /* Default value */ ); static PARAM_CFG_INT GERBERSpotMiniCfg //Aperture Mini (mils) ( wxT( "GERBmin" ), /* Keyword */ - & spot_mini, /* Parameter address */ + &spot_mini, /* Parameter address */ 15, /* Default value */ 1, 100 /* Valeurs extremes */ ); @@ -672,7 +689,7 @@ static PARAM_CFG_INT GERBERSpotMiniCfg //Aperture Mini (mils) static PARAM_CFG_INT VernisEpargneGardeCfg ( wxT( "VEgarde" ), /* Keyword */ - & g_DesignSettings.m_MaskMargin, /* Parameter address */ + &g_DesignSettings.m_MaskMargin, /* Parameter address */ 100, /* Default value */ 0, 0xFFFF /* Valeurs extremes */ ); @@ -680,7 +697,7 @@ static PARAM_CFG_INT VernisEpargneGardeCfg static PARAM_CFG_INT DrawSegmLargeurCfg ( wxT( "DrawLar" ), /* Keyword */ - & g_DesignSettings.m_DrawSegmentWidth, /* Parameter address */ + &g_DesignSettings.m_DrawSegmentWidth, /* Parameter address */ 120, /* Default value */ 0, 0xFFFF /* Valeurs extremes */ ); @@ -688,7 +705,7 @@ static PARAM_CFG_INT DrawSegmLargeurCfg static PARAM_CFG_INT EdgeSegmLargeurCfg ( wxT( "EdgeLar" ), /* Keyword */ - & g_DesignSettings.m_EdgeSegmentWidth, /* Parameter address */ + &g_DesignSettings.m_EdgeSegmentWidth, /* Parameter address */ 120, /* Default value */ 0, 0xFFFF /* Valeurs extremes */ ); @@ -696,7 +713,7 @@ static PARAM_CFG_INT EdgeSegmLargeurCfg static PARAM_CFG_INT TexteSegmLargeurCfg ( wxT( "TxtLar" ), /* Keyword */ - & g_DesignSettings.m_PcbTextWidth, /* Parameter address */ + &g_DesignSettings.m_PcbTextWidth, /* Parameter address */ 120, /* Default value */ 0, 0xFFFF /* Valeurs extremes */ ); @@ -704,7 +721,7 @@ static PARAM_CFG_INT TexteSegmLargeurCfg static PARAM_CFG_INT ModuleSegmWidthCfg ( wxT( "MSegLar" ), /* Keyword */ - & ModuleSegmentWidth, /* Parameter address */ + &ModuleSegmentWidth, /* Parameter address */ 120, /* Default value */ 0, 0xFFFF /* Valeurs extremes */ ); @@ -712,7 +729,7 @@ static PARAM_CFG_INT ModuleSegmWidthCfg static PARAM_CFG_INT FormatPlotCfg ( wxT( "ForPlot" ), /* Keyword */ - & format_plot, /* Parameter address */ + &format_plot, /* Parameter address */ 1, /* Default value */ 0, 3 /* Valeurs extremes */ ); @@ -720,7 +737,7 @@ static PARAM_CFG_INT FormatPlotCfg static PARAM_CFG_INT WTraitSerigraphiePlotCfg ( wxT( "WpenSer" ), /* Keyword */ - & g_PlotLine_Width, /* Parameter address */ + &g_PlotLine_Width, /* Parameter address */ 10, /* Default value */ 1, 10000 /* Valeurs extremes */ ); @@ -728,7 +745,7 @@ static PARAM_CFG_INT WTraitSerigraphiePlotCfg static PARAM_CFG_DOUBLE UserGrilleXCfg ( wxT( "UserGrX" ), /* Keyword */ - & g_UserGrid.x, /* Parameter address */ + &g_UserGrid.x, /* Parameter address */ 0.01, /* Default value */ 0.0001, 100.0 /* Valeurs extremes (inches)*/ ); @@ -736,7 +753,7 @@ static PARAM_CFG_DOUBLE UserGrilleXCfg static PARAM_CFG_DOUBLE UserGrilleYCfg ( wxT( "UserGrY" ), /* Keyword */ - & g_UserGrid.y, /* Parameter address */ + &g_UserGrid.y, /* Parameter address */ 0.01, /* Default value */ 0.0001, 100.0 /* Valeurs extremes (inches)*/ ); @@ -744,7 +761,7 @@ static PARAM_CFG_DOUBLE UserGrilleYCfg static PARAM_CFG_INT UserGrilleUnitCfg ( wxT( "UserGrU" ), /* Keyword */ - & g_UserGrid_Unit, /* Parameter address */ + &g_UserGrid_Unit, /* Parameter address */ 1, /* Default value */ 0, 1 /* Valeurs extremes */ ); @@ -752,7 +769,7 @@ static PARAM_CFG_INT UserGrilleUnitCfg static PARAM_CFG_INT DivGrillePcbCfg ( wxT( "DivGrPc" ), /* Keyword */ - & Pcbdiv_grille, /* Parameter address */ + &Pcbdiv_grille, /* Parameter address */ 1, /* Default value */ 1, 10 /* Valeurs extremes */ ); @@ -760,7 +777,7 @@ static PARAM_CFG_INT DivGrillePcbCfg static PARAM_CFG_INT TimeOutCfg //Duree entre Sauvegardes auto en secondes ( wxT( "TimeOut" ), /* Keyword */ - & g_TimeOut, /* Parameter address */ + &g_TimeOut, /* Parameter address */ 600, /* Default value */ 0, 60000 /* Valeurs extremes */ ); @@ -769,7 +786,7 @@ static PARAM_CFG_BOOL DisplPolairCfg ( INSETUP, wxT( "DPolair" ), /* Keyword */ - & DisplayOpt.DisplayPolarCood, /* Parameter address */ + &DisplayOpt.DisplayPolarCood, /* Parameter address */ FALSE /* Default value */ ); @@ -777,7 +794,7 @@ static PARAM_CFG_INT CursorShapeCfg ( INSETUP, wxT( "CuShape" ), /* Keyword */ - & g_CursorShape, /* Parameter address */ + &g_CursorShape, /* Parameter address */ 0, /* Default value */ 0, 1 /* Valeurs extremes */ ); @@ -785,7 +802,7 @@ static PARAM_CFG_INT CursorShapeCfg static PARAM_CFG_INT PrmMaxLinksShowed ( wxT( "MaxLnkS" ), /* Keyword */ - & g_MaxLinksShowed, /* Parameter address */ + &g_MaxLinksShowed, /* Parameter address */ 3, /* Default value */ 0, 15 /* Valeurs extremes */ ); @@ -793,14 +810,14 @@ static PARAM_CFG_INT PrmMaxLinksShowed static PARAM_CFG_BOOL ShowRatsnestCfg ( wxT( "ShowRat" ), /* Keyword */ - & g_Show_Ratsnest, /* Parameter address */ + &g_Show_Ratsnest, /* Parameter address */ FALSE /* Default value */ ); static PARAM_CFG_BOOL ShowModuleRatsnestCfg ( wxT( "ShowMRa" ), /* Keyword */ - & g_Show_Module_Ratsnest, /* Parameter address */ + &g_Show_Module_Ratsnest, /* Parameter address */ TRUE /* Default value */ ); @@ -808,7 +825,7 @@ static PARAM_CFG_BOOL TwoSegmentTrackBuildCfg ( INSETUP, wxT( "TwoSegT" ), /* Keyword */ - & g_TwoSegmentTrackBuild, /* Parameter address */ + &g_TwoSegmentTrackBuild, /* Parameter address */ TRUE /* Default value */ ); @@ -823,6 +840,8 @@ PARAM_CFG_BASE* ParamCfgList[] = &PadMasqueLayerCfg, &ViaDiametreCfg, &ViaDrillCfg, + &MicroViaDiametreCfg, + &MicroViaDrillCfg, &ViaShowHoleCfg, &TrackClearenceCfg, &LayerCountCfg, @@ -886,9 +905,9 @@ PARAM_CFG_BASE* ParamCfgList[] = &ColorAncreModCfg, &ColorPadCuCfg, &ColorPadCmpCfg, - &ColorViaNormCfg, - &ColorViaborgneCfg, - &ColorViaEnterreeCfg, + &ColorViaThroughCfg, + &ColorViaBlindBuriedCfg, + &ColorViaMicroViaCfg, &ColorpcbGrilleCfg, &ColorCheveluCfg, &HPGLpenNumCfg, diff --git a/pcbnew/pcbnew.h b/pcbnew/pcbnew.h index e811151417..4a397db8e1 100644 --- a/pcbnew/pcbnew.h +++ b/pcbnew/pcbnew.h @@ -109,7 +109,7 @@ eda_global bool Drc_On #endif ; eda_global bool g_AutoDeleteOldTrack /* Allows automatic deletion of the old track after -creation of a new track */ + * creation of a new track */ #ifdef MAIN = TRUE #endif @@ -157,9 +157,9 @@ bool inline IsModuleLayerVisible( int layer ) { eda_global bool Track_45_Only; /* Flag pour limiter l'inclinaison * pistes a 45 degres seulement */ -eda_global bool Segments_45_Only;/* Flag pour limiter l'inclinaison +eda_global bool Segments_45_Only; /* Flag pour limiter l'inclinaison * edge pcb a 45 degres seulement */ -eda_global wxString PcbExtBuffer // Board file extension +eda_global wxString PcbExtBuffer // Board file extension #ifdef MAIN ( wxT( ".brd" ) ) #endif @@ -169,13 +169,13 @@ eda_global wxString g_SaveFileName // File Name for periodic saving ( wxT( "$savepcb" ) ) #endif ; -eda_global wxString NetNameBuffer; // Netlist file extension +eda_global wxString NetNameBuffer; // Netlist file extension eda_global wxString NetExtBuffer #ifdef MAIN ( wxT( ".net" ) ) #endif ; -eda_global wxString NetCmpExtBuffer // cmp/footprint association file extension +eda_global wxString NetCmpExtBuffer // cmp/footprint association file extension #ifdef MAIN ( wxT( ".cmp" ) ) #endif @@ -187,7 +187,7 @@ eda_global wxString LibExtBuffer ( wxT( ".mod" ) ) #endif ; -eda_global wxString g_Shapes3DExtBuffer //3D shape file extension +eda_global wxString g_Shapes3DExtBuffer //3D shape file extension #ifdef MAIN ( wxT( ".wrl" ) ) #endif @@ -237,7 +237,7 @@ eda_global class EDA_BoardDesignSettings g_DesignSettings; // Default values for pad editions #ifndef GERBVIEW #ifdef MAIN -D_PAD g_Pad_Master( (MODULE*) NULL ); +D_PAD g_Pad_Master( (MODULE*) NULL ); #else extern D_PAD g_Pad_Master; @@ -285,10 +285,10 @@ eda_global int g_TrackSegmentCount; // New created segment count eda_global wxString g_ViaType_Name[4] #if defined MAIN = { - wxT( "???" ), // Unused - _( "Blind Via" ), // from inner layer to external layer (TOP or BOTTOM) - _( "Buried Via" ), // from inner to inner layer - _( "Standard Via" ) // Usual via (from TOP to BOTTOM layer) + _( "??? Via" ), // Not used yet + _( "Micro Via" ), // from external layer (TOP or BOTTOM) from the near neightbour inner layer only + _( "Blind/Buried Via" ), // from inner or external to inner or external layer (no restriction) + _( "Through Via" ) // Usual via (from TOP to BOTTOM layer only ) } diff --git a/pcbnew/plotps.cpp b/pcbnew/plotps.cpp index 6338c36945..4d4863cbc2 100644 --- a/pcbnew/plotps.cpp +++ b/pcbnew/plotps.cpp @@ -464,12 +464,8 @@ static void PrintDrillMark( BOARD* Pcb ) if( g_DrillShapeOpt == DRILL_MARK ) diam.x = diam.y = SMALL_DRILL; else - { - if( pts->m_Drill < 0 ) - diam.x = diam.y = g_DesignSettings.m_ViaDrill; - else - diam.x = diam.y = pts->m_Drill; - } + diam.x = diam.y = pts->GetDrillValue(); + trace_1_pastille_RONDE_POST( pos, diam.x, FILLED ); } diff --git a/pcbnew/router.cpp b/pcbnew/router.cpp index 696d30d329..f370026b49 100644 --- a/pcbnew/router.cpp +++ b/pcbnew/router.cpp @@ -606,7 +606,7 @@ void WinEDA_PcbFrame::ReadAutoroutedTracks( wxDC* DC ) if( NewVia->GetLayer() == 0x0F || NewVia->GetLayer() == 0xF0 ) NewVia->m_Shape = VIA_THROUGH; else - NewVia->m_Shape = VIA_BURIED; + NewVia->m_Shape = VIA_BLIND_BURIED; NewVia->Insert( m_Pcb, NULL ); NbTrack++; diff --git a/pcbnew/set_color.h b/pcbnew/set_color.h index ffdceb901f..2801eaacca 100644 --- a/pcbnew/set_color.h +++ b/pcbnew/set_color.h @@ -336,19 +336,19 @@ static ColorButton VIA_THROUGH_Butt = TRUE // Toggle ITEM_NOT_SHOW bit of the color variable }; -static ColorButton Via_Aveugle_Butt = +static ColorButton VIA_BLIND_BURIED_Butt = { wxT( "*" ), - VIA_BLIND, // Layer - &g_DesignSettings.m_ViaColor[VIA_BLIND], // Address of optional parameter + VIA_BLIND_BURIED, // Layer + &g_DesignSettings.m_ViaColor[VIA_BLIND_BURIED], // Address of optional parameter TRUE // Toggle ITEM_NOT_SHOW bit of the color variable }; -static ColorButton BLIND_VIA_Butt = +static ColorButton MICRO_VIA_Butt = { wxT( "*" ), - VIA_BURIED, // Layer - &g_DesignSettings.m_ViaColor[VIA_BURIED], // Address of optional parameter + VIA_MICROVIA, // Layer + &g_DesignSettings.m_ViaColor[VIA_MICROVIA], // Address of optional parameter TRUE // Toggle ITEM_NOT_SHOW bit of the color variable }; @@ -491,8 +491,8 @@ static ColorButton* laytool_list[] = { // &Layer_32_Butt, &VIA_THROUGH_Butt, - &Via_Aveugle_Butt, - &BLIND_VIA_Butt, + &VIA_BLIND_BURIED_Butt, + &MICRO_VIA_Butt, &Ratsnest_Butt, &Pad_Cu_Butt, &Pad_Cmp_Butt, diff --git a/pcbnew/via_edit.cpp b/pcbnew/via_edit.cpp index 8fd943e6fd..d879f0672a 100644 --- a/pcbnew/via_edit.cpp +++ b/pcbnew/via_edit.cpp @@ -1,6 +1,6 @@ - /**********************************************/ - /* vi_edit.cpp: som editing function for vias */ - /**********************************************/ +/**********************************************/ +/* vi_edit.cpp: som editing function for vias */ +/**********************************************/ #include "fctsys.h" #include "gr_basic.h" @@ -12,93 +12,102 @@ /**********************************************************************************/ -void WinEDA_PcbFrame::Via_Edit_Control(wxDC * DC, int command_type, SEGVIA * via) +void WinEDA_PcbFrame::Via_Edit_Control( wxDC* DC, int command_type, SEGVIA* via ) /**********************************************************************************/ -/* - Execute edit commands relative to vias -*/ -{ -int ii; -TRACK * via_struct ; - - switch ( command_type ) - { - case ID_POPUP_PCB_SELECT_VIASIZE1: - case ID_POPUP_PCB_SELECT_VIASIZE2: - case ID_POPUP_PCB_SELECT_VIASIZE3: - case ID_POPUP_PCB_SELECT_VIASIZE4: - case ID_POPUP_PCB_SELECT_VIASIZE5: - case ID_POPUP_PCB_SELECT_VIASIZE6: - case ID_POPUP_PCB_SELECT_VIASIZE7: - case ID_POPUP_PCB_SELECT_VIASIZE8: // selec the new current value for via size (via diameter) - DrawPanel->MouseToCursorSchema(); - ii = command_type - ID_POPUP_PCB_SELECT_VIASIZE1; - g_DesignSettings.m_CurrentViaSize = g_DesignSettings.m_ViaSizeHistory[ii]; - DisplayTrackSettings(); - break; - - case ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE: // Enter a new alternate value for drill via - InstallPcbOptionsFrame(wxDefaultPosition, DC, ID_PCB_TRACK_SIZE_SETUP); - DrawPanel->MouseToCursorSchema(); - case ID_POPUP_PCB_VIA_HOLE_TO_VALUE: // Set the drill via to custom - if ( (g_ViaHoleLastValue > 0) && (g_ViaHoleLastValue < via->m_Width) ) - { - via->Draw(DrawPanel, DC, GR_XOR); - via->m_Drill = g_ViaHoleLastValue; - via->Draw(DrawPanel, DC, GR_OR); - GetScreen()->SetModify(); - } - else DisplayError(this, _("Incorrect value for Via drill. No via drill change")); - break; - - - case ID_POPUP_PCB_VIA_HOLE_EXPORT: // Export the current drill value as the new custom value - if ( via->m_Drill > 0 ) g_ViaHoleLastValue = via->m_Drill; - break; - - case ID_POPUP_PCB_VIA_HOLE_EXPORT_TO_OTHERS:// Export the current drill value to via which héave the same size - if ( via->m_Drill > 0 ) g_ViaHoleLastValue = via->m_Drill; - via_struct = m_Pcb->m_Track ; - for ( ; via_struct != NULL; via_struct = (TRACK*) via_struct->Pnext ) - { - if( via_struct->Type() == TYPEVIA ) /* mise a jour du diametre de la via */ - { - if ( via_struct->m_Width != via->m_Width ) continue; - via_struct->Draw(DrawPanel, DC, GR_XOR); - via_struct->m_Drill = via->m_Drill; - via_struct->Draw(DrawPanel, DC, GR_OR); - } - } - GetScreen()->SetModify(); - break; - case ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT: - via->Draw(DrawPanel, DC, GR_XOR); - via->m_Drill = -1; - via->Draw(DrawPanel, DC, GR_OR); - GetScreen()->SetModify(); - break; - - case ID_POPUP_PCB_VIA_HOLE_RESET_TO_DEFAULT: // Reset all via hole to default value - via_struct = m_Pcb->m_Track ; - for ( ; via_struct != NULL; via_struct = (TRACK*) via_struct->Pnext ) - { - if( via_struct->Type() == TYPEVIA ) /* mise a jour du diametre de la via */ - { - if( via_struct->m_Drill != -1 ) - { - via_struct->Draw(DrawPanel, DC, GR_XOR); - via_struct->m_Drill = -1; - via_struct->Draw(DrawPanel, DC, GR_OR); - } - } - } - GetScreen()->SetModify(); - break; - - default: - DisplayError( this, wxT("WinEDA_PcbFrame::Via_Edition() error: unknown command")); - break; - } - DrawPanel->MouseToCursorSchema(); +/* + * Execute edit commands relative to vias + */ +{ + int ii; + TRACK* via_struct; + + switch( command_type ) + { + case ID_POPUP_PCB_SELECT_VIASIZE1: + case ID_POPUP_PCB_SELECT_VIASIZE2: + case ID_POPUP_PCB_SELECT_VIASIZE3: + case ID_POPUP_PCB_SELECT_VIASIZE4: + case ID_POPUP_PCB_SELECT_VIASIZE5: + case ID_POPUP_PCB_SELECT_VIASIZE6: + case ID_POPUP_PCB_SELECT_VIASIZE7: + case ID_POPUP_PCB_SELECT_VIASIZE8: // selec the new current value for via size (via diameter) + DrawPanel->MouseToCursorSchema(); + ii = command_type - ID_POPUP_PCB_SELECT_VIASIZE1; + g_DesignSettings.m_CurrentViaSize = g_DesignSettings.m_ViaSizeHistory[ii]; + DisplayTrackSettings(); + break; + + case ID_POPUP_PCB_VIA_HOLE_ENTER_VALUE: // Enter a new alternate value for drill via + InstallPcbOptionsFrame( wxDefaultPosition, DC, ID_PCB_TRACK_SIZE_SETUP ); + DrawPanel->MouseToCursorSchema(); + + case ID_POPUP_PCB_VIA_HOLE_TO_VALUE: // Set the drill via to custom + if( (g_ViaHoleLastValue > 0) && (g_ViaHoleLastValue < via->m_Width) ) + { + via->Draw( DrawPanel, DC, GR_XOR ); + via->SetDrillValue( g_ViaHoleLastValue ); + via->Draw( DrawPanel, DC, GR_OR ); + GetScreen()->SetModify(); + } + else + DisplayError( this, _( "Incorrect value for Via drill. No via drill change" ) ); + break; + + + case ID_POPUP_PCB_VIA_HOLE_EXPORT: // Export the current drill value as the new custom value + if( via->GetDrillValue() > 0 ) + g_ViaHoleLastValue = via->GetDrillValue(); + break; + + case ID_POPUP_PCB_VIA_HOLE_EXPORT_TO_OTHERS: // Export the current drill value to via which héave the same size + if( via->GetDrillValue() > 0 ) + g_ViaHoleLastValue = via->GetDrillValue(); + via_struct = m_Pcb->m_Track; + for( ; via_struct != NULL; via_struct = (TRACK*) via_struct->Pnext ) + { + if( via_struct->Type() == TYPEVIA ) /* mise a jour du diametre de la via */ + { + if( via_struct->m_Width != via->m_Width ) + continue; + via_struct->Draw( DrawPanel, DC, GR_XOR ); + via_struct->SetDrillValue( via->GetDrillValue() ); + via_struct->Draw( DrawPanel, DC, GR_OR ); + } + } + + GetScreen()->SetModify(); + break; + + case ID_POPUP_PCB_VIA_HOLE_TO_DEFAULT: + via->Draw( DrawPanel, DC, GR_XOR ); + via->SetDrillDefault(); + via->Draw( DrawPanel, DC, GR_OR ); + GetScreen()->SetModify(); + break; + + case ID_POPUP_PCB_VIA_HOLE_RESET_TO_DEFAULT: // Reset all via hole to default value + via_struct = m_Pcb->m_Track; + for( ; via_struct != NULL; via_struct = (TRACK*) via_struct->Pnext ) + { + if( via_struct->Type() == TYPEVIA ) /* mise a jour du diametre de la via */ + { + if( via_struct->IsDrillDefault() ) + { + via_struct->Draw( DrawPanel, DC, GR_XOR ); + via_struct->SetDrillDefault(); + via_struct->Draw( DrawPanel, DC, GR_OR ); + } + } + } + + GetScreen()->SetModify(); + break; + + default: + DisplayError( this, wxT( "WinEDA_PcbFrame::Via_Edition() error: unknown command" ) ); + break; + } + + DrawPanel->MouseToCursorSchema(); }