|
|
/**
* @file class_marker_base.cpp * @brief Implementation of MARKER_BASE class. * Markers are used to show something (usually a drc/erc problem). * Markers in Pcbnew and Eeschema are derived from this base 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
* actual 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 = std::min( start.x, corner.x); start.y = std::min( start.y, corner.y); end.x = std::max( end.x, corner.x); end.y = std::max( end.y, corner.y); }
m_ShapeBoundingBox.SetOrigin(start); m_ShapeBoundingBox.SetEnd(end);}
MARKER_BASE::MARKER_BASE( const MARKER_BASE& aMarker ){ m_Pos = aMarker.m_Pos; m_Corners = aMarker.m_Corners; m_MarkerType = aMarker.m_MarkerType; m_Color = aMarker.m_Color; m_ShapeBoundingBox = aMarker.m_ShapeBoundingBox; m_ScalingFactor = aMarker.m_ScalingFactor;}
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 );}
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 ) const{ wxPoint rel_pos = refPos - m_Pos; rel_pos.x /= m_ScalingFactor; rel_pos.y /= m_ScalingFactor;
return m_ShapeBoundingBox.Contains( rel_pos );}
EDA_RECT MARKER_BASE::GetBoundingBoxMarker() const{ 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( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, const wxPoint& aOffset ){ 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->GetClipBox(), aDC, CORNERS_COUNT, corners, true, // = Filled
0, // outline width
m_Color, // outline color
m_Color // fill collor
);}
void MARKER_BASE::DisplayMarkerInfo( EDA_DRAW_FRAME* 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();}
|