From f723c540d0228eeaa6e6a9296d9d98902f563917 Mon Sep 17 00:00:00 2001 From: charras Date: Wed, 29 Oct 2008 15:26:53 +0000 Subject: [PATCH] code cleaning. Some comments translated into English. Added: Zones unfill in polygon mode --- common/trigo.cpp | 28 ++--- eeschema/cleanup.cpp | 7 +- eeschema/locate.cpp | 4 +- eeschema/symbdraw.cpp | 10 +- gerbview/locate.cpp | 2 +- include/id.h | 4 +- include/macros.h | 2 +- internat/fr/kicad.mo | Bin 164118 -> 164232 bytes internat/fr/kicad.po | 116 +++++++++--------- pcbnew/class_module.cpp | 3 +- pcbnew/class_module.h | 65 +++++----- pcbnew/class_pad.h | 4 +- pcbnew/class_zone.cpp | 14 +++ pcbnew/class_zone.h | 11 +- pcbnew/connect.cpp | 36 +++--- pcbnew/cotation.cpp | 6 +- pcbnew/edit.cpp | 16 ++- pcbnew/graphpcb.cpp | 12 +- pcbnew/onrightclick.cpp | 10 +- pcbnew/plothpgl.cpp | 10 +- pcbnew/ratsnest.cpp | 10 +- ...ones_polygons_insulated_copper_islands.cpp | 22 +++- polygon/PolyLine.cpp | 4 +- 23 files changed, 221 insertions(+), 175 deletions(-) diff --git a/common/trigo.cpp b/common/trigo.cpp index 12251eeb07..f02519b913 100644 --- a/common/trigo.cpp +++ b/common/trigo.cpp @@ -133,7 +133,7 @@ bool DistanceTest( int seuil, int dx, int dy, int spot_cX, int spot_cY ) * de piste soit horizontal dans le nouveau repere */ int angle; - angle = (int) ( atan2( (float) segY, (float) segX ) * 1800 / M_PI); + angle = (int) ( atan2( (double) segY, (double) segX ) * 1800 / M_PI); cXrot = pointX; cYrot = pointY; RotatePoint( &cXrot, &cYrot, angle ); /* Rotation du point a tester */ @@ -224,7 +224,7 @@ void RotatePoint( int* pX, int* pY, int angle ) * pour une rotation de centre 0, 0, et d'angle angle ( en 1/10 degre) */ { - float fpx, fpy; + double fpx, fpy; int tmp; while( angle < 0 ) @@ -262,7 +262,7 @@ void RotatePoint( int* pX, int* pY, int angle ) fpx = (*pY * fsinus[angle]) + (*pX * fcosinus[angle]); fpy = (*pY * fcosinus[angle]) - (*pX * fsinus[angle]); - *pX = (int) round( fpx ); + *pX = (int) round( fpx ); *pY = (int) round( fpy ); } } @@ -280,9 +280,9 @@ void RotatePoint( int* pX, int* pY, int cx, int cy, int angle ) { int ox, oy; - ox = *pX - cx; + ox = *pX - cx; oy = *pY - cy; - + RotatePoint( &ox, &oy, angle ); *pX = ox + cx; @@ -302,9 +302,9 @@ void RotatePoint( wxPoint* point, int angle ) { int ox, oy; - ox = point->x; + ox = point->x; oy = point->y; - + RotatePoint( &ox, &oy, angle ); point->x = ox; point->y = oy; @@ -323,9 +323,9 @@ void RotatePoint( wxPoint* point, const wxPoint& centre, int angle ) { int ox, oy; - ox = point->x - centre.x; + ox = point->x - centre.x; oy = point->y - centre.y; - + RotatePoint( &ox, &oy, angle ); point->x = ox + centre.x; point->y = oy + centre.y; @@ -339,11 +339,11 @@ void RotatePoint( double* pX, double* pY, double cx, double cy, int angle ) { double ox, oy; - ox = *pX - cx; + ox = *pX - cx; oy = *pY - cy; - + RotatePoint( &ox, &oy, angle ); - + *pX = ox + cx; *pY = oy + cy; } @@ -390,8 +390,8 @@ void RotatePoint( double* pX, double* pY, int angle ) { double fpx = (*pY * fsinus[angle]) + (*pX * fcosinus[angle]); double fpy = (*pY * fcosinus[angle]) - (*pX * fsinus[angle]); - - *pX = fpx; + + *pX = fpx; *pY = fpy; } } diff --git a/eeschema/cleanup.cpp b/eeschema/cleanup.cpp index c329cb4c26..da4ed9665c 100644 --- a/eeschema/cleanup.cpp +++ b/eeschema/cleanup.cpp @@ -256,9 +256,10 @@ static int TstAlignSegment( EDA_DrawLineStruct* RefSegm, } else { - if( atan2( RefSegm->m_Start.x - RefSegm->m_End.x, RefSegm->m_Start.y - - RefSegm->m_End.y ) == - atan2( TstSegm->m_Start.x - TstSegm->m_End.x, TstSegm->m_Start.y - TstSegm->m_End.y ) ) + if( atan2( (double)(RefSegm->m_Start.x - RefSegm->m_End.x), + (double)(RefSegm->m_Start.y - RefSegm->m_End.y) ) == + atan2( (double)(TstSegm->m_Start.x - TstSegm->m_End.x), + (double)(TstSegm->m_Start.y - TstSegm->m_End.y) ) ) { RefSegm->m_End = TstSegm->m_End; return 1; diff --git a/eeschema/locate.cpp b/eeschema/locate.cpp index db6c4ce1fd..15dcc2a121 100644 --- a/eeschema/locate.cpp +++ b/eeschema/locate.cpp @@ -834,7 +834,7 @@ LibEDA_BaseStruct* LocateDrawItem( SCH_SCREEN* Screen, break; dx = px - Arc->m_Pos.x; dy = py + Arc->m_Pos.y; - ii = (int) sqrt( dx * dx + dy * dy ); + ii = (int) sqrt( ((double)dx * dx) + ((double)dy * dy) ); if( abs( ii - Arc->m_Rayon ) <= seuil ) return DrawItem; } @@ -1015,7 +1015,7 @@ int distance( int dx, int dy, int spot_cX, int spot_cY, int seuil ) * de piste soit horizontal dans le nouveau repere */ int angle; - angle = (int) ( atan2( (float) segY, (float) segX ) * 1800 / M_PI); + angle = (int) ( atan2( (double) segY, (double) segX ) * 1800 / M_PI); cXrot = pointX; cYrot = pointY; RotatePoint( &cXrot, &cYrot, angle ); /* Rotation du point a tester */ RotatePoint( &segX, &segY, angle ); /* Rotation du segment */ diff --git a/eeschema/symbdraw.cpp b/eeschema/symbdraw.cpp index c8efdb5aeb..6a9cb86b25 100644 --- a/eeschema/symbdraw.cpp +++ b/eeschema/symbdraw.cpp @@ -575,7 +575,7 @@ static void SymbolDisplayDraw( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) case COMPONENT_CIRCLE_DRAW_TYPE: dx = ( (LibDrawCircle*) CurrentDrawItem )->m_Pos.x - mx; dy = ( (LibDrawCircle*) CurrentDrawItem )->m_Pos.y + my; - ( (LibDrawCircle*) CurrentDrawItem )->m_Rayon = (int) sqrt( (dx * dx) + (dy * dy) ); + ( (LibDrawCircle*) CurrentDrawItem )->m_Rayon = (int) sqrt( ((double)dx * dx) + ((double)dy * dy) ); ( (LibDrawCircle*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; break; @@ -745,7 +745,7 @@ static void ComputeArc( LibDrawArc* DrawItem, wxPoint ArcCentre ) /* calcul de cX et cY pour que l'arc passe par ArcStartX,Y et ArcEndX,Y */ dx = ArcEndX - ArcStartX; dy = ArcEndY - ArcStartY; cX -= ArcStartX; cY -= ArcStartY; - angle = (int) (atan2( dy, dx ) * 1800 / M_PI); + angle = (int) (atan2( (double)dy, (double)dx ) * 1800 / M_PI); RotatePoint( &dx, &dy, angle ); /* Le segment dx, dy est horizontal */ /* -> dx = longueur, dy = 0 */ RotatePoint( &cX, &cY, angle ); @@ -759,14 +759,14 @@ static void ComputeArc( LibDrawArc* DrawItem, wxPoint ArcCentre ) dx = ArcStartX - DrawItem->m_Pos.x; dy = ArcStartY - DrawItem->m_Pos.y; - DrawItem->m_Rayon = (int) sqrt( (dx * dx) + (dy * dy) ); + DrawItem->m_Rayon = (int) sqrt( ((double)dx * dx) + ((double)dy * dy) ); - DrawItem->t1 = (int) (atan2( dy, dx ) * 1800 / M_PI); + DrawItem->t1 = (int) (atan2( (double)dy, (double)dx ) * 1800 / M_PI); dx = ArcEndX - DrawItem->m_Pos.x; dy = ArcEndY - DrawItem->m_Pos.y; - DrawItem->t2 = (int) (atan2( dy, dx ) * 1800 / M_PI); + DrawItem->t2 = (int) (atan2( (double)dy, (double)dx ) * 1800 / M_PI); DrawItem->m_ArcStart.x = ArcStartX; DrawItem->m_ArcStart.y = ArcStartY; diff --git a/gerbview/locate.cpp b/gerbview/locate.cpp index 903099600f..488f4adbb7 100644 --- a/gerbview/locate.cpp +++ b/gerbview/locate.cpp @@ -436,7 +436,7 @@ int distance( int seuil ) * de piste soit horizontal dans le nouveau repere */ int angle; - angle = (int) ( atan2( (float) segY, (float) segX ) * 1800 / M_PI); + angle = (int) ( atan2( (double) segY, (double) segX ) * 1800 / M_PI); cXrot = pointX; cYrot = pointY; RotatePoint( &cXrot, &cYrot, angle ); /* Rotation du point a tester */ RotatePoint( &segX, &segY, angle ); /* Rotation du segment */ diff --git a/include/id.h b/include/id.h index 1d35abd55b..cfc269fcd5 100644 --- a/include/id.h +++ b/include/id.h @@ -570,8 +570,8 @@ enum main_id { ID_POPUP_PCB_PLACE_ZONE_OUTLINES, ID_POPUP_PCB_DRAG_ZONE_OUTLINE_SEGMENT, ID_POPUP_PCB_PLACE_DRAGGED_ZONE_OUTLINE_SEGMENT, - ID_POPUP_PCB_REMOVE_FILLED_AREAS, - ID_POPUP_ZONE_UNUSED4, + ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES, + ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_CURRENT_ZONE, ID_POPUP_PCB_DELETE_MARKER, ID_POPUP_PCB_DELETE_COTATION, diff --git a/include/macros.h b/include/macros.h index 6147060442..06888ae796 100644 --- a/include/macros.h +++ b/include/macros.h @@ -49,7 +49,7 @@ /* exchange 2 items */ -#define EXCHG( a, b ) { typeof(a)__temp__ = (a); (a) = (b); (b) = __temp__; } +#define EXCHG( a, b ) { typeof(a) __temp__ = (a); (a) = (b); (b) = __temp__; } /* inline functions to insert menuitems with a icon: */ static inline void ADD_MENUITEM( wxMenu* menu, int id, diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index fe2b43742a8eacfd468852079775e052c6dd4572..4a234b2e63c0b136e8053870563aad18b52f90fe 100644 GIT binary patch delta 46891 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
  • Q&xJ@FbE;G1ZMcA!hK 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 delta 46777 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\n" "MIME-Version: 1.0\n" @@ -347,7 +347,7 @@ msgstr "dimension" #: pcbnew/class_marker.cpp:133 #: pcbnew/class_text_mod.cpp:503 #: pcbnew/class_track.cpp:853 -#: pcbnew/class_zone.cpp:775 +#: pcbnew/class_zone.cpp:789 msgid "Type" msgstr "Type" @@ -370,7 +370,7 @@ msgstr "Segment" #: pcbnew/class_pcb_text.cpp:190 #: pcbnew/class_text_mod.cpp:516 #: pcbnew/class_track.cpp:910 -#: pcbnew/class_zone.cpp:809 +#: pcbnew/class_zone.cpp:823 msgid "Layer" msgstr "Couche" @@ -571,12 +571,12 @@ msgid "Display" msgstr "Affichage" #: pcbnew/class_track.cpp:869 -#: pcbnew/class_zone.cpp:797 +#: pcbnew/class_zone.cpp:811 msgid "NetName" msgstr "NetName" #: pcbnew/class_track.cpp:874 -#: pcbnew/class_zone.cpp:805 +#: pcbnew/class_zone.cpp:819 msgid "NetCode" msgstr "NetCode" @@ -588,27 +588,27 @@ msgstr "Standard" msgid "Diam" msgstr "Diam" -#: pcbnew/class_zone.cpp:800 +#: pcbnew/class_zone.cpp:814 msgid "Non Copper Zone" msgstr "Zone non Cuivre" -#: pcbnew/class_zone.cpp:813 +#: pcbnew/class_zone.cpp:827 msgid "Corners" msgstr "Sommets" -#: pcbnew/class_zone.cpp:819 +#: pcbnew/class_zone.cpp:833 msgid "No Grid" msgstr "Pas de Grille" -#: pcbnew/class_zone.cpp:820 +#: pcbnew/class_zone.cpp:834 msgid "Fill Grid" msgstr "Grille de Remplissage" -#: pcbnew/class_zone.cpp:825 +#: pcbnew/class_zone.cpp:839 msgid "Hatch lines" msgstr "Lignes de Hachure" -#: pcbnew/class_zone.cpp:831 +#: pcbnew/class_zone.cpp:845 msgid "Corners in DrawList" msgstr "Sommets en Liste de dessin" @@ -1822,8 +1822,8 @@ msgid "Fill or Refill All Zones" msgstr "Remplir ou Re-remplir Toutes les Zones" #: pcbnew/onrightclick.cpp:345 -msgid "Remove filled areas" -msgstr "Suppimer zones remplies" +msgid "Remove Filled Areas in All Zones" +msgstr "Supprimer le Remplissage de toutes les Zones" #: pcbnew/onrightclick.cpp:350 #: pcbnew/onrightclick.cpp:359 @@ -2113,94 +2113,98 @@ msgstr "Addition d'une Zone Interdite" msgid "Fill Zone" msgstr "Remplir Zone" -#: pcbnew/onrightclick.cpp:678 +#: pcbnew/onrightclick.cpp:680 +msgid "Remove Filled Areas in Zone" +msgstr "Supprimer le Remplissage de la Zone" + +#: pcbnew/onrightclick.cpp:684 msgid "Move Zone" msgstr "Déplace Zone" -#: pcbnew/onrightclick.cpp:681 +#: pcbnew/onrightclick.cpp:687 msgid "Edit Zone Params" msgstr "Editer Paramètres de la Zone" -#: pcbnew/onrightclick.cpp:686 +#: pcbnew/onrightclick.cpp:692 msgid "Delete Cutout" msgstr "Supprimer Zone Interdite" -#: pcbnew/onrightclick.cpp:689 +#: pcbnew/onrightclick.cpp:695 msgid "Delete Zone Outline" msgstr "Supprimer Contour de Zone" -#: pcbnew/onrightclick.cpp:711 -#: pcbnew/onrightclick.cpp:756 -#: pcbnew/onrightclick.cpp:794 -#: pcbnew/onrightclick.cpp:860 +#: pcbnew/onrightclick.cpp:717 +#: pcbnew/onrightclick.cpp:762 +#: pcbnew/onrightclick.cpp:800 +#: pcbnew/onrightclick.cpp:866 msgid "Move" msgstr "Move" -#: pcbnew/onrightclick.cpp:714 -#: pcbnew/onrightclick.cpp:796 +#: pcbnew/onrightclick.cpp:720 +#: pcbnew/onrightclick.cpp:802 msgid "Drag" msgstr "Drag" -#: pcbnew/onrightclick.cpp:718 +#: pcbnew/onrightclick.cpp:724 msgid "Rotate +" msgstr "Rotation +" -#: pcbnew/onrightclick.cpp:722 +#: pcbnew/onrightclick.cpp:728 msgid "Rotate -" msgstr "Rotation -" -#: pcbnew/onrightclick.cpp:723 +#: pcbnew/onrightclick.cpp:729 msgid "Flip" msgstr "Change côté" -#: pcbnew/onrightclick.cpp:727 -#: pcbnew/onrightclick.cpp:761 -#: pcbnew/onrightclick.cpp:865 +#: pcbnew/onrightclick.cpp:733 +#: pcbnew/onrightclick.cpp:767 +#: pcbnew/onrightclick.cpp:871 msgid "Edit" msgstr "Editer" -#: pcbnew/onrightclick.cpp:733 +#: pcbnew/onrightclick.cpp:739 msgid "Delete Module" msgstr "Supprimer Module" -#: pcbnew/onrightclick.cpp:759 -#: pcbnew/onrightclick.cpp:863 +#: pcbnew/onrightclick.cpp:765 +#: pcbnew/onrightclick.cpp:869 msgid "Rotate" msgstr "Rotation" -#: pcbnew/onrightclick.cpp:798 +#: pcbnew/onrightclick.cpp:804 msgid "Edit Pad" msgstr "Edit Pad" -#: pcbnew/onrightclick.cpp:802 +#: pcbnew/onrightclick.cpp:808 msgid "New Pad Settings" msgstr "Nouvelles Caract. Pads" -#: pcbnew/onrightclick.cpp:803 +#: pcbnew/onrightclick.cpp:809 msgid "Copy current pad settings to this pad" msgstr "Copier les réglages courants pour ce pad" -#: pcbnew/onrightclick.cpp:806 +#: pcbnew/onrightclick.cpp:812 msgid "Export Pad Settings" msgstr "Exporte Caract. Pads" -#: pcbnew/onrightclick.cpp:807 +#: pcbnew/onrightclick.cpp:813 msgid "Copy this pad settings to current pad settings" msgstr "Copier les caractéristiques de ce pad vers les caractéristiques courantes" -#: pcbnew/onrightclick.cpp:813 +#: pcbnew/onrightclick.cpp:819 msgid "Global Pad Settings" msgstr "Edition Globale des pads" -#: pcbnew/onrightclick.cpp:815 +#: pcbnew/onrightclick.cpp:821 msgid "Copy this pad settings to all pads in this footprint (or similar footprints)" msgstr "Copier les caractéristiques de ce pad vers tous les autres pads de ce module( ou modules similaires)" -#: pcbnew/onrightclick.cpp:827 +#: pcbnew/onrightclick.cpp:833 msgid "Autoroute Pad" msgstr "Autoroute Pad" -#: pcbnew/onrightclick.cpp:828 +#: pcbnew/onrightclick.cpp:834 msgid "Autoroute Net" msgstr "Autoroute Net" @@ -2436,56 +2440,56 @@ msgstr "Erreur système sur écriture fichier \"%s\"" msgid "Error writing to STRINGFORMATTER" msgstr "Error writing to STRINGFORMATTER" -#: pcbnew/edit.cpp:180 +#: pcbnew/edit.cpp:181 #: pcbnew/editmod.cpp:45 msgid "Module Editor" msgstr "Ouvrir Editeur de modules" -#: pcbnew/edit.cpp:260 +#: pcbnew/edit.cpp:261 msgid "Add Tracks" msgstr "Addition de Pistes" -#: pcbnew/edit.cpp:269 +#: pcbnew/edit.cpp:270 msgid "Add Zones" msgstr "Addition de Zones" -#: pcbnew/edit.cpp:271 +#: pcbnew/edit.cpp:272 msgid "Warning: Display Zone is OFF!!!" msgstr "Attention: Affichage zones désactivé !!!" -#: pcbnew/edit.cpp:277 +#: pcbnew/edit.cpp:278 msgid "Add Layer Alignment Target" msgstr "Ajouter Mire de superposition" -#: pcbnew/edit.cpp:281 +#: pcbnew/edit.cpp:282 msgid "Adjust Zero" msgstr "Ajuster Zéro" -#: pcbnew/edit.cpp:287 +#: pcbnew/edit.cpp:288 msgid "Add Graphic" msgstr "Addition éléments graphiques" -#: pcbnew/edit.cpp:291 +#: pcbnew/edit.cpp:292 msgid "Add Text" msgstr "Ajout de Texte" -#: pcbnew/edit.cpp:295 +#: pcbnew/edit.cpp:296 msgid "Add Modules" msgstr "Addition de Modules" -#: pcbnew/edit.cpp:299 +#: pcbnew/edit.cpp:300 msgid "Add Dimension" msgstr "Ajout de cotes" -#: pcbnew/edit.cpp:307 +#: pcbnew/edit.cpp:308 msgid "Net Highlight" msgstr "Surbrillance des équipotentielles" -#: pcbnew/edit.cpp:311 +#: pcbnew/edit.cpp:312 msgid "Local Ratsnest" msgstr "Montrer le chevelu général" -#: pcbnew/edit.cpp:569 +#: pcbnew/edit.cpp:579 msgid "Delete item" msgstr "Suppression d'éléments" @@ -9869,7 +9873,7 @@ msgstr "Hollandais" msgid "Language" msgstr "Langage" -#: 3d-viewer/3d_aux.cpp:207 +#: 3d-viewer/3d_aux.cpp:206 msgid "Vertex " msgstr "Vertex " diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp index 523aa64a72..3d40d7c477 100644 --- a/pcbnew/class_module.cpp +++ b/pcbnew/class_module.cpp @@ -1060,7 +1060,8 @@ void MODULE::Display_Infos( WinEDA_DrawFrame* frame ) pos += 6; if( flag ) // Affichage date de modification (utile en Module Editor) { - strcpy( Line, ctime( &m_LastEdit_Time ) ); + time_t edit_time = m_LastEdit_Time; + strcpy( Line, ctime( &edit_time ) ); strtok( Line, " \n\r" ); strcpy( bufcar, strtok( NULL, " \n\r" ) ); strcat( bufcar, " " ); strcat( bufcar, strtok( NULL, " \n\r" ) ); strcat( bufcar, ", " ); diff --git a/pcbnew/class_module.h b/pcbnew/class_module.h index ff43d8ed87..b3aaea8d08 100644 --- a/pcbnew/class_module.h +++ b/pcbnew/class_module.h @@ -20,13 +20,13 @@ class Struct3D_Master; /* Flags :*/ -enum Mod_Attribut /* Attributs d'un module */ +enum Mod_Attribut /* Attributs used for modules */ { MOD_DEFAULT = 0, /* Type default */ - MOD_CMS = 1, /* Pour module apparaissant dans les - * fichiers de placement automatique (principalement modules CMS */ - MOD_VIRTUAL = 2 /* Module virtuel constitue par un dessin sur circuit - * (connecteur, trou de percage..) */ + MOD_CMS = 1, /* Set for modules listed in the automatic insertion list + * (usually SMD footprints) */ + MOD_VIRTUAL = 2 /* Virtuel component: when created by copper shapes on board + * (Like edge card connectors, mounting hole...) */ }; @@ -41,34 +41,33 @@ public: wxPoint m_Pos; // Real coord on board D_PAD* m_Pads; /* Pad list (linked list) */ BOARD_ITEM* m_Drawings; /* Graphic items list (linked list) */ - Struct3D_Master* m_3D_Drawings; /* Pointeur sur la liste des elements de trace 3D*/ - TEXTE_MODULE* m_Reference; // texte reference du composant (U34, R18..) - TEXTE_MODULE* m_Value; // texte valeur du composant (74LS00, 22K..) - wxString m_LibRef; /* nom du module en librairie */ + Struct3D_Master* m_3D_Drawings; /* First item of the 3D shapes (linked list)*/ + TEXTE_MODULE* m_Reference; // Component reference (U34, R18..) + TEXTE_MODULE* m_Value; // Component value (74LS00, 22K..) + wxString m_LibRef; /* Name of the module in library (and the default value when loading amodule from the library) */ wxString m_AlternateReference; /* Used when m_Reference cannot be used to * identify the footprint ( after a full reannotation of the schematic */ - int m_Attributs; /* Flags bits a bit ( voir enum Mod_Attribut ) */ - int m_Orient; /* orientation en 1/10 degres */ + int m_Attributs; /* Flags(ORed bits) ( see Mod_Attribut ) */ + int m_Orient; /* orientation in 0.1 degrees */ int flag; /* flag utilise en trace rastnest et routage auto */ int m_ModuleStatus; /* For autoplace: flags (LOCKED, AUTOPLACED) */ - EDA_Rect m_BoundaryBox; /* position/taille du cadre de reperage (coord locales)*/ - EDA_Rect m_RealBoundaryBox; /* position/taille du module (coord relles) */ - int m_PadNum; // Nombre total de pads - int m_AltPadNum; // en placement auto Nombre de pads actifs pour - // les calculs + EDA_Rect m_BoundaryBox; /* Bounding box coordinates relatives to the anchor, orient 0*/ + EDA_Rect m_RealBoundaryBox; /* Bounding box : coordinates on board, real orientation */ + int m_PadNum; // Pad count + int m_AltPadNum; // Pad with netcode > 0 (active pads)count - int m_CntRot90; // Placement auto: cout ( 0..10 ) de la rotation 90 degre - int m_CntRot180; // Placement auto: cout ( 0..10 ) de la rotation 180 degre - wxSize m_Ext; // marges de "garde": utilise en placement auto. - float m_Surface; // surface du rectangle d'encadrement + int m_CntRot90; // Automatic placement : cost ( 0..10 ) for 90 degrees rotaion (Horiz<->Vertical) + int m_CntRot180; // Automatic placement : cost ( 0..10 ) for 180 degrees rotaion (UP <->Down) + wxSize m_Ext; // Automatic placement margin around the module + float m_Surface; // Bounding box area - unsigned long m_Link; // variable temporaire ( pour editions, ...) + unsigned long m_Link; // Temporary variable ( used in editions, ...) long m_LastEdit_Time; // Date de la derniere modification du module (gestion de librairies) wxString m_Path; - wxString m_Doc; // Texte de description du module - wxString m_KeyWord; // Liste des mots cles relatifs au module + wxString m_Doc; // Module Description (info for users) + wxString m_KeyWord; // Keywords to select the module in lib public: MODULE( BOARD* parent ); @@ -79,11 +78,17 @@ public: MODULE* Next() { return (MODULE*) Pnext; } - void Set_Rectangle_Encadrement(); /* mise a jour du rect d'encadrement - * en coord locales (orient 0 et origine = pos module) */ + /** Function Set_Rectangle_Encadrement() + * Calculates the bounding box + * for orient 0 et origin = module anchor) + */ + void Set_Rectangle_Encadrement(); - void SetRectangleExinscrit(); /* mise a jour du rect d'encadrement - * et de la surface en coord reelles */ + /** function SetRectangleExinscrit() + * Calculates the real bounding box accordint to theboard position, and real orientaion + * and also calculates the area value (used in automatic placement) + */ + void SetRectangleExinscrit(); /** * Function GetBoundingBox * returns the bounding box of this Footprint @@ -103,11 +108,11 @@ public: } - // deplacements + // Moves void SetPosition( const wxPoint& newpos ); void SetOrientation( int newangle ); - /* supprime du chainage la structure Struct */ + /* Remove this from the linked list */ void UnLink(); @@ -151,7 +156,7 @@ public: /** * Function Read_GPCB_Descr - * Read a footprint description in GPCB format + * Read a footprint description in GPCB format (newlib version) * @param CmpFullFileName = Full file name (there is one footprint per file. * this is also the footprint name * @return bool - true if success reading else false. diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index fc96a75160..82d18c37e6 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -61,10 +61,10 @@ public: int m_Orient; // in 1/10 degrees int m_logical_connexion; // variable used in rastnest computations - // handle block number in ratsnet connection + // handle subnet (block) number in ratsnet connection int m_physical_connexion; // variable used in rastnest computations - // handle block number in track connection + // handle physical subnet (block)number in track connection protected: int m_ZoneSubnet; // variable used in rastnest computations // handle block number in zone connection diff --git a/pcbnew/class_zone.cpp b/pcbnew/class_zone.cpp index 472a7156d9..7d559114b8 100644 --- a/pcbnew/class_zone.cpp +++ b/pcbnew/class_zone.cpp @@ -38,6 +38,20 @@ ZONE_CONTAINER::~ZONE_CONTAINER() } +/** virtual function GetPosition +* @return a wxPoint, position of the first point of the outline +*/ +wxPoint& ZONE_CONTAINER::GetPosition() +{ + static wxPoint pos; + if ( m_Poly ) + { + pos = GetCornerPosition(0); + } + else pos = wxPoint(0,0); + return pos; +} + /*******************************************/ void ZONE_CONTAINER::SetNet( int anet_code ) /*******************************************/ diff --git a/pcbnew/class_zone.h b/pcbnew/class_zone.h index d38ef3d432..dc789d7ec3 100644 --- a/pcbnew/class_zone.h +++ b/pcbnew/class_zone.h @@ -53,13 +53,10 @@ public: bool Save( FILE* aFile ) const; int ReadDescr( FILE* aFile, int* aLineNum = NULL ); - wxPoint& GetPosition() - { - static wxPoint pos; - - return pos; - } - + /** virtual function GetPosition + * @return a wxPoint, position of the first point of the outline + */ + wxPoint& GetPosition(); void UnLink( void ) { diff --git a/pcbnew/connect.cpp b/pcbnew/connect.cpp index 3e92e2f1e8..4fa9041c51 100644 --- a/pcbnew/connect.cpp +++ b/pcbnew/connect.cpp @@ -267,9 +267,9 @@ void WinEDA_BasePcbFrame::test_connexions( wxDC* DC ) /***************************************************/ /** Function testing the connections relative to all nets - * This function update le status du chevelu ( flag CH_ACTIF = 0 if a connection is found, = 1 else) + * This function update the status of the ratsnest ( flag CH_ACTIF = 0 if a connection is found, = 1 else) * track segments are assumed to be sorted by net codes. - * This is the case because when a new track is added, it is put in the linked link according to its net code. + * This is the case because when a new track is added, it is inserted in the linked list according to its net code. * and when nets are changed (when a new netlist is read) tracks are sorted before using this function * @param DC = current Device Context */ @@ -443,18 +443,18 @@ static void calcule_connexite_1_net( TRACK* pt_start_conn, TRACK* pt_end_conn ) #define POS_AFF_CHREF 62 /******************************************************************************/ -static D_PAD* SuperFast_Locate_Pad_Connecte( BOARD* pcb, LISTE_PAD* pt_liste, - int px, int py, int masque_layer ) +static D_PAD* SuperFast_Locate_Pad_Connecte( BOARD* aPcb, LISTE_PAD* pt_liste, + const wxPoint & posref, int masque_layer ) /******************************************************************************/ /** Function SuperFast_Locate_Pad_Connecte * Locate the pad connected to a track ended at coord px, py * A track is seen as connected if the px, py position is same as the pad position - * @param px = reference X coordinate - * @param py = reference Y coordinate - * @param masque_layer = Layers (bit to bit) to consider + * @param aPcb = the board. * @param pt_liste = Pointers to pads buffer * This buffer is a list like the list created by build_liste_pad, but sorted by increasing X pad coordinate + * @param posref = reference coordinate + * @param masque_layer = Layers (bit to bit) to consider * @return : pointer on the connected pad * This function uses a fast search in this sorted pad list and it is faster than Fast_Locate_Pad_connecte(), * But this sorted pad list must be built before calling this function. @@ -464,10 +464,10 @@ static D_PAD* SuperFast_Locate_Pad_Connecte( BOARD* pcb, LISTE_PAD* pt_liste, { D_PAD* pad; LISTE_PAD* ptr_pad, * lim; - int nb_pad = pcb->m_NbPads; + int nb_pad = aPcb->m_NbPads; int ii; - lim = pt_liste + (pcb->m_NbPads - 1 ); + lim = pt_liste + (aPcb->m_NbPads - 1 ); ptr_pad = pt_liste; while( nb_pad ) { @@ -478,14 +478,14 @@ static D_PAD* SuperFast_Locate_Pad_Connecte( BOARD* pcb, LISTE_PAD* pt_liste, if( (ii & 1) && ( ii > 1 ) ) nb_pad++; - if( pad->m_Pos.x < px ) /* Must search after this item */ + if( pad->m_Pos.x < posref.x ) /* Must search after this item */ { ptr_pad += nb_pad; if( ptr_pad > lim ) ptr_pad = lim; continue; } - if( pad->m_Pos.x > px ) /* Must search before this item */ + if( pad->m_Pos.x > posref.x ) /* Must search before this item */ { ptr_pad -= nb_pad; if( ptr_pad < pt_liste ) @@ -493,13 +493,13 @@ static D_PAD* SuperFast_Locate_Pad_Connecte( BOARD* pcb, LISTE_PAD* pt_liste, continue; } - if( pad->m_Pos.x == px ) /* A suitable block is found (X coordinate matches the px reference: but wue must matches the Y coordinate */ + if( pad->m_Pos.x == posref.x ) /* A suitable block is found (X coordinate matches the px reference: but wue must matches the Y coordinate */ { /* Search the beginning of the block */ while( ptr_pad >= pt_liste ) { pad = *ptr_pad; - if( pad->m_Pos.x == px ) + if( pad->m_Pos.x == posref.x ) ptr_pad--; else break; @@ -513,10 +513,10 @@ static D_PAD* SuperFast_Locate_Pad_Connecte( BOARD* pcb, LISTE_PAD* pt_liste, return NULL; /* outside suitable block */ pad = *ptr_pad; - if( pad->m_Pos.x != px ) + if( pad->m_Pos.x != posref.x ) return NULL; /* outside suitable block */ - if( pad->m_Pos.y != py ) + if( pad->m_Pos.y != posref.y ) continue; /* A Pad if found here: but it must mach the layer */ @@ -615,8 +615,7 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche ) /* Search for a pad on the segment starting point */ pt_piste->start = SuperFast_Locate_Pad_Connecte( m_Pcb, &sortedPads[0], - pt_piste->m_Start.x, - pt_piste->m_Start.y, + pt_piste->m_Start, masque_layer ); if( pt_piste->start != NULL ) { @@ -627,8 +626,7 @@ void WinEDA_BasePcbFrame::reattribution_reference_piste( int affiche ) /* Search for a pad on the segment ending point */ pt_piste->end = SuperFast_Locate_Pad_Connecte( m_Pcb, &sortedPads[0], - pt_piste->m_End.x, - pt_piste->m_End.y, + pt_piste->m_End, masque_layer ); if( pt_piste->end != NULL ) diff --git a/pcbnew/cotation.cpp b/pcbnew/cotation.cpp index effebc7db6..83ce8ceab5 100644 --- a/pcbnew/cotation.cpp +++ b/pcbnew/cotation.cpp @@ -330,7 +330,7 @@ static void Montre_Position_New_Cotation( WinEDA_DrawPanel* panel, wxDC* DC, boo /* Calcul de la direction de deplacement * ( perpendiculaire a l'axe de la cote ) */ - angle = atan2( deltay, deltax ) + (M_PI / 2); + angle = atan2( (double)deltay, (double)deltax ) + (M_PI / 2); deltax = pos.x - Cotation->TraitD_ox; deltay = pos.y - Cotation->TraitD_oy; @@ -405,10 +405,10 @@ static void Ajuste_Details_Cotation( COTATION* Cotation ) deltay = Cotation->TraitD_oy - Cotation->TraitG_oy; /* Calcul de la cote */ - mesure = (int) (hypot( (float) deltax, (float) deltay ) + 0.5 ); + mesure = (int) (hypot( (double) deltax, (double) deltay ) + 0.5 ); if( deltax || deltay ) - angle = atan2( (float) deltay, (float) deltax ); + angle = atan2( (double) deltay, (double) deltax ); else angle = 0.0; diff --git a/pcbnew/edit.cpp b/pcbnew/edit.cpp index e77bdeb586..86c714c83e 100644 --- a/pcbnew/edit.cpp +++ b/pcbnew/edit.cpp @@ -68,7 +68,8 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_PCB_STOP_CURRENT_EDGE_ZONE: case ID_POPUP_PCB_DELETE_ZONE_LAST_CREATED_CORNER: case ID_POPUP_PCB_FILL_ALL_ZONES: - case ID_POPUP_PCB_REMOVE_FILLED_AREAS: + case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES: + case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_CURRENT_ZONE: case ID_POPUP_PCB_PLACE_ZONE_CORNER: case ID_POPUP_PCB_PLACE_ZONE_OUTLINES: case ID_POPUP_PCB_EDIT_ZONE_PARAMS: @@ -543,8 +544,17 @@ void WinEDA_PcbFrame::Process_Special_Functions( wxCommandEvent& event ) DrawPanel->MouseToCursorSchema(); Fill_All_Zones( &dc ); break; - - case ID_POPUP_PCB_REMOVE_FILLED_AREAS: // Remove all zones : + + case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_CURRENT_ZONE: + if ( ( GetCurItem())->Type() == TYPEZONE_CONTAINER) + { + ((ZONE_CONTAINER* )GetCurItem())->m_FilledPolysList.clear(); + GetScreen()->SetModify(); + DrawPanel->Refresh(); + } + break; + + case ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES: // Remove all zones : if( m_Pcb->m_Zone ) { m_Pcb->m_Zone->DeleteStructList(); diff --git a/pcbnew/graphpcb.cpp b/pcbnew/graphpcb.cpp index dda6ffaaab..368c633d78 100644 --- a/pcbnew/graphpcb.cpp +++ b/pcbnew/graphpcb.cpp @@ -283,7 +283,7 @@ void TraceSegmentPcb( BOARD* Pcb, TRACK* pt_segm, int color, int marge, int op_l mask_layer = 1 << Route_Layer_TOP; else mask_layer = -1; } - + if( color == VIA_IMPOSSIBLE ) mask_layer = -1; @@ -464,7 +464,7 @@ void TraceFilledRectangle( BOARD* Pcb, /*****************************************************************/ /* Fonction Surchargee. - * + * * Met a la valeur color l'ensemble des cellules du board inscrites dans * le rectangle de coord ux0,uy0 ( angle haut a gauche ) * a ux1,uy1 ( angle bas a droite ) @@ -545,7 +545,7 @@ void TraceFilledRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int uy1, int a /***********************************************************************************/ /* Fonction Surchargee. - * + * * Met a la valeur color l'ensemble des cellules du board inscrites dans * le rectangle de coord ux0,uy0 ( angle haut a droite ) * a ux1,uy1 ( angle bas a gauche ) @@ -595,8 +595,8 @@ void TraceFilledRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int uy1, int a ux1 -= Pcb->m_BoundaryBox.m_Pos.x; uy1 -= Pcb->m_BoundaryBox.m_Pos.y; cx = (ux0 + ux1) / 2; cy = (uy0 + uy1) / 2; - rayon = (int) sqrt( (float) (cx - ux0) * (cx - ux0) - + (float) (cy - uy0) * (cy - uy0) ); + rayon = (int) sqrt( (double) (cx - ux0) * (cx - ux0) + + (double) (cy - uy0) * (cy - uy0) ); /* Calcul des coord limites des cellules appartenant au rectangle */ row_max = (cy + rayon) / g_GridRoutingSize; @@ -719,7 +719,7 @@ void DrawSegmentQcq( int ux0, int uy0, int ux1, int uy1, int lg, int layer, dx = ux1 - ux0; dy = uy1 - uy0; if( dx ) - angle = (int) (atan2( dy, dx ) * 1800 / M_PI); + angle = (int) (atan2( (double)dy, (double)dx ) * 1800 / M_PI); else { angle = 900; if( dy < 0 ) diff --git a/pcbnew/onrightclick.cpp b/pcbnew/onrightclick.cpp index 47b7bd2c71..32bb152dab 100644 --- a/pcbnew/onrightclick.cpp +++ b/pcbnew/onrightclick.cpp @@ -341,8 +341,8 @@ bool WinEDA_PcbFrame::OnRightClick( const wxPoint& aMousePos, wxMenu* aPopMenu ) aPopMenu->AppendSeparator(); ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_FILL_ALL_ZONES, _( "Fill or Refill All Zones" ), fill_zone_xpm ); - ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_REMOVE_FILLED_AREAS, - _( "Remove filled areas" ), fill_zone_xpm ); + ADD_MENUITEM( aPopMenu, ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_ALL_ZONES, + _( "Remove Filled Areas in All Zones" ), fill_zone_xpm ); aPopMenu->AppendSeparator(); } @@ -674,6 +674,12 @@ void WinEDA_PcbFrame::createPopUpMenuForZones( ZONE_CONTAINER* edge_zone, wxMenu ADD_MENUITEM( zones_menu, ID_POPUP_PCB_FILL_ZONE, _( "Fill Zone" ), fill_zone_xpm ); + if (edge_zone->m_FilledPolysList.size() > 0 ) + { + ADD_MENUITEM( zones_menu, ID_POPUP_PCB_REMOVE_FILLED_AREAS_IN_CURRENT_ZONE, + _( "Remove Filled Areas in Zone" ), fill_zone_xpm ); + } + ADD_MENUITEM( zones_menu, ID_POPUP_PCB_MOVE_ZONE_OUTLINES, _( "Move Zone" ), move_xpm ); diff --git a/pcbnew/plothpgl.cpp b/pcbnew/plothpgl.cpp index a0df102736..f5d1f0d8c3 100644 --- a/pcbnew/plothpgl.cpp +++ b/pcbnew/plothpgl.cpp @@ -693,13 +693,13 @@ void trace_1_pad_TRAPEZE_HPGL( wxPoint padpos, wxSize size, wxSize delta, /* Calcul du demi angle d'inclinaison des cotes du trapeze */ if( delta.y ) /* Trapeze horizontal */ { - fangle = atan2( (float) (polygone[1].y - polygone[0].y), - (float) (polygone[1].x - polygone[0].x) ) / 2; + fangle = atan2( (double) (polygone[1].y - polygone[0].y), + (double) (polygone[1].x - polygone[0].x) ) / 2; } else { - fangle = atan2( (float) (polygone[3].y - polygone[0].y), - (float) (polygone[3].x - polygone[0].x) ) / 2; + fangle = atan2( (double) (polygone[3].y - polygone[0].y), + (double) (polygone[3].x - polygone[0].x) ) / 2; } /* Trace du contour */ @@ -871,7 +871,7 @@ void trace_1_segment_HPGL( int pos_X0, int pos_Y0, int pos_X1, int pos_Y1, } else { - alpha = atan2( (float) size.y, (float) size.x ); + alpha = atan2( (double) size.y, (double) size.x ); sin_alpha = sin( alpha ); cos_alpha = cos( alpha ); } diff --git a/pcbnew/ratsnest.cpp b/pcbnew/ratsnest.cpp index e6bf18db50..40801ceb57 100644 --- a/pcbnew/ratsnest.cpp +++ b/pcbnew/ratsnest.cpp @@ -28,7 +28,7 @@ static bool DisplayRastnestInProgress; // Enable the display of the ratsnes * Building the general ratsnest: * I used the "lee algoritm". * This is a 2 steps algoritm. - * the m_logical_connexion member of pads handle a "block number" or a "cluster number" + * the m_logical_connexion member of pads handle a "block number" or a "cluster number" or a "subnet number" * initially, m_logical_connexion = 0 (pad not connected). * Build_Board_Ratsnest( wxDC* DC ) Create this rastnest * for each net: @@ -39,7 +39,7 @@ static bool DisplayRastnestInProgress; // Enable the display of the ratsnes * link these 2 pads (i.e. create a ratsnest item) * the pads are grouped in a logical block ( a cluster). * until no pad without link found. - * Each logical block has a number called block number, + * Each logical block has a number called block number or "subnet number", * stored in m_logical_connexion member for each pad of the block. * The first block has its block number = 1, the second is 2 ... * the function to do thas is gen_rats_pad_to_pad() @@ -1155,8 +1155,8 @@ char* WinEDA_BasePcbFrame::build_ratsnest_module( wxDC* DC, MODULE* Module ) tri_par_net ); /* Compute the internal ratsnet: - * this is the same as general ratsnest, but considers onluy tje currant footprint pads - * it is therefore not time consumming, and it is made onlu once + * this is the same as general ratsnest, but considers only the current footprint pads + * it is therefore not time consuming, and it is made only once */ local_liste_chevelu = (CHEVELU*) pt_liste_pad; // buffer chevelu a la suite de la liste des pads nb_local_chevelu = 0; @@ -1282,7 +1282,7 @@ calcul_chevelu_ext: local_chevelu++; } - /* return the newt free memory buffer address, in the general buffer */ + /* return the new free memory buffer address, in the general buffer */ adr_max = MAX( adr_max, (char*) (local_chevelu + 1) ); return (char*) (local_chevelu + 1); /* the struct pointed by local_chevelu is used diff --git a/pcbnew/zones_polygons_insulated_copper_islands.cpp b/pcbnew/zones_polygons_insulated_copper_islands.cpp index 80fd03fdda..bbb1ad25c6 100644 --- a/pcbnew/zones_polygons_insulated_copper_islands.cpp +++ b/pcbnew/zones_polygons_insulated_copper_islands.cpp @@ -28,10 +28,10 @@ using namespace std; #include "zones.h" -static void CalculateSubAreaBoundaryBox( EDA_Rect& aBbox, +static void CalculateSubAreaBoundaryBox( EDA_Rect& aBbox, std::vector aPolysList, - int aIndexStart, - int aIndexEnd ); + int aIndexStart, + int aIndexEnd ); /* Local variables */ std::vector s_ListPoints; // list of coordinates of pads and vias on this layer and on this net. @@ -116,10 +116,20 @@ void ZONE_CONTAINER::Test_For_Copper_Island_And_Remove_Insulated_Islands( BOARD* } -void CalculateSubAreaBoundaryBox( EDA_Rect& aBbox, +/******************************************************************/ +void CalculateSubAreaBoundaryBox( EDA_Rect& aBbox, std::vector aPolysList, - int aIndexStart, - int aIndexEnd ) + int aIndexStart, + int aIndexEnd ) +/******************************************************************/ + +/** function CalculateSubAreaBoundaryBox + * Calculates the bounding box of a polygon stored in a vector + * @param aBbox = EDA_Rect to init as bounding box + * @param aPolysList = set of CPolyPt that are the corners of one or more polygons + * @param aIndexStart = index of the first corner of a polygon in aPolysList + * @param aIndexEnd = index of the last corner of a polygon in aPolysList + */ { CPolyPt start_point, end_point; diff --git a/polygon/PolyLine.cpp b/polygon/PolyLine.cpp index ef0fc5ff35..1c4045cfbd 100644 --- a/polygon/PolyLine.cpp +++ b/polygon/PolyLine.cpp @@ -1535,8 +1535,8 @@ void CPolyLine::AppendArc( int xi, int yi, int xf, int yf, int xc, int yc, int n double r = sqrt( (double) (xi - xc) * (xi - xc) + (double) (yi - yc) * (yi - yc) ); // get angles of start and finish - double th_i = atan2( (double) yi - yc, (double) xi - xc ); - double th_f = atan2( (double) yf - yc, (double) xf - xc ); + double th_i = atan2( (double) (yi - yc), (double) (xi - xc) ); + double th_f = atan2( (double) (yf - yc), (double) (xf - xc) ); double th_d = (th_f - th_i) / (num - 1); double theta = th_i;