Browse Source

Use maxError when converting bezier to polyline.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20312
pull/18/head
Jeff Young 7 months ago
parent
commit
e44c5a7fcd
  1. 5
      common/eda_shape.cpp
  2. 5
      eeschema/sch_shape.h
  3. 2
      include/eda_shape.h
  4. 9
      pcbnew/pcb_shape.cpp
  5. 2
      pcbnew/pcb_shape.h

5
common/eda_shape.cpp

@ -446,7 +446,8 @@ void EDA_SHAPE::SetLength( const double& aLength )
switch( m_shape ) switch( m_shape )
{ {
case SHAPE_T::SEGMENT: case SHAPE_T::SEGMENT:
m_segmentLength = aLength; break;
m_segmentLength = aLength;
break;
default: default:
UNIMPLEMENTED_FOR( SHAPE_T_asString() ); UNIMPLEMENTED_FOR( SHAPE_T_asString() );
@ -1830,7 +1831,7 @@ std::vector<SHAPE*> EDA_SHAPE::makeEffectiveShapes( bool aEdgeOnly, bool aLineCh
case SHAPE_T::BEZIER: case SHAPE_T::BEZIER:
{ {
std::vector<VECTOR2I> bezierPoints = buildBezierToSegmentsPointsList( width / 2 );
std::vector<VECTOR2I> bezierPoints = buildBezierToSegmentsPointsList( getMaxError() );
VECTOR2I start_pt = bezierPoints[0]; VECTOR2I start_pt = bezierPoints[0];
for( unsigned int jj = 1; jj < bezierPoints.size(); jj++ ) for( unsigned int jj = 1; jj < bezierPoints.size(); jj++ )

5
eeschema/sch_shape.h

@ -151,6 +151,11 @@ protected:
bool isMoving() const override { return IsMoving(); } bool isMoving() const override { return IsMoving(); }
int getMaxError() const override
{
return schIUScale.mmToIU( ARC_HIGH_DEF_MM );
}
/** /**
* @copydoc SCH_ITEM::compare() * @copydoc SCH_ITEM::compare()
* *

2
include/eda_shape.h

@ -489,6 +489,8 @@ protected:
// fixme: move to shape_compound // fixme: move to shape_compound
std::vector<SHAPE*> makeEffectiveShapes( bool aEdgeOnly, bool aLineChainOnly = false ) const; std::vector<SHAPE*> makeEffectiveShapes( bool aEdgeOnly, bool aLineChainOnly = false ) const;
virtual int getMaxError() const { return 100; }
protected: protected:
bool m_endsSwapped; // true if start/end were swapped e.g. SetArcAngleAndEnd bool m_endsSwapped; // true if start/end were swapped e.g. SetArcAngleAndEnd
SHAPE_T m_shape; // Shape: line, Circle, Arc SHAPE_T m_shape; // Shape: line, Circle, Arc

9
pcbnew/pcb_shape.cpp

@ -803,6 +803,15 @@ std::shared_ptr<SHAPE> PCB_SHAPE::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHI
} }
int PCB_SHAPE::getMaxError() const
{
if( const BOARD* board = GetBoard() )
return board->GetDesignSettings().m_MaxError;
return ARC_HIGH_DEF;
}
void PCB_SHAPE::swapData( BOARD_ITEM* aImage ) void PCB_SHAPE::swapData( BOARD_ITEM* aImage )
{ {
PCB_SHAPE* image = dynamic_cast<PCB_SHAPE*>( aImage ); PCB_SHAPE* image = dynamic_cast<PCB_SHAPE*>( aImage );

2
pcbnew/pcb_shape.h

@ -203,6 +203,8 @@ protected:
bool isMoving() const override { return IsMoving(); } bool isMoving() const override { return IsMoving(); }
int getMaxError() const override;
struct cmp_drawings struct cmp_drawings
{ {
bool operator()( const BOARD_ITEM* aFirst, const BOARD_ITEM* aSecond ) const; bool operator()( const BOARD_ITEM* aFirst, const BOARD_ITEM* aSecond ) const;

Loading…
Cancel
Save