Code cleaning and better comments.

Gebview: fix issue in export to pcbnew (Track arc shapes are now exported, approximated by segments)
This commit is contained in:
jean-pierre charras 2012-01-13 19:35:46 +01:00
parent 5a9fcf6f11
commit 3383d6c8a5
4 changed files with 69 additions and 96 deletions

View File

@ -326,35 +326,35 @@ void GBR_TO_PCB_EXPORTER::export_segline_copper_item( GERBER_DRAW_ITEM* aGbrItem
void GBR_TO_PCB_EXPORTER::export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem, int aLayer )
{
#if 0 // TODO: does not work in all cases, so needs some work
double a = atan2( (double)( aGbrItem->m_Start.y - aGbrItem->m_ArcCentre.y ),
(double)( aGbrItem->m_Start.x - aGbrItem->m_ArcCentre.x ) );
double b = atan2( (double)( aGbrItem->m_End.y - aGbrItem->m_ArcCentre.y ),
(double)( aGbrItem->m_End.x - aGbrItem->m_ArcCentre.x ) );
int arc_angle = wxRound( ( (a - b) / M_PI * 1800.0 ) );
wxPoint start = aGbrItem->m_Start;
wxPoint end = aGbrItem->m_End;
/* Because Pcbnew does not know arcs in tracks,
* approximate arc by segments (16 segment per 360 deg)
* approximate arc by segments (SEG_COUNT__CIRCLE segment per 360 deg)
* The arc is drawn in an anticlockwise direction from the start point to the end point.
*/
#define DELTA 3600/16
#define SEG_COUNT_CIRCLE 16
#define DELTA_ANGLE 2*M_PI/SEG_COUNT_CIRCLE
if( arc_angle < 0 )
{
NEGATE( arc_angle );
EXCHG( start, end );
}
// calculate the number of segments from a to b.
// we want CNT_PER_360 segments fo a circle
if( a > b )
b += 2*M_PI;
wxPoint curr_start = start;
for( int rot = DELTA; rot < (arc_angle - DELTA); rot += DELTA )
int ii = 1;
for( double rot = a; rot < (b - DELTA_ANGLE); rot += DELTA_ANGLE, ii++ )
{
TRACK * newtrack = new TRACK( m_pcb );
newtrack->SetLayer( aLayer );
newtrack->m_Start = curr_start;
wxPoint curr_end = start;
RotatePoint( &curr_end, aGbrItem->m_ArcCentre, rot );
RotatePoint( &curr_end, aGbrItem->m_ArcCentre, -(int)(DELTA_ANGLE * ii * 1800 / M_PI) );
newtrack->m_End = curr_end;
newtrack->m_Width = aGbrItem->m_Size.x;
// Reverse Y axis:
@ -376,7 +376,6 @@ void GBR_TO_PCB_EXPORTER::export_segarc_copper_item( GERBER_DRAW_ITEM* aGbrItem,
NEGATE( newtrack->m_End.y );
m_pcb->Add( newtrack );
}
#endif
}

View File

@ -320,7 +320,7 @@ int BOARD::ClipAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList,
//** if( test == 1 )
{
std::vector<CPolyLine*>* pa = new std::vector<CPolyLine*>;
curr_polygon->Undraw();
curr_polygon->UnHatch();
int n_poly = aCurrArea->m_Poly->NormalizeAreaOutlines( pa, bRetainArcs );
// i.e if clipping has created some polygons, we must add these new copper areas.
@ -339,12 +339,12 @@ int BOARD::ClipAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList,
// and replace it with a poly from NormalizeAreaOutlines
delete NewArea->m_Poly;
NewArea->m_Poly = new_p;
NewArea->m_Poly->Draw();
NewArea->m_Poly->Hatch();
NewArea->utility = 1;
}
}
curr_polygon->Draw();
curr_polygon->Hatch();
delete pa;
}
@ -901,7 +901,7 @@ int BOARD::CombineAreas( PICKED_ITEMS_LIST* aDeletedList, ZONE_CONTAINER* area_r
area_ref->utility = 1;
area_ref->m_Poly->RestoreArcs( &arc_array1 );
area_ref->m_Poly->RestoreArcs( &arc_array2 );
area_ref->m_Poly->Draw();
area_ref->m_Poly->Hatch();
delete booleng;
return 1;
}

View File

@ -5,12 +5,12 @@
//
#include <math.h>
#include <vector>
#include <algorithm>
#include "fctsys.h"
#include "config.h"
#include "config.h" // to define KICAD_NANOMETRE
#include "PolyLine.h"
#include "gr_basic.h"
#include "bezier_curves.h"
#include "polygon_test_point_inside.h"
@ -44,7 +44,7 @@ CPolyLine::CPolyLine()
//
CPolyLine::~CPolyLine()
{
Undraw();
UnHatch();
if( m_Kbool_Poly_Engine )
delete m_Kbool_Poly_Engine;
}
@ -81,7 +81,7 @@ int CPolyLine::NormalizeWithKbool( std::vector<CPolyLine*> * aExtraPolyList, boo
else
MakeKboolPoly( -1, -1, NULL );
Undraw();
UnHatch();
/* now, recreate polys
* if more than one outside contour are found, extra CPolyLines will be created
@ -649,7 +649,7 @@ int CPolyLine::RestoreArcs( std::vector<CArc> * arc_array, std::vector<CPolyLine
poly = this;
else
poly = (*pa)[ip - 1];
poly->Undraw();
poly->UnHatch();
for( int ic = 0; ic<poly->GetNumCorners(); ic++ )
poly->SetUtility( ic, 0 );
@ -805,7 +805,7 @@ void CPolyLine::Start( int layer, int x, int y, int hatch )
//
void CPolyLine::AppendCorner( int x, int y, int style, bool bDraw )
{
Undraw();
UnHatch();
CPolyPt poly_pt( x, y );
poly_pt.end_contour = FALSE;
@ -815,7 +815,7 @@ void CPolyLine::AppendCorner( int x, int y, int style, bool bDraw )
if( corner.size() > 0 && !corner[corner.size() - 1].end_contour )
side_style[corner.size() - 1] = style;
if( bDraw )
Draw();
Hatch();
}
@ -827,11 +827,11 @@ void CPolyLine::Close( int style, bool bDraw )
{
wxASSERT( 0 );
}
Undraw();
UnHatch();
side_style[corner.size() - 1] = style;
corner[corner.size() - 1].end_contour = TRUE;
if( bDraw )
Draw();
Hatch();
}
@ -839,10 +839,10 @@ void CPolyLine::Close( int style, bool bDraw )
//
void CPolyLine::MoveCorner( int ic, int x, int y )
{
Undraw();
UnHatch();
corner[ic].x = x;
corner[ic].y = y;
Draw();
Hatch();
}
@ -850,7 +850,7 @@ void CPolyLine::MoveCorner( int ic, int x, int y )
//
void CPolyLine::DeleteCorner( int ic, bool bDraw )
{
Undraw();
UnHatch();
int icont = GetContour( ic );
int istart = GetContourStart( icont );
int iend = GetContourEnd( icont );
@ -878,7 +878,7 @@ void CPolyLine::DeleteCorner( int ic, bool bDraw )
RemoveContour( icont );
}
if( bDraw )
Draw();
Hatch();
}
@ -892,7 +892,7 @@ void CPolyLine::RemoveContour( int icont )
* remove a contour only if there is more than 1 contour
*/
{
Undraw();
UnHatch();
int istart = GetContourStart( icont );
int iend = GetContourEnd( icont );
@ -916,7 +916,7 @@ void CPolyLine::RemoveContour( int icont )
side_style.erase( side_style.begin() + ic );
}
}
Draw();
Hatch();
}
@ -1140,7 +1140,7 @@ void CPolyLine::RemoveAllContours( void )
*/
void CPolyLine::InsertCorner( int ic, int x, int y )
{
Undraw();
UnHatch();
if( (unsigned) (ic) >= corner.size() )
{
corner.push_back( CPolyPt( x, y ) );
@ -1160,31 +1160,15 @@ void CPolyLine::InsertCorner( int ic, int x, int y )
corner[ic].end_contour = FALSE;
}
}
Draw();
Hatch();
}
// undraw polyline by removing all graphic elements from display list
//
void CPolyLine::Undraw()
void CPolyLine::UnHatch()
{
m_HatchLines.clear();
bDrawn = FALSE;
}
// draw polyline by adding all graphics to display list
// if side style is ARC_CW or ARC_CCW but endpoints are not angled,
// convert to STRAIGHT
//
void CPolyLine::Draw()
{
// first, undraw if necessary
if( bDrawn )
Undraw();
Hatch();
bDrawn = TRUE;
}
@ -1226,10 +1210,10 @@ CRect CPolyLine::GetCornerBounds()
r.right = r.top = INT_MIN;
for( unsigned i = 0; i<corner.size(); i++ )
{
r.left = MIN( r.left, corner[i].x );
r.right = MAX( r.right, corner[i].x );
r.bottom = MIN( r.bottom, corner[i].y );
r.top = MAX( r.top, corner[i].y );
r.left = min( r.left, corner[i].x );
r.right = max( r.right, corner[i].x );
r.bottom = min( r.bottom, corner[i].y );
r.top = max( r.top, corner[i].y );
}
return r;
@ -1355,7 +1339,7 @@ int CPolyLine::GetContourSize( int icont )
void CPolyLine::SetSideStyle( int is, int style )
{
Undraw();
UnHatch();
CPoint p1, p2;
if( is == (int) (corner.size() - 1) )
{
@ -1375,7 +1359,7 @@ void CPolyLine::SetSideStyle( int is, int style )
side_style[is] = STRAIGHT;
else
side_style[is] = style;
Draw();
Hatch();
}
@ -1394,8 +1378,13 @@ int CPolyLine::GetClosed()
}
// draw hatch lines
// Creates hatch lines inside the outline of the complex polygon
//
// sort function used in ::Hatch to sort points by descending CPoint.x values
bool sort_ends_by_descending_X( const CPoint& ref, const CPoint& tst )
{
return tst.x < ref.x;
}
void CPolyLine::Hatch()
{
m_HatchLines.clear();
@ -1468,7 +1457,8 @@ void CPolyLine::Hatch()
// get intersection points for this hatch line
// Note: because we should have an even number of intersections with the
// current hatch line and the zone outline, if we have an odd count if found
// current hatch line and the zone outline (a closed polygon,
// or a set of closed polygons), if an odd count is found
// we skip this line (should not occur)
pointbuffer.clear();
int i_start_contour = 0;
@ -1512,34 +1502,19 @@ void CPolyLine::Hatch()
}
// ensure we have found an even intersection points count
// because a segment has 2 points.
// because intersections are the ends of segments
// inside the polygon(s) and a segment has 2 ends.
// if not, this is a strange case (a bug ?) so skip this hatch
if( pointbuffer.size() % 2 != 0 )
continue;
// sort points in order of descending x (if more than 2)
// sort points in order of descending x (if more than 2) to
// ensure the starting point and the ending point of the same segment
// are stored one just after the other.
if( pointbuffer.size() > 2 )
{
for( unsigned istart = 0; istart < (pointbuffer.size() - 1); istart++ )
{
int max_x = INT_MIN;
int imax = INT_MIN;
for( unsigned i = istart; i < pointbuffer.size(); i++ )
{
if( pointbuffer[i].x > max_x )
{
max_x = pointbuffer[i].x;
imax = i;
}
}
sort( pointbuffer.begin(), pointbuffer.end(), sort_ends_by_descending_X );
CPoint temp = pointbuffer[istart];
pointbuffer[istart] = pointbuffer[imax];
pointbuffer[imax] = temp;
}
}
// creates lines
// creates lines or short segments inside the complex polygon
for( unsigned ip = 0; ip < pointbuffer.size(); ip += 2 )
{
double dx = pointbuffer[ip + 1].x - pointbuffer[ip].x;
@ -1609,7 +1584,7 @@ bool CPolyLine::TestPointInside( int px, int py )
//
void CPolyLine::Copy( CPolyLine* src )
{
Undraw();
UnHatch();
m_HatchStyle = src->m_HatchStyle;
// copy corners, using vector copy
corner = src->corner;
@ -1636,19 +1611,19 @@ bool CPolyLine::IsCutoutContour( int icont )
void CPolyLine::MoveOrigin( int x_off, int y_off )
{
Undraw();
UnHatch();
for( int ic = 0; ic < GetNumCorners(); ic++ )
{
SetX( ic, GetX( ic ) + x_off );
SetY( ic, GetY( ic ) + y_off );
}
Draw();
Hatch();
}
// Set various parameters:
// the calling function should Undraw() before calling them,
// the calling function should UnHatch() before calling them,
// and Draw() after
//
void CPolyLine::SetX( int ic, int x )

View File

@ -140,10 +140,11 @@ public:
void RemoveAllContours( void );
// drawing functions
void Undraw();
void Draw();
// Remove or create hatch
void UnHatch();
void Hatch();
// Transform functions
void MoveOrigin( int x_off, int y_off );
// misc. functions
@ -174,7 +175,7 @@ public:
int GetSideStyle( int is );
int GetHatchStyle() { return m_HatchStyle; }
void SetHatch( int hatch ) { Undraw(); m_HatchStyle = hatch; Draw(); };
void SetHatch( int hatch ) { m_HatchStyle = hatch; Hatch(); };
void SetX( int ic, int x );
void SetY( int ic, int y );
void SetEndContour( int ic, bool end_contour );
@ -246,24 +247,22 @@ public:
*/
void FreeKboolEngine( ) { delete m_Kbool_Poly_Engine; m_Kbool_Poly_Engine = NULL; }
// Bezier Support
void AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3);
void AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
private:
int m_layer; // layer to draw on
int m_Width; // lines width when drawing. Provided but not really used
int utility;
Bool_Engine* m_Kbool_Poly_Engine; // polygons set in kbool engine data
public:
std::vector <CPolyPt> corner; // array of points for corners
std::vector <int> side_style; // array of styles for sides
int m_HatchStyle; // hatch style, see enum above
std::vector <CSegment> m_HatchLines; // hatch lines
private:
Bool_Engine* m_Kbool_Poly_Engine; // polygons set in kbool engine data
bool bDrawn;
// Bezier Support
public:
void AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3);
void AppendBezier(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
};
#endif // #ifndef POLYLINE_H