diff options
Diffstat (limited to 'gerbview/class_gerber_draw_item.h')
-rw-r--r-- | gerbview/class_gerber_draw_item.h | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/gerbview/class_gerber_draw_item.h b/gerbview/class_gerber_draw_item.h new file mode 100644 index 0000000..49e3340 --- /dev/null +++ b/gerbview/class_gerber_draw_item.h @@ -0,0 +1,309 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2010 <Jean-Pierre Charras> + * Copyright (C) 1992-2010 KiCad Developers, see change_log.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file class_gerber_draw_item.h + */ + +#ifndef CLASS_GERBER_DRAW_ITEM_H +#define CLASS_GERBER_DRAW_ITEM_H + +#include <base_struct.h> +#include <dlist.h> +#include <layers_id_colors_and_visibility.h> +#include <gr_basic.h> + +class GERBER_IMAGE; +class GBR_LAYOUT; +class D_CODE; +class MSG_PANEL_ITEM; + + +/* Shapes id for basic shapes ( .m_Shape member ) */ +enum Gbr_Basic_Shapes { + GBR_SEGMENT = 0, // usual segment : line with rounded ends + GBR_ARC, // Arcs (with rounded ends) + GBR_CIRCLE, // ring + GBR_POLYGON, // polygonal shape + GBR_SPOT_CIRCLE, // flashed shape: round shape (can have hole) + GBR_SPOT_RECT, // flashed shape: rectangular shape can have hole) + GBR_SPOT_OVAL, // flashed shape: oval shape + GBR_SPOT_POLY, // flashed shape: regular polygon, 3 to 12 edges + GBR_SPOT_MACRO, // complex shape described by a macro + GBR_LAST // last value for this list +}; + +/***/ + +class GERBER_DRAW_ITEM : public EDA_ITEM +{ + // make SetNext() and SetBack() private so that they may not be called from anywhere. + // list management is done on GERBER_DRAW_ITEMs using DLIST<GERBER_DRAW_ITEM> only. +private: + void SetNext( EDA_ITEM* aNext ) { Pnext = aNext; } + void SetBack( EDA_ITEM* aBack ) { Pback = aBack; } + + +public: + bool m_UnitsMetric; /* store here the gerber units (inch/mm). Used + * only to calculate aperture macros shapes sizes */ + int m_Shape; // Shape and type of this gerber item + wxPoint m_Start; // Line or arc start point or position of the shape + // for flashed items + wxPoint m_End; // Line or arc end point + wxPoint m_ArcCentre; // for arcs only: Centre of arc + std::vector <wxPoint> m_PolyCorners; // list of corners for polygons (G36 to G37 coordinates) + // or for complex shapes which are converted to polygon + wxSize m_Size; // Flashed shapes: size of the shape + // Lines : m_Size.x = m_Size.y = line width + bool m_Flashed; // True for flashed items + int m_DCode; // DCode used to draw this item. + // 0 for items that do not use DCodes (polygons) + // or when unknown and normal values are 10 to 999 + // values 0 to 9 can be used for special purposes + GERBER_IMAGE* m_imageParams; /* main GERBER info for this item + * Note: some params stored in this class are common + * to the whole gerber file (i.e) the whole graphic + * layer and some can change when reaging the file, + * so they are stored inside this item there is no + * redundancy for these parameters + */ +private: + int m_Layer; + + // These values are used to draw this item, according to gerber layers parameters + // Because they can change inside a gerber image, they are stored here + // for each item + bool m_LayerNegative; // true = item in negative Layer + bool m_swapAxis; // false if A = X, B = Y; true if A =Y, B = Y + bool m_mirrorA; // true: mirror / axe A + bool m_mirrorB; // true: mirror / axe B + wxRealPoint m_drawScale; // A and B scaling factor + wxPoint m_layerOffset; // Offset for A and B axis, from OF parameter + double m_lyrRotation; // Fine rotation, from OR parameter, in degrees + +public: + GERBER_DRAW_ITEM( GBR_LAYOUT* aParent, GERBER_IMAGE* aGerberparams ); + GERBER_DRAW_ITEM( const GERBER_DRAW_ITEM& aSource ); + ~GERBER_DRAW_ITEM(); + + /** + * Function Copy + * will copy this object + * the corresponding type. + * @return - GERBER_DRAW_ITEM* + */ + GERBER_DRAW_ITEM* Copy() const; + + GERBER_DRAW_ITEM* Next() const { return static_cast<GERBER_DRAW_ITEM*>( Pnext ); } + GERBER_DRAW_ITEM* Back() const { return static_cast<GERBER_DRAW_ITEM*>( Pback ); } + + /** + * Function GetLayer + * returns the layer this item is on. + */ + int GetLayer() const { return m_Layer; } + + /** + * Function SetLayer + * sets the layer this item is on. + * @param aLayer The layer number. + * is virtual because some items (in fact: class DIMENSION) + * have a slightly different initialization + */ + void SetLayer( int aLayer ) { m_Layer = aLayer; } + + bool GetLayerPolarity() + { + return m_LayerNegative; + } + + /** + * Function HasNegativeItems + * @return true if this item or at least one shape (when using aperture macros + * must be drawn in background color + * used to optimize screen refresh (when no items are in background color + * refresh can be faster) + */ + bool HasNegativeItems(); + + /** + * Function SetLayerParameters + * Initialize parameters from Image and Layer parameters + * found in the gerber file: + * m_UnitsMetric, + * m_MirrorA, m_MirrorB, + * m_DrawScale, m_DrawOffset + */ + void SetLayerParameters(); + + void SetLayerPolarity( bool aNegative) + { + m_LayerNegative = aNegative; + } + + /** + * Function MoveAB + * move this object. + * @param aMoveVector - the move vector for this object. + */ + void MoveAB( const wxPoint& aMoveVector ); + + /** + * Function MoveXY + * move this object. + * @param aMoveVector - the move vector for this object, in XY gerber axis. + */ + void MoveXY( const wxPoint& aMoveVector ); + + /** + * Function GetPosition + * returns the position of this object. + * @return const wxPoint& - The position of this object. + * This function exists mainly to satisfy the virtual GetPosition() in parent class + */ + const wxPoint& GetPosition() const { return m_Start; } + void SetPosition( const wxPoint& aPos ) { m_Start = aPos; } + + /** + * Function GetABPosition + * returns the image position of aPosition for this object. + * Image position is the value of aPosition, modified by image parameters: + * offsets, axis selection, scale, rotation + * @param aXYPosition = position in X,Y gerber axis + * @return const wxPoint - The given position in plotter A,B axis. + */ + wxPoint GetABPosition( const wxPoint& aXYPosition ) const; + + /** + * Function GetXYPosition + * returns the image position of aPosition for this object. + * Image position is the value of aPosition, modified by image parameters: + * offsets, axis selection, scale, rotation + * @param aABPosition = position in A,B plotter axis + * @return const wxPoint - The given position in X,Y axis. + */ + wxPoint GetXYPosition( const wxPoint& aABPosition ) const; + + /** + * Function GetDcodeDescr + * returns the GetDcodeDescr of this object, or NULL. + * @return D_CODE* - a pointer to the DCode description (for flashed items). + */ + D_CODE* GetDcodeDescr(); + + const EDA_RECT GetBoundingBox() const; // Virtual + + /* Display on screen: */ + void Draw( EDA_DRAW_PANEL* aPanel, + wxDC* aDC, + GR_DRAWMODE aDrawMode, + const wxPoint&aOffset ); + + /** + * Function ConvertSegmentToPolygon + * convert a line to an equivalent polygon. + * Useful when a line is plotted using a rectangular pen. + * In this case, the usual segment plot function cannot be used + */ + void ConvertSegmentToPolygon(); + + /** + * Function DrawGbrPoly + * a helper function used to draw the polygon stored in m_PolyCorners + */ + void DrawGbrPoly( EDA_RECT* aClipBox, + wxDC* aDC, EDA_COLOR_T aColor, + const wxPoint& aOffset, bool aFilledShape ); + + /* divers */ + int Shape() const { return m_Shape; } + + void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ); + + wxString ShowGBRShape(); + + /** + * Function HitTest + * tests if the given wxPoint is within the bounds of this object. + * @param aRefPos a wxPoint to test + * @return bool - true if a hit, else false + */ + bool HitTest( const wxPoint& aRefPos ) const; + + /** + * Function HitTest (overloaded) + * tests if the given wxRect intersect this object. + * For now, an ending point must be inside this rect. + * @param aRefArea a wxPoint to test + * @return bool - true if a hit, else false + */ + bool HitTest( const EDA_RECT& aRefArea ) const; + + /** + * Function GetClass + * returns the class name. + * @return wxString + */ + wxString GetClass() const + { + return wxT( "GERBER_DRAW_ITEM" ); + } + + /** + * Function Save. + * currently: no nothing, but must be defined to meet requirements + * of the basic class + */ + bool Save( FILE* aFile ) const; + + /** + * Function UnLink + * detaches this object from its owner. + */ + void UnLink() + { + DLIST<GERBER_DRAW_ITEM>* list = (DLIST<GERBER_DRAW_ITEM>*) GetList(); + wxASSERT( list ); + + if( list ) + list->Remove( this ); + } + + /** + * Function DeleteStructure + * deletes this object after UnLink()ing it from its owner. + */ + void DeleteStructure() + { + UnLink(); + delete this; + } +#if defined(DEBUG) + void Show( int nestLevel, std::ostream& os ) const; // override +#endif + +}; + +#endif /* CLASS_GERBER_DRAW_ITEM_H */ |