classes MARKER rework: remove duplicate code. Better HitTest code (HitTest takes in account the actual shape)
This commit is contained in:
parent
15843ae01a
commit
83d851956c
|
@ -259,6 +259,12 @@ void CAIRO_GAL_BASE::DrawPolygon( const SHAPE_POLY_SET& aPolySet )
|
|||
}
|
||||
|
||||
|
||||
void CAIRO_GAL_BASE::DrawPolygon( const SHAPE_LINE_CHAIN& aPolygon )
|
||||
{
|
||||
drawPoly( aPolygon );
|
||||
}
|
||||
|
||||
|
||||
void CAIRO_GAL_BASE::DrawCurve( const VECTOR2D& aStartPoint, const VECTOR2D& aControlPointA,
|
||||
const VECTOR2D& aControlPointB, const VECTOR2D& aEndPoint )
|
||||
{
|
||||
|
|
|
@ -971,27 +971,33 @@ void OPENGL_GAL::DrawPolygon( const SHAPE_POLY_SET& aPolySet )
|
|||
for( int j = 0; j < aPolySet.OutlineCount(); ++j )
|
||||
{
|
||||
const SHAPE_LINE_CHAIN& outline = aPolySet.COutline( j );
|
||||
|
||||
if( outline.SegmentCount() == 0 )
|
||||
continue;
|
||||
|
||||
const int pointCount = outline.SegmentCount() + 1;
|
||||
std::unique_ptr<GLdouble[]> points( new GLdouble[3 * pointCount] );
|
||||
GLdouble* ptr = points.get();
|
||||
|
||||
for( int i = 0; i < pointCount; ++i )
|
||||
{
|
||||
const VECTOR2I& p = outline.CPoint( i );
|
||||
*ptr++ = p.x;
|
||||
*ptr++ = p.y;
|
||||
*ptr++ = layerDepth;
|
||||
}
|
||||
|
||||
drawPolygon( points.get(), pointCount );
|
||||
DrawPolygon( outline );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void OPENGL_GAL::DrawPolygon( const SHAPE_LINE_CHAIN& aPolygon )
|
||||
{
|
||||
if( aPolygon.SegmentCount() == 0 )
|
||||
return;
|
||||
|
||||
const int pointCount = aPolygon.SegmentCount() + 1;
|
||||
std::unique_ptr<GLdouble[]> points( new GLdouble[3 * pointCount] );
|
||||
GLdouble* ptr = points.get();
|
||||
|
||||
for( int i = 0; i < pointCount; ++i )
|
||||
{
|
||||
const VECTOR2I& p = aPolygon.CPoint( i );
|
||||
*ptr++ = p.x;
|
||||
*ptr++ = p.y;
|
||||
*ptr++ = layerDepth;
|
||||
}
|
||||
|
||||
drawPolygon( points.get(), pointCount );
|
||||
}
|
||||
|
||||
|
||||
void OPENGL_GAL::DrawCurve( const VECTOR2D& aStartPoint, const VECTOR2D& aControlPointA,
|
||||
const VECTOR2D& aControlPointB, const VECTOR2D& aEndPoint )
|
||||
{
|
||||
|
|
|
@ -31,11 +31,11 @@
|
|||
|
||||
|
||||
#include "fctsys.h"
|
||||
//#include "gr_basic.h"
|
||||
#include "base_screen.h"
|
||||
#include "common.h"
|
||||
#include "macros.h"
|
||||
#include "marker_base.h"
|
||||
#include <geometry/shape_line_chain.h>
|
||||
#include "dialog_display_info_HTML_base.h"
|
||||
|
||||
|
||||
|
@ -96,18 +96,18 @@ MARKER_BASE::MARKER_BASE( const MARKER_BASE& aMarker )
|
|||
}
|
||||
|
||||
|
||||
MARKER_BASE::MARKER_BASE()
|
||||
MARKER_BASE::MARKER_BASE( int aScalingFactor )
|
||||
{
|
||||
m_ScalingFactor = 1;
|
||||
m_ScalingFactor = aScalingFactor;
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
MARKER_BASE::MARKER_BASE( EDA_UNITS_T aUnits, int aErrorCode, const wxPoint& aMarkerPos,
|
||||
EDA_ITEM* aItem, const wxPoint& aPos,
|
||||
EDA_ITEM* bItem, const wxPoint& bPos )
|
||||
EDA_ITEM* bItem, const wxPoint& bPos, int aScalingFactor )
|
||||
{
|
||||
m_ScalingFactor = 1;
|
||||
m_ScalingFactor = aScalingFactor;
|
||||
init();
|
||||
|
||||
SetData( aUnits, aErrorCode, aMarkerPos, aItem, aPos, bItem, bPos );
|
||||
|
@ -116,9 +116,9 @@ MARKER_BASE::MARKER_BASE( EDA_UNITS_T aUnits, int aErrorCode, const wxPoint& aMa
|
|||
|
||||
MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
|
||||
const wxString& aText, const wxPoint& aPos,
|
||||
const wxString& bText, const wxPoint& bPos )
|
||||
const wxString& bText, const wxPoint& bPos, int aScalingFactor )
|
||||
{
|
||||
m_ScalingFactor = 1;
|
||||
m_ScalingFactor = aScalingFactor;
|
||||
init();
|
||||
|
||||
SetData( aErrorCode, aMarkerPos, aText, aPos, bText, bPos );
|
||||
|
@ -126,9 +126,9 @@ MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
|
|||
|
||||
|
||||
MARKER_BASE::MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
|
||||
const wxString& aText, const wxPoint& aPos )
|
||||
const wxString& aText, const wxPoint& aPos, int aScalingFactor )
|
||||
{
|
||||
m_ScalingFactor = 1;
|
||||
m_ScalingFactor = aScalingFactor;
|
||||
init();
|
||||
|
||||
SetData( aErrorCode, aMarkerPos, aText, aPos );
|
||||
|
@ -164,7 +164,31 @@ bool MARKER_BASE::HitTestMarker( const wxPoint& aHitPosition ) const
|
|||
{
|
||||
EDA_RECT bbox = GetBoundingBoxMarker();
|
||||
|
||||
return bbox.Contains( aHitPosition );
|
||||
// Fast hit test using boundary box. A finer test will be made if requested
|
||||
bool hit = bbox.Contains( aHitPosition );
|
||||
|
||||
if( hit ) // Fine test
|
||||
{
|
||||
SHAPE_LINE_CHAIN polygon;
|
||||
ShapeToPolygon( polygon );
|
||||
VECTOR2I rel_pos( aHitPosition - m_Pos );
|
||||
hit = polygon.PointInside( rel_pos );
|
||||
}
|
||||
|
||||
return hit;
|
||||
}
|
||||
|
||||
|
||||
void MARKER_BASE::ShapeToPolygon( SHAPE_LINE_CHAIN& aPolygon) const
|
||||
{
|
||||
// Build the marker shape polygon in internal units:
|
||||
const int ccount = GetShapePolygonCornerCount();
|
||||
|
||||
for( int ii = 0; ii < ccount; ii++ )
|
||||
aPolygon.Append( GetShapePolygonCorner( ii ) * MarkerScale() );
|
||||
|
||||
// Be sure aPolygon is seen as a closed polyline:
|
||||
aPolygon.SetClosed( true );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -41,17 +41,15 @@
|
|||
#define SCALING_FACTOR Millimeter2iu( 0.1 )
|
||||
|
||||
|
||||
SCH_MARKER::SCH_MARKER() : SCH_ITEM( NULL, SCH_MARKER_T ), MARKER_BASE()
|
||||
SCH_MARKER::SCH_MARKER() : SCH_ITEM( NULL, SCH_MARKER_T ), MARKER_BASE( SCALING_FACTOR )
|
||||
{
|
||||
m_ScalingFactor = SCALING_FACTOR;
|
||||
}
|
||||
|
||||
|
||||
SCH_MARKER::SCH_MARKER( const wxPoint& pos, const wxString& text ) :
|
||||
SCH_ITEM( NULL, SCH_MARKER_T ),
|
||||
MARKER_BASE( 0, pos, text, pos )
|
||||
MARKER_BASE( 0, pos, text, pos, SCALING_FACTOR )
|
||||
{
|
||||
m_ScalingFactor = SCALING_FACTOR;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
/*
|
||||
/**
|
||||
* @file sch_marker.h
|
||||
* @brief SCH_MARKER class definition.
|
||||
*/
|
||||
|
@ -34,10 +34,6 @@
|
|||
#include <marker_base.h>
|
||||
|
||||
|
||||
/* Names for corresponding types of markers: */
|
||||
extern const wxChar* NameMarqueurType[];
|
||||
|
||||
|
||||
class SCH_MARKER : public SCH_ITEM, public MARKER_BASE
|
||||
{
|
||||
public:
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#include <view/view.h>
|
||||
#include <gal/graphics_abstraction_layer.h>
|
||||
#include <colors_design_settings.h>
|
||||
#include <geometry/shape_line_chain.h>
|
||||
|
||||
#include "sch_painter.h"
|
||||
|
||||
|
@ -1364,16 +1365,8 @@ void SCH_PAINTER::draw( SCH_BITMAP *aBitmap, int aLayer )
|
|||
|
||||
void SCH_PAINTER::draw( SCH_MARKER *aMarker, int aLayer )
|
||||
{
|
||||
const int scale = aMarker->MarkerScale();
|
||||
|
||||
// Build the marker shape polygon in internal units:
|
||||
const int ccount = aMarker->GetShapePolygonCornerCount();
|
||||
std::vector<VECTOR2D> arrow;
|
||||
arrow.reserve( ccount );
|
||||
|
||||
for( int ii = 0; ii < ccount; ii++ )
|
||||
arrow.push_back( VECTOR2D( aMarker->GetShapePolygonCorner( ii ).x * scale,
|
||||
aMarker->GetShapePolygonCorner( ii ).y * scale ) );
|
||||
SHAPE_LINE_CHAIN polygon;
|
||||
aMarker->ShapeToPolygon( polygon );
|
||||
|
||||
COLOR4D color = m_schSettings.GetLayerColor( LAYER_ERC_WARN );
|
||||
|
||||
|
@ -1385,7 +1378,7 @@ void SCH_PAINTER::draw( SCH_MARKER *aMarker, int aLayer )
|
|||
m_gal->SetFillColor( color );
|
||||
m_gal->SetIsFill( true );
|
||||
m_gal->SetIsStroke( false );
|
||||
m_gal->DrawPolygon( &arrow[0], arrow.size() );
|
||||
m_gal->DrawPolygon( polygon );
|
||||
m_gal->Restore();
|
||||
}
|
||||
|
||||
|
|
|
@ -107,6 +107,7 @@ public:
|
|||
virtual void DrawPolygon( const std::deque<VECTOR2D>& aPointList ) override { drawPoly( aPointList ); }
|
||||
virtual void DrawPolygon( const VECTOR2D aPointList[], int aListSize ) override { drawPoly( aPointList, aListSize ); }
|
||||
virtual void DrawPolygon( const SHAPE_POLY_SET& aPolySet ) override;
|
||||
virtual void DrawPolygon( const SHAPE_LINE_CHAIN& aPolySet ) override;
|
||||
|
||||
/// @copydoc GAL::DrawCurve()
|
||||
virtual void DrawCurve( const VECTOR2D& startPoint, const VECTOR2D& controlPointA,
|
||||
|
|
|
@ -168,6 +168,7 @@ public:
|
|||
virtual void DrawPolygon( const std::deque<VECTOR2D>& aPointList ) {};
|
||||
virtual void DrawPolygon( const VECTOR2D aPointList[], int aListSize ) {};
|
||||
virtual void DrawPolygon( const SHAPE_POLY_SET& aPolySet ) {};
|
||||
virtual void DrawPolygon( const SHAPE_LINE_CHAIN& aPolySet ) {};
|
||||
|
||||
/**
|
||||
* @brief Draw a cubic bezier spline.
|
||||
|
|
|
@ -135,6 +135,7 @@ public:
|
|||
virtual void DrawPolygon( const std::deque<VECTOR2D>& aPointList ) override;
|
||||
virtual void DrawPolygon( const VECTOR2D aPointList[], int aListSize ) override;
|
||||
virtual void DrawPolygon( const SHAPE_POLY_SET& aPolySet ) override;
|
||||
virtual void DrawPolygon( const SHAPE_LINE_CHAIN& aPolySet ) override;
|
||||
|
||||
/// @copydoc GAL::DrawCurve()
|
||||
virtual void DrawCurve( const VECTOR2D& startPoint, const VECTOR2D& controlPointA,
|
||||
|
|
|
@ -548,8 +548,8 @@ public:
|
|||
/**
|
||||
* Function PointInside()
|
||||
*
|
||||
* Checks if point aP lies inside a polygon (any type) defined by the line chain. For closed
|
||||
* shapes only.
|
||||
* Checks if point aP lies inside a polygon (any type) defined by the line chain.
|
||||
* For closed shapes only.
|
||||
* @param aP point to check
|
||||
* @return true if the point is inside the shape (edge is not treated as being inside).
|
||||
*/
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include <drc_item.h>
|
||||
#include <gr_basic.h>
|
||||
#include <eda_rect.h>
|
||||
|
||||
class SHAPE_LINE_CHAIN;
|
||||
|
||||
/* Marker are mainly used to show a DRC or ERC error or warning
|
||||
*/
|
||||
|
@ -67,7 +67,7 @@ protected:
|
|||
|
||||
public:
|
||||
|
||||
MARKER_BASE();
|
||||
MARKER_BASE( int aScalingFactor );
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
|
@ -77,10 +77,11 @@ public:
|
|||
* @param aPos The position of the first of two objects
|
||||
* @param bItem The second of the two conflicting objects
|
||||
* @param bPos The position of the second of two objects
|
||||
* @param aScalingFactor the scaling factor to convert the shape coordinates to IU coordinates
|
||||
*/
|
||||
MARKER_BASE( EDA_UNITS_T aUnits, int aErrorCode, const wxPoint& aMarkerPos,
|
||||
EDA_ITEM* aItem, const wxPoint& aPos,
|
||||
EDA_ITEM* bItem, const wxPoint& bPos );
|
||||
EDA_ITEM* bItem, const wxPoint& bPos, int aScalingFactor );
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
|
@ -90,10 +91,11 @@ public:
|
|||
* @param aPos The position of the first of two objects
|
||||
* @param bText Text describing the second of the two conflicting objects
|
||||
* @param bPos The position of the second of two objects
|
||||
* @param aScalingFactor the scaling factor to convert the shape coordinates to IU coordinates
|
||||
*/
|
||||
MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
|
||||
const wxString& aText, const wxPoint& aPos,
|
||||
const wxString& bText, const wxPoint& bPos );
|
||||
const wxString& bText, const wxPoint& bPos, int aScalingFactor );
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
|
@ -101,9 +103,10 @@ public:
|
|||
* @param aMarkerPos The position of the MARKER on the BOARD
|
||||
* @param aText Text describing the object
|
||||
* @param aPos The position of the object
|
||||
* @param aScalingFactor the scaling factor to convert the shape coordinates to IU coordinates
|
||||
*/
|
||||
MARKER_BASE( int aErrorCode, const wxPoint& aMarkerPos,
|
||||
const wxString& aText, const wxPoint& aPos );
|
||||
const wxString& aText, const wxPoint& aPos, int aScalingFactor );
|
||||
|
||||
/**
|
||||
* Contructor
|
||||
|
@ -119,7 +122,13 @@ public:
|
|||
*/
|
||||
int MarkerScale() const { return m_ScalingFactor; }
|
||||
|
||||
/** @return the shape polygon corners list
|
||||
/** Returns the shape polygon in internal units in a SHAPE_LINE_CHAIN
|
||||
* the coordinates are relatives to the marker position (are not absolute)
|
||||
* @param aPolygon is the SHAPE_LINE_CHAIN to fill with the shape
|
||||
*/
|
||||
void ShapeToPolygon( SHAPE_LINE_CHAIN& aPolygon) const;
|
||||
|
||||
/** @return the shape corner list
|
||||
*/
|
||||
const VECTOR2I* GetShapePolygon() const;
|
||||
|
||||
|
|
|
@ -46,10 +46,9 @@
|
|||
|
||||
MARKER_PCB::MARKER_PCB( BOARD_ITEM* aParent ) :
|
||||
BOARD_ITEM( aParent, PCB_MARKER_T ),
|
||||
MARKER_BASE(), m_item( nullptr )
|
||||
MARKER_BASE( SCALING_FACTOR ), m_item( nullptr )
|
||||
{
|
||||
m_Color = WHITE;
|
||||
m_ScalingFactor = SCALING_FACTOR;
|
||||
}
|
||||
|
||||
|
||||
|
@ -57,10 +56,9 @@ MARKER_PCB::MARKER_PCB( EDA_UNITS_T aUnits, int aErrorCode, const wxPoint& aMark
|
|||
BOARD_ITEM* aItem, const wxPoint& aPos,
|
||||
BOARD_ITEM* bItem, const wxPoint& bPos ) :
|
||||
BOARD_ITEM( nullptr, PCB_MARKER_T ), // parent set during BOARD::Add()
|
||||
MARKER_BASE( aUnits, aErrorCode, aMarkerPos, aItem, aPos, bItem, bPos ), m_item( nullptr )
|
||||
MARKER_BASE( aUnits, aErrorCode, aMarkerPos, aItem, aPos, bItem, bPos, SCALING_FACTOR ), m_item( nullptr )
|
||||
{
|
||||
m_Color = WHITE;
|
||||
m_ScalingFactor = SCALING_FACTOR;
|
||||
}
|
||||
|
||||
|
||||
|
@ -68,10 +66,9 @@ MARKER_PCB::MARKER_PCB( int aErrorCode, const wxPoint& aMarkerPos,
|
|||
const wxString& aText, const wxPoint& aPos,
|
||||
const wxString& bText, const wxPoint& bPos ) :
|
||||
BOARD_ITEM( nullptr, PCB_MARKER_T ), // parent set during BOARD::Add()
|
||||
MARKER_BASE( aErrorCode, aMarkerPos, aText, aPos, bText, bPos ), m_item( nullptr )
|
||||
MARKER_BASE( aErrorCode, aMarkerPos, aText, aPos, bText, bPos, SCALING_FACTOR ), m_item( nullptr )
|
||||
{
|
||||
m_Color = WHITE;
|
||||
m_ScalingFactor = SCALING_FACTOR;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
|
||||
#include <gal/graphics_abstraction_layer.h>
|
||||
#include <convert_basic_shapes_to_polygon.h>
|
||||
#include <geometry/shape_line_chain.h>
|
||||
|
||||
using namespace KIGFX;
|
||||
|
||||
|
@ -1243,16 +1244,8 @@ void PCB_PAINTER::draw( const PCB_TARGET* aTarget )
|
|||
|
||||
void PCB_PAINTER::draw( const MARKER_PCB* aMarker )
|
||||
{
|
||||
const int scale = aMarker->MarkerScale();
|
||||
|
||||
// Build the marker shape polygon in internal units:
|
||||
const int ccount = aMarker->GetShapePolygonCornerCount();
|
||||
std::vector<VECTOR2D> arrow;
|
||||
arrow.reserve( ccount );
|
||||
|
||||
for( int ii = 0; ii < ccount; ii++ )
|
||||
arrow.push_back( VECTOR2D( aMarker->GetShapePolygonCorner( ii ).x * scale,
|
||||
aMarker->GetShapePolygonCorner( ii ).y * scale ) );
|
||||
SHAPE_LINE_CHAIN polygon;
|
||||
aMarker->ShapeToPolygon( polygon );
|
||||
|
||||
auto strokeColor = m_pcbSettings.GetColor( aMarker, LAYER_DRC );
|
||||
|
||||
|
@ -1261,7 +1254,7 @@ void PCB_PAINTER::draw( const MARKER_PCB* aMarker )
|
|||
m_gal->SetFillColor( strokeColor );
|
||||
m_gal->SetIsFill( true );
|
||||
m_gal->SetIsStroke( false );
|
||||
m_gal->DrawPolygon( &arrow[0], arrow.size() );
|
||||
m_gal->DrawPolygon( polygon );
|
||||
m_gal->Restore();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue