|
|
/**********************************************************************************
* class MARKER_BASE; markers are used to show something (usually a drc/erc problem)* Markers in pcbnew and eeschema are derived from this basic class**********************************************************************************/
/* file class_marker_base.cpp
*/
#include "fctsys.h"
#include "gr_basic.h"
#include "class_base_screen.h"
#include "common.h"
#include "macros.h"
#include "class_drawpanel.h"
#include "class_marker_base.h"
#include "dialog_display_info_HTML_base.h"
// Default marquer shape:
#define M_SHAPE_SCALE 6 // default scaling factor for MarkerShapeCorners coordinates
#define CORNERS_COUNT 8
/* corners of the default shape
* real coordinates are these values * .m_ScalingFactor*/static const wxPoint MarkerShapeCorners[CORNERS_COUNT] ={ wxPoint( 0, 0 ), wxPoint( 8, 1 ), wxPoint( 4, 3 ), wxPoint( 13, 8 ), wxPoint( 9, 9 ), wxPoint( 8, 13 ), wxPoint( 3, 4 ), wxPoint( 1, 8 )};
/*******************//* Classe MARKER_BASE *//*******************/
void MARKER_BASE::init(){ m_MarkerType = 0; m_Color = RED; wxPoint start = MarkerShapeCorners[0]; wxPoint end = MarkerShapeCorners[0]; for( unsigned ii = 0; ii < CORNERS_COUNT; ii++ ) { wxPoint corner = MarkerShapeCorners[ii]; m_Corners.push_back( corner ); start.x = MIN( start.x, corner.x); start.y = MIN( start.y, corner.y); end.x = MAX( end.x, corner.x); end.y = MAX( end.y, corner.y); }
m_ShapeBoundingBox.SetOrigin(start); m_ShapeBoundingBox.SetEnd(end);}
MARKER_BASE::MARKER_BASE(){ m_ScalingFactor = M_SHAPE_SCALE; init();}
MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos, const wxString& aText, const wxPoint& aPos, const wxString& bText, const wxPoint& bPos ){ m_ScalingFactor = M_SHAPE_SCALE; init();
SetData( aErrorCode, aMarkerPos, aText, aPos, bText, bPos );}
MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos, const wxString& aText, const wxPoint& aPos ){ m_ScalingFactor = M_SHAPE_SCALE; init(); SetData( aErrorCode, aMarkerPos, aText, aPos );}
/* Effacement memoire de la structure */MARKER_BASE::~MARKER_BASE(){}
void MARKER_BASE::SetData( int aErrorCode, const wxPoint& aMarkerPos, const wxString& aText, const wxPoint& aPos, const wxString& bText, const wxPoint& bPos ){ m_Pos = aMarkerPos; m_drc.SetData( aErrorCode, aText, bText, aPos, bPos );}
void MARKER_BASE::SetData( int aErrorCode, const wxPoint& aMarkerPos, const wxString& aText, const wxPoint& aPos ){ m_Pos = aMarkerPos; m_drc.SetData( aErrorCode, aText, aPos );}
/******************************************************/bool MARKER_BASE::HitTestMarker( const wxPoint& refPos )/******************************************************/{ wxPoint rel_pos = refPos - m_Pos; rel_pos.x /= m_ScalingFactor; rel_pos.y /= m_ScalingFactor;
return m_ShapeBoundingBox.Inside(rel_pos);}
/**
* Function GetBoundingBoxMarker * returns the orthogonal, bounding box of this object for display purposes. * This box should be an enclosing perimeter for visible components of this * object, and the units should be in the pcb or schematic coordinate system. * It is OK to overestimate the size by a few counts. */EDA_Rect MARKER_BASE::GetBoundingBoxMarker(){ wxSize realsize = m_ShapeBoundingBox.GetSize(); wxPoint realposition = m_ShapeBoundingBox.GetPosition(); realsize.x *= m_ScalingFactor; realsize.y *= m_ScalingFactor; realposition.x *= m_ScalingFactor; realposition.y *= m_ScalingFactor; realposition += m_Pos; return EDA_Rect( m_Pos,realsize );}
/**********************************************************************/void MARKER_BASE::DrawMarker( WinEDA_DrawPanel* aPanel, wxDC* aDC, int aDrawMode, const wxPoint& aOffset )/**********************************************************************/
/** Function DrawMarker
* The shape is the polygon defined in m_Corners (array of wxPoints) */{ wxPoint corners[CORNERS_COUNT];
GRSetDrawMode( aDC, aDrawMode );
for( unsigned ii = 0; ii < m_Corners.size(); ii++ ) { corners[ii] = m_Corners[ii]; corners[ii].x *= m_ScalingFactor; corners[ii].y *= m_ScalingFactor; corners[ii] += m_Pos + aOffset; }
GRClosedPoly( &aPanel->m_ClipBox, aDC, CORNERS_COUNT, corners, true, // = Filled
0, // outline width
m_Color, // outline color
m_Color // fill collor
);}
/** Function DisplayMarkerInfo()
* Displays the full info of this marker, within an HTML window */void MARKER_BASE::DisplayMarkerInfo( WinEDA_DrawFrame* aFrame ){ wxString msg = m_drc.ShowHtml(); DIALOG_DISPLAY_HTML_TEXT_BASE infodisplay( (wxWindow*)aFrame, wxID_ANY, _("Marker Info"), wxGetMousePosition(), wxSize( 550, 140 ) );
infodisplay.m_htmlWindow->SetPage( msg ); infodisplay.ShowModal();}
|