summaryrefslogtreecommitdiff
path: root/gerbview/class_gerber_draw_item.h
diff options
context:
space:
mode:
Diffstat (limited to 'gerbview/class_gerber_draw_item.h')
-rw-r--r--gerbview/class_gerber_draw_item.h309
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 */