More support of DRW_SEGMENT Bezier curve (support in 3D viewer, and PnS router).
This commit is contained in:
parent
e58e5966dc
commit
3c6e8c4a40
|
@ -821,6 +821,7 @@ void CINFO3D_VISU::AddShapeWithClearanceToContainer( const DRAWSEGMENT* aDrawSeg
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case S_CURVE:
|
||||||
case S_POLYGON:
|
case S_POLYGON:
|
||||||
{
|
{
|
||||||
const int segcountforcircle = 16;
|
const int segcountforcircle = 16;
|
||||||
|
@ -843,9 +844,6 @@ void CINFO3D_VISU::AddShapeWithClearanceToContainer( const DRAWSEGMENT* aDrawSeg
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_CURVE: // Bezier curve (not yet in use in KiCad)
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -264,6 +264,23 @@ bool ConvertOutlineToPolygon( std::vector<DRAWSEGMENT*>& aSegList, SHAPE_POLY_SE
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case S_CURVE:
|
||||||
|
{
|
||||||
|
graphic->RebuildBezierToSegmentsPointsList( graphic->GetWidth() );
|
||||||
|
|
||||||
|
for( unsigned int jj = 0; jj < graphic->GetBezierPoints().size(); jj++ )
|
||||||
|
{
|
||||||
|
wxPoint pt = graphic->GetBezierPoints()[jj];
|
||||||
|
|
||||||
|
if( pt.x < xmin.x )
|
||||||
|
{
|
||||||
|
xmin = pt;
|
||||||
|
xmini = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -295,7 +312,7 @@ bool ConvertOutlineToPolygon( std::vector<DRAWSEGMENT*>& aSegList, SHAPE_POLY_SE
|
||||||
aPolygons.Append( prevPt );
|
aPolygons.Append( prevPt );
|
||||||
|
|
||||||
// Do not append the other end point yet of this 'graphic', this first
|
// Do not append the other end point yet of this 'graphic', this first
|
||||||
// 'graphic' might be an arc.
|
// 'graphic' might be an arc or a curve.
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
@ -354,6 +371,43 @@ bool ConvertOutlineToPolygon( std::vector<DRAWSEGMENT*>& aSegList, SHAPE_POLY_SE
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case S_CURVE:
|
||||||
|
// We do not support Bezier curves in polygons, so approximate
|
||||||
|
// with a series of short lines and put those
|
||||||
|
// line segments into the !same! PATH.
|
||||||
|
{
|
||||||
|
wxPoint nextPt;
|
||||||
|
bool reverse = false;
|
||||||
|
|
||||||
|
// Use the end point furthest away from
|
||||||
|
// prevPt as we assume the other end to be ON prevPt or
|
||||||
|
// very close to it.
|
||||||
|
|
||||||
|
if( close_st( prevPt, graphic->GetStart(), graphic->GetEnd() ) )
|
||||||
|
nextPt = graphic->GetEnd();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nextPt = graphic->GetStart();
|
||||||
|
reverse = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( reverse )
|
||||||
|
{
|
||||||
|
for( int jj = graphic->GetBezierPoints().size()-1;
|
||||||
|
jj >= 0; jj-- )
|
||||||
|
aPolygons.Append( graphic->GetBezierPoints()[jj] );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for( unsigned int jj = 0;
|
||||||
|
jj < graphic->GetBezierPoints().size(); jj++ )
|
||||||
|
aPolygons.Append( graphic->GetBezierPoints()[jj] );
|
||||||
|
}
|
||||||
|
|
||||||
|
prevPt = nextPt;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if( aErrorText )
|
if( aErrorText )
|
||||||
{
|
{
|
||||||
|
@ -499,6 +553,42 @@ bool ConvertOutlineToPolygon( std::vector<DRAWSEGMENT*>& aSegList, SHAPE_POLY_SE
|
||||||
|
|
||||||
prevPt = nextPt;
|
prevPt = nextPt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case S_CURVE:
|
||||||
|
// We do not support Bezier curves in polygons, so approximate
|
||||||
|
// with a series of short lines and put those
|
||||||
|
// line segments into the !same! PATH.
|
||||||
|
{
|
||||||
|
wxPoint nextPt;
|
||||||
|
bool reverse = false;
|
||||||
|
|
||||||
|
// Use the end point furthest away from
|
||||||
|
// prevPt as we assume the other end to be ON prevPt or
|
||||||
|
// very close to it.
|
||||||
|
|
||||||
|
if( close_st( prevPt, graphic->GetStart(), graphic->GetEnd() ) )
|
||||||
|
nextPt = graphic->GetEnd();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nextPt = graphic->GetStart();
|
||||||
|
reverse = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( reverse )
|
||||||
|
{
|
||||||
|
for( int jj = graphic->GetBezierPoints().size()-1;
|
||||||
|
jj >= 0; jj-- )
|
||||||
|
aPolygons.Append( graphic->GetBezierPoints()[jj], -1, hole );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for( unsigned int jj = 0;
|
||||||
|
jj < graphic->GetBezierPoints().size(); jj++ )
|
||||||
|
aPolygons.Append( graphic->GetBezierPoints()[jj], -1, hole );
|
||||||
|
}
|
||||||
|
|
||||||
|
prevPt = nextPt;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -891,6 +891,22 @@ bool PNS_KICAD_IFACE::syncGraphicalItem( PNS::NODE* aWorld, DRAWSEGMENT* aItem )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case S_CURVE:
|
||||||
|
{
|
||||||
|
aItem->RebuildBezierToSegmentsPointsList( aItem->GetWidth() );
|
||||||
|
wxPoint start_pt = aItem->GetBezierPoints()[0];
|
||||||
|
|
||||||
|
for( unsigned int jj = 1; jj < aItem->GetBezierPoints().size(); jj++ )
|
||||||
|
{
|
||||||
|
wxPoint end_pt = aItem->GetBezierPoints()[jj];
|
||||||
|
SHAPE_SEGMENT *seg = new SHAPE_SEGMENT(
|
||||||
|
VECTOR2I( start_pt ), VECTOR2I( end_pt ), aItem->GetWidth() );
|
||||||
|
segs.push_back( seg );
|
||||||
|
start_pt = end_pt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue