2007-06-05 12:10:51 +00:00
|
|
|
/*********************************************************************/
|
2008-03-15 04:18:32 +00:00
|
|
|
/* base_struct.h : Basic classes for most kicad item descriptions */
|
2007-06-05 12:10:51 +00:00
|
|
|
/*********************************************************************/
|
|
|
|
|
|
|
|
#ifndef BASE_STRUCT_H
|
|
|
|
#define BASE_STRUCT_H
|
|
|
|
|
2008-12-16 19:44:57 +00:00
|
|
|
#include "colors.h"
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2009-11-23 20:18:47 +00:00
|
|
|
#if defined(DEBUG)
|
2007-08-06 02:02:39 +00:00
|
|
|
#include <iostream> // needed for Show()
|
2009-11-23 20:18:47 +00:00
|
|
|
extern std::ostream& operator <<( std::ostream& out, const wxSize& size );
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2009-11-23 20:18:47 +00:00
|
|
|
extern std::ostream& operator <<( std::ostream& out, const wxPoint& pt );
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-08-06 02:02:39 +00:00
|
|
|
#endif
|
|
|
|
|
2007-06-05 12:10:51 +00:00
|
|
|
/* Id for class identification, at run time */
|
2007-08-24 15:10:46 +00:00
|
|
|
enum KICAD_T {
|
2007-10-31 17:47:44 +00:00
|
|
|
NOT_USED = -1, // the 3d code uses this value
|
|
|
|
|
2007-08-06 20:26:59 +00:00
|
|
|
EOT = 0, // search types array terminator (End Of Types)
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-08-04 04:42:49 +00:00
|
|
|
TYPE_NOT_INIT = 0,
|
2008-12-04 04:28:11 +00:00
|
|
|
TYPE_PCB,
|
2009-08-01 19:26:05 +00:00
|
|
|
TYPE_SCREEN, // not really an item, used to identify a screen
|
2007-08-04 04:42:49 +00:00
|
|
|
|
|
|
|
// Items in pcb
|
2009-08-01 19:26:05 +00:00
|
|
|
TYPE_MODULE, // a footprint
|
|
|
|
TYPE_PAD, // a pad in a footprint
|
|
|
|
TYPE_DRAWSEGMENT, // a segment not on copper layers
|
|
|
|
TYPE_TEXTE, // a text on a layer
|
|
|
|
TYPE_TEXTE_MODULE, // a text in a footprint
|
|
|
|
TYPE_EDGE_MODULE, // a footprint edge
|
|
|
|
TYPE_TRACK, // a track segment (segment on a copper layer)
|
|
|
|
TYPE_VIA, // a via (like atrack segment on a copper layer)
|
2009-11-23 20:18:47 +00:00
|
|
|
TYPE_ZONE, // a segment used to fill a zone area (segment on a
|
|
|
|
// copper layer)
|
2009-08-11 10:27:21 +00:00
|
|
|
TYPE_MARKER_PCB, // a marker used to show something
|
2010-04-23 09:54:40 +00:00
|
|
|
TYPE_DIMENSION, // a dimension (graphic item)
|
2009-08-01 19:26:05 +00:00
|
|
|
TYPE_MIRE, // a target (graphic item)
|
|
|
|
TYPE_ZONE_EDGE_CORNER, // in zone outline: a point to define an outline
|
|
|
|
TYPE_ZONE_CONTAINER, // a zone area
|
|
|
|
TYPE_BOARD_ITEM_LIST, // a list of board items
|
2007-08-04 04:42:49 +00:00
|
|
|
|
|
|
|
// Draw Items in schematic
|
|
|
|
DRAW_POLYLINE_STRUCT_TYPE,
|
|
|
|
DRAW_JUNCTION_STRUCT_TYPE,
|
2008-03-20 01:50:21 +00:00
|
|
|
TYPE_SCH_TEXT,
|
|
|
|
TYPE_SCH_LABEL,
|
|
|
|
TYPE_SCH_GLOBALLABEL,
|
|
|
|
TYPE_SCH_HIERLABEL,
|
|
|
|
TYPE_SCH_COMPONENT,
|
2007-08-04 04:42:49 +00:00
|
|
|
DRAW_SEGMENT_STRUCT_TYPE,
|
|
|
|
DRAW_BUSENTRY_STRUCT_TYPE,
|
|
|
|
DRAW_SHEET_STRUCT_TYPE,
|
2008-04-15 19:38:19 +00:00
|
|
|
DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE,
|
2009-12-02 21:44:03 +00:00
|
|
|
TYPE_SCH_MARKER,
|
2007-08-04 04:42:49 +00:00
|
|
|
DRAW_NOCONNECT_STRUCT_TYPE,
|
|
|
|
DRAW_PART_TEXT_STRUCT_TYPE,
|
|
|
|
|
|
|
|
// General
|
|
|
|
SCREEN_STRUCT_TYPE,
|
|
|
|
BLOCK_LOCATE_STRUCT_TYPE,
|
|
|
|
|
2009-10-05 17:52:41 +00:00
|
|
|
/*
|
|
|
|
* Draw items in library component.
|
|
|
|
*
|
|
|
|
* The order of these items effects the sort order for items inside the
|
|
|
|
* "DRAW/ENDDRAW" section of the component definition in a library file.
|
|
|
|
* If you add a new draw item, type, please make sure you add it so the
|
|
|
|
* sort order is logical.
|
|
|
|
*/
|
2010-10-25 15:43:42 +00:00
|
|
|
LIB_COMPONENT_T,
|
|
|
|
LIB_ALIAS_T,
|
2007-08-04 04:42:49 +00:00
|
|
|
COMPONENT_ARC_DRAW_TYPE,
|
|
|
|
COMPONENT_CIRCLE_DRAW_TYPE,
|
|
|
|
COMPONENT_GRAPHIC_TEXT_DRAW_TYPE,
|
|
|
|
COMPONENT_RECT_DRAW_TYPE,
|
|
|
|
COMPONENT_POLYLINE_DRAW_TYPE,
|
|
|
|
COMPONENT_LINE_DRAW_TYPE,
|
2009-10-05 17:52:41 +00:00
|
|
|
COMPONENT_BEZIER_DRAW_TYPE,
|
2007-08-04 04:42:49 +00:00
|
|
|
COMPONENT_PIN_DRAW_TYPE,
|
2009-10-05 17:52:41 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Fields are not saved inside the "DRAW/ENDDRAW". Add new draw item
|
|
|
|
* types before this line.
|
|
|
|
*/
|
2007-08-04 04:42:49 +00:00
|
|
|
COMPONENT_FIELD_DRAW_TYPE,
|
|
|
|
|
2010-09-28 14:42:05 +00:00
|
|
|
/*
|
|
|
|
* For Gerbview: items type:
|
|
|
|
*/
|
|
|
|
TYPE_GERBER_DRAW_ITEM,
|
|
|
|
|
2007-08-04 04:42:49 +00:00
|
|
|
// End value
|
|
|
|
MAX_STRUCT_TYPE_ID
|
2007-06-05 12:10:51 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2007-08-06 20:26:59 +00:00
|
|
|
enum SEARCH_RESULT {
|
|
|
|
SEARCH_QUIT,
|
|
|
|
SEARCH_CONTINUE
|
2007-10-31 17:47:44 +00:00
|
|
|
};
|
2007-08-06 20:26:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
class EDA_BaseStruct;
|
2007-08-20 19:33:15 +00:00
|
|
|
class WinEDA_DrawFrame;
|
2007-09-15 04:25:54 +00:00
|
|
|
class BOARD;
|
2008-01-06 12:43:57 +00:00
|
|
|
class EDA_Rect;
|
2009-01-29 14:26:20 +00:00
|
|
|
class WinEDA_DrawPanel;
|
2008-11-24 06:53:43 +00:00
|
|
|
|
2007-08-06 20:26:59 +00:00
|
|
|
/**
|
|
|
|
* Class INSPECTOR
|
2007-10-31 17:47:44 +00:00
|
|
|
* is an abstract class that is used to inspect and possibly collect the
|
2007-08-06 20:26:59 +00:00
|
|
|
* (search) results of Iterating over a list or tree of KICAD_T objects.
|
2007-08-06 21:02:23 +00:00
|
|
|
* Extend from this class and implement the Inspect function and provide for
|
2007-08-06 20:26:59 +00:00
|
|
|
* a way for the extension to collect the results of the search/scan data and
|
|
|
|
* provide them to the caller.
|
|
|
|
*/
|
|
|
|
class INSPECTOR
|
|
|
|
{
|
|
|
|
public:
|
2007-08-20 01:20:48 +00:00
|
|
|
virtual ~INSPECTOR()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-08-06 20:26:59 +00:00
|
|
|
/**
|
|
|
|
* Function Inspect
|
2007-10-31 17:47:44 +00:00
|
|
|
* is the examining function within the INSPECTOR which is passed to the
|
2009-11-23 20:18:47 +00:00
|
|
|
* Iterate function. It is used primarily for searching, but not limited
|
|
|
|
*to
|
2007-08-06 21:02:23 +00:00
|
|
|
* that. It can also collect or modify the scanned objects.
|
|
|
|
*
|
|
|
|
* @param testItem An EDA_BaseStruct to examine.
|
2007-08-06 20:26:59 +00:00
|
|
|
* @param testData is arbitrary data needed by the inspector to determine
|
2007-08-23 04:28:46 +00:00
|
|
|
* if the BOARD_ITEM under test meets its match criteria.
|
2007-08-06 20:26:59 +00:00
|
|
|
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
|
|
|
|
* else SCAN_CONTINUE;
|
2007-10-31 17:47:44 +00:00
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
SEARCH_RESULT virtual Inspect( EDA_BaseStruct* testItem,
|
|
|
|
const void* testData ) = 0;
|
2007-08-06 20:26:59 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-03-15 04:18:32 +00:00
|
|
|
/**
|
|
|
|
* Class EDA_Rect
|
|
|
|
* handles the component boundary box.
|
|
|
|
* This class is similar to wxRect, but some wxRect functions are very curious,
|
|
|
|
* so I prefer this suitable class
|
|
|
|
*/
|
|
|
|
class EDA_Rect
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
wxPoint m_Pos; // Rectangle Origin
|
|
|
|
wxSize m_Size; // Rectangle Size
|
|
|
|
|
|
|
|
public:
|
|
|
|
EDA_Rect() { };
|
|
|
|
|
|
|
|
EDA_Rect( const wxPoint& aPos, const wxSize& aSize ) :
|
2009-11-23 20:18:47 +00:00
|
|
|
m_Pos( aPos ),
|
|
|
|
m_Size( aSize )
|
2008-12-16 19:44:57 +00:00
|
|
|
{ }
|
2008-03-15 04:18:32 +00:00
|
|
|
|
|
|
|
wxPoint Centre()
|
|
|
|
{
|
2009-11-23 20:18:47 +00:00
|
|
|
return wxPoint( m_Pos.x + ( m_Size.x >> 1 ),
|
|
|
|
m_Pos.y + ( m_Size.y >> 1 ) );
|
2008-03-15 04:18:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-11-28 09:24:37 +00:00
|
|
|
/* Move this by the aMoveVector value (this is a relative move
|
|
|
|
*/
|
|
|
|
void Move( const wxPoint& aMoveVector );
|
|
|
|
|
|
|
|
void Normalize(); // Ensure the height and width are >= 0
|
|
|
|
bool Inside( const wxPoint& point ); // Return TRUE if point is in Rect
|
2008-03-15 04:18:32 +00:00
|
|
|
|
|
|
|
bool Inside( int x, int y ) { return Inside( wxPoint( x, y ) ); }
|
|
|
|
wxSize GetSize() { return m_Size; }
|
2009-12-30 18:06:12 +00:00
|
|
|
int GetX() const { return m_Pos.x; }
|
|
|
|
int GetY() const { return m_Pos.y; }
|
2008-03-15 04:18:32 +00:00
|
|
|
wxPoint GetOrigin() { return m_Pos; }
|
|
|
|
wxPoint GetPosition() { return m_Pos; }
|
2009-12-30 18:06:12 +00:00
|
|
|
wxPoint GetEnd() const { return wxPoint( GetRight(), GetBottom() ); }
|
|
|
|
int GetWidth() const { return m_Size.x; }
|
|
|
|
int GetHeight() const { return m_Size.y; }
|
|
|
|
int GetRight() const { return m_Pos.x + m_Size.x; }
|
|
|
|
int GetBottom() const { return m_Pos.y + m_Size.y; }
|
2008-03-15 04:18:32 +00:00
|
|
|
void SetOrigin( const wxPoint& pos ) { m_Pos = pos; }
|
|
|
|
void SetOrigin( int x, int y ) { m_Pos.x = x; m_Pos.y = y; }
|
|
|
|
void SetSize( const wxSize& size ) { m_Size = size; }
|
|
|
|
void SetSize( int w, int h ) { m_Size.x = w; m_Size.y = h; }
|
|
|
|
void Offset( int dx, int dy ) { m_Pos.x += dx; m_Pos.y += dy; }
|
2009-11-23 20:18:47 +00:00
|
|
|
void Offset( const wxPoint& offset ) { m_Pos.x += offset.x; m_Pos.y +=
|
|
|
|
offset.y; }
|
2008-03-15 04:18:32 +00:00
|
|
|
void SetX( int val ) { m_Pos.x = val; }
|
|
|
|
void SetY( int val ) { m_Pos.y = val; }
|
|
|
|
void SetWidth( int val ) { m_Size.x = val; }
|
|
|
|
void SetHeight( int val ) { m_Size.y = val; }
|
2009-04-05 20:49:15 +00:00
|
|
|
void SetEnd( int x, int y ) { SetEnd( wxPoint( x, y ) ); }
|
2008-03-15 04:18:32 +00:00
|
|
|
void SetEnd( const wxPoint& pos )
|
|
|
|
{
|
|
|
|
m_Size.x = pos.x - m_Pos.x; m_Size.y = pos.y - m_Pos.y;
|
|
|
|
}
|
|
|
|
|
2008-12-16 19:44:57 +00:00
|
|
|
|
2008-03-15 04:18:32 +00:00
|
|
|
/**
|
|
|
|
* Function Intersects
|
|
|
|
* @return bool - true if the argument rectangle intersects this rectangle.
|
|
|
|
*/
|
|
|
|
bool Intersects( const EDA_Rect aRect ) const;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Function operator(wxRect)
|
|
|
|
* overloads the cast operator to return a wxRect
|
|
|
|
*/
|
|
|
|
operator wxRect() const { return wxRect( m_Pos, m_Size ); }
|
|
|
|
|
2009-10-21 19:16:25 +00:00
|
|
|
/** Inflate
|
2009-11-23 20:18:47 +00:00
|
|
|
* Inflate this object: move each horizontal edge by dx and each vertical
|
|
|
|
* edge by dy toward rect outside
|
2009-10-21 19:16:25 +00:00
|
|
|
* if dx and/or dy is negative, move toward rect inside (deflate)
|
|
|
|
* Works for positive and negative rect size
|
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
EDA_Rect& Inflate( wxCoord dx, wxCoord dy );
|
2008-03-20 01:50:21 +00:00
|
|
|
|
2009-10-21 19:16:25 +00:00
|
|
|
/** Inflate
|
2009-11-23 20:18:47 +00:00
|
|
|
* Inflate this object: move each horizontal edge and each vertical edge by
|
|
|
|
* aDelta toward rect outside
|
2009-10-21 19:16:25 +00:00
|
|
|
* if aDelta is negative, move toward rect inside (deflate)
|
|
|
|
* Works for positive and negative rect size
|
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
EDA_Rect& Inflate( int aDelta );
|
2009-10-21 19:16:25 +00:00
|
|
|
|
2010-11-12 15:17:10 +00:00
|
|
|
/**
|
|
|
|
* Function Merge
|
2008-03-20 01:50:21 +00:00
|
|
|
* Modify Position and Size of this in order to contain the given rect
|
|
|
|
* mainly used to calculate bounding boxes
|
|
|
|
* @param aRect = given rect to merge with this
|
2008-12-16 19:44:57 +00:00
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
void Merge( const EDA_Rect& aRect );
|
2008-03-15 04:18:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-03-15 10:24:32 +00:00
|
|
|
/******************************************************/
|
|
|
|
/* Basic Classes : used classes are derived from them */
|
|
|
|
/******************************************************/
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2008-11-24 06:53:43 +00:00
|
|
|
class DHEAD;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Class EDA_BaseStruct
|
2009-11-23 20:18:47 +00:00
|
|
|
* is a base class for most all the kicad significant classes, used in
|
|
|
|
* schematics and boards.
|
2007-10-31 17:47:44 +00:00
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
|
|
|
|
// These define are used for the .m_Flags and .m_UndoRedoStatus member of the
|
|
|
|
// class EDA_BaseStruct
|
2010-10-25 15:43:42 +00:00
|
|
|
#define IS_CHANGED (1 << 0)
|
|
|
|
#define IS_LINKED (1 << 1)
|
|
|
|
#define IN_EDIT (1 << 2)
|
|
|
|
#define IS_MOVED (1 << 3)
|
|
|
|
#define IS_NEW (1 << 4)
|
|
|
|
#define IS_RESIZED (1 << 5)
|
|
|
|
#define IS_DRAGGED (1 << 6)
|
|
|
|
#define IS_DELETED (1 << 7)
|
|
|
|
#define IS_WIRE_IMAGE (1 << 8)
|
|
|
|
#define STARTPOINT (1 << 9)
|
|
|
|
#define ENDPOINT (1 << 10)
|
|
|
|
#define SELECTED (1 << 11)
|
|
|
|
#define SELECTEDNODE (1 << 12) ///< flag indicating that the structure has already selected
|
|
|
|
#define STRUCT_DELETED (1 << 13) ///< flag indication structures to be erased
|
|
|
|
#define CANDIDATE (1 << 14) ///< flag indicating that the structure is connected
|
|
|
|
#define SKIP_STRUCT (1 << 15) ///< flag indicating that the structure should be ignored
|
|
|
|
#define DO_NOT_DRAW (1 << 16) ///< Used to disable draw function
|
|
|
|
#define IS_CANCELLED (1 << 17) ///< flag set when edit dialogs are canceled when editing a
|
|
|
|
///< new object
|
2008-11-24 06:53:43 +00:00
|
|
|
|
2009-07-23 15:37:00 +00:00
|
|
|
class EDA_BaseStruct
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Run time identification, _keep private_ so it can never be changed after
|
2009-11-23 20:18:47 +00:00
|
|
|
* a constructor sets it. See comment near SetType() regarding virtual
|
|
|
|
*functions.
|
2009-07-23 15:37:00 +00:00
|
|
|
*/
|
|
|
|
KICAD_T m_StructType;
|
|
|
|
|
|
|
|
protected:
|
2009-11-23 20:18:47 +00:00
|
|
|
EDA_BaseStruct* Pnext; /* Linked list: Link (next struct) */
|
|
|
|
EDA_BaseStruct* Pback; /* Linked list: Link (previous struct) */
|
|
|
|
EDA_BaseStruct* m_Parent; /* Linked list: Link (parent struct) */
|
|
|
|
EDA_BaseStruct* m_Son; /* Linked list: Link (son struct) */
|
|
|
|
DHEAD* m_List; ///< which DLIST I am on.
|
2008-11-24 06:53:43 +00:00
|
|
|
|
2009-07-23 15:37:00 +00:00
|
|
|
|
|
|
|
public:
|
2009-11-23 20:18:47 +00:00
|
|
|
int m_Flags; // flags for editing and other uses.
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2009-11-23 20:18:47 +00:00
|
|
|
unsigned long m_TimeStamp; // Time stamp used for logical links
|
|
|
|
int m_Selected; /* Used by block commands, and selective
|
|
|
|
* editing */
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2009-07-23 15:37:00 +00:00
|
|
|
// member used in undo/redo function
|
2009-11-23 20:18:47 +00:00
|
|
|
EDA_BaseStruct* m_Image; // Link to an image copy to save a copy of
|
|
|
|
// old parameters values
|
2009-07-23 15:37:00 +00:00
|
|
|
|
2007-06-05 12:10:51 +00:00
|
|
|
private:
|
2008-12-16 19:44:57 +00:00
|
|
|
int m_Status;
|
2007-06-05 12:10:51 +00:00
|
|
|
|
|
|
|
private:
|
2007-08-30 22:20:52 +00:00
|
|
|
void InitVars();
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-06-05 12:10:51 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2007-08-24 15:10:46 +00:00
|
|
|
EDA_BaseStruct( EDA_BaseStruct* parent, KICAD_T idType );
|
2007-11-27 22:49:35 +00:00
|
|
|
EDA_BaseStruct( KICAD_T idType );
|
2009-09-25 18:49:04 +00:00
|
|
|
EDA_BaseStruct( const EDA_BaseStruct& base );
|
2007-08-04 04:42:49 +00:00
|
|
|
virtual ~EDA_BaseStruct() { };
|
2007-09-01 12:00:30 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Function Type
|
2009-11-23 20:18:47 +00:00
|
|
|
* returns the type of object. This attribute should never be changed
|
|
|
|
* after a constructor sets it, so there is no public "setter" method.
|
2007-09-01 12:00:30 +00:00
|
|
|
* @return KICAD_T - the type of object.
|
|
|
|
*/
|
2007-10-31 17:47:44 +00:00
|
|
|
KICAD_T Type() const { return m_StructType; }
|
|
|
|
|
|
|
|
|
2008-12-16 19:44:57 +00:00
|
|
|
EDA_BaseStruct* Next() const { return (EDA_BaseStruct*) Pnext; }
|
|
|
|
EDA_BaseStruct* Back() const { return (EDA_BaseStruct*) Pback; }
|
|
|
|
EDA_BaseStruct* GetParent() const { return m_Parent; }
|
|
|
|
EDA_BaseStruct* GetSon() const { return m_Son; }
|
|
|
|
DHEAD* GetList() const { return m_List; }
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2008-11-24 06:53:43 +00:00
|
|
|
void SetNext( EDA_BaseStruct* aNext ) { Pnext = aNext; }
|
|
|
|
void SetBack( EDA_BaseStruct* aBack ) { Pback = aBack; }
|
|
|
|
void SetParent( EDA_BaseStruct* aParent ) { m_Parent = aParent; }
|
|
|
|
void SetSon( EDA_BaseStruct* aSon ) { m_Son = aSon; }
|
|
|
|
void SetList( DHEAD* aList ) { m_List = aList; }
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2010-10-25 15:43:42 +00:00
|
|
|
inline bool IsNew() const { return m_Flags & IS_NEW; }
|
|
|
|
inline bool IsModified() const { return m_Flags & IS_CHANGED; }
|
|
|
|
inline bool IsMoving() const { return m_Flags & IS_MOVED; }
|
|
|
|
inline bool IsDragging() const { return m_Flags & IS_DRAGGED; }
|
2010-11-03 14:13:15 +00:00
|
|
|
inline bool IsSelected() const { return m_Flags & SELECTED; }
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-10-31 06:40:15 +00:00
|
|
|
int GetState( int type ) const
|
|
|
|
{
|
|
|
|
return m_Status & type;
|
|
|
|
}
|
|
|
|
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-10-31 06:40:15 +00:00
|
|
|
void SetState( int type, int state )
|
|
|
|
{
|
|
|
|
if( state )
|
2007-10-31 17:47:44 +00:00
|
|
|
m_Status |= type; // state = ON or OFF
|
2007-10-31 06:40:15 +00:00
|
|
|
else
|
|
|
|
m_Status &= ~type;
|
|
|
|
}
|
2007-08-04 04:42:49 +00:00
|
|
|
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-09-01 12:00:30 +00:00
|
|
|
int ReturnStatus() const { return m_Status; }
|
2007-08-04 04:42:49 +00:00
|
|
|
|
|
|
|
void SetStatus( int new_status )
|
|
|
|
{
|
|
|
|
m_Status = new_status;
|
|
|
|
}
|
|
|
|
|
2010-10-20 20:24:26 +00:00
|
|
|
void SetFlags( int aFlags ) { m_Flags = aFlags; }
|
|
|
|
|
|
|
|
int GetFlags() { return m_Flags; }
|
2008-12-16 19:44:57 +00:00
|
|
|
|
2007-08-20 19:33:15 +00:00
|
|
|
/**
|
2009-04-17 08:51:02 +00:00
|
|
|
* Function DisplayInfo
|
2009-11-23 20:18:47 +00:00
|
|
|
* has knowledge about the frame and how and where to put status
|
|
|
|
* information about this object into the frame's message panel.
|
2007-08-20 19:33:15 +00:00
|
|
|
* @param frame A WinEDA_DrawFrame in which to print status information.
|
2007-10-31 17:47:44 +00:00
|
|
|
*/
|
2009-04-17 08:51:02 +00:00
|
|
|
virtual void DisplayInfo( WinEDA_DrawFrame* frame )
|
2007-08-20 19:33:15 +00:00
|
|
|
{
|
2007-10-31 17:47:44 +00:00
|
|
|
// derived classes may implement this
|
2007-08-20 19:33:15 +00:00
|
|
|
}
|
2007-10-31 17:47:44 +00:00
|
|
|
|
|
|
|
|
2007-08-08 03:50:44 +00:00
|
|
|
/**
|
|
|
|
* Function HitTest
|
|
|
|
* tests if the given wxPoint is within the bounds of this object.
|
|
|
|
* @param refPos A wxPoint to test
|
|
|
|
* @return bool - true if a hit, else false
|
|
|
|
*/
|
|
|
|
virtual bool HitTest( const wxPoint& refPos )
|
|
|
|
{
|
|
|
|
return false; // derived classes should override this function
|
|
|
|
}
|
|
|
|
|
2008-12-16 19:44:57 +00:00
|
|
|
|
2008-03-05 22:40:52 +00:00
|
|
|
/**
|
2009-11-23 20:18:47 +00:00
|
|
|
* Function HitTest (overlaid)
|
2008-03-05 22:40:52 +00:00
|
|
|
* tests if the given EDA_Rect intersect this object.
|
|
|
|
* For now, an ending point must be inside this rect.
|
|
|
|
* @param refArea : the given EDA_Rect
|
|
|
|
* @return bool - true if a hit, else false
|
|
|
|
*/
|
2008-01-06 12:43:57 +00:00
|
|
|
virtual bool HitTest( EDA_Rect& refArea )
|
|
|
|
{
|
|
|
|
return false; // derived classes should override this function
|
|
|
|
}
|
|
|
|
|
2008-12-16 19:44:57 +00:00
|
|
|
|
2008-03-15 04:18:32 +00:00
|
|
|
/**
|
|
|
|
* Function GetBoundingBox
|
2009-11-23 20:18:47 +00:00
|
|
|
* returns the orthogonal, bounding box of this object for display
|
|
|
|
* purposes.
|
2008-03-15 04:18:32 +00:00
|
|
|
* This box should be an enclosing perimeter for visible components of this
|
2009-11-23 20:18:47 +00:00
|
|
|
* object, and the units should be in the pcb or schematic coordinate
|
|
|
|
* system.
|
2008-03-15 04:18:32 +00:00
|
|
|
* It is OK to overestimate the size by a few counts.
|
|
|
|
*/
|
|
|
|
virtual EDA_Rect GetBoundingBox()
|
|
|
|
{
|
2009-11-23 20:18:47 +00:00
|
|
|
#if defined(DEBUG)
|
2008-12-16 19:44:57 +00:00
|
|
|
printf( "Missing GetBoundingBox()\n" );
|
2009-11-23 20:18:47 +00:00
|
|
|
Show( 0, std::cout ); // tell me which classes still need
|
|
|
|
// GetBoundingBox support
|
2008-03-20 01:50:21 +00:00
|
|
|
#endif
|
2008-12-16 19:44:57 +00:00
|
|
|
|
2009-11-23 20:18:47 +00:00
|
|
|
// return a zero-sized box per default. derived classes should override
|
|
|
|
// this
|
2009-04-05 20:49:15 +00:00
|
|
|
return EDA_Rect( wxPoint( 0, 0 ), wxSize( 0, 0 ) );
|
2008-03-15 04:18:32 +00:00
|
|
|
}
|
2007-08-09 21:15:08 +00:00
|
|
|
|
2008-12-16 19:44:57 +00:00
|
|
|
|
2007-08-09 21:15:08 +00:00
|
|
|
/**
|
|
|
|
* Function IterateForward
|
2007-10-31 17:47:44 +00:00
|
|
|
* walks through the object tree calling the inspector() on each object
|
2007-08-09 21:15:08 +00:00
|
|
|
* type requested in scanTypes.
|
|
|
|
*
|
2007-10-31 17:47:44 +00:00
|
|
|
* @param listStart The first in a list of EDA_BaseStructs to iterate over.
|
|
|
|
* @param inspector Is an INSPECTOR to call on each object that is one of
|
2007-08-09 21:15:08 +00:00
|
|
|
* the requested scanTypes.
|
2007-10-31 17:47:44 +00:00
|
|
|
* @param testData Is an aid to testFunc, and should be sufficient to
|
2007-08-09 21:15:08 +00:00
|
|
|
* allow it to fully determine if an item meets the match criteria, but it
|
|
|
|
* may also be used to collect output.
|
2007-10-31 17:47:44 +00:00
|
|
|
* @param scanTypes A KICAD_T array that is EOT
|
2007-08-09 21:15:08 +00:00
|
|
|
* terminated, and provides both the order and interest level of of
|
|
|
|
* the types of objects to be iterated over.
|
2007-10-31 17:47:44 +00:00
|
|
|
* @return SEARCH_RESULT - SEARCH_QUIT if the called INSPECTOR returned
|
2007-08-09 21:15:08 +00:00
|
|
|
* SEARCH_QUIT, else SCAN_CONTINUE;
|
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
static SEARCH_RESULT IterateForward( EDA_BaseStruct* listStart,
|
|
|
|
INSPECTOR* inspector,
|
|
|
|
const void* testData,
|
|
|
|
const KICAD_T scanTypes[] );
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-08-09 21:15:08 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Function Visit
|
|
|
|
* may be re-implemented for each derived class in order to handle
|
|
|
|
* all the types given by its member data. Implementations should call
|
2009-11-23 20:18:47 +00:00
|
|
|
* inspector->Inspect() on types in scanTypes[], and may use
|
|
|
|
* IterateForward()
|
2007-08-09 21:15:08 +00:00
|
|
|
* to do so on lists of such data.
|
|
|
|
* @param inspector An INSPECTOR instance to use in the inspection.
|
|
|
|
* @param testData Arbitrary data used by the inspector.
|
2007-10-31 17:47:44 +00:00
|
|
|
* @param scanTypes Which KICAD_T types are of interest and the order
|
2007-08-09 21:15:08 +00:00
|
|
|
* is significant too, terminated by EOT.
|
|
|
|
* @return SEARCH_RESULT - SEARCH_QUIT if the Iterator is to stop the scan,
|
|
|
|
* else SCAN_CONTINUE, and determined by the inspector.
|
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
virtual SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData,
|
|
|
|
const KICAD_T scanTypes[] );
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-08-09 21:15:08 +00:00
|
|
|
|
2007-08-07 06:21:19 +00:00
|
|
|
/**
|
|
|
|
* Function GetClass
|
|
|
|
* returns the class name.
|
|
|
|
* @return wxString
|
|
|
|
*/
|
|
|
|
virtual wxString GetClass() const
|
|
|
|
{
|
2007-10-31 17:47:44 +00:00
|
|
|
return wxT( "EDA_BaseStruct" );
|
2007-08-07 06:21:19 +00:00
|
|
|
}
|
|
|
|
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2009-11-23 20:18:47 +00:00
|
|
|
#if defined(DEBUG)
|
2007-09-13 11:28:58 +00:00
|
|
|
|
2007-08-06 02:02:39 +00:00
|
|
|
/**
|
|
|
|
* Function Show
|
|
|
|
* is used to output the object tree, currently for debugging only.
|
2007-10-31 17:47:44 +00:00
|
|
|
* @param nestLevel An aid to prettier tree indenting, and is the level
|
2007-08-06 02:02:39 +00:00
|
|
|
* of nesting of this object within the overall tree.
|
|
|
|
* @param os The ostream& to output to.
|
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
virtual void Show( int nestLevel, std::ostream& os );
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2007-08-06 20:26:59 +00:00
|
|
|
|
2007-10-31 17:47:44 +00:00
|
|
|
/**
|
2007-08-06 02:02:39 +00:00
|
|
|
* Function NestedSpace
|
|
|
|
* outputs nested space for pretty indenting.
|
|
|
|
* @param nestLevel The nest count
|
|
|
|
* @param os The ostream&, where to output
|
|
|
|
* @return std::ostream& - for continuation.
|
|
|
|
**/
|
2009-11-23 20:18:47 +00:00
|
|
|
static std::ostream& NestedSpace( int nestLevel, std::ostream& os );
|
2007-08-06 20:26:59 +00:00
|
|
|
|
2007-08-06 02:02:39 +00:00
|
|
|
#endif
|
2007-06-05 12:10:51 +00:00
|
|
|
};
|
|
|
|
|
2007-08-06 02:02:39 +00:00
|
|
|
|
2008-12-16 19:44:57 +00:00
|
|
|
// Graphic Text justify:
|
2007-06-05 12:10:51 +00:00
|
|
|
// Values -1,0,1 are used in computations, do not change them
|
2008-12-16 19:44:57 +00:00
|
|
|
enum GRTextHorizJustifyType {
|
2007-08-04 04:42:49 +00:00
|
|
|
GR_TEXT_HJUSTIFY_LEFT = -1,
|
|
|
|
GR_TEXT_HJUSTIFY_CENTER = 0,
|
|
|
|
GR_TEXT_HJUSTIFY_RIGHT = 1
|
2008-12-16 19:44:57 +00:00
|
|
|
};
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2007-08-04 04:42:49 +00:00
|
|
|
|
2008-12-16 19:44:57 +00:00
|
|
|
enum GRTextVertJustifyType {
|
2009-11-23 20:18:47 +00:00
|
|
|
GR_TEXT_VJUSTIFY_TOP = -1,
|
2007-08-04 04:42:49 +00:00
|
|
|
GR_TEXT_VJUSTIFY_CENTER = 0,
|
|
|
|
GR_TEXT_VJUSTIFY_BOTTOM = 1
|
2008-12-16 19:44:57 +00:00
|
|
|
};
|
2007-08-04 04:42:49 +00:00
|
|
|
|
2008-12-16 19:44:57 +00:00
|
|
|
/* Options to show solid segments (segments, texts...) */
|
2009-06-28 16:50:42 +00:00
|
|
|
enum GRTraceMode {
|
2009-11-23 20:18:47 +00:00
|
|
|
FILAIRE = 0, // segments are drawn as lines
|
|
|
|
FILLED, // normal mode: segments have thickness
|
|
|
|
SKETCH // sketcg mode: segments have thickness, but are not
|
|
|
|
// filled
|
2008-12-16 19:44:57 +00:00
|
|
|
};
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2009-06-28 16:50:42 +00:00
|
|
|
/**
|
|
|
|
* Enum FILL_T
|
|
|
|
* is the set of fill types used in plotting or drawing enclosed areas.
|
|
|
|
*/
|
|
|
|
enum FILL_T {
|
|
|
|
NO_FILL, // Poly, Square, Circle, Arc = option No Fill
|
|
|
|
FILLED_SHAPE, /* Poly, Square, Circle, Arc = option Fill
|
|
|
|
* with current color ("Solid shape") */
|
2010-10-04 12:58:07 +00:00
|
|
|
FILLED_WITH_BG_BODYCOLOR /* Poly, Square, Circle, Arc = option Fill
|
2009-06-28 16:50:42 +00:00
|
|
|
* with background body color, translucent
|
|
|
|
* (texts inside this shape can be seen)
|
|
|
|
* not filled in B&W mode when plotting or
|
|
|
|
* printing */
|
|
|
|
};
|
|
|
|
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2009-05-21 17:42:42 +00:00
|
|
|
#define DEFAULT_SIZE_TEXT 60 /* default text height (in mils or 1/1000") */
|
2007-06-05 12:10:51 +00:00
|
|
|
|
2008-10-06 05:44:29 +00:00
|
|
|
/**
|
|
|
|
* Class EDA_TextStruct
|
2009-11-23 20:18:47 +00:00
|
|
|
* is a basic class to handle texts (labels, texts on components or footprints
|
|
|
|
* ..) not used directly.
|
2008-10-06 05:44:29 +00:00
|
|
|
* The text classes are derived from EDA_BaseStruct and EDA_TextStruct
|
2007-10-31 17:47:44 +00:00
|
|
|
*/
|
2007-06-05 12:10:51 +00:00
|
|
|
class EDA_TextStruct
|
|
|
|
{
|
|
|
|
public:
|
2007-08-04 04:42:49 +00:00
|
|
|
wxString m_Text; /* text! */
|
|
|
|
wxPoint m_Pos; /* XY position of anchor text. */
|
|
|
|
wxSize m_Size; /* XY size of text */
|
2009-05-30 16:06:01 +00:00
|
|
|
int m_Width; /* pen size used to draw this text */
|
2007-08-04 04:42:49 +00:00
|
|
|
int m_Orient; /* Orient in 0.1 degrees */
|
2009-05-30 16:06:01 +00:00
|
|
|
bool m_Mirror; /* Display Normal / mirror */
|
2007-10-31 17:47:44 +00:00
|
|
|
int m_Attributs; /* flags (visible...) */
|
2009-11-23 20:18:47 +00:00
|
|
|
bool m_Italic; /* true to simulate (or use if exists)
|
|
|
|
* an italic font... */
|
2009-05-30 16:06:01 +00:00
|
|
|
bool m_Bold; /* true to simulate a bold font ... */
|
|
|
|
GRTextHorizJustifyType m_HJustify; /* Horiz justification */
|
|
|
|
GRTextVertJustifyType m_VJustify; /* Vertical justification */
|
2009-11-23 20:18:47 +00:00
|
|
|
bool m_MultilineAllowed; /* true to use multiline option, false
|
|
|
|
* to use only single line text
|
|
|
|
* Single line is faster in
|
|
|
|
* calculations than multiline */
|
2007-06-05 12:10:51 +00:00
|
|
|
|
|
|
|
public:
|
2007-08-04 04:42:49 +00:00
|
|
|
EDA_TextStruct( const wxString& text = wxEmptyString );
|
2007-08-30 22:20:52 +00:00
|
|
|
virtual ~EDA_TextStruct();
|
2007-08-04 04:42:49 +00:00
|
|
|
|
2008-03-15 04:18:32 +00:00
|
|
|
int GetLength() const { return m_Text.Length(); };
|
2007-10-31 17:47:44 +00:00
|
|
|
|
2010-11-12 15:17:10 +00:00
|
|
|
/**
|
|
|
|
* Function Draw
|
2008-12-16 19:44:57 +00:00
|
|
|
* @param aPanel = the current DrawPanel
|
|
|
|
* @param aDC = the current Device Context
|
|
|
|
* @param aOffset = draw offset (usually (0,0))
|
|
|
|
* @param EDA_Colors aColor = text color
|
2009-06-04 19:39:50 +00:00
|
|
|
* @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode.
|
2009-06-28 16:50:42 +00:00
|
|
|
* @param GRTraceMode aDisplay_mode = FILAIRE, FILLED or SKETCH
|
2009-11-23 20:18:47 +00:00
|
|
|
* @param EDA_Colors aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do
|
|
|
|
* not draw anchor ).
|
2008-12-16 19:44:57 +00:00
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC,
|
|
|
|
const wxPoint& aOffset, EDA_Colors aColor,
|
|
|
|
int aDrawMode, GRTraceMode aDisplay_mode = FILAIRE,
|
|
|
|
EDA_Colors aAnchor_color = UNSPECIFIED_COLOR );
|
2007-08-04 04:42:49 +00:00
|
|
|
|
2009-05-01 16:46:56 +00:00
|
|
|
private:
|
2009-11-23 20:18:47 +00:00
|
|
|
|
2010-11-12 15:17:10 +00:00
|
|
|
/**
|
|
|
|
* Function DrawOneLineOfText
|
2009-05-01 16:46:56 +00:00
|
|
|
* Draw a single text line.
|
|
|
|
* Used to draw each line of this EDA_TextStruct, that can be multiline
|
|
|
|
* @param aPanel = the current DrawPanel
|
|
|
|
* @param aDC = the current Device Context
|
|
|
|
* @param aOffset = draw offset (usually (0,0))
|
|
|
|
* @param EDA_Colors aColor = text color
|
|
|
|
* @param aDrawMode = GR_OR, GR_XOR.., -1 to use the current mode.
|
2009-06-04 19:39:50 +00:00
|
|
|
* @param aFillMode = FILAIRE, FILLED or SKETCH
|
2009-11-23 20:18:47 +00:00
|
|
|
* @param EDA_Colors aAnchor_color = anchor color ( UNSPECIFIED_COLOR = do
|
|
|
|
* not draw anchor ).
|
2009-05-01 16:46:56 +00:00
|
|
|
* @param EDA_Colors aText = the single line of text to draw.
|
|
|
|
* @param EDA_Colors aPos = the position of this line ).
|
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
void DrawOneLineOfText( WinEDA_DrawPanel* aPanel, wxDC* aDC,
|
|
|
|
const wxPoint& aOffset, EDA_Colors aColor,
|
|
|
|
int aDrawMode, GRTraceMode aFillMode,
|
|
|
|
EDA_Colors aAnchor_color, wxString& aText,
|
|
|
|
wxPoint aPos );
|
|
|
|
|
2009-05-01 16:46:56 +00:00
|
|
|
public:
|
2009-11-23 20:18:47 +00:00
|
|
|
|
2007-08-04 20:05:54 +00:00
|
|
|
/**
|
2009-06-11 14:26:17 +00:00
|
|
|
* Function TextHitTest
|
2007-08-04 20:05:54 +00:00
|
|
|
* tests if the given wxPoint is within the bounds of this object.
|
2007-08-08 03:50:44 +00:00
|
|
|
* @param ref_pos A wxPoint to test
|
2007-08-04 20:05:54 +00:00
|
|
|
* @return bool - true if a hit, else false
|
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
bool TextHitTest( const wxPoint& ref_pos );
|
2007-10-31 17:47:44 +00:00
|
|
|
|
|
|
|
/**
|
2009-11-23 20:18:47 +00:00
|
|
|
* Function TextHitTest (overloaded)
|
2008-01-06 12:43:57 +00:00
|
|
|
* tests if the given EDA_Rect intersect this object.
|
2008-03-05 22:40:52 +00:00
|
|
|
* For now, the anchor must be inside this rect.
|
2008-01-06 12:43:57 +00:00
|
|
|
* @param refArea : the given EDA_Rect
|
|
|
|
* @return bool - true if a hit, else false
|
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
bool TextHitTest( EDA_Rect& refArea );
|
2008-01-06 12:43:57 +00:00
|
|
|
|
2008-03-05 22:40:52 +00:00
|
|
|
/**
|
2009-05-07 17:10:53 +00:00
|
|
|
* Function LenSize
|
2009-11-23 20:18:47 +00:00
|
|
|
* @return the text length in internal units
|
2009-05-07 17:10:53 +00:00
|
|
|
* @param aLine : the line of text to consider.
|
|
|
|
* For single line text, this parameter is always m_Text
|
2007-10-31 17:47:44 +00:00
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
int LenSize( const wxString& aLine ) const;
|
2009-05-07 17:10:53 +00:00
|
|
|
|
2010-11-12 15:17:10 +00:00
|
|
|
/**
|
|
|
|
* Function GetTextBox
|
2009-11-23 20:18:47 +00:00
|
|
|
* useful in multiline texts to calculate the full text or a line area (for
|
|
|
|
* zones filling, locate functions....)
|
|
|
|
* @return the rect containing the line of text (i.e. the position and the
|
|
|
|
* size of one line)
|
|
|
|
* this rectangle is calculated for 0 orient text. if orient is not 0 the
|
|
|
|
* rect must be rotated to match the physical area
|
2009-05-07 17:10:53 +00:00
|
|
|
* @param aLine : the line of text to consider.
|
|
|
|
* for single line text, aLine is unused
|
|
|
|
* If aLine == -1, the full area (considering all lines) is returned
|
|
|
|
*/
|
2009-11-23 20:18:47 +00:00
|
|
|
EDA_Rect GetTextBox( int aLine = -1 );
|
2009-05-30 16:06:01 +00:00
|
|
|
|
2010-11-12 15:17:10 +00:00
|
|
|
/**
|
|
|
|
* Function GetInterline
|
2009-05-07 17:10:53 +00:00
|
|
|
* return the distance between 2 text lines
|
|
|
|
* has meaning only for multiline texts
|
|
|
|
*/
|
|
|
|
int GetInterline()
|
|
|
|
{
|
2009-11-28 09:24:37 +00:00
|
|
|
return (( m_Size.y * 14 ) / 10) + m_Width;
|
2009-05-07 17:10:53 +00:00
|
|
|
}
|
2007-06-05 12:10:51 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* BASE_STRUCT_H */
|